From 4fe9b183f521ab54630eed69beb469d6aa6ddaec Mon Sep 17 00:00:00 2001 From: gianluca Date: Mon, 25 Sep 1995 15:36:30 +0000 Subject: [PATCH] Modifiche a gestione sconti, contratti, offerte, listini. Aggiunte stampe. git-svn-id: svn://10.65.10.50/trunk@1890 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve1.url | 27 +++ ve/ve2100.cpp | 189 ++++++++--------- ve/ve2200.cpp | 556 +++++++++++++++++++++++++------------------------ ve/ve2200x.h | 6 +- ve/ve2200x.uml | 54 +++-- ve/ve2300.cpp | 521 +++++++++++++++++++++++---------------------- ve/ve2300x.uml | 32 +-- ve/ve3.cpp | 8 +- ve/ve3200.cpp | 208 ++++++++++++++++++ ve/ve3200.h | 6 +- ve/ve3200.uml | 43 ++-- ve/ve3200x.h | 1 + ve/ve3200x.uml | 458 ++++++++++++++++++++++++++++++++++++++++ 13 files changed, 1421 insertions(+), 688 deletions(-) create mode 100755 ve/ve1.url create mode 100755 ve/ve3200.cpp create mode 100755 ve/ve3200x.h create mode 100755 ve/ve3200x.uml diff --git a/ve/ve1.url b/ve/ve1.url new file mode 100755 index 000000000..de03fa2f8 --- /dev/null +++ b/ve/ve1.url @@ -0,0 +1,27 @@ +#include + +MENU TASK_MENUBAR +SUBMENU MENU_FILE "~File" +ITEM BAR_ITEM(1) "~Parametri" + + +MENUBAR MENU_BAR(1) + + MENU MENU_BAR(1) + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + + MENUBAR MENU_BAR(2) + + MENU MENU_BAR(2) + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + MENUBAR MENU_BAR(3) + + MENU MENU_BAR(3) + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + diff --git a/ve/ve2100.cpp b/ve/ve2100.cpp index f39271dd0..5ca72272d 100755 --- a/ve/ve2100.cpp +++ b/ve/ve2100.cpp @@ -1,100 +1,89 @@ - -#include -#include - -#include "ve2100.h" - - - -class TTabelle_sconti: public TRelation_application { - TMask *_msk; // maschera principale - TRelation *_rel; // relazione principale - - char _sconti; // carattere che indica il tipo di tabella - short _sci_k_id[4]; // vettore degli identificatori dei campi chiave per la maschera degli sconti incondizionati - bool _sci_k_enabled[4]; // vettore di abilitazione dei campi chiave per la maschera degli sconti incondizionati - - 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; } - - virtual void init_query_mode(TMask &); // handler chiamato quando la maschera passa in modo ricerca - -public: - TTabelle_sconti() {} - virtual ~TTabelle_sconti() {} -}; - - - -bool TTabelle_sconti::user_create() { - bool gotcha= FALSE; // booleano di avvenuta inizializzazione - - _sconti= '*'; // inizializzazione dell'indicatore del tipo di tabella - if (argc()>2) _sconti= toupper((argv(2))[0]); // se c'è, prende il tipo di tabella dalla linea di comando - else { - TMask choose("VE2100"); // istanzia la maschera di scelta del tipo di tabella - if (choose.run() == K_ENTER) _sconti= toupper((choose.get(F_TIPOSC))[0]); // prende il tipo di tabella dalla maschera - } - switch (_sconti) { - case 'D': { // sconti documento - _msk= new TMask("VE2100D"); // apre la maschera relativa - gotcha= TRUE; - break; - } - case 'R': { // sconti di riga - _msk= new TMask("VE2100R"); // apre la maschera relativa - set_search_field(F_R_RICERCA); // setta il campo di ricerca - gotcha= TRUE; - break; - } - case 'I': { // sconti incondizionati - _msk= new TMask("VE2100I"); // apre la maschera relativa - set_search_field(F_I_RICERCA); // setta il campo di ricerca - TConfig prassid(CONFIG_DITTA); // apre il file di configurazione di ditta - _sci_k_id[0]= F_I_CATVEN; // inizializza l'array dei campi da disabilitare condizionalmente - _sci_k_id[1]= F_I_SCCLIENTI; - _sci_k_id[2]= F_I_ZONE; - _sci_k_id[3]= F_I_CONDPAG; - for (int i=0; i<4; i++) { - if (prassid.get("SCOKEY", "ve", i).empty()) _sci_k_enabled[i]= FALSE; // se nel file di config. il campo non è abilitato, viene indicato nel vettore di abilitazione - else _sci_k_enabled[i]= gotcha= TRUE; // se c'è almeno un campo abilitato "gotcha" esce TRUE dal ciclo - } - if (!gotcha) error_box("Non ci sono campi chiave abilitati nella configurazione della ditta"); - break; - } - default: { // messaggio di errore se si indica una tabella non valida - error_box("Indicare la tabella sulla linea di comando (D, R o I) oppure selezionarla dalla maschera di partenza"); - break; - } - } - if (gotcha) _rel= new TRelation(LF_SCONTI); // se è stata selezionata una tabella, apre la relazione (un unico file) - return (gotcha); -} - -bool TTabelle_sconti::user_destroy() { - delete _rel; - delete _msk; - return TRUE; -} - -void TTabelle_sconti::init_query_mode(TMask &m) { - for (int i=0; i<4; i++) { - if (_sci_k_enabled[i]) { // se il campo deve essere abilitato... - m.enable(_sci_k_id[i]); // ...lo abilita... - m.efield(_sci_k_id[i]).check_type(CHECK_REQUIRED); // ...e lo rende richiesto... - } else { // ...altrimenti... - m.disable(_sci_k_id[i]); // ...lo disabilita... - m.efield(_sci_k_id[i]).check_type(CHECK_NORMAL); // ...e lo rende non richiesto - } - } -} - -int ve2100(int argc, char* argv[]) { - TTabelle_sconti a; - - a.run(argc, argv, "Tabella sconti "); - return 0; -} + +#include +#include + +#include "ve2100.h" + +#define KILL(x) { _msk->field(x).reset_key(1); _msk->disable(x); } +#define REVIVE(x) { _msk->field(x).set_key(1); _msk->enable(x); } + + + +class TTabelle_sconti: public TRelation_application { + TMask *_msk; // maschera principale + TRelation *_rel; // relazione principale + + char _sconti; // carattere che indica il tipo di tabella + + 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; } + +public: + TTabelle_sconti() {} + virtual ~TTabelle_sconti() {} +}; + + + +bool TTabelle_sconti::user_create() { + bool gotcha= FALSE; // booleano di avvenuta inizializzazione + short sci_k_id[4]; // vettore degli identificatori dei campi chiave per la maschera degli sconti incondizionati + int i; // indice di ciclo + + _sconti= '*'; // inizializzazione dell'indicatore del tipo di tabella + if (argc()>2) _sconti= toupper((argv(2))[0]); // se c'è, prende il tipo di tabella dalla linea di comando + else { + TMask choose("VE2100"); // istanzia la maschera di scelta del tipo di tabella + if (choose.run() == K_ENTER) _sconti= toupper((choose.get(F_TIPOSC))[0]); // prende il tipo di tabella dalla maschera + } + TConfig prassid(CONFIG_DITTA); // apre il file di configurazione di ditta + switch (_sconti) { + case 'D': // sconti documento + _msk= new TMask("VE2100D"); // apre la maschera relativa + gotcha= TRUE; + break; + case 'R': // sconti di riga + _msk= new TMask("VE2100R"); // apre la maschera relativa + set_search_field(F_R_RICERCA); // setta il campo di ricerca + gotcha= TRUE; + break; + case 'I': // sconti incondizionati + _msk= new TMask("VE2100I"); // apre la maschera relativa + set_search_field(F_I_RICERCA); // setta il campo di ricerca + sci_k_id[0]= F_I_CATVEN; // inizializza l'array dei campi da disabilitare condizionalmente + sci_k_id[1]= F_I_SCCLIENTI; + sci_k_id[2]= F_I_ZONE; + sci_k_id[3]= F_I_CONDPAG; + for (i=0; i<4; i++) { + if (prassid.get_bool("ScoKey", "ve", i)) { // se nel file di config. il campo è abilitato... + REVIVE(sci_k_id[i]); // ...il campo viene abilitato anche sulla maschera... + gotcha= TRUE; // ...e viene settato il flag di ok + } else KILL(sci_k_id[i]); // se nel file di config. il campo non è abilitato viene disabilitato anche sulla maschera + } + if (!gotcha) error_box("Non ci sono campi chiave abilitati nella configurazione della ditta"); + break; + default: // messaggio di errore se si indica una tabella non valida + error_box("Indicare la tabella sulla linea di comando (D, R o I) oppure selezionarla dalla maschera di partenza"); + break; + } + if (gotcha) _rel= new TRelation(LF_SCONTI); // se è stata selezionata una tabella, apre la relazione (un unico file) + return (gotcha); +} + +bool TTabelle_sconti::user_destroy() { + delete _rel; + delete _msk; + return TRUE; +} + + + +int ve2100(int argc, char* argv[]) { + TTabelle_sconti a; + + a.run(argc, argv, "Tabella sconti "); + return 0; +} diff --git a/ve/ve2200.cpp b/ve/ve2200.cpp index b0e512d70..124ab7df4 100755 --- a/ve/ve2200.cpp +++ b/ve/ve2200.cpp @@ -1,268 +1,288 @@ - -#include -#include -#include -#include -#include -#include - -#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= (prassid.get_bool("CODLISCV")); // 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_2(appname); // istanzia l'applicazione esterna... - ve2_2.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 (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; -} + +#include +#include +#include +#include +#include +#include + +#include "ve2200.h" +#include "ve2300x.h" // include anche il file dei campi della maschera delle righe +#include "veconf.h" + +#define RCONDVEN_APP "ve2 -2 " // nome dell'applicazione di gestione delle righe +#define DESTROY(x) { _msk->field(x).reset_key(1); _msk->hide(x); } +#define KILL(x) { _msk->field(x).reset_key(1); _msk->disable(x); } + + + +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 _codlis_catven; // booleano di abilitazione della categoria di vendita nella chiave dei listini + bool _gest_val, _gest_um, _gest_sca, _gest_so; // booleani per l'abilitazione di valute, unità di misura, scaglioni e sconti/omaggi + + 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_codsucc(TMask_field &, KEY); // handler del campo CODSUCC (codice successivo) + + 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 bool remove(); // metodo usato per cancellare il record sul file + + 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"); + TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente + switch (_condven[0]) { + case 'L': { // listini + if (!(prassid.get_bool("Ges", NULL, A_LISTINI))) error_box("L'archivio Listini non è abilititato"); // controlla che l'archivio listini sia abilitato + else { + // eliminazione campi di altri archivi + DESTROY(F_C_COD); + DESTROY(F_O_COD); + DESTROY(F_C_TIPOCF); + DESTROY(F_C_CODCF); + DESTROY(F_C_OBBLIG); + set_search_field(F_L_COD); // impostazione del campo di ricerca + _msk->set_handler(F_LC_CODSUCC, handle_codsucc); // setta l'handler per il campo di codice successivo + _codlis_catven= prassid.get_bool("CodLisCV"); // setta il booleano di abilitazione delle categoria di vendita + if (!_codlis_catven) KILL(F_L_CATVEN); // disabilita condizionalmente le categorie di vendita + _gest_um= prassid.get_bool("GesUM", NULL, A_LISTINI); // setta il booleano di abilitazione delle unità di misura + _gest_sca= prassid.get_bool("GesSca", NULL, A_LISTINI); // setta il booleano di abilitazione degli scaglioni + _gest_so= prassid.get_bool("GesSO", NULL, A_LISTINI); // setta il booleano di abilitazione degli sconti/omaggi + gotcha= TRUE; + } + break; + } + case 'C': // contratti + if (!(prassid.get_bool("Ges", NULL, A_CONTRATTI))) error_box("L'archivio Contratti non è abilititato"); // controlla che l'archivio listini sia abilitato + else { + // settaggio dei campi da eliminare + DESTROY(F_L_COD); + DESTROY(F_O_COD); + DESTROY(F_L_CATVEN); + DESTROY(F_LC_CODSUCC); + set_search_field(F_C_COD); // impostazione del campo di ricerca + _gest_um= prassid.get_bool("GesUM", NULL, A_CONTRATTI); // setta il booleano di abilitazione delle unità di misura + _gest_sca= prassid.get_bool("GesSca", NULL, A_CONTRATTI); // setta il booleano di abilitazione degli scaglioni + _gest_so= prassid.get_bool("GesSO", NULL, A_CONTRATTI); // setta il booleano di abilitazione degli sconti/omaggi + gotcha= TRUE; + } + break; + case 'O': // offerte + if (!(prassid.get_bool("Ges", NULL, A_OFFERTE))) error_box("L'archivio Offerte non è abilititato"); // controlla che l'archivio listini sia abilitato + else { + // settaggio dei campi da eliminare + DESTROY(F_L_COD); + DESTROY(F_C_COD); + DESTROY(F_L_CATVEN); + DESTROY(F_C_TIPOCF); + DESTROY(F_C_CODCF); + DESTROY(F_C_OBBLIG); + set_search_field(F_O_COD); // impostazione del campo di ricerca + _msk->set_handler(F_LC_CODSUCC, handle_codsucc); // setta l'handler per il campo di codice successivo + _gest_um= prassid.get_bool("GesUM", NULL, A_OFFERTE); // setta il booleano di abilitazione delle unità di misura + _gest_sca= prassid.get_bool("GesSca", NULL, A_OFFERTE); // setta il booleano di abilitazione degli scaglioni + _gest_so= prassid.get_bool("GesSO", NULL, A_OFFERTE); // setta il booleano di abilitazione degli sconti/omaggi + 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(F_TIPO, _condven); // settaggio del campo di tipo archivio + _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à + if (!_gest_um) _msk->disable(F_GESTUM); // disabilita condizionalmente il booleano di gestione delle unità di misura + if (!_gest_sca) _msk->disable(F_GESTSCAGL); // disabilita condizionalmente il booleano di gestione degli scaglioni + if (!_gest_so) _msk->disable(F_GESTSCO); // disabilita condizionalmente il booleano di gestione degli sconti/omaggi + _gest_val= prassid.get_bool("GesVal"); // legge il booleano di abilitazione delle gastione delle valute + if (!_gest_val) { // se la gestione delle valute è disabilitata i campi di gestione vengono disabilitati + _msk->disable(F_CODVAL); + _msk->disable(F_CAMBIO); + _msk->disable(F_DATACAM); + } + } + 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 &_codlis_catven= app()._codlis_catven; // 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 << F_R_TIPO << "=" << _condven << "|"; // appende il filtro sul tipo + body << F_R_L_CATVEN << "=" << ((_codlis_catven)?(m.get(F_L_CATVEN)):("")) << "|"; // appende il filtro sulla categoria di vendita + 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 << F_R_TIPO << "=" << _condven << "|"; // appende il filtro sul tipo + body << F_R_C_TIPOCF << "=" << m.get(F_C_TIPOCF) << "|"; // appende il filtro sul campo tipo cliente/fornitore + body << F_R_C_CODCF << "=" << m.get(F_C_CODCF) << "|"; // appende il filtro sul campo codice cliente/fornitore + 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 << F_R_TIPO << "=" << _condven << "|"; // appende il filtro sul tipo + 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_2(appname); // istanzia l'applicazione esterna... + ve2_2.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 (valfinlfile(); // prende il file principale della relazione + if (_condven != "C") f.zero("TIPOCF"); // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file + _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 + TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione + if (_condven != "C") f.zero("TIPOCF"); // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file + _rel->rewrite(); // invoca la riscrittura della relazione + return (_rel->status()); // ritorna lo stato della relazione +} + +bool TCondizioni_vendita::remove() { + TLocalisamfile &condv= _rel->lfile(); // prende il file della testata dalla relazione principale + TLocalisamfile rcondv(LF_RCONDV); // apre il file delle righe per ottenenre il record corrente + TRectype delrec(rcondv.curr()); // istanzia il record basato sul file delle righe, da usare come campione + delrec.zero(); // svuota il record campione + delrec.put("TIPO", _condven); // setta il tipo di archivio + delrec.put("COD", condv.get("COD")); // setta il codice della testata + if ((_condven=="L") && _codlis_catven) delrec.put("CATVEN", condv.get("CATVEN")); // setta la categoria di vendita se è abilitata e siamo nei listini + if (_condven=="C") { + delrec.put("TIPOCF", condv.get("TIPOCF")); // setta i dati del cliente/fornitore se siamo nei contratti + delrec.put("CODCF", condv.get("CODCF")); + } + TRelation delrel(LF_RCONDV); // istanzia una relazione sulle righe + TCursor delcur(&delrel, "", 1, &delrec, &delrec); // istanzia il cursore di cancellazione sulla relazione delle righe + long n= delcur.items(); // legge il numero di elementi del cursore + delcur.freeze(); // congela il cursore al suo stato attuale + bool proceed= FALSE; // istanzia il booleano di conferma alla cancellazione + if (n==1) proceed= yesno_box("Esiste una riga collegata a questa testata: verrà anch'essa cancellata. Procedo?"); // viene richiesta conferma alla cancellazione della riga... + if (n>1) proceed= yesno_box("Esistono %ld righe collegate a questa testata: verranno anch'esse cancellate. Procedo?", n); // ...o delle righe + if (proceed) { // se si conferma le righe vengono cancellate + TLocalisamfile &delfile= delcur.file(); // prende riferimento al file delle righe dal cursore + for (delcur=0; delcur.pos()TIPO - FLAG "DU" + FLAG "DUP" KEY 1 CHECKTYPE REQUIRED END @@ -141,8 +141,8 @@ BEGIN DISPLAY "Valuta" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT F_CODVAL CODTAB - MESSAGE ENABLE,F_CAMBIO|ENABLE,F_DATACAM - MESSAGE EMPTY "1",F_CAMBIO|DISABLE,F_CAMBIO|CLEAR,F_DATACAM|DISABLE,F_DATACAM + MESSAGE ENABLE,F_CAMBIO|ENABLE,F_DATACAM|DISABLE,F_IMPLORDI + MESSAGE EMPTY "1",F_CAMBIO|DISABLE,F_CAMBIO|CLEAR,F_DATACAM|DISABLE,F_DATACAM|ENABLE,F_IMPLORDI END NUMBER F_CAMBIO 15 5 @@ -206,33 +206,63 @@ BEGIN FIELD LF_CONDV->OBBLIG END -STRING F_SEQRIC 3 +LIST F_SEQRIC_1 8 BEGIN - PROMPT 2 17 "Sequenza ricerca " - FIELD LF_CONDV->SEQRIC - FLAG "U" + PROMPT 2 16 "Sequenza ricerca " + FIELD LF_CONDV->SEQRIC[1,1] + ITEM "A|Articoli" + ITEM "G|Gr. Merc" + ITEM "R|Rag. Fis" + VALIDATE STR_EXPR (#THIS_FIELD!=#F_SEQRIC_2)&&(#THIS_FIELD!=#F_SEQRIC_3) + WARNING "La sequenza di ricerca deve indicare tre tipi diversi di righe" +END + +LIST F_SEQRIC_2 8 +BEGIN + PROMPT 32 16 "" + FIELD LF_CONDV->SEQRIC[2,2] + ITEM "-|Nessuno" + ITEM "A|Articoli" + ITEM "G|Gr. Merc" + ITEM "R|Rag. Fis" + VALIDATE STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_SEQRIC_1)&&(#THIS_FIELD!=#F_SEQRIC_3)) + WARNING "La sequenza di ricerca deve indicare tre tipi diversi di righe" +END + +LIST F_SEQRIC_3 8 +BEGIN + PROMPT 45 16 "" + FIELD LF_CONDV->SEQRIC[3,3] + ITEM "-|Nessuno" + ITEM "A|Articoli" + ITEM "G|Gr. Merc" + ITEM "R|Rag. Fis" + VALIDATE STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_SEQRIC_1)&&(#THIS_FIELD!=#F_SEQRIC_2)) + WARNING "La sequenza di ricerca deve indicare tre tipi diversi di righe" END // campo riservato ai listini -STRING F_L_CODLISSUCC 3 +STRING F_LC_CODSUCC 3 BEGIN - PROMPT 33 17 "Codice listino succ. " + PROMPT 2 17 "Codice successivo " FIELD LF_CONDV->CODLISSUCC FLAG "U" USE LF_CONDV INPUT TIPO F_TIPO SELECT INPUT CATVEN F_L_CATVEN SELECT - INPUT COD F_L_CODLISSUCC + INPUT TIPOCF F_C_TIPOCF SELECT + INPUT CODCF F_C_CODCF SELECT + INPUT COD F_LC_CODSUCC DISPLAY "Codice" COD DISPLAY "Descrizione@50" DESCR - OUTPUT F_L_CODLISSUCC COD + OUTPUT F_LC_CODSUCC COD CHECKTYPE NORMAL END // bottone di lancio dell'applicazione delle righe BUTTON BTN_RIGHE 63 1 BEGIN - PROMPT 0 -1 "Editing delle righe di questa testata" + PROMPT 0 -1 "Righe di questa testata" MESSAGE K_F5 END diff --git a/ve/ve2300.cpp b/ve/ve2300.cpp index 85ec60e56..c71c21fbd 100755 --- a/ve/ve2300.cpp +++ b/ve/ve2300.cpp @@ -1,253 +1,268 @@ - -#include -#include - -#include "ve2300.h" - - - -class TRighe_condizioni_vendita: public TRelation_application { - TMask *_msk; // maschera principale - TRelation *_rel; // relazione principale - - bool _catven_on; // booleano di abilitazione del campo CATVEN - - virtual bool user_create(); - virtual bool user_destroy(); - virtual TMask *get_mask(int) { return _msk; } - virtual bool changing_mask(int) { return FALSE; } - virtual TRelation *get_relation() const { return _rel; } - - static void hide_and_show_codriga(TMask &); // procedura di abilitazione/disabilitazione dei tre campi CODRIGA (codice riga) - - static bool handle_tiporiga(TMask_field &, KEY); // handler del campo TIPORIGA (articolo, gruppo merc., ragg. fiscale) - static bool handle_cod(TMask_field &, KEY); // handler del campo COD (codice listino, numero contratto, codice offerta) - - virtual int write(const TMask &); // metodo usato per scrivere il record sul file - virtual int rewrite(const TMask &); // metodo usato per aggiornare il record sul file - - virtual void init_query_mode(TMask &); // handler chiamato quando la maschera passa in modo ricerca - -public: - TString16 _rcondven; // stringa che indica il tipo di archivio - TBit_array _tohide; // vettore degli identificatori di campi che devono essere nascosti - - TRighe_condizioni_vendita() {} - virtual ~TRighe_condizioni_vendita() {} -}; - - - -TRighe_condizioni_vendita &app() { // funzione che ritorna il riferimento alla classe principale dell'applicazione - return (TRighe_condizioni_vendita &)main_app(); -} - -bool TRighe_condizioni_vendita::user_create() { - bool gotcha= FALSE; // booleano di avvenuta inizializzazione - - _rcondven= "*"; // inizializzazione dell'indicatore del tipo di archivio - if (argc()>2) { // se c'è, prende il tipo di archivio dalla linea di comando - TString temp(argv(2)); - _rcondven= temp.left(1); // prende solo il primo carattere - } else { - TMask choose("VE2300"); // istanzia la maschera di scelta del tipo di archivio - if (choose.run() == K_ENTER) _rcondven= choose.get(F_TIPORCV); // prende il tipo di archivio dalla maschera - } - _rcondven.upper(); // rende la stringa upper-case - _msk= new TMask("VE2300X"); - _tohide.reset(); // resetta il vettore dei campi da eliminare - switch (_rcondven[0]) { - case 'L': { // listini - _tohide.set(F_R_C_TIPOCF); // settaggio dei campi da eliminare... - _tohide.set(F_R_C_CODCF); - _tohide.set(F_R_C_COD); - _tohide.set(F_R_O_COD); - _tohide.set(F_R_C_RICERCA); - _tohide.set(F_R_O_RICERCA); - _tohide.set(F_R_CO_CODLOTTO); - _tohide.set(F_R_O_ARTES); - TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente - _catven_on= prassid.get_bool("GESLISCV"); // setta il booleano di abilitazione di CATVEN - set_search_field(F_R_L_RICERCA); // impostazione del campo di ricerca - _msk->set_handler(F_R_L_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata - gotcha= TRUE; - break; - } - case 'C': // contratti - _tohide.set(F_R_L_CATVEN); // settaggio dei campi da eliminare... - _tohide.set(F_R_L_COD); - _tohide.set(F_R_O_COD); - _tohide.set(F_R_LO_UM); - _tohide.set(F_R_L_RICERCA); - _tohide.set(F_R_O_RICERCA); - _tohide.set(F_R_O_ARTES); - set_search_field(F_R_C_RICERCA); // impostazione del campo di ricerca - _msk->set_handler(F_R_C_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata - gotcha= TRUE; - break; - case 'O': // offerte - _tohide.set(F_R_L_CATVEN); // settaggio dei campi da eliminare... - _tohide.set(F_R_C_TIPOCF); - _tohide.set(F_R_C_CODCF); - _tohide.set(F_R_L_COD); - _tohide.set(F_R_C_COD); - _tohide.set(F_R_L_RICERCA); - _tohide.set(F_R_C_RICERCA); - set_search_field(F_R_O_RICERCA); // impostazione del campo di ricerca - _msk->set_handler(F_R_O_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata - gotcha= TRUE; - break; - default: // messaggio di errore se si indica un archivio non valido - error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza"); - break; - } - if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione - _rel= new TRelation(LF_RCONDV); // apre la relazione (un unico file) - _msk->set_handler(F_R_TIPORIGA, handle_tiporiga); // impostazione dell'handler sul campo di selezione del tipo della riga - hide_and_show_codriga(*_msk); // invoca la procedura di controllo della mutua esclusione dei tre campi CODRIGA - } - return (gotcha); -} - -bool TRighe_condizioni_vendita::user_destroy() { - delete _rel; - delete _msk; - return TRUE; -} - -void TRighe_condizioni_vendita::hide_and_show_codriga(TMask &m) { - short id_campi[3]= { F_R_CODRIGA_A, F_R_CODRIGA_G, F_R_CODRIGA_R }; // vettore degli identificatori dei tre campi CODRIGA in mutua esclusione - char tag_campi[3]= { 'A', 'G', 'R' }; // vettore dei tag di TIPORIGA per i tre campi CODRIGA in mutua esclusione - char tag_campo= m.get(F_R_TIPORIGA)[0]; // prende il tag in TIPORIGA del campo da abilitare - TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di tipo di archivio - TBit_array &_tohide= app()._tohide; // prende il riferimento all'array di campi da eliminare - for (int i=0; i<3; i++) { // ciclo sui tre campi CODRIGA - if (tag_campo == tag_campi[i]) { // il campo indicato con il tag viene... - m.efield(id_campi[i]).check_type(CHECK_REQUIRED); // ...abilitato al checking... - m.show(id_campi[i]); // ...mostrato... - _tohide.reset(id_campi[i]); // ...e rimosso dal vettore di eliminazione... - } else { // ...mentre gli altri vengono... - m.efield(id_campi[i]).check_type(CHECK_NONE); // ...disabilitati dal checking... - m.hide(id_campi[i]); // ...nascosti... - _tohide.set(id_campi[i]); // ...e aggiunti al vettore di eliminazione - } - } - if (_rcondven != "C") { // se non stiamo lavorando sui contratti... - if (tag_campo=='A') { // ...ed è stata selezionata una riga di articoli... - m.efield(F_R_LO_UM).check_type(CHECK_REQUIRED); // ...l'unità di misura viene attivata al checking... - m.enable(F_R_LO_UM); // ...e abilitata... - } else { // ...altrimenti, se è stata selezionata una riga non di articoli... - m.efield(F_R_LO_UM).check_type(CHECK_NONE); // ...l'unità di misura viene rimossa dal checking... - m.disable(F_R_LO_UM); // ...e disabilitata - } - } -} - -bool TRighe_condizioni_vendita::handle_tiporiga(TMask_field &fld, KEY k) { - if (k==K_TAB) hide_and_show_codriga(fld.mask()); // invoca la procedura di controllo della mutua esclusione dei tre campi CODRIGA - return TRUE; -} - -bool TRighe_condizioni_vendita::handle_cod(TMask_field &fld, KEY k) { - if ((k==K_TAB) && fld.get().not_empty()) { - TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di indicazione del tipo di archivio - TMask &m= fld.mask(); // prende la maschera principale - TLocalisamfile condv(LF_CONDV); // apre il file della testata (condizioni di vendita) - condv.put("TIPO", _rcondven); // riempie il campo "TIPO" - switch (_rcondven[0]) { - case 'L': // riempie il resto della chiave dei listini - condv.put("CATVEN", m.get(F_R_L_CATVEN)); - condv.put("COD", m.get(F_R_L_COD)); - break; - case 'C': // riempie il resto della chiave dei contratti - condv.put("TIPOCF", m.get(F_R_C_TIPOCF)); - condv.put("CODCF", m.get(F_R_C_CODCF)); - condv.put("COD", m.get(F_R_C_COD)); - break; - case 'O': // riempie il resto della chiave delle offerte - condv.put("COD", m.get(F_R_O_COD)); - break; - } - if (condv.read()==NOERR) { // se la lettura è andata a buon fine abilita/disabilita i campi della maschera in base ai booleani della testata - if (!condv.get_bool("GESTUM")) { - m.efield(F_R_LO_UM).check_type(CHECK_NONE); // disabilita il checking sul campo "unità di misura" - m.disable(F_R_LO_UM); // disabilita il campo "unità di misura" - } else { - m.efield(F_R_LO_UM).check_type(CHECK_REQUIRED); // abilita il checking sul campo "unità di misura" - m.enable(F_R_LO_UM); // abilita il campo "unità di misura" - } - if (!condv.get_bool("GESTSCAGL")) { - m.efield(F_R_NSCAGL).check_type(CHECK_NONE); // disabilita il checking sul campo "quantità limite scaglione" - m.disable(F_R_NSCAGL); // disabilita il campo "quantità limite scaglione" - m.disable(F_R_QLIM); // disabilita il campo "quantità limite scaglione" - } else { - m.efield(F_R_NSCAGL).check_type(CHECK_REQUIRED); // abilita il checking sul campo "quantità limite scaglione" - m.enable(F_R_NSCAGL); // abilita il campo "quantità limite scaglione" - m.enable(F_R_QLIM); // abilita il campo "quantità limite scaglione" - } - if (!condv.get_bool("GESTSCO")) { - m.disable(F_R_SCONTO); // disabilita il campo "sconto" - m.disable(F_R_QOM); // disabilita il campo "quantità art. omaggio" - m.disable(F_R_QBASE); // disabilita il campo "quantità base x sconto" - m.disable(F_R_CODARTOM); // disabilita il campo "codice articolo omaggio" - m.disable(F_R_PROMAGGIO); // disabilita il campo "prezzo omaggio" - m.disable(F_R_UMOM); // disabilita il campo "unità di misura art. omaggio" - } else { - m.enable(F_R_SCONTO); // abilita il campo "sconto" - m.enable(F_R_QOM); // abilita il campo "quantità art. omaggio" - m.enable(F_R_QBASE); // abilita il campo "quantità base x sconto" - m.enable(F_R_CODARTOM); // abilita il campo "codice articolo omaggio" - m.enable(F_R_PROMAGGIO); // abilita il campo "prezzo omaggio" - m.enable(F_R_UMOM); // abilita il campo "unità di misura art. omaggio" - } - return TRUE; - } else { - error_box("Non esiste una testata corrispondente alla chiave specificata"); - return FALSE; - } - } else return TRUE; -} - -int TRighe_condizioni_vendita::write(const TMask &m) { - m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione - if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file - TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione - TRectype &r= f.curr(); // prende il record corrente del file principale - f.zero("TIPOCF"); // svuota il campo TIPOCF - } - _rel->write(); // invoca la scrittura della relazione - return (_rel->status()); // ritorna lo stato della relazione -} - -int TRighe_condizioni_vendita::rewrite(const TMask &m) { - m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione - if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file - TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione - TRectype &r= f.curr(); // prende il record corrente del file principale - f.zero("TIPOCF"); // svuota il campo TIPOCF - } - _rel->rewrite(); // invoca la riscrittura della relazione - return (_rel->status()); // ritorna lo stato della relazione -} - -void TRighe_condizioni_vendita::init_query_mode(TMask &m) { - for (short i=(short)_tohide.first_one(); i<=(short)_tohide.last_one(); i++) { // ciclo sul vettore dei campi da eliminare - if (_tohide[i]) { - if (_msk->field(i).is_edit()) _msk->efield(i).check_type(CHECK_NONE); // disabilita il checking sul campo se è editabile - _msk->hide(i); // rende invisibile il campo - } - } - if (!_catven_on) { // se il booleano di abil. di CATVEN è falso... - _msk->efield(F_R_L_CATVEN).check_type(CHECK_NONE); // ...viene rimosso dal checking... - _msk->disable(F_R_L_CATVEN); // ...e disabilitato - } - _msk->set(F_R_TIPO, _rcondven); // settaggio del campo di tipo archivio -} - -int ve2300(int argc, char* argv[]) { - TRighe_condizioni_vendita a; - - a.run(argc, argv, "Righe condizioni vendita "); - return 0; -} - + +#include +#include + +#include "ve2300.h" + +#define DESTROY(x) { _msk->field(x).reset_key(1); _msk->hide(x); } +#define CREATE(x) { _msk->field(x).set_key(1); _msk->show(x); } +#define KILL(x) { _msk->field(x).reset_key(1); _msk->disable(x); } +#define REVIVE(x) { _msk->field(x).set_key(1); _msk->enable(x); } + + + +enum state { // tipo di var. per la gestione delle abilitazioni dei campi + hidden, // nascosto, disabilitato, rimosso, distrutto, ucciso... insomma, fuori dai piedi + disabled, // disabilitato, visibile, non riabilitabile... cioè proprio in mezzo ai piedi e senza possibilità di toglierlo + disactivated, // disabilitato ma visibile... cioè giusto tra i piedi + activated // attivato... cioè utilizzabile come gli altri + }; + +// il campo unità di misura nella chiave viene gestito con i quattro stati per risolvere i +// conflitti di abilitazione/disabilitazione incrociati tra vari flag e stati del programma: +// il listbox del tipo di riga ha la priorità più bassa, cambia solo tra gli ultimi due stati +// (disactivated e activated); il flag "GESTUM" nella testata cambia lo stato del campo tra +// gli intermedi (disabled e disactivated); il tipo di archivio cambia tra il primo e il terzo +// stato (hidden e disactivated) + + + +class TRighe_condizioni_vendita: public TRelation_application { + TMask *_msk; // maschera principale + TRelation *_rel; // relazione principale + + TString16 _rcondven; // stringa che indica il tipo di archivio + bool _codlis_catven; // booleano di abilitazione del campo CATVEN + + state _gest_um; // variabile di abilitazione delle unità di misura + + virtual bool user_create(); + virtual bool user_destroy(); + virtual TMask *get_mask(int) { return _msk; } // punto d'aggancio tra la maschera della rel.app. e la maschera principale dell'applicazione + virtual bool changing_mask(int) { return FALSE; } // ritorna il flag di cambio maschera a seconda dei modi di funzionamento, in questa applicazione la maschera è una sola quindi il flag è FALSE + virtual bool changing_keys() const { return TRUE; } // ritorna il flag di rigenerazione della lista delle chiavi ad ogni find(), in questa applicazione le chiavi cambiano continuamente quindi il flag è TRUE + virtual TRelation *get_relation() const { return _rel; } // punto d'aggancio tra la relazione della rel.app. e la relazione principale dell'applicazione + + static void hide_and_show_codriga(void); // 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 + +public: + 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"); + TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente + switch (_rcondven[0]) { + case 'L': // listini + _gest_um= disactivated; // attiva di default la gestione delle unità di misura pur lasciando il campo disabilitato + DESTROY(F_R_C_TIPOCF); // settaggio dei campi da eliminare... + DESTROY(F_R_C_CODCF); + DESTROY(F_R_C_COD); + DESTROY(F_R_O_COD); + _msk->hide(F_R_C_RICERCA); + _msk->hide(F_R_O_RICERCA); + _msk->hide(F_R_CO_CODLOTTO); + _msk->hide(F_R_O_ARTES); + _codlis_catven= prassid.get_bool("CodLisCV"); // setta il booleano di abilitazione di CATVEN + if (!_codlis_catven) KILL(F_R_L_CATVEN); // disabilita condizionalmente le categorie di vendita + set_search_field(F_R_L_RICERCA); // impostazione del campo di ricerca + _msk->set_handler(F_R_L_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata + gotcha= TRUE; + break; + case 'C': // contratti + _gest_um= hidden; // rimuove la gestione delle unità di misura + DESTROY(F_R_L_CATVEN); // settaggio dei campi da eliminare... + DESTROY(F_R_L_COD); + DESTROY(F_R_O_COD); + DESTROY(F_R_LO_UM); + _msk->hide(F_R_L_RICERCA); + _msk->hide(F_R_O_RICERCA); + _msk->hide(F_R_O_ARTES); + set_search_field(F_R_C_RICERCA); // impostazione del campo di ricerca + _msk->set_handler(F_R_C_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata + gotcha= TRUE; + break; + case 'O': // offerte + _gest_um= disactivated; // attiva di default la gestione delle unità di misura pur lasciando il campo disabilitato + DESTROY(F_R_L_CATVEN); // settaggio dei campi da eliminare... + DESTROY(F_R_C_TIPOCF); + DESTROY(F_R_C_CODCF); + DESTROY(F_R_L_COD); + DESTROY(F_R_C_COD); + _msk->hide(F_R_L_RICERCA); + _msk->hide(F_R_C_RICERCA); + set_search_field(F_R_O_RICERCA); // impostazione del campo di ricerca + _msk->set_handler(F_R_O_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata + gotcha= TRUE; + break; + default: // messaggio di errore se si indica un archivio non valido + error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza"); + break; + } + if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione + _rel= new TRelation(LF_RCONDV); // apre la relazione (un unico file) + _msk->set(F_R_TIPO, _rcondven); // settaggio del campo di tipo archivio + _msk->set_handler(F_R_TIPORIGA, handle_tiporiga); // impostazione dell'handler sul campo di selezione del tipo della riga + hide_and_show_codriga(); // 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 *_msk= app()._msk; // prende il puntatore alla maschera principale dell'applicazione + if (_msk->query_mode()) { // se la maschera è in modo query procede con i controlli... + short id_campi[3]= { F_R_CODRIGA_A, F_R_CODRIGA_G, F_R_CODRIGA_R }; // vettore degli identificatori dei tre campi CODRIGA in mutua esclusione + char tag_campi[3]= { 'A', 'G', 'R' }; // vettore dei tag di TIPORIGA per i tre campi CODRIGA in mutua esclusione + state &_gest_um= app()._gest_um; // prende il riferimento al booleano di abilitazione delle unità di misura + TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di tipo di archivio + char tag_campo= toupper(_msk->get(F_R_TIPORIGA)[0]); // prende il tag del campo da abilitare in TIPORIGA + for (int i=0; i<3; i++) { // ciclo sui tre campi CODRIGA + if (tag_campo == tag_campi[i]) { CREATE(id_campi[i]); } // il campo indicato con il tag viene reso visibile + else { DESTROY(id_campi[i]); } // i campi non corrispondenti al tag vengono resi invisibili + } + if ((_gest_um != hidden) && (_gest_um != disabled)) { // se è abilitata (o abilitabile) la gestione delle unità di misura ed è stata selezionata una riga di articoli... + if (tag_campo=='A') _gest_um= activated; // ...il campo "unità di misura" viene abilitato... + else _gest_um= disactivated; // ...altrimenti viene disabilitato + } + switch (_gest_um) { + case hidden: // se l'unità di misura deve essere fuori dai piedi... + DESTROY(F_R_LO_UM); // ...il campo viene relativo soppresso + break; + case disabled: // se l'unità di misura deve essere tra i piedi (ma inutilizzabile) + case disactivated: + CREATE(F_R_LO_UM); // ...il campo relativo viene rimesso al mondo... + KILL(F_R_LO_UM); // ...ma subito ucciso + break; + case activated: // se l'unità di misura deve funzionare... + CREATE(F_R_LO_UM); // ...il campo relativo viene rimesso al mondo... + REVIVE(F_R_LO_UM); // ...e lasciato vivere in pace + break; + } + } +} + +bool TRighe_condizioni_vendita::handle_tiporiga(TMask_field &fld, KEY k) { + if (k==K_SPACE) hide_and_show_codriga(); // 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()) { + state &_gest_um= app()._gest_um; // prende il riferimento al booleano di abilitazione delle unità di misura + TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di indicazione del tipo di archivio + TMask *_msk= app()._msk; // prende il puntatore alla maschera principale dell'applicazione + 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", _msk->get(F_R_L_CATVEN)); + condv.put("COD", _msk->get(F_R_L_COD)); + break; + case 'C': // riempie il resto della chiave dei contratti + condv.put("TIPOCF", _msk->get(F_R_C_TIPOCF)); + condv.put("CODCF", _msk->get(F_R_C_CODCF)); + condv.put("COD", _msk->get(F_R_C_COD)); + break; + case 'O': // riempie il resto della chiave delle offerte + condv.put("COD", _msk->get(F_R_O_COD)); + break; + } + if (condv.read()==NOERR) { // se la lettura è andata a buon fine abilita/disabilita i campi della maschera in base ai booleani della testata + if (_gest_um != hidden) { // se le unità di misura possono essere utilizzate... + if (!(condv.get_bool("GESTUM"))) _gest_um= disabled; // ma nella testata sono disabilitate, setta la disabilitazione del campo "unità di misura"... + else _gest_um= disactivated; // altrimenti ne setta la possibile abilitazione + } + hide_and_show_codriga(); // lancia la funzione che si occupa di abilitare/disabilitare il campo "unità di misura" + if (!condv.get_bool("GESTSCAGL")) { + KILL(F_R_NSCAGL); // disabilita il campo "numero scaglione" + _msk->disable(F_R_QLIM); // disabilita il campo "quantità limite scaglione" + } else { + REVIVE(F_R_NSCAGL); // abilita il campo "numero scaglione" + _msk->enable(F_R_QLIM); // abilita il campo "quantità limite scaglione" + } + if (!condv.get_bool("GESTSCO")) { + _msk->disable(F_R_SCONTO); // disabilita il campo "sconto" + _msk->disable(F_R_QOM); // disabilita il campo "quantità art. omaggio" + _msk->disable(F_R_QBASE); // disabilita il campo "quantità base x sconto" + _msk->disable(F_R_CODARTOM); // disabilita il campo "codice articolo omaggio" + _msk->disable(F_R_PROMAGGIO); // disabilita il campo "prezzo omaggio" + _msk->disable(F_R_UMOM); // disabilita il campo "unità di misura art. omaggio" + } else { + _msk->enable(F_R_SCONTO); // abilita il campo "sconto" + _msk->enable(F_R_QOM); // abilita il campo "quantità art. omaggio" + _msk->enable(F_R_QBASE); // abilita il campo "quantità base x sconto" + _msk->enable(F_R_CODARTOM); // abilita il campo "codice articolo omaggio" + _msk->enable(F_R_PROMAGGIO); // abilita il campo "prezzo omaggio" + _msk->enable(F_R_UMOM); // abilita il campo "unità di misura art. omaggio" + } + return TRUE; + } else { + error_box("Non esiste una testata corrispondente alla chiave specificata"); + return FALSE; + } + } else return TRUE; +} + +int TRighe_condizioni_vendita::write(const TMask &m) { + m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione + if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file + TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione + TRectype &r= f.curr(); // prende il record corrente del file principale + f.zero("TIPOCF"); // svuota il campo TIPOCF + } + _rel->write(); // invoca la scrittura della relazione + return (_rel->status()); // ritorna lo stato della relazione +} + +int TRighe_condizioni_vendita::rewrite(const TMask &m) { + m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione + if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file + TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione + TRectype &r= f.curr(); // prende il record corrente del file principale + f.zero("TIPOCF"); // svuota il campo TIPOCF + } + _rel->rewrite(); // invoca la riscrittura della relazione + return (_rel->status()); // ritorna lo stato della relazione +} + + + +int ve2300(int argc, char* argv[]) { + TRighe_condizioni_vendita a; + + a.run(argc, argv, "Righe condizioni vendita "); + return 0; +} + diff --git a/ve/ve2300x.uml b/ve/ve2300x.uml index d53f68f54..8cf50c584 100755 --- a/ve/ve2300x.uml +++ b/ve/ve2300x.uml @@ -11,7 +11,7 @@ STRING F_R_TIPO 1 BEGIN PROMPT 100 100 "" FIELD LF_RCONDV->TIPO - FLAG "DU" + FLAG "DUP" KEY 1 CHECKTYPE REQUIRED END @@ -121,15 +121,16 @@ BEGIN FIELD LF_RCONDV->TIPORIGA FLAG "P" KEY 1 - ITEM "A|Articolo" // MESSAGE ENABLE,F_CODRIGA_A|SHOW,F_CODRIGA_A|CLEAR,F_CODRIGA_G|HIDE,F_CODRIGA_G|CLEAR,F_CODRIGA_R|HIDE,F_CODRIGA_R - ITEM "G|Gr. merc." // MESSAGE ENABLE,F_CODRIGA_G|SHOW,F_CODRIGA_G|CLEAR,F_CODRIGA_A|HIDE,F_CODRIGA_A|CLEAR,F_CODRIGA_R|HIDE,F_CODRIGA_R - ITEM "R|Rag. fis." // MESSAGE ENABLE,F_CODRIGA_R|SHOW,F_CODRIGA_R|CLEAR,F_CODRIGA_A|HIDE,F_CODRIGA_A|CLEAR,F_CODRIGA_G|HIDE,F_CODRIGA_G + ITEM "A|Articolo" + ITEM "G|Gr. merc." + ITEM "R|Rag. fis." END STRING F_R_CODRIGA_A 20 BEGIN PROMPT 19 5 "Codice " FIELD LF_RCONDV->CODRIGA + FLAG "U" KEY 1 USE LF_ANAGR INPUT CODART F_R_CODRIGA_A @@ -143,6 +144,7 @@ STRING F_R_CODRIGA_G 20 BEGIN PROMPT 19 5 "Codice " FIELD LF_RCONDV->CODRIGA + FLAG "U" KEY 1 USE %GMC INPUT CODTAB F_R_CODRIGA_G @@ -157,6 +159,7 @@ STRING F_R_CODRIGA_R 20 BEGIN PROMPT 19 5 "Codice " FIELD LF_RCONDV->CODRIGA + FLAG "U" KEY 1 USE %RFA INPUT CODTAB F_R_CODRIGA_R @@ -179,6 +182,7 @@ STRING F_R_LO_UM 2 // campo riservato a listini e offerte BEGIN PROMPT 21 7 "U.M. " FIELD LF_RCONDV->UM + FLAG "U" KEY 1 USE LF_UMART KEY 2 JOIN %UMS INTO CODTAB=UM @@ -193,11 +197,11 @@ END STRING F_R_L_RICERCA 1 // campo di aggancio per la ricerca sui listini, nascosto BEGIN PROMPT 100 100 "" - USE LF_RCONDV FLAG "D" + USE LF_RCONDV SELECT (CATVEN==#F_R_L_CATVEN)&&(COD==#F_R_L_COD) INPUT TIPO F_R_TIPO SELECT - INPUT CATVEN F_R_L_CATVEN SELECT - INPUT COD F_R_L_COD SELECT +//INPUT CATVEN F_R_L_CATVEN +//INPUT COD F_R_L_COD INPUT TIPORIGA F_R_TIPORIGA INPUT CODRIGA F_R_CODRIGA_A INPUT UM F_R_LO_UM @@ -217,12 +221,12 @@ END STRING F_R_C_RICERCA 1 // campo di aggancio per la ricerca sui contratti, nascosto BEGIN PROMPT 100 100 "" - USE LF_RCONDV FLAG "D" + USE LF_RCONDV SELECT (TIPOCF==#F_R_C_TIPOCF)&&(CODCF==#F_R_C_CODCF)&&(COD==#F_R_L_COD) INPUT TIPO F_R_TIPO SELECT - INPUT TIPOCF F_R_C_TIPOCF SELECT - INPUT CODCF F_R_C_CODCF SELECT - INPUT COD F_R_C_COD SELECT +//INPUT TIPOCF F_R_C_TIPOCF +//INPUT CODCF F_R_C_CODCF +//INPUT COD F_R_C_COD INPUT TIPORIGA F_R_TIPORIGA INPUT CODRIGA F_R_CODRIGA_A INPUT NSCAGL F_R_NSCAGL @@ -239,10 +243,10 @@ END STRING F_R_O_RICERCA 1 // campo di aggancio per la ricerca sulle offerte, nascosto BEGIN PROMPT 100 100 "" - USE LF_RCONDV FLAG "D" + USE LF_RCONDV SELECT COD==#F_R_L_COD INPUT TIPO F_R_TIPO SELECT - INPUT COD F_R_O_COD SELECT +//INPUT COD F_R_O_COD INPUT TIPORIGA F_R_TIPORIGA INPUT CODRIGA F_R_CODRIGA_A INPUT UM F_R_LO_UM @@ -288,8 +292,6 @@ BOOLEAN F_R_ADDIVA BEGIN PROMPT 2 11 "Addebito IVA" FIELD LF_RCONDV->ADDIVA - MESSAGE TRUE ENABLE,F_R_CODIVA - MESSAGE FALSE DISABLE,F_R_CODIVA END STRING F_R_CODIVA 4 diff --git a/ve/ve3.cpp b/ve/ve3.cpp index 0a508d84c..d3315068e 100755 --- a/ve/ve3.cpp +++ b/ve/ve3.cpp @@ -3,7 +3,7 @@ #include //extern int ve3100(int argc, char* argv[]); // stampa tabelle sconti (di riga/di documento/incondizionati) -//extern int ve3200(int argc, char* argv[]); // stampa testate listini/contratti/offerte +extern int ve3200(int argc, char* argv[]); // stampa testate listini/contratti/offerte //extern int ve3300(int argc, char* argv[]); // stampa righe listini/contratti/offerte extern int ve3400(int argc, char* argv[]); // stampa anagrafica di magazzino @@ -15,9 +15,9 @@ int main( int argc, char** argv) { switch (r) { //case 0: rt = ve3100(argc, argv); break; - //case 1: rt = ve3200(argc, argv); break; - //case 2: rt = ve3300(argc, argv); break; - case 3: rt = ve3400(argc, argv); break; + case 1: rt = ve3200(argc, argv); break; + //case 2: rt = ve3300(argc, argv); break; + case 3: rt = ve3400(argc, argv); break; default: error_box("Sintassi: %s -[0 [R|D|I] | 1 [L|C|O] | 2 [L|C|O] | 3]", argv[0]); break; } return (rt); diff --git a/ve/ve3200.cpp b/ve/ve3200.cpp new file mode 100755 index 000000000..75f902b65 --- /dev/null +++ b/ve/ve3200.cpp @@ -0,0 +1,208 @@ + +#include +#include + +#include "ve3200.h" + + + +#define UMS1 201 +#define UMS2 202 + + + +// !! Manca la gestione della maschera di selezione del tipo di archivio nel caso non sia +// specificato sulla linea di comando +// !! Manca la gestione della maschera di filtro (con i relativi handler sui vari tipi di +// abilitazioni incrociate) +// !! Manca la selezione del file in corso di stampa nella set_page() e la relativa impostazione +// della pagina +// !! Manca la creazione della struttura della stampa dei dati +// !! Manca tutto il resto! + + + +class TStampa_condizioni_vendita: public TPrint_application { + TRelation *_rel; // relazione principale +protected: + virtual bool user_create(void); + virtual bool user_destroy(void); + virtual bool set_print(int); + virtual void set_page(int, int); + virtual void preprocess_header(void); + virtual void process_link(int, const char *); +}; + + + +bool TStampa_condizioni_vendita::user_create() { + _rel= new TRelation(LF_CONDV); // crea la relazione principale + _rel->add(LF_RCONDV, "TIPO==TIPO|CATVEN==CATVEN|TIPOCF==TIPOCF|CODCF==CODCF|COD==COD"); + _rel->add("%CVE", "CODTAB==CATVEN"); + _rel->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + _rel->add("%VAL", "CODTAB==CODVAL"); + _rel->add("%UMS", "CODTAB==UM", 1, LF_RCONDV, UMS1); + _rel->add("%UMS", "CODTAB==UMOM", 1, LF_RCONDV, UMS2); + add_cursor(new TCursor(_rel)); // costruisce il cursore sulla relazione e lo passa alla stampa + add_file(LF_CONDV); // notifica il file della testata alla stampa + add_file(LF_RCONDV); // notifica il file delle righe alla stampa + enable_print_menu(); // abilita il menù di stampa + enable_setprint_menu(); // abilita il menù di settaggio della stampa + return TRUE; +} + +bool TStampa_condizioni_vendita::user_destroy() { + delete _rel; // distrugge la relazione principale + return TRUE; +} + +bool TStampa_condizioni_vendita::set_print(int) { + TMask mask("ve3200x"); // istanzia la maschera di selezione del filtro di stampa + if (mask.run()== K_ENTER) { // lancia la maschera, se viene confermata vengono trovati gli estremi del cursore + + /* TLocalisamfile &anagr= _rel->lfile(); // prende il file principale + TRectype da(anagr.curr()), a(anagr.curr()); // prende due copie del record del file principale + da.zero(); // azzera il record di inizio + a.zero(); // azzera il record di fine + if (mask.get(F_CODART_1).not_empty()) { // se il campo "dall'articolo..." non è vuoto viene trovato il record di inizio + anagr.zero(); // svuota il record corrente + anagr.put("CODART", mask.get(F_CODART_1)); // compone la chiave + if (anagr.read()== NOERR) da= anagr.curr(); // si posiziona, se il record esiste il record iniziale viene riempito + } + if (mask.get(F_CODART_2).not_empty()) { // se il campo "all'articolo..." non è vuoto viene trovato il record di fine + anagr.zero(); // svuota il record corrente + anagr.put("CODART", mask.get(F_CODART_2)); // compone la chiave + if (anagr.read()== NOERR) a= anagr.curr(); // si posiziona, se il record esiste il record finale viene riempito + } + current_cursor()->setregion(da, a); // viene settata la regione del cursore + if (_st_umart) { // se la stampa delle unità di misura è abilitata vengono aperti i file relativi + _umart= new TLocalisamfile(LF_UMART); // crea il file sulle unità di misura dell'articolo + _arr_umart= new TRecord_array(LF_UMART, "NRIGA"); // crea il record array sulle unità di misura degli articoli + } + if (_st_codcorr) { // se la stampa dei codici corrispondenti è abilitata vengono aperti i file relativi + _codcorr= new TLocalisamfile(LF_CODCORR); // crea il file con i codici corrispondenti dell'articolo + _arr_codcorr= new TRecord_array(LF_CODCORR, "NRIGA"); // crea il record array sui codici corrispondenti + } + force_setpage(); // forza il lancio della set_page() ad ogni record del file da stampare + disable_links(); // disabilita tutti i link ipertestuali + _anagr_link_id= enable_link("Collegamento a anagrafica di magazzino", 'g'); // abilita il collegamento all'anagrafica di magazzino + */ + return TRUE; + } else return FALSE; +} + +/* 1 1 1 1 + 1 2 3 4 5 6 7 8 9 0 1 2 3 + 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 + + */ + +void TStampa_condizioni_vendita::preprocess_header() +{ + + + /*reset_header(); // l'header viene resettato + int i= 1; // contatore delle linee + set_header(i, "@125gPag @#"); // la prima linea contiene, sicuramente, il numero di pagina + const long firm= get_firm(); // legge l'id della ditta corrente + TLocalisamfile ditte(LF_NDITTE); // apre il file ditte + ditte.zero(); // vuota il record + ditte.put("CODDITTA", firm); // riempie la chiave + if (ditte.read()== NOERR) { // se il record della ditta viene trovato viene settato l'header + const TString &s= ditte.get("RAGSOC"); // legge la ragione sociale della ditta + set_header(i, "Ditta %ld %s", firm, (const char *)s); // setta il nome e l'id della ditta della prima linea dell'header + } + set_header(++i, "Codice articolo@22gT@24gDescrizione@75gGrMer@81gDescrizione gruppo merceologico"); // setta la linea successiva dell'header + if (_st_umart || _st_codcorr) set_header(++i, ""); // crea una linea vuota se almeno una stampa condizionale è abilitata + if (_st_codcorr) set_header(i, "Cod. art. altern."); // se è abilitata la stampa dei codici corrispondenti l'header lo indica + if (_st_umart) set_header(i, "@50gUM@53gFatt. conv."); // se è abilitata la stampa delle unità di misura l'header lo indica + set_header(++i, "Forn.@7gRagione sociale@58gCosto standard@83gPeso@105gTara"); // la linea successiva contiene il fornitore e altri dati + if (_st_umart) set_header(i, "@80gUP"); // su questa linea viene indicata anche l'unità di misura del peso (se abilitata) + set_header(++i, "Pezzi x conf.@23gPezzi x collo@45gAR@48gRD"); // l'ultima linea d'header contiene i pezzi per confezione e altri dati + if (_st_fisc) set_header(i, "@51gAF@54gRagFs@60gC@62gCCA@66gGrA@70gCnA@74gSottCA@81gCCV@85gGrV@89gCnV@93gSottCV@100gClasseDog@111gIva@116gIvaR"); // aggiunge i dati fiscali sull'ultima linea + set_header(++i, ""); // aggiunge due linee vuote + set_header(++i, ""); + */ + +} + +void TStampa_condizioni_vendita::set_page(int file, int) { + + /*if (file== LF_ANAGR) { // se il file in stampa non è il file principale non c'è nulla da fare + TLocalisamfile &anagr= _rel->lfile(); // prende il riferimento al file principale + set_row(1, "$[g]@20s$[n]@22g@1s@24g@50s@75g@5s@81g@50s", FLD(LF_ANAGR, "CODART"), FLD(LF_ANAGR, "TIPO"), FLD(LF_ANAGR, "DESCR"), FLD(LF_ANAGR, "GRMERC1"), FLD(-GMC1, "S0")); // imposta la prima linea di dati + int n_codcorr= 0, n_umart= 0, n_gmc= (anagr.get("GRMERC2").not_empty())?(1):(0)+(anagr.get("GRMERC3").not_empty())?(1):(0); // legge il numero di gruppi merc. + if (_st_codcorr) { // se è abilitata la stampa dei codici corrispondenti viene letto il numero di codici presenti, altrimenti viene lasciato a 0 + _codcorr->zero(); // il record corrente del file dei codici corrispondenti viene vuotato + _codcorr->put("CODART", anagr.get("CODART")); // viene composta la chiave + _arr_codcorr->read(_codcorr->curr()); // il record array dei codici viene caricato + n_codcorr= _arr_codcorr->rows(); // viene settato il numero di codici trovato + } + if (_st_umart) { // se è abilitata la stampa delle unità di misura viene letto il numero di unità di mis. da stampare, altrimenti viene lasciato a 0 + _umart->zero(); // il record corrente del file delle unità di misura viene vuotato + _umart->put("CODART", anagr.get("CODART")); // viene composta la chiave + _arr_umart->read(_umart->curr()); // il record array delle unità di misura viene caricato + n_umart= _arr_umart->rows(); // viene settato il numero di unità di misura trovate + } + int n_max= max3(n_gmc, n_codcorr, n_umart); // viene trovato il maggiore dei tre contatori (gruppi merc., unità di mis. e codici corrisp.) + for (int i=1; i<=n_max; i++) { // ciclo sul maggiore dei contatori + set_row(i+1, ""); // vuota la linea di stampa corrente + if (i<=n_codcorr) { // se ci sono ancora codici corrispondenti gli spazi relativi della riga vengono riempiti + TString codartalt(_arr_codcorr->row(i, FALSE).get("CODARTALT")); // legge il codice corrispondente dell'articolo + TString tipo(_arr_codcorr->row(i, FALSE).get("TIPO")); // legge il tipo + set_row(i+1, "@1g%-20s@22g%1s@24gCodice alternativo", (const char *)codartalt, (const char *)tipo); // setta gli spazi della riga con i valori letti + } + if (i<=n_umart) { // se ci sono ancora unità di misura gli spazi relativi della riga vengono riempiti + TString um(_arr_umart->row(i, FALSE).get("UM")); // legge l'id dell'unità di misura + real fc(_arr_umart->row(i, FALSE).get_real("FC")); // legge il suo fattore di conversione + set_row(i+1, "@50g%-2s@53g%-s", (const char *)um, fc.string(10, 5)); // setta gli spazi della riga con i valori letti + } + if (i<=n_gmc) { // se ci sono ancora gruppi merceologici gli spazi relativi della riga vengono riempiti + TString grmerc, descr; // istanzia le due variabili per codice del gruppo e descrizione + if (i==1) { // se è il primo deve essere letto dal secondo campo GRMERC del file dell'anagrafica + grmerc= anagr.get("GRMERC2"); // legge il codice del gruppo + descr= _rel->lfile(-GMC2).get("S0"); // legge la sua descrizione dalla tabella + } else { // se è il secondo deve essere letto dal terzo campo GRMERC del file dell'anagrafica + grmerc= anagr.get("GRMERC3"); // legge il codice del gruppo + descr= _rel->lfile(-GMC3).get("S0"); // legge la sua descriziona dalla tabella + } + set_row(i+1, "@75g%-5s@81g%-50s", (const char *)grmerc, (const char *)descr); + } + } + set_row(n_max+2, "@5s@7g@50s@58g@15.5n@83g@15.5n@105g@15.5n", FLD(LF_ANAGR, "CODFORN"), FLD(LF_CLIFO, "RAGSOC"), FLD(LF_ANAGR, "COSTSTD"), FLD(LF_ANAGR, "PESO"), FLD(LF_ANAGR, "TARA")); // imposta la penultima linea + if (_st_umart) set_row(n_max+2, "@80g@2s", FLD(LF_ANAGR, "UMP")); // se è abilitata la stampa delle unità di misura aggiunge l'u.m. del peso + set_row(n_max+3, "@15.5n@23g@15.5n@45g@f@48g@f", FLD(LF_ANAGR, "PPCONF"), FLD(LF_ANAGR, "PPCOLLO"), FLD(LF_ANAGR, "ARTPROD"), FLD(LF_ANAGR, "RIORDINO")); // imposta l'ultima linea + if (_st_fisc) set_row(n_max+3, "@51g@f@54g@5s@60g@1s@62g@3s@66g@3n@70g@3n@74g@6n@81g@3s@85g@3n@89g@3n@93g@6n@100g@10s@111g@4s@116g@4s", // imposta i dati fiscali sull'ultima linea + FLD(LF_ANAGR, "ARTFIS"), FLD(LF_ANAGR, "RAGGFIS"), FLD(LF_ANAGR, "CLASSEFIS"), + FLD(LF_ANAGR, "CATCONA"), FLD(LF_ANAGR, "GRUPPOA"), FLD(LF_ANAGR, "CONTOA"), FLD(LF_ANAGR, "SOTTOCA"), + FLD(LF_ANAGR, "CATCONV"), FLD(LF_ANAGR, "GRUPPOV"), FLD(LF_ANAGR, "CONTOV"), FLD(LF_ANAGR, "SOTTOCV"), + FLD(LF_ANAGR, "CLASSDOG"), FLD(LF_ANAGR, "CODIVA"), FLD(LF_ANAGR, "CODIVAR")); + set_row(n_max+4, ""); // aggiunge due linee vuote + set_row(n_max+5, ""); + } + */ + +} + +void TStampa_condizioni_vendita::process_link(int id, const char *text) { + + /*if (id== _anagr_link_id) { + TString body= "1|"; // istanzia la stringa per il corpo del messaggio e gli aggiunge il numero della chiave e il separatore + body << text; // aggiunge al corpo del messaggio il codice dell'articolo per riempire la chiave + TMessage msg(ANAMAG_APP, MSG_LN, (const char *)body); // crea il messaggio per l'applicazione di anagrafica di magazzino + msg.send(); // invia il messaggio + TExternal_app ve2_3(ANAMAG_APP); // crea l'applicazione esterna dell'anagrafica di magazzino + ve2_3.run(); // lancia l'applicazione esterna + } + */ + +} + + + +int ve3200(int argc, char* argv[]) { + TStampa_condizioni_vendita a; + + a.run(argc, argv, "Stampa condizioni vendita"); + return 0; +} diff --git a/ve/ve3200.h b/ve/ve3200.h index 9860c0acd..8e970b1c3 100755 --- a/ve/ve3200.h +++ b/ve/ve3200.h @@ -1,5 +1,5 @@ -#define F_TIPO 101 -#define F_CODCAT 102 -#define F_SCONTO 103 +#include "ve3200x.h" + +#define F_TIPOCV 101 diff --git a/ve/ve3200.uml b/ve/ve3200.uml index 329708f4f..eb45a85f7 100755 --- a/ve/ve3200.uml +++ b/ve/ve3200.uml @@ -1,45 +1,26 @@ -#include "VE3200.H" +#include "ve3200.h" -// #define LF_SCONTI -#define LF_ANAMAG 47 +PAGE "Stampa condizioni di vendita " -1 -1 40 10 -TOOLBAR "" 0 20 60 2 - #include -ENDPAGE - -PAGE "Archivio sconti documenti " 11 60 14 - -LISTBOX F_TIPO 1 +RADIOBUTTON F_TIPOCV 36 BEGIN - PROMPT 0 0 "" - ITEM "R|" - FLAG "H" -// FIELD LF_SCONTI->TIPO + PROMPT 1 2 "Tipo di archivio " + ITEM "L|Listini" + ITEM "C|Contratti" + ITEM "O|Offerte" END -STRING F_CODCAT 2 +BUTTON DLG_SELECT 9 2 BEGIN - PROMPT 3 2 "Codice " -// FIELD LF_SCONTI->CODCAT - FLAG "U" + PROMPT -12 -1 "Selezione" + MESSAGE EXIT,K_ENTER END - -STRING F_SCONTO 25 +BUTTON DLG_QUIT 9 2 BEGIN - PROMPT 3 4 "Sconto documento " -// FIELD LF_SCONTI->SCONTO -END - - -GROUPBOX DLG_NULL 60 7 - -BEGIN - PROMPT 0 0 "" - FLAG "R" + PROMPT -22 -1 "" END ENDPAGE - ENDMASK diff --git a/ve/ve3200x.h b/ve/ve3200x.h new file mode 100755 index 000000000..8b1378917 --- /dev/null +++ b/ve/ve3200x.h @@ -0,0 +1 @@ + diff --git a/ve/ve3200x.uml b/ve/ve3200x.uml new file mode 100755 index 000000000..7a878e897 --- /dev/null +++ b/ve/ve3200x.uml @@ -0,0 +1,458 @@ +#include +#include "ve3200x.h" + +PAGE "Stampa condizioni di vendita" -1 -1 72 14 + +STRING F_TIPO 1 // tipo di archivio +BEGIN + PROMPT 100 100 "" + FLAG "DU" +END + +STRING F_L_CATVEN 2 // categoria di vendita, solo listini +BEGIN + PROMPT 2 2 "Cat. vendita " + FLAG "U" + USE %CVE + INPUT CODTAB F_L_CATVEN + DISPLAY "Cat." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_L_CATVEN CODTAB +END + +LIST F_C_TIPOCF 7 // tipo cliente/fornitore, solo contratti +BEGIN + PROMPT 2 2 "Tipo " + ITEM "C|Cliente" + ITEM "F|Fornit." +END + +STRING F_C_CODCF 6 // codice cliente/fornitore, solo contratti +BEGIN + PROMPT 22 2 "Codice " + FLAG "U" + USE LF_CLIFO + INPUT TIPOCF F_C_TIPOCF + INPUT CODCF F_C_CODCF + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione sociale@50" RAGSOC + OUTPUT F_C_TIPOCF TIPOCF + OUTPUT F_C_CODCF CODCF +END + +STRING F_L_COD 3 // codice listino, solo listini +BEGIN + PROMPT 2 4 "Codice listino " + FLAG "U" + USE LF_CONDV + INPUT TIPO F_TIPO SELECT + INPUT CATVEN F_L_CATVEN + INPUT COD F_L_COD + DISPLAY "C.V." CATVEN + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TIPO TIPO + OUTPUT F_L_CATVEN CATVEN + OUTPUT F_L_COD COD +END + +NUMBER F_C_COD 3 // codice contratto, solo contratti +BEGIN + PROMPT 2 4 "Numero contratto " + USE LF_CONDV + INPUT TIPO F_TIPO SELECT + INPUT TIPOCF F_C_TIPOCF + INPUT CODCF F_C_CODCF + INPUT COD F_C_COD + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Numero" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TIPO TIPO + OUTPUT F_C_TIPOCF TIPOCF + OUTPUT F_C_CODCF CODCF + OUTPUT F_C_COD COD +END + +STRING F_O_COD 3 // codice offerta, solo offerte +BEGIN + PROMPT 2 3 "Codice offerta " + FLAG "U" + USE LF_CONDV + INPUT TIPO F_TIPO SELECT + INPUT COD F_O_COD + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TIPO TIPO + OUTPUT F_O_COD COD +END + +LIST F_TIPORIGHE 8 // listbox per tipo di selezione righe +BEGIN + PROMPT 2 6 "Righe " + ITEM "A|Articolo " MESSAGE CLEAR,F_DARIGA_A|ENABLE,F_DARIGA_A|SHOW,F_DARIGA_A|CLEAR,F_ARIGA_A|ENABLE,F_ARIGA_A|SHOW,F_ARIGA_A|HIDE,F_DARIGA_G|HIDE,F_DARIGA_R|HIDE,F_ARIGA_G|HIDE,F_ARIGA_R + ITEM "G|Gr. merc." MESSAGE CLEAR,F_DARIGA_G|ENABLE,F_DARIGA_G|SHOW,F_DARIGA_G|CLEAR,F_ARIGA_G|ENABLE,F_ARIGA_G|SHOW,F_ARIGA_A|HIDE,F_DARIGA_A|HIDE,F_DARIGA_R|HIDE,F_ARIGA_A|HIDE,F_ARIGA_R + ITEM "R|Rag. fis." MESSAGE CLEAR,F_DARIGA_R|ENABLE,F_DARIGA_R|SHOW,F_DARIGA_R|CLEAR,F_ARIGA_R|ENABLE,F_ARIGA_R|SHOW,F_ARIGA_R|HIDE,F_DARIGA_A|HIDE,F_DARIGA_G|HIDE,F_ARIGA_A|HIDE,F_ARIGA_G +END + +BOOLEAN F_TUTTERIGHE // checkbox per selezione di tutte le righe +BEGIN + PROMPT 20 6 "Tutte" + MESSAGE TRUE DISABLE,F_TIPORIGHE|DISABLE,F_DARIGA_A|DISABLE,F_DARIGA_G|DISABLE,F_DARIGA_R|DISABLE,F_ARIGA_A|DISABLE,F_ARIGA_G|DISABLE,F_ARIGA_R + MESSAGE FALSE ENABLE,F_TIPORIGHE|ENABLE,F_DARIGA_A|ENABLE,F_DARIGA_G|ENABLE,F_DARIGA_R|ENABLE,F_ARIGA_A|ENABLE,F_ARIGA_G|ENABLE,F_ARIGA_R +END + +STRING F_DARIGA_A 20 // riga articolo di inizio +BEGIN + PROMPT 2 8 "Da " + USE LF_ANAGR + INPUT CODART F_R_CODRIGA_A + DISPLAY "Articolo@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_R_CODRIGA_A CODART +END + +STRING F_DARIGA_G 20 // riga gruppo merceologico di inizio +BEGIN + PROMPT 2 8 "Da " + USE %GMC + INPUT CODTAB F_R_CODRIGA_G + DISPLAY "Gr. merc." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_R_CODRIGA_G CODTAB + MESSAGE COPY,F_DARIGA_A +END + +STRING F_DARIGA_R 20 // riga raggruppamento fiscale di inizio +BEGIN + PROMPT 2 8 "Da " + USE %RFA + INPUT CODTAB F_R_CODRIGA_R + DISPLAY "Ragg. fisc." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_R_CODRIGA_R CODTAB + MESSAGE COPY,F_DARIGA_A +END + +STRING F_ARIGA_A 20 // riga articolo di fine +BEGIN + PROMPT 2 9 "A " + USE LF_ANAGR + INPUT CODART F_R_CODRIGA_A + DISPLAY "Articolo@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_R_CODRIGA_A CODART +END + +STRING F_ARIGA_G 20 // riga gruppo merceologico di fine +BEGIN + PROMPT 2 9 "A " + USE %GMC + INPUT CODTAB F_R_CODRIGA_G + DISPLAY "Gr. merc." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_R_CODRIGA_G CODTAB + MESSAGE COPY,F_DARIGA_A +END + +STRING F_ARIGA_R 20 // riga raggruppamento fiscale di fine +BEGIN + PROMPT 2 9 "A " + USE %RFA + INPUT CODTAB F_R_CODRIGA_R + DISPLAY "Ragg. fisc." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_R_CODRIGA_R CODTAB + MESSAGE COPY,F_DARIGA_A +END + +GROUPBOX DLG_NULL 71 10 // groupbox attorno agli ultimi tre checkbox +BEGIN + PROMPT 0 1 "" +END + +BOOLEAN F_TESTACOMP // checkbox per stampa completa della testata +BEGIN + PROMPT 2 11 "Testata completa" +END + +BOOLEAN F_RICHECOMP // checkbox per stampa completa delle righe +BEGIN + PROMPT 2 12 "Righe complete" +END + +BOOLEAN F_L_LISTVALUTA // checkbox per stampa del listino in valuta o in lire +BEGIN + PROMPT 2 13 "Listino in valuta" +END + +GROUPBOX DLG_NULL 71 5 // groupbox attorno agli ultimi tre checkbox +BEGIN + PROMPT 0 10 "" +END + + /* ------------------------------------------------------------------------- + +STRING F_TIPO 1 +BEGIN + PROMPT 100 100 "" + FIELD LF_CONDV->TIPO + FLAG "DU" + KEY 1 + CHECKTYPE REQUIRED +END + +// campo riservato ai listini +STRING F_L_CATVEN 2 +BEGIN + PROMPT 2 2 "Cat. vendita " + FIELD LF_CONDV->CATVEN + FLAG "U" + KEY 1 + USE %CVE + INPUT CODTAB F_L_CATVEN + DISPLAY "Cat." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_L_CATVEN CODTAB + CHECKTYPE REQUIRED +END + +// campo riservato ai contratti +LIST F_C_TIPOCF 7 +BEGIN + PROMPT 2 2 "Tipo " + FIELD LF_CONDV->TIPOCF + KEY 1 + ITEM "C|Cliente" + ITEM "F|Fornit." + CHECKTYPE REQUIRED +END + +// campo riservato ai contratti +STRING F_C_CODCF 6 +BEGIN + PROMPT 22 2 "Codice " + FIELD LF_CONDV->CODCF + FLAG "U" + KEY 1 + USE LF_CLIFO + INPUT TIPOCF F_C_TIPOCF + INPUT CODCF F_C_CODCF + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Ragione sociale@50" RAGSOC + OUTPUT F_C_TIPOCF TIPOCF + OUTPUT F_C_CODCF CODCF + CHECKTYPE REQUIRED +END + +// campo riservato ai listini +STRING F_L_COD 3 +BEGIN + PROMPT 2 4 "Codice listino " + FIELD LF_CONDV->COD + FLAG "U" + KEY 1 + USE LF_CONDV + INPUT TIPO F_TIPO SELECT + INPUT CATVEN F_L_CATVEN + INPUT COD F_L_COD + DISPLAY "C.V." CATVEN + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TIPO TIPO + OUTPUT F_L_CATVEN CATVEN + OUTPUT F_L_COD COD + CHECKTYPE REQUIRED +END + +// campo riservato ai contratti +NUMBER F_C_COD 3 +BEGIN + PROMPT 2 4 "Numero contratto " + FIELD LF_CONDV->COD + KEY 1 + USE LF_CONDV + INPUT TIPO F_TIPO SELECT + INPUT TIPOCF F_C_TIPOCF + INPUT CODCF F_C_CODCF + INPUT COD F_C_COD + DISPLAY "C/F" TIPOCF + DISPLAY "Codice" CODCF + DISPLAY "Numero" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TIPO TIPO + OUTPUT F_C_TIPOCF TIPOCF + OUTPUT F_C_CODCF CODCF + OUTPUT F_C_COD COD + CHECKTYPE REQUIRED +END + +// campo riservato alle offerte +STRING F_O_COD 3 +BEGIN + PROMPT 2 3 "Codice offerta " + FIELD LF_CONDV->COD + FLAG "U" + KEY 1 + USE LF_CONDV + INPUT TIPO F_TIPO SELECT + INPUT COD F_O_COD + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT F_TIPO TIPO + OUTPUT F_O_COD COD + CHECKTYPE REQUIRED +END + + ---------------------------------------------------------------------------- + +LIST F_R_TIPORIGA 8 +BEGIN + PROMPT 2 5 "Riga " + FIELD LF_RCONDV->TIPORIGA + FLAG "P" + KEY 1 + ITEM "A|Articolo" // MESSAGE ENABLE,F_CODRIGA_A|SHOW,F_CODRIGA_A|CLEAR,F_CODRIGA_G|HIDE,F_CODRIGA_G|CLEAR,F_CODRIGA_R|HIDE,F_CODRIGA_R + ITEM "G|Gr. merc." // MESSAGE ENABLE,F_CODRIGA_G|SHOW,F_CODRIGA_G|CLEAR,F_CODRIGA_A|HIDE,F_CODRIGA_A|CLEAR,F_CODRIGA_R|HIDE,F_CODRIGA_R + ITEM "R|Rag. fis." // MESSAGE ENABLE,F_CODRIGA_R|SHOW,F_CODRIGA_R|CLEAR,F_CODRIGA_A|HIDE,F_CODRIGA_A|CLEAR,F_CODRIGA_G|HIDE,F_CODRIGA_G +END + +STRING F_R_CODRIGA_A 20 +BEGIN + PROMPT 19 5 "Codice " + FIELD LF_RCONDV->CODRIGA + KEY 1 + USE LF_ANAGR + INPUT CODART F_R_CODRIGA_A + DISPLAY "Articolo@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_R_CODRIGA_A CODART + CHECKTYPE REQUIRED +END + +STRING F_R_CODRIGA_G 20 +BEGIN + PROMPT 19 5 "Codice " + FIELD LF_RCONDV->CODRIGA + KEY 1 + USE %GMC + INPUT CODTAB F_R_CODRIGA_G + DISPLAY "Gr. merc." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_R_CODRIGA_G CODTAB + CHECKTYPE REQUIRED + MESSAGE COPY,F_R_CODRIGA_A +END + +STRING F_R_CODRIGA_R 20 +BEGIN + PROMPT 19 5 "Codice " + FIELD LF_RCONDV->CODRIGA + KEY 1 + USE %RFA + INPUT CODTAB F_R_CODRIGA_R + DISPLAY "Ragg. fisc." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_R_CODRIGA_R CODTAB + CHECKTYPE REQUIRED + MESSAGE COPY,F_R_CODRIGA_A +END + + + ---------------------------------------------------------------------------- + + +STRING F_CODART_1 20 +BEGIN + PROMPT 2 1 "Dall'art. " + FLAG "U" + USE LF_ANAGR + INPUT CODART F_CODART_1 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_1 CODART + OUTPUT F_DESCR_1 DESCR + CHECKTYPE NORMAL +END + +STRING F_DESCR_1 50 +BEGIN + PROMPT 2 2 "Descrizione " + USE LF_ANAGR KEY 2 + INPUT DESCR F_DESCR_1 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_1 CODART + OUTPUT F_DESCR_1 DESCR +END + +STRING F_CODART_2 20 +BEGIN + PROMPT 2 4 "All'art. " + FLAG "U" + USE LF_ANAGR + INPUT CODART F_CODART_2 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_2 CODART + OUTPUT F_DESCR_2 DESCR + CHECKTYPE NORMAL +END + +STRING F_DESCR_2 50 +BEGIN + PROMPT 2 5 "Descrizione " + USE LF_ANAGR KEY 2 + INPUT DESCR F_DESCR_2 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_2 CODART + OUTPUT F_DESCR_2 DESCR +END + +GROUPBOX DLG_NULL 71 7 +BEGIN + PROMPT 0 0 "" +//FLAG "R" +END + +BOOLEAN F_ST_UMART +BEGIN + PROMPT 2 8 "Stampa unita' di misura" +END + +BOOLEAN F_ST_CODCORR +BEGIN + PROMPT 2 9 "Stampa codici corrispondenti" +END + +BOOLEAN F_ST_FISC +BEGIN + PROMPT 2 10 "Stampa dati fiscali" +END + +GROUPBOX DLG_NULL 71 5 +BEGIN + PROMPT 0 7 "Controllo stampa" +//FLAG "R" +END + + ------------------------------------------------------------------------- */ + + +BUTTON DLG_SELECT 9 2 +BEGIN + PROMPT -12 -1 "Selezione" + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK