campo-sirio/ve/ve2200.cpp
gianluca 15833a6b29 Listini contratti e campagne
git-svn-id: svn://10.65.10.50/trunk@1758 c028cbd2-c16b-5b4b-a496-9718f37d4682
1995-08-31 08:44:37 +00:00

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;
}