From 07eb5f8967b6105e1620c36ba9a6fddd32546a3e Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 6 Oct 2009 13:42:22 +0000 Subject: [PATCH] Patch level :10.0 Files correlati : Ricompilazione Demo : [ ] Commento : cambiato formato del ricarico (numerico) prima versione autoriempiente dello sheet multilistino (ma non autocalcolante) git-svn-id: svn://10.65.10.50/trunk@19382 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve2700.cpp | 152 ++++++++++++++++++++++++++++++++++++++++++++----- ve/ve2700b.uml | 10 ++-- ve/vetbgmc.uml | 3 +- 3 files changed, 145 insertions(+), 20 deletions(-) diff --git a/ve/ve2700.cpp b/ve/ve2700.cpp index 72c8dae92..d5f623908 100755 --- a/ve/ve2700.cpp +++ b/ve/ve2700.cpp @@ -1,11 +1,13 @@ #include #include #include +#include #include #include #include #include +#include "../mg/anamag.h" #include "condv.h" #include "rcondv.h" @@ -17,13 +19,19 @@ /////////////////////////////////////////////////////////////////////////////// class TAggiorna_listini_edit_mask : public TAutomask { - TMask* _query_mask; //puntatore alla maschera di query + TMask* _query_mask; //puntatore alla maschera di query + TString8 _curr_grmerc; //iniziale grmerc-sotgrmerc protected: - void fill_children_list(); - void fill_ricarichi_children_list(); - void save_children_list(); - void fill_aggiorna_sheet(); + void fill_children_list(); //riempie lo sheet dei listini figli (costruttore) + void fill_ricarichi_children_list(); //aggiunge il ricarico nello sheet dei listini figli (on_field) + void save_children_list(); //salva i ricarichi (modificabili) dello sheet dei figli (on_field) + + void set_header_multilistini_sheet(); //compila le intestazioni delle colonne dello sheet multilistino (costruttore) + void fill_multilistini_sheet(); //riempie lo sheet multilistino (on_field) + void update_sons_prices(); //aggiorna i prezzi dei listini figli (on_field) + int find_codart(TSheet_field& sf, const TString& codart, const TString& um); //cerca l'articolo nello sheet (on_field) + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: @@ -34,9 +42,8 @@ public: //metodo per riempire lo sheet dei listini figli con i ricarichi oggi tanto di moda void TAggiorna_listini_edit_mask::fill_ricarichi_children_list() { - TString8 grmerc; - grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC)); - const TRectype& rec_gmc = cache().get("GMC", grmerc); + _curr_grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC)); + const TRectype& rec_gmc = cache().get("GMC", _curr_grmerc); TToken_string lista_listini(rec_gmc.get("S1"), ';'); //se trova qualcosa nella lista listini collegati al grmerc... if (lista_listini.full()) @@ -158,6 +165,118 @@ void TAggiorna_listini_edit_mask::save_children_list() } //if(grmerc.full()) } +//restituisce la posizione della riga ALTA, quella disabilitata +int TAggiorna_listini_edit_mask::find_codart(TSheet_field& sf, const TString& codart, const TString& um) +{ + //cerca la riga tra quelle esistenti + for (int i = 1; i < sf.items(); i += 2) + { + const char* cod = sf.cell(i, 0); + if (codart == cod) + return i - 1; + } + //non trova la riga nel padre -> la aggiunge + TToken_string& row_alta = sf.row(-1); + sf.disable_cell(sf.items()-1, -1); + const TString& descr = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR); + row_alta.add(descr); + row_alta.add(um); + + TToken_string& row_bassa = sf.row(-1); + row_bassa.add(codart); + + return sf.items() - 2; //ritorna la penultima riga (riga alta) +} + + +//riempie lo sheet dei multilistini +void TAggiorna_listini_edit_mask::fill_multilistini_sheet() +{ + //popola il double-deck sheet + //cerca tutte le righe che appartengono a pedre e figli; se una riga appartiene ad un figlio e non al padre.. + //..viene aggiunta al padre medesimo (i padri devono sapere tutto dei figli, sennò che genitori sono?) + //se invece la riga appartiene al padre e non a uno o più figli questi ultimi saranno lasciati nella.. + //..loro ignoranza di tale riga (un padre qualche vantaggio dovrà pur averlo, no?) + TString query; + query << "USE RCONDV\n"; + query << "SELECT (TIPORIGA=\"A\")&&((CATVEN=#FATHCATVEN)&&(COD=#FATHCOD))"; + //giro su tutti i figli nello sheet dei figli + TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI); + TToken_string keys_figli(140, ';'); + FOR_EACH_SHEET_ROW(sf_figli, r, riga) + { + TToken_string key; + key.add(riga->get(0)); + key.add(riga->get(1)); + key.trim(); + keys_figli.add(key); + //prosegue la select + query << "||((CATVEN=\"" << key.get(0) << "\")&&(COD=\"" << key.get(1) << "\"))"; + } + query << "\n"; + + query << "FROM TIPO=L\n"; + query << "TO TIPO=L\n"; + + TISAM_recordset recset_rows(query); + recset_rows.set_var("#FATHCATVEN", get(F_FATHCATVEN)); + recset_rows.set_var("#FATHCOD", get(F_FATHCODLIS)); + const long recset_rows_items = recset_rows.items(); + TProgind pi(recset_rows_items, TR("Creazione righe listini..."), true, true); + + TSheet_field& sf_multilistini = sfield(F_MULTILISTINI); + + //per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga) + for (bool ok = recset_rows.move_first(); ok; ok = recset_rows.move_next()) + { + if (!pi.addstatus(1)) + break; + //dati riga corrente + const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string(); + const TString& um = recset_rows.get(RCONDV_UM).as_string(); + const real prezzo = recset_rows.get(RCONDV_PREZZO).as_real(); + //cerca se esiste o se deve aggiungerla: la find_codart 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_codart(sf_multilistini, codart, um); + + TToken_string riga_key; + riga_key.add(recset_rows.get(RCONDV_CATVEN).as_string()); + riga_key.add(recset_rows.get(RCONDV_COD).as_string()); + riga_key.trim(); + //mette il prezzo al posto giusto (padre e figlio) + const int pos = keys_figli.get_pos(riga_key); + if (pos < 0) + sf_multilistini.row(riga_alta + 1).add(prezzo.string(), 1); + else + sf_multilistini.row(riga_alta).add(prezzo.string(), 2 + pos); + } + + //aggiorna i prezzi nuovi dei listini figli + update_sons_prices(); + +} + +//aggiorna i prezzi dei listini figli +void TAggiorna_listini_edit_mask::update_sons_prices() +{ + //per ogni articolo, per ogni listino figlio prende il ricarico nello sheet dei figli e lo moltiplica per il prezzo del padre + //PrezzoNuovoFiglio = Ricaricofiglio * PrezzoPadre (questo vale per ogni articolo) + TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI); + TSheet_field& sf_listini = sfield(F_MULTILISTINI); + + FOR_EACH_SHEET_ROW(sf_figli, r, riga_figlio) + { + const real ricarico = riga_figlio->get(2); + FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (i & 1) //è come dire mod(i,2)=1 (ignoranti!) + { + const real fath_prezzo = riga->get(1); + const TPrice son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO; + riga->add(son_prezzo.get_num().string(), r + 2); + } + } + sf_listini.force_update(); +} + bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { @@ -168,7 +287,13 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even //una volta selezionati grmerc/sotgrmerc riempie la colonna ricarico dello sheet if (e == fe_modify) { - fill_ricarichi_children_list(); + TString8 grmerc; + grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC)); + if (grmerc != _curr_grmerc) + { + fill_ricarichi_children_list(); + fill_multilistini_sheet(); + } } break; @@ -176,6 +301,7 @@ 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(); } break; @@ -225,7 +351,7 @@ void TAggiorna_listini_edit_mask::fill_children_list() } //metodo per riempire lo sheet con i dati da aggiornare -void TAggiorna_listini_edit_mask::fill_aggiorna_sheet() +void TAggiorna_listini_edit_mask::set_header_multilistini_sheet() { //rinomina le colonne dello sheet di aggiornamento come il listino che rappresentano (fighissimo!).. //..secondo la solita catven+codlis; fa sparire le colonne che non servono. Ricordiamo infatti che.. @@ -248,8 +374,6 @@ void TAggiorna_listini_edit_mask::fill_aggiorna_sheet() //cancella i figli in eccesso for( ;sf_multilistini.exist_column(num_of_columns); num_of_columns++) sf_multilistini.delete_column(num_of_columns); - - //popola il double-deck sheet } @@ -264,8 +388,8 @@ TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask) //popola lo sheet dei listini figli fill_children_list(); - //e poi riempie lo sheet di aggiornamento dei figli - fill_aggiorna_sheet(); + //e poi setta le intestazioni dello sheet multilistini + set_header_multilistini_sheet(); } diff --git a/ve/ve2700b.uml b/ve/ve2700b.uml index bbf2460c6..5dfe54e26 100755 --- a/ve/ve2700b.uml +++ b/ve/ve2700b.uml @@ -23,7 +23,7 @@ END BUTTON DLG_APPLICA 2 2 BEGIN PROMPT 4 1 "~Applica" - PICTURE TOOL_CONVERT + PICTURE TOOL_ELABORA END BUTTON DLG_ADDART 2 2 @@ -124,7 +124,7 @@ BEGIN PROMPT 0 3 "Listini figli" ITEM "Cat.Ven." ITEM "Codice" - ITEM "Ricarico@8" + ITEM "Ricarico" ITEM "Descrizione@50" END @@ -132,7 +132,7 @@ SPREADSHEET F_MULTILISTINI -1 -1 BEGIN PROMPT 0 8 "Aggiornamento figli" ITEM "Descrizione\nArticolo@30" - ITEM "U. M. \nPrezzo base@8" + ITEM "U. M. \nPrezzo base@8R" ITEM "Figlio 1@8" ITEM "Figlio 2@8" ITEM "Figlio 3@8" @@ -190,7 +190,7 @@ BEGIN FLAGS "U" END -STRING F_RICARICO 5 +NUMBER F_RICARICO 4 BEGIN PROMPT 1 3 "Ricarico " END @@ -232,11 +232,13 @@ PAGE "Riga aggiornamento listini" -1 -1 78 22 STRING F_CODRIGA 50 20 BEGIN PROMPT 1 1 "Codice " + FLAGS "D" END STRING F_PREZZO 8 BEGIN PROMPT 1 2 "Prezzo " + FLAGS "R" END CURRENCY F_LIST1 8 diff --git a/ve/vetbgmc.uml b/ve/vetbgmc.uml index aa43b3016..cc39c73fe 100755 --- a/ve/vetbgmc.uml +++ b/ve/vetbgmc.uml @@ -45,7 +45,6 @@ BEGIN OUTPUT F_DESSGR S0 MESSAGE SHOW,F_DESGRU|HIDE,H_DESGRU|SHOW,F_DESSGR MESSAGE EMPTY HIDE,F_DESGRU|SHOW,H_DESGRU|HIDE,F_DESSGR - //VALIDATE AUTOEXIT_FUNC 2 F_CODGRU F_CODSGR STR_EXPR (#H_CODGRU?="*")||(#F_CODSGR=="") GROUP GR_SEARCH WARNING "Gruppo merceologico non corretto" @@ -335,7 +334,7 @@ BEGIN FLAGS "D" END -STRING S_RICARICO 5 +NUMBER S_RICARICO 4 BEGIN PROMPT 1 3 "Ricarico " CHECKTYPE REQUIRED