#include #include #include "ve2300.h" class TRighe_condizioni_vendita: public TRelation_application { TMask *_msk; // maschera principale TRelation *_rel; // relazione principale bool _catven_on; // booleano di abilitazione del campo CATVEN virtual bool user_create(); virtual bool user_destroy(); virtual TMask *get_mask(int) { return _msk; } virtual bool changing_mask(int) { return FALSE; } virtual TRelation *get_relation() const { return _rel; } static void hide_and_show_codriga(TMask &); // procedura di abilitazione/disabilitazione dei tre campi CODRIGA (codice riga) static bool handle_tiporiga(TMask_field &, KEY); // handler del campo TIPORIGA (articolo, gruppo merc., ragg. fiscale) static bool handle_cod(TMask_field &, KEY); // handler del campo COD (codice listino, numero contratto, codice offerta) virtual int write(const TMask &); // metodo usato per scrivere il record sul file virtual int rewrite(const TMask &); // metodo usato per aggiornare il record sul file virtual void init_query_mode(TMask &); // handler chiamato quando la maschera passa in modo ricerca public: TString16 _rcondven; // stringa che indica il tipo di archivio TBit_array _tohide; // vettore degli identificatori di campi che devono essere nascosti TRighe_condizioni_vendita() {} virtual ~TRighe_condizioni_vendita() {} }; TRighe_condizioni_vendita &app() { // funzione che ritorna il riferimento alla classe principale dell'applicazione return (TRighe_condizioni_vendita &)main_app(); } bool TRighe_condizioni_vendita::user_create() { bool gotcha= FALSE; // booleano di avvenuta inizializzazione _rcondven= "*"; // inizializzazione dell'indicatore del tipo di archivio if (argc()>2) { // se c'è, prende il tipo di archivio dalla linea di comando TString temp(argv(2)); _rcondven= temp.left(1); // prende solo il primo carattere } else { TMask choose("VE2300"); // istanzia la maschera di scelta del tipo di archivio if (choose.run() == K_ENTER) _rcondven= choose.get(F_TIPORCV); // prende il tipo di archivio dalla maschera } _rcondven.upper(); // rende la stringa upper-case _msk= new TMask("VE2300X"); _tohide.reset(); // resetta il vettore dei campi da eliminare switch (_rcondven[0]) { case 'L': { // listini _tohide.set(F_R_C_TIPOCF); // settaggio dei campi da eliminare... _tohide.set(F_R_C_CODCF); _tohide.set(F_R_C_COD); _tohide.set(F_R_O_COD); _tohide.set(F_R_C_RICERCA); _tohide.set(F_R_O_RICERCA); _tohide.set(F_R_CO_CODLOTTO); _tohide.set(F_R_O_ARTES); TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente _catven_on= prassid.get_bool("GESLISCV"); // setta il booleano di abilitazione di CATVEN set_search_field(F_R_L_RICERCA); // impostazione del campo di ricerca _msk->set_handler(F_R_L_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata gotcha= TRUE; break; } case 'C': // contratti _tohide.set(F_R_L_CATVEN); // settaggio dei campi da eliminare... _tohide.set(F_R_L_COD); _tohide.set(F_R_O_COD); _tohide.set(F_R_LO_UM); _tohide.set(F_R_L_RICERCA); _tohide.set(F_R_O_RICERCA); _tohide.set(F_R_O_ARTES); set_search_field(F_R_C_RICERCA); // impostazione del campo di ricerca _msk->set_handler(F_R_C_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata gotcha= TRUE; break; case 'O': // offerte _tohide.set(F_R_L_CATVEN); // settaggio dei campi da eliminare... _tohide.set(F_R_C_TIPOCF); _tohide.set(F_R_C_CODCF); _tohide.set(F_R_L_COD); _tohide.set(F_R_C_COD); _tohide.set(F_R_L_RICERCA); _tohide.set(F_R_C_RICERCA); set_search_field(F_R_O_RICERCA); // impostazione del campo di ricerca _msk->set_handler(F_R_O_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata gotcha= TRUE; break; default: // messaggio di errore se si indica un archivio non valido error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza"); break; } if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione _rel= new TRelation(LF_RCONDV); // apre la relazione (un unico file) _msk->set_handler(F_R_TIPORIGA, handle_tiporiga); // impostazione dell'handler sul campo di selezione del tipo della riga hide_and_show_codriga(*_msk); // invoca la procedura di controllo della mutua esclusione dei tre campi CODRIGA } return (gotcha); } bool TRighe_condizioni_vendita::user_destroy() { delete _rel; delete _msk; return TRUE; } void TRighe_condizioni_vendita::hide_and_show_codriga(TMask &m) { short id_campi[3]= { F_R_CODRIGA_A, F_R_CODRIGA_G, F_R_CODRIGA_R }; // vettore degli identificatori dei tre campi CODRIGA in mutua esclusione char tag_campi[3]= { 'A', 'G', 'R' }; // vettore dei tag di TIPORIGA per i tre campi CODRIGA in mutua esclusione char tag_campo= m.get(F_R_TIPORIGA)[0]; // prende il tag in TIPORIGA del campo da abilitare TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di tipo di archivio TBit_array &_tohide= app()._tohide; // prende il riferimento all'array di campi da eliminare for (int i=0; i<3; i++) { // ciclo sui tre campi CODRIGA if (tag_campo == tag_campi[i]) { // il campo indicato con il tag viene... m.efield(id_campi[i]).check_type(CHECK_REQUIRED); // ...abilitato al checking... m.show(id_campi[i]); // ...mostrato... _tohide.reset(id_campi[i]); // ...e rimosso dal vettore di eliminazione... } else { // ...mentre gli altri vengono... m.efield(id_campi[i]).check_type(CHECK_NONE); // ...disabilitati dal checking... m.hide(id_campi[i]); // ...nascosti... _tohide.set(id_campi[i]); // ...e aggiunti al vettore di eliminazione } } if (_rcondven != "C") { // se non stiamo lavorando sui contratti... if (tag_campo=='A') { // ...ed è stata selezionata una riga di articoli... m.efield(F_R_LO_UM).check_type(CHECK_REQUIRED); // ...l'unità di misura viene attivata al checking... m.enable(F_R_LO_UM); // ...e abilitata... } else { // ...altrimenti, se è stata selezionata una riga non di articoli... m.efield(F_R_LO_UM).check_type(CHECK_NONE); // ...l'unità di misura viene rimossa dal checking... m.disable(F_R_LO_UM); // ...e disabilitata } } } bool TRighe_condizioni_vendita::handle_tiporiga(TMask_field &fld, KEY k) { if (k==K_TAB) hide_and_show_codriga(fld.mask()); // invoca la procedura di controllo della mutua esclusione dei tre campi CODRIGA return TRUE; } bool TRighe_condizioni_vendita::handle_cod(TMask_field &fld, KEY k) { if ((k==K_TAB) && fld.get().not_empty()) { TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di indicazione del tipo di archivio TMask &m= fld.mask(); // prende la maschera principale TLocalisamfile condv(LF_CONDV); // apre il file della testata (condizioni di vendita) condv.put("TIPO", _rcondven); // riempie il campo "TIPO" switch (_rcondven[0]) { case 'L': // riempie il resto della chiave dei listini condv.put("CATVEN", m.get(F_R_L_CATVEN)); condv.put("COD", m.get(F_R_L_COD)); break; case 'C': // riempie il resto della chiave dei contratti condv.put("TIPOCF", m.get(F_R_C_TIPOCF)); condv.put("CODCF", m.get(F_R_C_CODCF)); condv.put("COD", m.get(F_R_C_COD)); break; case 'O': // riempie il resto della chiave delle offerte condv.put("COD", m.get(F_R_O_COD)); break; } if (condv.read()==NOERR) { // se la lettura è andata a buon fine abilita/disabilita i campi della maschera in base ai booleani della testata if (!condv.get_bool("GESTUM")) { m.efield(F_R_LO_UM).check_type(CHECK_NONE); // disabilita il checking sul campo "unità di misura" m.disable(F_R_LO_UM); // disabilita il campo "unità di misura" } else { m.efield(F_R_LO_UM).check_type(CHECK_REQUIRED); // abilita il checking sul campo "unità di misura" m.enable(F_R_LO_UM); // abilita il campo "unità di misura" } if (!condv.get_bool("GESTSCAGL")) { m.efield(F_R_NSCAGL).check_type(CHECK_NONE); // disabilita il checking sul campo "quantità limite scaglione" m.disable(F_R_NSCAGL); // disabilita il campo "quantità limite scaglione" m.disable(F_R_QLIM); // disabilita il campo "quantità limite scaglione" } else { m.efield(F_R_NSCAGL).check_type(CHECK_REQUIRED); // abilita il checking sul campo "quantità limite scaglione" m.enable(F_R_NSCAGL); // abilita il campo "quantità limite scaglione" m.enable(F_R_QLIM); // abilita il campo "quantità limite scaglione" } if (!condv.get_bool("GESTSCO")) { m.disable(F_R_SCONTO); // disabilita il campo "sconto" m.disable(F_R_QOM); // disabilita il campo "quantità art. omaggio" m.disable(F_R_QBASE); // disabilita il campo "quantità base x sconto" m.disable(F_R_CODARTOM); // disabilita il campo "codice articolo omaggio" m.disable(F_R_PROMAGGIO); // disabilita il campo "prezzo omaggio" m.disable(F_R_UMOM); // disabilita il campo "unità di misura art. omaggio" } else { m.enable(F_R_SCONTO); // abilita il campo "sconto" m.enable(F_R_QOM); // abilita il campo "quantità art. omaggio" m.enable(F_R_QBASE); // abilita il campo "quantità base x sconto" m.enable(F_R_CODARTOM); // abilita il campo "codice articolo omaggio" m.enable(F_R_PROMAGGIO); // abilita il campo "prezzo omaggio" m.enable(F_R_UMOM); // abilita il campo "unità di misura art. omaggio" } return TRUE; } else { error_box("Non esiste una testata corrispondente alla chiave specificata"); return FALSE; } } else return TRUE; } int TRighe_condizioni_vendita::write(const TMask &m) { m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione TRectype &r= f.curr(); // prende il record corrente del file principale f.zero("TIPOCF"); // svuota il campo TIPOCF } _rel->write(); // invoca la scrittura della relazione return (_rel->status()); // ritorna lo stato della relazione } int TRighe_condizioni_vendita::rewrite(const TMask &m) { m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione TRectype &r= f.curr(); // prende il record corrente del file principale f.zero("TIPOCF"); // svuota il campo TIPOCF } _rel->rewrite(); // invoca la riscrittura della relazione return (_rel->status()); // ritorna lo stato della relazione } void TRighe_condizioni_vendita::init_query_mode(TMask &m) { for (short i=(short)_tohide.first_one(); i<=(short)_tohide.last_one(); i++) { // ciclo sul vettore dei campi da eliminare if (_tohide[i]) { if (_msk->field(i).is_edit()) _msk->efield(i).check_type(CHECK_NONE); // disabilita il checking sul campo se è editabile _msk->hide(i); // rende invisibile il campo } } if (!_catven_on) { // se il booleano di abil. di CATVEN è falso... _msk->efield(F_R_L_CATVEN).check_type(CHECK_NONE); // ...viene rimosso dal checking... _msk->disable(F_R_L_CATVEN); // ...e disabilitato } _msk->set(F_R_TIPO, _rcondven); // settaggio del campo di tipo archivio } int ve2300(int argc, char* argv[]) { TRighe_condizioni_vendita a; a.run(argc, argv, "Righe condizioni vendita "); return 0; }