Patch level :

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
_riportate corrrezioni e nuove implementazioni su esportazione rendiconto dalla 5.0
_iniziata la trattazione dei documenti nel bilancio di commessa alla data (filtro alla ricerca dei documenti validi)


git-svn-id: svn://10.65.10.50/trunk@18881 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-05-18 11:40:07 +00:00
parent 4bc9aed05e
commit ef4a02d3f1
3 changed files with 188 additions and 47 deletions

View File

@ -142,14 +142,6 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event
disable(F_PANDES1_FIN + k);
}
break;
case DLG_PREVIEW:
if (e == fe_button)
{
_print_mode = 'A';
stop_run(K_ENTER);
return false;
}
break;
case DLG_EXPORT:
if (e == fe_button)
{
@ -280,7 +272,7 @@ protected:
bool valid_record(const TRelation& rel) const;
virtual void set_custom_filter(TCursor& cur) const;
void crea_righe_da_rmovana(TLocalisamfile& tmp, TLog_report& log);
void crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log);
void crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log);
void crea_trr(const TFilename& trr) const;
void scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana, const TDocumento* doc,
@ -1162,7 +1154,8 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(TLocalisamfile& tmp, c
//scanning delle righe dei movimenti di analitica
void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, TLog_report& log)
void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk,
TLog_report& log)
{
TRelation rel_rmovana(LF_RMOVANA);
rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr
@ -1179,16 +1172,28 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp,
}
TString filtro;
TDate dal, al;
if (_dadata.ok())
filtro << "(ANSI(DATACOMP)>=" << _dadata.date2ansi() << ")";
if (_adata.ok() && !_vitaintera) //se vitaintera non si può avere una data limite superiore
{
if (filtro.not_empty())
filtro << "&&";
//se siamo fortunati l'anno si può trovare così..
int anno = msk.get_int(F_ANNO);
if (anno > 0)
{
TEsercizi_contabili esc;
esc.code2range(anno, dal, al);
}
if (_dadata.ok())
dal = _dadata;
if (!_vitaintera)
{
if (_adata.ok())
al = _adata;
}
else
al = TDate();
filtro << "BETWEEN(DATACOMP," << dal.date2ansi() << ',' << al.date2ansi() << ')';
filtro << "(ANSI(DATACOMP)<=" << _adata.date2ansi() << ")";
}
if (_codcosto.not_empty())
{
@ -1290,6 +1295,8 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con
dardoc.put(RDOC_PROVV, 'D');
ardoc.put(RDOC_PROVV, 'D');
TDate dal, al;
//se siamo fortunati l'anno si può trovare così..
int anno = msk.get_int(F_ANNO);
if (anno > 0)
@ -1305,15 +1312,24 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con
anno = _dadata.year();
}
if (_dadata.ok())
filtro_date << "(ANSI(33->DATADOC)>=" << _dadata.date2ansi() << ")";
if (_adata.ok() && !_vitaintera) //se vitaintera non si può avere una data limite superiore
{
if (filtro_date.not_empty())
filtro_date << "&&";
if (anno > 0)
{
TEsercizi_contabili esc;
esc.code2range(anno, dal, al);
}
if (_dadata.ok())
dal = _dadata;
if (!_vitaintera)
{
if (_adata.ok())
al = _adata;
}
else
al = TDate();
filtro_date << "(ANSI(33->DATADOC)<=" << _adata.date2ansi() << ")";
}
filtro_date << "BETWEEN(33->DATADOC," << dal.date2ansi() << ',' << al.date2ansi() << ')';
TContabilizzazione_analitica cont_anal; //oggetto necessario per contabilizzare il documento in osservazione
@ -1596,7 +1612,7 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask&
//metodi per riempire il file da cui generare il report
//dati estratti dalle righe movimenti di contabilita' analitica
crea_righe_da_rmovana(tmp, log);
crea_righe_da_rmovana(tmp, msk, log);
//dati estratti dalle righe documenti
crea_righe_da_rdoc(tmp, msk, log);
@ -1676,13 +1692,24 @@ void TPrint_rendiconto_ca::incrementa(TToken_string& riga, const int col, const
void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int first_level, const TString& cod_cms_cdc,
const real importi[5][4], real importi_totali[5][4])
{
const int posizione_importi = first_level == LF_COMMESSE ? 5 : 2;
//crea una token string su cui mettere i valori dei record letti dal file .dbf
TToken_string riga(512, '\t');
riga.add(cod_cms_cdc);
//decodifica della commessa/cdc (non è ammessa una commessa "TOTALI" che lo incasina
if (cod_cms_cdc != "TOTALI")
riga.add(cache().get(first_level, cod_cms_cdc, "DESCRIZ"));
{
const TRectype& rec = cache().get(first_level, cod_cms_cdc);
const TString& descrizione = rec.get("DESCRIZ");
riga.add(descrizione);
if (first_level == LF_COMMESSE)
{
riga.add(rec.get(COMMESSE_DATAINIZIO));
riga.add(rec.get(COMMESSE_DATAFINE));
riga.add(rec.get(COMMESSE_DATAPROR));
}
}
//in base al valore di indbil e budget i valori degli importi vengono posizionati nel record
for (int indbil = 1; indbil <= 4; indbil++)
@ -1690,10 +1717,10 @@ void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int firs
int col = 0;
switch (indbil)
{
case 1: col = 16; break; //attività
case 2: col = 23; break; //passività
case 3: col = 2; break; //costi
case 4: col = 9; break; //ricavi
case 1: col = posizione_importi + 14; break; //attività
case 2: col = posizione_importi + 21; break; //passività
case 3: col = posizione_importi; break; //costi
case 4: col = posizione_importi + 7; break; //ricavi
default: break;
}
@ -1715,7 +1742,7 @@ void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int firs
riga.add(da_fatturare.string(), col + 6);
}
//scrive in excel mode
for (int i = 2; i < 30; i++)
for (int i = posizione_importi; i < posizione_importi + 28; i++)
{
const real r = riga.get(i);
if (!r.is_zero())
@ -1882,6 +1909,8 @@ void TPrint_rendiconto_ca::main_loop()
file_xls.add("rendiconto.xls");
ofstream file_to_date(file_xls);
const int posizione_importi = first_level == LF_COMMESSE ? 5 : 2;
//intestazione primaria
TToken_string intestazione_1(512, '\t');
//l'intestazione primaria dipende anche dalla configurazione dei livelli!
@ -1889,6 +1918,9 @@ void TPrint_rendiconto_ca::main_loop()
{
intestazione_1.add("Commessa");
intestazione_1.add("Descr. commessa");
intestazione_1.add("Data inizio");
intestazione_1.add("Data fine");
intestazione_1.add("Data proroga");
recset_key = 2; //chiave del recordset per commessa
}
else //cdc-commessa
@ -1917,8 +1949,7 @@ void TPrint_rendiconto_ca::main_loop()
//intestazione secondaria
TToken_string intestazione_2(512, '\t');
//campi descrittivi iniziali vuoti (solo intestazione_1)
for (int k = 0; k < 2; k++)
intestazione_2.add("");
intestazione_2.add(" ", posizione_importi - 1);
for (int l = 0; l < 4; l++)
{
@ -2002,13 +2033,8 @@ void TPrint_rendiconto_ca::main_loop()
if (log.recordset()->items() > 0)
log.preview();
if (key == K_ENTER) //stampa o anteprima
{
if (mask.print_mode() == 'A')
book.preview();
else
book.print();
}
if (key == K_ENTER)
book.print_or_preview(); //stampa il book dei report
} //while(true)...
delete _msk;

View File

@ -1,5 +1,7 @@
#include <progind.h>
#include "../ve/velib.h"
#include "calib01.h"
#include "calib02.h"
#include "ca3883.h"
@ -1317,6 +1319,115 @@ void TPrint_saldana_recordset::parse_rmovana(TAssoc_array* cms, const TDate& dat
}
int TPrint_saldana_recordset::numerazioni_ordini(TString_array& num_ordini, TString_array& tip_ordini) const
{
//i documenti che vanno presi in cosiderazione sono quelli che generano un IMPEGNATO secondo le auree regole del..
//..nostro invincibile Adolf!
//quindi dapprima trova i TIPI ordine, poi le NUMERAZIONI che li contengono; alla fine passa entrambi gli array
num_ordini.destroy();
tip_ordini.destroy();
//cominciamo con i tipi
TISAM_recordset tipi_recset("USE %TIP\nSELECT I1=3");
for (bool ok = tipi_recset.move_first(); ok; ok = tipi_recset.move_next()) //giro sui vari tipi ordine
{
const TString4 tipo = tipi_recset.cursor()->curr().get("CODTAB");
tip_ordini.add(tipo);
}
//e adesso cerca le numerazioni che contengono tipi ordine
TISAM_recordset num_recset("USE %NUM");
for (bool ok = num_recset.move_first(); ok; ok = num_recset.move_next()) //giro sui vari tipi numerazione
{
const TString4 codtab = num_recset.get("CODTAB").as_string();
const TCodice_numerazione& numerazione = cached_numerazione(codtab);
for (int t = numerazione.ntipi_doc() - 1; t >= 0; t--)
{
const TString& tipo_doc = numerazione.tipo_doc(t);
if (tip_ordini.find(tipo_doc) >= 0)
{
num_ordini.add(codtab);
break;
}
} //for (int t = codnum..
} //for (bool ok = num_recset...
return num_ordini.items();
}
//aggiorna l'arrayone cms con le righedoc non ancora contabilizzate
void TPrint_saldana_recordset::parse_rdoc(TAssoc_array* cms, const TDate& datainiesc)
{
//solo le numerazioni con almeno un tipo documento ordine interessano
TString_array num_ordini, tip_ordini;
const int numerazioni_tipo_ordine = numerazioni_ordini(num_ordini, tip_ordini);
for (int n = 0; n < numerazioni_tipo_ordine; n++)
{
TString4 codnum = num_ordini.row(n);
//cerca tutte le righe documento che soddisfano i numerosi (fin troppo) parametri
//joina DOC perchè abbiamo un decisivo filtro sul range di date
TString query;
query << "USE RDOC KEY 3\n";
query << "SELECT (BETWEEN(DOC.DATADOC, #DATAINIES, #DATACALCOLO))";
//filtro su cdc/cms/fasi (fatto come per saldi e rmovana; purtroppo non si può metodizzare perchè in tutti i files..
//..i nomi dei campi sono diversi!
switch (_tipostampa)
{
case 1:
case 4:
if (_fase.full())
query << "&&(FASCMS=\"" << _fase << "\")\n";
break;
case 2:
case 8:
if (_cdc.full())
query << "&&(CODCOSTO=\"" << _cdc << "\")\n";
break;
case 3:
if (_fase.full() || _cdc.full())
{
if (_fase.full() && _cdc.full())
query << "&&(FASCMS=\"" << _fase << "\")&&(CODCOSTO=\"" << _cdc << "\")\n";
else
{
if (_fase.full())
query << "&&(FASCMS=\"" << _fase << "\")\n";
else
query << "&&(CODCOSTO=\"" << _cdc << "\")\n";
}
}
break;
}
query << "JOIN DOC INTO PROVV=='D' ANNO==ANNO CODNUM==CODNUM\nFROM PROVV='D' ANNO=#ANNO CODNUM=#CODNUM\nTO PROVV='D' ANNO=#ANNO CODNUM=#CODNUM";
TISAM_recordset recset(query);
recset.set_var("#ANNO", (long)_datacalcolo.year());
recset.set_var("#CODNUM", codnum);
recset.set_var("#DATAINIES", datainiesc);
recset.set_var("#DATACALCOLO", _datacalcolo);
const TRecnotype recset_items = recset.items();
//simpatica progind per intrattenere l'utonto
TProgind pi(recset_items, "Scansione documenti...", true, true);
for (bool ok = recset.move_first(); ok; ok = recset.move_next()) //giro sulle varie rdoc...
{
//aggiornamento progind intrattenitiva
pi.addstatus(1);
if (pi.iscancelled())
break;
}
} //for (int n = 0; n < numerazioni...
}
//metodo principale di riempimento degli array da mandare in stampa
void TPrint_saldana_recordset::create_lines_to_print(const TString& query)
{
@ -1339,15 +1450,16 @@ void TPrint_saldana_recordset::create_lines_to_print(const TString& query)
{
if ((_datacalcolo < datafinesc) && !_vitaintera)
{
// 2_a) calcolo dei saldi da righe movimenti analitici e quindi senza saldana
parse_rmovana(cms, datainiesc, datafinesc);
// 2_b) calcolo dei saldi da documenti non ancora contabilizzati e quindi senza movana e saldana
parse_rdoc(cms, datainiesc);
} //if((_datacalcolo<datafinesc...
} //if(_tipo==8)...
// 3)
// calcolo dei saldi da documenti non ancora contabilizzati e quindi senza movana e saldana
// 4)
// 3)
// merging dei 5 arrayini cms nell'arrayone _righe da mandare in stampa
_righe.destroy();
for (int i = 0; i < 5; i++)

View File

@ -95,16 +95,19 @@ protected:
void parse_rmovana(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc);
void parse_saldana(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc, const TString& query);
void parse_rdoc(TAssoc_array* cms, const TDate& datainiesc);
//per il solo ca3800
void aggiorna_importo(TAssoc_array& riga_array, const TString& livello, const int indbil,
const TRectype& saldana, const bool inverti = false, const bool cms_detraz = false) const;
real calcola_avanzamento_tempo() const;
void create_lines_to_print(const TString& query);
long durata_commessa(const TRectype& rec_commesse, TDate& dataini, TDate& datafine) const;
const TDate calcola_min_datacomp(const TDate& datainiesc, const TDate& datafinesc) const;
int ricava_sezione_di_stampa(const TRectype& rec_commesse, const TDate& datainiesc, const TDate& datafinesc) const;
TString ricava_chiave_cdc_fase(const TString& codcms, const TString& fase, const TString& cdc) const;
int numerazioni_ordini(TString_array& num_ordini, TString_array& tip_ordini) const;
void create_lines_to_print(const TString& query);
//per il solo ca3900
void aggiorna_importi(TAssoc_array& riga_array, const int indbil, const TRectype& saldana,