From f7827706056436fef69007b3c1bbd622e51b9ba3 Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 27 Apr 2010 14:10:09 +0000 Subject: [PATCH] Patch level : Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@20382 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ps/ps1001300.cpp | 270 +++++++++++++++++++++++++++++++++++----------- ps/ps1001300a.uml | 37 ++++--- 2 files changed, 227 insertions(+), 80 deletions(-) diff --git a/ps/ps1001300.cpp b/ps/ps1001300.cpp index 259d7e660..ab2f79103 100755 --- a/ps/ps1001300.cpp +++ b/ps/ps1001300.cpp @@ -15,6 +15,81 @@ #include "ps1001.h" #include "ps1001300a.h" +/////////////////////////////////// +// Metodi static di ordinamento +/////////////////////////////////// +//ordina per numreg/numrig (long+int) oppure per numreg/datacomp/autofcomp/datafcomp +static int compare_by_numrig(TSheet_field & s, int r1, int r2) +{ + TToken_string& s1 = s.row(r1); + TToken_string& s2 = s.row(r2); + + //prima guarda il numreg.. + const int numreg_pos = s.cid2index(S_NUMREG); + const long b11 = s1.get_long(numreg_pos); + const long b21 = s2.get_long(numreg_pos); + int cmp = b11 - b21; + + + if (cmp == 0) + { + if (b11 > 0) //..poi il numrig + { + const int numrig_pos = numreg_pos + 1; + const int c11 = s1.get_int(numrig_pos); + const int c21 = s2.get_int(numrig_pos); + cmp = c11 - c21; + } + else //..oppure le date se numreg=0 (b11=b12 = 0) + { + const int datacomp_pos = s.cid2index(S_DATACOMP); + const TDate d11 = s1.get(datacomp_pos); + const TDate d21 = s2.get(datacomp_pos); + cmp = int(d11 - d21); + if (cmp == 0) + { + const int autofcomp_pos = s.cid2index(S_AUTOFCOMP); + const char* e11 = s1.get(autofcomp_pos); + const char* e21 = s2.get(autofcomp_pos); + if (e11 == e21) + { + const int datafcomp_pos = s.cid2index(S_DATAFCOMP); + const TDate f11 = s1.get(datafcomp_pos); + const TDate f21 = s2.get(datafcomp_pos); + cmp = int(f11 - f21); + } + } + } + } + + return cmp; +} + +//nota: nelle ststic non si possono usare i _pos_quel, perchè sono di maschera +//ordina le righe per sede/fase/conto (string+string+string) +static int compare_by_fase(TSheet_field & s, int r1, int r2) +{ + TToken_string& s1 = s.row(r1); + TToken_string& s2 = s.row(r2); + + TToken_string c1; + c1.add(s1.get(1)); + c1.add(s1.get(2)); + c1.add(s1.get(3)); + + TToken_string c2; + c2.add(s2.get(1)); + c2.add(s2.get(2)); + c2.add(s2.get(3)); + + int cmp = c1.compare(c2); + + if (cmp == 0) + cmp = compare_by_numrig(s, r1, r2); + + return cmp; +} + /////////////////////////////////////////////////////////// // TAutomask /////////////////////////////////////////////////////////// @@ -31,11 +106,13 @@ protected: int carica_rmovana(); bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check - int find_sister_rows(const int curr_sister, int& first_sister, int& last_sister); //(on_field) trova le righe con la stessa chiave della riga corrente - void build_key(int i, TToken_string& key); //(find_sister_rows) crea la chiave della riga con cui cercare le sorelle + int find_sister_rows(const int curr_sister, int& first_sister, int& last_sister, const bool by_numreg = false); //(on_field) trova le righe.. + //con la stessa chiave della riga corrente e della chiave selezionata + void build_key(int i, TToken_string& key); //(find_sister_rows) crea la chiave cdc/fase/conto della riga con cui cercare le sorelle + void build_key_by_numreg(int i, TToken_string& key); //(find_sister_rows) crea la chiave numreg della riga con cui cercare le sorelle void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(carica_rmovana()) crea i saldi preventivi in base agli importi - void save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata - void save_sheet(); //(save()) salva i cambiamenti nello sheet + bool save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata + bool save_sheet(); //(save()) salva i cambiamenti nello sheet bool save(); //(on_field) gestisce l'ordine dei salvataggi public: @@ -75,6 +152,7 @@ TVariazione_budget_mask::~TVariazione_budget_mask() ditta_ini.set("CodCaus", get(F_CODCAUS)); } +//crea la chiave cdc/fase/conto void TVariazione_budget_mask::build_key(int i, TToken_string& key) { TSheet_field& sf_righe = sfield(F_RIGHE); @@ -86,18 +164,36 @@ void TVariazione_budget_mask::build_key(int i, TToken_string& key) key.add(curr_riga.get(_pos_conto)); } -int TVariazione_budget_mask::find_sister_rows(const int curr_sister, int& first_sister, int& last_sister) + +void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key) +{ + TSheet_field& sf_righe = sfield(F_RIGHE); + TToken_string curr_riga = sf_righe.row(i); + //chiave della riga sorella originale + key.cut(0); + key.add(curr_riga.get(_pos_numreg)); +} + +//cerca le righe sorelle per chiave cdc/fase/conto o numreg (dipende da by_numreg) +int TVariazione_budget_mask::find_sister_rows(const int curr_sister, int& first_sister, int& last_sister, const bool by_numreg) { first_sister = last_sister = curr_sister; TToken_string key; - build_key(curr_sister, key); + if (by_numreg) + build_key_by_numreg(curr_sister, key); + else + build_key(curr_sister, key); TToken_string key_iesima; for (int i = curr_sister - 1; i >= 0; i--) { - build_key(i, key_iesima); + if (by_numreg) + build_key_by_numreg(i, key_iesima); + else + build_key(i, key_iesima); + if (key == key_iesima) first_sister = i; else @@ -108,7 +204,11 @@ int TVariazione_budget_mask::find_sister_rows(const int curr_sister, int& first_ const long items = sf_righe.items(); for (int i = curr_sister + 1; i < items; i++) { - build_key(i, key_iesima); + if (by_numreg) + build_key_by_numreg(i, key_iesima); + else + build_key(i, key_iesima); + if (key == key_iesima) last_sister = i; else @@ -182,17 +282,18 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e, //bottoni case DLG_CANCEL: - if (e == fe_button) + if (e == fe_button && jolly == 0) //jolly serve per specificare che è il DLG_CANCEL della maschera principale { if (_dirty) { if (yesno_box("Salvare le modifiche effettuate?")) - save(); + if (!save()) //attenzione! se la save non riesce si deve fermare senza resettare le modifiche! + return false; } enable(F_CODCMS); enable(F_DESCRIZ); sfield(F_RIGHE).destroy(); - _dirty = false; + return false; } break; @@ -306,7 +407,7 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e, // Metodi della on_field_event /////////////////////////////////// //salva la commessa con le eventuali modifiche effettuate sulle date -void TVariazione_budget_mask::save_commessa() +bool TVariazione_budget_mask::save_commessa() { TLocalisamfile commesse(LF_COMMESSE); commesse.put(COMMESSE_CODCMS, get(F_CODCMS)); @@ -318,12 +419,96 @@ void TVariazione_budget_mask::save_commessa() commesse.put(COMMESSE_PROROGA, get_bool(F_PROROGATA)); commesse.put(COMMESSE_DATAPROR, get_date(F_DATAPRORCMS)); //solo la rewrite perchè la commessa ovviamente esiste già - commesse.rewrite(); + err = commesse.rewrite(); } + return err == NOERR; } -void TVariazione_budget_mask::save_sheet() +//salva lo sheet...lasciate ogni speranza voi che entrate! +bool TVariazione_budget_mask::save_sheet() { + //1)ordina le righe per numreg/numrig + TSheet_field& sf_righe = sfield(F_RIGHE); + sf_righe.sort(compare_by_numrig); + + //file dei movana qui richiamato in quanto può essere modificato in vari punti successivi... + TLocalisamfile file_movana(LF_MOVANA); + + //2)cerca le sorelle per numreg/numrig + FOR_EACH_SHEET_ROW(sf_righe, r, riga) + { + int first, last; + const int sisters = find_sister_rows(r, first, last, true); + const long numreg = sf_righe.row(r).get_long(_pos_numreg); + + //giro di controllo sulle date; le righe sheet, eventualmente modificate, devono avere un intervallo date.. + //..compatibile con quello del movimento + if (numreg > 0) + { + TAnal_mov movana(numreg); + const TDate datacomp = movana.get_date(MOVANA_DATACOMP); + TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP); + const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP); + if (!datafcomp.ok() && !autofcomp) + datafcomp = datacomp; + + //controlla le righe sorelle dello sheet; se le date non rientrano in quelle della testata -> le righe.. + //..vanno considerate nuove, e quindi va messo a 0 il loro numreg/numrig + bool row_modified = false; + for (int i = last; i >= first; i--) + { + //date testata + const bool r_autofcomp = *sf_righe.cell(i, _pos_autofcomp) > ' '; + const TDate r_datacomp = sf_righe.cell(i, _pos_datacomp); + TDate r_datafcomp = sf_righe.cell(i, _pos_datafcomp); + if (r_datafcomp < r_datacomp) + r_datafcomp = r_datacomp; + + //importo riga: se nullo la riga verrà eliminata in quanto inutile all'umanità + const int r_numrig = atoi(sf_righe.cell(i, _pos_numrig)); + const real r_importo = sf_righe.cell(i, _pos_imp); + + //le righe da liberare sono quelle che non rispettano i vincoli sulle date + if (r_autofcomp != autofcomp || r_datacomp != datacomp || r_datafcomp != datafcomp || r_importo.is_zero()) + { + sf_righe.row(i).add("", _pos_numreg); + sf_righe.row(i).add("", _pos_numrig); + //elimina la riga dal movana + row_modified |= movana.destroy_row(r_numrig, true); + } + else //qui invece ci vanno le righe modificate che sono solo da riscrivere + { + TRectype& rmovana = movana.body()[r_numrig]; + const real importo = rmovana.get_real(RMOVANA_IMPORTO); + if (importo != r_importo) + { + rmovana.put(RMOVANA_IMPORTO, r_importo); + row_modified = true; + } + + const char* r_descr = sf_righe.cell(i, _pos_descr); + const TString& descr = rmovana.get(RMOVANA_DESCR); + if (descr != r_descr) + { + rmovana.put(RMOVANA_DESCR, r_descr); + row_modified = true; + } + } + } + if (row_modified) + { + movana.update_totdoc(); + movana.rewrite(file_movana); + } + } + //finito il giro sulle sorelle; si passa alla successiva famiglia (ovvero al successivo numreg) + r = last; + } + + //le righe vanno rimesse in ordine di chiave cdc/fase/conto + sf_righe.sort(compare_by_fase); + sf_righe.force_update(); + return true; } bool TVariazione_budget_mask::save() @@ -331,11 +516,10 @@ bool TVariazione_budget_mask::save() //salva nel ditta.ini la causale sulla maschera TConfig ditta_ini(CONFIG_DITTA, "ps1001"); ditta_ini.set("CodCaus", get(F_CODCAUS)); - //salva le modifiche alle date della commessa - save_commessa(); - //salva lo sheet (è il programma principale) - save_sheet(); - _dirty = false; + + //salva le modifiche alle date della commessa e lo sheet + if (save_commessa() && save_sheet()) + _dirty = false; return true; } @@ -391,51 +575,6 @@ void TVariazione_budget_mask::aggiorna_saldi_preventivi(TSheet_field& sf_righe, } } -//ordina per numreg/numrig (long+int) -static int compare_by_numrig(TSheet_field & s, int r1, int r2) -{ - TToken_string& s1 = s.row(r1); - TToken_string& s2 = s.row(r2); - - //prima guarda il numreg.. - long c10 = s1.get_long(12); - long c20 = s2.get_long(12); - int cmp = c10 - c20; - //..poi il numrig - if (cmp == 0) - { - int c11 = s1.get_int(13); - int c21 = s2.get_int(13); - cmp = c11 - c21; - } - - return cmp; -} - -//nota: nelle ststic non si possono usare i _pos_quel, perchè sono di maschera -//ordina le righe per sede/fase/conto (string+string+string) -static int compare_by_fase(TSheet_field & s, int r1, int r2) -{ - TToken_string& s1 = s.row(r1); - TToken_string& s2 = s.row(r2); - - TToken_string c1; - c1.add(s1.get(1)); - c1.add(s1.get(2)); - c1.add(s1.get(3)); - - TToken_string c2; - c2.add(s2.get(1)); - c2.add(s2.get(2)); - c2.add(s2.get(3)); - - int cmp = c1.compare(c2); - - if (cmp == 0) - cmp = compare_by_numrig(s, r1, r2); - - return cmp; -} int TVariazione_budget_mask::carica_rmovana() { @@ -539,6 +678,9 @@ int TVariazione_budget_mask::carica_rmovana() //e poi aggiorna il video! sf_righe.force_update(); + //al momento del caricamento NON ci sono state modifiche! + _dirty = false; + return sf_righe.items(); } diff --git a/ps/ps1001300a.uml b/ps/ps1001300a.uml index 031746266..4fae4d754 100755 --- a/ps/ps1001300a.uml +++ b/ps/ps1001300a.uml @@ -178,55 +178,58 @@ ENDMASK ///////////////////////////////////////// //maschera di riga -PAGE "Riga analitica" -1 -1 70 15 +PAGE "Riga analitica" -1 -1 70 16 BOOLEAN S_CHECK BEGIN - PROMPT 1 1 "Applica " + PROMPT 1 1 "Applica" END STRING S_CDC 4 BEGIN - PROMPT 1 2 "Sede " + PROMPT 1 2 "Sede " FLAGS "L" + GROUP 1 END STRING S_FASE 5 BEGIN - PROMPT 1 3 "Fase " + PROMPT 1 3 "Fase " FLAGS "L" + GROUP 1 END STRING S_CONTO 12 BEGIN - PROMPT 1 4 "Conto " + PROMPT 1 4 "Conto " FLAGS "L" + GROUP 1 END DATE S_DATACOMP BEGIN - PROMPT 1 5 "Ini.comp " + PROMPT 1 5 "Ini.compet." END BOOLEAN S_AUTOFCOMP BEGIN - PROMPT 1 6 "AutoComp " + PROMPT 1 6 "AutoCompet." END DATE S_DATAFCOMP BEGIN - PROMPT 1 7 "Fin.comp " + PROMPT 1 7 "Fin.compet." END STRING S_COSRIC 1 BEGIN - PROMPT 1 8 "Cst/Ric " + PROMPT 1 8 "Csti/Ricavi" FLAGS "L" END NUMBER S_IMPORTO 15 2 BEGIN - PROMPT 1 9 "Importo " + PROMPT 1 9 "Importo " END NUMBER S_PREVENTIVO 15 2 @@ -237,30 +240,32 @@ END NUMBER S_MATURATO 15 2 BEGIN - PROMPT 1 11 "Maturato " + PROMPT 1 11 "Maturato " FLAGS "L" END STRING S_DESCR 50 BEGIN - PROMPT 1 12 "Descr. " + PROMPT 1 12 "Descrizione" END NUMBER S_NUMREG 7 BEGIN - PROMPT 1 13 "N. reg. " - FLAGS "L" + PROMPT 1 13 "N. reg. " + FLAGS "GL" + MESSAGE EMPTY ENABLE,1@ + MESSAGE DISABLE,1@ END NUMBER S_NUMRIG 3 BEGIN - PROMPT 1 14 "N. riga " + PROMPT 1 14 "Num. riga " FLAGS "L" END STRING S_TIPOMOV 1 BEGIN - PROMPT 1 15 "Tipo " + PROMPT 1 15 "Tipo mov. " FLAGS "L" END