From ae09afd4f8f2e0d5eb2ff15eeedc832b89e79638 Mon Sep 17 00:00:00 2001 From: luca83 Date: Wed, 30 Jun 2010 14:37:33 +0000 Subject: [PATCH] =?UTF-8?q?Patch=20level=20=20=20=20=20=20=20=20=20:=2010.?= =?UTF-8?q?0=20patch=20=3F=3F=3F=20Files=20correlati=20=20=20=20=20:=20ci0?= =?UTF-8?q?=20Ricompilazione=20Demo=20:=20[=20]=20Commento=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20:=20Aggiunto=20il=20programma=20per=20la?= =?UTF-8?q?=20gestione=20delle=20disponibilit=C3=A0=20delle=20risorse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://10.65.10.50/trunk@20642 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ci/ci0500.cpp | 423 +++++++++++++++++++++++++++++++++++++++++++++++++ ci/ci0500a.h | 24 +++ ci/ci0500a.uml | 264 ++++++++++++++++++++++++++++++ 3 files changed, 711 insertions(+) create mode 100755 ci/ci0500.cpp create mode 100755 ci/ci0500a.h create mode 100755 ci/ci0500a.uml diff --git a/ci/ci0500.cpp b/ci/ci0500.cpp new file mode 100755 index 000000000..6f73a4866 --- /dev/null +++ b/ci/ci0500.cpp @@ -0,0 +1,423 @@ +#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; +} \ No newline at end of file diff --git a/ci/ci0500a.h b/ci/ci0500a.h new file mode 100755 index 000000000..72bf84029 --- /dev/null +++ b/ci/ci0500a.h @@ -0,0 +1,24 @@ +//Campi maschera ci0200a +#define F_ANNO 301 +#define F_MESE 302 +#define F_TPORA 303 +#define F_RISOATT 304 +#define F_CODICE 305 +#define F_CODRIS 306 +#define F_DESRIS 307 +#define F_CODATT 308 +#define F_DESATT 309 +#define F_SHEET 310 + +#define DLG_RESET 400 + +#define S_RISOATT 101 +#define S_CODRIS 102 +#define S_DESRIS 108 +#define S_CODATT 201 +#define S_DESATT 208 +#define S_ANNO 103 +#define S_MESE 104 +#define S_TPORA 105 +#define S_OREPREV 106 +#define S_ORECONS 107 \ No newline at end of file diff --git a/ci/ci0500a.uml b/ci/ci0500a.uml new file mode 100755 index 000000000..0ba27e701 --- /dev/null +++ b/ci/ci0500a.uml @@ -0,0 +1,264 @@ +#include "ci0500a.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_NEWREC 2 2 +BEGIN + PROMPT 1 1 "Nuovo" + PICTURE TOOL_NEWREC +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 1 1 "Salva" + PICTURE TOOL_SAVEREC +END + +BUTTON DLG_RESET 2 2 +BEGIN + PROMPT 1 1 "Azzera" + PICTURE TOOL_RESET +END + +#include + +ENDPAGE + +PAGE "Risorse e Attrezzature" 0 2 0 0 + +GROUPBOX DLG_NULL 78 8 +BEGIN + PROMPT 1 0 "@bDati Risorsa - Attrezzatura" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 1 "Anno " + CHECTYPE REQUIRED + FLAGS "A" +END + +LISTBOX F_MESE 10 +BEGIN + PROMPT 22 1 "Mese" + ITEM "|" + FLAGS "M" +END + +STRING F_TPORA 2 +BEGIN + PROMPT 40 1 "Tipo ora " + USE &ORE + INPUT CODTAB F_TPORA + DISPLAY "Codice@16" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_TPORA CODTAB +END + +RADIOBUTTON F_RISOATT 1 76 +BEGIN + PROMPT 2 2 "@bTipo: " + ITEM "T|Tutti" + MESSAGE SHOW,1@|HIDE,2@|HIDE,3@ + ITEM "R|Risorsa" + MESSAGE HIDE,1@|SHOW,2@|HIDE,3@ + ITEM "A|Attrezzatura" + MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ + FLAGS "Z" +END + +STRING F_CODICE 16 +BEGIN + PROMPT 2 5 "Codice: " + USE &DRA + DISPLAY "Tipo@5" CODTAB[1,1] + DISPALY "Codice@16" CODTAB[2,17] + DISPLAY "Anno@5" CODTAB[18,21] + DISPLAY "Mese@5" CODTAB[22,23] + DISPLAY "Tipo\nora@5" CODTAB[24,25] + OUTPUT F_RISOATT CODTAB[1,1] + OUTPUT F_CODICE CODTAB[2,17] + GROUP 1 + CHECKTYPE NORMAL +END + +STRING F_CODRIS 16 +BEGIN + PROMPT 2 5 "Codice: " + USE RSS + INPUT CODTAB F_CODRIS + DISPLAY "Codice@16" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODRIS CODTAB + OUTPUT F_DESRIS S0 + GROUP 2 + CHECKTYPE NORMAL +END + +STRING F_DESRIS 50 +BEGIN + PROMPT 10 6 "" + FLAGS "D" + GROUP 2 +END + +STRING F_CODATT 16 +BEGIN + PROMPT 2 5 "Codice: " + FIELD CODTAB[1,16] + USE ATR + INPUT CODTAB F_CODATT + DISPLAY "Codice@16" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODATT CODTAB + OUTPUT F_DESATT S0 + GROUP 3 + CHECKTYPE NORMAL +END + +STRING F_DESATT 50 +BEGIN + PROMPT 10 6 "" + FLAGS "D" + GROUP 3 +END + +SPREADSHEET F_SHEET -15 0 +BEGIN + PROMPT 1 8 "" + ITEM "Tipo" + ITEM "Codice@16" + ITEM "Anno" + ITEM "Mese" + ITEM "Tipo\nOra@5" + ITEM "Ore\npreventivo@12" + ITEM "Ore\nconsuntivo@12" + ITEM "Descrizione@50" +END + +ENDPAGE +ENDMASK + +PAGE "Dettaglio Risorsa - Attrezzatura" -1 -1 78 13 + +GROUPBOX DLG_NULL 76 9 +BEGIN + PROMPT 1 1 "@bDati Risorsa - Attrezzatura" +END + +RADIOBUTTON S_RISOATT 1 74 +BEGIN + PROMPT 2 2 "@bTipo: " + FIELD CODTAB[0,1] + ITEM "R|Risorsa" + MESSAGE SHOW,1@|HIDE,2@|RESET,2@ + ITEM "A|Attrezzatura" + MESSAGE HIDE,1@|SHOW,2@|RESET,1@ + FLAGS "GDZ" +END + +STRING S_CODRIS 16 +BEGIN + PROMPT 2 5 "Codice Risorsa " + FIELD CODTAB[1,16] + USE RSS + INPUT CODTAB S_CODRIS + DISPLAY "Codice@16" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_CODRIS CODTAB + OUTPUT S_DESRIS S0 + CHECKTYPE REQUIRED + FLAGS "GD" + GROUP 1 +END + +STRING S_DESRIS 50 +BEGIN + PROMPT 2 6 "Descrizione " + CHECKTYPE NORMAL + FLAGS "D" + GROUP 1 +END + +STRING S_CODATT 16 +BEGIN + PROMPT 2 5 "Codice Attrezzatura " + FIELD CODTAB[1,16] + USE ATR + INPUT CODTAB S_CODATT + DISPLAY "Codice@16" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_CODATT CODTAB + OUTPUT S_DESATT S0 + CHECKTYPE REQUIRED + FLAGS "GD" + GROUP 2 +END + +STRING S_DESATT 50 +BEGIN + PROMPT 2 6 "Descrizione " + CHECKTYPE NORMAL + FLAGS "D" + GROUP 2 +END + +NUMBER S_ANNO 4 +BEGIN + PROMPT 2 7 "Anno " + FLAGS "AD" +END + +LISTBOX S_MESE 10 +BEGIN + PROMPT 22 7 "Mese" + ITEM "|" + FILED CODTAB[21,2] + FLAGS "MD" +END + +STRING S_TPORA 2 +BEGIN + PROMPT 59 7 "Tipo ora " + USE &ORE + INPUT CODTAB S_TPORA + DISPLAY "Codice@16" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_TPORA CODTAB + FLAGS "D" +END + +NUMBER S_OREPREV 6 +BEGIN + PROMPT 2 8 "Ore a Preventivo: " +END + +NUMBER S_ORECONS 6 +BEGIN + PROMPT 30 8 "Ore a Consuntivo: " +END + +ENDPAGE + +TOOLBAR "" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_RESET 2 2 +BEGIN + PROMPT 2 1 "Azzera" + MESSAGE EXIT,K_DEL + PICTURE TOOL_RESET +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 4 1 "Annulla" + PICTURE TOOL_CANCEL +END + +ENDPAGE +ENDMASK