From 3bb02501a99bcb2c1f28dbe2dbf38a1de2d794aa Mon Sep 17 00:00:00 2001 From: luca Date: Thu, 16 Apr 2009 09:53:41 +0000 Subject: [PATCH] Patch level :10.0 Files correlati : Ricompilazione Demo : [ ] Commento :riportata esportazione rendiconto git-svn-id: svn://10.65.10.50/trunk@18716 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca3700.cpp | 162 +++++++++++++++++++++++++++++-------------------- ca/calib02.cpp | 8 +-- ca/calib02.h | 6 ++ 3 files changed, 106 insertions(+), 70 deletions(-) diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp index a7180df2f..730a78a7a 100755 --- a/ca/ca3700.cpp +++ b/ca/ca3700.cpp @@ -16,6 +16,7 @@ #include "pconana.h" #include "movana.h" #include "rmovana.h" +#include "saldana.h" #include "ca3.h" #include "ca3700.h" @@ -147,8 +148,8 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event _print_mode = 'A'; stop_run(K_ENTER); return false; - } - break; + } + break; case DLG_EXPORT: if (e == fe_button) { @@ -296,7 +297,9 @@ public: //da libreria public: void set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, TLog_report& log); void set_cms_cdc_fase(const char* cdc, const char* cms, const char* fase); - real get_budget(const TString& conto, char tipo) const; + real get_budget(const TString& conto, char tipo) const; //per la stampa + void get_budget(const TString& codcdc, const TString& codcms, const TString& codfase, + TImporto& att, TImporto& pas, TImporto& cos, TImporto& ric) const; //per l'esportazione TPrint_rendiconto_ca_recordset(const TString& sql); @@ -377,6 +380,45 @@ void TPrint_rendiconto_ca_recordset::set_cms_cdc_fase(const char* cdc, const cha _codfas = fase; } +void TPrint_rendiconto_ca_recordset::get_budget(const TString& codcdc, const TString& codcms, const TString& codfase, + TImporto& att, TImporto& pas, TImporto& cos, TImporto& ric) const +{ + TString query; + query << "USE SALDANA\nSELECT "; + if (codcdc.full()) + query << "(COSTO='" << codcdc << "')&&"; + if (codcms.full()) + query << "(COMMESSA='" << codcms << "')&&"; + if (codfase.full()) + query << "(FASE='" << codfase << "')&&"; + query.rtrim(2); + + TISAM_recordset saldana(query); + for (bool ok = saldana.move_first(); ok; ok = saldana.move_next()) + { + const TAnal_bill zio(saldana.get("CONTO").as_string()); + const int indbil = zio.indicatore_bilancio(); + + TImporto saldo = ca_get_imp(saldana, SALDANA_SEZIONEP, SALDANA_SALDOP); + saldo += ca_get_imp(saldana, SALDANA_SEZIONEV, SALDANA_SALDOV); + + switch(indbil) + { + case 1: att += saldo; break; + case 2: pas += saldo; break; + case 3: cos += saldo; break; + case 4: ric += saldo; break; + default: break; + } + } + + att.normalize('D'); + cos.normalize('D'); + + pas.normalize('A'); + ric.normalize('A'); +} + //sconvolgente metodo per la normalizzazione dei conti real TPrint_rendiconto_ca_recordset::get_budget(const TString& conto, char tipo) const { @@ -1471,8 +1513,8 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const of << "HIDDEN|8|1|0|Record nascosto" << endl; of << 3 << endl; of << "ORDCONT+CONTO+DATA+CODNUM+NUMRD+NUMREG+NRIGA" << endl; - of << "CODCMS+CONTO+DATA|X" << endl; - of << "CODCOSTO+CONTO+DATA|X" << endl; + of << "CODCMS+ORDCONT+CONTO+DATA+CODNUM+NUMRD+NUMREG+NRIGA|X" << endl; + of << "CODCOSTO+ORDCONT+CONTO+DATA+CODNUM+NUMRD+NUMREG+NRIGA|X" << endl; } void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row, TLog_report& log) @@ -1650,8 +1692,8 @@ void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int firs { case 1: col = 16; break; //attivitā case 2: col = 23; break; //passivitā - case 3: col = 2; break; //costi (o ricavi se selezionato il flag di inversione sulla maschera) - case 4: col = 9; break; //ricavi (o costi se selezionato il flag di inversione sulla maschera) + case 3: col = 2; break; //costi + case 4: col = 9; break; //ricavi default: break; } @@ -1704,13 +1746,28 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co path.add("rendiconto.xls"); ofstream file_to_date(path, ios::app); + const bool invert_cosric = _msk->get_bool(F_REV_COSRIC); + //array bidimensionale con gli importi per indbil e colonna real importi[5][4]; //array bidimensionale con gli importi totali finali real importi_totali[5][4]; - TString80 last_codice, curr_codice, last_conto, curr_conto; + TString80 last_codice, curr_codice; - //recordset sul file .dbf, da scandire tutto uno per volta + TSheet_field& sf = _msk->sfield(F_RIGHE); + TString80 codcms, codcdc, codfas; + if (first_level == LF_CDC) + { + ca_extract_sheet_field(sf, r, LF_COMMESSE, codcms); + ca_extract_sheet_field(sf, r, LF_FASI, codfas); + } + else + { + ca_extract_sheet_field(sf, r, LF_CDC, codcdc); + ca_extract_sheet_field(sf, r, LF_FASI, codfas); + } + + //recordset sul file rendy.dbf, da scandire tutto un record per volta rendy.requery(); for (bool ok = rendy.move_first(); ok; ok = rendy.move_next()) { @@ -1719,58 +1776,45 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co //operazioni da fare al cambio commessa/cdc (codice primo livello) if (curr_codice != last_codice) { + //SCRIVE UNA RIGA SUL FILE DA ESPORTARE + //lo schema č questo: budget\impegnato\maturato\fatturato\da impegnare\da maturare\da fatturare //controlla se last_codice sia pieno per non aggiungere una inutile riga di zeri all'inizio if (last_codice.full()) esporta_csv_row(file_to_date, first_level, last_codice, importi, importi_totali); memset(importi, 0, sizeof(importi)); //Allah! Azzeratore dell'array con i totali per commessa (o cdc) - last_codice = curr_codice; //memorizza il cambio codice - last_conto = ""; //azzera l'ultimo conto - } + last_codice = curr_codice; //memorizza il cambio codice (cms/cdc) - curr_conto = rendy.get("CONTO").as_string(); - - //gestione dei budget: va fatta attraverso i saldi!!! come nella stampa, onde evitare pericolose dimenticanze.. - //..di movimenti budget in anni diversi da quello considerato - const bool hidden = rendy.get("HIDDEN").as_bool(); - const int indbil = rendy.get("ORDCONT").as_int(); - - if (hidden && curr_conto.full() && (curr_conto != last_conto)) - { - //preparazione dei parametri per il calcolo dei saldi - TSheet_field& sf = _msk->sfield(F_RIGHE); - TString80 codcms, codcdc, codfas; + //calcolatore dei saldi: va fatta attraverso i saldi!!! perchč i budget sono multianno + TImporto att, pas, ric, cos; if (first_level == LF_CDC) - { - codcdc = curr_codice; - ca_extract_sheet_field(sf, r, LF_COMMESSE, codcms); - ca_extract_sheet_field(sf, r, LF_FASI, codfas); - } + rendy.get_budget(curr_codice, codcms, codfas, att, pas, cos, ric); else - { - codcms = curr_codice; - ca_extract_sheet_field(sf, r, LF_CDC, codcdc); - ca_extract_sheet_field(sf, r, LF_FASI, codfas); - } - //calcola i saldana usando la get_budget come in stampa - rendy.set_cms_cdc_fase(codcdc, codcms, codfas); - real budget = rendy.get_budget(curr_conto, 'P'); - budget += rendy.get_budget(curr_conto, 'V'); - importi[indbil][0] += budget; + rendy.get_budget(codcdc, curr_codice, codfas, att, pas, cos, ric); - last_conto = curr_conto; + //aggiunge i valori dei saldi all'array con gli importi; li mette nella colonna [0] che č quella dei budget.. + //..e nella riga corrispondente all'indicatore bilancio + importi[1][0] = pas.valore(); + importi[2][0] = att.valore(); + importi[3][0] = cos.valore(); + importi[4][0] = ric.valore(); } - - //lo schema č questo: budget\impegnato\maturato\fatturato\da impegnare\da maturare\da fatturare - //aggiorna budget - - //aggiorna tutti gli altri campi + + //aggiorna tutti gli altri valori dell'array degli importi che non siano budget (cosa che fa solo a cambio codice).. + //..come si vede sopra + const bool hidden = rendy.get("HIDDEN").as_bool(); if (!hidden) { const real impegnato = rendy.get("IMPEGNATO").as_real(); const real fatturato = rendy.get("FATTURATO").as_real(); const real maturato = rendy.get("MATURATO").as_real(); + //occhio all'inversione ricavi/costi, che causa il ribaltamento del significato di ordcont + int indbil = rendy.get("ORDCONT").as_int(); + if (invert_cosric && (indbil == 3 || indbil == 4)) + indbil = 7 - indbil; + + //aggiornamento degli importi non budget di commessa/cdc importi[indbil][1] += impegnato; importi[indbil][2] += maturato; importi[indbil][3] += fatturato; @@ -1781,9 +1825,10 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co //gestione speciale dell'ultima riga if (last_codice.full()) { + //SCRIVE L'ULTIMA RIGA RELATIVA A CMS/CDC SUL FILE DA ESPORTARE esporta_csv_row(file_to_date, first_level, last_codice, importi, importi_totali); - //aggiunge la riga con i totali + //AGGIUNGE L'EVENTUALE RIGA DEI TOTALI TToken_string str_tot = _msk->sfield(F_RIGHE).row(r); //la riga con i totali ci va solo se non č stato specificato il primo livello (es. commessa o cdc) const TFixed_string first_field = str_tot.get(0); @@ -1799,7 +1844,7 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co //doppia riga vuota di stacco file_to_date << endl << endl; } - } + } //if(last_codice.full()) } @@ -1853,29 +1898,15 @@ void TPrint_rendiconto_ca::main_loop() recset_key = 3; //chiave del recordset per centro di costo } - const bool reverse_cos_ric = mask.get_bool(F_REV_COSRIC); //occhio al flag di rovesciamento + //const bool reverse_cos_ric = mask.get_bool(F_REV_COSRIC); //occhio al flag di rovesciamento for (int i = 0; i < 4; i++) { switch (i) { - case 0: - { - if (reverse_cos_ric) - intestazione_1.add("Ricavi"); - else - intestazione_1.add("Costi"); - } - break; - case 1: - { - if (reverse_cos_ric) - intestazione_1.add("Costi"); - else - intestazione_1.add("Ricavi"); - } - break; - case 2: intestazione_1.add("Attivitā"); break; + case 0: intestazione_1.add("Costi"); break; + case 1: intestazione_1.add("Ricavi"); break; + case 2: intestazione_1.add("Attivitā"); break; case 3: intestazione_1.add("Passivitā"); break; } for (int j = 0; j < 6; j++) @@ -1978,7 +2009,6 @@ void TPrint_rendiconto_ca::main_loop() else book.print(); } - } //while(true)... delete _msk; diff --git a/ca/calib02.cpp b/ca/calib02.cpp index a8ba24d37..a21f2ba95 100755 --- a/ca/calib02.cpp +++ b/ca/calib02.cpp @@ -725,7 +725,7 @@ public: TSaldi_cache(); }; -static TImporto get_imp(const TRecordset& rs, const char* sez, const char* imp) +TImporto ca_get_imp(const TRecordset& rs, const char* sez, const char* imp) { const char sezione = rs.get(sez).as_string()[0]; const real importo = rs.get(imp).as_real(); @@ -784,15 +784,15 @@ bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_an TImporto imp; if (tipo & _saldanal_consuntivo) { - imp += get_imp(saldini, SALDANA_SEZIONE, SALDANA_SALDO); + imp += ca_get_imp(saldini, SALDANA_SEZIONE, SALDANA_SALDO); } if (tipo & _saldanal_preventivo) { - imp += get_imp(saldini, SALDANA_SEZIONEP, SALDANA_SALDOP); + imp += ca_get_imp(saldini, SALDANA_SEZIONEP, SALDANA_SALDOP); } if (tipo & _saldanal_variazione) { - imp += get_imp(saldini, SALDANA_SEZIONEV, SALDANA_SALDOV); + imp += ca_get_imp(saldini, SALDANA_SEZIONEV, SALDANA_SALDOV); } if (!imp.is_zero()) { diff --git a/ca/calib02.h b/ca/calib02.h index 735ee7c05..f3656fa4b 100755 --- a/ca/calib02.h +++ b/ca/calib02.h @@ -77,8 +77,14 @@ public: TSaldanal(const TSaldanal& sa) { copy(sa); } }; + +/////////////////////////////////////////////////////// +// Metodi sciolti ma decisivi +/////////////////////////////////////////////////////// const TSaldanal& ca_saldo(const TAnal_bill& bill, const TDate& dal, const TDate& al, word tipi = _saldanal_consuntivo); +TImporto ca_get_imp(const TRecordset& rs, const char* sez, const char* imp); + //////////////////////////////////////////////////////// // TPconana_recordset ////////////////////////////////////////////////////////