diff --git a/ve/ve2200.cpp b/ve/ve2200.cpp index 83f2bb910..5cdda1b06 100755 --- a/ve/ve2200.cpp +++ b/ve/ve2200.cpp @@ -1,211 +1,211 @@ - -#include -#include -#include - -#include "ve2200.h" - - - -class TCondizioni_vendita: public TRelation_application { - TMask *_msk; // maschera principale - TRelation *_rel; // relazione principale - - TString16 _condven; // stringa che indica il tipo di archivio - short _tohide[10]; // vettore degli identificatori di campi che devono essere nascosti - - 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 bool handler_datacam(TMask_field &, KEY); // handler del campo DATACAM (data cambio) - static bool handler_valfin(TMask_field &, KEY); // handler del campo VALFIN (data fine validità) - static bool handler_codlissucc(TMask_field &, KEY); // handler del campo CODLISSUCC (codice listino successivo) - static bool handler_seqric(TMask_field &, KEY); // handler del campo SEQRIC (sequenza di ricerca) - - 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: - TCondizioni_vendita() {} - virtual ~TCondizioni_vendita() {} -}; - - - -bool TCondizioni_vendita::user_create() { - bool gotcha= FALSE; // booleano di avvenuta inizializzazione - - _condven= "*"; // inizializzazione dell'indicatore del tipo di archivio - if (argc()>2) _condven= argv(2); // se c'è, prende il tipo di archivio dalla linea di comando - else { - TMask choose("VE2200"); // istanzia la maschera di scelta del tipo di archivio - if (choose.run() == K_ENTER) _condven= choose.get(F_TIPOCV); // prende il tipo di archivio dalla maschera - } - _condven.upper(); // rende la stringa upper-case - _msk= new TMask("VE2200X"); - switch (_condven[0]) { - case 'L': { // listini - // settaggio dei campi da eliminare - _tohide[0]= 5; - _tohide[1]= F_C_COD; - _tohide[2]= F_O_COD; - _tohide[3]= F_C_TIPOCF; - _tohide[4]= F_C_CODCF; - _tohide[5]= F_C_OBBLIG; - set_search_field(F_L_COD); // impostazione del campo di ricerca - TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta - if (toupper(prassid.get("CATVEN_ON")[0])!='T') _msk->disable(F_L_CATVEN); // disabilita il campo CATVEN se non è abilitato nella config. - _msk->set_handler(F_L_CODLISSUCC, handler_codlissucc); // setta l'handler per il campo di codice successivo - gotcha= TRUE; - break; - } - case 'C': { // contratti - // settaggio dei campi da eliminare - _tohide[0]= 4; - _tohide[1]= F_L_COD; - _tohide[2]= F_O_COD; - _tohide[3]= F_L_CATVEN; - _tohide[4]= F_L_CODLISSUCC; - set_search_field(F_C_COD); // impostazione del campo di ricerca - gotcha= TRUE; - break; - } - case 'O': { // offerte - // settaggio dei campi da eliminare - _tohide[0]= 7; - _tohide[1]= F_L_COD; - _tohide[2]= F_C_COD; - _tohide[3]= F_L_CATVEN; - _tohide[4]= F_C_TIPOCF; - _tohide[5]= F_C_CODCF; - _tohide[6]= F_C_OBBLIG; - _tohide[7]= F_L_CODLISSUCC; - set_search_field(F_O_COD); // impostazione del campo di ricerca - 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_CONDV); // apre la relazione (un unico file) - _msk->set_handler(F_DATACAM, handler_datacam); // imposta l'handler per il campo della data del cambio - _msk->set_handler(F_VALFIN, handler_valfin); // imposta l'handler per il campo di fine validità - _msk->set_handler(F_SEQRIC, handler_seqric); // imposta l'handler per il campo di sequenza di ricerca - } - return (gotcha); -} - -bool TCondizioni_vendita::user_destroy() { - delete _rel; - delete _msk; - return TRUE; -} - -bool TCondizioni_vendita::handler_datacam(TMask_field &fld, KEY k) { - if (k==K_TAB) { // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso - TString datacam(fld.get()); // legge la data di cambio nel campo corrente - if (datacam.not_empty()) { - TMask &m= fld.mask(); // prende la maschera principale - TString codval(m.get(F_CODVAL)); // prende il codice della valuta - if (codval.not_empty()) { - TTable cam("CAM"); // apre la tabella cambi - cam.put("CODTAB", codval << datacam); // riempie la chiave - if (cam.read() == NOERR) m.set(F_CAMBIO, cam.get("R10")); // se la lettura riesce il valore del cambio viene posto nel campo CAMBIO della maschera - } - } - } - return TRUE; -} - -bool TCondizioni_vendita::handler_valfin(TMask_field &fld, KEY k) { - if (k==K_TAB) { - if (fld.get().not_empty()) { - TMask &m= fld.mask(); // prende la maschera principale - if (m.get(F_VALIN).not_empty()) { - TDate valfin(fld.get()); // prende la data di fine validità - TDate valin(m.get(F_VALIN)); // prende la data di inizio validità - if (valfinlfile(); // 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 TCondizioni_vendita::rewrite(const TMask &m) { - m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione - if (_condven != "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 TCondizioni_vendita::init_query_mode(TMask &m) { - for (int i=1; i<=_tohide[0]; i++) { - if (_msk->field(_tohide[i]).is_edit()) _msk->efield(_tohide[i]).check_type(CHECK_NORMAL); // disabilita il checking sul campo se è editabile - _msk->disable(_tohide[i]); // disabilita il campo - _msk->hide(_tohide[i]); // rende invisibile il campo - } - _msk->set(F_TIPO, _condven); // settaggio del campo di tipo archivio -} - -int ve2200(int argc, char* argv[]) { - TCondizioni_vendita a; - - a.run(argc, argv, "Condizioni di vendita "); - return 0; -} + +#include +#include +#include + +#include "ve2200.h" + + + +class TCondizioni_vendita: public TRelation_application { + TMask *_msk; // maschera principale + TRelation *_rel; // relazione principale + + TString16 _condven; // stringa che indica il tipo di archivio + TBit_array _tohide; // vettore degli identificatori di campi che devono essere nascosti + 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 bool handler_datacam(TMask_field &, KEY); // handler del campo DATACAM (data cambio) + static bool handler_valfin(TMask_field &, KEY); // handler del campo VALFIN (data fine validità) + static bool handler_codlissucc(TMask_field &, KEY); // handler del campo CODLISSUCC (codice listino successivo) + static bool handler_seqric(TMask_field &, KEY); // handler del campo SEQRIC (sequenza di ricerca) + + 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: + TCondizioni_vendita() {} + virtual ~TCondizioni_vendita() {} +}; + + + +bool TCondizioni_vendita::user_create() { + bool gotcha= FALSE; // booleano di avvenuta inizializzazione + + _condven= "*"; // inizializzazione dell'indicatore del tipo di archivio + if (argc()>2) _condven= argv(2); // se c'è, prende il tipo di archivio dalla linea di comando + else { + TMask choose("VE2200"); // istanzia la maschera di scelta del tipo di archivio + if (choose.run() == K_ENTER) _condven= choose.get(F_TIPOCV); // prende il tipo di archivio dalla maschera + } + _condven.upper(); // rende la stringa upper-case + _msk= new TMask("VE2200X"); + switch (_condven[0]) { + case 'L': { // listini + // settaggio dei campi da eliminare + _tohide.set(F_C_COD); + _tohide.set(F_O_COD); + _tohide.set(F_C_TIPOCF); + _tohide.set(F_C_CODCF); + _tohide.set(F_C_OBBLIG); + set_search_field(F_L_COD); // impostazione del campo di ricerca + TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente + _catven_on= (toupper(prassid.get("CATVEN_ON")[0])!='T'); // setta il booleano di abilitazione di CATVEN + _msk->set_handler(F_L_CODLISSUCC, handler_codlissucc); // setta l'handler per il campo di codice successivo + gotcha= TRUE; + break; + } + case 'C': // contratti + // settaggio dei campi da eliminare + _tohide.set(F_L_COD); + _tohide.set(F_O_COD); + _tohide.set(F_L_CATVEN); + _tohide.set(F_L_CODLISSUCC); + set_search_field(F_C_COD); // impostazione del campo di ricerca + gotcha= TRUE; + break; + case 'O': // offerte + // settaggio dei campi da eliminare + _tohide.set(F_L_COD); + _tohide.set(F_C_COD); + _tohide.set(F_L_CATVEN); + _tohide.set(F_C_TIPOCF); + _tohide.set(F_C_CODCF); + _tohide.set(F_C_OBBLIG); + _tohide.set(F_L_CODLISSUCC); + set_search_field(F_O_COD); // impostazione del campo di ricerca + 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_CONDV); // apre la relazione (un unico file) + _msk->set_handler(F_DATACAM, handler_datacam); // imposta l'handler per il campo della data del cambio + _msk->set_handler(F_VALFIN, handler_valfin); // imposta l'handler per il campo di fine validità + _msk->set_handler(F_SEQRIC, handler_seqric); // imposta l'handler per il campo di sequenza di ricerca + } + return (gotcha); +} + +bool TCondizioni_vendita::user_destroy() { + delete _rel; + delete _msk; + return TRUE; +} + +bool TCondizioni_vendita::handler_datacam(TMask_field &fld, KEY k) { + if (k==K_TAB) { // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso + TString datacam(fld.get()); // legge la data di cambio nel campo corrente + if (datacam.not_empty()) { + TMask &m= fld.mask(); // prende la maschera principale + TString codval(m.get(F_CODVAL)); // prende il codice della valuta + if (codval.not_empty()) { + TTable cam("CAM"); // apre la tabella cambi + cam.put("CODTAB", codval << datacam); // riempie la chiave + if (cam.read() == NOERR) m.set(F_CAMBIO, cam.get("R10")); // se la lettura riesce il valore del cambio viene posto nel campo CAMBIO della maschera + } + } + } + return TRUE; +} + +bool TCondizioni_vendita::handler_valfin(TMask_field &fld, KEY k) { + if (k==K_TAB) { + if (fld.get().not_empty()) { + TMask &m= fld.mask(); // prende la maschera principale + if (m.get(F_VALIN).not_empty()) { + TDate valfin(fld.get()); // prende la data di fine validità + TDate valin(m.get(F_VALIN)); // prende la data di inizio validità + if (valfinlfile(); // 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 TCondizioni_vendita::rewrite(const TMask &m) { + m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione + if (_condven != "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 TCondizioni_vendita::init_query_mode(TMask &m) { + for (short i=(short)_tohide.first_one(); i<=(short)_tohide.last_one(); i++) { + if (_tohide[i]) { + if (_msk->field(i).is_edit()) _msk->efield(i).check_type(CHECK_NORMAL); // 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_L_CATVEN).check_type(CHECK_NONE); // ...viene rimosso dal checking... + _msk->disable(F_L_CATVEN); // ...e disabilitato + } + _msk->set(F_TIPO, _condven); // settaggio del campo di tipo archivio +} + +int ve2200(int argc, char* argv[]) { + TCondizioni_vendita a; + + a.run(argc, argv, "Condizioni di vendita "); + return 0; +} diff --git a/ve/ve2300.cpp b/ve/ve2300.cpp index 397ca2b7c..be30ef154 100755 --- a/ve/ve2300.cpp +++ b/ve/ve2300.cpp @@ -1,210 +1,251 @@ - -#include - -#include "ve2300.h" - - - -// !! verificare le disabilitazioni incrociate tra i campi e le loro relative riabilitazioni -// !! durante i cambi di chiave e dei campi con ricerche custom - -class TRighe_condizioni_vendita: public TRelation_application { - TMask *_msk; // maschera principale - TRelation *_rel; // relazione principale - - 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 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 - TBit_array _todisable; // vettore degli identificatori di campi che devono essere disabilitati - - 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 - - warning_box("Questa applicazione non è ancora stata definitivamente debuggata"); // !! rimuovere la warning box a fine debugging - _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_C_TIPOCF); // settaggio dei campi da eliminare... - _tohide.set(F_C_CODCF); - _tohide.set(F_C_COD); - _tohide.set(F_O_COD); - _tohide.set(F_C_RICERCA); - _tohide.set(F_O_RICERCA); - _tohide.set(F_CO_CODLOTTO); - _tohide.set(F_O_ARTES); - set_search_field(F_L_RICERCA); // impostazione del campo di ricerca - _msk->set_handler(F_L_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata - gotcha= TRUE; - break; - case 'C': // contratti - _tohide.set(F_L_CATVEN); // settaggio dei campi da eliminare... - _tohide.set(F_L_COD); - _tohide.set(F_O_COD); - _tohide.set(F_LO_UM); - _tohide.set(F_L_RICERCA); - _tohide.set(F_O_RICERCA); - _tohide.set(F_O_ARTES); - set_search_field(F_C_RICERCA); // impostazione del campo di ricerca - _msk->set_handler(F_C_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata - gotcha= TRUE; - break; - case 'O': // offerte - _tohide.set(F_L_CATVEN); // settaggio dei campi da eliminare... - _tohide.set(F_C_TIPOCF); - _tohide.set(F_C_CODCF); - _tohide.set(F_L_COD); - _tohide.set(F_C_COD); - _tohide.set(F_L_RICERCA); - _tohide.set(F_C_RICERCA); - set_search_field(F_O_RICERCA); // impostazione del campo di ricerca - _msk->set_handler(F_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) - _todisable.reset(); // inizializza il vettore dei campi da disabilitare - _msk->set_handler(F_TIPORIGA, handle_tiporiga); // impostazione dell'handler sul campo di selezione del tipo della riga - } - return (gotcha); -} - -bool TRighe_condizioni_vendita::user_destroy() { - delete _rel; - delete _msk; - return TRUE; -} - -bool TRighe_condizioni_vendita::handle_tiporiga(TMask_field &fld, KEY k) { - if (k==K_TAB) { - TBit_array &_todisable= app()._todisable; // vettore per la disabilitazione dei campi, ricavato dalla proprietà dell'applicazione - TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di indicazione del tipo di archivio - if ((fld.get() != "A") && (_rcondven != "C")) _todisable.set(F_LO_UM); // se il tipo riga è "Articolo" e non siamo sui contratti, l'unità di misura deve essere disabilitata - } - return TRUE; -} - -bool TRighe_condizioni_vendita::handle_cod(TMask_field &fld, KEY k) { - if (k==K_TAB) { - 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_L_CATVEN)); - condv.put("COD", m.get(F_L_COD)); - break; - case 'C': // riempie il resto della chiave dei contratti - condv.put("TIPOCF", m.get(F_C_TIPOCF)); - condv.put("CODCF", m.get(F_C_CODCF)); - condv.put("COD", m.get(F_C_COD)); - break; - case 'O': // riempie il resto della chiave delle offerte - condv.put("COD", m.get(F_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 - TBit_array &_todisable= app()._todisable; // vettore per la disabilitazione dei campi, ricavato dalla proprietà dell'applicazione - _todisable.reset(); // resetta il vettore dei campi da disabilitare - if (!condv.get_bool("GESTUM")) _todisable.set(F_LO_UM); // mette nel vettore di dabilitazione il campo "unità di misura" della maschera (campo chiave) - if (!condv.get_bool("GESTSCAGL")) { - _todisable.set(F_NSCAGL); // mette nel vettore di dabilitazione il campo "n.ro scaglione" della maschera (campo chiave) - m.disable(F_QLIM); // disabilita il campo "quantità limite scaglione" - } - if (!condv.get_bool("GESTSCO")) { - m.disable(F_SCONTO); // disabilita il campo "sconto" - m.disable(F_QOM); // disabilita il campo "quantità art. omaggio" - m.disable(F_QBASE); // disabilita il campo "quantità base x sconto" - m.disable(F_CODARTOM); // disabilita il campo "codice articolo omaggio" - m.disable(F_PROMAGGIO); // disabilita il campo "prezzo omaggio" - m.disable(F_UMOM); // disabilita 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 - } - } - for (i= (short)_todisable.first_one(); i<=(short)_todisable.last_one(); i++) { // ciclo sul vettore dei campi da disabilitare - if (_todisable[i]) { - if (_msk->field(i).is_edit()) _msk->efield(i).check_type(CHECK_NONE); // disabilita il checking sul campo se è editabile - _msk->disable(i); // disabilita il campo - } - } - _msk->set(F_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; -} - + +#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_C_TIPOCF); // settaggio dei campi da eliminare... + _tohide.set(F_C_CODCF); + _tohide.set(F_C_COD); + _tohide.set(F_O_COD); + _tohide.set(F_C_RICERCA); + _tohide.set(F_O_RICERCA); + _tohide.set(F_CO_CODLOTTO); + _tohide.set(F_O_ARTES); + TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente + _catven_on= (toupper(prassid.get("CATVEN_ON")[0])!='T'); // setta il booleano di abilitazione di CATVEN + set_search_field(F_L_RICERCA); // impostazione del campo di ricerca + _msk->set_handler(F_L_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata + gotcha= TRUE; + break; + } + case 'C': // contratti + _tohide.set(F_L_CATVEN); // settaggio dei campi da eliminare... + _tohide.set(F_L_COD); + _tohide.set(F_O_COD); + _tohide.set(F_LO_UM); + _tohide.set(F_L_RICERCA); + _tohide.set(F_O_RICERCA); + _tohide.set(F_O_ARTES); + set_search_field(F_C_RICERCA); // impostazione del campo di ricerca + _msk->set_handler(F_C_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata + gotcha= TRUE; + break; + case 'O': // offerte + _tohide.set(F_L_CATVEN); // settaggio dei campi da eliminare... + _tohide.set(F_C_TIPOCF); + _tohide.set(F_C_CODCF); + _tohide.set(F_L_COD); + _tohide.set(F_C_COD); + _tohide.set(F_L_RICERCA); + _tohide.set(F_C_RICERCA); + set_search_field(F_O_RICERCA); // impostazione del campo di ricerca + _msk->set_handler(F_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_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_CODRIGA_A, F_CODRIGA_G, F_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_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_LO_UM).check_type(CHECK_REQUIRED); // ...l'unità di misura viene attivata al checking... + m.enable(F_LO_UM); // ...e abilitata... + } else { // ...altrimenti, se è stata selezionata una riga non di articoli... + m.efield(F_LO_UM).check_type(CHECK_NONE); // ...l'unità di misura viene rimossa dal checking... + m.disable(F_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_L_CATVEN)); + condv.put("COD", m.get(F_L_COD)); + break; + case 'C': // riempie il resto della chiave dei contratti + condv.put("TIPOCF", m.get(F_C_TIPOCF)); + condv.put("CODCF", m.get(F_C_CODCF)); + condv.put("COD", m.get(F_C_COD)); + break; + case 'O': // riempie il resto della chiave delle offerte + condv.put("COD", m.get(F_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_LO_UM).check_type(CHECK_NONE); // disabilita il checking sul campo "unità di misura" + m.disable(F_LO_UM); // disabilita il campo "unità di misura" + } else { + m.efield(F_LO_UM).check_type(CHECK_REQUIRED); // abilita il checking sul campo "unità di misura" + m.enable(F_LO_UM); // abilita il campo "unità di misura" + } + if (!condv.get_bool("GESTSCAGL")) { + m.efield(F_NSCAGL).check_type(CHECK_NONE); // disabilita il checking sul campo "quantità limite scaglione" + m.disable(F_NSCAGL); // disabilita il campo "quantità limite scaglione" + m.disable(F_QLIM); // disabilita il campo "quantità limite scaglione" + } else { + m.efield(F_NSCAGL).check_type(CHECK_REQUIRED); // abilita il checking sul campo "quantità limite scaglione" + m.enable(F_NSCAGL); // abilita il campo "quantità limite scaglione" + m.enable(F_QLIM); // abilita il campo "quantità limite scaglione" + } + if (!condv.get_bool("GESTSCO")) { + m.disable(F_SCONTO); // disabilita il campo "sconto" + m.disable(F_QOM); // disabilita il campo "quantità art. omaggio" + m.disable(F_QBASE); // disabilita il campo "quantità base x sconto" + m.disable(F_CODARTOM); // disabilita il campo "codice articolo omaggio" + m.disable(F_PROMAGGIO); // disabilita il campo "prezzo omaggio" + m.disable(F_UMOM); // disabilita il campo "unità di misura art. omaggio" + } else { + m.enable(F_SCONTO); // abilita il campo "sconto" + m.enable(F_QOM); // abilita il campo "quantità art. omaggio" + m.enable(F_QBASE); // abilita il campo "quantità base x sconto" + m.enable(F_CODARTOM); // abilita il campo "codice articolo omaggio" + m.enable(F_PROMAGGIO); // abilita il campo "prezzo omaggio" + m.enable(F_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_L_CATVEN).check_type(CHECK_NONE); // ...viene rimosso dal checking... + _msk->disable(F_L_CATVEN); // ...e disabilitato + } + _msk->set(F_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; +} +