diff --git a/ca/ca3800.cpp b/ca/ca3800.cpp index ff67c4b99..4c2e13bfc 100755 --- a/ca/ca3800.cpp +++ b/ca/ca3800.cpp @@ -103,7 +103,7 @@ TPrint_bilancio_cms_mask::TPrint_bilancio_cms_mask() int prefix = cfg.get_int("PdcPrefix"); if (prefix >= pconana_levels) - prefix = pconana_levels-1; + prefix = pconana_levels - 1; TToken_string codes, descr; for (int k = prefix; k < pconana_levels; k++) @@ -120,7 +120,7 @@ TPrint_bilancio_cms_mask::TPrint_bilancio_cms_mask() { if (pconana_levels >= 2 && prefix < pconana_levels && esistono_riclassificazioni()) { - ca_create_fields(*this, 0, LF_PCONANA, 1, 16, F_PRE1, F_PREDES1, 0x0, PCONANA_CODCONTO); + ca_create_fields(*this, 0, LF_PCONANA, 1, 15, F_PRE1, F_PREDES1, 0x0, PCONANA_CODCONTO); // Nascondi i campi che non fanno parte del prefisso for (int i = 0; i < pconana_levels; i++) @@ -219,7 +219,11 @@ void TPrint_bilancio_cms::main_loop() { //report e book dei report TReport_book book; - const TString& prefix = mask.get(F_PRE1); + + TString80 prefix; + for (short id = F_PRE1; id <= F_PRE3 && mask.id2pos(id) > 0; id++) + prefix << mask.get(id); + const int depth = mask.get_int(F_DEPTH); TString path = mask.get(F_REPORT); diff --git a/ca/ca3883.cpp b/ca/ca3883.cpp index 3dffa987f..6c9ae0484 100755 --- a/ca/ca3883.cpp +++ b/ca/ca3883.cpp @@ -310,6 +310,8 @@ void TCRPA_report::offset_and_fill_columns(TReport_section& rep_sect, const TStr //ciclo su tutti gli elementi dell'array con i valori da settare nei nuovi campi for (int i = 0; i < str_arr.items(); i++) { + //crea il nuovo campo i-esimo, copia del modello, spostato a destra rispetto al precedente (i-1)esimo.. + //.., con id(i) = id(i-1) + 1 TReport_field* new_field = i == 0 ? &rep_field : (TReport_field*)rep_field.dup(); if (i > 0) { @@ -338,37 +340,97 @@ void TCRPA_report::offset_and_fill_columns(TReport_section& rep_sect, const TStr break; case 'F': //i footer devono calcolarsi i totali;ma i footer di totale fasi (4) non devono.. //..fare assolutamente nulla! - if (rep_sect.level() > 1 && rep_sect.level() < 4) + if (rep_sect.level() > 0 && rep_sect.level() < 4) { - new_field->set_field(""); - TString ps = "MESSAGE ADD,F"; - ps << (rep_sect.level() - 1) << '.' << new_field->id(); - - //somma al totale speciale delle commesse normali - if (rep_sect.level() == 3) - ps << "\nMESSAGE ADD,F2." << (new_field->id() + 200); - - new_field->set_postscript(ps); + //crea il campo sul report con tanto di id,postscript ecc... + new_field->set_field(""); - //Gestione totali delle commesse normali (Adolf!) - //Alla fine di tutte le 4 sezioni di commesse normali ci va il totale delle medesime; questo.. - //..totale va stampato prima della sezione con le commesse di appoggio - if (rep_sect.level() == 2) + switch (rep_sect.level()) { - //sub_new_field e' il campo SOTTO il new_field che appare solo nei totali di sezione 2 (F2) + case 1: + { + //caso particolare del footer di report con i totali alla Adolf! + //Dalla matematica secondo Adolf: + //(a) TotGen = TotCmsNor + TotCmsSupp + //(b) DiffGen = TotCmsSupp - TotCmsNor + //->(c) DiffGen = TotGen - 2*TotCmsNor + + //i campi del totale generale si sommano ai campi delle differenze di Adolf + /**CAZZONE** tentata per utilizzare la (c) ma non funziona:questi non servono a una ceppa di minchia + new_field->set_field(""); + TString ps = "MESSAGE ADD,F"; + ps << (rep_sect.level()) << '.' << (new_field->id() + 200); + new_field->set_prescript(ps);*/ + + //sub_new_field e' il campo SOTTO il new_field che appare solo nei totali di sezione 1 (F1) + //e' il campo che va nella riga delle Differenze TReport_field* sub_new_field = (TReport_field*)new_field->dup(); - rep_sect.add(sub_new_field); - sub_new_field->offset(TPoint(0, 300)); + rep_sect.add(sub_new_field); + sub_new_field->offset(TPoint(0, 250)); sub_new_field->set_id(new_field->id() + 200); sub_new_field->set_groups("90"); - sub_new_field->set_postscript(""); + sub_new_field->set_prescript(""); } - } + break; + + case 2: + { + //ogni campo di footer F2 deve sommarsi a quello piu' esterno F1 + TString ps = "MESSAGE ADD,F"; + ps << (rep_sect.level() - 1) << '.' << new_field->id(); + + //in caso di Commesse Supporto (LEVEL=4) il totale si deve sommare nelle differenze generali + ps << "\n#101 @\n"; + ps << "4 = IF\n"; + ps << " MESSAGE ADD,F1." << (new_field->id() + 200) << "\n"; + ps << "THEN"; + + //setta il postscript al new_field + new_field->set_postscript(ps); + + //SUB_new_field, ovvero gestione dei campi adolfici dei totali e delle differenze + //Gestione totali delle commesse normali (Adolf!) + //Alla fine di tutte le 4 sezioni di commesse normali ci va il totale delle medesime; questo.. + //..totale va stampato prima della sezione con le commesse di appoggio + + //sub_new_field e' il campo SOTTO il new_field che appare solo nei totali di sezione 2 (F2) + //e' il campo con il totale delle commesse normali + TReport_field* sub_new_field = (TReport_field*)new_field->dup(); + rep_sect.add(sub_new_field); + sub_new_field->offset(TPoint(0, 250)); + sub_new_field->set_id(new_field->id() + 200); + sub_new_field->set_groups("90"); + sub_new_field->set_postscript(""); + + //il totale delle commesse normali si sottrae nelle differenze generali + TString ps_diff; + //ps_diff << "#THIS @\n2\n*\n!\n"; **CAZZONE** tentata per applicare la (c);non funzia + ps_diff << "MESSAGE SUB,F1." << sub_new_field->id(); + sub_new_field->set_postscript(ps_diff); + } + break; + + case 3: + { + //ogni campo di footer F3 deve sommarsi a quello piu' esterno F2 + TString ps = "MESSAGE ADD,F"; + ps << (rep_sect.level() - 1) << '.' << new_field->id(); + //deve anche sommarsi al totale delle Commesse Normali (che viene stampato al passaggio tra.. + //..LEVEL=3 e LEVEL=4) + ps << "\nMESSAGE ADD,F2." << (new_field->id() + 200); + //setta il postscript al new_field + new_field->set_postscript(ps); + } + break; + default: + break; + } //switch(rep_sect.level()) + } break; default: break; - } - } + } //switch (sect_type) + } //for(inti=0;idup(); rep_sect.add(sub_new_field_margine); - sub_new_field_margine->offset(TPoint(0, 300)); + sub_new_field_margine->offset(TPoint(0, 250)); sub_new_field_margine->set_id(369); sub_new_field_margine->set_groups("90"); sub_new_field_margine->set_postscript(""); @@ -455,9 +517,9 @@ bool TCRPA_report::generate_columns (TString_array& codici, TString_array& testa if (f4 != NULL) offset_and_fill_sectionf4(*f4, model_id); -#ifdef DBG +//#ifdef DBG save("cazzone.rep"); -#endif +//#endif return true; } @@ -868,6 +930,14 @@ void TPrint_saldana_recordset::create_lines_to_print(const TString& query) else datafine = rec_commesse.get(COMMESSE_DATAFINE); + //datafine.ok() va messo per gli utonti che mettono le commesse all'infinito senza specificare la datafine + //in questo modo la commessa e' come se terminasse l'anno dopo e viene stampata nella sezione 2 (vedi sotto) + if (!datafine.ok()) + { + datafine = datafinesc; + datafine.addyear(1); + } + //gruppo e conto servono solo per il caso _tipo=8 ma vanno dichiarati e ricavati.. //..qui in modo che siano a disposizione delle commesse del cazzo poco sotto const char* gruppo = indbil == 3 ? "COSTI" : "RICAVI"; diff --git a/ca/ca3883a.h b/ca/ca3883a.h index 14bb2bb3c..969eea385 100755 --- a/ca/ca3883a.h +++ b/ca/ca3883a.h @@ -27,6 +27,10 @@ #define F_DESCFASE4 119*/ //campi generati dai piani dei conti +//spiegazione per noi ignoranti: +// F_PRE0 e' il groupbox +// F_PRE1 e' il primo livello della struttura del piano dei conti anale, quindi il primo che va usato nella generazione.. +//...dei campi sulle maschere!! #define F_PRE0 320 #define F_PRE1 321 #define F_PRE2 322