From 609a8d508fbd2127f3e4a82a5364dd7c53a071cf Mon Sep 17 00:00:00 2001 From: luca Date: Fri, 9 Oct 2009 11:19:34 +0000 Subject: [PATCH] Patch level :10.0 Files correlati : Ricompilazione Demo : [ ] Commento : ma 'sti cazzo di listini non finiscono mai???!!! git-svn-id: svn://10.65.10.50/trunk@19414 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve1100.cpp | 2 +- ve/ve2700.cpp | 165 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 124 insertions(+), 43 deletions(-) diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 273cdcce2..9b192d0a4 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -1396,7 +1396,7 @@ void TStampaDoc_application::print_selected(KEY k) pr.set_printtype(screenvis); else { - if (pr.printtype() != acrobatprinter) + //if (pr.printtype() != acrobatprinter) pr.set_printtype(winprinter); } } diff --git a/ve/ve2700.cpp b/ve/ve2700.cpp index 47dde5a90..ba9cb2063 100755 --- a/ve/ve2700.cpp +++ b/ve/ve2700.cpp @@ -24,6 +24,7 @@ class TAggiorna_listini_edit_mask : public TAutomask TMask* _query_mask; //puntatore alla maschera di query TString8 _curr_grmerc; //iniziale grmerc-sotgrmerc bool _ges_um; //gestione unità di misura del listino padre + bool _ask_save; //chiede di salvare al cambio grmerc se effettuati cambiamenti nello sheet protected: //Metodi dello sheet listini figli @@ -42,6 +43,7 @@ protected: void check_all(const bool checked); //checka-dechecka la colonna dei check (on_field) void add_art(); //aggiunge un articolo ai listini (on_field) void save_listini(); //salva tutte le righe listini (padre e figli) così come sono sullo sheet (on_field) + real get_price(TSheet_field& sf, const int row, const int col) const; virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); @@ -180,6 +182,19 @@ void TAggiorna_listini_edit_mask::save_children_list() //metodi F_MULTILISTINI + +real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const int col) const +{ + if (col == sf.cid2index(F_PREZZO)) + { + TString16 str_prezzo = sf.cell(row, col); + str_prezzo.strip("."); + str_prezzo.replace(',', '.'); + return real(str_prezzo); + } + return real(sf.cell(row, col)); +} + //cerca nello sheet la coppia codart+um che gli viene passata restituendo la posizione della riga ALTA.. //della coppia di righe sheet interessate (è la riga disabilitata); int TAggiorna_listini_edit_mask::find_codart(TSheet_field& sf, const TString& codart, const TString& codum) const @@ -307,12 +322,28 @@ void TAggiorna_listini_edit_mask::fill_multilistini_sheet() //cerca se esiste o se deve aggiungerla: la find_cor_add_odart restituisce il numero della riga alta.. //..(descrizione/um) del codart in questione (che starà la riga sotto, ovvero riga_alta+1) const int riga_alta = find_or_add_codart(sf_multilistini, codart, um); + const int riga_bassa = riga_alta + 1; //mette il prezzo al posto giusto (padre e figlio) - if (pos <= 0) - sf_multilistini.row(riga_alta + 1).add(prezzo.string(), prezzo_pos); + if (pos <= 0) //padre + { + const TPrice prezzo_base(prezzo); + sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos); + } else + { sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos); + sf_multilistini.row(riga_bassa).add(prezzo.string(), prezzo_pos + pos); + real fath_prezzo = get_price(sf_multilistini, riga_bassa, prezzo_pos); + //se il figlio ha un prezzo ma il padre no, ricalcola il valore dell'articolo nel padre usando il ricarico + if (fath_prezzo.is_zero()) + { + TSheet_field& listini_figli = sfield(F_LISTINI_FIGLI); + const real ricarico = listini_figli.cell(pos - 1, listini_figli.cid2index(F_RICARICO)); + const TPrice prezzo_base(prezzo * CENTO / (CENTO + ricarico)); + sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos); + } + } } //for(bool ok.. } //FOR_EACH_TOKEN.. @@ -339,7 +370,7 @@ void TAggiorna_listini_edit_mask::update_sons_prices() const real old_son_prezzo = sf_listini.cell(i - 1, son_prezzo_pos); if (old_son_prezzo > ZERO) { - const real fath_prezzo = riga->get(fath_prezzo_pos); + const real fath_prezzo = get_price(sf_listini, i, fath_prezzo_pos); const TPrice son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO; riga->add(son_prezzo.get_num().string(), son_prezzo_pos); } @@ -434,7 +465,10 @@ void TAggiorna_listini_edit_mask::add_art() um = riga->get(2); um.trim(); const int numriga = find_or_add_codart(sf_listini, codart, um); if (numriga >= 0) - sf_listini.row(numriga + 1).add(riga->get(3), prezzo_pos); + { + const TPrice prezzo(real(riga->get(3))); + sf_listini.row(numriga + 1).add(prezzo.string(true), prezzo_pos); + } } sf_listini.force_update(); } @@ -479,49 +513,69 @@ void TAggiorna_listini_edit_mask::save_listini() recset_rows.set_var("#COD", cod); const long recset_rows_items = recset_rows.items(); + TLocalisamfile& file = recset_rows.cursor()->file(); + + //eliminatore di articoli cancellati dallo sheet for (bool ok = recset_rows.move_first(); ok; ok = recset_rows.move_next()) { - TLocalisamfile& file = recset_rows.cursor()->file(); - //prende codart e um dal record su file rcondv const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string(); const TString& um = recset_rows.get(RCONDV_UM).as_string(); //cerca sullo sheet la coppia codart+um const int riga_alta = find_codart(sf_listini, codart, um); - const real prezzo = sf_listini.row(riga_alta + 1).get(prezzo_pos + pos); + const real prezzo = get_price(sf_listini, riga_alta + 1, prezzo_pos + pos); //se non la trova o se il prezzo è 0 elimina la riga dal file if (riga_alta < 0 || prezzo == ZERO) - { file.remove(); - continue; - } - - //alla fine della storia registra tutto lo sheet sul file - FOR_EACH_SHEET_ROW(sf_listini, r, riga) - { - //file.zero(); //achtung! se l'articolo è nuovo ci può stare, ma se c'era già no - file.put(RCONDV_TIPO, "L"); - file.put(RCONDV_CATVEN, catven); - file.put(RCONDV_COD, cod); - - file.put(RCONDV_TIPORIGA, "A"); - file.put(RCONDV_CODRIGA, codart); - file.put(RCONDV_UM, um); - file.put(RCONDV_PREZZO, prezzo); - - } - - file.setkey(1); - const int nuovo_articolo = file.read(); - - //alla fine della fiera deve salvare su file veramente! - //se è in inserimento deve fare un write, se in modifica la rewrite - if (nuovo_articolo > 0) - file.rewrite_write(); - else - file.write_rewrite(); } - } + + TRectype key_rec(LF_RCONDV); + + //alla fine della storia registra tutto lo sheet sul file + FOR_EACH_SHEET_ROW(sf_listini, r, riga) if (r & 1) + { + const real prezzo = get_price(sf_listini, r, prezzo_pos + pos); + if (prezzo > ZERO) + { + const TString codart = riga->get(1); + const TString4 um = _ges_um ? sf_listini.row(r - 1).get(2) : ""; + //si costruisce un record con la chiave che trova sullo sheet in modo da poterlo cercare.. + //..sul file rcondv + key_rec.zero(); + key_rec.put(RCONDV_TIPO, "L"); + key_rec.put(RCONDV_CATVEN, catven); + key_rec.put(RCONDV_COD, cod); + + key_rec.put(RCONDV_TIPORIGA, "A"); + key_rec.put(RCONDV_CODRIGA, codart); + if (_ges_um) + key_rec.put(RCONDV_UM, um); + + //c'e' l'articolo nel listino? + file.curr() = key_rec; + int err = file.read(); + + //alla fine della fiera deve salvare su file veramente! + //se è in inserimento deve fare un write, se in modifica la rewrite + if (err == NOERR) //lo trova già esistente -> aggiorna il prezzo + { + file.put(RCONDV_PREZZO, prezzo); + err = file.rewrite_write(); + } + else //non lo trova quindi lo aggiunge + { + if (err == _isreinsert) + { + file.curr() = key_rec; + file.put(RCONDV_PREZZO, prezzo); + err = file.write_rewrite(); + } + } //if(err==NOERR.. + if (err != NOERR) + error_box(FR("Errore %d durante l'aggiornamento dell'articolo %s nel listino %s"), err, (const char*)codart, (const char*)cod); + } + } //FOR_EACH_SHEET_ROW... + } //FOR_EACH_TOKEN... } @@ -553,18 +607,42 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC)); if (grmerc != _curr_grmerc) { + if (_ask_save) + { + if (yesno_box(TR("Registrare le modifiche effettuate?"))) + save_listini(); + } fill_ricarichi_children_list(); fill_multilistini_sheet(); + _ask_save = false; } } break; case F_PREZZO: - if (e == fe_modify && real::is_null(o.get())) + if (e == fe_modify) { - TSheet_field& sf_listini = sfield(F_MULTILISTINI); - TMask& rowmask = sf_listini.sheet_mask(); - rowmask.field(DLG_USER).on_hit(); + if (real::is_null(o.get())) + { + TMask& rowmask = o.mask(); + rowmask.field(DLG_USER).on_hit(); + } + _ask_save = true; + } + break; + case F_LIST1: + case F_LIST2: + case F_LIST3: + case F_LIST4: + case F_LIST5: + case F_LIST6: + case F_LIST7: + case F_LIST8: + case F_LIST9: + case F_LIST10: + if (e == fe_modify) + { + _ask_save = true; } break; case DLG_USER: @@ -583,8 +661,8 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even case DLG_APPLICA: if (e == fe_button) { - update_sons_prices(); - save_children_list(); + update_sons_prices(); + _ask_save = true; } break; case DLG_CHECKALL: @@ -604,6 +682,7 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even case DLG_SAVEREC: if (e == fe_button) { + save_children_list(); save_listini(); } break; @@ -714,6 +793,8 @@ TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask) const TRectype& rec_padre = cache().get(LF_CONDV, chiave); _ges_um = rec_padre.get_bool(CONDV_GESTUM); + _ask_save = false; + //popola lo sheet dei listini figli fill_children_list(); //e poi setta le intestazioni dello sheet multilistini