Patch level :2.0 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento :aggiunti files discolatio alla 32 bit git-svn-id: svn://10.65.10.50/trunk@11035 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
41b36659a8
commit
f6b085b355
dl
DL0.PDBDL0700.OBJDLINST.OBJcat2dl.inidl0.cppdl0.hdl00.bmpdl0500.cppdl0500.hdl0500a.frmdl0500a.hdl0500a.umldl0500b.hdl0500b.umldl0600.cppdl0600.hdl0600a.frmdl0600a.hdl0600a.umldl0700.cppdl0700.hdl0700a.frmdl0700a.hdl0700a.umldl0800.cppdl0800a.hdl0800a.umldl0900.cppdl0900a.hdl0900a.umldlinst.cppdlinst.urldlutils.cppdlutils.h
1
dl/DL0.PDB
Executable file
1
dl/DL0.PDB
Executable file
@ -0,0 +1 @@
|
||||
Microsoft C/C++ program database 1.00
|
BIN
dl/DL0700.OBJ
Executable file
BIN
dl/DL0700.OBJ
Executable file
Binary file not shown.
BIN
dl/DLINST.OBJ
Executable file
BIN
dl/DLINST.OBJ
Executable file
Binary file not shown.
@ -1,8 +1,11 @@
|
||||
[PARAMS]
|
||||
CODIVASTD =
|
||||
DLFILENAME =
|
||||
DLSITEPATH =
|
||||
LISTINGR = LI1
|
||||
LISTVEND = LI2
|
||||
OFFEINGR = OF1
|
||||
OFFEVEND = OF2
|
||||
OFFEINGR = I00
|
||||
OFFEVEND = V00
|
||||
|
||||
[MAIN]
|
||||
DECSEP =
|
||||
@ -75,7 +78,7 @@ LENGTH(2) = 15
|
||||
|
||||
NAME(3) = CTTITO
|
||||
TYPE(3) = STRINGA
|
||||
FIELD(3) = 47->USER1
|
||||
FIELD(3) = 47->DESCR
|
||||
POSITION(3) = 29
|
||||
LENGTH(3) = 40
|
||||
|
||||
@ -120,42 +123,42 @@ FIELD(10) = 47->USER6
|
||||
POSITION(10) = 141
|
||||
LENGTH(10) = 8
|
||||
|
||||
NAME(11) = CTPRIE //listino ingrosso prezzo
|
||||
NAME(11) = CTPRIE //listino ingrosso prezzo
|
||||
TYPE(11) = EURO
|
||||
POSITION(11) = 158
|
||||
LENGTH(11) = 9
|
||||
|
||||
NAME(12) = CTDIPI //offerta ingrosso dataini
|
||||
NAME(12) = CTDIPI //offerta ingrosso dataini
|
||||
TYPE(12) = DATA
|
||||
POSITION(12) = 167
|
||||
LENGTH(12) = 8
|
||||
|
||||
NAME(13) = CTDFPI //offerta ingrosso datafin
|
||||
NAME(13) = CTDFPI //offerta ingrosso datafin
|
||||
TYPE(13) = DATA
|
||||
POSITION(13) = 175
|
||||
LENGTH(13) = 8
|
||||
|
||||
NAME(14) = CTCAPE //offerta ingrosso prezzo
|
||||
NAME(14) = CTCAPE //offerta ingrosso prezzo
|
||||
TYPE(14) = EURO
|
||||
POSITION(14) = 192
|
||||
LENGTH(14) = 9
|
||||
|
||||
NAME(15) = CTPRVU //listino pubblico prezzo
|
||||
NAME(15) = CTPRVU //listino pubblico prezzo
|
||||
TYPE(15) = EURO
|
||||
POSITION(15) = 210
|
||||
LENGTH(15) = 9
|
||||
|
||||
NAME(16) = CTDIVE //campagna vendita dataini
|
||||
NAME(16) = CTDIVE //campagna vendita dataini
|
||||
TYPE(16) = DATA
|
||||
POSITION(16) = 219
|
||||
LENGTH(16) = 8
|
||||
|
||||
NAME(17) = CTDFVE //campagna vendita datafin
|
||||
NAME(17) = CTDFVE //campagna vendita datafin
|
||||
TYPE(17) = DATA
|
||||
POSITION(17) = 227
|
||||
LENGTH(17) = 8
|
||||
|
||||
NAME(18) = CTCAVU //campagna vendita prezzo
|
||||
NAME(18) = CTCAVU //campagna vendita prezzo
|
||||
TYPE(18) = EURO
|
||||
POSITION(18) = 244
|
||||
LENGTH(18) = 9
|
||||
|
18
dl/dl0.cpp
18
dl/dl0.cpp
@ -14,22 +14,16 @@ int main(int argc,char** argv)
|
||||
|
||||
switch (r)
|
||||
{
|
||||
/* case 0:
|
||||
rt = dl0100(argc,argv) ; break;
|
||||
case 1:
|
||||
rt = dl0200(argc,argv) ; break;
|
||||
case 2:
|
||||
rt = dl0300(argc,argv) ; break;
|
||||
case 3:
|
||||
rt = dl0400(argc,argv) ; break;
|
||||
case 4:
|
||||
rt = dl0500(argc,argv) ; break;
|
||||
rt = dl0500(argc,argv) ; break; //ricerca avanzata
|
||||
case 5:
|
||||
rt = dl0600(argc,argv) ; break;
|
||||
rt = dl0600(argc,argv) ; break; //interrogazione magazzino
|
||||
case 6:
|
||||
rt = dl0700(argc,argv) ; break; */
|
||||
rt = dl0700(argc,argv) ; break; //top ten
|
||||
case 7:
|
||||
rt = dl0800(argc,argv) ; break;
|
||||
rt = dl0800(argc,argv) ; break; //acquisizione dati da file testo formattato
|
||||
case 8:
|
||||
rt = dl0900(argc,argv) ; break; //invio ordini
|
||||
default:
|
||||
error_box(usage, argv[0]) ; break;
|
||||
}
|
||||
|
5
dl/dl0.h
5
dl/dl0.h
@ -4,11 +4,12 @@
|
||||
/*int dl0100(int argc, char* argv[]);
|
||||
int dl0200(int argc, char* argv[]);
|
||||
int dl0300(int argc, char* argv[]);
|
||||
int dl0400(int argc, char* argv[]);
|
||||
int dl0400(int argc, char* argv[]); */
|
||||
int dl0500(int argc, char* argv[]);
|
||||
int dl0600(int argc, char* argv[]);
|
||||
int dl0700(int argc, char* argv[]);*/
|
||||
int dl0700(int argc, char* argv[]);
|
||||
int dl0800(int argc, char* argv[]);
|
||||
int dl0900(int argc, char* argv[]);
|
||||
|
||||
#endif // __DL0_H
|
||||
|
||||
|
BIN
dl/dl00.bmp
Executable file
BIN
dl/dl00.bmp
Executable file
Binary file not shown.
After ![]() (image error) Size: 117 KiB |
406
dl/dl0500.cpp
406
dl/dl0500.cpp
@ -1,35 +1,110 @@
|
||||
#include <applicat.h>
|
||||
#include <filetext.h>
|
||||
#include <automask.h>
|
||||
#include <execp.h>
|
||||
#include <form.h>
|
||||
#include <mask.h>
|
||||
#include <relation.h>
|
||||
#include <tabutil.h>
|
||||
#include <printer.h>
|
||||
#include <progind.h>
|
||||
#include <recarray.h>
|
||||
#include <utility.h>
|
||||
#include <utility.h>
|
||||
|
||||
#include <doc.h>
|
||||
#include <rdoc.h>
|
||||
|
||||
#include "..\mg\umart.h"
|
||||
#include "..\mg\anamag.h"
|
||||
#include "..\ve\condv.h"
|
||||
#include "..\ve\rcondv.h"
|
||||
#include "dl0.h"
|
||||
#include "dl0500.h"
|
||||
#include "dl0500a.h"
|
||||
#include "dl0500b.h"
|
||||
|
||||
//-----FORM--------------------------------------------------------------------------------------//
|
||||
|
||||
class TRicerca_form : public TForm
|
||||
{
|
||||
|
||||
public:
|
||||
TRicerca_form();
|
||||
virtual ~TRicerca_form();
|
||||
};
|
||||
|
||||
TRicerca_form::TRicerca_form() :TForm ("dl0500a")
|
||||
{
|
||||
}
|
||||
|
||||
TRicerca_form::~TRicerca_form()
|
||||
{
|
||||
}
|
||||
|
||||
//-----AUTOMASK---------------------------------------------------------------------------------//
|
||||
|
||||
class TRicerca_mask : public TAutomask
|
||||
{
|
||||
TRelation * _rel;
|
||||
TCursor * _cur;
|
||||
|
||||
protected:
|
||||
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
public:
|
||||
|
||||
TRicerca_mask();
|
||||
|
||||
virtual ~TRicerca_mask(){};
|
||||
};
|
||||
|
||||
TRicerca_mask::TRicerca_mask() :TAutomask ("dl0500a")
|
||||
{
|
||||
}
|
||||
|
||||
bool TRicerca_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case F_P_BARCODE:
|
||||
case F_P_GIAC:
|
||||
case F_P_TITOLO:
|
||||
case F_P_ARTISTA:
|
||||
case F_P_COMPOSITORE:
|
||||
case F_P_PREZZO:
|
||||
case F_P_GENERE:
|
||||
case F_P_TIPOSUPPORTO:
|
||||
if (e == fe_close)
|
||||
{
|
||||
for (int i = 7; i >= 0; i--) //attenzione! e' necessario che gli ID dei bools siano contigui
|
||||
{
|
||||
if (get_bool(F_P_BARCODE+i))
|
||||
break;
|
||||
}
|
||||
if (i < 0)
|
||||
return error_box("Selezionare almeno un campo per la stampa");
|
||||
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
||||
class TRicerca: public TSkeleton_application
|
||||
{
|
||||
TMask* _msk;
|
||||
TRicerca_file* _trasfile;
|
||||
TString _listingr, _listvend, _offeingr, _offevend;
|
||||
TRicerca_mask * _mask;
|
||||
static TMask * _ordmask;
|
||||
bool _barcode, _giac, _titolo, _artista, _compositore, _prezzo, _genere, _tiposupp;
|
||||
|
||||
protected:
|
||||
virtual bool create(void);
|
||||
virtual void main_loop();
|
||||
virtual bool destroy(void);
|
||||
static bool annulla_handler(TMask_field& f, KEY k);
|
||||
|
||||
virtual void main_loop();
|
||||
static void process_link(int id, const char * lnk);
|
||||
static void genera_ordine();
|
||||
|
||||
public:
|
||||
const TMask& msk() const { return *_msk; }
|
||||
void add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const;
|
||||
void add_meta_filter(TString& filtro, const char * field, short id) const;
|
||||
void add_range_filter(TString& filtro, const char * field, short fid, short tid = -1) const;
|
||||
|
||||
TRicerca() {}
|
||||
virtual ~TRicerca() {}
|
||||
};
|
||||
@ -37,48 +112,305 @@ public:
|
||||
// restituisce un riferimento all' applicazione
|
||||
inline TRicerca& app() { return (TRicerca&) main_app();}
|
||||
|
||||
//la maschera dl0500b, essendo statica, va dichiarata anche fuori dalla classe
|
||||
TMask * TRicerca::_ordmask = NULL;
|
||||
|
||||
// creazione dell'applicazione
|
||||
bool TRicerca::create()
|
||||
{
|
||||
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
|
||||
_msk = new TMask("dl0500a");
|
||||
_msk->set(F_FILENAME,DLFILENAME);
|
||||
_trasfile = NULL;
|
||||
open_files(LF_ANAMAG, LF_UMART, LF_MAG, LF_DOC, LF_RCONDV, 0);
|
||||
_mask = new TRicerca_mask;
|
||||
|
||||
TConfig config("discolat.ini","ADVRES");
|
||||
_barcode = config.get_bool("BARCODE");
|
||||
_giac = config.get_bool("GIAC");
|
||||
_titolo = config.get_bool("TITOLO");
|
||||
_artista = config.get_bool("ARTISTA");
|
||||
_compositore = config.get_bool("COMPOSITORE");
|
||||
_prezzo = config.get_bool("PREZZO");
|
||||
_genere = config.get_bool("GENERE");
|
||||
_tiposupp = config.get_bool("TIPOSUPP");
|
||||
_mask->set(F_P_BARCODE, _barcode);
|
||||
_mask->set(F_P_GIAC, _giac);
|
||||
_mask->set(F_P_TITOLO, _titolo);
|
||||
_mask->set(F_P_ARTISTA, _artista);
|
||||
_mask->set(F_P_COMPOSITORE, _compositore);
|
||||
_mask->set(F_P_PREZZO, _prezzo);
|
||||
_mask->set(F_P_GENERE, _genere);
|
||||
_mask->set(F_P_TIPOSUPPORTO, _tiposupp);
|
||||
|
||||
const int leadtime = config.get_int("LEADTIME");
|
||||
|
||||
_ordmask = new TMask("dl0500b"); //creazione della maschera intermedia per la generazione righe ordini
|
||||
config.set_paragraph("SENDORD");
|
||||
_ordmask->set(F_CODCF, config.get("CODDL"));
|
||||
_ordmask->set(F_CODORD, config.get("CODORD"));
|
||||
|
||||
TDate datacons(TODAY);
|
||||
datacons += leadtime;
|
||||
_ordmask->set(F_DATACONS, datacons);
|
||||
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
|
||||
// distruzione dell'applicazione
|
||||
bool TRicerca::destroy()
|
||||
{
|
||||
delete _msk;
|
||||
{
|
||||
TConfig config("discolat.ini", "SENDORD");
|
||||
config.set("CODDL", _ordmask->get(F_CODCF));
|
||||
config.set("CODORD", _ordmask->get(F_CODORD));
|
||||
delete _ordmask;
|
||||
delete _mask;
|
||||
return TSkeleton_application::destroy();
|
||||
}
|
||||
|
||||
// carica la maschera
|
||||
void TRicerca::main_loop()
|
||||
{
|
||||
// Preimposta gli eventuali valori specificati sulla riga di comando
|
||||
//error_box("Attenzione: manca la configurazione del trasferimento!");
|
||||
KEY key = K_ENTER;
|
||||
while (key != K_QUIT)
|
||||
//aggiunge effettivamente una espressione ad un filtro
|
||||
void TRicerca::add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const
|
||||
{
|
||||
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
||||
if (!fld.empty()) //..se non e' vuoto
|
||||
{
|
||||
key = _msk->run();
|
||||
if (key == K_ENTER)
|
||||
transfer();
|
||||
}
|
||||
if (filtro.not_empty()) //distinzione tra filtro vuoto e filtro esistente
|
||||
filtro << "&&";
|
||||
if (fld.class_id() == CLASS_DATE_FIELD) //se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
|
||||
{
|
||||
const TDate data = fld.get();
|
||||
TString8 val = data.string(ANSI);
|
||||
filtro << "(ANSI(" << field << ")" << cmp << val << ")";
|
||||
}
|
||||
else
|
||||
filtro << "(" << field << cmp << "\"" << fld.get() << "\")"; //aggiunge il contenuto del campo al filtro
|
||||
}
|
||||
}
|
||||
|
||||
// handler per gestire la conferma dell'annullamento dei dati inseriti
|
||||
// nella maschera
|
||||
bool TRicerca::annulla_handler(TMask_field& f, KEY k)
|
||||
//aggiunge ad un filtro una espressione con l'*
|
||||
void TRicerca::add_meta_filter(TString& filtro, const char * field, short id) const
|
||||
{
|
||||
const TString& value = _mask->get(id);
|
||||
const char* cmp = "==";
|
||||
if (value.find('*') >= 0 || value.find('?') >= 0)
|
||||
cmp = "?=";
|
||||
add_expr_filter(filtro, field, id, cmp);
|
||||
}
|
||||
|
||||
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
||||
void TRicerca::add_range_filter(TString& filtro, const char * field, short fid, short tid) const
|
||||
{
|
||||
TMask &m = f.mask();
|
||||
if (k == K_SPACE)
|
||||
if (tid > fid)
|
||||
{
|
||||
if (yesno_box("Vuoi veramente annullare i dati inseriti"))
|
||||
m.reset();
|
||||
add_expr_filter(filtro, field, fid, ">=");
|
||||
add_expr_filter(filtro, field, tid, "<=");
|
||||
}
|
||||
else
|
||||
add_expr_filter(filtro, field, fid, "==");
|
||||
}
|
||||
|
||||
//metodo ascetico per generare le righe di uno sheet dalla setlinkhandler (vedi la chiamata + sotto)
|
||||
void TRicerca::process_link(int id, const char * lnk)
|
||||
{
|
||||
TSheet_field& sheet = _ordmask->sfield(F_RIGHE);
|
||||
TToken_string& row = sheet.row(-1);
|
||||
row = "1"; //mette innanzitutto la qta di default (1)
|
||||
row.add(lnk); //poi ci aggiunge il codart
|
||||
sheet.check_row(sheet.items()-1);
|
||||
|
||||
KEY k = _ordmask->run();
|
||||
switch(k)
|
||||
{
|
||||
case K_ESC:
|
||||
sheet.destroy(sheet.items()-1);
|
||||
break;
|
||||
case K_ENTER:
|
||||
break;
|
||||
default:
|
||||
genera_ordine(); //chiama il metodo x la generazione dell'ordine
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// metodo x la generazione dell'ordine
|
||||
void TRicerca::genera_ordine()
|
||||
{
|
||||
TFilename iniord; //creazione di un file di configurazione temporaneo contenente i dati dell'ordine
|
||||
iniord.temp("DL"); // il nome comincia con DL
|
||||
TConfig ini(iniord,"Transaction"); //paragrafo Transaction del file iniord
|
||||
ini.set("Action", "Insert");
|
||||
|
||||
const TDate datacons = _ordmask->get(F_DATACONS); //setta la data di consegna in base alla data di compilazione ordine
|
||||
const TDate oggi(TODAY); //e al leadtime che legge nel file discolat.ini
|
||||
const long leadtime = datacons - oggi;
|
||||
if (leadtime > 0)
|
||||
{
|
||||
TConfig inidata("discolat.ini", "ADVRES");
|
||||
inidata.set("LEADTIME", leadtime);
|
||||
}
|
||||
|
||||
//paragrafo testata documento ordine
|
||||
TString16 para;
|
||||
para.format("%d",LF_DOC);
|
||||
|
||||
ini.set_paragraph(para); //paragrafo della testata: scrive tutti i parametri utili nell'ini
|
||||
ini.set(DOC_PROVV, "D");
|
||||
ini.set(DOC_ANNO, oggi.year()); //anno di compilazione ordine
|
||||
ini.set(DOC_CODNUM, _ordmask->get(F_CODORD)); //codice numerazione ordine
|
||||
ini.set(DOC_TIPODOC, _ordmask->get(F_TIPODOC)); //tipo documento dell'ordine
|
||||
ini.set(DOC_TIPOCF, "F");
|
||||
ini.set(DOC_CODCF, _ordmask->get(F_CODCF)); //codice fornitore
|
||||
ini.set(DOC_DATACONS, datacons); //data di consegna
|
||||
|
||||
TConfig inilist("cat2dl.ini", "PARAMS"); //codice del listino all'ingrosso
|
||||
ini.set(DOC_CODLIST, inilist.get("LISTINGR"));
|
||||
|
||||
//l'ordine deve essere aggiunto come il successivo all'ultimo gia' presente nelle testate documento
|
||||
TLocalisamfile doc(LF_DOC); //prepara i dati della chiave 1 a meno del campo NDOC
|
||||
doc.put(DOC_PROVV, ini.get(DOC_PROVV));
|
||||
doc.put(DOC_ANNO, ini.get(DOC_ANNO));
|
||||
doc.put(DOC_CODNUM, ini.get(DOC_CODNUM));
|
||||
const TRectype test(doc.curr()); //come record di confronto si prende quello corrente
|
||||
doc.put(DOC_NDOC, "9999999");
|
||||
|
||||
/* long ndoc = 1; //metodo per autonumerare il documento (ultimo +1); tolto x' la DL setta a TRUE il flag di..
|
||||
int err = doc.read(_isgreat); //..autonumerazione nelle vendite
|
||||
if (err == NOERR)
|
||||
err = doc.prev();
|
||||
else
|
||||
err = doc.last();
|
||||
if (err == NOERR)
|
||||
{
|
||||
if (doc.curr().compare_key(test,1,1)==0) //confronta la chiave del record appena trovato con quella del
|
||||
ndoc+=doc.get_long(DOC_NDOC); //record campione (test), a meno dell'ultimo campo NDOC
|
||||
}
|
||||
ini.set(DOC_NDOC, ndoc); */ //trovato il primo numero libero documento libero lo scrive nell'ini
|
||||
|
||||
//paragrafi delle righe dell'ordine
|
||||
TSheet_field& sheet = _ordmask->sfield(F_RIGHE);
|
||||
TString80 codart;
|
||||
for (int i = 0; i < sheet.items(); i++)
|
||||
{
|
||||
para.format("%d,%d",LF_RIGHEDOC,i+1);
|
||||
ini.set_paragraph(para);
|
||||
TToken_string& row = sheet.row(i);
|
||||
real qta = row.get(0); //la qta sta nel primo campo dello sheet...
|
||||
codart = row.get(1); //..il codart nella seconda
|
||||
ini.set(RDOC_TIPORIGA, "01"); //tiporigamerce
|
||||
ini.set(RDOC_CODART, codart);
|
||||
// ini.set(RDOC_CODARTMAG, codart); inutile
|
||||
ini.set(RDOC_QTA, qta.string());
|
||||
}
|
||||
ini.set_paragraph("Transaction"); //forza la scrittura dell'ultimo paragrafo!
|
||||
|
||||
//prepara la stringa di esecuzione del programma degli ordini e lo lancia
|
||||
TString cmd;
|
||||
cmd << "ve0 -0 /i" << iniord;
|
||||
TExternal_app app(cmd);
|
||||
app.run();
|
||||
|
||||
sheet.destroy(); //accoppa lo sheet da cui e' nato l'ordine
|
||||
::remove(iniord); //sopprime il file temporaneo
|
||||
}
|
||||
|
||||
static TString16 fast_field;
|
||||
static TString80 fast_value;
|
||||
static bool meta_type;
|
||||
|
||||
static bool fast_filter(const TRelation* rel)
|
||||
{
|
||||
const TRectype& rec = rel->curr();
|
||||
if (meta_type)
|
||||
return rec.get(fast_field).match(fast_value);
|
||||
return rec.get(fast_field) == fast_value;
|
||||
}
|
||||
|
||||
void TRicerca::main_loop()
|
||||
{
|
||||
while (_mask->run() == K_ENTER)
|
||||
{
|
||||
//prende dalla maschera i booleani dei campi da stampare...
|
||||
_barcode = _mask->get_bool(F_P_BARCODE);
|
||||
_giac = _mask->get_bool(F_P_GIAC);
|
||||
_titolo = _mask->get_bool(F_P_TITOLO);
|
||||
_artista = _mask->get_bool(F_P_ARTISTA);
|
||||
_compositore = _mask->get_bool(F_P_COMPOSITORE);
|
||||
_prezzo = _mask->get_bool(F_P_PREZZO);
|
||||
_genere = _mask->get_bool(F_P_GENERE);
|
||||
_tiposupp = _mask->get_bool(F_P_TIPOSUPPORTO);
|
||||
//..e li scrive nel file ini
|
||||
TConfig config("discolat.ini","ADVRES");
|
||||
config.set("BARCODE", _barcode);
|
||||
config.set("GIAC", _giac);
|
||||
config.set("TITOLO", _titolo);
|
||||
config.set("ARTISTA", _artista);
|
||||
config.set("COMPOSITORE", _compositore);
|
||||
config.set("PREZZO", _prezzo);
|
||||
config.set("GENERE", _genere);
|
||||
config.set("TIPOSUPP", _tiposupp);
|
||||
|
||||
TString16 nomecampo;
|
||||
//laboriosissima costruzione del filtro
|
||||
TString filtro;
|
||||
|
||||
add_range_filter(filtro, ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
|
||||
|
||||
add_meta_filter(filtro, ANAMAG_DESCR, F_TITOLO);
|
||||
add_meta_filter(filtro, ANAMAG_USER2, F_ARTISTA);
|
||||
add_meta_filter(filtro, ANAMAG_USER3, F_COMPOSITORE);
|
||||
add_meta_filter(filtro, ANAMAG_USER4, F_ETICHETTA);
|
||||
|
||||
add_range_filter(filtro, ANAMAG_GRMERC, F_GENEREMUSICALE);
|
||||
add_range_filter(filtro, ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
||||
add_range_filter(filtro, ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
||||
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
||||
nomecampo.format("%d->%s", LF_UMART, "UM");
|
||||
add_range_filter(filtro, nomecampo, F_TIPOSUPPORTO);
|
||||
|
||||
// setta i links presenti nel form (sono gli elementi scritti in blu(b) su bianco(w))
|
||||
// procedimento standard in questi casi
|
||||
TArray& arr = printer().links();
|
||||
if (arr.items() == 0)
|
||||
arr.add(new TToken_string("Ordina|b|w"));
|
||||
printer().setlinkhandler(process_link);
|
||||
|
||||
|
||||
//dopo il filtrone tocca al cursore x scandire i records
|
||||
TRicerca_form form;
|
||||
//ottimizzazione tempi di ricerca: caso di filtro semplice (senza AND, con ?= o ==)
|
||||
|
||||
if (filtro.find("&&") < 0 && filtro.find('=') > 0)
|
||||
{
|
||||
filtro.strip("()");
|
||||
meta_type = filtro.find("?=") > 0;
|
||||
const int pos = filtro.rfind('=');
|
||||
fast_value = filtro.mid(pos+1);
|
||||
fast_value.strip("\"");
|
||||
fast_field = filtro.left(pos-1);
|
||||
|
||||
form.cursor()->set_filterfunction(fast_filter, !_mask->field(F_TIPOSUPPORTO).empty());
|
||||
}
|
||||
else
|
||||
form.cursor()->setfilter(filtro, !_mask->field(F_TIPOSUPPORTO).empty());
|
||||
|
||||
//setta il form columnwise
|
||||
form.find_field('B', odd_page, FF_B_CODART).show(_barcode);
|
||||
form.find_field('B', odd_page, FF_B_GIAC).show(_giac);
|
||||
form.find_field('B', odd_page, FF_B_TITOLO).show(_titolo);
|
||||
form.find_field('B', odd_page, FF_B_ARTISTA).show(_artista);
|
||||
form.find_field('B', odd_page, FF_B_COMPOSITORE).show(_compositore);
|
||||
form.find_field('B', odd_page, FF_B_PREZZO).show(_prezzo);
|
||||
form.find_field('B', odd_page, FF_B_GENERE).show(_genere);
|
||||
form.find_field('B', odd_page, FF_B_SUPPORTO).show(_tiposupp);
|
||||
//procedimento mistico di costruzione del form columnwise
|
||||
const int hh = 5; //altezza header = 5 righe
|
||||
int rows[4];
|
||||
rows[0] = hh - 2;
|
||||
rows[1] = hh;
|
||||
rows[2] = printer().formlen();
|
||||
rows[3] = 0;
|
||||
|
||||
form.genera_intestazioni(odd_page, hh - 1);
|
||||
form.genera_fincatura(odd_page, hh - 2, rows[2], rows);
|
||||
|
||||
form.print();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int dl0500(int argc, char* argv[])
|
||||
|
13
dl/dl0500.h
Executable file
13
dl/dl0500.h
Executable file
@ -0,0 +1,13 @@
|
||||
// campi form Interrogazione (discolatio interrogatio)
|
||||
|
||||
#define FF_B_CODART 11
|
||||
#define FF_B_GIAC 12
|
||||
#define FF_B_TITOLO 13
|
||||
#define FF_B_ARTISTA 14
|
||||
#define FF_B_PREZZO 15
|
||||
#define FF_B_GENERE 16
|
||||
#define FF_B_SUPPORTO 17
|
||||
#define FF_B_COMPOSITORE 18
|
||||
|
||||
#define FF_DATE 21
|
||||
#define FF_PAGE 22
|
123
dl/dl0500a.frm
Executable file
123
dl/dl0500a.frm
Executable file
@ -0,0 +1,123 @@
|
||||
#include "dl0500.h"
|
||||
|
||||
USE LF_ANAMAG
|
||||
JOIN LF_UMART INTO CODART==CODART NRIGA=="1"
|
||||
END
|
||||
|
||||
//-------------------------intestazione form-----------------------------------------------//
|
||||
SECTION HEADER ODD 5
|
||||
|
||||
STRINGA -1
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 1 1 "@bRICERCA AVANZATA"
|
||||
END
|
||||
|
||||
DATA FF_DATE
|
||||
BEGIN
|
||||
KEY "Data"
|
||||
PROMPT 1 2 "@bData "
|
||||
MESSAGE _TODAY
|
||||
END
|
||||
|
||||
NUMERO FF_PAGE
|
||||
BEGIN
|
||||
KEY "Nr. pagina"
|
||||
PROMPT 120 2 "@bPagina "
|
||||
MESSAGE _PAGENO
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
//-----------------------riga tipo uno---------------------------------------------------//
|
||||
SECTION BODY ODD 1 COLUMNWISE
|
||||
|
||||
STRINGA FF_B_CODART 20
|
||||
BEGIN
|
||||
KEY "codart"
|
||||
PROMPT 1 1 "$[b]"
|
||||
SPECIAL STRINGA INTESTAZIONE "Cod. articolo" "Codice articolo"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD CODART
|
||||
END
|
||||
|
||||
STRINGA -1
|
||||
BEGIN
|
||||
KEY "spegnitore del colore"
|
||||
PROMPT 2 1 "$[n]"
|
||||
END
|
||||
|
||||
NUMERO FF_B_GIAC 7
|
||||
BEGIN
|
||||
KEY "giacenza"
|
||||
PROMPT 2 1 ""
|
||||
PICTURE "###.##@"
|
||||
SPECIAL STRINGA INTESTAZIONE "Giac." "Giacenza"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
END
|
||||
|
||||
STRINGA FF_B_TITOLO 40
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 3 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Titolo" "Titolo"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD DESCR
|
||||
END
|
||||
|
||||
STRINGA FF_B_ARTISTA 18
|
||||
BEGIN
|
||||
KEY "artista"
|
||||
PROMPT 4 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Artista" "Artista"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD USER2
|
||||
END
|
||||
|
||||
STRINGA FF_B_COMPOSITORE 18
|
||||
BEGIN
|
||||
KEY "compositore"
|
||||
PROMPT 5 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Compositore" "Compositore"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD USER3
|
||||
END
|
||||
|
||||
VALUTA FF_B_PREZZO 10
|
||||
BEGIN
|
||||
KEY "prezzo articolo"
|
||||
PROMPT 6 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Prezzo" "Prezzo"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD LF_UMART->PREZZO //notare che il prezzo dell'articolo viene proposto come quello di listino ingrosso
|
||||
//(vedi programma importazione dati!)
|
||||
END
|
||||
|
||||
STRINGA FF_B_GENERE 3
|
||||
BEGIN
|
||||
KEY "genere"
|
||||
PROMPT 7 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Gen" "Genere"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD GRMERC
|
||||
END
|
||||
|
||||
STRINGA FF_B_SUPPORTO 3
|
||||
BEGIN
|
||||
KEY "supporto"
|
||||
PROMPT 8 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Sup" "Tipo supporto"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD LF_UMART->UM
|
||||
END
|
||||
|
||||
END
|
||||
|
13
dl/dl0500a.h
13
dl/dl0500a.h
@ -1,7 +1,7 @@
|
||||
// ricerca avanzata
|
||||
// definizione campi per maschera di selezione dl0500a
|
||||
|
||||
#define F_BARCODE 101
|
||||
#define F_DABARCODE 101
|
||||
#define F_TIPOSUPPORTO 102
|
||||
#define F_TITOLO 103
|
||||
#define F_ARTISTA 104
|
||||
@ -12,5 +12,14 @@
|
||||
#define F_DATAE_FIN 109
|
||||
#define F_DATAV_INI 110
|
||||
#define F_DATAV_FIN 111
|
||||
#define F_D_TIPOSUPPORTO 112
|
||||
#define F_ABARCODE 112
|
||||
|
||||
#define F_P_BARCODE 115
|
||||
#define F_P_GIAC 116
|
||||
#define F_P_TITOLO 117
|
||||
#define F_P_ARTISTA 118
|
||||
#define F_P_COMPOSITORE 119
|
||||
#define F_P_PREZZO 120
|
||||
#define F_P_GENERE 121
|
||||
#define F_P_TIPOSUPPORTO 122
|
||||
|
||||
|
149
dl/dl0500a.uml
149
dl/dl0500a.uml
@ -1,74 +1,177 @@
|
||||
#include "dl0500a.h"
|
||||
|
||||
TOOLBAR "" 0 20 0 2
|
||||
PAGE "Ricerca avanzata" -1 -1 70 19
|
||||
|
||||
BUTTON DLG_OK 9 2
|
||||
GROUPBOX DLG_NULL 68 11
|
||||
BEGIN
|
||||
PROMPT -12 -11 ""
|
||||
PROMPT 1 1 "@bParametri di selezione"
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 9 2
|
||||
STRING F_DABARCODE 20
|
||||
BEGIN
|
||||
PROMPT -22 -11 ""
|
||||
PROMPT 2 2 "Barcode da: "
|
||||
FLAGS "U"
|
||||
USE LF_ANAMAG KEY 1
|
||||
INPUT CODART F_DABARCODE
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
OUTPUT F_DABARCODE CODART
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Ricerca avanzata" -1 -1 78 20
|
||||
|
||||
STRING F_BARCODE 20
|
||||
STRING F_ABARCODE 20
|
||||
BEGIN
|
||||
PROMPT 2 1 "Barcode "
|
||||
PROMPT 43 2 "a: "
|
||||
FLAGS "U"
|
||||
USE LF_ANAMAG KEY 1
|
||||
INPUT CODART F_ABARCODE
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
OUTPUT F_ABARCODE CODART
|
||||
END
|
||||
|
||||
STRING F_TIPOSUPPORTO 10
|
||||
BEGIN
|
||||
PROMPT 2 2 "Tipo supporto "
|
||||
FLAGS "U"
|
||||
PROMPT 2 3 "Tipo supporto "
|
||||
USE %UMS
|
||||
INPUT CODTAB F_TIPOSUPPORTO
|
||||
DISPLAY "Tipo supporto" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_TIPOSUPPORTO CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_TITOLO 40
|
||||
STRING F_TITOLO 50 45
|
||||
BEGIN
|
||||
PROMPT 2 3 "Titolo "
|
||||
PROMPT 2 4 "Titolo "
|
||||
FLAGS "U"
|
||||
USE LF_ANAMAG KEY 2
|
||||
INPUT DESCR F_TITOLO
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
COPY OUTPUT F_DABARCODE
|
||||
END
|
||||
|
||||
STRING F_ARTISTA 20
|
||||
BEGIN
|
||||
PROMPT 2 4 "Artista "
|
||||
PROMPT 2 5 "Artista "
|
||||
FLAGS "U"
|
||||
COPY USE F_DABARCODE
|
||||
INPUT USER2 F_ARTISTA
|
||||
DISPLAY "Artista@30" USER2
|
||||
OUTPUT F_ARTISTA USER2
|
||||
END
|
||||
|
||||
STRING F_COMPOSITORE 20
|
||||
BEGIN
|
||||
PROMPT 2 5 "Compositore "
|
||||
PROMPT 2 6 "Compositore "
|
||||
FLAGS "U"
|
||||
COPY USE F_DABARCODE
|
||||
INPUT USER3 F_COMPOSITORE
|
||||
DISPLAY "Compositore@30" USER3
|
||||
OUTPUT F_COMPOSITORE USER3
|
||||
END
|
||||
|
||||
STRING F_ETICHETTA 20
|
||||
BEGIN
|
||||
PROMPT 2 6 "Etichetta "
|
||||
PROMPT 2 7 "Etichetta "
|
||||
FLAGS "U"
|
||||
COPY USE F_DABARCODE
|
||||
INPUT USER4 F_ETICHETTA
|
||||
DISPLAY "Etichetta@30" USER4
|
||||
OUTPUT F_ETICHETTA USER4
|
||||
END
|
||||
|
||||
STRING F_GENEREMUSICALE
|
||||
STRING F_GENEREMUSICALE 3
|
||||
BEGIN
|
||||
PROMPT 2 7 "Genere musicale "
|
||||
PROMPT 2 8 "Genere musicale "
|
||||
FLAGS "U"
|
||||
USE GMC
|
||||
INPUT CODTAB F_GENEREMUSICALE
|
||||
DISPLAY "Genere" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_GENEREMUSICALE CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
DATE F_DATAE_INI
|
||||
BEGIN
|
||||
PROMPT 2 8 "Data emissione: da "
|
||||
PROMPT 2 9 "Data emissione: da "
|
||||
END
|
||||
|
||||
DATE F_DATAE_FIN
|
||||
BEGIN
|
||||
PROMPT 35 8 "a "
|
||||
PROMPT 35 9 "a "
|
||||
VALIDATE DATE_CMP_FUNC >= F_DATAE_INI
|
||||
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
|
||||
END
|
||||
|
||||
DATE F_DATAV_INI
|
||||
BEGIN
|
||||
PROMPT 2 9 "Data variazione da "
|
||||
PROMPT 2 10 "Data variazione da "
|
||||
END
|
||||
|
||||
DATE F_DATAV_FIN
|
||||
BEGIN
|
||||
PROMPT 35 9 "a "
|
||||
PROMPT 35 10 "a "
|
||||
VALIDATE DATE_CMP_FUNC >= F_DATAV_INI
|
||||
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 68 6
|
||||
BEGIN
|
||||
PROMPT 1 12 "@bCampi da stampare"
|
||||
END
|
||||
|
||||
BOOL F_P_BARCODE
|
||||
BEGIN
|
||||
PROMPT 2 13 "Codice articolo"
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
BOOL F_P_GIAC
|
||||
BEGIN
|
||||
PROMPT 25 13 "Giacenza"
|
||||
END
|
||||
|
||||
BOOL F_P_TITOLO
|
||||
BEGIN
|
||||
PROMPT 2 14 "Titolo"
|
||||
END
|
||||
|
||||
BOOL F_P_ARTISTA
|
||||
BEGIN
|
||||
PROMPT 25 14 "Artista"
|
||||
END
|
||||
|
||||
BOOL F_P_COMPOSITORE
|
||||
BEGIN
|
||||
PROMPT 2 15 "Compositore"
|
||||
END
|
||||
|
||||
BOOL F_P_PREZZO
|
||||
BEGIN
|
||||
PROMPT 25 15 "Prezzo"
|
||||
END
|
||||
|
||||
BOOL F_P_GENERE
|
||||
BEGIN
|
||||
PROMPT 2 16 "Genere"
|
||||
END
|
||||
|
||||
BOOL F_P_TIPOSUPPORTO
|
||||
BEGIN
|
||||
PROMPT 25 16 "Tipo supporto"
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -12 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -22 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
14
dl/dl0500b.h
Executable file
14
dl/dl0500b.h
Executable file
@ -0,0 +1,14 @@
|
||||
// campi maschera dl0500b.msk
|
||||
|
||||
#define F_CODCF 201
|
||||
#define F_RIGHE 202
|
||||
#define F_RAGSOC 203
|
||||
#define F_CODORD 204
|
||||
#define F_TIPODOC 205
|
||||
#define F_DATACONS 206
|
||||
|
||||
#define F_QTA 101
|
||||
#define F_BARCODE 102
|
||||
#define F_TITLE 103
|
||||
|
||||
|
125
dl/dl0500b.uml
Executable file
125
dl/dl0500b.uml
Executable file
@ -0,0 +1,125 @@
|
||||
#include "dl0500b.h"
|
||||
|
||||
PAGE "Generazione ordini" -1 -1 71 19
|
||||
|
||||
NUMBER F_CODCF 6
|
||||
BEGIN
|
||||
PROMPT 1 1 "Codice fornitore "
|
||||
USE LF_CLIFO KEY 1
|
||||
INPUT TIPOCF "F"
|
||||
INPUT CODCF F_CODCF
|
||||
DISPLAY "Codice" CODCF
|
||||
DISPLAY "Ragione sociale@50" RAGSOC
|
||||
OUTPUT F_CODCF CODCF
|
||||
OUTPUT F_RAGSOC RAGSOC
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_RAGSOC 50
|
||||
BEGIN
|
||||
PROMPT 1 2 "Ragione sociale "
|
||||
USE LF_CLIFO KEY 2
|
||||
INPUT TIPOCF "F"
|
||||
INPUT RAGSOC F_RAGSOC
|
||||
DISPLAY "Ragione sociale@50" RAGSOC
|
||||
DISPLAY "Codice" CODCF
|
||||
COPY OUTPUT F_CODCF
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_CODORD 4
|
||||
BEGIN
|
||||
PROMPT 1 3 "Numerazione ordini "
|
||||
USE %NUM SELECT (I1=="3")&&(B1=="X")
|
||||
INPUT CODTAB F_CODORD
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
DISPLAY "Numeraz. autom." B1
|
||||
OUTPUT F_CODORD CODTAB
|
||||
OUTPUT F_TIPODOC S2[1,4]
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_TIPODOC 4
|
||||
BEGIN
|
||||
PROMPT 30 3 "Tipo documento "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
DATE F_DATACONS
|
||||
BEGIN
|
||||
PROMPT 1 4 "Data consegna "
|
||||
END
|
||||
|
||||
SPREADSHEET F_RIGHE 0 -3
|
||||
BEGIN
|
||||
PROMPT 1 5 "@bRighe ordine "
|
||||
ITEM "Quantita'"
|
||||
ITEM "Codice a barre"
|
||||
ITEM "Titolo"
|
||||
END
|
||||
|
||||
BUTTON DLG_ELABORA 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 "~Elabora"
|
||||
PICTURE BMP_ELABORA
|
||||
MESSAGE EXIT,K_INS
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
ENDMASK
|
||||
|
||||
//----------------------------------righe sheet-------------------------------------
|
||||
PAGE "Articoli selezionati" -1 -1 45 5
|
||||
|
||||
NUMBER F_QTA 10
|
||||
BEGIN
|
||||
PROMPT 1 1 "Quantita' "
|
||||
END
|
||||
|
||||
STRING F_BARCODE 20
|
||||
BEGIN
|
||||
PROMPT 1 2 "Codice a barre "
|
||||
USE LF_ANAMAG KEY 1
|
||||
INPUT CODART F_BARCODE
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
OUTPUT F_BARCODE CODART
|
||||
OUTPUT F_TITLE DESCR
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_TITLE 50 35
|
||||
BEGIN
|
||||
PROMPT 1 3 "Titolo "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_DELREC 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
341
dl/dl0600.cpp
Executable file
341
dl/dl0600.cpp
Executable file
@ -0,0 +1,341 @@
|
||||
#include <applicat.h>
|
||||
#include <automask.h>
|
||||
#include <form.h>
|
||||
#include <relation.h>
|
||||
#include <printer.h>
|
||||
#include <progind.h>
|
||||
#include <recarray.h>
|
||||
#include <utility.h>
|
||||
#include <utility.h>
|
||||
|
||||
#include "..\mg\umart.h"
|
||||
#include "..\mg\anamag.h"
|
||||
#include "..\mg\mglib.h"
|
||||
#include "..\ve\condv.h"
|
||||
#include "..\ve\rcondv.h"
|
||||
#include "dl0.h"
|
||||
#include "dl0600.h"
|
||||
#include "dl0600a.h"
|
||||
|
||||
//-----FORM--------------------------------------------------------------------------------------//
|
||||
|
||||
class TIntmag_form : public TForm
|
||||
{
|
||||
TArray _lista_offerte;
|
||||
TString4 _codoff, _codlis;
|
||||
TArticolo_giacenza _artgiac;
|
||||
TDate _oggi;
|
||||
|
||||
public:
|
||||
virtual bool validate(TForm_item& cf, TToken_string& s);
|
||||
TIntmag_form();
|
||||
virtual ~TIntmag_form();
|
||||
};
|
||||
|
||||
bool TIntmag_form::validate(TForm_item &cf, TToken_string &s)
|
||||
{
|
||||
const TString16 code(s.get(0));
|
||||
|
||||
if (code == "_GIACENZA")
|
||||
{
|
||||
TRectype& recanamag = cf.form().cursor()->curr(); //prende il record corrente
|
||||
_artgiac.read(recanamag);
|
||||
real giac_anno = _artgiac.giacenza_anno("","",TDate(TODAY).year());
|
||||
cf.set(giac_anno.string());
|
||||
return TRUE;
|
||||
}
|
||||
if (code == "_ORDF")
|
||||
{
|
||||
TString8 anno;
|
||||
anno.format("%d",_oggi.year());
|
||||
int nriga = _artgiac.find_mag(anno);
|
||||
if (nriga > 0)
|
||||
{
|
||||
const TRectype& magrec = _artgiac.mag(anno)[nriga];
|
||||
cf.set(magrec.get(MAG_ORDF));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (code == "_ACQ")
|
||||
{
|
||||
TString8 anno;
|
||||
anno.format("%d",_oggi.year());
|
||||
int nriga = _artgiac.find_mag(anno);
|
||||
if (nriga > 0)
|
||||
{
|
||||
const TRectype& magrec = _artgiac.mag(anno)[nriga];
|
||||
cf.set(magrec.get(MAG_ACQ));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (code == "_VEN")
|
||||
{
|
||||
TString8 anno;
|
||||
anno.format("%d",_oggi.year());
|
||||
int nriga = _artgiac.find_mag(anno);
|
||||
if (nriga > 0)
|
||||
{
|
||||
const TRectype& magrec = _artgiac.mag(anno)[nriga];
|
||||
cf.set(magrec.get(MAG_VEN));
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (code == "_PREZZO")
|
||||
{ //crea la lista delle offerte valide (campagne di vendita in corso)
|
||||
if (_lista_offerte.items() == 0)
|
||||
{
|
||||
TLocalisamfile condv(LF_CONDV);
|
||||
for (int err = condv.first(); err == NOERR; err = condv.next())
|
||||
{
|
||||
if (condv.get_char(CONDV_TIPO) == 'O' && condv.get_char(CONDV_COD) == _codoff[0] &&
|
||||
_oggi >= condv.get_date(CONDV_VALIN) && _oggi <= condv.get_date(CONDV_VALFIN))
|
||||
_lista_offerte.add(condv.curr());
|
||||
}
|
||||
}
|
||||
|
||||
TString prezzo;
|
||||
TString4 lo;
|
||||
for (int i = _lista_offerte.last(); i>=0 && prezzo.empty(); i--)
|
||||
{
|
||||
const TRectype& condv = (const TRectype&) _lista_offerte[i];
|
||||
|
||||
TToken_string chiave;
|
||||
chiave.add('O'); //TIPO = offerta
|
||||
chiave.add(" "); //CATVEN = " "
|
||||
chiave.add(" "); //TIPOCF = " "
|
||||
chiave.add(" "); //CODCF = " "
|
||||
lo = condv.get(CONDV_COD);
|
||||
chiave.add(lo); //COD = cod offerta
|
||||
chiave.add("A"); //TIPORIGA = A
|
||||
chiave.add(_artgiac.codice()); //CODRIGA
|
||||
chiave.add(_artgiac.um().row(1).get(UMART_UM)); //UM = supporto
|
||||
chiave.add(" "); //NSCAGL = " "
|
||||
prezzo = cache().get(LF_RCONDV, chiave, "PREZZO");
|
||||
}
|
||||
|
||||
if (prezzo.empty())
|
||||
{
|
||||
TToken_string chiave;
|
||||
chiave.add('L'); //TIPO = offerta
|
||||
chiave.add(" "); //CATVEN = " "
|
||||
chiave.add(" "); //TIPOCF = " "
|
||||
chiave.add(" "); //CODCF = " "
|
||||
lo = _codlis;
|
||||
chiave.add(_codlis); //COD = cod listino
|
||||
chiave.add("A"); //TIPORIGA = A
|
||||
chiave.add(_artgiac.codice()); //CODRIGA
|
||||
chiave.add(_artgiac.um().row(1).get(UMART_UM)); //UM = supporto
|
||||
chiave.add(" "); //NSCAGL = " "
|
||||
prezzo = cache().get(LF_RCONDV, chiave, "PREZZO");
|
||||
}
|
||||
cf.set(prezzo); //lo passa al form x la stampa
|
||||
|
||||
TForm_item& condv = cf.section().find_field(s.get_int(1));
|
||||
condv.set(lo);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
return TForm::validate(cf, s);
|
||||
}
|
||||
|
||||
|
||||
TIntmag_form::TIntmag_form() :TForm ("dl0600a"),_oggi(TODAY)
|
||||
{
|
||||
TConfig config("cat2dl.ini","PARAMS"); //gli serve il prefisso delle campagne di offerta (vendita)
|
||||
_codoff = config.get("OFFEVEND");
|
||||
_codlis = config.get("LISTVEND");
|
||||
}
|
||||
|
||||
TIntmag_form::~TIntmag_form()
|
||||
{
|
||||
}
|
||||
|
||||
//-----AUTOMASK---------------------------------------------------------------------------------//
|
||||
|
||||
class TIntmag_mask : public TAutomask
|
||||
{
|
||||
TRelation * _rel;
|
||||
TCursor * _cur;
|
||||
|
||||
protected:
|
||||
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
public:
|
||||
|
||||
TIntmag_mask();
|
||||
|
||||
virtual ~TIntmag_mask(){};
|
||||
};
|
||||
|
||||
TIntmag_mask::TIntmag_mask() :TAutomask ("dl0600a")
|
||||
{
|
||||
}
|
||||
|
||||
bool TIntmag_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
/* switch (o.dlg())
|
||||
{
|
||||
default:
|
||||
break;
|
||||
} */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
|
||||
class TIntmag: public TSkeleton_application
|
||||
{
|
||||
TIntmag_mask * _mask;
|
||||
TIntmag_form * _form;
|
||||
|
||||
protected:
|
||||
virtual bool create(void);
|
||||
virtual bool destroy(void);
|
||||
virtual void main_loop();
|
||||
|
||||
void print_header();
|
||||
void print_footer();
|
||||
void print_line(const TString& r, const long j);
|
||||
|
||||
public:
|
||||
void add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const;
|
||||
void add_meta_filter(TString& filtro, const char * field, short id) const;
|
||||
void add_range_filter(TString& filtro, const char * field, short fid, short tid = -1) const;
|
||||
|
||||
TIntmag() {}
|
||||
virtual ~TIntmag() {}
|
||||
};
|
||||
|
||||
// restituisce un riferimento all' applicazione
|
||||
inline TIntmag& app() { return (TIntmag&) main_app();}
|
||||
|
||||
// creazione dell'applicazione
|
||||
bool TIntmag::create()
|
||||
{
|
||||
open_files(LF_ANAMAG, LF_RMOVMAG, LF_UMART, LF_MAG, LF_CONDV, LF_RCONDV, 0);
|
||||
_mask = new TIntmag_mask;
|
||||
_form = new TIntmag_form();
|
||||
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
|
||||
// distruzione dell'applicazione
|
||||
bool TIntmag::destroy()
|
||||
{
|
||||
delete _mask;
|
||||
delete _form;
|
||||
return TSkeleton_application::destroy();
|
||||
}
|
||||
|
||||
//aggiunge effettivamente una espressione ad un filtro
|
||||
void TIntmag::add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const
|
||||
{
|
||||
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
||||
if (!fld.empty()) //..se non e' vuoto
|
||||
{
|
||||
if (filtro.not_empty()) //distinzione tra filtro vuoto e filtro esistente
|
||||
filtro << "&&";
|
||||
if (fld.class_id() == CLASS_DATE_FIELD) //se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
|
||||
{
|
||||
const TDate data = fld.get();
|
||||
TString8 val = data.string(ANSI);
|
||||
filtro << "(ANSI(" << field << ")" << cmp << val << ")";
|
||||
}
|
||||
else
|
||||
filtro << "(" << field << cmp << "\"" << fld.get() << "\")"; //aggiunge il contenuto del campo al filtro
|
||||
}
|
||||
}
|
||||
|
||||
//aggiunge ad un filtro una espressione con l'*
|
||||
void TIntmag::add_meta_filter(TString& filtro, const char * field, short id) const
|
||||
{
|
||||
const TString& value = _mask->get(id);
|
||||
const char* cmp = "==";
|
||||
if (value.find('*') >= 0 || value.find('?') >= 0)
|
||||
cmp = "?=";
|
||||
add_expr_filter(filtro, field, id, cmp);
|
||||
}
|
||||
|
||||
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
|
||||
void TIntmag::add_range_filter(TString& filtro, const char * field, short fid, short tid) const
|
||||
{
|
||||
if (tid > fid)
|
||||
{
|
||||
add_expr_filter(filtro, field, fid, ">=");
|
||||
add_expr_filter(filtro, field, tid, "<=");
|
||||
}
|
||||
else
|
||||
add_expr_filter(filtro, field, fid, "==");
|
||||
}
|
||||
|
||||
static TString16 fast_field;
|
||||
static TString80 fast_value;
|
||||
static bool meta_type;
|
||||
|
||||
static bool fast_filter(const TRelation* rel)
|
||||
{
|
||||
const TRectype& rec = rel->curr();
|
||||
if (meta_type)
|
||||
return rec.get(fast_field).match(fast_value);
|
||||
return rec.get(fast_field) == fast_value;
|
||||
}
|
||||
|
||||
void TIntmag::main_loop()
|
||||
{
|
||||
while (_mask->run() == K_ENTER)
|
||||
{
|
||||
TString16 nomecampo;
|
||||
//laboriosissima costruzione del filtro
|
||||
TString filtro;
|
||||
|
||||
add_range_filter(filtro, ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
|
||||
|
||||
add_meta_filter(filtro, ANAMAG_DESCR, F_TITOLO);
|
||||
add_meta_filter(filtro, ANAMAG_USER2, F_ARTISTA);
|
||||
add_meta_filter(filtro, ANAMAG_USER3, F_COMPOSITORE);
|
||||
add_meta_filter(filtro, ANAMAG_USER4, F_ETICHETTA);
|
||||
|
||||
add_range_filter(filtro, ANAMAG_GRMERC, F_GENEREMUSICALE);
|
||||
add_range_filter(filtro, ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
|
||||
add_range_filter(filtro, ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
|
||||
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
|
||||
nomecampo.format("%d->%s", LF_UMART, "UM");
|
||||
add_range_filter(filtro, nomecampo, F_TIPOSUPPORTO);
|
||||
|
||||
//dopo il filtrone tocca al cursore x scandire i records
|
||||
TIntmag_form form;
|
||||
//ottimizzazione tempi di ricerca: caso di filtro semplice (senza AND, con ?= o ==)
|
||||
|
||||
if (filtro.find("&&") < 0 && filtro.find('=') > 0)
|
||||
{
|
||||
filtro.strip("()");
|
||||
meta_type = filtro.find("?=") > 0;
|
||||
const int pos = filtro.rfind('=');
|
||||
fast_value = filtro.mid(pos+1);
|
||||
fast_value.strip("\"");
|
||||
fast_field = filtro.left(pos-1);
|
||||
|
||||
form.cursor()->set_filterfunction(fast_filter, !_mask->field(F_TIPOSUPPORTO).empty());
|
||||
}
|
||||
else
|
||||
form.cursor()->setfilter(filtro, !_mask->field(F_TIPOSUPPORTO).empty());
|
||||
|
||||
//procedimento mistico di costruzione del form columnwise
|
||||
const int hh = 5; //altezza header = 5 righe
|
||||
int rows[4];
|
||||
rows[0] = hh - 2;
|
||||
rows[1] = hh;
|
||||
rows[2] = printer().formlen();
|
||||
rows[3] = 0;
|
||||
|
||||
form.genera_intestazioni(odd_page, hh - 1);
|
||||
form.genera_fincatura(odd_page, hh - 2, rows[2], rows);
|
||||
|
||||
form.print();
|
||||
}
|
||||
}
|
||||
|
||||
int dl0600(int argc, char* argv[])
|
||||
{
|
||||
TIntmag a ;
|
||||
a.run(argc, argv, "Interrogazione magazzino");
|
||||
return 0;
|
||||
}
|
24
dl/dl0600.h
Executable file
24
dl/dl0600.h
Executable file
@ -0,0 +1,24 @@
|
||||
// campi form Interrogazione magazzino (discolatio magazzino interrogatio)
|
||||
#define FF_CODART 1
|
||||
#define FF_TITOLO 2
|
||||
#define FF_ARTISTA 3
|
||||
#define FF_SUPPORTO 4
|
||||
#define FF_GIAC 5
|
||||
#define FF_QTA 6
|
||||
#define FF_TOTACQ 7
|
||||
#define FF_TOTVEN 8
|
||||
#define FF_PREZZO 9
|
||||
|
||||
#define FF_B_CODART 11
|
||||
#define FF_B_TITOLO 12
|
||||
#define FF_B_ARTISTA 13
|
||||
#define FF_B_SUPPORTO 14
|
||||
#define FF_B_GIAC 15
|
||||
#define FF_B_QTA 16
|
||||
#define FF_B_TOTACQ 17
|
||||
#define FF_B_TOTVEN 18
|
||||
#define FF_B_PREZZO 19
|
||||
#define FF_B_CONDV 20
|
||||
|
||||
#define FF_DATE 21
|
||||
#define FF_PAGE 22
|
141
dl/dl0600a.frm
Executable file
141
dl/dl0600a.frm
Executable file
@ -0,0 +1,141 @@
|
||||
#include "dl0600.h"
|
||||
|
||||
USE LF_ANAMAG
|
||||
JOIN LF_UMART INTO CODART==CODART NRIGA=="1"
|
||||
END
|
||||
|
||||
//-------------------------intestazione form-----------------------------------------------//
|
||||
SECTION HEADER ODD 5
|
||||
|
||||
STRINGA -1
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 1 1 "@bINTERROGAZIONE MAGAZZINO"
|
||||
END
|
||||
|
||||
DATA FF_DATE
|
||||
BEGIN
|
||||
KEY "Data"
|
||||
PROMPT 1 2 "@bData "
|
||||
MESSAGE _TODAY
|
||||
END
|
||||
|
||||
NUMERO FF_PAGE
|
||||
BEGIN
|
||||
KEY "Nr. pagina"
|
||||
PROMPT 120 2 "@bPagina "
|
||||
MESSAGE _PAGENO
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
//-----------------------riga tipo uno---------------------------------------------------//
|
||||
SECTION BODY ODD 1 COLUMNWISE
|
||||
|
||||
STRINGA FF_B_CODART 16
|
||||
BEGIN
|
||||
KEY "codart"
|
||||
PROMPT 1 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Cod. articolo" "Codice articolo"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD CODART
|
||||
END
|
||||
|
||||
STRINGA FF_B_TITOLO 40
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 2 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Titolo" "Titolo"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD DESCR
|
||||
END
|
||||
|
||||
STRINGA FF_B_ARTISTA 18
|
||||
BEGIN
|
||||
KEY "artista"
|
||||
PROMPT 3 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Artista" "Artista"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD USER2
|
||||
END
|
||||
|
||||
STRINGA FF_B_SUPPORTO 3
|
||||
BEGIN
|
||||
KEY "supporto"
|
||||
PROMPT 4 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Sup" "Tipo supporto"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
FIELD LF_UMART->UM
|
||||
END
|
||||
|
||||
NUMERO FF_B_GIAC 8
|
||||
BEGIN
|
||||
KEY "giacenza"
|
||||
PROMPT 5 1 ""
|
||||
PICTURE "###.##@"
|
||||
MESSAGE _GIACENZA
|
||||
SPECIAL STRINGA INTESTAZIONE "Giacenza" "Giacenza"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
END
|
||||
|
||||
NUMERO FF_B_QTA 8
|
||||
BEGIN
|
||||
KEY "quantita' in ordine non evasa"
|
||||
PROMPT 6 1 ""
|
||||
PICTURE "#######"
|
||||
SPECIAL STRINGA INTESTAZIONE "Ordinato" "Quantita' in ordine non evasa"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
MESSAGE _ORDF
|
||||
END
|
||||
|
||||
NUMERO FF_B_TOTACQ 7
|
||||
BEGIN
|
||||
KEY "totale acquistati"
|
||||
PROMPT 7 1 ""
|
||||
PICTURE "#######"
|
||||
SPECIAL STRINGA INTESTAZIONE "Tot acq" "Totale acquistati"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
MESSAGE _ACQ
|
||||
END
|
||||
|
||||
NUMERO FF_B_TOTVEN 7
|
||||
BEGIN
|
||||
KEY "totale venduti"
|
||||
PROMPT 8 1 ""
|
||||
PICTURE "#######"
|
||||
SPECIAL STRINGA INTESTAZIONE "Tot ven" "Totale venduti"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
MESSAGE _VEN
|
||||
END
|
||||
|
||||
VALUTA FF_B_PREZZO 10
|
||||
BEGIN
|
||||
FLAGS "U"
|
||||
KEY "prezzo articolo del giorno"
|
||||
PROMPT 9 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "Prezzo" "Prezzo"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
MESSAGE _PREZZO,FF_B_CONDV
|
||||
END
|
||||
|
||||
STRINGA FF_B_CONDV 3
|
||||
BEGIN
|
||||
FLAGS "U"
|
||||
KEY "listino/offerta da cui viene il prezzo stampato"
|
||||
PROMPT 10 1 ""
|
||||
SPECIAL STRINGA INTESTAZIONE "L/O" "Listino/Offerta"
|
||||
SPECIAL NUMERO OFFSET "0" "Offset iniziale campo"
|
||||
SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra"
|
||||
END
|
||||
|
||||
END
|
||||
|
16
dl/dl0600a.h
Executable file
16
dl/dl0600a.h
Executable file
@ -0,0 +1,16 @@
|
||||
// interrogatio magazzino Discolatio
|
||||
// definizione campi per maschera di selezione dl0600a
|
||||
|
||||
#define F_DABARCODE 101
|
||||
#define F_TIPOSUPPORTO 102
|
||||
#define F_TITOLO 103
|
||||
#define F_ARTISTA 104
|
||||
#define F_COMPOSITORE 105
|
||||
#define F_ETICHETTA 106
|
||||
#define F_GENEREMUSICALE 107
|
||||
#define F_DATAE_INI 108
|
||||
#define F_DATAE_FIN 109
|
||||
#define F_DATAV_INI 110
|
||||
#define F_DATAV_FIN 111
|
||||
#define F_ABARCODE 112
|
||||
|
131
dl/dl0600a.uml
Executable file
131
dl/dl0600a.uml
Executable file
@ -0,0 +1,131 @@
|
||||
#include "dl0600a.h"
|
||||
|
||||
PAGE "Interrogazione magazzino" -1 -1 70 13
|
||||
|
||||
GROUPBOX DLG_NULL 68 11
|
||||
BEGIN
|
||||
PROMPT 1 1 "@bParametri di selezione"
|
||||
END
|
||||
|
||||
STRING F_DABARCODE 20
|
||||
BEGIN
|
||||
PROMPT 2 2 "Barcode Da: "
|
||||
FLAGS "U"
|
||||
USE LF_ANAMAG KEY 1
|
||||
INPUT CODART F_DABARCODE
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
OUTPUT F_DABARCODE CODART
|
||||
END
|
||||
|
||||
STRING F_ABARCODE 20
|
||||
BEGIN
|
||||
PROMPT 40 2 "a: "
|
||||
FLAGS "U"
|
||||
USE LF_ANAMAG KEY 1
|
||||
INPUT CODART F_ABARCODE
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
OUTPUT F_ABARCODE CODART
|
||||
END
|
||||
|
||||
STRING F_TIPOSUPPORTO 10
|
||||
BEGIN
|
||||
FLAGS "U"
|
||||
PROMPT 2 3 "Tipo supporto "
|
||||
USE %UMS
|
||||
INPUT CODTAB F_TIPOSUPPORTO
|
||||
DISPLAY "Tipo supporto" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_TIPOSUPPORTO CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_TITOLO 50 45
|
||||
BEGIN
|
||||
PROMPT 2 4 "Titolo "
|
||||
FLAGS "U"
|
||||
USE LF_ANAMAG KEY 2
|
||||
INPUT DESCR F_TITOLO
|
||||
DISPLAY "Titolo@50" DESCR
|
||||
DISPLAY "Codice a barre@20" CODART
|
||||
COPY OUTPUT F_DABARCODE
|
||||
END
|
||||
|
||||
STRING F_ARTISTA 20
|
||||
BEGIN
|
||||
PROMPT 2 5 "Artista "
|
||||
FLAGS "U"
|
||||
COPY USE F_DABARCODE
|
||||
INPUT USER2 F_ARTISTA
|
||||
DISPLAY "Artista@30" USER2
|
||||
OUTPUT F_ARTISTA USER2
|
||||
END
|
||||
|
||||
STRING F_COMPOSITORE 20
|
||||
BEGIN
|
||||
PROMPT 2 6 "Compositore "
|
||||
FLAGS "U"
|
||||
COPY USE F_DABARCODE
|
||||
INPUT USER3 F_COMPOSITORE
|
||||
DISPLAY "Compositore@30" USER3
|
||||
OUTPUT F_COMPOSITORE USER3
|
||||
END
|
||||
|
||||
STRING F_ETICHETTA 20
|
||||
BEGIN
|
||||
PROMPT 2 7 "Etichetta "
|
||||
COPY USE F_DABARCODE
|
||||
INPUT USER4 F_ETICHETTA
|
||||
DISPLAY "Etichetta@30" USER4
|
||||
OUTPUT F_ETICHETTA USER4
|
||||
END
|
||||
|
||||
STRING F_GENEREMUSICALE 3
|
||||
BEGIN
|
||||
PROMPT 2 8 "Genere musicale "
|
||||
FLAGS "U"
|
||||
USE GMC
|
||||
INPUT CODTAB F_GENEREMUSICALE
|
||||
DISPLAY "Genere" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_GENEREMUSICALE CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
DATE F_DATAE_INI
|
||||
BEGIN
|
||||
PROMPT 2 9 "Data emissione: da "
|
||||
END
|
||||
|
||||
DATE F_DATAE_FIN
|
||||
BEGIN
|
||||
PROMPT 35 9 "a "
|
||||
VALIDATE DATE_CMP_FUNC >= F_DATAE_INI
|
||||
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
|
||||
END
|
||||
|
||||
DATE F_DATAV_INI
|
||||
BEGIN
|
||||
PROMPT 2 10 "Data variazione da "
|
||||
END
|
||||
|
||||
DATE F_DATAV_FIN
|
||||
BEGIN
|
||||
PROMPT 35 10 "a "
|
||||
VALIDATE DATE_CMP_FUNC >= F_DATAV_INI
|
||||
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -12 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -22 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
ENDMASK
|
303
dl/dl0700.cpp
Executable file
303
dl/dl0700.cpp
Executable file
@ -0,0 +1,303 @@
|
||||
#include <applicat.h>
|
||||
#include <assoc.h>
|
||||
#include <automask.h>
|
||||
#include <form.h>
|
||||
#include <printer.h>
|
||||
#include <recarray.h>
|
||||
#include <sort.h>
|
||||
#include <strings.h>
|
||||
#include <utility.h>
|
||||
|
||||
#include "..\mg\anamag.h"
|
||||
#include "..\mg\mglib.h"
|
||||
#include "..\mg\movmag.h"
|
||||
#include "..\mg\rmovmag.h"
|
||||
#include "dl0.h"
|
||||
#include "dl0700a.h"
|
||||
#include "dl0700.h"
|
||||
|
||||
//-----FORM--------------------------------------------------------------------------------------//
|
||||
|
||||
class TTopten_form : public TForm
|
||||
{
|
||||
|
||||
public:
|
||||
virtual bool validate(TForm_item &cf, TToken_string &s);
|
||||
void set_testata() {set_header(1,TRUE);}
|
||||
void set_pedata() {set_footer(1,FALSE); set_footer(1,TRUE);}
|
||||
TPrint_section& get_line() {return section('B', odd_page);}
|
||||
TTopten_form();
|
||||
|
||||
virtual ~TTopten_form();
|
||||
};
|
||||
|
||||
TTopten_form::TTopten_form() :TForm ("dl0700a")
|
||||
{
|
||||
}
|
||||
|
||||
TTopten_form::~TTopten_form()
|
||||
{
|
||||
}
|
||||
|
||||
bool TTopten_form::validate(TForm_item &cf, TToken_string &s)
|
||||
{
|
||||
return TForm::validate(cf,s);
|
||||
}
|
||||
|
||||
//-----AUTOMASK---------------------------------------------------------------------------------//
|
||||
|
||||
class TTopten_mask : public TAutomask
|
||||
{
|
||||
TRelation * _rel;
|
||||
TCursor * _cur;
|
||||
|
||||
protected:
|
||||
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
public:
|
||||
|
||||
TTopten_mask();
|
||||
|
||||
virtual ~TTopten_mask(){};
|
||||
};
|
||||
|
||||
TTopten_mask::TTopten_mask() :TAutomask ("dl0700a")
|
||||
{
|
||||
}
|
||||
|
||||
bool TTopten_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case F_RIGHE:
|
||||
if (e == fe_close)
|
||||
{
|
||||
TSheet_field& sheet = sfield(F_RIGHE);
|
||||
FOR_EACH_SHEET_ROW (sheet, r, row) //scansione di tutte le righe dello sheet
|
||||
{
|
||||
TString8 supporto = row->get(F_SUPPORTO-FIRST_FIELD);
|
||||
if (supporto.blank())
|
||||
return error_box("Indicare il tipo supporto nella riga %d",r+1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//-----SKELETON APPLICATION------------------------------------------------------------------------------------------//
|
||||
|
||||
class TTopten : public TSkeleton_application
|
||||
{
|
||||
TTopten_mask * _mask;
|
||||
TTopten_form * _form;
|
||||
|
||||
protected:
|
||||
virtual bool create();
|
||||
virtual bool destroy();
|
||||
virtual void main_loop();
|
||||
|
||||
void print_header();
|
||||
void print_footer();
|
||||
void print_line(const TString& r, const long j);
|
||||
|
||||
public:
|
||||
TTopten() {}
|
||||
};
|
||||
|
||||
|
||||
bool TTopten::create()
|
||||
{
|
||||
open_files(LF_MOVMAG, LF_RMOVMAG, LF_ANAMAG, LF_UMART, LF_MAG, 0);
|
||||
_mask = new TTopten_mask;
|
||||
_form = new TTopten_form();
|
||||
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
|
||||
bool TTopten::destroy()
|
||||
{
|
||||
delete _mask;
|
||||
delete _form;
|
||||
return TSkeleton_application::destroy();
|
||||
}
|
||||
|
||||
|
||||
void TTopten::print_header()
|
||||
{
|
||||
_form->set_testata();
|
||||
}
|
||||
|
||||
void TTopten::print_footer()
|
||||
{
|
||||
_form->set_pedata();
|
||||
}
|
||||
|
||||
|
||||
void TTopten::print_line(const TString& result, const long j)
|
||||
{
|
||||
TString8 nriga; nriga.format("%4ld",j);
|
||||
TString codart = result.left(20); //codice articolo
|
||||
codart.trim();
|
||||
TString supporto = result.mid(20,2); //tipo supporto
|
||||
supporto.trim();
|
||||
real venduto(result.mid(22, 20)); //quantita' venduta
|
||||
real giacenza(result.mid(42, 20)); //giacenza
|
||||
|
||||
TString titolo = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR); //titolo
|
||||
TString artista = cache().get(LF_ANAMAG, codart, ANAMAG_USER2); //artista
|
||||
TString genere = cache().get(LF_ANAMAG, codart, ANAMAG_GRMERC); //genere
|
||||
|
||||
TPrint_section& section = _form->get_line();
|
||||
_form->find_field('B', odd_page, FF_B_POSIZIONE).set(nriga);
|
||||
_form->find_field('B', odd_page, FF_B_CODART).set(codart);
|
||||
_form->find_field('B', odd_page, FF_B_GIAC).set(giacenza.string());
|
||||
_form->find_field('B', odd_page, FF_B_TITOLO).set(titolo);
|
||||
_form->find_field('B', odd_page, FF_B_ARTISTA).set(artista);
|
||||
_form->find_field('B', odd_page, FF_B_TOTVEND).set(venduto.string());
|
||||
_form->find_field('B', odd_page, FF_B_GENERE).set(genere);
|
||||
_form->find_field('B', odd_page, FF_B_SUPPORTO).set(supporto);
|
||||
|
||||
section.update();
|
||||
for (word i = 0; i < section.height(); i++)
|
||||
printer().print(section.row(i));
|
||||
}
|
||||
|
||||
|
||||
void TTopten::main_loop()
|
||||
{
|
||||
TSheet_field& sheet = _mask->sfield(F_RIGHE); //crea lo sheet non vuoto
|
||||
sheet.row(0);
|
||||
|
||||
while (_mask->run() == K_ENTER)
|
||||
{
|
||||
TRelation rel(LF_MOVMAG); //relazione: file principale rmovmag
|
||||
|
||||
TDate dataini = _mask->get_date(F_DATAINI);
|
||||
TDate datafine = _mask->get_date(F_DATAFINE);
|
||||
|
||||
TRectype darec(LF_MOVMAG), arec(LF_MOVMAG);
|
||||
darec.put(MOVMAG_DATAREG, dataini);
|
||||
arec.put(MOVMAG_DATAREG, datafine);
|
||||
|
||||
TCursor cursore (&rel, "", 3, &darec, &arec); //scandisce i movimenti con la chiave 2 e codreg
|
||||
long nitems = cursore.items(); //incluso nell'intervallo date
|
||||
cursore.freeze();
|
||||
|
||||
TRectype riga(LF_RMOVMAG);
|
||||
TRecord_array righemov(111,RMOVMAG_NRIG); //clamoroso recordarray del file 111 (rmovmag)
|
||||
|
||||
FOR_EACH_SHEET_ROW (sheet, r, row) //scansione di tutte le righe dello sheet
|
||||
{
|
||||
TAssoc_array topten, topgiac; //assoc_array che conterranno tutti i record da sortare e stampare
|
||||
const TString8 currsupporto = row->get(F_SUPPORTO-FIRST_FIELD);
|
||||
const TString8 currgenere = row->get(F_GENERE-FIRST_FIELD);
|
||||
const real currdaprezzo = row->get(F_DAPREZZO-FIRST_FIELD);
|
||||
const real curraprezzo = row->get(F_APREZZO-FIRST_FIELD);
|
||||
|
||||
for (cursore=0;cursore.pos()<nitems;++cursore)
|
||||
{
|
||||
riga.put(RMOVMAG_NUMREG, cursore.curr().get(MOVMAG_NUMREG)); //per ogni movimento in testata
|
||||
righemov.read(riga); //scandisce tutte le sue righemov
|
||||
for (int i=1; i<=righemov.rows(); i++)
|
||||
{
|
||||
TRectype& rigai = righemov[i];
|
||||
TString8 codcaus = rigai.get(RMOVMAG_CODCAUS);
|
||||
if (codcaus.empty()) //se il codcaus della rigamov e' vuoto..
|
||||
codcaus = cursore.curr().get(MOVMAG_CODCAUS); //..lo cerca in testata
|
||||
|
||||
const TRectype& cau = cache().get("%CAU", codcaus); //controlla se e' causale di vendita!
|
||||
const int segno = atoi(cau.get("S2").mid(6, 2));
|
||||
if (segno != 0) //se e' una causale di vendita..
|
||||
{
|
||||
TString codart = rigai.get(RMOVMAG_CODART); //prende il codart della riga in questione..
|
||||
const TRectype& articolo = cache().get(LF_ANAMAG, codart);
|
||||
|
||||
const TString& strdate = articolo.get(ANAMAG_USER6); //controlla che la eventuale data "fuori catalogo"..
|
||||
if (!real::is_null(strdate)) //se la data e' 00000000 la vuota (e' meglio)
|
||||
{
|
||||
const TDate oldfashioned = strdate; //..sia superiore a dataini o nulla
|
||||
if (oldfashioned < dataini) //se non lo e' salta al prossimo articolo
|
||||
continue;
|
||||
}
|
||||
|
||||
const real prezzo = rigai.get(RMOVMAG_PREZZO); //controllo sui prezzi
|
||||
if (prezzo < currdaprezzo)
|
||||
continue;
|
||||
if (prezzo > curraprezzo && curraprezzo > currdaprezzo)
|
||||
continue;
|
||||
|
||||
const TString16 umart = rigai.get(RMOVMAG_UM); //..e sul supporto (um)
|
||||
if (umart != currsupporto)
|
||||
continue;
|
||||
|
||||
if (!currgenere.blank()) //..e sul genere
|
||||
{
|
||||
const TString8 genere = articolo.get(ANAMAG_GRMERC);
|
||||
if (genere != currgenere)
|
||||
continue;
|
||||
}
|
||||
|
||||
codart.left_just(20); //riempie codart in modo che sia 20..
|
||||
codart << umart.left(2); //..ed aggiunge il codice supporto alla stringa
|
||||
real * venduto = (real *) topten.objptr(codart);
|
||||
|
||||
if (venduto == NULL)
|
||||
{ //se e' un nuovo articolo..
|
||||
venduto = new real;
|
||||
topten.add(codart, venduto); //lo aggiunge all'assoc_array con chiave codart(codart+um!)
|
||||
|
||||
TArticolo_giacenza articolo(codart);
|
||||
real giacenza = articolo.giacenza_anno("", "", datafine.year()); //anno di riferimento x la giacenza
|
||||
topgiac.add(codart, giacenza);
|
||||
}
|
||||
*venduto += segno*rigai.get_real(RMOVMAG_QUANT); //quindi somma il venduto!
|
||||
}
|
||||
}
|
||||
|
||||
} //fine ciclo scansione movimenti di magazzino
|
||||
|
||||
// adesso si devono riordinare gli assoc_array in modo da avere i record in ordine di venduto decrescente
|
||||
const int reclen = 62;
|
||||
TSort s(reclen);
|
||||
s.addsortkey(22, 20, 'd');
|
||||
s.addsortkey(42, 20, 'd');
|
||||
s.init();
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT (topten, hobj, chiave, venduto)
|
||||
{
|
||||
TString80 sortrec = chiave;
|
||||
sortrec << ((real *) venduto)->string(20); //ordinamento principale per venduto
|
||||
|
||||
real giacenza = (real&)topgiac[chiave]; //ordinamento secondario per giacenza
|
||||
sortrec << giacenza.string(20);
|
||||
|
||||
s.sort(sortrec);
|
||||
}
|
||||
s.endsort();
|
||||
|
||||
//scatta la stampa!
|
||||
TString80 result;
|
||||
const long nlinesmax = row->get_long(F_VISUAL-FIRST_FIELD);
|
||||
long nlines = 0;
|
||||
printer().open();
|
||||
print_header();
|
||||
print_footer();
|
||||
for ( result.strncpy(s.retrieve(),reclen); result.not_empty(); result.strncpy(s.retrieve(),reclen))
|
||||
{
|
||||
print_line(result, ++nlines);
|
||||
if (nlinesmax > 0 && nlines >= nlinesmax)
|
||||
break;
|
||||
}
|
||||
printer().close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int dl0700(int argc, char* argv[])
|
||||
{
|
||||
TTopten a;
|
||||
a.run(argc,argv,"Top Ten");
|
||||
return 0;
|
||||
}
|
21
dl/dl0700.h
Executable file
21
dl/dl0700.h
Executable file
@ -0,0 +1,21 @@
|
||||
// campi form TopTen
|
||||
#define FF_POSIZIONE 1
|
||||
#define FF_CODART 2
|
||||
#define FF_GIAC 3
|
||||
#define FF_TITOLO 4
|
||||
#define FF_ARTISTA 5
|
||||
#define FF_TOTVEND 6
|
||||
#define FF_GENERE 7
|
||||
#define FF_SUPPORTO 8
|
||||
|
||||
#define FF_B_POSIZIONE 10
|
||||
#define FF_B_CODART 11
|
||||
#define FF_B_GIAC 12
|
||||
#define FF_B_TITOLO 13
|
||||
#define FF_B_ARTISTA 14
|
||||
#define FF_B_TOTVEND 15
|
||||
#define FF_B_GENERE 16
|
||||
#define FF_B_SUPPORTO 17
|
||||
|
||||
#define FF_DATE 21
|
||||
#define FF_PAGE 22
|
152
dl/dl0700a.frm
Executable file
152
dl/dl0700a.frm
Executable file
@ -0,0 +1,152 @@
|
||||
#include "dl0700.h"
|
||||
|
||||
GENERAL
|
||||
BEGIN
|
||||
// OFFSET 0 1
|
||||
// FONT "Courier New"
|
||||
// SIZE 10
|
||||
END
|
||||
|
||||
SECTION GRAPHIC
|
||||
BEGIN
|
||||
END
|
||||
|
||||
|
||||
//-------------------------intestazione form-----------------------------------------------//
|
||||
SECTION HEADER ODD 5
|
||||
|
||||
STRINGA -1
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 1 1 "@bTOP TEN"
|
||||
END
|
||||
|
||||
STRINGA FF_POSIZIONE 6
|
||||
BEGIN
|
||||
KEY "posizione"
|
||||
PROMPT 1 3 "@bPos."
|
||||
END
|
||||
|
||||
STRINGA FF_CODART 20
|
||||
BEGIN
|
||||
KEY "codice articolo"
|
||||
PROMPT 6 3 "@bCodice articolo "
|
||||
END
|
||||
|
||||
STRINGA FF_GIAC 11
|
||||
BEGIN
|
||||
KEY "giacenza"
|
||||
PROMPT 30 3 "@bGiacenza"
|
||||
END
|
||||
|
||||
STRINGA FF_TITOLO 8
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 41 3 "@bTitolo"
|
||||
END
|
||||
|
||||
STRINGA FF_ARTISTA 40
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 82 3 "@bArtista"
|
||||
END
|
||||
|
||||
NUMERO FF_TOTVEND 16
|
||||
BEGIN
|
||||
KEY "tot. vend."
|
||||
PROMPT 103 3 "@bTotale vendite"
|
||||
END
|
||||
|
||||
STRINGA FF_GENERE 6
|
||||
BEGIN
|
||||
KEY "genere"
|
||||
PROMPT 119 3 "@bGen."
|
||||
END
|
||||
|
||||
STRINGA FF_SUPPORTO 10
|
||||
BEGIN
|
||||
KEY "supporto"
|
||||
PROMPT 124 3 "@bSupporto"
|
||||
END
|
||||
|
||||
STRINGA -1
|
||||
BEGIN
|
||||
KEY "riga di separazione"
|
||||
PROMPT 1 4 "___________________________________________________________________________________________________________________________________"
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
//-----------------------riga tipo uno---------------------------------------------------//
|
||||
SECTION BODY ODD 1
|
||||
|
||||
NUMERO FF_B_POSIZIONE 4
|
||||
BEGIN
|
||||
KEY "posizione"
|
||||
PROMPT 1 1 "@b"
|
||||
END
|
||||
|
||||
STRINGA FF_B_CODART 20
|
||||
BEGIN
|
||||
KEY "codart"
|
||||
PROMPT 6 1 "@r"
|
||||
END
|
||||
|
||||
NUMERO FF_B_GIAC 11
|
||||
BEGIN
|
||||
KEY "giacenza"
|
||||
PROMPT 27 1 ""
|
||||
PICTURE "###.###.##@"
|
||||
END
|
||||
|
||||
STRINGA FF_B_TITOLO 40
|
||||
BEGIN
|
||||
KEY "titolo"
|
||||
PROMPT 41 1 ""
|
||||
END
|
||||
|
||||
STRINGA FF_B_ARTISTA 20
|
||||
BEGIN
|
||||
KEY "artista"
|
||||
PROMPT 82 1 ""
|
||||
END
|
||||
|
||||
NUMERO FF_B_TOTVEND 15
|
||||
BEGIN
|
||||
KEY "totale vendite"
|
||||
PROMPT 102 1 ""
|
||||
PICTURE "###.###.###.##@"
|
||||
END
|
||||
|
||||
STRINGA FF_B_GENERE 2
|
||||
BEGIN
|
||||
KEY "genere"
|
||||
PROMPT 121 1 ""
|
||||
END
|
||||
|
||||
STRINGA FF_B_SUPPORTO 2
|
||||
BEGIN
|
||||
KEY "supporto"
|
||||
PROMPT 126 1 ""
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
//-------------------------pié di pagina-------------------------------------//
|
||||
SECTION FOOTER ODD 4
|
||||
|
||||
DATA FF_DATE
|
||||
BEGIN
|
||||
KEY "Data"
|
||||
PROMPT 1 2 "@bData "
|
||||
MESSAGE _TODAY
|
||||
END
|
||||
|
||||
NUMERO FF_PAGE 10
|
||||
BEGIN
|
||||
KEY "Nr. pagina"
|
||||
PROMPT 100 2 "@bPagina "
|
||||
MESSAGE _PAGENO
|
||||
END
|
||||
|
||||
END
|
12
dl/dl0700a.h
Executable file
12
dl/dl0700a.h
Executable file
@ -0,0 +1,12 @@
|
||||
// campi maschera dl0700a.msk
|
||||
|
||||
#define F_DATAINI 201
|
||||
#define F_DATAFINE 202
|
||||
#define F_RIGHE 203
|
||||
|
||||
#define F_SUPPORTO 101
|
||||
#define F_GENERE 102
|
||||
#define F_DAPREZZO 103
|
||||
#define F_APREZZO 104
|
||||
#define F_VISUAL 105
|
||||
|
114
dl/dl0700a.uml
Executable file
114
dl/dl0700a.uml
Executable file
@ -0,0 +1,114 @@
|
||||
#include "dl0700a.h"
|
||||
|
||||
TOOLBAR "" 0 -3 0 3
|
||||
|
||||
BUTTON DLG_PRINT 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Top Ten" -1 -1 96 24
|
||||
|
||||
GROUPBOX DLG_NULL 78 4
|
||||
BEGIN
|
||||
PROMPT 1 1 "@bIntervallo date"
|
||||
FLAGS "R"
|
||||
END
|
||||
|
||||
DATE F_DATAINI
|
||||
BEGIN
|
||||
PROMPT 2 2 "Data inizio "
|
||||
END
|
||||
|
||||
DATE F_DATAFINE
|
||||
BEGIN
|
||||
FLAGS "A"
|
||||
PROMPT 2 3 "Data fine "
|
||||
VALIDATE DATE_CMP_FUNC >= F_DATAINI
|
||||
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
|
||||
END
|
||||
|
||||
SPREADSHEET F_RIGHE 78
|
||||
BEGIN
|
||||
PROMPT 1 6 "@bCriteri di selezione "
|
||||
ITEM "Supporto"
|
||||
ITEM "Genere"
|
||||
ITEM "Da prezzo"
|
||||
ITEM "A prezzo"
|
||||
ITEM "Numero righe"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
ENDMASK
|
||||
|
||||
//------------------------------------------------------------------------------------------------
|
||||
PAGE "Criteri di selezione" -1 -1 44 9
|
||||
|
||||
STRING F_SUPPORTO 2
|
||||
BEGIN
|
||||
FLAGS "U"
|
||||
PROMPT 1 1 "Tipo supporto "
|
||||
USE %UMS
|
||||
INPUT CODTAB F_SUPPORTO
|
||||
DISPLAY "Tipo supporto" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_SUPPORTO CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_GENERE 3
|
||||
BEGIN
|
||||
PROMPT 1 2 "Genere "
|
||||
USE GMC
|
||||
INPUT CODTAB F_GENERE
|
||||
DISPLAY "Genere" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_GENERE CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
CURRENCY F_DAPREZZO 18
|
||||
BEGIN
|
||||
PROMPT 1 3 "Da prezzo "
|
||||
END
|
||||
|
||||
CURRENCY F_APREZZO 18
|
||||
BEGIN
|
||||
PROMPT 1 4 "A prezzo "
|
||||
END
|
||||
|
||||
NUMBER F_VISUAL 4
|
||||
BEGIN
|
||||
PROMPT 1 5 "Numero righe "
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_DELREC 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
511
dl/dl0800.cpp
511
dl/dl0800.cpp
@ -1,31 +1,40 @@
|
||||
#include <applicat.h>
|
||||
#include <filetext.h>
|
||||
#include <form.h>
|
||||
#include <isamrpc.h>
|
||||
#include <mask.h>
|
||||
#include <relation.h>
|
||||
#include <tabutil.h>
|
||||
#include <printer.h>
|
||||
#include <progind.h>
|
||||
#include <recarray.h>
|
||||
#include <utility.h>
|
||||
|
||||
#include "..\cg\cglib01.h"
|
||||
#include "..\mg\umart.h"
|
||||
#include "..\mg\anamag.h"
|
||||
#include "..\ve\condv.h"
|
||||
#include "..\ve\rcondv.h"
|
||||
|
||||
#include "dl0.h"
|
||||
#include "dl0800a.h"
|
||||
|
||||
#define DLFILENAME "XCATT00F"
|
||||
#include "dlutils.h"
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
// Classe TCat2dl_file customizzata dalla TFile_text //
|
||||
////////////////////////////////////////////////////////
|
||||
|
||||
class TCat2dl_file: public TFile_text
|
||||
{
|
||||
{
|
||||
TArray _lista_offerte;
|
||||
TAssoc_array _lista_codici_iva;
|
||||
TString _listingr,_listven,_offingr,_offven,_codiva;
|
||||
|
||||
TLocalisamfile _condv, _rcondv, _umart;
|
||||
|
||||
protected:
|
||||
virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
|
||||
void calcola_offerta(const TDate& dataini, const TDate& datafine, TString& codoff);
|
||||
void add_table_entry(const char * table, const char * entry);
|
||||
TCodiceIVA& codice_iva(const TString& codice); //viene usata dalla scorpora qui sotto
|
||||
real scorpora(const real& lordo, const TRecord_text& rec);
|
||||
|
||||
public:
|
||||
virtual int autosave(TRelation& rel, const TRecord_text& rec);
|
||||
@ -33,15 +42,25 @@ public:
|
||||
void write_supporto(const TRecord_text& rec);
|
||||
void write_listini(const TRecord_text& rec);
|
||||
void write_offerte(const TRecord_text& rec);
|
||||
void set_config(const char * listingr,const char * listven, const char * offingr, const char * offven, const char * codiva);
|
||||
TCat2dl_file(const TString& file_name, const TString& config_name);
|
||||
virtual ~TCat2dl_file() { }
|
||||
};
|
||||
|
||||
TCat2dl_file::TCat2dl_file(const TString& file_name, const TString& config_name)
|
||||
: TFile_text(file_name, config_name)
|
||||
: TFile_text(file_name, config_name), _condv(LF_CONDV), _rcondv(LF_RCONDV), _umart(LF_UMART)
|
||||
{
|
||||
}
|
||||
|
||||
void TCat2dl_file::set_config(const char * listingr,const char * listven, const char * offingr, const char * offven, const char * codiva)
|
||||
{
|
||||
_listingr = listingr;
|
||||
_listven = listven;
|
||||
_offingr = offingr;
|
||||
_offven = offven;
|
||||
_codiva = codiva;
|
||||
}
|
||||
|
||||
int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
||||
{
|
||||
const TString& type = rec.type(); //prendo il tracciato record del tipo del record_text
|
||||
@ -53,11 +72,11 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
||||
for (int i = 0; i < items; i++)
|
||||
{
|
||||
const TTracciato_campo& tc = tr.get(i);
|
||||
TFieldref field(tc.field());
|
||||
if (field.name().not_empty())
|
||||
if (tc.field().name().not_empty())
|
||||
{
|
||||
if (field.file()==0)
|
||||
field.set_file(rel.lfile().num());
|
||||
const TFieldref& field = tc.field();
|
||||
// if (field.file()==0)
|
||||
// field.set_file(rel.lfile().num());
|
||||
valore = rec.row(i);
|
||||
// formatta il campo del file di testo secondo le specifiche del campo su file isam
|
||||
preformat_field(field,valore,rel,tr.type());
|
||||
@ -98,7 +117,12 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
||||
valore = format_field(tc, rel.lfile().num(), valore);//formatta il campo secondo le specifiche del record
|
||||
break;
|
||||
}
|
||||
|
||||
if (vuoto && field.name()=="CODIVA") //se il codice iva e' vuoto...
|
||||
{
|
||||
valore = _codiva;
|
||||
vuoto = FALSE;
|
||||
}
|
||||
|
||||
if (!vuoto && rel.exist(field.file()))
|
||||
field.write(valore, rel);//faccio una write sulla relazione del fieldref
|
||||
}
|
||||
@ -115,52 +139,111 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
||||
}
|
||||
|
||||
bool TCat2dl_file::pre_writerel(TRelation& rel,const TRecord_text& rec)
|
||||
{
|
||||
// 1) sistema i tipi di supporto
|
||||
{
|
||||
// 1) sistema i tipi di supporto e genere
|
||||
write_supporto(rec);
|
||||
// 2) legge e scrive i dati dei listini: se il listino non esiste lo crea
|
||||
write_listini(rec);
|
||||
// 3) legge e scrive i dati delle offerte: se l'offerta non esiste la crea
|
||||
write_offerte(rec);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void TCat2dl_file::add_table_entry(const char * table, const char * entry)
|
||||
{
|
||||
if (entry && *entry > ' ')
|
||||
{
|
||||
const TRectype& rec = cache().get(table, entry);
|
||||
if (rec.empty())
|
||||
{
|
||||
TTable tab(table);
|
||||
tab.put("CODTAB", entry);
|
||||
tab.put("S0", entry);
|
||||
tab.write();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//scrive il supporto dell'articolo nel campo UM del file umart (unita' di misura)
|
||||
void TCat2dl_file::write_supporto(const TRecord_text& rec)
|
||||
{
|
||||
const TString& codart = rec.get(2);
|
||||
const TString& um = rec.get(7);
|
||||
|
||||
if (!um.blank()) //il casino lo fa solo se ha un codice supporto non nullo
|
||||
{
|
||||
TLocalisamfile umart(LF_UMART); //prende il file delle unita' di misura...
|
||||
umart.put(UMART_CODART, codart);
|
||||
umart.put(UMART_UM, um);
|
||||
umart.setkey(2); //..con chiave 2...
|
||||
TString80 codart = rec.get(2); //Sistemiamo 'sto cavolo di supporto!
|
||||
codart.trim();
|
||||
|
||||
int err = umart.read(); //..e lo legge
|
||||
_umart.zero(); //prende il file delle unita' di misura...
|
||||
_umart.put(UMART_CODART, codart);
|
||||
_umart.put(UMART_UM, um);
|
||||
_umart.setkey(2); //..con chiave 2...
|
||||
|
||||
const int err = _umart.read(); //..e lo legge
|
||||
if (err != NOERR) //Se non trova l'unita' di misura tra quelle gia' presenti...
|
||||
{
|
||||
umart.setkey(1);
|
||||
umart.put(UMART_CODART, codart);
|
||||
umart.put(UMART_NRIGA, 999);
|
||||
err = umart.read(_isgreat);
|
||||
err = umart.prev();
|
||||
_umart.setkey(1);
|
||||
_umart.put(UMART_CODART, codart);
|
||||
_umart.put(UMART_NRIGA, 999);
|
||||
|
||||
_umart.read(_isgreat);
|
||||
const int uerr = _umart.prev();
|
||||
|
||||
int nriga = 1;
|
||||
if (err == NOERR && umart.get(UMART_CODART) == codart)
|
||||
nriga = umart.get_int(UMART_NRIGA) + 1;
|
||||
if (uerr == NOERR && _umart.get(UMART_CODART) == codart)
|
||||
nriga = _umart.get_int(UMART_NRIGA) + 1;
|
||||
|
||||
umart.zero(); //..la aggiunge come ultima unita' di misura.
|
||||
umart.put(UMART_CODART, codart);
|
||||
umart.put(UMART_NRIGA, nriga);
|
||||
umart.put(UMART_UM, um);
|
||||
umart.put(UMART_FC, 1);
|
||||
|
||||
umart.write();
|
||||
_umart.zero(); //..la aggiunge come ultima unita' di misura.
|
||||
_umart.put(UMART_CODART, codart);
|
||||
_umart.put(UMART_NRIGA, nriga);
|
||||
_umart.put(UMART_UM, um);
|
||||
_umart.put(UMART_FC, 1);
|
||||
}
|
||||
}
|
||||
|
||||
real prz = rec.get(11); //legge il prezzo listino ingrosso e lo mette nel campo prezzo di UMART
|
||||
prz/=100;
|
||||
_umart.put(UMART_PREZZO, prz);
|
||||
|
||||
if (err == NOERR)
|
||||
_umart.rewrite();
|
||||
else
|
||||
_umart.write();
|
||||
|
||||
add_table_entry("%UMS", um);
|
||||
}
|
||||
|
||||
const TString& genere = rec.get(8); //Adesso tocca al genere! Va aggiornata la tabella di ditta GMC
|
||||
if (!genere.blank())
|
||||
{
|
||||
add_table_entry("GMC", genere);
|
||||
}
|
||||
}
|
||||
|
||||
//metodo x accelerare la lettura: se il codice iva esiste gia' evita di rileggere la percentuale dalla tabella
|
||||
TCodiceIVA& TCat2dl_file::codice_iva(const TString& codice)
|
||||
{
|
||||
TCodiceIVA* ci = (TCodiceIVA*)_lista_codici_iva.objptr(codice); //cerca nell'assoc_array dei codici iva se l'ha gia'letto
|
||||
if (ci == NULL)
|
||||
{
|
||||
ci = new TCodiceIVA(codice);
|
||||
_lista_codici_iva.add(codice, ci);
|
||||
}
|
||||
return *ci;
|
||||
}
|
||||
|
||||
//metodo per lo scorporo iva
|
||||
real TCat2dl_file::scorpora(const real& lordo, const TRecord_text& rec)
|
||||
{
|
||||
TString8 codice = rec.get(19);
|
||||
if (codice.blank())
|
||||
codice = _codiva;
|
||||
|
||||
const TCodiceIVA& pippo = codice_iva(codice); //utilizza la codice_iva
|
||||
real valore = lordo;
|
||||
pippo.scorpora(valore);
|
||||
|
||||
return valore;
|
||||
}
|
||||
|
||||
//scrive i valori dei listini (prezzi e date)
|
||||
@ -169,58 +252,129 @@ void TCat2dl_file::write_listini(const TRecord_text& rec)
|
||||
real prz_ingr = rec.get(11); //legge il prezzo listino ingrosso
|
||||
prz_ingr /=100;
|
||||
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
||||
{
|
||||
TLocalisamfile condv(LF_CONDV);
|
||||
condv.put(CONDV_TIPO, 'L');
|
||||
TConfig config("cat2dl.ini","PARAMS");
|
||||
TString4 listingr = config.get("LISTINGR");
|
||||
condv.put(CONDV_COD, listingr);
|
||||
int err = condv.read();
|
||||
if (err != NOERR) //se il listino indicato nell'ini non esiste..
|
||||
{
|
||||
condv.zero(); //..se lo crea!
|
||||
condv.put(CONDV_TIPO, 'L');
|
||||
condv.put(CONDV_COD, listingr);
|
||||
condv.write();
|
||||
{
|
||||
|
||||
//cache del listino ingrosso
|
||||
TToken_string condv_key;
|
||||
condv_key.add("L");
|
||||
condv_key.add("");
|
||||
condv_key.add("");
|
||||
condv_key.add("");
|
||||
condv_key.add(_listingr);
|
||||
|
||||
const TRectype& listino_ingrosso = cache().get(LF_CONDV, condv_key);
|
||||
|
||||
//creazione di un nuovo listino ingrosso se non esiste
|
||||
if (listino_ingrosso.empty()) //se il listino indicato nell'ini non esiste..
|
||||
{
|
||||
_condv.zero(); //..se lo crea!
|
||||
_condv.put(CONDV_TIPO, 'L'); //listino
|
||||
_condv.put(CONDV_COD, _listingr); //ingrosso
|
||||
_condv.put(CONDV_DESCR, "LISTINO INGROSSO");
|
||||
_condv.put(CONDV_SEQRIC, "A---"); //combinazione di AGR (vedi file che fai prima!)
|
||||
_condv.put(CONDV_GESTUM, "X"); //abilita gestione unita' di misura
|
||||
_condv.write();
|
||||
}
|
||||
|
||||
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che il listino esiste andiamo in rcondv
|
||||
rcondv.put(RCONDV_TIPO, 'L');
|
||||
rcondv.put(RCONDV_COD, listingr);
|
||||
rcondv.put(RCONDV_TIPORIGA, 'A'); //uguale anche x le righe listino (come sopra)
|
||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
rcondv.put(RCONDV_PREZZO, prz_ingr);
|
||||
rcondv.write();
|
||||
_rcondv.zero();
|
||||
_rcondv.put(RCONDV_TIPO, 'L');
|
||||
_rcondv.put(RCONDV_COD, _listingr);
|
||||
_rcondv.put(RCONDV_TIPORIGA, 'A'); //uguale anche x le righe listino (come sopra)
|
||||
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
_rcondv.put(RCONDV_UM, rec.get(7));
|
||||
_rcondv.put(RCONDV_PREZZO, prz_ingr);
|
||||
int err = _rcondv.write();
|
||||
if (err != NOERR)
|
||||
_rcondv.rewrite();
|
||||
}
|
||||
|
||||
real prz_vend = rec.get(15); //legge il prezzo listino vendite e fa lo stesso procedimento del caso precedente
|
||||
prz_vend /=100;
|
||||
if (prz_vend != ZERO)
|
||||
{
|
||||
TLocalisamfile condv(LF_CONDV);
|
||||
condv.put(CONDV_TIPO, 'L');
|
||||
TConfig config("cat2dl.ini","PARAMS");
|
||||
TString4 listvend = config.get("LISTVEND");
|
||||
condv.put(CONDV_COD, listvend);
|
||||
int err = condv.read();
|
||||
if (err != NOERR)
|
||||
{
|
||||
condv.zero();
|
||||
condv.put(CONDV_TIPO, 'L');
|
||||
condv.put(CONDV_COD, listvend);
|
||||
condv.write();
|
||||
//cache del listino vendita
|
||||
TToken_string condv_key;
|
||||
condv_key.add("L");
|
||||
condv_key.add("");
|
||||
condv_key.add("");
|
||||
condv_key.add("");
|
||||
condv_key.add(_listven);
|
||||
|
||||
const TRectype& listino_vendita = cache().get(LF_CONDV, condv_key);
|
||||
|
||||
if (listino_vendita.empty())
|
||||
{
|
||||
_condv.zero();
|
||||
_condv.put(CONDV_TIPO, 'L');
|
||||
_condv.put(CONDV_COD, _listven);
|
||||
_condv.put(CONDV_DESCR, "LISTINO VENDITA");
|
||||
_condv.put(CONDV_SEQRIC, "A---");
|
||||
_condv.put(CONDV_GESTUM, "X");
|
||||
_condv.write();
|
||||
}
|
||||
|
||||
TLocalisamfile rcondv(LF_RCONDV);
|
||||
rcondv.put(RCONDV_TIPO, 'L');
|
||||
rcondv.put(RCONDV_COD, listvend);
|
||||
rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
rcondv.put(RCONDV_PREZZO, prz_vend);
|
||||
rcondv.write();
|
||||
_rcondv.zero();
|
||||
_rcondv.put(RCONDV_TIPO, 'L');
|
||||
_rcondv.put(RCONDV_COD, _listven);
|
||||
_rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
_rcondv.put(RCONDV_UM, rec.get(7));
|
||||
_rcondv.put(RCONDV_PREZZO, scorpora(prz_vend, rec));
|
||||
int err = _rcondv.write();
|
||||
if (err != NOERR)
|
||||
_rcondv.rewrite();
|
||||
}
|
||||
}
|
||||
|
||||
//metodo per determinare le campagne di offerta cui appartengono gli articoli importati
|
||||
void TCat2dl_file::calcola_offerta(const TDate& dataini, const TDate& datafine, TString& codoff)
|
||||
{
|
||||
if (_lista_offerte.items() == 0)
|
||||
{
|
||||
for (int err = _condv.first(); err != NOERR; err = _condv.next())
|
||||
{
|
||||
if (_condv.get_char(CONDV_TIPO) == 'O')
|
||||
_lista_offerte.add(_condv.curr());
|
||||
}
|
||||
}
|
||||
int last_off = 0;
|
||||
for (int i = _lista_offerte.last(); i>=0; i--)
|
||||
{
|
||||
const TRectype& condv = (const TRectype&) _lista_offerte[i];
|
||||
const TString4 cod = condv.get(CONDV_COD);
|
||||
if (cod[0] == codoff[0])
|
||||
{
|
||||
if (last_off == 0)
|
||||
last_off = atoi(cod.mid(1));
|
||||
if (dataini >= condv.get_date(CONDV_VALIN) && datafine <= condv.get_date(CONDV_VALFIN))
|
||||
{
|
||||
codoff = cod;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (i < 0 )
|
||||
{
|
||||
const char pref = codoff[0];
|
||||
codoff.format("%c%02d", pref, last_off + 1);
|
||||
|
||||
_condv.zero();
|
||||
_condv.put(CONDV_TIPO, 'O');
|
||||
_condv.put(CONDV_COD, codoff);
|
||||
|
||||
TString descr = "CAMPAGNA ";
|
||||
descr << codoff << " (dal " << dataini << " al " << datafine << ")";
|
||||
_condv.put(CONDV_DESCR, descr);
|
||||
_condv.put(CONDV_GESTUM, "X");
|
||||
|
||||
_condv.put(CONDV_VALIN, dataini);
|
||||
_condv.put(CONDV_VALFIN, datafine);
|
||||
_condv.write();
|
||||
|
||||
_lista_offerte.add(_condv.curr());
|
||||
}
|
||||
}
|
||||
|
||||
//scrive i valori delle offerte (prezzi e date)
|
||||
void TCat2dl_file::write_offerte(const TRecord_text& rec)
|
||||
{
|
||||
@ -228,62 +382,42 @@ void TCat2dl_file::write_offerte(const TRecord_text& rec)
|
||||
prz_ingr /=100;
|
||||
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
||||
{
|
||||
TLocalisamfile condv(LF_CONDV);
|
||||
condv.put(CONDV_TIPO, 'O');
|
||||
TConfig config("cat2dl.ini","PARAMS");
|
||||
TString4 offeingr = config.get("OFFEINGR");
|
||||
condv.put(CONDV_COD, offeingr);
|
||||
int err = condv.read();
|
||||
if (err != NOERR) //se l'offerta indicata nell'ini non esiste..
|
||||
{
|
||||
condv.zero(); //..se la crea!
|
||||
condv.put(CONDV_TIPO, 'O');
|
||||
condv.put(CONDV_COD, offeingr);
|
||||
TDate dataini = rec.get(12);
|
||||
TDate datafine = rec.get(13);
|
||||
condv.put(CONDV_VALIN, dataini);
|
||||
condv.put(CONDV_VALFIN, datafine);
|
||||
condv.write();
|
||||
}
|
||||
const TDate dataini = rec.get(12);
|
||||
const TDate datafine = rec.get(13);
|
||||
|
||||
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che l'offerta esiste andiamo in rcondv
|
||||
rcondv.put(RCONDV_TIPO, 'O');
|
||||
rcondv.put(RCONDV_COD, offeingr);
|
||||
rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
rcondv.put(RCONDV_PREZZO, prz_ingr);
|
||||
rcondv.write();
|
||||
calcola_offerta(dataini, datafine, _offingr);
|
||||
|
||||
_rcondv.zero();
|
||||
_rcondv.put(RCONDV_TIPO, 'O'); //adesso che sa che l'offerta esiste andiamo in rcondv
|
||||
_rcondv.put(RCONDV_COD, _offingr);
|
||||
_rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
_rcondv.put(RCONDV_UM, rec.get(7));
|
||||
_rcondv.put(RCONDV_PREZZO, prz_ingr);
|
||||
int err = _rcondv.write();
|
||||
if (err != NOERR)
|
||||
_rcondv.rewrite();
|
||||
}
|
||||
|
||||
real prz_vend = rec.get(18); //legge il prezzo offerta ingrosso
|
||||
prz_vend /=100;
|
||||
if (prz_vend != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
||||
{
|
||||
TLocalisamfile condv(LF_CONDV);
|
||||
condv.put(CONDV_TIPO, 'O');
|
||||
TConfig config("cat2dl.ini","PARAMS");
|
||||
TString4 offevend = config.get("OFFEVEND");
|
||||
condv.put(CONDV_COD, offevend);
|
||||
int err = condv.read();
|
||||
if (err != NOERR) //se l'offerta indicata nell'ini non esiste..
|
||||
{
|
||||
condv.zero(); //..se la crea!
|
||||
condv.put(CONDV_TIPO, 'O');
|
||||
condv.put(CONDV_COD, offevend);
|
||||
TDate dataini = rec.get(16);
|
||||
TDate datafine = rec.get(17);
|
||||
condv.put(CONDV_VALIN, dataini);
|
||||
condv.put(CONDV_VALFIN, datafine);
|
||||
condv.write();
|
||||
}
|
||||
const TDate dataini = rec.get(16);
|
||||
const TDate datafine = rec.get(17);
|
||||
|
||||
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che l'offerta esiste andiamo in rcondv
|
||||
rcondv.put(RCONDV_TIPO, 'O');
|
||||
rcondv.put(RCONDV_COD, offevend);
|
||||
rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
rcondv.put(RCONDV_PREZZO, prz_vend);
|
||||
rcondv.write();
|
||||
calcola_offerta(dataini, datafine, _offven);
|
||||
|
||||
_rcondv.zero(); //adesso che sa che l'offerta esiste andiamo in rcondv
|
||||
_rcondv.put(RCONDV_TIPO, 'O');
|
||||
_rcondv.put(RCONDV_COD, _offven);
|
||||
_rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||
_rcondv.put(RCONDV_UM, rec.get(7));
|
||||
_rcondv.put(RCONDV_PREZZO, scorpora(prz_vend, rec));
|
||||
int err = _rcondv.write();
|
||||
if (err != NOERR)
|
||||
_rcondv.rewrite();
|
||||
}
|
||||
}
|
||||
|
||||
@ -295,14 +429,14 @@ class TCat2dl: public TSkeleton_application
|
||||
{
|
||||
TMask* _msk;
|
||||
TCat2dl_file* _trasfile;
|
||||
TString _listingr, _listvend, _offeingr, _offevend;
|
||||
TString _dlfilename, _dlsitepath, _listingr, _listvend, _offeingr, _offevend;
|
||||
TString8 _user, _password, _codiva;
|
||||
|
||||
protected:
|
||||
virtual bool create(void);
|
||||
virtual void main_loop();
|
||||
virtual bool destroy(void);
|
||||
void transfer(void);
|
||||
void inizializza_file(void);
|
||||
static bool annulla_handler(TMask_field& f, KEY k);
|
||||
|
||||
public:
|
||||
@ -317,15 +451,26 @@ inline TCat2dl& app() { return (TCat2dl&) main_app();}
|
||||
// creazione dell'applicazione
|
||||
bool TCat2dl::create()
|
||||
{
|
||||
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
|
||||
_msk = new TMask("dl0800a");
|
||||
_msk->set(F_FILENAME,DLFILENAME);
|
||||
_trasfile = NULL;
|
||||
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, LF_TAB, LF_TABCOM, 0);
|
||||
|
||||
TConfig config("cat2dl.ini","PARAMS");
|
||||
_dlfilename = config.get("DLFILENAME");
|
||||
_dlsitepath = config.get("DLSITEPATH");
|
||||
_listingr = config.get("LISTINGR");
|
||||
_listvend = config.get("LISTVEND");
|
||||
_offeingr = config.get("OFFEINGR");
|
||||
_offevend = config.get("OFFEVEND");
|
||||
_user = config.get("USER");
|
||||
_password = config.get("PASSWORD");
|
||||
_codiva = config.get("CODIVASTD");
|
||||
|
||||
_msk = new TMask("dl0800a");
|
||||
_msk->set(F_FILENAME,_dlfilename);
|
||||
_msk->set(F_INTERNET,_dlsitepath);
|
||||
_msk->set(F_USER, _user);
|
||||
_msk->set(F_PASSWORD, _password);
|
||||
_msk->set(F_CODIVA, _codiva);
|
||||
_trasfile = NULL;
|
||||
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
@ -347,56 +492,101 @@ void TCat2dl::main_loop()
|
||||
{
|
||||
key = _msk->run();
|
||||
if (key == K_ENTER)
|
||||
{
|
||||
_dlfilename = _msk->get(F_FILENAME);
|
||||
_dlsitepath = _msk->get(F_INTERNET);
|
||||
_user = _msk->get(F_USER);
|
||||
_password = _msk->get(F_PASSWORD);
|
||||
_codiva = _msk->get(F_CODIVA);
|
||||
{
|
||||
TConfig config("Cat2dl.ini", "PARAMS");
|
||||
config.set("DLFILENAME", _dlfilename);
|
||||
config.set("DLSITEPATH", _dlsitepath);
|
||||
config.set("USER", _user);
|
||||
config.set("PASSWORD", _password);
|
||||
config.set("CODIVASTD", _codiva);
|
||||
}
|
||||
transfer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// trasferimento dati da file su archivi
|
||||
void TCat2dl::transfer()
|
||||
{
|
||||
TFilename catdlini = "cat2dl.ini";
|
||||
const TFilename catdlini = "cat2dl.ini";
|
||||
//selezione del tipo di omportazione
|
||||
const bool web = _msk->get_bool(F_SELECT);
|
||||
TFilename fileimport;
|
||||
if (web) //via web
|
||||
{
|
||||
TString site; // sito dl
|
||||
TFilename remote; // file remoto
|
||||
TString16 auth; // user+password cifrati
|
||||
|
||||
split_url(_msk->get(F_INTERNET), site, remote);
|
||||
fileimport.temp("DL"); //file temporaneo locale su cui vengono trasferiti i dati
|
||||
cifratura_laziale(_user, _password, auth);
|
||||
|
||||
if (!http_get(site, remote, fileimport, auth))
|
||||
{
|
||||
error_box("Impossibile aggiornare i dati dall'indirizzo web specificato");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
fileimport = _msk->get(F_FILENAME);
|
||||
|
||||
_trasfile = new TCat2dl_file(fileimport, catdlini); //file da importare in locale
|
||||
const unsigned long dimension = fsize(fileimport);
|
||||
|
||||
_trasfile->set_config(_listingr,_listvend,_offeingr,_offevend,_codiva); //parametri dell'.ini
|
||||
_trasfile->open(fileimport,'r');
|
||||
|
||||
_trasfile = new TCat2dl_file(_msk->get(F_FILENAME), catdlini);
|
||||
inizializza_file();
|
||||
const long dimension = fsize(_msk->get(F_FILENAME));
|
||||
TProgind pi(dimension,"Acquisizione in corso...");
|
||||
|
||||
TRelation rel(LF_ANAMAG);
|
||||
TRectype& record = rel.curr(); //record corrente della relazione
|
||||
|
||||
TString str; // Stringa jolly di lavoro
|
||||
TRecord_text curr;
|
||||
while (_trasfile->read(curr) == NOERR)
|
||||
TRecord_text curr;
|
||||
unsigned long processed_rec = 0L;
|
||||
const clock_t start_time = clock();
|
||||
clock_t rt = 0, wt = 0;
|
||||
while (TRUE)
|
||||
{
|
||||
pi.setstatus(_trasfile->read_file()->tellg());
|
||||
|
||||
// read del file dell'ANAMAG
|
||||
str = curr.get(2); //legge il codart
|
||||
rel.curr().put(ANAMAG_CODART, str);
|
||||
int err = rel.read();
|
||||
|
||||
if (err != NOERR)
|
||||
{
|
||||
rel.curr().zero();
|
||||
rel.curr().put(ANAMAG_CODART, str);
|
||||
}
|
||||
const clock_t read_time = clock();
|
||||
if (_trasfile->read(curr) != NOERR)
|
||||
break;
|
||||
const clock_t write_time = clock();
|
||||
|
||||
processed_rec ++;
|
||||
if (processed_rec%100 == 0)
|
||||
{
|
||||
unsigned long time = (clock()-start_time);
|
||||
unsigned long rs = processed_rec*1000/time;
|
||||
rt /= 100; wt /= 100;
|
||||
str.format("%lu rec; %lu sec; %lu rec/sec;\nmean read %lu; mean write %lu", processed_rec, time/1000, rs, rt, wt);
|
||||
rt = wt = 0;
|
||||
pi.set_text(str);
|
||||
pi.setstatus(_trasfile->read_file()->tellg());
|
||||
}
|
||||
if (pi.iscancelled()) //se clicchi annulla si ferma davvero
|
||||
break;
|
||||
_trasfile->autosave(rel, curr); //esegue l'effettivo passaggio dati basandosi sulla formattazione del file .ini
|
||||
|
||||
rt += write_time - read_time;
|
||||
wt += clock() - write_time;
|
||||
}
|
||||
ofstream pippo("dl.log");
|
||||
pippo << "records = " << processed_rec << endl;
|
||||
pippo << "time = " << (clock() - start_time)/1000 << endl;
|
||||
pippo << "speed = " << (processed_rec*1000/(clock() - start_time)) << endl;
|
||||
|
||||
_trasfile->close();
|
||||
message_box("Operazione terminata");
|
||||
}
|
||||
|
||||
|
||||
//inizializza il file di testo su cui emettere i dati
|
||||
void TCat2dl::inizializza_file()
|
||||
{
|
||||
TFilename filect = _msk->get(F_FILENAME); //aggiungere lettura automatica nomi file
|
||||
_trasfile->open(filect,'r');
|
||||
}
|
||||
|
||||
|
||||
// handler per gestire la conferma dell'annullamento dei dati inseriti
|
||||
// nella maschera
|
||||
bool TCat2dl::annulla_handler(TMask_field& f, KEY k)
|
||||
@ -413,14 +603,13 @@ bool TCat2dl::annulla_handler(TMask_field& f, KEY k)
|
||||
// gestione dei messaggi estesi nei campi
|
||||
void TCat2dl_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
|
||||
{
|
||||
const TString code(s.get(0));
|
||||
TString valore;
|
||||
const TString16 code = s.get(0);
|
||||
if (code == "_UPPERCASE")
|
||||
{
|
||||
valore.upper();
|
||||
str.upper();
|
||||
}
|
||||
else NFCHECK("Macro non definita: %s", (const char *)code);
|
||||
str = valore;
|
||||
else
|
||||
NFCHECK("Macro non definita: %s", (const char *)code);
|
||||
}
|
||||
|
||||
int dl0800(int argc, char* argv[])
|
||||
|
@ -1,4 +1,9 @@
|
||||
// importazione catalogo
|
||||
// definizione campi per maschera di selezione
|
||||
|
||||
#define F_FILENAME 102 // nome del file da cui scaricare i dati
|
||||
#define F_SELECT 101 // selezione origine dati
|
||||
#define F_FILENAME 102 // nome del file da cui caricare i dati
|
||||
#define F_INTERNET 103 // indirizzo upload da remoto
|
||||
#define F_USER 104
|
||||
#define F_PASSWORD 105
|
||||
#define F_CODIVA 106 // codice IVA di default (nel caso non sia presente nel record)
|
||||
|
@ -1,34 +1,73 @@
|
||||
#include "dl0800a.h"
|
||||
|
||||
TOOLBAR "" 0 20 0 2
|
||||
PAGE "Importazione catalogo" -1 -1 74 10
|
||||
|
||||
BUTTON DLG_OK 9 2
|
||||
GROUPBOX DLG_NULL 72 7
|
||||
BEGIN
|
||||
PROMPT -12 -11 ""
|
||||
PROMPT 1 1 "@bSelezioni per l'importazione/aggiornamento"
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 9 2
|
||||
RADIOBUTTON F_SELECT 1 18
|
||||
BEGIN
|
||||
PROMPT -22 -11 ""
|
||||
PROMPT 2 2 ""
|
||||
ITEM " |File su disco" MESSAGE ENABLE,1@|DISABLE,2@
|
||||
ITEM "X|Sito Web" MESSAGE ENABLE,2@|DISABLE,1@
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Importazione catalogo" -1 -1 78 20
|
||||
|
||||
GROUPBOX DLG_NULL 77 9
|
||||
STRING F_FILENAME 80 50
|
||||
BEGIN
|
||||
PROMPT 1 1 "Selezioni per l'importazione"
|
||||
END
|
||||
|
||||
STRING F_FILENAME 52
|
||||
BEGIN
|
||||
PROMPT 2 2 "Nome file "
|
||||
CHECKTYPE REQUIRED
|
||||
PROMPT 20 3 ""
|
||||
VALIDATE FILENAME_FUNC
|
||||
FLAGS "A"
|
||||
HELP "Nome del file da cui caricare i dati"
|
||||
HELP "Nome del file locale da cui caricare i dati"
|
||||
WARNING "E' necessario specificare un nome di file"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING F_INTERNET 80 50
|
||||
BEGIN
|
||||
PROMPT 20 4 ""
|
||||
HELP "Indirizzo del sito da cui caricare i dati"
|
||||
WARNING "E' necessario specificare un indirizzo web"
|
||||
GROUP 2
|
||||
END
|
||||
|
||||
STRING F_USER 8
|
||||
BEGIN
|
||||
PROMPT 20 5 "Utente "
|
||||
FLAGS "U"
|
||||
CHECKTYPE REQUIRED
|
||||
GROUP 2
|
||||
END
|
||||
|
||||
STRING F_PASSWORD 8
|
||||
BEGIN
|
||||
PROMPT 43 5 "Password "
|
||||
FLAGS "U*"
|
||||
CHECKTYPE REQUIRED
|
||||
GROUP 2
|
||||
END
|
||||
|
||||
STRING F_CODIVA 4
|
||||
BEGIN
|
||||
PROMPT 5 6 "Codice IVA standard "
|
||||
USE %IVA
|
||||
INPUT CODTAB F_CODIVA
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione @50" S0
|
||||
OUTPUT F_CODIVA CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
WARNING "E' necessario specificare un codice IVA valido"
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -12 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -22 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
308
dl/dl0900.cpp
Executable file
308
dl/dl0900.cpp
Executable file
@ -0,0 +1,308 @@
|
||||
#include <applicat.h>
|
||||
#include <automask.h>
|
||||
#include <execp.h>
|
||||
#include <filetext.h>
|
||||
#include <isamrpc.h>
|
||||
#include <mask.h>
|
||||
#include <relation.h>
|
||||
#include <tabutil.h>
|
||||
#include <printer.h>
|
||||
#include <progind.h>
|
||||
#include <recarray.h>
|
||||
#include <utility.h>
|
||||
|
||||
#include <doc.h>
|
||||
#include <rdoc.h>
|
||||
|
||||
#include "dl0.h"
|
||||
#include "dl0900a.h"
|
||||
#include "dlutils.h"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// Classe TSend_order: maschera //
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
class TSend_ord_mask : public TAutomask
|
||||
{
|
||||
TRelation * _rel;
|
||||
TCursor * _cur;
|
||||
|
||||
protected:
|
||||
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
public:
|
||||
|
||||
TSend_ord_mask();
|
||||
|
||||
virtual ~TSend_ord_mask(){};
|
||||
};
|
||||
|
||||
TSend_ord_mask::TSend_ord_mask() :TAutomask ("dl0900a")
|
||||
{
|
||||
}
|
||||
|
||||
bool TSend_ord_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
/* switch (o.dlg())
|
||||
{
|
||||
default:
|
||||
break;
|
||||
} */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// Classe TSend_order: applicazione principale //
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
class TSend_ord: public TSkeleton_application
|
||||
{
|
||||
TMask* _msk;
|
||||
TString _coddl, _codindsped, _codord, _statoini, _statoend,
|
||||
_address, _path, _user, _password, _lastorddate, _lastordsent;
|
||||
TFilename _filename;
|
||||
TArray _testatedoc;
|
||||
|
||||
protected:
|
||||
virtual bool create(void);
|
||||
virtual void main_loop();
|
||||
virtual bool destroy(void);
|
||||
|
||||
void select_ord(void);
|
||||
bool send_ord(void);
|
||||
|
||||
public:
|
||||
const TMask& msk() const { return *_msk; }
|
||||
TSend_ord() {}
|
||||
virtual ~TSend_ord() {}
|
||||
};
|
||||
|
||||
// restituisce un riferimento all' applicazione
|
||||
inline TSend_ord& app() { return (TSend_ord&) main_app();}
|
||||
|
||||
// creazione dell'applicazione
|
||||
bool TSend_ord::create()
|
||||
{
|
||||
open_files(LF_DOC, LF_RIGHEDOC, 0);
|
||||
_msk = new TMask("dl0900a");
|
||||
// file di configurazione (discolat.ini); vengono letti i dati ed inviati alla maschera
|
||||
TConfig config("discolat.ini","SENDORD");
|
||||
_coddl = config.get("CODDL");
|
||||
_codindsped = config.get("CODINDSPED");
|
||||
_codord = config.get("CODORD");
|
||||
_statoini = config.get("STATOINI");
|
||||
_statoend = config.get("STATOEND");
|
||||
_lastorddate = config.get("LASTORDDATE");
|
||||
_lastordsent = config.get("LASTORDSENT");
|
||||
_address = config.get("ADDRESS");
|
||||
_path = config.get("PATH");
|
||||
_user = config.get("USER");
|
||||
_password = config.get("PASSWORD");
|
||||
_msk->set(F_CODCLI, _coddl);
|
||||
_msk->set(F_CODINDSPED, _codindsped);
|
||||
_msk->set(F_CODNUM, _codord);
|
||||
_msk->set(F_STATOINI, _statoini);
|
||||
_msk->set(F_STATOEND, _statoend);
|
||||
_msk->set(F_LASTORDDATE, _lastorddate);
|
||||
_msk->set(F_LASTORDSENT, _lastordsent);
|
||||
_msk->set(F_ORDINI, atol(_lastordsent)+1);
|
||||
_msk->set(F_ADDRESS, _address);
|
||||
_msk->set(F_PATH, _path);
|
||||
_msk->set(F_USER, _user);
|
||||
_msk->set(F_PASSWORD, _password);
|
||||
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
|
||||
// distruzione dell'applicazione
|
||||
bool TSend_ord::destroy()
|
||||
{
|
||||
delete _msk;
|
||||
return TSkeleton_application::destroy();
|
||||
}
|
||||
|
||||
// carica la maschera
|
||||
void TSend_ord::main_loop()
|
||||
{
|
||||
// Preimposta gli eventuali valori specificati sulla riga di comando
|
||||
//error_box("Attenzione: manca la configurazione del trasferimento!");
|
||||
KEY key = K_ENTER;
|
||||
while (key != K_QUIT)
|
||||
{
|
||||
key = _msk->run();
|
||||
if (key == K_ENTER)
|
||||
{
|
||||
_coddl = _msk->get(F_CODCLI);
|
||||
_codindsped = _msk->get(F_CODINDSPED);
|
||||
_codord = _msk->get(F_CODNUM);
|
||||
_statoini = _msk->get(F_STATOINI);
|
||||
_statoend = _msk->get(F_STATOEND);
|
||||
_lastorddate = _msk->get(F_LASTORDDATE);
|
||||
_lastordsent = _msk->get(F_LASTORDSENT);
|
||||
_address = _msk->get(F_ADDRESS);
|
||||
_path = _msk->get(F_PATH);
|
||||
_user = _msk->get(F_USER);
|
||||
_password = _msk->get(F_PASSWORD);
|
||||
|
||||
select_ord();
|
||||
bool ok = send_ord();
|
||||
|
||||
if (ok)
|
||||
{
|
||||
TConfig config("discolat.ini","SENDORD");
|
||||
config.set("CODDL", _coddl);
|
||||
config.set("CODINDSPED", _codindsped);
|
||||
config.set("CODORD", _codord);
|
||||
config.set("STATOINI", _statoini);
|
||||
config.set("STATOEND", _statoend);
|
||||
config.set("LASTORDDATE", _lastorddate);
|
||||
config.set("LASTORDSENT", _lastordsent);
|
||||
config.set("ADDRESS", _address);
|
||||
config.set("PATH", _path);
|
||||
config.set("USER", _user);
|
||||
config.set("PASSWORD", _password);
|
||||
//occhio ai campi disabilitati sulla maschera!
|
||||
_msk->set(F_LASTORDDATE, _lastorddate);
|
||||
_msk->set(F_LASTORDSENT, _lastordsent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// selezione ordini da mandare
|
||||
void TSend_ord::select_ord()
|
||||
{
|
||||
// relazione sui DOC; seleziona quelli con datadoc inclusa in intervallo, codnum=_codord ecc.
|
||||
TRelation reldoc(LF_DOC);
|
||||
|
||||
long ordini = _msk->get_long(F_ORDINI);
|
||||
long ordfine = _msk->get_long(F_ORDFINE);
|
||||
const int anno = _msk->get_int(F_ANNO);
|
||||
|
||||
TRectype darec(LF_DOC), arec(LF_DOC);
|
||||
|
||||
darec.put(DOC_PROVV, "D");
|
||||
darec.put(DOC_ANNO, anno);
|
||||
darec.put(DOC_CODNUM, _codord);
|
||||
darec.put(DOC_NDOC, ordini);
|
||||
|
||||
arec.put(DOC_PROVV, "D");
|
||||
arec.put(DOC_ANNO, anno);
|
||||
arec.put(DOC_CODNUM, _codord);
|
||||
if (ordfine >= ordini)
|
||||
arec.put(DOC_NDOC, ordfine);
|
||||
|
||||
TString filtro = "STATO==\"";
|
||||
filtro<<_statoini<<"\"";
|
||||
|
||||
TCursor cursore (&reldoc, filtro, 1, &darec, &arec);
|
||||
long nitems = cursore.items();
|
||||
cursore.freeze();
|
||||
|
||||
TRectype riga(LF_RIGHEDOC);
|
||||
TRecord_array righedoc(LF_RIGHEDOC,RDOC_NRIGA); //clamoroso recordarray del file 34 (righedoc)
|
||||
TProgind pi(nitems, "Generazione ordini in corso...", FALSE, TRUE);
|
||||
|
||||
TString rigafile;
|
||||
|
||||
_filename = _path;
|
||||
_filename.add(_coddl);
|
||||
_filename.ext("txt");
|
||||
ofstream out(_filename);
|
||||
|
||||
|
||||
for (cursore=0;cursore.pos()<nitems;++cursore)
|
||||
{
|
||||
pi.addstatus(1);
|
||||
const long ndoc = cursore.curr().get_long(DOC_NDOC);
|
||||
const TDate datadoc = cursore.curr().get_date(DOC_DATADOC);
|
||||
|
||||
_testatedoc.add(cursore.curr());
|
||||
|
||||
//per ogni documento in testata (con chiave 1)...
|
||||
riga.put(RDOC_CODNUM, _codord);
|
||||
riga.put(RDOC_ANNO, datadoc.year());
|
||||
riga.put(RDOC_PROVV, "D");
|
||||
riga.put(RDOC_NDOC, ndoc);
|
||||
|
||||
//...scandisce tutte le sue righemov
|
||||
righedoc.read(riga);
|
||||
|
||||
//aggiunge il file con nome _coddl+datadoc+ndoc al TStringarray con i nomi dei files
|
||||
for (int i=1; i<=righedoc.rows(); i++)
|
||||
{
|
||||
const TRectype& rigai = righedoc[i];
|
||||
const TString80 codart = rigai.get(RDOC_CODARTMAG);
|
||||
const long qta = rigai.get_long(RDOC_QTA);
|
||||
|
||||
rigafile.format("%-6s%-4s%10s%7ld%3d%-20s%8ld%23s",
|
||||
(const char *)_coddl, (const char *)_codindsped,(const char *)datadoc.string(),ndoc,i,(const char *)codart,qta,"");
|
||||
out << rigafile;
|
||||
}
|
||||
|
||||
//aggiorna il valore dell'ultimo ordine creato
|
||||
_lastorddate = datadoc;
|
||||
_lastordsent.format("%ld",ndoc);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// trasferimento files ordini
|
||||
bool TSend_ord::send_ord()
|
||||
{
|
||||
// crea un file txt contenente i comandi per l'invio ftp
|
||||
/* TFilename ftpsend = _path; ftpsend.add("ftps.txt");
|
||||
ofstream out(ftpsend);
|
||||
out << "USER " << _user << " " << _password << endl;
|
||||
|
||||
for (int i = 0; i < _listafiles.items(); i++)
|
||||
out << "PUT " << _path << "/" << i << " " << _listafiles.row(i) << endl;
|
||||
|
||||
out << "QUIT" << endl;
|
||||
out.close();
|
||||
//crea un file .bat per eseguire i comandi ftp contenuti nel file di testo
|
||||
TFilename ftpbat = _path; ftpbat.add("ftps.bat");
|
||||
ofstream outbat(ftpbat);
|
||||
outbat << "FTP -n " << _address << " < " << ftpsend;
|
||||
outbat.close();
|
||||
//stringa magica che permette l'esecuzione dei comandi ftp lanciando e chiudendo la shell dos
|
||||
//COMSPEC e' la variabile d'ambiente che contiene l'indirizzo del command.com
|
||||
// /c significa 'chiudi la shell dopo l'esecuzione del comando!'
|
||||
TString cmd;
|
||||
cmd << getenv("COMSPEC") << " /c " << ftpbat;
|
||||
TExternal_app app(cmd);
|
||||
app.run(TRUE, FALSE, FALSE, FALSE); */
|
||||
|
||||
TString site, service, authorization;
|
||||
split_url(_address, site, service);
|
||||
cifratura_laziale(_user, _password, authorization);
|
||||
|
||||
byte* answer = NULL;
|
||||
size_t length = 0;
|
||||
bool ok = http_post(site, service, _filename, authorization, answer, length);
|
||||
|
||||
if (ok)
|
||||
{
|
||||
message_box("Esito della transazione:\n%s", answer);
|
||||
//se la transazione è andata a buon fine cambia stato ai documenti inviati
|
||||
if (answer[0] == 'O' && answer[1] == 'K')
|
||||
{
|
||||
TLocalisamfile docfile(LF_DOC);
|
||||
for (int i = _testatedoc.last(); i>=0; i--)
|
||||
{
|
||||
TRectype& doc = (TRectype&) _testatedoc[i];
|
||||
doc.put(DOC_STATO, _statoend);
|
||||
doc.rewrite(docfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
int dl0900(int argc, char* argv[])
|
||||
{
|
||||
TSend_ord a ;
|
||||
a.run(argc, argv, "Invio ordini");
|
||||
return 0;
|
||||
}
|
22
dl/dl0900a.h
Executable file
22
dl/dl0900a.h
Executable file
@ -0,0 +1,22 @@
|
||||
// invio ordini
|
||||
// definizione campi per maschera di selezione
|
||||
|
||||
#define F_ANNO 101
|
||||
#define F_CODNUM 102
|
||||
#define F_ORDINI 103
|
||||
#define F_ORDFINE 104
|
||||
#define F_LASTORDSENT 105
|
||||
|
||||
#define F_CODCLI 106
|
||||
#define F_ADDRESS 107
|
||||
#define F_PATH 108
|
||||
#define F_USER 109
|
||||
#define F_PASSWORD 110
|
||||
#define F_CODINDSPED 111
|
||||
|
||||
#define F_DATAINI 112
|
||||
#define F_DATAFINE 113
|
||||
#define F_LASTORDDATE 114
|
||||
|
||||
#define F_STATOINI 115
|
||||
#define F_STATOEND 116
|
165
dl/dl0900a.uml
Executable file
165
dl/dl0900a.uml
Executable file
@ -0,0 +1,165 @@
|
||||
#include "dl0900a.h"
|
||||
|
||||
PAGE "Invio ordini" -1 -1 70 20
|
||||
|
||||
GROUPBOX DLG_NULL 68 10
|
||||
BEGIN
|
||||
PROMPT 1 0 "@bSelezione ordini"
|
||||
END
|
||||
|
||||
NUMBER F_ANNO 4
|
||||
BEGIN
|
||||
PROMPT 2 1 "Anno "
|
||||
FLAGS "A"
|
||||
END
|
||||
|
||||
STRING F_CODNUM 4
|
||||
BEGIN
|
||||
PROMPT 2 2 "Codice ordini Discoteca Laziale "
|
||||
FLAG "U"
|
||||
USE %NUM SELECT I1==3
|
||||
INPUT CODTAB F_CODNUM
|
||||
DISPLAY "Cod. Num." CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_CODNUM CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_STATOINI 1
|
||||
BEGIN
|
||||
PROMPT 2 3 "Stato dei documenti da inviare "
|
||||
USE %STD
|
||||
INPUT CODTAB F_STATOINI
|
||||
DISPLAY "Stato iniziale" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_STATOINI CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_STATOEND 1
|
||||
BEGIN
|
||||
PROMPT 2 4 "Stato dei documenti inviati "
|
||||
USE %STD
|
||||
INPUT CODTAB F_STATOEND
|
||||
DISPLAY "Stato iniziale" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_STATOEND CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
NUMBER F_ORDINI 7
|
||||
BEGIN
|
||||
PROMPT 2 5 "Dall'ordine "
|
||||
USE LF_DOC SELECT STATO==#F_STATOINI
|
||||
INPUT PROVV "D"
|
||||
INPUT ANNO F_ANNO SELECT
|
||||
INPUT CODNUM F_CODNUM SELECT
|
||||
INPUT NDOC F_ORDINI
|
||||
DISPLAY "Anno" ANNO
|
||||
DISPLAY "Numerazione" CODNUM
|
||||
DISPLAY "Ordine " NDOC
|
||||
DISPLAY "Data@10" DATADOC
|
||||
DISPLAY "Stato" STATO
|
||||
OUTPUT F_ORDINI NDOC
|
||||
OUTPUT F_DATAINI DATADOC
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
DATE F_DATAINI
|
||||
BEGIN
|
||||
PROMPT 35 5 "del "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
NUMBER F_ORDFINE 7
|
||||
BEGIN
|
||||
PROMPT 2 6 "All'ordine "
|
||||
COPY USE F_ORDINI
|
||||
INPUT PROVV "D"
|
||||
INPUT ANNO F_ANNO SELECT
|
||||
INPUT CODNUM F_CODNUM SELECT
|
||||
INPUT NDOC F_ORDFINE
|
||||
COPY DISPLAY F_ORDINI
|
||||
OUTPUT F_ORDFINE NDOC
|
||||
OUTPUT F_DATAFINE DATADOC
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
DATE F_DATAFINE
|
||||
BEGIN
|
||||
PROMPT 35 6 "del "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
NUMBER F_LASTORDSENT 7
|
||||
BEGIN
|
||||
PROMPT 2 7 "Ultimo ordine inviato "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
DATE F_LASTORDDATE
|
||||
BEGIN
|
||||
PROMPT 35 7 "del "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 68 8
|
||||
BEGIN
|
||||
PROMPT 1 11 "@bParametri per l'invio"
|
||||
END
|
||||
|
||||
STRING F_CODCLI 6
|
||||
BEGIN
|
||||
PROMPT 2 12 "Codice cliente Discoteca Laziale "
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_CODINDSPED 4
|
||||
BEGIN
|
||||
PROMPT 2 13 "Codice indirizzo spedizione "
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_ADDRESS 80 50
|
||||
BEGIN
|
||||
PROMPT 2 14 "Indirizzo "
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_PATH 50 35
|
||||
BEGIN
|
||||
PROMPT 2 15 "Cartella files da inviare "
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_USER 8
|
||||
BEGIN
|
||||
PROMPT 2 16 "Utente "
|
||||
FLAGS "U"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_PASSWORD 8
|
||||
BEGIN
|
||||
PROMPT 32 16 "Password "
|
||||
FLAGS "U*"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
ENDMASK
|
97
dl/dlinst.cpp
Executable file
97
dl/dlinst.cpp
Executable file
@ -0,0 +1,97 @@
|
||||
#include <inst.h>
|
||||
#include <config.h>
|
||||
#include <modaut.h>
|
||||
#include <prefix.h>
|
||||
#include <progind.h>
|
||||
#include <relation.h>
|
||||
|
||||
class TInstall_DL : public TInstallmodule_app
|
||||
{
|
||||
private:
|
||||
bool set_firm_params(const long codfirm);
|
||||
protected:
|
||||
virtual bool modal() const {return FALSE;}
|
||||
virtual int module_number() const {return DLAUT;} //negozi dischi
|
||||
virtual bool install_firm() {return TRUE;} //no firm installation
|
||||
virtual bool post_installer();
|
||||
|
||||
public:
|
||||
virtual ~TInstall_DL () {}
|
||||
};
|
||||
|
||||
bool TInstall_DL::set_firm_params(const long codfirm)
|
||||
{
|
||||
//per la ditta passata trova il prassid.ini
|
||||
TFilename ininame = ::firm2dir(codfirm);
|
||||
if (!ininame.exist())
|
||||
return FALSE;
|
||||
|
||||
ininame.add("prassid.ini");
|
||||
|
||||
// negozi di dischi:file prassid.ini nei datiditta
|
||||
TConfig prassid(ininame, "ve");
|
||||
|
||||
//valori delle CHK_USER (campi user abilitati: dal 2 al 9 compresi)
|
||||
for (int i=2;i<=9;i++)
|
||||
prassid.set("CHK_USER", "X", NULL, TRUE, i);
|
||||
|
||||
//valori delle LEN_USER e TYPE_USER (S=string,D=date)
|
||||
for (int j=2;j<=4;j++)
|
||||
{
|
||||
prassid.set("LEN_USER", "20", NULL, TRUE, j);
|
||||
prassid.set("TYPE_USER", "S", NULL, TRUE, j);
|
||||
}
|
||||
for (int k=5;k<=7;k++)
|
||||
prassid.set("TYPE_USER", "D", NULL, TRUE, k);
|
||||
|
||||
prassid.set("LEN_USER", "6", NULL, TRUE, 8);
|
||||
prassid.set("TYPE_USER", "S", NULL, TRUE, 8);
|
||||
prassid.set("TYPE_USER", "D", NULL, TRUE, 9);
|
||||
//valori delle DEC_USER (tutti vuoti!)
|
||||
for (int l=2;l<=9;l++)
|
||||
prassid.set("DEC_USER", "", NULL, TRUE, l);
|
||||
|
||||
//valori delle PROMPT_USER
|
||||
prassid.set("PROMPT_USER", "Artista", NULL, TRUE, 2);
|
||||
prassid.set("PROMPT_USER", "Compositore", NULL, TRUE, 3);
|
||||
prassid.set("PROMPT_USER", "Etichetta", NULL, TRUE, 4);
|
||||
prassid.set("PROMPT_USER", "Data emissione", NULL, TRUE, 5);
|
||||
prassid.set("PROMPT_USER", "Data fuori catalogo", NULL, TRUE, 6);
|
||||
prassid.set("PROMPT_USER", "Data aggiorn. D.L.", NULL, TRUE, 7);
|
||||
prassid.set("PROMPT_USER", "Ora aggiorn. D.L.", NULL, TRUE, 8);
|
||||
prassid.set("PROMPT_USER", "Data variazione", NULL, TRUE, 9);
|
||||
|
||||
//abilitazione gestione unita' di misura su listini e offerte
|
||||
prassid.set("GESUM", "X", NULL, TRUE, 1);
|
||||
prassid.set("GESUM", "X", NULL, TRUE, 3);
|
||||
|
||||
// adesso va abilitata la gestione del magazzino, senno' col cavolo che si vedono i campi USER!
|
||||
prassid.set_paragraph("mg");
|
||||
prassid.set("GESMAG", "X");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TInstall_DL::post_installer()
|
||||
{
|
||||
TRelation ditte(LF_NDITTE);
|
||||
TCursor cur(&ditte);
|
||||
const long items = cur.items();
|
||||
cur.freeze();
|
||||
TProgind pi(items, "Configurazione in corso...", FALSE, TRUE);
|
||||
|
||||
for (cur = 0; cur.pos() < items; ++cur)
|
||||
{
|
||||
pi.addstatus(1);
|
||||
const long codditta = ditte.curr().get_long("CODDITTA");
|
||||
set_firm_params(codditta);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
TInstall_DL app;
|
||||
app.run(argc, argv);
|
||||
return 0;
|
||||
}
|
7
dl/dlinst.url
Executable file
7
dl/dlinst.url
Executable file
@ -0,0 +1,7 @@
|
||||
#define APPNAME campo
|
||||
#define QAPPNAME "campo"
|
||||
#define QFIRMNAME "A.G.A. Informatica Srl"
|
||||
#include <default.url>
|
||||
|
||||
#include <mainmenu.url>
|
||||
|
43
dl/dlutils.cpp
Executable file
43
dl/dlutils.cpp
Executable file
@ -0,0 +1,43 @@
|
||||
#include "dlutils.h"
|
||||
|
||||
void split_url(const TString& url, TString& site, TString& service)
|
||||
{
|
||||
int slash_pos = 0, slash_found = 0;
|
||||
for (int i = 0; url[i]; i++)
|
||||
{
|
||||
if (url[i] == '/' || url[i] == '\\')
|
||||
{
|
||||
if (slash_found == 0)
|
||||
slash_pos = i;
|
||||
slash_found++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (slash_found == 1)
|
||||
break;
|
||||
slash_found = slash_pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (slash_pos > 0)
|
||||
{
|
||||
site = url.left(slash_pos);
|
||||
service = url.mid(slash_pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
site = url;
|
||||
service = "/";
|
||||
}
|
||||
}
|
||||
|
||||
void cifratura_laziale(const TString& usr, const TString& pwd, TString& key)
|
||||
{
|
||||
TString16 str;
|
||||
str.format("%-8s%-8s", (const char*)usr, (const char*)pwd);
|
||||
key.cut(0);
|
||||
for (int i = 0; str[i]; i++)
|
||||
key << char(str[i] + 2*(i+1));
|
||||
}
|
||||
|
||||
|
13
dl/dlutils.h
Executable file
13
dl/dlutils.h
Executable file
@ -0,0 +1,13 @@
|
||||
#ifndef __DLUTILS_H
|
||||
#define __DLUTILS_H
|
||||
|
||||
#ifndef __STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
||||
void split_url(const TString& url, TString& site, TString& service);
|
||||
void cifratura_laziale(const TString& usr, const TString& pwd, TString& key);
|
||||
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user