diff --git a/pe/pe0400.cpp b/pe/pe0400.cpp index d7c6fa6d3..cf045a97d 100755 --- a/pe/pe0400.cpp +++ b/pe/pe0400.cpp @@ -62,7 +62,7 @@ public: virtual void user_set_row_handler(TMask& rm, short field, int index); void update_prezzo_vendita(TMask & row_mask); - + void update_costi_ricavi(int row = -1, bool update_sheet = false); virtual TVariable_mask * riga_mask(int numriga); virtual void doc2mask(bool reload_clifo = true, bool force_load = false, bool update = true); @@ -127,6 +127,88 @@ void TGestione_preventivo_msk:: on_idle() //magico metodo per settare, al cambio riga dello sheet, il focus sul campo desiderato (il campo in questione è.. //..definito nella on_idle(); ricordarsi la set_notify() nel costruttore della maschera senno' viene eseguito l'ss_notify().. //..standard e non questo qui ridefinito. Allah! + +void TGestione_preventivo_msk::update_costi_ricavi(int nrow, bool update_sheet) +{ + TDocumento & d = doc(); + const int rows = d.physical_rows(); + TArray valori; + TArray costi; + TSheet_field & sh = sfield(F_SHEET); + bool all = nrow < 0; + + if (all) + nrow = rows; + else + d[nrow].autosave(sh); + + const int cur_level = d[nrow].get_int(RDOC_LEVEL); + + while (nrow < rows && cur_level <= d[nrow + 1].get_int(RDOC_LEVEL)) + nrow++; + for (int i = nrow; i > 0; i--) + { + TRiga_documento & row = (TRiga_documento &)d[i]; + const int level = row.get_int(RDOC_LEVEL); + + if (i == rows || level >= doc()[i + 1].get_int(RDOC_LEVEL)) + { + const real importo = row.importo(true, false); + + row.put(RDOC_VALV, importo); + for (int i = level - 1; i >= 0; i--) + { + real * r = (real *) valori.objptr(i); + + if (r == NULL) + { + r = new real; + valori.add(r, i); + } + *r += importo; + } + + const real costo = row.get_real(RDOC_QTA) * row.get_real(RDOC_COSTO); + + row.put(RDOC_VALC, costo); + for (int i = level - 1; i >= 0; i--) + { + real * r = (real *) costi.objptr(i); + + if (r == NULL) + { + r = new real; + costi.add(r, i); + } + *r += costo; + } + } + else + { + real * r = (real *) valori.objptr(level); + + if (r != NULL) + { + row.put(RDOC_VALV, *r); + *r = ZERO; + } + r = (real *) costi.objptr(level); + if (r != NULL) + { + row.put(RDOC_VALC, *r); + *r = ZERO; + } + } + if (update_sheet) + { + row.autoload(sh); + sh.check_row(i - 1); + sh.force_update(i - 1); + } + if (!all && level <= 0) + break; + } +} bool TGestione_preventivo_msk::ss_notify(TSheet_field& ss, int r, KEY key) { TGestione_preventivo_msk& mask = (TGestione_preventivo_msk&) ss.mask(); @@ -230,6 +312,11 @@ bool TGestione_preventivo_msk::ss_notify(TSheet_field& ss, int r, KEY key) } } break; + case K_CTRL + K_DEL: // Cancellazione + mask.update_costi_ricavi(-1, true); + break; + case K_ENTER: // Uscita con modifiche + mask.update_costi_ricavi(r + 1, true); default: break; } @@ -873,82 +960,30 @@ TMask* TGestione_preventivo_app::get_mask( int mode ) //ridefinisco il metodo write delle TMotore_application int TGestione_preventivo_app::write( const TMask& m ) { - TDocumento& doc = ((TDocumento_mask&) m).doc(); + TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) m; + TDocumento& doc = mask.doc(); + const int rows = doc.physical_rows(); const TString k = doc.get(DOC_K); int max_level = 0; - const int rows = doc.physical_rows(); TArray valori; TArray costi; - for (int r = 1; r <= rows; r++) - { - const int level = doc[r].get_int(RDOC_LEVEL); - - if (max_level < level) - max_level = level; - } for (int i = rows ; i > 0; i--) { TRiga_documento & row = (TRiga_documento &)doc[i]; const int level = row.get_int(RDOC_LEVEL); - if (level == max_level && row.get(RDOC_K).blank()) - row.put(RDOC_K, k); if (i == rows || level >= doc[i + 1].get_int(RDOC_LEVEL)) - { - const real importo = row.importo(true, false); - - row.put(RDOC_VALV, importo); - for (int i = level - 1; i >= 0; i--) - { - real * r = (real *) valori.objptr(i); - - if (r == NULL) - { - r = new real; - valori.add(r, i); - } - *r += importo; - } - - const real costo = row.get_real(RDOC_QTA) * row.get_real(RDOC_COSTO); - - row.put(RDOC_VALC, costo); - for (int i = level - 1; i >= 0; i--) - { - real * r = (real *) costi.objptr(i); - - if (r == NULL) - { - r = new real; - costi.add(r, i); - } - *r += costo; - } - } - else - { - real * r = (real *) valori.objptr(level); - - if (r != NULL) - { - row.put(RDOC_VALV, *r); - *r = ZERO; - } - r = (real *) costi.objptr(level); - if (r != NULL) - { - row.put(RDOC_VALC, *r); - *r = ZERO; - } - } + row.put(RDOC_K, k); } + mask.update_costi_ricavi(); return TMotore_application::write(m); } //ridefinisco il metodo rewrite delle TMotore_application int TGestione_preventivo_app::rewrite( const TMask& m ) { + TGestione_preventivo_msk & mask = (TGestione_preventivo_msk &) m; TDocumento& doc = ((TDocumento_mask&) m).doc(); const TString k = doc.get(DOC_K); int max_level = 0; @@ -956,69 +991,15 @@ int TGestione_preventivo_app::rewrite( const TMask& m ) TArray valori; TArray costi; - for (int r = 1; r <= rows; r++) - { - const int level = doc[r].get_int(RDOC_LEVEL); - - if (max_level < level) - max_level = level; - } for (int i = rows ; i > 0; i--) { TRiga_documento & row = (TRiga_documento &)doc[i]; const int level = row.get_int(RDOC_LEVEL); - if (level == max_level && row.get(RDOC_K).blank()) - row.put(RDOC_K, k); if (i == rows || level >= doc[i + 1].get_int(RDOC_LEVEL)) - { - const real importo = row.importo(true, false); - - row.put(RDOC_VALV, importo); - for (int i = level - 1; i >= 0; i--) - { - real * r = (real *) valori.objptr(i); - - if (r == NULL) - { - r = new real; - valori.add(r, i); - } - *r += importo; - } - - const real costo = row.get_real(RDOC_QTA) * row.get_real(RDOC_COSTO); - - row.put(RDOC_VALC, costo); - for (int i = level - 1; i >= 0; i--) - { - real * r = (real *) costi.objptr(i); - - if (r == NULL) - { - r = new real; - costi.add(r, i); - } - *r += costo; - } - } - else - { - real * r = (real *) valori.objptr(level); - - if (r != NULL) - { - row.put(RDOC_VALV, *r); - *r = ZERO; - } - r = (real *) costi.objptr(level); - if (r != NULL) - { - row.put(RDOC_VALC, *r); - *r = ZERO; - } - } + row.put(RDOC_K, k); } + mask.update_costi_ricavi(); return TMotore_application::rewrite(m); }