269 lines
12 KiB
C++
Executable File
269 lines
12 KiB
C++
Executable File
|
|
#include <relapp.h>
|
|
#include <config.h>
|
|
#include <tabutil.h>
|
|
#include <mailbox.h>
|
|
#include <execp.h>
|
|
#include <utility.h>
|
|
|
|
#include "ve2200.h"
|
|
#include "ve2300x.h" // include anche il file dei campi della maschera delle righe
|
|
|
|
#define RCONDVEN_APP "ve2 -2 " // nome dell'applicazione di gestione delle righe
|
|
|
|
|
|
|
|
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 handle_mask(TMask &, KEY); // handler custom della maschera (per il tasto di aggancio alle righe)
|
|
static bool handle_datacam(TMask_field &, KEY); // handler del campo DATACAM (data cambio)
|
|
static bool handle_valfin(TMask_field &, KEY); // handler del campo VALFIN (data fine validità)
|
|
static bool handle_codlissucc(TMask_field &, KEY); // handler del campo CODLISSUCC (codice listino successivo)
|
|
static bool handle_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() {}
|
|
};
|
|
|
|
|
|
|
|
TCondizioni_vendita &app() { // funzione che ritorna il riferimento alla classe principale dell'applicazione
|
|
return (TCondizioni_vendita &)main_app();
|
|
}
|
|
|
|
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, handle_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(handle_mask); // imposta l'handler generale della maschera
|
|
_msk->set_handler(F_DATACAM, handle_datacam); // imposta l'handler per il campo della data del cambio
|
|
_msk->set_handler(F_VALFIN, handle_valfin); // imposta l'handler per il campo di fine validità
|
|
_msk->set_handler(F_SEQRIC, handle_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::handle_mask(TMask &m, KEY k) {
|
|
if (k==K_F5) { // se viene premuto F5 o selezionato il tasto "Righe" viene lanciata l'applicazione di editing
|
|
TString &_condven= app()._condven; // prende l'indicatore del tipo di archivio
|
|
bool &_catven_on= app()._catven_on; // prende il booleano di attivazione del campo CATVEN
|
|
TString appname(RCONDVEN_APP); // istanzia e inizializza la stringa con il nome dell'applicazione da lanciare
|
|
TString body; // istanzia la stringa contenente il corpo del messaggio (lista di inizializzazione dei campi della maschera)
|
|
switch (_condven[0]) {
|
|
case 'L': // listini
|
|
body << F_R_L_RICERCA; // appende l'id del campo di ricerca
|
|
body << "|"; // appende il separatore
|
|
body << F_R_TIPO << "=" << _condven; // appende il filtro sul tipo
|
|
body << "|"; // appende il separatore
|
|
body << F_R_L_CATVEN << "="; // appende il filtro sulla categoria di vendita...
|
|
if (_catven_on) body << m.get(F_L_CATVEN); // ...
|
|
body << "|"; // appende il separatore
|
|
body << F_R_L_COD << "=" << m.get(F_L_COD); // appende il filtro sul campo codice
|
|
break;
|
|
case 'C': // contratti
|
|
body << F_R_C_RICERCA; // appende l'id del campo di ricerca
|
|
body << "|"; // appende il separatore
|
|
body << F_R_TIPO << "=" << _condven; // appende il filtro sul tipo
|
|
body << "|"; // appende il separatore
|
|
body << F_R_C_TIPOCF << "=" << m.get(F_C_TIPOCF); // appende il filtro sul campo tipo cliente/fornitore
|
|
body << "|"; // appende il separatore
|
|
body << F_R_C_CODCF << "=" << m.get(F_C_CODCF); // appende il filtro sul campo codice cliente/fornitore
|
|
body << "|"; // appende il separatore
|
|
body << F_R_C_COD << "=" << m.get(F_C_COD); // appende il filtro sul campo codice
|
|
break;
|
|
case 'O': // offerte
|
|
body << F_R_O_RICERCA; // appende l'id del campo di ricerca
|
|
body << "|"; // appende il separatore
|
|
body << F_R_TIPO << "=" << _condven; // appende il filtro sul tipo
|
|
body << "|"; // appende il separatore
|
|
body << F_R_O_COD << "=" << m.get(F_O_COD); // appende il filtro sul campo codice
|
|
break;
|
|
}
|
|
appname << _condven; // aggiunge al lancio dell'applicazione la selezione del tipo di archivio
|
|
TMessage msg(cmd2name(appname), MSG_FS, (const char *)body); // istanzia il messaggio per l'applicazione
|
|
msg.send(); // invia il messaggio all'applicazione
|
|
TExternal_app ve2_3(appname); // istanzia l'applicazione esterna...
|
|
ve2_3.run(); // ...la lancia e rimane in attesa del suo termine
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_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::handle_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 (valfin<valin) {
|
|
error_box("La data di inizio validità deve essere minore della data di fine");
|
|
return FALSE;
|
|
} else return TRUE;
|
|
} else return TRUE;
|
|
} else return TRUE;
|
|
} else return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_codlissucc(TMask_field &fld, KEY k) {
|
|
if (k==K_TAB) {
|
|
TString codlissucc(fld.get()); // prende il codice listino successivo dal campo corrente
|
|
if (codlissucc.not_empty()) {
|
|
TMask &m= fld.mask(); // prende la maschera principale
|
|
TString cod(m.get(F_L_COD)); // prende il codice listino corrente dalla maschera
|
|
if (codlissucc == cod) {
|
|
error_box("Il codice del listino successivo deve essere diverso dal codice del listino corrente");
|
|
return FALSE;
|
|
} else return TRUE;
|
|
} else return TRUE;
|
|
} else return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_seqric(TMask_field &fld, KEY k) {
|
|
if (k==K_TAB) {
|
|
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
|
|
for (int i=0; i<seqric.len(); i++) {
|
|
char c= toupper(seqric[i]); // prende la lettera corrente della sequenza
|
|
if ((c!='A') && (c!='G') && (c!='R')) gotcha= FALSE; // se la lettera non rientra tra quelle possibili abbassa il flag di validità
|
|
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à
|
|
if (!gotcha) break; // se il flag di validità è basso esce anticipatamente
|
|
}
|
|
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);
|
|
} else return TRUE;
|
|
} else return TRUE;
|
|
}
|
|
|
|
int TCondizioni_vendita::write(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->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;
|
|
}
|