#include #include #include #include #include #include #include #include "ci0.h" #include "cilib.h" #include "ci0200a.h" #include "../ve/velib.h" /////////////////////////////////// //// CLASSE TRISOATT_MSK //// /////////////////////////////////// //Classe TRisoatt_msk class TRisoatt_msk : public TAutomask { real _valore; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); const TString & add_field_to_tab_filter(TString & filtro, short id, int len = 0, const char * empty_value = ""); const TString & add_field_to_tab_key(TString & filtro, TToken_string & row, short id, bool number, int len = 0, const char * empty_value = ""); void riempi_sheet(); void nuova_riga(); void azzera_riga(TSheet_field& sheet); void azzera_tutto(TSheet_field& sheet); void registra(); void copia_tutto(); public: void esporta() const; TRisoatt_msk(); }; const TString & TRisoatt_msk::add_field_to_tab_filter(TString & filtro, short id, int len, const char * empty_value) { if (len <= 0) len = field(id).size(); TString & val = get_tmp_string(80); val = get(id); if (val == empty_value) val.fill('?', len); else val.left_just(len); filtro << val; return val; } const TString & TRisoatt_msk::add_field_to_tab_key(TString & filtro, TToken_string & row, short id, bool number, int len, const char * empty_value) { TSheet_field & sh = sfield(F_SHEET); if (len <= 0) len = sh.sheet_mask().field(id).size(); TString & val = get_tmp_string(80); val = row.get(sh.cid2index(id)); if (val == empty_value) val.fill(number ? '0' : ' ', len); else val.left_just(len); filtro << val; return val; } //RIEMPI_SHEET: metodo che riempie lo sheet in base ai campi chiave //compilati sulla maschera void TRisoatt_msk::riempi_sheet() { TString filtro; char risoatt = get(F_RISOATT)[0]; //guardo il tipo risorsa / attrezzatura che sto ricercando (se Tutti setto a '?') add_field_to_tab_filter(filtro, F_RISOATT, 1, "T"); //leggo il codice corretto a seconda del tipo selezionato (se vuoto setto a 16 caratteri '?') switch(risoatt) { case 'T': add_field_to_tab_filter(filtro, F_CODICE); break; case 'R': add_field_to_tab_filter(filtro, F_CODRIS); break; case 'A': add_field_to_tab_filter(filtro, F_CODATT); break; default: break; } add_field_to_tab_filter(filtro, F_ANNO); //leggo il mese (se vuoto setto a '??') add_field_to_tab_filter(filtro, F_MESE, 2); //leggo il tipo ora (se vuoto setto a '??') add_field_to_tab_filter(filtro, F_TPORA); int i ; for (i = filtro.len() - 1; i >= 0 && filtro[i] == '?'; i--); filtro.cut(++i); if (i > 0) filtro << '*'; TString query("USE &ROA\n"); if (filtro.full()) query << "SELECT CODTAB?=\"" << filtro << "\""; if(risoatt != 'T') { query << "\n" << "FROM CODTAB=" << risoatt << "\n" << "TO CODTAB=" << risoatt << "\n"; } TISAM_recordset roa(query); TSheet_field& sheet = sfield(F_SHEET); sheet.destroy(); //riempio lo sheet con i dati che soddisfano il filtro preparato prima for(bool ok = roa.move_first(); ok; ok = roa.move_next()) { TRisoatt roa(roa.cursor()->curr()); TRisoatt_key roakey(roa.chiave()); TToken_string& riga = sheet.row(-1); riga.add(roakey.tipo(), sheet.cid2index(S_RISOATT)); TString16 cod = roakey.cod(); cod.trim(); switch(roakey.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(roakey.mese(), sheet.cid2index(S_MESE)); riga.add(roakey.tpora(), sheet.cid2index(S_TPORA)); riga.add(roa.valuni().string(), sheet.cid2index(S_VALUNI)); riga.add(roakey.anno(), sheet.cid2index(S_ANNO)); sheet.check_row(sheet.items() - 1); } sheet.set_column_justify(sheet.cid2index(S_VALUNI), true); sheet.force_update(); } //NUOVA_RIGA: metodo che aggiunge una riga allo sheet //tenendo conto dei campi chiave compilati in testata void TRisoatt_msk::nuova_riga() { TSheet_field& sheet = sfield(F_SHEET); sheet.row(-1); sheet.select(sheet.items() - 1); TMask& msk = sheet.sheet_mask(); msk.set(S_ANNO, get(F_ANNO)); //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_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_VALUNI, ""); //lancio la maschera di riga da compilare if(msk.run() == K_ENTER) { const real& valuni = msk.get_real(S_VALUNI); if(valuni > ZERO) { const char tipo = msk.get(S_RISOATT)[0]; const TString& codice = tipo == 'R' ? msk.get(S_CODRIS) : msk.get(S_CODATT); 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; } const TString& mese = msk.get(S_MESE); riga.add(mese, sheet.cid2index(S_MESE)); const TString& tpora = msk.get(S_TPORA); riga.add(tpora, sheet.cid2index(S_TPORA)); riga.add(valuni.string(), sheet.cid2index(S_VALUNI)); const TString& anno = msk.get(S_ANNO); riga.add(anno, sheet.cid2index(S_ANNO)); sheet.set_column_justify(sheet.cid2index(S_VALUNI), true); } 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 TRisoatt_msk::azzera_riga(TSheet_field& sheet) { const int nriga = sheet.selected(); TToken_string& row = sheet.row(nriga); row.add(0, sheet.cid2index(S_VALUNI)); TMask& msk = sheet.sheet_mask(); _valore = msk.get_real(S_VALUNI); msk.set(S_VALUNI, ZERO); } //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 TRisoatt_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_VALUNI)); } } //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 TRisoatt_msk::registra() { TLocalisamfile tabmod(LF_TABMOD); TModule_table tab("&ROA"); const int anno = get_int(F_ANNO); TSheet_field& sheet = sfield(F_SHEET); TString80 chiave; FOR_EACH_SHEET_ROW(sheet, r, row) { chiave.cut(0); TToken_string& riga = *(TToken_string*)row; const TString4 tipo = add_field_to_tab_key(chiave, riga, S_RISOATT, false, 1, "T"); const bool risorsa = tipo[0] == 'R'; const TString16 codice = add_field_to_tab_key(chiave, riga, risorsa ? S_CODRIS : S_CODATT, false); const TString4 stranno = add_field_to_tab_key(chiave, riga, S_ANNO, true); const TString4 mese = add_field_to_tab_key(chiave, riga, S_MESE, true, 2); const TString4 tpora = add_field_to_tab_key(chiave, riga, S_TPORA, true); const TString80 descr = risorsa ? riga.get(sheet.cid2index(S_DESRIS)) : riga.get(sheet.cid2index(S_DESATT)); const real valuni(riga.get(sheet.cid2index(S_VALUNI))); TString8 anme; anme << anno << mese; tab.put("CODTAB", chiave); int err = tab.read(); if(err == NOERR) { if(valuni == ZERO) tab.remove(); else { tab.put("R1", valuni); tab.put("I0", anme); tab.rewrite(); } } else { tab.put("CODTAB", chiave); tab.put("S0", descr); tab.put("R1", valuni); tab.put("I0", anme); tab.write(); } } riempi_sheet(); } void TRisoatt_msk::copia_tutto() { TLocalisamfile tabmod(LF_TABMOD); TModule_table tab("&ROA"); //instanzio la maschera di richiesta parametri (che è una maschera di riga), e la lancio TSheet_field& sheet = sfield(F_SHEET); sheet.row(-1); sheet.select(sheet.items() - 1); TMask& msk = sheet.sheet_mask(); msk.disable(DLG_RESET); msk.hide(S_VALUNI); const char tipo = get(F_RISOATT)[0]; const int anno = get_int(F_ANNO); const TString4 mese = get(F_MESE); const TString4 tpora = get(F_TPORA); TString16 codice; switch(tipo) { case 'R': codice = get(F_CODRIS); break; case 'A': codice = get(F_CODATT); break; default : break; } if(codice.full()) { msk.disable(S_RISOATT); msk.set(S_CODRIS, ""); msk.set(S_CODATT, ""); switch(tipo) { case 'R': msk.enable(S_CODRIS); msk.disable(S_CODATT); break; case 'A': msk.enable(S_CODATT); msk.disable(S_CODRIS); break; default : break; } } if(mese.full()) msk.enable(S_MESE); else msk.disable(S_MESE); if(tpora.full()) msk.enable(S_TPORA); else msk.disable(S_TPORA); msk.enable(S_ANNO); TString4 tmp; tmp << tipo; msk.set(S_RISOATT, tmp); msk.reset(S_MESE); msk.reset(S_CODRIS); msk.reset(S_CODATT); msk.reset(S_TPORA); if (msk.run() == K_ENTER) { const char tipodest = msk.get(S_RISOATT)[0]; TString16 codicedest; switch(tipodest) { case 'R': codicedest = msk.get(S_CODRIS); case 'A': codicedest = msk.get(S_CODATT); default : break; } codicedest.left_just(16); int annodest = msk.get_int(S_ANNO); TString4 mesedest = msk.get(S_MESE); TString4 tporadest = msk.get(S_TPORA); const int anno = get_int(F_ANNO); FOR_EACH_SHEET_ROW_BACK(sheet, r, riga) { TToken_string& row = *(TToken_string*)riga; TString8 tmp = row.get(sheet.cid2index(S_VALUNI)); if(tmp.empty()) { sheet.destroy(r); continue; } TString80 chiave; const TString4 tipo = add_field_to_tab_key(chiave, row, S_RISOATT, false, 1, "T"); const bool risorsa = tipo[0] == 'R'; const TString16 codice = add_field_to_tab_key(chiave, row, risorsa ? S_CODRIS : S_CODATT, false); const TString4 stranno = add_field_to_tab_key(chiave, row, S_ANNO, true); const TString4 mese = add_field_to_tab_key(chiave, row, S_MESE, true, 2); const TString4 tpora = add_field_to_tab_key(chiave, row, S_TPORA, true); const real valuni(row.get(sheet.cid2index(S_VALUNI))); TString80 chiavedest; if(get(F_RISOATT)[0] == 'T') chiavedest << tipo; else chiavedest << tipodest; if(codicedest.full()) chiavedest << codicedest; else chiavedest << codice; chiavedest << annodest; if(mesedest.empty()) chiavedest << mese; else chiavedest << mesedest; if(tporadest.empty()) chiavedest << tpora; else chiavedest << tporadest; if(chiavedest == chiave) { TString str; str << "Impossibile copiare la riga " << r + 1 << " sulla destinazione selezionata perchè coincidono"; warning_box(str); } else { tab.put("CODTAB", chiavedest); int err = tab.read(); if(err == NOERR) { if(yesno_box(TR("La destinazione esiste già, si desidera sovrasciverla?"))) tab.put("R1", valuni); tab.rewrite(); } else { tab.put("CODTAB", chiavedest); tab.put("R1", valuni); tab.write(); } } } } riempi_sheet(); msk.enable_default(); msk.show_default(); } //ON_FIELD_EVENT: metodo che gestisce gli eventi sui vari campi della maschera bool TRisoatt_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) { switch (f.dlg()) { case DLG_CERCA: if (e == fe_button) { riempi_sheet(); return false; } 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_COPY: { if(e == fe_button) { copia_tutto(); return false; } } break; case DLG_CANCEL: { if(e == fe_button && jolly == 1) { TSheet_field& sheet = sfield(F_SHEET); TMask& msk = sheet.sheet_mask(); const real& val = msk.get_real(S_VALUNI); if(sheet.selected() == sheet.items() - 1) { sheet.destroy(sheet.items() - 1); sheet.force_update(); } else if(_valore > ZERO) { TToken_string& row = sheet.row(sheet.selected()); row.add(_valore.string(), sheet.cid2index(S_VALUNI)); _valore = ZERO; } } } 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_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 TRisoatt_msk::esporta() const { } TRisoatt_msk::TRisoatt_msk() : TAutomask("ci0200a") { _valore = ZERO; } /////////////////////////////////// //// CLASSE TRISOATT_APP //// /////////////////////////////////// //classe TRisoatt_app class TRisoatt_app : public TSkeleton_application { public: virtual void main_loop(); }; void TRisoatt_app::main_loop() { TRisoatt_msk msk; while (msk.run() != K_QUIT) msk.esporta(); } int ci0200(int argc, char *argv[]) { TRisoatt_app a; a.run (argc, argv, TR("Gestione Listini")); return TRUE; }