From d41d970279072fa3bd280855e6056678e1933a78 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 26 Sep 2010 09:43:43 +0000 Subject: [PATCH] Patch level : 10.0 nopatch Files correlati : pd6342.exe Ricompilazione Demo : [ ] Commento Habilita ripartizione ricorsiva step 2 git-svn-id: svn://10.65.10.50/branches/R_10_00@20905 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ps/pd6342300.cpp | 170 +++++++++++++++++++++++++++++++++++++++++----- ps/pd6342300a.h | 3 + ps/pd6342300a.uml | 16 +++++ 3 files changed, 173 insertions(+), 16 deletions(-) diff --git a/ps/pd6342300.cpp b/ps/pd6342300.cpp index 2f552cf32..87e3e73e1 100755 --- a/ps/pd6342300.cpp +++ b/ps/pd6342300.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "../cg/cglib01.h" #include "../ca/calib01.h" @@ -56,6 +57,65 @@ TRib_movanal_msk::TRib_movanal_msk() : TAnal_report_mask("ca2200a") { } +class TCSV_recset : public TCSV_recordset +{ +public: + TCSV_recset(TAssoc_array & calc); +}; + +TCSV_recset::TCSV_recset(TAssoc_array & calc) : TCSV_recordset(TString("CSV(;)\n")) +{ + TAssoc_array kcol; + TString_array rowkeys; + TString_array colkeys; + + FOR_EACH_ASSOC_OBJECT(calc, obj, key, item) + { + rowkeys.add(key); + TAssoc_array * row = (TAssoc_array *) item; + + FOR_EACH_ASSOC_OBJECT((*row), rowobj, colkey, rowitem) + kcol.add(colkey); + } + rowkeys.sort(); + krow.get_keys(colkeys); + colkeys.sort(); + create_columns(colkeys.items() + 1); + + const int ncols = columns(); + const int nrows = rowkeys.items(); + + TRecordset_column_info & c = (TRecordset_column_info &) column_info(0); + + c._name = "Key"; + for (int i= 1; i < ncols; i++) + { + TRecordset_column_info & c = (TRecordset_column_info &) column_info(i); + + c._name = colkeys.row(i); + c._name.ltrim(5); + } + for (int i= 0; i < ncols; i++) + { + new_rec(""); + TString rowkey = rowkeys.row(i); + TAssoc_array * row = (TAssoc_array *) calc.objptr(rowkey); + + rowkey.ltrim(5); + set(0, rowkey); + if (row != NULL) + { + for (int j= 1; j < ncols; j++) + { + const TRecordset_column_info & c = column_info(i); + const real * val = (const real *) row->objptr(c._name); + if (val != NULL) + set(j, *val); + } + } + } +} + //-------------------------------------------------------------------- // APPLICAZIONE //-------------------------------------------------------------------- @@ -63,13 +123,14 @@ class TRib_movanal_app : public TSkeleton_application { TCache_ripartizioni _cache_rip; bool _definitivo; + TAssoc_array _calc; protected: virtual void main_loop(); bool elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows, TRecord_array& output_rows); - bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, TRecord_array& output_rows); - bool pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, TRecord_array& output_rows); + bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path, TRecord_array& output_rows, TArray & output_paths); + bool pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path, TRecord_array& output_rows, TArray & output_paths); public: bool elabora_movimento(TAnal_mov& anal_mov, const bool esplodi); @@ -77,8 +138,8 @@ public: }; -bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, - TRecord_array& output_rows) +bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path, + TRecord_array& output_rows, TArray & output_paths) { bool ho_pareggiato = false; @@ -101,7 +162,7 @@ bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_ba //..originale ed ottenere cosi' il pareggio TRectype swaprec(rec); swaprec.put(RMOVANA_SEZIONE, imp_riga.sezione() == 'D' ? 'A' : 'D'); - ho_pareggiato = ripartizione(rrip, swaprec, output_rows); + ho_pareggiato = ripartizione(rrip, swaprec, path, output_rows, output_paths); //elimina il codcontoori da tutte le righe aggiunte per il pareggio for (int i = output_rows.rows(); i > original_nriga; i--) @@ -110,13 +171,30 @@ bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_ba return ho_pareggiato; } - -bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, TRecord_array& output_rows) +bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path, TRecord_array& output_rows, TArray & output_paths) { bool ho_ripartito = false; // Importo totale da distribuire arrotondato ai decimali della valuta di conto - TGeneric_distrib distrib(rec.get_real(RMOVANA_IMPORTO), TCurrency::get_firm_dec()); + const real importo = rec.get_real(RMOVANA_IMPORTO); + TGeneric_distrib distrib(importo, TCurrency::get_firm_dec()); + TToken_string rowkey("Code", ','); + rowkey.add(rec.get(RMOVANA_CODCCOSTO)); + rowkey.add(rec.get(RMOVANA_CODCMS)); + rowkey.add(rec.get(RMOVANA_CODFASE)); + rowkey.add(rec.get(RMOVANA_CODCONTO)); + + TAssoc_array * row = (TAssoc_array *)_calc.objptr(rowkey); + + if (row == NULL) + row = (TAssoc_array *) _calc.add(rowkey, new TAssoc_array); + + real * value = (real *) row->objptr(rowkey); + + if (value == NULL) + value = (real *) row->add(rowkey, new real); + + *value -= importo; // Calcolo tutte le percentuali da ripartire int i; const int righe_ripartizione = rrip.rows(); @@ -136,10 +214,21 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const 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) - 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); + if (rec.get(RMOVANA_CODCCORI).blank() && rec.get(RMOVANA_CODCMSORI).blank() && + rec.get(RMOVANA_CODFASEORI).blank()) // RMOVANA_CODCONTORI è vuoto nel caso di pareggio + { + 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); + } + else + { + ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCCORI); + ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCMSORI); + ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODFASEORI); + ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCONTORI); + } //e mette nei campi std i valori che trova nelle righe ripartizione ca_copia_campo(rrip[i], RRIP_CODCOSTO, *newrec, RMOVANA_CODCCOSTO); ca_copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS); @@ -147,6 +236,20 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO); output_rows.add_row(newrec); + output_paths.add(path); + TToken_string ripkey("Code", ','); + + ripkey.add(rec.get(RMOVANA_CODCCOSTO)); + ripkey.add(rec.get(RMOVANA_CODCMS)); + ripkey.add(rec.get(RMOVANA_CODFASE)); + ripkey.add(rec.get(RMOVANA_CODCONTO)); + + real * value = (real *) row->objptr(ripkey); + + if (value == NULL) + value = (real *) row->add(ripkey, new real); + *value += imp; + ho_ripartito = true; } //if(imp!=ZERO)... } //for(i=1;i<=righe_ripartizione... @@ -161,9 +264,11 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r const int annoes = anal_mov.get_int(MOVANA_ANNOES); const char tipomov = anal_mov.get_char(MOVANA_TIPOMOV); + TArray input_paths; + TArray output_paths; int loop = 0; - while (loop < 50) + while (loop++ < 50) { bool modified = false; for (int r = 1; r <= input_rows.rows(); r++) @@ -175,6 +280,9 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r //ripartizione batch: passa il conto perche' per prima cosa provera' una ripartizione di tipo 'P' con chiave 3; se non.. //..ci riuscira', provera' da solo (metodi della TCache_ripartizioni) le ripartizioni di tipo 'B' con chiave 4. const TAnal_ripartizioni_batch& rrip = _cache_rip.righe(zio, annoes, rmovana_indbil, tipomov); + if (input_paths.objptr(r) == NULL) + input_paths.add(new TToken_string, r); + const TToken_string & input_path = (TToken_string &) input_paths[r]; const char tiporip = rrip.tiporip(); //ci sono righe di ripartizione @@ -182,16 +290,26 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r bool ripartisci = righe_ripartizione > 0; //se ci sono righe di ripartizione/pareggio si va a ripartire! - if (ripartisci) + TToken_string path_item("Code", ','); + + path_item.add(rec.get(RRIP_CODCOSTO)); + path_item.add(rec.get(RRIP_CODCMS)); + path_item.add(rec.get(RRIP_CODFASE)); + path_item.add(rec.get(RRIP_CODCONTO)); + + if (ripartisci) + ripartisci = input_path.find(path_item) < 0; + if (ripartisci) { + input_paths.add(path_item); switch (tiporip) { //procedura di ripartizione batch 'B' originale; se tiporip=='P' invece ci vuole il pareggio del movana case 'B': - modified |= ripartizione(rrip, rec, output_rows); + modified |= ripartizione(rrip, rec, input_path, output_rows, output_paths); break; case 'P': - modified |= pareggio(anal_mov, rrip, rec, output_rows); + modified |= pareggio(anal_mov, rrip, rec, input_path, output_rows, output_paths); break; default: break; @@ -202,12 +320,14 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r TRectype* newrec = new TRectype(rec); newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1); output_rows.add_row(newrec); + output_paths.add(input_path, output_rows.rows() + 1); } } //for(int r=1; r<=input_rows.rows()... if (modified) { ho_cambiato_qualchecosa = true; input_rows = output_rows; + input_paths = output_paths; } else break; @@ -250,6 +370,15 @@ bool TRib_movanal_app::elabora_movimento(TAnal_mov& anal_mov, const bool esplodi { //Imploditore do_rewrite = ca_implode_rows(input_rows, compact_rows); + for (int r = 1; r <= compact_rows.rows(); r++) + { + TRectype& rec = compact_rows[r]; + + rec.zero(RMOVANA_CODCCORI); + rec.zero(RMOVANA_CODCMSORI); + rec.zero(RMOVANA_CODFASEORI); + rec.zero(RMOVANA_CODCONTORI); + } if (do_rewrite) { input_rows = compact_rows; // rimette i record compattati negli originali @@ -332,6 +461,15 @@ void TRib_movanal_app::main_loop() cur_movana.scan(compatta_callback, this, TR("Compattamento movimenti...")); else cur_movana.scan(ripartisci_callback, this, TR("Ripartizione movimenti...")); + TFilename fname(mask.get(F_PATH)); + + fname.add(mask.get(F_NAME)); + if (fname.full()) + { + TCSV_recset recset(_calc); + + recset.save_as(fname); + } } //if(run)... } else diff --git a/ps/pd6342300a.h b/ps/pd6342300a.h index 47d865530..a9bac9c0f 100755 --- a/ps/pd6342300a.h +++ b/ps/pd6342300a.h @@ -10,3 +10,6 @@ //..sheet #define F_CODCAUS 113 #define F_DESCAUS 114 +#define F_PATH 115 +#define F_NAME 116 + diff --git a/ps/pd6342300a.uml b/ps/pd6342300a.uml index 288e9a939..f005796a4 100755 --- a/ps/pd6342300a.uml +++ b/ps/pd6342300a.uml @@ -83,6 +83,22 @@ BEGIN PROMPT 2 7 "Blocca movimenti elaborati (DEFINITIVO e vale solo per ripartizione)" END +GROUPBOX DLG_NULL 78 8 +BEGIN + PROMPT 1 8 "@bFoglio Excel del calcolo" +END +STRING F_PATH 255 50 +BEGIN + PROMPT 2 9 "Cartella " + DSELECT +END + +STRING F_NAME 255 50 +BEGIN + PROMPT 2 10 "File " + FSELECT "*.xls" +END + ENDPAGE ENDMASK