From a247a12bb4811f3d30318991a9728972a24a089b Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 10 Jul 2007 15:23:41 +0000 Subject: [PATCH] Patch level :4.0 744 Files correlati : Ricompilazione Demo : [ ] Commento :superstampa adolfica (e braunica) in corso! Adesso implode ma scazza una parte degli importi... git-svn-id: svn://10.65.10.50/trunk@15485 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca2200.cpp | 110 ++++--------------------------------------------- ca/ca3700.cpp | 63 ++++++++++++++++++++++++---- ca/ca3700.h | 1 + ca/ca3700.uml | 7 +++- ca/calib01.cpp | 88 ++++++++++++++++++++++++++++++++++++++- ca/calib01.h | 7 ++++ 6 files changed, 166 insertions(+), 110 deletions(-) diff --git a/ca/ca2200.cpp b/ca/ca2200.cpp index 86cda6a14..50b758a55 100755 --- a/ca/ca2200.cpp +++ b/ca/ca2200.cpp @@ -129,14 +129,7 @@ class TRib_movanal_app : public TSkeleton_application protected: virtual void main_loop(); - void implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows) const; bool explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows, const int annoes); - bool ori_present(const TRectype& rec) const; - - void copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) const; - void taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) const; - bool can_merge_rows(const TRectype& compact_rec, const TRectype& rec) const; - bool pareggia_commessa(TAnal_mov& anal_mov); public: @@ -144,91 +137,6 @@ public: TRib_movanal_app(){} }; -void TRib_movanal_app::copia_campo(const TRectype& src, const char* campo_src, - TRectype& dst, const char* campo_dst) const -{ - const TString& valore = src.get(campo_src); - if (!valore.blank()) - dst.put(campo_dst, valore); -} - -void TRib_movanal_app::taglia_campo(TRectype& src, const char* campo_src, - TRectype& dst, const char* campo_dst) const -{ - copia_campo(src, campo_src, dst, campo_dst); - src.zero(campo_src); -} - -bool TRib_movanal_app::can_merge_rows(const TRectype& compact_rec, const TRectype& rec) const -{ - return compact_rec.get(RMOVANA_CODCCORI) == rec.get(RMOVANA_CODCCORI) && - compact_rec.get(RMOVANA_CODCMSORI) == rec.get(RMOVANA_CODCMSORI) && - compact_rec.get(RMOVANA_CODFASEORI) == rec.get(RMOVANA_CODFASEORI) && - compact_rec.get(RMOVANA_CODCONTORI) == rec.get(RMOVANA_CODCONTORI); -} - -bool TRib_movanal_app::ori_present(const TRectype& rec) const -{ - return (rec.get(RMOVANA_CODCCORI).not_empty() || rec.get(RMOVANA_CODCMSORI).not_empty() || - rec.get(RMOVANA_CODFASEORI).not_empty() || rec.get(RMOVANA_CODCONTORI).not_empty()); -} - -void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows) const -{ - for (int r = 1; r <= input_rows.rows(); r++) - { - const TRectype& rec = input_rows.row(r); //record originale - //se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere - if (ori_present(rec)) - { - int i = 0; - for (i = compact_rows.rows(); i > 0; i--) //giro sulle righe gia' compattate per scoprire se - { //il nostro record esiste gia' o e' da aggiungere - const TRectype& nuovo_rec = compact_rows.row(i); // - if (can_merge_rows(nuovo_rec, rec)) //se esiste gia'... - break; - } - if (i > 0) //...aggiunge solo importo e sezione... - { - const TImporto imp_rec(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO)); - TRectype& compact_rec = compact_rows.row(i, false); //record originale - - TImporto imp_orig(compact_rec.get_char(RMOVANA_SEZIONE), compact_rec.get_real(RMOVANA_IMPORTO)); - imp_orig += imp_rec; - imp_orig.normalize(); - compact_rec.put(RMOVANA_SEZIONE, imp_orig.sezione()); - compact_rec.put(RMOVANA_IMPORTO, imp_orig.valore()); - } - else //...senno' aggiunge direttamente tutta la riga - { - TRectype* newrec = new TRectype(rec); //record destinazione - newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1); - compact_rows.add_row(newrec); - } - } - else - { - TRectype* newrec = new TRectype(rec); - newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1); - compact_rows.add_row(newrec); - } - } - - //ripristina i campi originali sul record di destinazione - for (int k = 1; k <= compact_rows.rows(); k++) - { - TRectype& compact_rec = compact_rows.row(k, false); - if (ori_present(compact_rec)) - { - taglia_campo(compact_rec, RMOVANA_CODCCORI, compact_rec, RMOVANA_CODCCOSTO); - taglia_campo(compact_rec, RMOVANA_CODCMSORI, compact_rec, RMOVANA_CODCMS); - taglia_campo(compact_rec, RMOVANA_CODFASEORI, compact_rec, RMOVANA_CODFASE); - taglia_campo(compact_rec, RMOVANA_CODCONTORI, compact_rec, RMOVANA_CODCONTO); - } - } -} - - bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows, const int annoes) { bool ho_cambiato_qualchecosa = false; @@ -271,15 +179,15 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1); newrec->put(RMOVANA_IMPORTO, imp); //e la mette nella nuova riga //poi copia i valori dei campi cdc,cms,fsc,in quelli di tipo ori (nello stesso record) - copia_campo(rec, RMOVANA_CODCCOSTO, *newrec, RMOVANA_CODCCORI); - copia_campo(rec, RMOVANA_CODCMS, *newrec, RMOVANA_CODCMSORI); - copia_campo(rec, RMOVANA_CODFASE, *newrec, RMOVANA_CODFASEORI); - copia_campo(rec, RMOVANA_CODCONTO, *newrec, RMOVANA_CODCONTORI); + ca_copia_campo(rec, RMOVANA_CODCCOSTO, *newrec, RMOVANA_CODCCORI); + ca_copia_campo(rec, RMOVANA_CODCMS, *newrec, RMOVANA_CODCMSORI); + ca_copia_campo(rec, RMOVANA_CODFASE, *newrec, RMOVANA_CODFASEORI); + ca_copia_campo(rec, RMOVANA_CODCONTO, *newrec, RMOVANA_CODCONTORI); //e mette nei campi std i valori che trova nelle righe ripartizione - copia_campo(rrip[i], RRIP_CODCOSTO, *newrec, RMOVANA_CODCCOSTO); - copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS); - copia_campo(rrip[i], RRIP_CODFASE, *newrec, RMOVANA_CODFASE); - copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO); + ca_copia_campo(rrip[i], RRIP_CODCOSTO, *newrec, RMOVANA_CODCCOSTO); + ca_copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS); + ca_copia_campo(rrip[i], RRIP_CODFASE, *newrec, RMOVANA_CODFASE); + ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO); output_rows.add_row(newrec); ho_cambiato_qualchecosa = true; @@ -354,7 +262,7 @@ bool TRib_movanal_app::cappotta_movimento(TAnal_mov& anal_mov) TRecord_array compact_rows = input_rows; //record array con le righe compattate da creare con la.. compact_rows.destroy_rows(); //..implode_rows(); intanto le azzera per sicurezza //Imploditore - implode_rows(input_rows, compact_rows); + ca_implode_rows(input_rows, compact_rows); //..poi lo riesplode in tutte le righe che possono nascere secondo le regole delle ripartizioni! TRecord_array output_rows = input_rows; //crea il record_array di output come copia dell'INPUT.. diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp index 19ce0d6ed..d6d49c1e5 100755 --- a/ca/ca3700.cpp +++ b/ca/ca3700.cpp @@ -235,6 +235,7 @@ class TPrint_rendiconto_ca_recordset : public TISAM_recordset TExternisamfile* _tmp; bool _riclassificato; bool _reverse_cos_ric; + bool _implode_rows; TString _prefix; TAssoc_array _ratrisc; @@ -1031,13 +1032,59 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana() const TRectype& rmovana = cur_rmovana.curr(); const TRectype& movana = rel_rmovana.curr(LF_MOVANA); TProgind pi(rmovana_items, "Scansione righe movimenti...", true, true); - for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) - { - pi.addstatus(1); - if (pi.iscancelled()) - break; - scrive_riga(rmovana, movana, NULL); - } + //aggiunta adolfica di implosione righe movimenti eventualmente ripartite in precedenza.. + //..modifica che serve solo al CRPA + //se si e' scelto di compattare le rmovana... + if (_implode_rows) + { + TRecord_array righe_attuali(LF_RMOVANA, RMOVANA_NUMRIG); + TRecord_array righe_compattate(LF_RMOVANA, RMOVANA_NUMRIG); + TRectype old_movana(LF_MOVANA); + long old_numreg = 0L; + //si usa <= per forzare il cambio testata anche sull'ultimo movimento (in modo da uscire correttamente) + //NON mettere < e basta che sbaglia l'ultimo!!! + for (cur_rmovana = 0; cur_rmovana.pos() <= rmovana_items; ++cur_rmovana) + { + //legge la testata iniziale + const long numreg = rmovana.get_long(RMOVANA_NUMREG); + //se la testata e' cambiata, allora ha cambiato movana e quindi le righe da compattare sono.. + //..quelle che ha gia' messo nell'array delle righe_attuali + if (numreg != old_numreg) + { + if (righe_attuali.rows() > 0) //quando righe_attuali e' vuoto sei al primo giro + { + //quindi implode le righe attuali del movimento, generando l'array delle righe_compattate + ca_implode_rows(righe_attuali, righe_compattate); + //adesso fa la scrittura delle righe compattate + const int last_row = righe_compattate.last_row(); + for (int i = righe_compattate.first_row(); i > 0 && i <= last_row; i = righe_compattate.succ_row(i)) + scrive_riga(righe_compattate.row(i), old_movana, NULL); + } + //aggiorna il valore di testata con quella nuova per il prossimo movimento + old_movana = movana; + old_numreg = numreg; + //pulisce gli array che sono pronti ad essere nuovamente riempiti + righe_attuali.destroy_rows(); + righe_compattate.destroy_rows(); + } + //aggiunge le righe analitiche all'array da compattare (se rmovana e' vuoto ha gia' terminato) + if (numreg > 0) + { + righe_attuali.insert_row(rmovana); + } + else + break; + } + } + else //if(_implode_rows.. metodo standard senza ripartizioni + { + for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) + { + if (!pi.addstatus(1)) + break; + scrive_riga(rmovana, movana, NULL); + } + } } } @@ -1346,6 +1393,8 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& } //vuoi l'ordinamento normale o sei la Roberta del CRPA? _reverse_cos_ric = msk.get_bool(F_REV_COSRIC); + //sei al CRPA e vuoi implodere le righemovana ripartite in precedenza? + _implode_rows = msk.get_bool(F_IMPLODE_ROWS); //c'e' un fottuto range di date? _dadata = msk.get_date(F_DATAINI); diff --git a/ca/ca3700.h b/ca/ca3700.h index 651fafe41..ba7d95a1c 100755 --- a/ca/ca3700.h +++ b/ca/ca3700.h @@ -10,6 +10,7 @@ #define F_DATAINI 256 #define F_DATAFIN 257 #define F_REV_COSRIC 258 +#define F_IMPLODE_ROWS 259 //campi generati dai piani dei conti #define F_PIANO 319 diff --git a/ca/ca3700.uml b/ca/ca3700.uml index d8f3cf495..81ce22b2c 100755 --- a/ca/ca3700.uml +++ b/ca/ca3700.uml @@ -68,9 +68,14 @@ BEGIN PROMPT 1 3 "Stampa Ricavi prima dei Costi" END +BOOLEAN F_IMPLODE_ROWS +BEGIN + PROMPT 1 4 "Compatta movimenti ripartiti" +END + SPREADSHEET F_RIGHE -1 -4 BEGIN - PROMPT 0 5 "Centro di Costo / Commessa / Fase" + PROMPT 0 6 "Centro di Costo / Commessa / Fase" ITEM "Cdc1" ITEM "Cdc2" ITEM "Cdc3" diff --git a/ca/calib01.cpp b/ca/calib01.cpp index cf2ca590a..f9de063c1 100755 --- a/ca/calib01.cpp +++ b/ca/calib01.cpp @@ -1598,4 +1598,90 @@ const TAnal_ripartizioni_batch& TCache_ripartizioni::righe(const TBill& bill, co TCache_ripartizioni::TCache_ripartizioni() { _codes = 0; -} \ No newline at end of file +} + +/////////////////////////////////////////////////////////// +// Metodi per la ricompattazione delle righe ripartite +/////////////////////////////////////////////////////////// +bool ca_can_merge_rows(const TRectype& compact_rec, const TRectype& rec) +{ + return compact_rec.get(RMOVANA_CODCCORI) == rec.get(RMOVANA_CODCCORI) && + compact_rec.get(RMOVANA_CODCMSORI) == rec.get(RMOVANA_CODCMSORI) && + compact_rec.get(RMOVANA_CODFASEORI) == rec.get(RMOVANA_CODFASEORI) && + compact_rec.get(RMOVANA_CODCONTORI) == rec.get(RMOVANA_CODCONTORI); +} + +bool ca_ori_present(const TRectype& rec) +{ + return (rec.get(RMOVANA_CODCCORI).not_empty() || rec.get(RMOVANA_CODCMSORI).not_empty() || + rec.get(RMOVANA_CODFASEORI).not_empty() || rec.get(RMOVANA_CODCONTORI).not_empty()); +} + +void ca_taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) +{ + ca_copia_campo(src, campo_src, dst, campo_dst); + src.zero(campo_src); +} + +void ca_copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) +{ + const TString& valore = src.get(campo_src); + if (!valore.blank()) + dst.put(campo_dst, valore); +} + +void ca_implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows) +{ + const int last_row = input_rows.last_row(); + for (int r = input_rows.first_row(); r > 0 && r <= last_row; r = input_rows.succ_row(r)) + { + const TRectype& rec = input_rows.row(r); //record originale + //se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere + if (ca_ori_present(rec)) + { + int i = 0; + for (i = compact_rows.rows(); i > 0; i--) //giro sulle righe gia' compattate per scoprire se + { //il nostro record esiste gia' o e' da aggiungere + const TRectype& nuovo_rec = compact_rows.row(i); // + if (ca_can_merge_rows(nuovo_rec, rec)) //se esiste gia'... + break; + } + if (i > 0) //...aggiunge solo importo e sezione... + { + const TImporto imp_rec(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO)); + TRectype& compact_rec = compact_rows.row(i, false); //record originale + + TImporto imp_orig(compact_rec.get_char(RMOVANA_SEZIONE), compact_rec.get_real(RMOVANA_IMPORTO)); + imp_orig += imp_rec; + imp_orig.normalize(); + compact_rec.put(RMOVANA_SEZIONE, imp_orig.sezione()); + compact_rec.put(RMOVANA_IMPORTO, imp_orig.valore()); + } + else //...senno' aggiunge direttamente tutta la riga + { + TRectype* newrec = new TRectype(rec); //record destinazione + newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1); + compact_rows.add_row(newrec); + } + } + else + { + TRectype* newrec = new TRectype(rec); + newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1); + compact_rows.add_row(newrec); + } + } + + //ripristina i campi originali sul record di destinazione + for (int k = 1; k <= compact_rows.rows(); k++) + { + TRectype& compact_rec = compact_rows.row(k, false); + if (ca_ori_present(compact_rec)) + { + ca_taglia_campo(compact_rec, RMOVANA_CODCCORI, compact_rec, RMOVANA_CODCCOSTO); + ca_taglia_campo(compact_rec, RMOVANA_CODCMSORI, compact_rec, RMOVANA_CODCMS); + ca_taglia_campo(compact_rec, RMOVANA_CODFASEORI, compact_rec, RMOVANA_CODFASE); + ca_taglia_campo(compact_rec, RMOVANA_CODCONTORI, compact_rec, RMOVANA_CODCONTO); + } + } +} diff --git a/ca/calib01.h b/ca/calib01.h index 42e3db51c..f1be4c4a1 100755 --- a/ca/calib01.h +++ b/ca/calib01.h @@ -198,4 +198,11 @@ public: TCache_ripartizioni(); }; +// metodi di implosione movimenti ripartiti!! Serve nel ribaltamento movimenti, stampa rendiconto... +void ca_implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows); +bool ca_ori_present(const TRectype& rec); +bool ca_can_merge_rows(const TRectype& compact_rec, const TRectype& rec); +void ca_taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst); +void ca_copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst); + #endif