#include #include #include #include "lvlib.h" #include "lvpasplan.h" #include "lvperisop.h" #include "lv0500a.h" //////////////// // MASCHERA // //////////////// class TPass_plan_contr_mask : public TAutomask { private: void proponi_orario(); void sistema_data(TOperable_field& o); protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TPass_plan_contr_mask(); }; void TPass_plan_contr_mask::proponi_orario() { TSheet_field& sheet = sfield(F_PASPLAN); TToken_string& rigamodificata = sheet.row(sheet.items()-1); rigamodificata.add("00:00",sheet.cid2index(F_S_ORA)); } //SISTEMA_DATA: metodo che aggiunge un separatore tra giorno e mese quando necessario void TPass_plan_contr_mask::sistema_data(TOperable_field& o) { TString8 data = o.get(); if (data.len() < 5) { data.insert("-", 2); o.set(data); } } bool TPass_plan_contr_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_ORDGIRI: if (e == fe_init) { const int ordinaper = ini_get_int(CONFIG_DITTA, "lv", "Ordgir"); o.set(ordinaper); } break; case F_PASPLAN: switch (e) { case se_notify_add: proponi_orario(); break; default: break; } break; case F_S_DASTAG: case F_S_ASTAG: if (e == fe_modify) sistema_data(o); break; default: break; } return true; } TPass_plan_contr_mask::TPass_plan_contr_mask() :TAutomask("lv0500a") {} //////////////////// // Applicazione // //////////////////// class TPass_plan_contr : public TRelation_application { TPass_plan_contr_mask* _mask; TRelation* _rel; long _codcli; long _codcont; private: void genera_giri(const long codli); //richiama la generazione giri in automatico void kill_duplicates(const TMask& m); //uccide i duplicati e le righe vuote sullo sheet protected: virtual void init_query_mode(TMask& m); virtual bool user_create(); virtual bool user_destroy(); virtual int read(TMask& m); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); virtual bool remove(); virtual TMask* get_mask(int mode) { return _mask; } virtual bool changing_mask(int mode) { return false; } public: virtual TRelation* get_relation() const {return (TRelation*)_rel;} }; /////////////////////////////////////////// //// FUNZIONI PER READ //// /////////////////////////////////////////// //READ: ridefinizione metodo read() delle TRelation int TPass_plan_contr::read(TMask& m) { //riempio gli sheet const int err = TRelation_application::read(m); if (err == NOERR) { TSheet_field& pc = m.sfield(F_PASPLAN); if (pc.empty()) { //questo ciclo crea le sette righe vuote const char* const ora = "00:00"; for (int i = 1; i<=7; ++i) { TToken_string& row = pc.row(-1); //crea una nuova riga dello sheet row.add(i,pc.cid2index(F_S_GGCONS)); //aggiunge al posto giusto il numero del giorno della settimana row.add(ora,pc.cid2index(F_S_ORA)); //propone l'ora di arrivo in automatico pc.check_row(pc.items()-1); //forza la maschera a fare la decodifica dei codici } pc.force_update(); //forza l'update dello sheet, in modo da rendere visibili i cambiamenti fatti } } return err; } /////////////////////////////////////////// //// FUNZIONI PER WRITE E REWRITE //// /////////////////////////////////////////// //GENERA_GIRI: questa funzione richiama la generazione giri in automatico... //..se questa possibilità è prevista in configurazione void TPass_plan_contr::genera_giri(const long codcli) { //la scrittura automatica dei giri viene fatta solo se è settato l'apposito flag... //...nella configurazione di modulo if (ini_get_bool(CONFIG_DITTA, "lv", "Autgiri")) { //richiamo il programma lv2100.cpp per generare i giri in autmatico dalla data odierna... //...alla data dell'ultimo giro già generato TFilename fname; fname.tempdir(); fname.add("autogiri.ini"); TConfig ini(fname,"main"); ini.set("transaction", "update"); ini.set_paragraph("167"); ini.set("CODCF", codcli); ini.set_paragraph("main"); TString str; str << "lv2 -0 -i" << fname; TExternal_app app(str); app.run(); fname.fremove(); } } //KILL_DUPLICATES: questa funzione elimina dallo sheet tutte le righe che non contengono dati di interesse... //...e/o le righe duplicate sullo sheet void TPass_plan_contr::kill_duplicates(const TMask& m) { TSheet_field& pc = m.sfield(F_PASPLAN); //ciclo che elimina le righe che non contengono dati di interesse dallo sheet FOR_EACH_SHEET_ROW_BACK (pc, r, row) if (row->get_int(2) == 0) pc.destroy(r, false); //ciclo che elimina tutti i duplicati dallo sheet FOR_EACH_SHEET_ROW_BACK (pc, r1, row1) if (pc.rows_array().find(*row1) < r1) pc.destroy(r1,false); } //WRITE: ridefinizione metodo write delle TRelation int TPass_plan_contr::write(const TMask& m) { if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty()) return _isnocurkey; kill_duplicates(m); const int err = TRelation_application::write(m); TSheet_field& pc = m.sfield(F_PASPLAN); if (err == NOERR && pc.items() > 0) { const long codcli = _mask->get_long(F_CODCF); genera_giri(codcli); } return err; } //ridefinizione metodo rewrite delle TRelation int TPass_plan_contr::rewrite(const TMask& m) { if (_mask->field(F_CODCF).empty() || _mask->field(F_CODCONT).empty()) return _isnocurkey; kill_duplicates(m); const int err = TRelation_application::rewrite(m); TSheet_field& pc = m.sfield(F_PASPLAN); if (err == NOERR && pc.items() > 0) { const long codcli = _mask->get_long(F_CODCF); genera_giri(codcli); } return err; } /////////////////////////////////////////// //// FUNZIONI PER REMOVE //// /////////////////////////////////////////// //REMOVE: ridefinizione del metodo remove delle TRelation bool TPass_plan_contr::remove() { TSheet_field& ps = _mask->sfield(F_PERSOSP); ps.autosave(*_rel); ps.record()->remove(); TSheet_field& pc = _mask->sfield(F_PASPLAN); pc.autosave(*_rel); pc.record()->remove(); return true; } /////////////////////////////////////////// //// METODI PRIVATI //// /////////////////////////////////////////// //questa funzione forza i campi F_CODCF e F_CODCONT quando... //...vengono passati come parametri al programma void TPass_plan_contr::init_query_mode(TMask& m) { if (_codcli > 0) { m.set(F_CODCF,_codcli); m.set(F_CODCONT,_codcont,0x2); if (find(0)) modify_mode(); } } //costruttore bool TPass_plan_contr::user_create() { _rel = new TRelation(LF_LVCONDV); _mask = new TPass_plan_contr_mask; //se gli sono stati passati più parametri, allora setto le variabili globali _codcli e _codcont... //...con i parametri desiderati, se no li setto a zero if (argc() > 2) { _codcli = atol(argv(2)); _codcont = atol(argv(3)); } else { _codcli = 0; _codcont = 0; } return true; } //distruttore bool TPass_plan_contr::user_destroy() { delete _mask; return true; } int lv0500(int argc, char* argv[]) { TPass_plan_contr a; a.run(argc, argv, TR("Archivi Lavanderie")); return 0; }