#include #include #include #include #include #include #include #include #include "ci2.h" #include "cilib.h" #include "ci2200a.h" #include "../ve/velib.h" //////////////////////////////////////////// //// CLASSE TRilevamento_cons_msk //// //////////////////////////////////////////// //Classe TRilevamento_cons_msk class TRilevamento_cons_msk : public TAutomask { int _qtaore; char _mode; TDate _datasel; int _rigasel; protected: const real proponi_costo(TToken_string& riga); void carica_default(); void riempi_sheet(); void riempi_calendario(TISAM_recordset& def); void riempi_risoatt(TDate& data, const char* codcosto, const char* codcms, const char* codfase); void azzera_tutto(); void registra(); virtual void notify_focus_field(short id); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: void esegui() const; TRilevamento_cons_msk(); }; const real TRilevamento_cons_msk::proponi_costo(TToken_string& riga) { real costo = ZERO; TSheet_field& sheet = sfield(F_SHEET); const char tipo = riga.get_char(sheet.cid2index(S_RISOATT)); TString80 codice; switch(tipo) { case 'R': codice = riga.get(sheet.cid2index(S_CODRIS)); break; case 'A': codice = riga.get(sheet.cid2index(S_CODATT)); break; default : break; } const int anno = get_int(F_ANNO); const TString4 mese = get(F_MESE); const TString4 tpora = riga.get(sheet.cid2index(S_TPORA)); const TRisoatt_key chiave(tipo, codice, anno, mese, tpora); TModule_table roa("&ROA"); roa.put("CODTAB", chiave); int err = roa.read(); if(err == NOERR) costo = roa.get_real("R1"); else { TString8 tmp; tmp << anno << mese; const long anme = atol(tmp); TString query; query << "USE &ROA\n" << "SELECT I0<" << anme << "\n" << "FROM CODTAB=" << tipo << codice.left_just(16) << "\n" << "TO CODTAB=" << tipo << codice.left_just(16) << "\n" << "BY I0\n"; TISAM_recordset rec(query); if(rec.move_last()) costo = rec.cursor()->curr().get_real("R1"); } return costo; } void TRilevamento_cons_msk::carica_default() { //leggo dalla maschera i campi chiave di ricerca const int anno = get_int(F_ANNO); const TString4 risoatt = get(F_RISOATT) == "T" ? "" : get(F_RISOATT); const TString4 mese = get(F_MESE); const TString4 tpora = get(F_TPORA); const TString80 codcosto = get(F_CODCOSTO); const TString80 codcms = get(F_CODCMS); const TString16 codfase = get(F_CODFASE); TString16 codice; switch(get(F_RISOATT)[0]) { case 'T': codice = get(F_CODICE); break; case 'R': codice = get(F_CODRIS); break; case 'A': codice = get(F_CODATT); break; default: break; } TString query; query << "USE RILORE\n" << "SELECT (BETWEEN(TIPORA,\"" << risoatt << "\",\"" << risoatt << "\"))&&" << "(BETWEEN(CODICE,\"" << codice << "\",\"" << codice << "\"))&&" << "(BETWEEN(ANNO," << anno << "," << anno << "))&&" << "(BETWEEN(MESE,\"" << mese << "\",\"" << mese << "\"))&&" << "(BETWEEN(TPORA,\"" << tpora << "\",\"" << tpora << "\"))&&" << "(BETWEEN(CODCOSTO,\"" << codcosto << "\",\"" << codcosto << "\"))&&" << "(BETWEEN(CODCMS,\"" << codcms << "\",\"" << codcms << "\"))&&" << "(BETWEEN(CODFASE,\"" << codfase << "\",\"" << codfase << "\"))\n"; TString fromto = "TIPO=\"D\""; if(risoatt != 'T') { fromto << " TIPORA=\"" << risoatt << "\""; if(codice.full()) { fromto << " CODICE=\"" << codice << "\""; if(anno > 0) { fromto << " ANNO=\"" << anno << "\""; if(mese.full()) { fromto << " MESE=\"" << mese << "\""; if(tpora.full()) fromto << " TPORA=\"" << tpora << "\""; } } } } TISAM_recordset def(query); riempi_calendario(def); } //RIEMPI_CALENDARIO: coloro le celle dello sheet calendario secondo le festività e i giorni occupati void TRilevamento_cons_msk::riempi_calendario(TISAM_recordset& def) { const int anno = get_int(F_ANNO); const int mese = atoi(get(F_MESE)); TSheet_field& calendario = sfield(F_CALENDARIO); calendario.destroy(); TSheet_field& sheet = sfield(F_SHEET); sheet.destroy(); //se non ho selezionato un mese valido, svuoto lo sheet e non faccio nient'altro if(mese == 0) return; //abilito per default tutte le colonne del calendario for(int i = 1; i <= 31; i++) { short cid = C_CODFASE; cid += i; calendario.enable_column(calendario.cid2index(cid)); } //disabilita tutte le colonne dal giorno successivo alla fine del mese in poi TDate date(1, mese, anno); date.set_end_month(); int giorno = date.day(); giorno++; for(giorno; giorno <= 31; giorno++) { short cid = C_CODFASE; cid += giorno; calendario.enable_column(calendario.cid2index(cid), false); } TAssoc_array commesse; int idriga = 0; //scorro il recordset, aggiungo una riga allo sheet per ogni chiave analitica che trovo e coloro di blu //tutte le celle che corrispondono a una data interessata da qualcosa for(bool ok = def.move_first(); ok; ok = def.move_next()) { TRilevamento_ore rilore(def.cursor()->curr()); TToken_string com; com.add(rilore.codcosto()); com.add(rilore.codcms()); com.add(rilore.codfase()); if(!commesse.is_key(com)) { TString4 tmp; tmp << idriga++; commesse.add(com, tmp); calendario.row(-1); } TDate data = rilore.dadata(); int cid = C_CODFASE; cid += data.day(); TToken_string& row = calendario.row(commesse.get_int(com)); row.add(rilore.codcosto(), calendario.cid2index(C_CODCOSTO)); row.add(rilore.codcms(), calendario.cid2index(C_CODCMS)); row.add(rilore.codfase(), calendario.cid2index(C_CODFASE)); if(_mode == 'F') { calendario.set_back_and_fore_color(COLOR_DKBLUE, COLOR_DKBLUE, commesse.get_int(com), calendario.cid2index(cid)); row.add('P', calendario.cid2index(cid)); } } //su ogni riga dello sheet coloro di rosso le festività FOR_EACH_SHEET_ROW(calendario, r, riga) { TToken_string& row = calendario.row(r); TDate mesesel(1, mese, anno); --mesesel; for(mesesel; ++mesesel; mesesel.is_end_month()) { if(mesesel.month() > mese) { calendario.force_update(); break; } short cid = C_CODFASE; cid += mesesel.day(); const TString4 cella = row.get(calendario.cid2index(cid)); if(cella.empty()) { if(mesesel.is_holiday()) calendario.set_back_and_fore_color(COLOR_DKRED, COLOR_DKRED, r, calendario.cid2index(cid)); } else row.add("", calendario.cid2index(cid)); } } } void TRilevamento_cons_msk::riempi_risoatt(TDate& data, const char* codcosto, const char* codcms, const char* codfase) { TSheet_field& sheet = sfield(F_SHEET); sheet.destroy(); //leggo dalla maschera i campi chiave di ricerca const int anno = get_int(F_ANNO); const TString4 risoatt = ""; const TString4 mese = get(F_MESE); const TString4 tpora = get(F_TPORA); //preparo la query TString query; if(_mode == 'F') query << "USE RILORE\n" << "SELECT (BETWEEN(TIPORA,\"" << risoatt << "\",\"" << risoatt << "\"))&&" << "(BETWEEN(ANNO," << anno << "," << anno << "))&&" << "(BETWEEN(MESE,\"" << mese << "\",\"" << mese << "\"))&&" << "(BETWEEN(TPORA,\"" << tpora << "\",\"" << tpora << "\"))&&" << "(BETWEEN(CODCOSTO,\"" << codcosto << "\",\"" << codcosto << "\"))&&" << "(BETWEEN(CODCMS,\"" << codcms << "\",\"" << codcms << "\"))&&" << "(BETWEEN(CODFASE,\"" << codfase << "\",\"" << codfase << "\"))&&" << "(BETWEEN(DADATA,#DATA,#DATA))\n" << "FROM TIPO=\"C\"\n" << "TO TIPO=\"C\""; else query << "USE RILORE\n" << "SELECT (BETWEEN(TIPORA,\"" << risoatt << "\",\"" << risoatt << "\"))&&" << "(BETWEEN(ANNO," << anno << "," << anno << "))&&" << "(BETWEEN(MESE,\"" << mese << "\",\"" << mese << "\"))&&" << "(BETWEEN(TPORA,\"" << tpora << "\",\"" << tpora << "\"))&&" << "(BETWEEN(CODCOSTO,\"" << codcosto << "\",\"" << codcosto << "\"))&&" << "(BETWEEN(CODCMS,\"" << codcms << "\",\"" << codcms << "\"))&&" << "(BETWEEN(CODFASE,\"" << codfase << "\",\"" << codfase << "\"))\n" << "FROM TIPO=\"D\"\n" << "TO TIPO=\"D\""; TISAM_recordset def(query); def.set_var("#DATA", data); //riempio lo sheet con i dati che soddisfano il filtro preparato prima for(bool ok = def.move_first(); ok; ok = def.move_next()) { TRilevamento_ore rilore(def.cursor()->curr()); TToken_string& riga = sheet.row(-1); riga.add(rilore.tipora(), sheet.cid2index(S_RISOATT)); switch(rilore.tipora()) { case 'R': riga.add(rilore.codice(), sheet.cid2index(S_CODRIS)); break; case 'A': riga.add(rilore.codice(), sheet.cid2index(S_CODATT)); break; default : break; } riga.add(rilore.tpora(), sheet.cid2index(S_TPORA)); riga.add(rilore.qtaore(), sheet.cid2index(S_QTAORE)); riga.add(rilore.costo().string(), sheet.cid2index(S_COSTO)); } sheet.force_update(); } //RIEMPI_SHEET: metodo che riempie lo sheet in base ai campi chiave //compilati sulla maschera void TRilevamento_cons_msk::riempi_sheet() { //leggo dalla maschera i campi chiave di ricerca const int anno = get_int(F_ANNO); const TString4 risoatt = get(F_RISOATT) == "T" ? "" : get(F_RISOATT); const TString4 mese = get(F_MESE); const TString4 tpora = get(F_TPORA); const TString80 codcosto = get(F_CODCOSTO); const TString80 codcms = get(F_CODCMS); const TString16 codfase = get(F_CODFASE); TString16 codice; switch(get(F_RISOATT)[0]) { case 'T': codice = get(F_CODICE); break; case 'R': codice = get(F_CODRIS); break; case 'A': codice = get(F_CODATT); break; default: break; } //preparo la query TString query; query << "USE RILORE\n" << "SELECT (BETWEEN(TIPORA,\"" << risoatt << "\",\"" << risoatt << "\"))&&" << "(BETWEEN(CODICE,\"" << codice << "\",\"" << codice << "\"))&&" << "(BETWEEN(ANNO," << anno << "," << anno << "))&&" << "(BETWEEN(MESE,\"" << mese << "\",\"" << mese << "\"))&&" << "(BETWEEN(TPORA,\"" << tpora << "\",\"" << tpora << "\"))&&" << "(BETWEEN(CODCOSTO,\"" << codcosto << "\",\"" << codcosto << "\"))&&" << "(BETWEEN(CODCMS,\"" << codcms << "\",\"" << codcms << "\"))&&" << "(BETWEEN(CODFASE,\"" << codfase << "\",\"" << codfase << "\"))\n"; TString fromto = "TIPO=\"C\""; if(risoatt != 'T') { fromto << " TIPORA=\"" << risoatt << "\""; if(codice.full()) { fromto << " CODICE=\"" << codice << "\""; if(anno > 0) { fromto << " ANNO=\"" << anno << "\""; if(mese.full()) { fromto << " MESE=\"" << mese << "\""; if(tpora.full()) fromto << " TPORA=\"" << tpora << "\""; } } } } query << "FROM " << fromto << "\n" << "TO " << fromto; TISAM_recordset def(query); riempi_calendario(def); } //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 TRilevamento_cons_msk::azzera_tutto() { TSheet_field& sheet = sfield(F_SHEET); FOR_EACH_SHEET_ROW(sheet, r, row) { TToken_string& row = sheet.row(r); row.add(0, sheet.cid2index(S_QTAORE)); } } //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 TRilevamento_cons_msk::registra() { const TDate data = _datasel; const int riga = _rigasel; TSheet_field& calendario = sfield(F_CALENDARIO); TToken_string& rigacal = calendario.row(riga); TSheet_field& sheet = sfield(F_SHEET); TLocalisamfile file(LF_RILORE); FOR_EACH_SHEET_ROW(sheet, r, row) { TToken_string& riga = *(TToken_string*)row; const char tipora = riga.get_char(sheet.cid2index(S_RISOATT)); const TString16 codice = tipora == 'R' ? riga.get(sheet.cid2index(S_CODRIS)) : riga.get(sheet.cid2index(S_CODATT)); const TString4 tpora = riga.get(sheet.cid2index(S_TPORA)); const TString80 codcosto = rigacal.get(calendario.cid2index(C_CODCOSTO)); const TString80 codcms = rigacal.get(calendario.cid2index(C_CODCMS)); const TString80 codfase = rigacal.get(calendario.cid2index(C_CODFASE)); const int qtaore = riga.get_int(sheet.cid2index(S_QTAORE)); const TString& tmp = riga.get(sheet.cid2index(S_COSTO)); const real costo(tmp); const TString4 mese = get(F_MESE); const int anno = get_int(F_ANNO); TRilevamento_ore rilroa('C', tipora, codice, get_int(F_ANNO), get(F_MESE), tpora); if(!rilroa.empty() && qtaore == 0) rilroa.remove(file); else { TRilevamento_ore rilroa; rilroa.set_tipo('C'); rilroa.set_tipora(tipora); rilroa.set_codice(codice); rilroa.set_anno(anno); rilroa.set_mese(mese); rilroa.set_tpora(tpora); rilroa.set_codcosto(codcosto); rilroa.set_codcms(codcms); rilroa.set_codfase(codfase); rilroa.set_dadata(data); rilroa.set_adata(data); rilroa.set_qtaore(qtaore); rilroa.set_costo(costo); int err = rilroa.rewrite_write(file); } } riempi_sheet(); } void TRilevamento_cons_msk::notify_focus_field(short id) { TMask::notify_focus_field(id); if(id == F_CALENDARIO) { TSheet_field& calendario = sfield(id); TToken_string& riga = calendario.row(calendario.selected()); const int giorno = calendario.current_column() - calendario.cid2index(C_1); TDate data(giorno, get_int(F_MESE), get_int(F_ANNO)); _datasel = data; _rigasel = calendario.selected(); riempi_risoatt(data, riga.get(0), riga.get(1), riga.get(2)); } } //ON_FIELD_EVENT: metodo che gestisce gli eventi sui vari campi della maschera bool TRilevamento_cons_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) { switch (f.dlg()) { case DLG_DEFAULT: if(e == fe_button) { _mode = 'D'; carica_default(); } break; case DLG_CERCA: if(e == fe_button) { _mode = 'F'; riempi_sheet(); } break; case DLG_SAVEREC: if(e == fe_button) { _mode = 'S'; registra(); } case S_RISOATT: case S_CODRIS: case S_CODATT: case S_TPORA: if(e == fe_modify) { if(get(S_RISOATT).full() && (get(F_CODRIS).full() || get(F_CODRIS).full()) && get(S_TPORA).full()) { TSheet_field& sheet = sfield(F_SHEET); proponi_costo(sheet.row(sheet.selected())); } } break; default: break; } return true; } void TRilevamento_cons_msk::esegui() const { } TRilevamento_cons_msk::TRilevamento_cons_msk() : TAutomask("ci2200a") { _qtaore = 0; } //////////////////////////////////////////// //// CLASSE TRilevamento_cons_app //// //////////////////////////////////////////// //classe TRilevamento_cons_app class TRilevamento_cons_app : public TSkeleton_application { public: virtual void main_loop(); }; void TRilevamento_cons_app::main_loop() { TRilevamento_cons_msk msk; while (msk.run() != K_QUIT) msk.esegui(); } int ci2200(int argc, char *argv[]) { TRilevamento_cons_app a; a.run (argc, argv, TR("Rilevamento Ore Consuntivo")); return TRUE; }