From c62c3fd8d4526af1aee913a05edeb046b72711bf Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 12 Sep 2005 13:25:55 +0000 Subject: [PATCH] =?UTF-8?q?Patch=20level=20=20=20=20=20=20=20=20=20:2.2=20?= =?UTF-8?q?176=20Files=20correlati=20=20=20=20=20:ca3.exe=20ca3700a.rep=20?= =?UTF-8?q?Ricompilazione=20Demo=20:=20[=20]=20Commento=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20:aggiunte=20fantastiche=20features=20alla=20s?= =?UTF-8?q?tampa=20rendiconto!=20Del=20tipo:=20totali=20per=20indbil=20di?= =?UTF-8?q?=20conto,=20budget=20senza=20righe=20movimento=20ed=20altre=20a?= =?UTF-8?q?menit=C3=A0!=20Il=20tutto=20per=20la=20felicit=C3=A0=20dello=20?= =?UTF-8?q?zio=20adolfo..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://10.65.10.50/trunk@13340 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca3700.cpp | 268 ++++++++++++++++++++++++------------------------- ca/ca3700a.rep | 80 ++++++++++++++- ca/calib02.cpp | 16 +++ ca/calib02.h | 3 +- 4 files changed, 223 insertions(+), 144 deletions(-) diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp index b95d18039..47b591dd4 100755 --- a/ca/ca3700.cpp +++ b/ca/ca3700.cpp @@ -264,7 +264,7 @@ protected: void crea_righe_da_rdoc(const TPrint_rendiconto_ca_mask& msk); void crea_trr(const TFilename& trr) const; void scrive_riga(const TRectype& rmovana, const TRectype& movana, const TDocumento* doc); - real somma_budget(const TString& codconto, const char* tipomovana); + real get_budget(const TString& conto, char tipo) const; public: @@ -320,53 +320,42 @@ void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const myself = (TPrint_rendiconto_ca_recordset*)this; } -//metodo per il calcolo del budget PREVENTIVO o VARIAZIONE (sezione di raggruppamento sul report) -real TPrint_rendiconto_ca_recordset::somma_budget(const TString& codconto, const char* tipomovana) +//sconvolgente metodo per la normalizzazione dei conti +real TPrint_rendiconto_ca_recordset::get_budget(const TString& conto, char tipo) const { - real budget = ZERO; - - TRelation rel_rmovana(LF_RMOVANA); - rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); - - //..crea un cursore su rmovana per avere solo i conti di tipo tipomovana, con il codice conto - //selezionato e la datacomp compresa nell'intervallo date - TRectype da_rmovana(LF_RMOVANA); - TRectype a_rmovana(LF_RMOVANA); - - da_rmovana.put(RMOVANA_CODCONTO, codconto); - a_rmovana.put(RMOVANA_CODCONTO, codconto); - - TString filtro; - if (_dadata.ok()) - filtro << "(ANSI(DATACOMP)>=" << _dadata << ")"; - - if (_adata.ok()) + //data del cazzo che però serve per costruire il conto analitico + const TDate null_date; + //ecco il conto analitico... + TAnal_bill zio(conto, _codcosto, _codcms, _codfas); + //..adesso si necessita del saldo del conto analitico appena creato.. + word tipo_movimento = 0; + switch (tipo) { - if (filtro.not_empty()) - filtro << "&&"; - filtro << "(ANSI(DATACOMP)<=" << _adata << ")"; + case 'P': tipo_movimento |= _saldanal_preventivo; break; + case 'V': tipo_movimento |= _saldanal_variazione; break; + default: tipo_movimento |= _saldanal_consuntivo; break; } - if (filtro.not_empty()) - filtro << "&&"; - filtro << "(107->TIPOMOV==\"" << tipomovana << "\")"; - - TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); - const long rmovana_items = cur_rmovana.items(); - cur_rmovana.freeze(); - - if (rmovana_items > 0) + if (_riclassificato) + tipo_movimento |= _saldanal_riclassify; + //..ecco quindi il saldo.. + const TSaldanal& saldo = ca_saldo(zio, null_date, null_date, tipo_movimento); + //..che deve essere normalizzato in base alla sua sezione ed all'indicatore di bilancio del conto + TImporto imp = saldo._fin; + switch (zio.indicatore_bilancio()) { - const TRectype& movana = rel_rmovana.curr(LF_MOVANA); - for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) - { - if (movana.get_char(MOVANA_SEZIONE) == 'D') - budget -= movana.get_real(MOVANA_TOTDOC); - if (movana.get_char(MOVANA_SEZIONE) == 'A') - budget += movana.get_real(MOVANA_TOTDOC); - } + case 1: + case 3: + imp.normalize('D'); + break; + case 2: + case 4: + imp.normalize('A'); + break; + default: + break; } - return budget; + return imp.valore(); } const TVariant& TPrint_rendiconto_ca_recordset::get(const char* column_name) const @@ -410,29 +399,23 @@ const TVariant& TPrint_rendiconto_ca_recordset::get(const char* column_name) con var = _a_conto_riclas; return var; } + if (strcmp(column_name, "#INDBIL") == 0) + { + const TString& conto = TISAM_recordset::get("CONTO").as_string(); + TAnal_bill zio(conto); + return get_tmp_var() = (long)zio.indicatore_bilancio(); + } if (strcmp(column_name, "#PREVENTIVO") == 0) { - TVariant& var = get_tmp_var(); - TString80 conto; - if (_riclassificato) - conto = TISAM_recordset::get("CONTOCG").as_string(); - else - conto = TISAM_recordset::get("CONTO").as_string(); - - var = myself->somma_budget(conto, "P"); - return var; + //prende il conto + const TString& conto = TISAM_recordset::get("CONTO").as_string(); + return get_tmp_var() = get_budget(conto, 'P'); } if (strcmp(column_name, "#VARIAZIONE") == 0) { - TVariant& var = get_tmp_var(); - TString80 conto; - if (_riclassificato) - conto = TISAM_recordset::get("CONTOCG").as_string(); - else - conto = TISAM_recordset::get("CONTO").as_string(); - - var = myself->somma_budget(conto, "V"); - return var; + //prende il conto + const TString& conto = TISAM_recordset::get("CONTO").as_string(); + return get_tmp_var() = get_budget(conto, 'V'); } } return TISAM_recordset::get(column_name); @@ -441,83 +424,85 @@ const TVariant& TPrint_rendiconto_ca_recordset::get(const char* column_name) con //compila i campi da stampare void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const TRectype& movana, const TDocumento* doc) { - //tipo movimento CONSUNTIVO + + TRectype& tmpcurr = _tmp->curr(); + tmpcurr.zero(); + TString8 codnum_desc; //codnum da usare sia per compilare il campo "CODNUM" + codnum_desc.cut(0); + + // il conto puo' essere analitico o contabile... + //se è compilato l'archivio di collegamento PANAPDC + //si deve usare come conto il campo codconto del panapdc!!!... + if (_riclassificato) + { + TString conto_riclassificato; //stringa che conterrà il conto riclassificato (se sara' trovato) + + //prende il gruppo dalla riga rmovana in esame + const int gruppo = atoi(rmovana.get(RMOVANA_CODCONTO).left(3)); + const int conto = atoi(rmovana.get(RMOVANA_CODCONTO).mid(3,3)); + const long sottoconto = atol(rmovana.get(RMOVANA_CODCONTO).mid(6,6)); + + //relazione e cursore su panapdc alla ricerca del conto riclassificato corrispondente + //alla triade gr/co/sottoc di rmovana + TRelation rel_panapdc(LF_PANAPDC); + //servono solamente i record con il gruppo = al gruppo di rmovana + TRectype da_panapdc(LF_PANAPDC); + da_panapdc.put(PANAPDC_GRUPPO, gruppo); + + TString filtro; + if (_prefix.not_empty()) + filtro << "(CODCONTO[1," << _prefix.len() << "]=='" << _prefix << "')"; + + TCursor cur_panapdc(&rel_panapdc, filtro, 2, &da_panapdc, &da_panapdc); + const long panapdc_items = cur_panapdc.items(); + cur_panapdc.freeze(); + if (panapdc_items > 0) //se non ci sono record con il gruppo=rmovana.gruppo ed il prefisso voluto->salta l'rmovana + { + TRectype& rec_panapdc = cur_panapdc.curr(); + for (cur_panapdc = 0; cur_panapdc.pos() < panapdc_items; ++cur_panapdc) + { + int current_conto = rec_panapdc.get_int(PANAPDC_CONTO); + long current_sottoconto = rec_panapdc.get_long(PANAPDC_SOTTOCONTO); + + if (current_conto == 0 && current_sottoconto == 0) + { + conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO); + tmpcurr.put("CONTO", conto_riclassificato); + break; //esce dal casino e passa ai campi successivi + } + else if (conto == current_conto && current_sottoconto == 0) + { + conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO); + tmpcurr.put("CONTO", conto_riclassificato); + break; //esce dal casino e passa ai campi successivi + } + else if (conto == current_conto && sottoconto == current_sottoconto) + { + conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO); + tmpcurr.put("CONTO", conto_riclassificato); + break; //esce dal casino e passa ai campi successivi + } + } //for sugli elementi del cursore + } //if panapdc_items > 0 + + //ATTENZIONE! Se era stata operata una selezione sui conti riclassificati nella maschera + //ed il conto riclassificato attuale non ricade nell'intervallo selezionato il programma + //non deve aggiungere il record al file!! + if ((_da_conto_riclas.not_empty() && conto_riclassificato < _da_conto_riclas) || + (_a_conto_riclas.not_empty() && conto_riclassificato.compare(_a_conto_riclas, _a_conto_riclas.len()) > 0)) + return; + + } //if(_riclassificato) + else //...sennò si usa il normale piano dei conti analitico (cioè tutti tranne che il CRPA) + tmpcurr.put("CONTO", rmovana.get(RMOVANA_CODCONTO)); //conto + + //in ogni caso riempio il campo conto_cg + tmpcurr.put("CONTOCG", rmovana.get(RMOVANA_CODCONTO)); //conto_cg + + //tipo movimento CONSUNTIVO const char tipomov = movana.get_char(MOVANA_TIPOMOV); if (tipomov <= ' ' || tipomov == 'T') { - TRectype& tmpcurr = _tmp->curr(); - tmpcurr.zero(); - TString8 codnum_desc; //codnum da usare sia per compilare il campo "CODNUM" - codnum_desc.cut(0); - - // il conto puo' essere analitico o contabile... - //se è compilato l'archivio di collegamento PANAPDC - //si deve usare come conto il campo codconto del panapdc!!!... - if (_riclassificato) - { - TString conto_riclassificato; //stringa che conterrà il conto riclassificato (se sara' trovato) - - //prende il gruppo dalla riga rmovana in esame - const int gruppo = atoi(rmovana.get(RMOVANA_CODCONTO).left(3)); - const int conto = atoi(rmovana.get(RMOVANA_CODCONTO).mid(3,3)); - const long sottoconto = atol(rmovana.get(RMOVANA_CODCONTO).mid(6,6)); - - //relazione e cursore su panapdc alla ricerca del conto riclassificato corrispondente - //alla triade gr/co/sottoc di rmovana - TRelation rel_panapdc(LF_PANAPDC); - //servono solamente i record con il gruppo = al gruppo di rmovana - TRectype da_panapdc(LF_PANAPDC); - da_panapdc.put(PANAPDC_GRUPPO, gruppo); - - TString filtro; - if (_prefix.not_empty()) - filtro << "(CODCONTO[1," << _prefix.len() << "]=='" << _prefix << "')"; - - TCursor cur_panapdc(&rel_panapdc, filtro, 2, &da_panapdc, &da_panapdc); - const long panapdc_items = cur_panapdc.items(); - cur_panapdc.freeze(); - if (panapdc_items > 0) //se non ci sono record con il gruppo=rmovana.gruppo ed il prefisso voluto->salta l'rmovana - { - TRectype& rec_panapdc = cur_panapdc.curr(); - for (cur_panapdc = 0; cur_panapdc.pos() < panapdc_items; ++cur_panapdc) - { - int current_conto = rec_panapdc.get_int(PANAPDC_CONTO); - long current_sottoconto = rec_panapdc.get_long(PANAPDC_SOTTOCONTO); - - if (current_conto == 0 && current_sottoconto == 0) - { - conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO); - tmpcurr.put("CONTO", conto_riclassificato); - break; //esce dal casino e passa ai campi successivi - } - else if (conto == current_conto && current_sottoconto == 0) - { - conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO); - tmpcurr.put("CONTO", conto_riclassificato); - break; //esce dal casino e passa ai campi successivi - } - else if (conto == current_conto && sottoconto == current_sottoconto) - { - conto_riclassificato = rec_panapdc.get(PANAPDC_CODCONTO); - tmpcurr.put("CONTO", conto_riclassificato); - break; //esce dal casino e passa ai campi successivi - } - } //for sugli elementi del cursore - } //if panapdc_items > 0 - - //ATTENZIONE! Se era stata operata una selezione sui conti riclassificati nella maschera - //ed il conto riclassificato attuale non ricade nell'intervallo selezionato il programma - //non deve aggiungere il record al file!! - if ((_da_conto_riclas.not_empty() && conto_riclassificato < _da_conto_riclas) || - (_a_conto_riclas.not_empty() && conto_riclassificato.compare(_a_conto_riclas, _a_conto_riclas.len()) > 0)) - return; - - } //if(_riclassificato) - else //...sennò si usa il normale piano dei conti analitico (cioè tutti tranne che il CRPA) - tmpcurr.put("CONTO", rmovana.get(RMOVANA_CODCONTO)); //conto - - //in ogni caso riempio il campo conto_cg - tmpcurr.put("CONTOCG", rmovana.get(RMOVANA_CODCONTO)); //conto_cg //serve un documento da cui ricavare i parametri di stampa TDocumento* newdoc = (TDocumento*)doc; @@ -680,11 +665,17 @@ F=IMF*/ error_box (msg); }*/ - _tmp->write(); - if (should_delete) delete newdoc; - } //if (tipomov == ..) + + } //if (tipomov == ..) + else + { + tmpcurr.put("HIDDEN", "X"); + } + + _tmp->write(); + } //scanning delle righe dei movimenti di analitica @@ -908,7 +899,7 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const { ofstream of(trr); of << 1000 << endl; - of << 16 << endl; + of << 17 << endl; of << "CONTO|1|20|0|Conto analitico" << endl; of << "CODNUM|1|4|0|Numerazione documento" << endl; of << "DATA|5|8|0|Data movimento o documento" << endl; @@ -925,6 +916,7 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const of << "MATURATO|4|18|5|Maturato" << endl; of << "IMPEGNATO|4|18|5|Impegnato" << endl; of << "CONTOCG|1|12|0|Conto contabile" << endl; + of << "HIDDEN|8|1|0|Record nascosto" << endl; of << 1 << endl; of << "CONTO+CODNUM+DATA+NUMRD+NRIGA" << endl; } diff --git a/ca/ca3700a.rep b/ca/ca3700a.rep index daf32715b..af945fd3f 100755 --- a/ca/ca3700a.rep +++ b/ca/ca3700a.rep @@ -146,19 +146,32 @@ MESSAGE RESET,F2.103 MESSAGE ISAMREAD,PCONANA,CODCONTO=CONTO,DESCR - + - - - #VARIAZIONE + #THIS @ \ prende il proprio valore +"F1." \ decide il campo destinazione in base al valore di INDBIL,che gli viene passato dal programma.. +300 \ ..i campi della somma vanno da 301 a 304 in base a valore INDBIL (che varia da 1 a 4) +#INDBIL @ ++ \ somma valore INDBIL a 300 ++ \ somma F1. a valore INDBIL ++! \ esegue la ADD sul campo di destinazione + #PREVENTIVO + #THIS @ \ prende il proprio valore +"F1." \ decide il campo destinazione in base al valore di INDBIL,che gli viene passato dal programma.. +300 \ ..i campi della somma vanno da 301 a 304 in base a valore INDBIL (che varia da 1 a 4) +#INDBIL @ ++ \ somma valore INDBIL a 300 ++ \ somma F1. a valore INDBIL ++! \ esegue la ADD sul campo di destinazione +
@@ -175,6 +188,7 @@ MESSAGE RESET,F2.103
+ HIDDEN!='X' NUMREG @@ -244,7 +258,60 @@ MESSAGE RESET,F2.103
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #103-#101 + + + + #103-#102 + + + + #F1.111-#103 + + + + + + + + + + + + + +
@@ -255,12 +322,15 @@ MESSAGE RESET,F2.103 + MESSAGE ADD,F1.101 + MESSAGE ADD,F1.102 + MESSAGE ADD,F1.103 diff --git a/ca/calib02.cpp b/ca/calib02.cpp index 02ca801ce..7d2ee3636 100755 --- a/ca/calib02.cpp +++ b/ca/calib02.cpp @@ -459,6 +459,22 @@ void TAnal_bill::reset() _conto = _costo = _commessa = _fase = ""; } +int TAnal_bill::indicatore_bilancio() const +{ + int indbil = 0; + const TMultilevel_code_info& info = ca_multilevel_code_info(LF_PCONANA); + TString80 conto = _conto; + + for (int i = info.levels() - 1; i >= 0 && indbil <= 0; i--) + { + const int len = info.total_len(i); + conto.cut(len); + indbil = atoi(cache().get(LF_PCONANA, conto, PCONANA_INDBIL)); + } + + return indbil; +} + bool TAnal_bill::get(const TRectype& rec) { bool ok = true; diff --git a/ca/calib02.h b/ca/calib02.h index a647e96c2..97b53deb0 100755 --- a/ca/calib02.h +++ b/ca/calib02.h @@ -32,6 +32,7 @@ public: const TString& commessa() const; const TString& fase() const; + int indicatore_bilancio() const; bool get(const TRectype& rec); void reset(); @@ -39,7 +40,7 @@ public: TAnal_bill(); TAnal_bill(const TAnal_bill& bill); - TAnal_bill(const char* conto, const char* costo, const char* commessa, const char* fase); + TAnal_bill(const char* conto, const char* costo = "", const char* commessa = "", const char* fase = ""); TAnal_bill(const TRectype& rec); };