From 384d3df36f4ae9d89acc894a9f98c9ecdba30fc2 Mon Sep 17 00:00:00 2001 From: luca Date: Wed, 9 Mar 2005 12:06:35 +0000 Subject: [PATCH] Patch level :2.2 46 Files correlati :ca2.exe ca2200a.msk Ricompilazione Demo : [ ] Commento :cappottiamoci! git-svn-id: svn://10.65.10.50/trunk@12796 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca2200.cpp | 127 ++++++++++++++++++++++++++++++++++--------------- ca/ca2200a.h | 1 + ca/ca2200a.uml | 5 ++ 3 files changed, 95 insertions(+), 38 deletions(-) diff --git a/ca/ca2200.cpp b/ca/ca2200.cpp index b15ebc1c5..0fc52f288 100755 --- a/ca/ca2200.cpp +++ b/ca/ca2200.cpp @@ -101,6 +101,7 @@ class TRib_movanal_app : public TSkeleton_application { TRib_movanal_msk * _mask; TCache_ripartizioni _cache_rip; + bool _definitivo; virtual const char * extra_modules() const {return "cm";} //deve funzionare anche per le commesse @@ -113,7 +114,7 @@ protected: void implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows); bool explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows); bool can_merge_rows(const TRectype& compact_rec, const TRectype& rec); - + bool ori_present(const TRectype& rec); public: TRib_movanal_app() {} @@ -148,10 +149,16 @@ static void taglia_campo (TRectype& src, const char* campo_src, bool TRib_movanal_app::can_merge_rows(const TRectype& compact_rec, const TRectype& rec) { - return (compact_rec.get(RMOVANA_CODCCOSTO) == rec.get(RMOVANA_CODCCOSTO) && - compact_rec.get(RMOVANA_CODCMS) == rec.get(RMOVANA_CODCMS) && - compact_rec.get(RMOVANA_CODFASE) == rec.get(RMOVANA_CODFASE) && - compact_rec.get(RMOVANA_CODFASE) == rec.get(RMOVANA_CODFASE) ); + 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) +{ + 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) @@ -159,33 +166,54 @@ void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_arr for (int r = 1; r <= input_rows.rows(); r++) { const TRectype& rec = input_rows.row(r); //record originale - TRectype* newrec = new TRectype(rec); //record destinazione - - //ripristina i campi originali sul record di destinazione - taglia_campo(*newrec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCCOSTO); - taglia_campo(*newrec, RMOVANA_CODCMSORI, *newrec, RMOVANA_CODCMS); - taglia_campo(*newrec, RMOVANA_CODFASEORI, *newrec, RMOVANA_CODFASE); - taglia_campo(*newrec, RMOVANA_CODCONTORI, *newrec, RMOVANA_CODCONTO); - - int i; - 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... + //se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere + if (ori_present(rec)) { - const TImporto imp_rec(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO)); - TRectype& compact_rec = (TRectype&) compact_rows[i]; //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()); + int i; + 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 //...senno' aggiunge direttamente tutta la riga + 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); + } } } @@ -211,9 +239,10 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr for (i = 1; i <= rrip.rows(); i++) { TRectype* newrec = new TRectype(rec); + newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1); const real imp = distrib.get(); // Legge la quota da distribuire - newrec->put("IMPORTO", imp); //e la mette nella nuova riga - //poi copia i valori dei campi cdc,cms,fsc,con in quelli di tipo ori (nello stesso record) + 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); @@ -231,7 +260,9 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr } else //nessuna riga di ripartizione->aggiungo la riga input all'output { - output_rows.add_row(rec); + TRectype* newrec = new TRectype(rec); + newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1); + output_rows.add_row(newrec); } } return ho_cambiato_qualchecosa; @@ -255,9 +286,21 @@ bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly) //..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.. output_rows.destroy_rows(); //..e poi lo pulisce + + bool do_rewrite = false; //Esploditore if (app.explode_rows(compact_rows, output_rows)) - output_rows.rewrite(); + { + input_rows = output_rows; //rimette i record elaborati negli originali + do_rewrite = true; + } + if (app._definitivo) //se l'elaborazione e' definitiva... + { + anal_mov.put(MOVANA_BLOCCATO, 'X'); //..mette bloccato = X nella testata del movimento + do_rewrite = true; + } + if (do_rewrite) //se ha elaborato delle righe e/o e' una elaborazione definitiva, riscrive la.. + anal_mov.rewrite(rel.lfile()); //testata ed aggiorna i saldi return true; } @@ -266,25 +309,33 @@ void TRib_movanal_app::main_loop() { while (_mask->run() == K_ENTER) { + //avvisa l'utente scapestrato che se fa una elaborazione definitiva blocchera' i movimenti + //che processa + _definitivo = _mask->get_bool(F_DEFINITIVO); //deve scandire il file MOVANA con chiave 2 (per data e numero di registrazione) TRelation rel_movana(LF_MOVANA); TRectype darec(LF_MOVANA), arec(LF_MOVANA); darec.put(MOVANA_DATAREG, _mask->get_date(F_DATAINI)); arec.put(MOVANA_DATAREG, _mask->get_date(F_DATAFIN)); TString filtro; - filtro << "BLOCCATO==''"; + filtro << "BLOCCATO!=\"X\""; TCursor cur_movana(&rel_movana, filtro, 2, &darec, &arec); const long items = cur_movana.items(); //usa la scan dei TCursor,quindi niente progind e for,x' gia' nel metodo if (items > 0) { - rel_movana.lfile().set_curr(new TAnal_mov); //il record principale della rel e' un TMov_anal!! - cur_movana.scan(cappotta_movimento, this, "Ribaltamento movimenti..."); + bool run = yesno_box(FR("Si desidera elaborare %ld movimenti?"), items); + if (run && _definitivo) + run = yesno_box(FR("Selezionata l'elaborazione definitiva\nSi desidera proseguire?")); + if (run) + { + rel_movana.lfile().set_curr(new TAnal_mov); //il record principale della rel e' un TMov_anal!! + cur_movana.scan(cappotta_movimento, this, "Ribaltamento movimenti..."); + } } else - message_box(TR("Non ci sono movimenti da ribaltare nel periodo selezionato")); - + message_box(TR("Non ci sono movimenti da elaborare nel periodo selezionato")); } } diff --git a/ca/ca2200a.h b/ca/ca2200a.h index 9805ce559..e7a4d7562 100755 --- a/ca/ca2200a.h +++ b/ca/ca2200a.h @@ -2,3 +2,4 @@ #define F_DATAINI 102 #define F_DATAFIN 103 +#define F_DEFINITIVO 104 diff --git a/ca/ca2200a.uml b/ca/ca2200a.uml index b7ef4573c..ae1be250b 100755 --- a/ca/ca2200a.uml +++ b/ca/ca2200a.uml @@ -34,6 +34,11 @@ BEGIN CHECKTYPE REQUIRED END +BOOLEAN F_DEFINITIVO +BEGIN + PROMPT 2 5 "Blocca movimenti elaborati" +END + ENDPAGE ENDMASK \ No newline at end of file