#include #include #include #include #include #include #include "condv.h" #include "rcondv.h" #include "ve2.h" #include "ve2700.h" /////////////////////////////////////////////////////////////////////////////// // MASCHERA DI EDIT (aggiorna i listini figghi 'u patre!) /////////////////////////////////////////////////////////////////////////////// class TAggiorna_listini_edit_mask : public TAutomask { TMask* _query_mask; //puntatore alla maschera di query protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TAggiorna_listini_edit_mask(TMask* query_mask); void aggiorna_listini_figli(); }; bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch(o.dlg()) { case F_GRMERC: case F_SOTGRMERC: //una volta selezionati grmerc/sotgrmerc riempie la colonna ricarico dello sheet if (e == fe_modify) { TString8 grmerc; grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC)); const TRectype& rec_gmc = cache().get("GMC", grmerc); TToken_string lista_listini(rec_gmc.get("S1"), ';'); //se trova qualcosa nella lista listini collegati al grmerc... if (lista_listini.full()) { lista_listini.trim(); //se la lista di listini riempie il campo S1, magari continua in S2... if (lista_listini.len() == 70) { lista_listini.add(rec_gmc.get("S2")); lista_listini.trim(); } //cerca se i listini trovati in GMC ci sono anche nello sheet dei figli TSheet_field& sf_righe = sfield(F_LISTINI_FIGLI); const int righe_sheet = sf_righe.items(); FOR_EACH_STR_TOKEN(lista_listini, str) { //controlla se il listino in grmerc (chiave) esiste in una delle righe dello sheet dei figli TToken_string chiave = lista_listini.get(); TString4 catven = chiave.get(0); catven.trim(); TString4 codlis = chiave.get(1); codlis.trim(); for (int i = 0; i < righe_sheet; i++) { TToken_string& row = sf_righe.row(i); TString4 sh_catven = row.get(0); sh_catven.trim(); TString4 sh_codlis = row.get(1); sh_codlis.trim(); //se incredibilmente trova il listino di grmerc tra i figli prigionieri nello sheet setta il ricarico if (catven == sh_catven && codlis == sh_codlis) row.add(chiave.get(2), 2); } //for(int i... } //FOR_EACH_STR_TOKEN sf_righe.force_update(); } //if(lista_listini.full... } break; default: break; } return true; } TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask) : TAutomask("ve2700b"), _query_mask(query_mask) { //aggiorna campi listino padre set(F_FATHCATVEN, _query_mask->get(F_FATHCATVEN)); set(F_FATHDESVEN, _query_mask->get(F_FATHDESVEN)); set(F_FATHCODLIS, _query_mask->get(F_FATHCODLIS)); set(F_FATHDESLIS, _query_mask->get(F_FATHDESLIS)); //disabilita se necessario la colonna della categoria di vendita (lo sheet serve comunque dopo!) TSheet_field& sf_righe = sfield(F_LISTINI_FIGLI); sf_righe.destroy(); sf_righe.enable_column(F_CATVEN, ini_get_bool(CONFIG_DITTA, "ve", "GESLISCV")); //aggiorna sheet con i listini figli TString query; query << "USE CONDV\n"; query << "SELECT (FATHCATVEN=#FATHCATVEN)&&(FATHCOD=#FATHCOD)\n"; query << "FROM TIPO=L\n"; query << "TO TIPO=L\n"; TISAM_recordset recset_figli(query); recset_figli.set_var("#FATHCATVEN", get(F_FATHCATVEN)); recset_figli.set_var("#FATHCOD", get(F_FATHCODLIS)); const int recset_figli_items = recset_figli.items(); const TRectype& rec = recset_figli.cursor()->curr(); //per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga) for (bool ok = recset_figli.move_first(); ok; ok = recset_figli.move_next()) { TToken_string& row = sf_righe.row(-1); //riga sheet da riempire const TString& catven = rec.get(CONDV_CATVEN); const TString& codlis = rec.get(CONDV_COD); const TString& deslis = rec.get(CONDV_DESCR); row.add(catven); row.add(codlis); row.add(""); row.add(deslis); sf_righe.check_row(sf_righe.items()-1, 3); } sf_righe.force_update(); } void TAggiorna_listini_edit_mask::aggiorna_listini_figli() { } /////////////////////////////////////////////////////////////////////////////// // MASCHERA DI QUERY (seleziona il listino padre tra i listini con paternità) /////////////////////////////////////////////////////////////////////////////// class TAggiorna_listini_query_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TAggiorna_listini_query_mask(); }; bool TAggiorna_listini_query_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch(o.dlg()) { case F_FATHCODLIS: if (e == fe_button) { TString query; query << "USE CONDV\n"; query << "SELECT (FATHCOD!='')&&(BETWEEN(FATHCATVEN,#CATVEN,#CATVEN))\n"; query << "FROM TIPO=L\n"; query << "TO TIPO=L\n"; //ottiene tutti i listini che hanno un padre TISAM_recordset listini_figli(query); listini_figli.set_var("#CATVEN", get(F_FATHCATVEN)); const int listini_figli_items = listini_figli.items(); //adesso deve crearsi la lista dei padri TAssoc_array listini_padri; for (bool ok = listini_figli.move_first(); ok; ok = listini_figli.move_next()) { //quale è il padre del figlio? TToken_string key; key.add(listini_figli.get(CONDV_FATHCATVEN).as_string(), 0); key.add(listini_figli.get(CONDV_FATHCOD).as_string(), 1); //se non esiste già nella lista dei padri deve essere aggiunto! if (!listini_padri.is_key(key)) { //necessita della descrizione del padre TToken_string chiave; chiave.add("L"); chiave.add(key.get(0)); chiave.add(""); chiave.add(""); chiave.add(key.get(1)); const TString& descr_padre = cache().get(LF_CONDV, chiave, CONDV_DESCR); listini_padri.add(key, descr_padre); } } //for(bool ok =... //utilizzando l'assoc_array dei padri propone uno sheet di ricerca dei soli listini che hanno paternità //maschera volante di ricerca (è una display) TArray_sheet sheet(-1, -1, 78, 10, TR("Listini padri"), HR("Cat.Ven.|Codice|Descrizione@50")); //riempimento dello sheet FOR_EACH_ASSOC_STRING(listini_padri, obj, key, descr) { TToken_string row; row = key; row.add(descr); sheet.add(row); } sheet.rows_array().sort(); //riordina le righe attualmente scombinate if (sheet.run() == K_ENTER) { //riempie la maschera di query TToken_string& row = sheet.row(-1); set(F_FATHCATVEN, row.get(0), true); set(F_FATHCODLIS, row.get(1)); set(F_FATHDESLIS, row.get(2)); //lancia la maschera di edit TAggiorna_listini_edit_mask edit_mask(this); //gli passa la maschera principale if (edit_mask.run() == K_ENTER) edit_mask.aggiorna_listini_figli(); } } break; default: break; } return true; } TAggiorna_listini_query_mask::TAggiorna_listini_query_mask() : TAutomask("ve2700a") { //in base alla cervellotica configurazione impostata dall'utonto abilita/disabilita campi const bool gesliscv = ini_get_bool(CONFIG_DITTA, "ve", "GESLISCV"); enable(F_FATHCATVEN, gesliscv); enable(F_FATHDESVEN, gesliscv); //attenzione!!! il campo CATVEN è in chiave 1! per disabilitarlo ci vuole questo trucco! if (!gesliscv) efield(F_FATHCATVEN).reset_key(1); } //////////////////////////////////////////////////////// // APPLICAZIONE //////////////////////////////////////////////////////// class TAggiorna_listini : public TSkeleton_application { public: virtual void main_loop(); }; void TAggiorna_listini::main_loop() { TAggiorna_listini_query_mask mask; while (mask.run() == K_ENTER) { } } int ve2700(int argc, char* argv[]) { TAggiorna_listini a; a.run(argc, argv, TR("Aggiornamneto listini multiplo")); return 0; }