#include #include #include #include #include #include #include #include "ci0.h" #include "cilib.h" #include "ci0500a.h" #include "../ve/velib.h" //////////////////////////////////////// //// CLASSE TDISP_RISOATT_MSK //// //////////////////////////////////////// //Classe TDisp_risoatt_msk class TDisp_risoatt_msk : public TAutomask { int _preventivo; int _consuntivo; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void riempi_sheet(); void nuova_riga(); void azzera_riga(TSheet_field& sheet); void azzera_tutto(TSheet_field& sheet); void registra(); public: void esegui() const; TDisp_risoatt_msk(); }; //RIEMPI_SHEET: metodo che riempie lo sheet in base ai campi chiave //compilati sulla maschera void TDisp_risoatt_msk::riempi_sheet() { //l'anno è l'unico campo obbligatorio const TString4 anno = get(F_ANNO); //guardo il tipo risorsa / attrezzatura che sto ricercando (se Tutti setto a '?') char risoatt; if(get(F_RISOATT)[0] == 'T') risoatt = '?'; else risoatt = get(F_RISOATT)[0]; //leggo il codice corretto a seconda del tipo selezionato (se vuoto setto a 16 caratteri '?') TString16 codice; switch(get(F_RISOATT)[0]) { case 'T': if (get(F_CODICE).empty()) codice.fill('?', 16); else { codice = get(F_CODICE); codice.left_just(16); } break; case 'R': if (get(F_CODRIS).empty()) codice.fill('?', 16); else { codice = get(F_CODRIS); codice.left_just(16); } break; case 'A': if (get(F_CODATT).empty()) codice.fill('?', 16); else { codice = get(F_CODATT); codice.left_just(16); } break; default: break; } //leggo il mese (se vuoto setto a '??') TString4 mese; if (get(F_MESE).empty()) mese.fill('?', 2); else mese = get(F_MESE); //leggo il tipo ora (se vuoto setto a '??') TString4 tpora; if (get(F_TPORA).empty()) tpora.fill('?', 2); else tpora = get(F_TPORA); //preparo il filtro della query TString filtro; filtro << risoatt << codice << anno << mese << tpora; TString query; query << "USE &DRA\n" << "SELECT CODTAB?=\"" << filtro << "\""; if(risoatt != '?') { query << "\n" << "FROM CODTAB=" << risoatt << "\n" << "TO CODTAB=" << risoatt << "\n"; } TISAM_recordset dra(query); TSheet_field& sheet = sfield(F_SHEET); sheet.destroy(); //riempio lo sheet con i dati che soddisfano il filtro preparato prima for(bool ok = dra.move_first(); ok; ok = dra.move_next()) { TDisp_risoatt disp(dra.cursor()->curr()); TRisoatt_key drakey(disp.chiave()); TToken_string& riga = sheet.row(-1); riga.add(drakey.tipo(), sheet.cid2index(S_RISOATT)); TString16 cod = drakey.cod(); cod.trim(); switch(drakey.tipo()) { case 'A': riga.add(cod, sheet.cid2index(S_CODATT)); break; case 'R': riga.add(cod, sheet.cid2index(S_CODRIS)); break; default : break; } riga.add(drakey.anno(), sheet.cid2index(S_ANNO)); riga.add(drakey.mese(), sheet.cid2index(S_MESE)); riga.add(drakey.tpora(), sheet.cid2index(S_TPORA)); riga.add(disp.ore_prev(), sheet.cid2index(S_OREPREV)); riga.add(disp.ore_cons(), sheet.cid2index(S_ORECONS)); sheet.check_row(sheet.items() - 1); } sheet.force_update(); } //NUOVA_RIGA: metodo che aggiunge una riga allo sheet //tenendo conto dei campi chiave compilati in testata void TDisp_risoatt_msk::nuova_riga() { TSheet_field& sheet = sfield(F_SHEET); sheet.row(-1); sheet.select(sheet.items() - 1); TMask& msk = sheet.sheet_mask(); //guardo il tipo risorsa / attrezzatura che sto ricercando const char risoatt = get(F_RISOATT)[0] == 'T' ? 'R' : get(F_RISOATT)[0]; TString4 tmp; tmp << risoatt; msk.set(S_RISOATT, tmp); msk.enable(S_RISOATT, get(F_RISOATT)[0] == 'T'); //leggo il codice corretto a seconda del tipo selezionato switch(get(F_RISOATT)[0]) { case 'T': msk.reset(S_CODRIS); msk.enable(S_CODRIS); msk.reset(S_CODATT); msk.enable(S_CODATT); break; case 'R': msk.set(S_CODRIS, get(F_CODRIS)); msk.enable(S_CODRIS); break; case 'A': msk.set(S_CODATT, get(F_CODATT)); msk.enable(S_CODATT); break; default: break; } msk.enable(S_ANNO, get(F_ANNO).empty()); msk.set(S_ANNO, get(F_ANNO)); msk.enable(S_MESE, get(F_MESE).empty()); msk.set(S_MESE, get(F_MESE)); msk.enable(S_TPORA, get(F_TPORA).empty()); msk.set(S_TPORA, get(F_TPORA)); msk.set(S_OREPREV, 0L); msk.set(S_ORECONS, 0L); //lancio la maschera di riga da compilare if(msk.run() == K_ENTER) { const int oreprev = msk.get_int(S_OREPREV); const int orecons = msk.get_int(S_ORECONS); if(oreprev > 0 && orecons > 0) { const char tipo = msk.get(S_RISOATT)[0]; const TString& codice = tipo == 'R' ? msk.get(S_CODRIS) : msk.get(S_CODATT); const TString& mese = msk.get(S_MESE); const TString& tpora = msk.get(S_TPORA); TToken_string& riga = sheet.row(sheet.items() - 1); riga.add(tipo, sheet.cid2index(S_RISOATT)); switch(tipo) { case 'R': riga.add(codice, sheet.cid2index(S_CODRIS)); break; case 'A': riga.add(codice, sheet.cid2index(S_CODATT)); break; default : break; } riga.add(get_int(F_ANNO), sheet.cid2index(S_ANNO)); riga.add(mese, sheet.cid2index(S_MESE)); riga.add(tpora, sheet.cid2index(S_TPORA)); riga.add(oreprev, sheet.cid2index(S_OREPREV)); riga.add(orecons, sheet.cid2index(S_ORECONS)); } else { sheet.destroy(sheet.items() - 1); sheet.force_update(); } } msk.enable_default(); sheet.check_row(sheet.items() - 1); sheet.force_update(); } //AZZERA_RIGA: metodo che azzera il valore unitario della riga selezionata //(N.B.: le righe con valore unitario nullo verranno eliminate in fase di registrazione) void TDisp_risoatt_msk::azzera_riga(TSheet_field& sheet) { const int nriga = sheet.selected(); TToken_string& row = sheet.row(nriga); row.add(0, sheet.cid2index(S_OREPREV)); row.add(0, sheet.cid2index(S_ORECONS)); TMask& msk = sheet.sheet_mask(); _preventivo = msk.get_int(S_OREPREV); _consuntivo = msk.get_int(S_ORECONS); msk.set(S_OREPREV, 0L); msk.set(S_ORECONS, 0L); } //AZZERA_TUTTO: metodo che azzera il valore unitario di tutte le righe visualizzate sullo sheet //(N.B.: le righe con valore unitario nullo verranno eliminate in fase di registrazione) void TDisp_risoatt_msk::azzera_tutto(TSheet_field& sheet) { FOR_EACH_SHEET_ROW(sheet, r, row) { TToken_string& row = sheet.row(r); row.add(0, sheet.cid2index(S_OREPREV)); row.add(0, sheet.cid2index(S_ORECONS)); } } //REGISTRA: metodo che salva nella tabella di modulo le //righe dello sheet che hanno valore > 0, ed elimina quelle che hanno //vaoler pari a zero, e poi ricarica lo sheet void TDisp_risoatt_msk::registra() { TLocalisamfile tabmod(LF_TABMOD); TModule_table tab("&DRA"); const int anno = get_int(F_ANNO); TSheet_field& sheet = sfield(F_SHEET); FOR_EACH_SHEET_ROW(sheet, r, row) { TToken_string& riga = *(TToken_string*)row; const char tipo = riga.get_char(sheet.cid2index(S_RISOATT)); const TString16 codice = tipo == 'R' ? riga.get(sheet.cid2index(S_CODRIS)) : riga.get(sheet.cid2index(S_CODATT)); const TString4 mese = riga.get(sheet.cid2index(S_MESE)); const TString4 tpora = riga.get(sheet.cid2index(S_TPORA)); const int oreprev = riga.get_int(sheet.cid2index(S_OREPREV)); const int orecons = riga.get_int(sheet.cid2index(S_ORECONS)); const TString80 descr = tipo == 'R' ? riga.get(sheet.cid2index(S_DESRIS)) : riga.get(sheet.cid2index(S_DESATT)); TString16 cod = codice; cod.left_just(16); TString80 chiave; chiave << tipo << cod << anno << mese << tpora; tab.put("CODTAB", chiave); int err = tab.read(); if(err == NOERR) { if(oreprev == 0 && orecons == 0) tab.remove(); else { tab.put("I0", oreprev); tab.put("I1", orecons); tab.rewrite(); } } else { tab.put("CODTAB", chiave); tab.put("S0", descr); tab.put("I0", oreprev); tab.put("I1", orecons); tab.write(); } } tab.rewrite_write(); riempi_sheet(); } //ON_FIELD_EVENT: metodo che gestisce gli eventi sui vari campi della maschera bool TDisp_risoatt_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) { switch (f.dlg()) { case DLG_NEWREC: if (e == fe_button) { nuova_riga(); return false; } case DLG_SAVEREC: if (e == fe_button) { registra(); return false; } break; case DLG_RESET: if(e == fe_button) { TSheet_field& sheet = sfield(F_SHEET); switch(jolly) { case 0: azzera_tutto(sheet); break; case 1: azzera_riga(sheet); break; default: break; } sheet.force_update(); return false; } break; case DLG_CANCEL: if(e == fe_button && jolly == 1) { TSheet_field& sheet = sfield(F_SHEET); TMask& msk = sheet.sheet_mask(); const int oreprev = msk.get_int(S_OREPREV); const int orecons = msk.get_int(S_ORECONS); if(sheet.selected() == sheet.items() - 1) { sheet.destroy(sheet.items() - 1); sheet.force_update(); } else if(_preventivo > 0 && _consuntivo > 0) { TToken_string& row = sheet.row(sheet.selected()); row.add(_preventivo, sheet.cid2index(S_OREPREV)); row.add(_consuntivo, sheet.cid2index(S_ORECONS)); _preventivo = 0; _consuntivo = 0; } } break; case F_ANNO: case F_MESE: case F_RISOATT: case F_CODICE: case F_CODRIS: case F_CODATT: case F_TPORA: if (e == fe_init || e == fe_modify) riempi_sheet(); break; case F_SHEET: if (e == se_query_add) { send_key(K_SPACE, DLG_NEWREC); return false; } default: break; } return true; } void TDisp_risoatt_msk::esegui() const { } TDisp_risoatt_msk::TDisp_risoatt_msk() : TAutomask("ci0500a") { _preventivo = 0; _consuntivo = 0; } //////////////////////////////////////// //// CLASSE TDisp_risoatt_APP //// //////////////////////////////////////// //classe TDisp_risoatt_app class TDisp_risoatt_app : public TSkeleton_application { public: virtual void main_loop(); }; void TDisp_risoatt_app::main_loop() { TDisp_risoatt_msk msk; while (msk.run() != K_QUIT) msk.esegui(); } int ci0500(int argc, char *argv[]) { TDisp_risoatt_app a; a.run (argc, argv, TR("Gestione Disponibilità Risorse / Attrezzature")); return TRUE; }