Archivi sconti e condizioni di vendita (listini contratti campagne)

git-svn-id: svn://10.65.10.50/trunk@1736 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
gianluca 1995-08-24 13:51:57 +00:00
parent 176e05ce6c
commit bfbdd47c8e
8 changed files with 530 additions and 332 deletions

View File

@ -1,40 +1,24 @@
#include <xvt.h>
#include <strings.h>
#include <checks.h>
#include <xvt.h>
// #define MAIN
#define usage "Errore - Utilizzo: %s -{0|1|2|3}"
extern int ve2100(int argc, char* argv[]); // listini
extern int ve2200(int argc, char* argv[]); // contratti
extern int ve2300(int argc, char* argv[]); // offerte-campagne
extern int ve2100(int argc, char* argv[]); // tabelle sconti (di riga/di documento/incondizionati)
extern int ve2200(int argc, char* argv[]); // testate listini/contratti/offerte
extern int ve2300(int argc, char* argv[]); // righe listini/contratti/offerte
extern int ve2400(int argc, char* argv[]); // anagrafica di magazzino
int main( int argc, char** argv)
{
int rt = -1;
const int r = (argc > 1) ? atoi( &argv[1][1] ) : -1;
switch (r)
{
case 0:
rt = ve2100( argc, argv );
break;
case 1:
rt = ve2200( argc, argv );
break;
case 2:
rt = ve2300( argc, argv );
break;
case 3:
rt = ve2400( argc, argv );
break;
default:
error_box( usage, argv[0] );
break;
}
return rt;
int main( int argc, char** argv) {
int rt= -1;
const int r= (argc>1)?(atoi(&argv[1][1])):(-1);
switch (r) {
case 0: rt = ve2100(argc, argv); break;
case 1: rt = ve2200(argc, argv); break;
case 2: rt = ve2300(argc, argv); break;
case 3: rt = ve2400(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);
}

View File

@ -1,60 +1,211 @@
#include <relapp.h>
#include <config.h>
#include <tabutil.h>
#include "ve2200.h"
#define LF_CONDV 52
#define LF_RCONDV 53
#ifndef __CHECKS_H
#include <checks.h>
#endif
class TCondizioni_vendita: public TRelation_application {
TMask *_msk; // maschera principale
TRelation *_rel; // relazione principale
#ifndef __RELAPP_H
#include <relapp.h>
#endif
TString16 _condven; // stringa che indica il tipo di archivio
short _tohide[10]; // vettore degli identificatori di campi che devono essere nascosti
#ifndef __LFFILES_H
#include <lffiles.h>
#endif
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; }
class TConcli_application : public TRelation_application
{
TMask* _msk;
TRelation* _rel;
static bool handler_datacam(TMask_field &, KEY); // handler del campo DATACAM (data cambio)
static bool handler_valfin(TMask_field &, KEY); // handler del campo VALFIN (data fine validità)
static bool handler_codlissucc(TMask_field &, KEY); // handler del campo CODLISSUCC (codice listino successivo)
static bool handler_seqric(TMask_field &, KEY); // handler del campo SEQRIC (sequenza di ricerca)
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int mode) { return _msk;}
virtual bool changing_mask(int mode) { return FALSE;}
virtual TRelation* get_relation() const { return _rel;}
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:
TConcli_application( ) { };
virtual ~TConcli_application() { }
public:
TCondizioni_vendita() {}
virtual ~TCondizioni_vendita() {}
};
bool TConcli_application::user_create()
{
_msk = new TMask( "VE2200" );
_rel = new TRelation( LF_CONDV );
// _rel.add( "%PIP" )
bool TCondizioni_vendita::user_create() {
bool gotcha= FALSE; // booleano di avvenuta inizializzazione
_condven= "*"; // inizializzazione dell'indicatore del tipo di archivio
if (argc()>2) _condven= argv(2); // se c'è, prende il tipo di archivio dalla linea di comando
else {
TMask choose("VE2200"); // istanzia la maschera di scelta del tipo di archivio
if (choose.run() == K_ENTER) _condven= choose.get(F_TIPOCV); // prende il tipo di archivio dalla maschera
}
_condven.upper(); // rende la stringa upper-case
_msk= new TMask("VE2200X");
switch (_condven[0]) {
case 'L': { // listini
// settaggio dei campi da eliminare
_tohide[0]= 5;
_tohide[1]= F_C_COD;
_tohide[2]= F_O_COD;
_tohide[3]= F_C_TIPOCF;
_tohide[4]= F_C_CODCF;
_tohide[5]= F_C_OBBLIG;
set_search_field(F_L_COD); // impostazione del campo di ricerca
TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta
if (toupper(prassid.get("CATVEN_ON")[0])!='T') _msk->disable(F_L_CATVEN); // disabilita il campo CATVEN se non è abilitato nella config.
_msk->set_handler(F_L_CODLISSUCC, handler_codlissucc); // setta l'handler per il campo di codice successivo
gotcha= TRUE;
break;
}
case 'C': { // contratti
// settaggio dei campi da eliminare
_tohide[0]= 4;
_tohide[1]= F_L_COD;
_tohide[2]= F_O_COD;
_tohide[3]= F_L_CATVEN;
_tohide[4]= F_L_CODLISSUCC;
set_search_field(F_C_COD); // impostazione del campo di ricerca
gotcha= TRUE;
break;
}
case 'O': { // offerte
// settaggio dei campi da eliminare
_tohide[0]= 7;
_tohide[1]= F_L_COD;
_tohide[2]= F_C_COD;
_tohide[3]= F_L_CATVEN;
_tohide[4]= F_C_TIPOCF;
_tohide[5]= F_C_CODCF;
_tohide[6]= F_C_OBBLIG;
_tohide[7]= F_L_CODLISSUCC;
set_search_field(F_O_COD); // impostazione del campo di ricerca
gotcha= TRUE;
break;
}
default: { // messaggio di errore se si indica un archivio non valido
error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza");
break;
}
}
if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione
_rel= new TRelation(LF_CONDV); // apre la relazione (un unico file)
_msk->set_handler(F_DATACAM, handler_datacam); // imposta l'handler per il campo della data del cambio
_msk->set_handler(F_VALFIN, handler_valfin); // imposta l'handler per il campo di fine validità
_msk->set_handler(F_SEQRIC, handler_seqric); // imposta l'handler per il campo di sequenza di ricerca
}
return (gotcha);
}
bool TCondizioni_vendita::user_destroy() {
delete _rel;
delete _msk;
return TRUE;
}
bool TConcli_application::user_destroy()
{
delete _msk;
delete _rel;
return TRUE;
bool TCondizioni_vendita::handler_datacam(TMask_field &fld, KEY k) {
if (k==K_TAB) { // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso
TString datacam(fld.get()); // legge la data di cambio nel campo corrente
if (datacam.not_empty()) {
TMask &m= fld.mask(); // prende la maschera principale
TString codval(m.get(F_CODVAL)); // prende il codice della valuta
if (codval.not_empty()) {
TTable cam("CAM"); // apre la tabella cambi
cam.put("CODTAB", codval << datacam); // riempie la chiave
if (cam.read() == NOERR) m.set(F_CAMBIO, cam.get("R10")); // se la lettura riesce il valore del cambio viene posto nel campo CAMBIO della maschera
}
}
}
return TRUE;
}
int ve2200(int argc, char* argv[])
{
bool TCondizioni_vendita::handler_valfin(TMask_field &fld, KEY k) {
if (k==K_TAB) {
if (fld.get().not_empty()) {
TMask &m= fld.mask(); // prende la maschera principale
if (m.get(F_VALIN).not_empty()) {
TDate valfin(fld.get()); // prende la data di fine validità
TDate valin(m.get(F_VALIN)); // prende la data di inizio validità
if (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;
}
TConcli_application a;
bool TCondizioni_vendita::handler_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;
}
a.run(argc, argv, "Gestione contratti " );
bool TCondizioni_vendita::handler_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 (int i=1; i<=_tohide[0]; i++) {
if (_msk->field(_tohide[i]).is_edit()) _msk->efield(_tohide[i]).check_type(CHECK_NORMAL); // disabilita il checking sul campo se è editabile
_msk->disable(_tohide[i]); // disabilita il campo
_msk->hide(_tohide[i]); // rende invisibile il campo
}
_msk->set(F_TIPO, _condven); // settaggio del campo di tipo archivio
}
int ve2200(int argc, char* argv[]) {
TCondizioni_vendita a;
a.run(argc, argv, "Condizioni di vendita ");
return 0;
}

View File

@ -1,49 +1,5 @@
#define F_TIPO 101
#define F_TIPOCF 104
#define F_CODCF 105
#define F_CODCF1 106
#define F_CODDIV1 107
#define F_COD 108
#define F_COD1 109
#define F_DESCR 110
#define F_CODVAL 111
#define F_CODVAL1 112
#define F_CAMBIO 113
#define F_DATACAM 114
#define F_VALIN 115
#define F_VALFIN 116
#define F_IMPLORDI 117
#define F_GESTUM 118
#define F_GESTSCAGL 119
#define F_GESTSCO 120
#define F_SCONST 121
#define F_OBBLIG 122
#define F_SEQRIC 124
#define F_FLART 125
#define F_FLCAT 126
#define F_FLLIN 127
#define F_FLRAGG 128
#include "ve2200x.h"
#define F_CATVEN2 129
#define F_COD2 130
#define F_TIPOCV 101
#define F_SHEET2 302
#define FS_QLIM 101
#define FS_PREZZO 102
#define FS_SCONTO 103
#define FS_ADDIVA 104
#define FS_CODIVA 105
#define FS_PRECPROVV 106
#define FS_QOM 107
#define FS_QBASE 108
#define FS_CODARTOM 109
#define FS_PROMAGGIO 110
#define FS_UMOM 111
#define FS_CODLOTTO 112
#define FS_CODIVA1 114
#define FS_CODARTOM1 115
#define FS_CODLOTTO1 116

View File

@ -1,59 +1,210 @@
#include <relapp.h>
#include "ve2300.h"
#define LF_CONDV 52
#define LF_RCONDV 53
#ifndef __CHECKS_H
#include <checks.h>
#endif
#ifndef __RELAPP_H
#include <relapp.h>
#endif
// !! verificare le disabilitazioni incrociate tra i campi e le loro relative riabilitazioni
// !! durante i cambi di chiave e dei campi con ricerche custom
#ifndef __LFFILES_H
#include <lffiles.h>
#endif
class Tofferte_application : public TRelation_application
{
TMask* _msk;
TRelation* _rel;
class TRighe_condizioni_vendita: public TRelation_application {
TMask *_msk; // maschera principale
TRelation *_rel; // relazione principale
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int mode) { return _msk;}
virtual bool changing_mask(int mode) { return FALSE;}
virtual TRelation* get_relation() const { return _rel;}
virtual TMask *get_mask(int) { return _msk; }
virtual bool changing_mask(int) { return FALSE; }
virtual TRelation *get_relation() const { return _rel; }
static bool handle_tiporiga(TMask_field &, KEY); // handler del campo TIPORIGA (articolo, gruppo merc., ragg. fiscale)
static bool handle_cod(TMask_field &, KEY); // handler del campo COD (codice listino, numero contratto, codice offerta)
virtual int write(const TMask &); // metodo usato per scrivere il record sul file
virtual int rewrite(const TMask &); // metodo usato per aggiornare il record sul file
virtual void init_query_mode(TMask &); // handler chiamato quando la maschera passa in modo ricerca
public:
TString16 _rcondven; // stringa che indica il tipo di archivio
TBit_array _tohide; // vettore degli identificatori di campi che devono essere nascosti
TBit_array _todisable; // vettore degli identificatori di campi che devono essere disabilitati
Tofferte_application( ) { };
virtual ~Tofferte_application() { }
TRighe_condizioni_vendita() {}
virtual ~TRighe_condizioni_vendita() {}
};
bool Tofferte_application::user_create()
{
_msk = new TMask( "VE2300" );
_rel = new TRelation( LF_CONDV );
// _rel.add( "%PIP" )
TRighe_condizioni_vendita &app() { // funzione che ritorna il riferimento alla classe principale dell'applicazione
return (TRighe_condizioni_vendita &)main_app();
}
bool TRighe_condizioni_vendita::user_create() {
bool gotcha= FALSE; // booleano di avvenuta inizializzazione
warning_box("Questa applicazione non è ancora stata definitivamente debuggata"); // !! rimuovere la warning box a fine debugging
_rcondven= "*"; // inizializzazione dell'indicatore del tipo di archivio
if (argc()>2) { // se c'è, prende il tipo di archivio dalla linea di comando
TString temp(argv(2));
_rcondven= temp.left(1); // prende solo il primo carattere
} else {
TMask choose("VE2300"); // istanzia la maschera di scelta del tipo di archivio
if (choose.run() == K_ENTER) _rcondven= choose.get(F_TIPORCV); // prende il tipo di archivio dalla maschera
}
_rcondven.upper(); // rende la stringa upper-case
_msk= new TMask("VE2300X");
_tohide.reset(); // resetta il vettore dei campi da eliminare
switch (_rcondven[0]) {
case 'L': // listini
_tohide.set(F_C_TIPOCF); // settaggio dei campi da eliminare...
_tohide.set(F_C_CODCF);
_tohide.set(F_C_COD);
_tohide.set(F_O_COD);
_tohide.set(F_C_RICERCA);
_tohide.set(F_O_RICERCA);
_tohide.set(F_CO_CODLOTTO);
_tohide.set(F_O_ARTES);
set_search_field(F_L_RICERCA); // impostazione del campo di ricerca
_msk->set_handler(F_L_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata
gotcha= TRUE;
break;
case 'C': // contratti
_tohide.set(F_L_CATVEN); // settaggio dei campi da eliminare...
_tohide.set(F_L_COD);
_tohide.set(F_O_COD);
_tohide.set(F_LO_UM);
_tohide.set(F_L_RICERCA);
_tohide.set(F_O_RICERCA);
_tohide.set(F_O_ARTES);
set_search_field(F_C_RICERCA); // impostazione del campo di ricerca
_msk->set_handler(F_C_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata
gotcha= TRUE;
break;
case 'O': // offerte
_tohide.set(F_L_CATVEN); // settaggio dei campi da eliminare...
_tohide.set(F_C_TIPOCF);
_tohide.set(F_C_CODCF);
_tohide.set(F_L_COD);
_tohide.set(F_C_COD);
_tohide.set(F_L_RICERCA);
_tohide.set(F_C_RICERCA);
set_search_field(F_O_RICERCA); // impostazione del campo di ricerca
_msk->set_handler(F_O_COD, handle_cod); // impostazione dell'handler sul campo di controllo della testata
gotcha= TRUE;
break;
default: // messaggio di errore se si indica un archivio non valido
error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza");
break;
}
if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione
_rel= new TRelation(LF_RCONDV); // apre la relazione (un unico file)
_todisable.reset(); // inizializza il vettore dei campi da disabilitare
_msk->set_handler(F_TIPORIGA, handle_tiporiga); // impostazione dell'handler sul campo di selezione del tipo della riga
}
return (gotcha);
}
bool TRighe_condizioni_vendita::user_destroy() {
delete _rel;
delete _msk;
return TRUE;
}
bool Tofferte_application::user_destroy()
{
delete _msk;
delete _rel;
bool TRighe_condizioni_vendita::handle_tiporiga(TMask_field &fld, KEY k) {
if (k==K_TAB) {
TBit_array &_todisable= app()._todisable; // vettore per la disabilitazione dei campi, ricavato dalla proprietà dell'applicazione
TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di indicazione del tipo di archivio
if ((fld.get() != "A") && (_rcondven != "C")) _todisable.set(F_LO_UM); // se il tipo riga è "Articolo" e non siamo sui contratti, l'unità di misura deve essere disabilitata
}
return TRUE;
}
int ve2300(int argc, char* argv[])
{
bool TRighe_condizioni_vendita::handle_cod(TMask_field &fld, KEY k) {
if (k==K_TAB) {
TString &_rcondven= app()._rcondven; // prende il riferimento alla stringa di indicazione del tipo di archivio
TMask &m= fld.mask(); // prende la maschera principale
TLocalisamfile condv(LF_CONDV); // apre il file della testata (condizioni di vendita)
condv.put("TIPO", _rcondven); // riempie il campo "TIPO"
switch (_rcondven[0]) {
case 'L': // riempie il resto della chiave dei listini
condv.put("CATVEN", m.get(F_L_CATVEN));
condv.put("COD", m.get(F_L_COD));
break;
case 'C': // riempie il resto della chiave dei contratti
condv.put("TIPOCF", m.get(F_C_TIPOCF));
condv.put("CODCF", m.get(F_C_CODCF));
condv.put("COD", m.get(F_C_COD));
break;
case 'O': // riempie il resto della chiave delle offerte
condv.put("COD", m.get(F_O_COD));
break;
}
if (condv.read()==NOERR) { // se la lettura è andata a buon fine abilita/disabilita i campi della maschera in base ai booleani della testata
TBit_array &_todisable= app()._todisable; // vettore per la disabilitazione dei campi, ricavato dalla proprietà dell'applicazione
_todisable.reset(); // resetta il vettore dei campi da disabilitare
if (!condv.get_bool("GESTUM")) _todisable.set(F_LO_UM); // mette nel vettore di dabilitazione il campo "unità di misura" della maschera (campo chiave)
if (!condv.get_bool("GESTSCAGL")) {
_todisable.set(F_NSCAGL); // mette nel vettore di dabilitazione il campo "n.ro scaglione" della maschera (campo chiave)
m.disable(F_QLIM); // disabilita il campo "quantità limite scaglione"
}
if (!condv.get_bool("GESTSCO")) {
m.disable(F_SCONTO); // disabilita il campo "sconto"
m.disable(F_QOM); // disabilita il campo "quantità art. omaggio"
m.disable(F_QBASE); // disabilita il campo "quantità base x sconto"
m.disable(F_CODARTOM); // disabilita il campo "codice articolo omaggio"
m.disable(F_PROMAGGIO); // disabilita il campo "prezzo omaggio"
m.disable(F_UMOM); // disabilita il campo "unità di misura art. omaggio"
}
return TRUE;
} else {
error_box("Non esiste una testata corrispondente alla chiave specificata");
return FALSE;
}
} else return TRUE;
}
Tofferte_application a;
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
}
a.run(argc, argv, "Gestione offerte/campagne " );
int TRighe_condizioni_vendita::rewrite(const TMask &m) {
m.autosave(_rel); // scrive il contenuto della maschera nel record della relazione
if (_rcondven != "C") { // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file
TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione
TRectype &r= f.curr(); // prende il record corrente del file principale
f.zero("TIPOCF"); // svuota il campo TIPOCF
}
_rel->rewrite(); // invoca la riscrittura della relazione
return (_rel->status()); // ritorna lo stato della relazione
}
void TRighe_condizioni_vendita::init_query_mode(TMask &m) {
for (short i=(short)_tohide.first_one(); i<=(short)_tohide.last_one(); i++) { // ciclo sul vettore dei campi da eliminare
if (_tohide[i]) {
if (_msk->field(i).is_edit()) _msk->efield(i).check_type(CHECK_NONE); // disabilita il checking sul campo se è editabile
_msk->hide(i); // rende invisibile il campo
}
}
for (i= (short)_todisable.first_one(); i<=(short)_todisable.last_one(); i++) { // ciclo sul vettore dei campi da disabilitare
if (_todisable[i]) {
if (_msk->field(i).is_edit()) _msk->efield(i).check_type(CHECK_NONE); // disabilita il checking sul campo se è editabile
_msk->disable(i); // disabilita il campo
}
}
_msk->set(F_TIPO, _rcondven); // settaggio del campo di tipo archivio
}
int ve2300(int argc, char* argv[]) {
TRighe_condizioni_vendita a;
a.run(argc, argv, "Righe condizioni vendita ");
return 0;
}

View File

@ -1,45 +1,5 @@
#define F_TIPO 101
#define F_COD 108
#define F_COD1 109
#define F_DESCR 110
#define F_CODVAL 111
#define F_CODVAL1 112
#define F_CAMBIO 113
#define F_DATACAM 114
#define F_VALIN 115
#define F_VALFIN 116
#define F_IMPLORDI 117
#define F_GESTUM 118
#define F_GESTSCAGL 119
#define F_GESTSCO 120
#define F_SCONST 121
#define F_SEQRIC 124
#define F_FLART 125
#define F_FLCAT 126
#define F_FLLIN 127
#define F_FLRAGG 128
#include "ve2300x.h"
#define F_CATVEN2 129
#define F_COD2 130
#define F_TIPORCV 101
#define F_SHEET3 303
#define FS_QLIM 101
#define FS_PREZZO 102
#define FS_SCONTO 103
#define FS_ADDIVA 104
#define FS_CODIVA 105
#define FS_PRECPROVV 106
#define FS_QOM 107
#define FS_QBASE 108
#define FS_CODARTOM 109
#define FS_PROMAGGIO 110
#define FS_UMOM 111
#define FS_CODLOTTO 112
#define FS_ARTES 113
#define FS_CODIVA1 114
#define FS_CODARTOM1 115
#define FS_CODLOTTO1 116

View File

@ -1,29 +1,15 @@
#include <relapp.h>
#include <tabutil.h>
#include <msksheet.h>
#include <assoc.h>
#include <checks.h>
#include "ve2400.h"
#ifndef __CHECKS_H
#include <checks.h>
#endif
#ifndef __RELAPP_H
#include <relapp.h>
#endif
#ifndef __TABUTIL_H
#include <tabutil.h>
#endif
#ifndef __MSKSHEET_H
#include <msksheet.h>
#endif
#ifndef __ASSOC_H
#include <assoc.h>
#endif
class TAnamag_application: public TRelation_application {
class TAnagrafica_magazzino: public TRelation_application {
TMask *_msk; // maschera principale
TRelation *_rel; // relazione principale di un solo file (anagrafiche di magazzino)
TLocalisamfile *_umart; // file di accesso alle unità di misura
@ -35,9 +21,9 @@ class TAnamag_application: public TRelation_application {
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 TMask *get_mask(int) { return _msk; }
virtual bool changing_mask(int) { return FALSE; }
virtual TRelation *get_relation() const { return _rel; }
virtual void init_insert_mode(TMask &);
virtual int read(TMask& m);
@ -50,13 +36,13 @@ class TAnamag_application: public TRelation_application {
static bool handle_sheet0_um(TMask_field &, KEY); // handler del campo UM dello sheet delle unità di misura
public:
TAnamag_application() {}
virtual ~TAnamag_application() {}
TAnagrafica_magazzino() {}
virtual ~TAnagrafica_magazzino() {}
};
bool TAnamag_application::user_create() {
bool TAnagrafica_magazzino::user_create() {
_msk= new TMask("VE2400");
_msk->set_handler(F_SHEET0, handle_sheet0);
_msk->set_handler(F_SHEET1, handle_sheet1);
@ -77,7 +63,7 @@ bool TAnamag_application::user_create() {
return TRUE;
}
bool TAnamag_application::user_destroy() {
bool TAnagrafica_magazzino::user_destroy() {
delete _linee_rec2;
delete _linee_rec1;
delete _linee_rec0;
@ -89,7 +75,7 @@ bool TAnamag_application::user_destroy() {
return TRUE;
}
int TAnamag_application::read(TMask& m) {
int TAnagrafica_magazzino::read(TMask& m) {
int err= TRelation_application::read(m);
if (err == NOERR) {
TRectype rum(_umart->curr()); // prende il record corrente dal file delle unità di misura
@ -146,7 +132,7 @@ int TAnamag_application::read(TMask& m) {
return err;
}
int TAnamag_application::write(const TMask& m) {
int TAnagrafica_magazzino::write(const TMask& m) {
int err= TRelation_application::write(m);
if (err == NOERR) {
TSheet_field &f0= (TSheet_field &)m.field(F_SHEET0);
@ -210,7 +196,7 @@ int TAnamag_application::write(const TMask& m) {
return err;
}
int TAnamag_application::rewrite(const TMask& m) {
int TAnagrafica_magazzino::rewrite(const TMask& m) {
int err= TRelation_application::rewrite(m);
if (err == NOERR) {
TSheet_field &f0= (TSheet_field &)m.field(F_SHEET0);
@ -274,7 +260,7 @@ int TAnamag_application::rewrite(const TMask& m) {
return err;
}
void TAnamag_application::init_insert_mode(TMask &m) {
void TAnagrafica_magazzino::init_insert_mode(TMask &m) {
TSheet_field &f= (TSheet_field &)m.field(F_SHEET0);
if (f.items()==0) {
TToken_string &row= f.row(-1); // aggiunge una riga allo sheet
@ -285,98 +271,109 @@ void TAnamag_application::init_insert_mode(TMask &m) {
}
}
bool TAnamag_application::handle_sheet0(TMask_field &fld, KEY k) {
bool TAnagrafica_magazzino::handle_sheet0(TMask_field &fld, KEY k) {
if (k==K_ENTER) {
TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente
TAssoc_array v; // istanzia l'hash table per il controllo di univocità
for (int i= 0; i<f.items(); i++) {
if (!v.add(f.cell(i,0))) { // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già
error_box("Le unità di misura devono essere diverse tra loro");
break;
}
}
return (i==f.items());
} else return TRUE;
}
bool TAnamag_application::handle_sheet1(TMask_field &fld, KEY k) {
if (k==K_ENTER) {
TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente
TAssoc_array v; // istanzia l'hash table per il controllo di univocità
for (int i= 0; i<f.items(); i++) {
if (!v.add(f.cell(i,0))) { // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già
error_box("I codici di lingua devono essere diversi tra loro");
break;
}
}
return (i==f.items());
} else return TRUE;
}
bool TAnamag_application::handle_sheet2(TMask_field &fld, KEY k) {
if (k==K_ENTER) {
TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente
TMask &m= fld.mask(); // prende la maschere d'origine del campo
TAssoc_array v; // istanzia l'hash table per il controllo di univocità
v.add(m.get(F_CODART)); // aggiunge all'hash table il codice articolo originale
for (int i= 0; i<f.items(); i++) {
if (!v.add(f.cell(i,0))) { // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già
error_box("I codici alternativi devono essere diversi tra loro e dal codice dell'articolo");
break;
}
}
return (i==f.items());
} else return TRUE;
}
bool TAnamag_application::handle_sheet0_um(TMask_field &fld, KEY k) {
if (k==K_TAB) {
TMask &m= fld.mask(); // prende la maschera d'origine del campo (maschera dello sheet)
TSheet_field *f= m.get_sheet(); // prende lo sheet d'origine della maschera del campo
CHECK(f != NULL, "Il puntatore allo sheet è nullo");
TString16 me(fld.get()); // prende il contenuto del campo corrente (unità di misura corrente)
if ((f->selected() != 0) && me.not_empty()) {
// ALGORITMO DI PRECALCOLO DEL RAPPORTO DELLE UNITA' DI MISURA NELLO SHEET
//
// SHEET:
// -----
// riga u.m. f.c.
// 1) KM 1 -> kilometri (you), riferiti al metro (your) con f.c. 1000 (your_fc)
// ... ... ...
// ...) MM X -> millimetri (me), riferiti al metro (my) con f.c. 0,001 (my_fc)
//
// se (your==my) allora X=(your_fc/my_fc) ...chiaro, no!? :-)
TTable t("%UM");
real x(0.0); // fattore di conversione dell'unità di misura corrente
const TString16 you(f->row(0).get(0)); // prende l'unità di misura di rapporto (dalla prima linea dello sheet)
t.zero();
t.put("CODTAB", me);
if (t.read() == NOERR) {
TString16 my(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura corrente
real my_fc(t.get_real("R0")); // prende il suo fattore di conversione
t.zero();
t.put("CODTAB", you);
if (t.read() == NOERR) {
TString16 your(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura di rapporto
real your_fc(t.get_real("R0")); // prende il suo fattore di conversione
if (your==my) {
x= your_fc/my_fc;
message_box("me:%s, my:%s, my_fc:%s, you:%s your:%s, your_fc:%s, x:%s", (const char *)me, (const char *)my, my_fc.stringa(), (const char *)you, (const char *)your, your_fc.stringa(), x.stringa());
} // NON FUNZIONA UN CAZZO!
if (f.items()>0) {
TAssoc_array v; // istanzia l'hash table per il controllo di univocità
for (int i= 0; i<f.items(); i++) {
if (v.add(f.cell(i,0))) { // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già
error_box("Le unità di misura devono essere diverse tra loro");
break;
}
real x(f.cell(i,1));
if (x.is_zero()) { // controlla che il fattore di conversione (secondo elemento) non sia 0
error_box("I fattori di conversione delle unità di misura non possono valere 0");
break;
}
}
TToken_string &row= f->row(f->selected()); // prende la riga corrente dello sheet
row.add(x.stringa(), 1); // inserisce il valore precalcolato (0 se non è possibile calcolarlo);
f->force_update(f->selected()); // forza l'aggiornamento della riga corrente dello sheet
return (i==f.items());
} else return TRUE;
} else return TRUE;
}
bool TAnagrafica_magazzino::handle_sheet1(TMask_field &fld, KEY k) {
if (k==K_ENTER) {
TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente
if (f.items()>1) {
TAssoc_array v; // istanzia l'hash table per il controllo di univocità
for (int i= 0; i<f.items(); i++) {
if (v.add(f.cell(i,0))) { // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già
error_box("I codici di lingua devono essere diversi tra loro");
break;
}
}
return (i==f.items());
} else return TRUE;
} else return TRUE;
}
bool TAnagrafica_magazzino::handle_sheet2(TMask_field &fld, KEY k) {
if (k==K_ENTER) {
TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente
if (f.items()>0) {
TMask &m= fld.mask(); // prende la maschere d'origine del campo
TAssoc_array v; // istanzia l'hash table per il controllo di univocità
v.add(m.get(F_CODART)); // aggiunge all'hash table il codice articolo originale
for (int i= 0; i<f.items(); i++) {
if (v.add(f.cell(i,0))) { // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già
error_box("I codici alternativi devono essere diversi tra loro e dal codice dell'articolo");
break;
}
}
return (i==f.items());
} else return TRUE;
} else return TRUE;
}
bool TAnagrafica_magazzino::handle_sheet0_um(TMask_field &fld, KEY k) {
if (k==K_TAB) {
TMask &m= fld.mask(); // prende la maschera d'origine del campo (maschera dello sheet)
TString16 me(fld.get()); // prende il contenuto del campo corrente (unità di misura corrente)
if (me.not_empty()) { // se il codice dell'unità di misura è vuoto non viene fatto alcun calcolo
TSheet_field *f= m.get_sheet(); // prende lo sheet d'origine della maschera del campo
CHECK(f != NULL, "Il puntatore allo sheet è nullo");
if (f->selected() != 0) {
// ALGORITMO DI PRECALCOLO DEL RAPPORTO DELLE UNITA' DI MISURA NELLO SHEET
//
// SHEET:
// -----
// riga u.m. f.c.
// 1) KM 1 -> kilometri (you), riferiti al metro (your) con f.c. 1000 (your_fc)
// ... ... ...
// ...) MM X -> millimetri (me), riferiti al metro (my) con f.c. 0,001 (my_fc)
//
// se (your==my) allora X=(my_fc/your_fc) ...chiaro, no!? :-)
TTable t("%UMS");
real x(0.0); // fattore di conversione dell'unità di misura corrente
const TString16 you(f->row(0).get(0)); // prende l'unità di misura di rapporto (dalla prima linea dello sheet)
t.zero();
t.put("CODTAB", me);
if (t.read() == NOERR) {
TString16 my(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura corrente
real my_fc(t.get_real("R0")); // prende il suo fattore di conversione
t.zero();
t.put("CODTAB", you);
if (t.read() == NOERR) {
TString16 your(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura di rapporto
real your_fc(t.get_real("R0")); // prende il suo fattore di conversione
if (your==my) {
x= my_fc/your_fc; // calcola il rapporto tra i fattori di conversione
x.round(5); // arrotonda il risultato a 5 decimali
}
}
}
m.set(FS_FCUM, x.stringa()); // il risultato viene scritto nel campo del fattore di conversione
}
}
}
return TRUE;
}
int ve2400(int argc, char* argv[]) {
TAnamag_application a;
TAnagrafica_magazzino a;
a.run(argc, argv, "Anagrafica di magazzino ");
return 0;

View File

@ -1,4 +1,3 @@
#include <lffiles.h>
#include "VE2400.H"
@ -47,7 +46,7 @@ END
GROUPBOX DLG_NULL 71 5
BEGIN
PROMPT 0 0 ""
FLAG "R"
//FLAG "R"
END
STRING F_GRMERC1 3
@ -61,7 +60,7 @@ END
STRING F_GRMERC1B 2
BEGIN
PROMPT 21 5 ""
FIELD LF_ANAGR->GRMERC1[4,5]
FIELD LF_ANAGR->GRMERC1[4,5]
GROUP 1
FLAG "U"
MESSAGE EMPTY CLEAR,2@
@ -101,7 +100,7 @@ END
STRING F_GRMERC2B 2
BEGIN
PROMPT 21 6 ""
FIELD LF_ANAGR->GRMERC2[4,5]
FIELD LF_ANAGR->GRMERC2[4,5]
GROUP 2
FLAG "U"
MESSAGE EMPTY CLEAR,3@
@ -142,7 +141,7 @@ END
STRING F_GRMERC3B 2
BEGIN
PROMPT 21 7 ""
FIELD LF_ANAGR->GRMERC3[4,5]
FIELD LF_ANAGR->GRMERC3[4,5]
GROUP 3
FLAG "U"
NUM_EXPR (#F_GRMERC3=="")||((#F_GRMERC3!=#F_GRMERC1)&&(#F_GRMERC3!=#F_GRMERC2))
@ -366,25 +365,25 @@ BEGIN
PROMPT 1 17 "Classe doganale "
FIELD LF_ANAGR->CLASSDOG
FLAG "UZ"
USE %CLD
INPUT CODTAB F_CLASSDOG
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CLASSDOG CODTAB
OUTPUT F_CLASSDOG1 S0
CHECKTYPE NORMAL
USE %CLD
INPUT CODTAB F_CLASSDOG
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CLASSDOG CODTAB
OUTPUT F_CLASSDOG1 S0
CHECKTYPE NORMAL
END
STRING F_CLASSDOG1 40
BEGIN
PROMPT 36 17 ""
FLAG "D"
USE %CLD KEY 2
INPUT S0 F_CLASSDOG1
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
OUTPUT F_CLASSDOG CODTAB
OUTPUT F_CLASSDOG1 S0
USE %CLD KEY 2
INPUT S0 F_CLASSDOG1
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
OUTPUT F_CLASSDOG CODTAB
OUTPUT F_CLASSDOG1 S0
END
ENDPAGE

View File

@ -1,7 +1,7 @@
#ifndef __VEUML1_H
#define __VEUML1_H
#ifndef __VEUML_H
#ifndef __VEUML_H
#include "VEUML.H"
#endif
@ -16,11 +16,11 @@
#define F_CIVCF 303
#define F_NOME_VAL 304
#define F_DESCODPAG 305
#define F_DATASCAD1 306
#define F_DATASCAD2 307
#define F_DATASCAD3 308
#define F_DATASCAD4 309
#define F_DATASCAD5 310
#define F_DATASCAD1 306
#define F_DATASCAD2 307
#define F_DATASCAD3 308
#define F_DATASCAD4 309
#define F_DATASCAD5 310
#define F_BANCA_APP 311
#define F_BANCA_PRE 312
#define F_INDSP 313