Gestione testata (2200) e righe (2300) di listini, contratti, offerte

git-svn-id: svn://10.65.10.50/trunk@1744 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
gianluca 1995-08-29 09:18:45 +00:00
parent ea2ac8f506
commit 7380ec8c03
2 changed files with 462 additions and 421 deletions

View File

@ -1,211 +1,211 @@
#include <relapp.h> #include <relapp.h>
#include <config.h> #include <config.h>
#include <tabutil.h> #include <tabutil.h>
#include "ve2200.h" #include "ve2200.h"
class TCondizioni_vendita: public TRelation_application { class TCondizioni_vendita: public TRelation_application {
TMask *_msk; // maschera principale TMask *_msk; // maschera principale
TRelation *_rel; // relazione principale TRelation *_rel; // relazione principale
TString16 _condven; // stringa che indica il tipo di archivio TString16 _condven; // stringa che indica il tipo di archivio
short _tohide[10]; // vettore degli identificatori di campi che devono essere nascosti 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 bool user_create();
virtual TMask *get_mask(int) { return _msk; } virtual bool user_destroy();
virtual bool changing_mask(int) { return FALSE; } virtual TMask *get_mask(int) { return _msk; }
virtual TRelation *get_relation() const { return _rel; } 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_datacam(TMask_field &, KEY); // handler del campo DATACAM (data cambio)
static bool handler_codlissucc(TMask_field &, KEY); // handler del campo CODLISSUCC (codice listino successivo) static bool handler_valfin(TMask_field &, KEY); // handler del campo VALFIN (data fine validità)
static bool handler_seqric(TMask_field &, KEY); // handler del campo SEQRIC (sequenza di ricerca) 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 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
virtual void init_query_mode(TMask &); // handler chiamato quando la maschera passa in modo ricerca
public:
TCondizioni_vendita() {} public:
virtual ~TCondizioni_vendita() {} TCondizioni_vendita() {}
}; virtual ~TCondizioni_vendita() {}
};
bool TCondizioni_vendita::user_create() {
bool gotcha= FALSE; // booleano di avvenuta inizializzazione 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 _condven= "*"; // inizializzazione dell'indicatore del tipo di archivio
else { if (argc()>2) _condven= argv(2); // se c'è, prende il tipo di archivio dalla linea di comando
TMask choose("VE2200"); // istanzia la maschera di scelta del tipo di archivio else {
if (choose.run() == K_ENTER) _condven= choose.get(F_TIPOCV); // prende il tipo di archivio dalla maschera 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"); _condven.upper(); // rende la stringa upper-case
switch (_condven[0]) { _msk= new TMask("VE2200X");
case 'L': { // listini switch (_condven[0]) {
// settaggio dei campi da eliminare case 'L': { // listini
_tohide[0]= 5; // settaggio dei campi da eliminare
_tohide[1]= F_C_COD; _tohide.set(F_C_COD);
_tohide[2]= F_O_COD; _tohide.set(F_O_COD);
_tohide[3]= F_C_TIPOCF; _tohide.set(F_C_TIPOCF);
_tohide[4]= F_C_CODCF; _tohide.set(F_C_CODCF);
_tohide[5]= F_C_OBBLIG; _tohide.set(F_C_OBBLIG);
set_search_field(F_L_COD); // impostazione del campo di ricerca set_search_field(F_L_COD); // impostazione del campo di ricerca
TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente
if (toupper(prassid.get("CATVEN_ON")[0])!='T') _msk->disable(F_L_CATVEN); // disabilita il campo CATVEN se non è abilitato nella config. _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 _msk->set_handler(F_L_CODLISSUCC, handler_codlissucc); // setta l'handler per il campo di codice successivo
gotcha= TRUE; gotcha= TRUE;
break; break;
} }
case 'C': { // contratti case 'C': // contratti
// settaggio dei campi da eliminare // settaggio dei campi da eliminare
_tohide[0]= 4; _tohide.set(F_L_COD);
_tohide[1]= F_L_COD; _tohide.set(F_O_COD);
_tohide[2]= F_O_COD; _tohide.set(F_L_CATVEN);
_tohide[3]= F_L_CATVEN; _tohide.set(F_L_CODLISSUCC);
_tohide[4]= F_L_CODLISSUCC; set_search_field(F_C_COD); // impostazione del campo di ricerca
set_search_field(F_C_COD); // impostazione del campo di ricerca gotcha= TRUE;
gotcha= TRUE; break;
break; case 'O': // offerte
} // settaggio dei campi da eliminare
case 'O': { // offerte _tohide.set(F_L_COD);
// settaggio dei campi da eliminare _tohide.set(F_C_COD);
_tohide[0]= 7; _tohide.set(F_L_CATVEN);
_tohide[1]= F_L_COD; _tohide.set(F_C_TIPOCF);
_tohide[2]= F_C_COD; _tohide.set(F_C_CODCF);
_tohide[3]= F_L_CATVEN; _tohide.set(F_C_OBBLIG);
_tohide[4]= F_C_TIPOCF; _tohide.set(F_L_CODLISSUCC);
_tohide[5]= F_C_CODCF; set_search_field(F_O_COD); // impostazione del campo di ricerca
_tohide[6]= F_C_OBBLIG; gotcha= TRUE;
_tohide[7]= F_L_CODLISSUCC; break;
set_search_field(F_O_COD); // impostazione del campo di ricerca default: // messaggio di errore se si indica un archivio non valido
gotcha= TRUE; error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza");
break; break;
} }
default: { // messaggio di errore se si indica un archivio non valido if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione
error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza"); _rel= new TRelation(LF_CONDV); // apre la relazione (un unico file)
break; _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
if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione }
_rel= new TRelation(LF_CONDV); // apre la relazione (un unico file) return (gotcha);
_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 bool TCondizioni_vendita::user_destroy() {
} delete _rel;
return (gotcha); delete _msk;
} return TRUE;
}
bool TCondizioni_vendita::user_destroy() {
delete _rel; bool TCondizioni_vendita::handler_datacam(TMask_field &fld, KEY k) {
delete _msk; if (k==K_TAB) { // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso
return TRUE; TString datacam(fld.get()); // legge la data di cambio nel campo corrente
} if (datacam.not_empty()) {
TMask &m= fld.mask(); // prende la maschera principale
bool TCondizioni_vendita::handler_datacam(TMask_field &fld, KEY k) { TString codval(m.get(F_CODVAL)); // prende il codice della valuta
if (k==K_TAB) { // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso if (codval.not_empty()) {
TString datacam(fld.get()); // legge la data di cambio nel campo corrente TTable cam("CAM"); // apre la tabella cambi
if (datacam.not_empty()) { cam.put("CODTAB", codval << datacam); // riempie la chiave
TMask &m= fld.mask(); // prende la maschera principale 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
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 return TRUE;
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 }
}
} bool TCondizioni_vendita::handler_valfin(TMask_field &fld, KEY k) {
} if (k==K_TAB) {
return TRUE; if (fld.get().not_empty()) {
} TMask &m= fld.mask(); // prende la maschera principale
if (m.get(F_VALIN).not_empty()) {
bool TCondizioni_vendita::handler_valfin(TMask_field &fld, KEY k) { TDate valfin(fld.get()); // prende la data di fine validità
if (k==K_TAB) { TDate valin(m.get(F_VALIN)); // prende la data di inizio validità
if (fld.get().not_empty()) { if (valfin<valin) {
TMask &m= fld.mask(); // prende la maschera principale error_box("La data di inizio validità deve essere minore della data di fine");
if (m.get(F_VALIN).not_empty()) { return FALSE;
TDate valfin(fld.get()); // prende la data di fine validità } else return TRUE;
TDate valin(m.get(F_VALIN)); // prende la data di inizio validità } else return TRUE;
if (valfin<valin) { } else return TRUE;
error_box("La data di inizio validità deve essere minore della data di fine"); } else return TRUE;
return FALSE; }
} else return TRUE;
} else return TRUE; bool TCondizioni_vendita::handler_codlissucc(TMask_field &fld, KEY k) {
} else return TRUE; if (k==K_TAB) {
} else return TRUE; TString codlissucc(fld.get()); // prende il codice listino successivo dal campo corrente
} if (codlissucc.not_empty()) {
TMask &m= fld.mask(); // prende la maschera principale
bool TCondizioni_vendita::handler_codlissucc(TMask_field &fld, KEY k) { TString cod(m.get(F_L_COD)); // prende il codice listino corrente dalla maschera
if (k==K_TAB) { if (codlissucc == cod) {
TString codlissucc(fld.get()); // prende il codice listino successivo dal campo corrente error_box("Il codice del listino successivo deve essere diverso dal codice del listino corrente");
if (codlissucc.not_empty()) { return FALSE;
TMask &m= fld.mask(); // prende la maschera principale } else return TRUE;
TString cod(m.get(F_L_COD)); // prende il codice listino corrente dalla maschera } else return TRUE;
if (codlissucc == cod) { } else return TRUE;
error_box("Il codice del listino successivo deve essere diverso dal codice del listino corrente"); }
return FALSE;
} else return TRUE; bool TCondizioni_vendita::handler_seqric(TMask_field &fld, KEY k) {
} else return TRUE; if (k==K_TAB) {
} else return TRUE; TString &seqric= fld.get(); // prende la stringa contenenta la sequenza di ricerca dal campo corrente
} if (seqric.not_empty()) {
bool gotcha= TRUE; // flag di validità della sequenza
bool TCondizioni_vendita::handler_seqric(TMask_field &fld, KEY k) { for (int i=0; i<seqric.len(); i++) {
if (k==K_TAB) { char c= toupper(seqric[i]); // prende la lettera corrente della sequenza
TString &seqric= fld.get(); // prende la stringa contenenta la sequenza di ricerca dal campo corrente if ((c!='A') && (c!='G') && (c!='R')) gotcha= FALSE; // se la lettera non rientra tra quelle possibili abbassa il flag di validità
if (seqric.not_empty()) { for (int j= i+1; j<seqric.len(); j++) if (c== toupper(seqric[j])) gotcha= FALSE; // se la lettera compare anche più avanti nella sequenza abbassa il flag di validitià
bool gotcha= TRUE; // flag di validità della sequenza if (!gotcha) break; // se il flag di validità è basso esce anticipatamente
for (int i=0; i<seqric.len(); i++) { }
char c= toupper(seqric[i]); // prende la lettera corrente della sequenza if (!gotcha) error_box("La sequenza di ricerca deve essere una combinazine di 'A' (Articoli), 'G' (Gruppi merceologici) e 'R' (Raggruppamenti fiscali), in cui ogni lettera compare al massimo una volta");
if ((c!='A') && (c!='G') && (c!='R')) gotcha= FALSE; // se la lettera non rientra tra quelle possibili abbassa il flag di validità return (gotcha);
for (int j= i+1; j<seqric.len(); j++) if (c== toupper(seqric[j])) gotcha= FALSE; // se la lettera compare anche più avanti nella sequenza abbassa il flag di validitià } else return TRUE;
if (!gotcha) break; // se il flag di validità è basso esce anticipatamente } else return TRUE;
} }
if (!gotcha) error_box("La sequenza di ricerca deve essere una combinazine di 'A' (Articoli), 'G' (Gruppi merceologici) e 'R' (Raggruppamenti fiscali), in cui ogni lettera compare al massimo una volta");
return (gotcha); int TCondizioni_vendita::write(const TMask &m) {
} else return TRUE; m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione
} else return TRUE; 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
int TCondizioni_vendita::write(const TMask &m) { f.zero("TIPOCF"); // svuota il campo TIPOCF
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 _rel->write(); // invoca la scrittura della relazione
TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione return (_rel->status()); // ritorna lo stato della relazione
TRectype &r= f.curr(); // prende il record corrente del file principale }
f.zero("TIPOCF"); // svuota il campo TIPOCF
} int TCondizioni_vendita::rewrite(const TMask &m) {
_rel->write(); // invoca la scrittura della relazione m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione
return (_rel->status()); // ritorna lo stato 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
int TCondizioni_vendita::rewrite(const TMask &m) { f.zero("TIPOCF"); // svuota il campo TIPOCF
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 _rel->rewrite(); // invoca la riscrittura della relazione
TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione return (_rel->status()); // ritorna lo stato della relazione
TRectype &r= f.curr(); // prende il record corrente del file principale }
f.zero("TIPOCF"); // svuota il campo TIPOCF
} void TCondizioni_vendita::init_query_mode(TMask &m) {
_rel->rewrite(); // invoca la riscrittura della relazione for (short i=(short)_tohide.first_one(); i<=(short)_tohide.last_one(); i++) {
return (_rel->status()); // ritorna lo stato della relazione 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
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 if (!_catven_on) { // se il booleano di abil. di CATVEN è falso...
_msk->disable(_tohide[i]); // disabilita il campo _msk->efield(F_L_CATVEN).check_type(CHECK_NONE); // ...viene rimosso dal checking...
_msk->hide(_tohide[i]); // rende invisibile il campo _msk->disable(F_L_CATVEN); // ...e disabilitato
} }
_msk->set(F_TIPO, _condven); // settaggio del campo di tipo archivio _msk->set(F_TIPO, _condven); // settaggio del campo di tipo archivio
} }
int ve2200(int argc, char* argv[]) { int ve2200(int argc, char* argv[]) {
TCondizioni_vendita a; TCondizioni_vendita a;
a.run(argc, argv, "Condizioni di vendita "); a.run(argc, argv, "Condizioni di vendita ");
return 0; return 0;
} }

View File

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