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
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]
|
[PARAMS]
|
||||||
|
CODIVASTD =
|
||||||
|
DLFILENAME =
|
||||||
|
DLSITEPATH =
|
||||||
LISTINGR = LI1
|
LISTINGR = LI1
|
||||||
LISTVEND = LI2
|
LISTVEND = LI2
|
||||||
OFFEINGR = OF1
|
OFFEINGR = I00
|
||||||
OFFEVEND = OF2
|
OFFEVEND = V00
|
||||||
|
|
||||||
[MAIN]
|
[MAIN]
|
||||||
DECSEP =
|
DECSEP =
|
||||||
@ -75,7 +78,7 @@ LENGTH(2) = 15
|
|||||||
|
|
||||||
NAME(3) = CTTITO
|
NAME(3) = CTTITO
|
||||||
TYPE(3) = STRINGA
|
TYPE(3) = STRINGA
|
||||||
FIELD(3) = 47->USER1
|
FIELD(3) = 47->DESCR
|
||||||
POSITION(3) = 29
|
POSITION(3) = 29
|
||||||
LENGTH(3) = 40
|
LENGTH(3) = 40
|
||||||
|
|
||||||
@ -120,42 +123,42 @@ FIELD(10) = 47->USER6
|
|||||||
POSITION(10) = 141
|
POSITION(10) = 141
|
||||||
LENGTH(10) = 8
|
LENGTH(10) = 8
|
||||||
|
|
||||||
NAME(11) = CTPRIE //listino ingrosso prezzo
|
NAME(11) = CTPRIE //listino ingrosso prezzo
|
||||||
TYPE(11) = EURO
|
TYPE(11) = EURO
|
||||||
POSITION(11) = 158
|
POSITION(11) = 158
|
||||||
LENGTH(11) = 9
|
LENGTH(11) = 9
|
||||||
|
|
||||||
NAME(12) = CTDIPI //offerta ingrosso dataini
|
NAME(12) = CTDIPI //offerta ingrosso dataini
|
||||||
TYPE(12) = DATA
|
TYPE(12) = DATA
|
||||||
POSITION(12) = 167
|
POSITION(12) = 167
|
||||||
LENGTH(12) = 8
|
LENGTH(12) = 8
|
||||||
|
|
||||||
NAME(13) = CTDFPI //offerta ingrosso datafin
|
NAME(13) = CTDFPI //offerta ingrosso datafin
|
||||||
TYPE(13) = DATA
|
TYPE(13) = DATA
|
||||||
POSITION(13) = 175
|
POSITION(13) = 175
|
||||||
LENGTH(13) = 8
|
LENGTH(13) = 8
|
||||||
|
|
||||||
NAME(14) = CTCAPE //offerta ingrosso prezzo
|
NAME(14) = CTCAPE //offerta ingrosso prezzo
|
||||||
TYPE(14) = EURO
|
TYPE(14) = EURO
|
||||||
POSITION(14) = 192
|
POSITION(14) = 192
|
||||||
LENGTH(14) = 9
|
LENGTH(14) = 9
|
||||||
|
|
||||||
NAME(15) = CTPRVU //listino pubblico prezzo
|
NAME(15) = CTPRVU //listino pubblico prezzo
|
||||||
TYPE(15) = EURO
|
TYPE(15) = EURO
|
||||||
POSITION(15) = 210
|
POSITION(15) = 210
|
||||||
LENGTH(15) = 9
|
LENGTH(15) = 9
|
||||||
|
|
||||||
NAME(16) = CTDIVE //campagna vendita dataini
|
NAME(16) = CTDIVE //campagna vendita dataini
|
||||||
TYPE(16) = DATA
|
TYPE(16) = DATA
|
||||||
POSITION(16) = 219
|
POSITION(16) = 219
|
||||||
LENGTH(16) = 8
|
LENGTH(16) = 8
|
||||||
|
|
||||||
NAME(17) = CTDFVE //campagna vendita datafin
|
NAME(17) = CTDFVE //campagna vendita datafin
|
||||||
TYPE(17) = DATA
|
TYPE(17) = DATA
|
||||||
POSITION(17) = 227
|
POSITION(17) = 227
|
||||||
LENGTH(17) = 8
|
LENGTH(17) = 8
|
||||||
|
|
||||||
NAME(18) = CTCAVU //campagna vendita prezzo
|
NAME(18) = CTCAVU //campagna vendita prezzo
|
||||||
TYPE(18) = EURO
|
TYPE(18) = EURO
|
||||||
POSITION(18) = 244
|
POSITION(18) = 244
|
||||||
LENGTH(18) = 9
|
LENGTH(18) = 9
|
||||||
|
18
dl/dl0.cpp
18
dl/dl0.cpp
@ -14,22 +14,16 @@ int main(int argc,char** argv)
|
|||||||
|
|
||||||
switch (r)
|
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:
|
case 4:
|
||||||
rt = dl0500(argc,argv) ; break;
|
rt = dl0500(argc,argv) ; break; //ricerca avanzata
|
||||||
case 5:
|
case 5:
|
||||||
rt = dl0600(argc,argv) ; break;
|
rt = dl0600(argc,argv) ; break; //interrogazione magazzino
|
||||||
case 6:
|
case 6:
|
||||||
rt = dl0700(argc,argv) ; break; */
|
rt = dl0700(argc,argv) ; break; //top ten
|
||||||
case 7:
|
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:
|
default:
|
||||||
error_box(usage, argv[0]) ; break;
|
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 dl0100(int argc, char* argv[]);
|
||||||
int dl0200(int argc, char* argv[]);
|
int dl0200(int argc, char* argv[]);
|
||||||
int dl0300(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 dl0500(int argc, char* argv[]);
|
||||||
int dl0600(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 dl0800(int argc, char* argv[]);
|
||||||
|
int dl0900(int argc, char* argv[]);
|
||||||
|
|
||||||
#endif // __DL0_H
|
#endif // __DL0_H
|
||||||
|
|
||||||
|
BIN
dl/dl00.bmp
Executable file
BIN
dl/dl00.bmp
Executable file
Binary file not shown.
After Width: | Height: | Size: 117 KiB |
406
dl/dl0500.cpp
406
dl/dl0500.cpp
@ -1,35 +1,110 @@
|
|||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
#include <filetext.h>
|
#include <automask.h>
|
||||||
|
#include <execp.h>
|
||||||
#include <form.h>
|
#include <form.h>
|
||||||
#include <mask.h>
|
|
||||||
#include <relation.h>
|
#include <relation.h>
|
||||||
#include <tabutil.h>
|
|
||||||
#include <printer.h>
|
#include <printer.h>
|
||||||
#include <progind.h>
|
#include <progind.h>
|
||||||
#include <recarray.h>
|
#include <recarray.h>
|
||||||
#include <utility.h>
|
#include <utility.h>
|
||||||
|
#include <utility.h>
|
||||||
|
|
||||||
|
#include <doc.h>
|
||||||
|
#include <rdoc.h>
|
||||||
|
|
||||||
#include "..\mg\umart.h"
|
#include "..\mg\umart.h"
|
||||||
#include "..\mg\anamag.h"
|
#include "..\mg\anamag.h"
|
||||||
#include "..\ve\condv.h"
|
|
||||||
#include "..\ve\rcondv.h"
|
|
||||||
#include "dl0.h"
|
#include "dl0.h"
|
||||||
|
#include "dl0500.h"
|
||||||
#include "dl0500a.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
|
class TRicerca: public TSkeleton_application
|
||||||
{
|
{
|
||||||
TMask* _msk;
|
TRicerca_mask * _mask;
|
||||||
TRicerca_file* _trasfile;
|
static TMask * _ordmask;
|
||||||
TString _listingr, _listvend, _offeingr, _offevend;
|
bool _barcode, _giac, _titolo, _artista, _compositore, _prezzo, _genere, _tiposupp;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool create(void);
|
virtual bool create(void);
|
||||||
virtual void main_loop();
|
|
||||||
virtual bool destroy(void);
|
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:
|
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() {}
|
TRicerca() {}
|
||||||
virtual ~TRicerca() {}
|
virtual ~TRicerca() {}
|
||||||
};
|
};
|
||||||
@ -37,48 +112,305 @@ public:
|
|||||||
// restituisce un riferimento all' applicazione
|
// restituisce un riferimento all' applicazione
|
||||||
inline TRicerca& app() { return (TRicerca&) main_app();}
|
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
|
// creazione dell'applicazione
|
||||||
bool TRicerca::create()
|
bool TRicerca::create()
|
||||||
{
|
{
|
||||||
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
|
open_files(LF_ANAMAG, LF_UMART, LF_MAG, LF_DOC, LF_RCONDV, 0);
|
||||||
_msk = new TMask("dl0500a");
|
_mask = new TRicerca_mask;
|
||||||
_msk->set(F_FILENAME,DLFILENAME);
|
|
||||||
_trasfile = NULL;
|
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();
|
return TSkeleton_application::create();
|
||||||
}
|
}
|
||||||
|
|
||||||
// distruzione dell'applicazione
|
// distruzione dell'applicazione
|
||||||
bool TRicerca::destroy()
|
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();
|
return TSkeleton_application::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
// carica la maschera
|
//aggiunge effettivamente una espressione ad un filtro
|
||||||
void TRicerca::main_loop()
|
void TRicerca::add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const
|
||||||
{
|
{
|
||||||
// Preimposta gli eventuali valori specificati sulla riga di comando
|
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
|
||||||
//error_box("Attenzione: manca la configurazione del trasferimento!");
|
if (!fld.empty()) //..se non e' vuoto
|
||||||
KEY key = K_ENTER;
|
|
||||||
while (key != K_QUIT)
|
|
||||||
{
|
{
|
||||||
key = _msk->run();
|
if (filtro.not_empty()) //distinzione tra filtro vuoto e filtro esistente
|
||||||
if (key == K_ENTER)
|
filtro << "&&";
|
||||||
transfer();
|
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
|
//aggiunge ad un filtro una espressione con l'*
|
||||||
// nella maschera
|
void TRicerca::add_meta_filter(TString& filtro, const char * field, short id) const
|
||||||
bool TRicerca::annulla_handler(TMask_field& f, KEY k)
|
{
|
||||||
|
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 (tid > fid)
|
||||||
if (k == K_SPACE)
|
|
||||||
{
|
{
|
||||||
if (yesno_box("Vuoi veramente annullare i dati inseriti"))
|
add_expr_filter(filtro, field, fid, ">=");
|
||||||
m.reset();
|
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[])
|
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
|
// ricerca avanzata
|
||||||
// definizione campi per maschera di selezione dl0500a
|
// definizione campi per maschera di selezione dl0500a
|
||||||
|
|
||||||
#define F_BARCODE 101
|
#define F_DABARCODE 101
|
||||||
#define F_TIPOSUPPORTO 102
|
#define F_TIPOSUPPORTO 102
|
||||||
#define F_TITOLO 103
|
#define F_TITOLO 103
|
||||||
#define F_ARTISTA 104
|
#define F_ARTISTA 104
|
||||||
@ -12,5 +12,14 @@
|
|||||||
#define F_DATAE_FIN 109
|
#define F_DATAE_FIN 109
|
||||||
#define F_DATAV_INI 110
|
#define F_DATAV_INI 110
|
||||||
#define F_DATAV_FIN 111
|
#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"
|
#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
|
BEGIN
|
||||||
PROMPT -12 -11 ""
|
PROMPT 1 1 "@bParametri di selezione"
|
||||||
END
|
END
|
||||||
|
|
||||||
BUTTON DLG_QUIT 9 2
|
STRING F_DABARCODE 20
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
ENDPAGE
|
STRING F_ABARCODE 20
|
||||||
|
|
||||||
PAGE "Ricerca avanzata" -1 -1 78 20
|
|
||||||
|
|
||||||
STRING F_BARCODE 20
|
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
STRING F_TIPOSUPPORTO 10
|
STRING F_TIPOSUPPORTO 10
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
STRING F_TITOLO 40
|
STRING F_TITOLO 50 45
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
STRING F_ARTISTA 20
|
STRING F_ARTISTA 20
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
STRING F_COMPOSITORE 20
|
STRING F_COMPOSITORE 20
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
STRING F_ETICHETTA 20
|
STRING F_ETICHETTA 20
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
STRING F_GENEREMUSICALE
|
STRING F_GENEREMUSICALE 3
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
DATE F_DATAE_INI
|
DATE F_DATAE_INI
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 2 8 "Data emissione: da "
|
PROMPT 2 9 "Data emissione: da "
|
||||||
END
|
END
|
||||||
|
|
||||||
DATE F_DATAE_FIN
|
DATE F_DATAE_FIN
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
DATE F_DATAV_INI
|
DATE F_DATAV_INI
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 2 9 "Data variazione da "
|
PROMPT 2 10 "Data variazione da "
|
||||||
END
|
END
|
||||||
|
|
||||||
DATE F_DATAV_FIN
|
DATE F_DATAV_FIN
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
ENDPAGE
|
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 <applicat.h>
|
||||||
#include <filetext.h>
|
#include <filetext.h>
|
||||||
#include <form.h>
|
#include <isamrpc.h>
|
||||||
#include <mask.h>
|
#include <mask.h>
|
||||||
#include <relation.h>
|
|
||||||
#include <tabutil.h>
|
#include <tabutil.h>
|
||||||
#include <printer.h>
|
|
||||||
#include <progind.h>
|
#include <progind.h>
|
||||||
#include <recarray.h>
|
#include <recarray.h>
|
||||||
#include <utility.h>
|
#include <utility.h>
|
||||||
|
|
||||||
|
#include "..\cg\cglib01.h"
|
||||||
#include "..\mg\umart.h"
|
#include "..\mg\umart.h"
|
||||||
#include "..\mg\anamag.h"
|
#include "..\mg\anamag.h"
|
||||||
#include "..\ve\condv.h"
|
#include "..\ve\condv.h"
|
||||||
#include "..\ve\rcondv.h"
|
#include "..\ve\rcondv.h"
|
||||||
|
|
||||||
#include "dl0.h"
|
#include "dl0.h"
|
||||||
#include "dl0800a.h"
|
#include "dl0800a.h"
|
||||||
|
#include "dlutils.h"
|
||||||
#define DLFILENAME "XCATT00F"
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
// Classe TCat2dl_file customizzata dalla TFile_text //
|
// Classe TCat2dl_file customizzata dalla TFile_text //
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class TCat2dl_file: public 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:
|
protected:
|
||||||
virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
|
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:
|
public:
|
||||||
virtual int autosave(TRelation& rel, const TRecord_text& rec);
|
virtual int autosave(TRelation& rel, const TRecord_text& rec);
|
||||||
@ -33,15 +42,25 @@ public:
|
|||||||
void write_supporto(const TRecord_text& rec);
|
void write_supporto(const TRecord_text& rec);
|
||||||
void write_listini(const TRecord_text& rec);
|
void write_listini(const TRecord_text& rec);
|
||||||
void write_offerte(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);
|
TCat2dl_file(const TString& file_name, const TString& config_name);
|
||||||
virtual ~TCat2dl_file() { }
|
virtual ~TCat2dl_file() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
TCat2dl_file::TCat2dl_file(const TString& file_name, const TString& config_name)
|
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)
|
int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
|
||||||
{
|
{
|
||||||
const TString& type = rec.type(); //prendo il tracciato record del tipo del record_text
|
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++)
|
for (int i = 0; i < items; i++)
|
||||||
{
|
{
|
||||||
const TTracciato_campo& tc = tr.get(i);
|
const TTracciato_campo& tc = tr.get(i);
|
||||||
TFieldref field(tc.field());
|
if (tc.field().name().not_empty())
|
||||||
if (field.name().not_empty())
|
|
||||||
{
|
{
|
||||||
if (field.file()==0)
|
const TFieldref& field = tc.field();
|
||||||
field.set_file(rel.lfile().num());
|
// if (field.file()==0)
|
||||||
|
// field.set_file(rel.lfile().num());
|
||||||
valore = rec.row(i);
|
valore = rec.row(i);
|
||||||
// formatta il campo del file di testo secondo le specifiche del campo su file isam
|
// formatta il campo del file di testo secondo le specifiche del campo su file isam
|
||||||
preformat_field(field,valore,rel,tr.type());
|
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
|
valore = format_field(tc, rel.lfile().num(), valore);//formatta il campo secondo le specifiche del record
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (vuoto && field.name()=="CODIVA") //se il codice iva e' vuoto...
|
||||||
|
{
|
||||||
|
valore = _codiva;
|
||||||
|
vuoto = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (!vuoto && rel.exist(field.file()))
|
if (!vuoto && rel.exist(field.file()))
|
||||||
field.write(valore, rel);//faccio una write sulla relazione del fieldref
|
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)
|
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);
|
write_supporto(rec);
|
||||||
// 2) legge e scrive i dati dei listini: se il listino non esiste lo crea
|
// 2) legge e scrive i dati dei listini: se il listino non esiste lo crea
|
||||||
write_listini(rec);
|
write_listini(rec);
|
||||||
// 3) legge e scrive i dati delle offerte: se l'offerta non esiste la crea
|
// 3) legge e scrive i dati delle offerte: se l'offerta non esiste la crea
|
||||||
write_offerte(rec);
|
write_offerte(rec);
|
||||||
|
|
||||||
return TRUE;
|
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)
|
//scrive il supporto dell'articolo nel campo UM del file umart (unita' di misura)
|
||||||
void TCat2dl_file::write_supporto(const TRecord_text& rec)
|
void TCat2dl_file::write_supporto(const TRecord_text& rec)
|
||||||
{
|
{
|
||||||
const TString& codart = rec.get(2);
|
|
||||||
const TString& um = rec.get(7);
|
const TString& um = rec.get(7);
|
||||||
|
|
||||||
if (!um.blank()) //il casino lo fa solo se ha un codice supporto non nullo
|
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...
|
TString80 codart = rec.get(2); //Sistemiamo 'sto cavolo di supporto!
|
||||||
umart.put(UMART_CODART, codart);
|
codart.trim();
|
||||||
umart.put(UMART_UM, um);
|
|
||||||
umart.setkey(2); //..con chiave 2...
|
|
||||||
|
|
||||||
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...
|
if (err != NOERR) //Se non trova l'unita' di misura tra quelle gia' presenti...
|
||||||
{
|
{
|
||||||
umart.setkey(1);
|
_umart.setkey(1);
|
||||||
umart.put(UMART_CODART, codart);
|
_umart.put(UMART_CODART, codart);
|
||||||
umart.put(UMART_NRIGA, 999);
|
_umart.put(UMART_NRIGA, 999);
|
||||||
err = umart.read(_isgreat);
|
|
||||||
err = umart.prev();
|
_umart.read(_isgreat);
|
||||||
|
const int uerr = _umart.prev();
|
||||||
|
|
||||||
int nriga = 1;
|
int nriga = 1;
|
||||||
if (err == NOERR && umart.get(UMART_CODART) == codart)
|
if (uerr == NOERR && _umart.get(UMART_CODART) == codart)
|
||||||
nriga = umart.get_int(UMART_NRIGA) + 1;
|
nriga = _umart.get_int(UMART_NRIGA) + 1;
|
||||||
|
|
||||||
umart.zero(); //..la aggiunge come ultima unita' di misura.
|
_umart.zero(); //..la aggiunge come ultima unita' di misura.
|
||||||
umart.put(UMART_CODART, codart);
|
_umart.put(UMART_CODART, codart);
|
||||||
umart.put(UMART_NRIGA, nriga);
|
_umart.put(UMART_NRIGA, nriga);
|
||||||
umart.put(UMART_UM, um);
|
_umart.put(UMART_UM, um);
|
||||||
umart.put(UMART_FC, 1);
|
_umart.put(UMART_FC, 1);
|
||||||
|
|
||||||
umart.write();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
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)
|
//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
|
real prz_ingr = rec.get(11); //legge il prezzo listino ingrosso
|
||||||
prz_ingr /=100;
|
prz_ingr /=100;
|
||||||
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
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');
|
//cache del listino ingrosso
|
||||||
TConfig config("cat2dl.ini","PARAMS");
|
TToken_string condv_key;
|
||||||
TString4 listingr = config.get("LISTINGR");
|
condv_key.add("L");
|
||||||
condv.put(CONDV_COD, listingr);
|
condv_key.add("");
|
||||||
int err = condv.read();
|
condv_key.add("");
|
||||||
if (err != NOERR) //se il listino indicato nell'ini non esiste..
|
condv_key.add("");
|
||||||
{
|
condv_key.add(_listingr);
|
||||||
condv.zero(); //..se lo crea!
|
|
||||||
condv.put(CONDV_TIPO, 'L');
|
const TRectype& listino_ingrosso = cache().get(LF_CONDV, condv_key);
|
||||||
condv.put(CONDV_COD, listingr);
|
|
||||||
condv.write();
|
//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.zero();
|
||||||
rcondv.put(RCONDV_TIPO, 'L');
|
_rcondv.put(RCONDV_TIPO, 'L');
|
||||||
rcondv.put(RCONDV_COD, listingr);
|
_rcondv.put(RCONDV_COD, _listingr);
|
||||||
rcondv.put(RCONDV_TIPORIGA, 'A'); //uguale anche x le righe listino (come sopra)
|
_rcondv.put(RCONDV_TIPORIGA, 'A'); //uguale anche x le righe listino (come sopra)
|
||||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||||
rcondv.put(RCONDV_PREZZO, prz_ingr);
|
_rcondv.put(RCONDV_UM, rec.get(7));
|
||||||
rcondv.write();
|
_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
|
real prz_vend = rec.get(15); //legge il prezzo listino vendite e fa lo stesso procedimento del caso precedente
|
||||||
prz_vend /=100;
|
prz_vend /=100;
|
||||||
if (prz_vend != ZERO)
|
if (prz_vend != ZERO)
|
||||||
{
|
{
|
||||||
TLocalisamfile condv(LF_CONDV);
|
//cache del listino vendita
|
||||||
condv.put(CONDV_TIPO, 'L');
|
TToken_string condv_key;
|
||||||
TConfig config("cat2dl.ini","PARAMS");
|
condv_key.add("L");
|
||||||
TString4 listvend = config.get("LISTVEND");
|
condv_key.add("");
|
||||||
condv.put(CONDV_COD, listvend);
|
condv_key.add("");
|
||||||
int err = condv.read();
|
condv_key.add("");
|
||||||
if (err != NOERR)
|
condv_key.add(_listven);
|
||||||
{
|
|
||||||
condv.zero();
|
const TRectype& listino_vendita = cache().get(LF_CONDV, condv_key);
|
||||||
condv.put(CONDV_TIPO, 'L');
|
|
||||||
condv.put(CONDV_COD, listvend);
|
if (listino_vendita.empty())
|
||||||
condv.write();
|
{
|
||||||
|
_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.zero();
|
||||||
rcondv.put(RCONDV_TIPO, 'L');
|
_rcondv.put(RCONDV_TIPO, 'L');
|
||||||
rcondv.put(RCONDV_COD, listvend);
|
_rcondv.put(RCONDV_COD, _listven);
|
||||||
rcondv.put(RCONDV_TIPORIGA, 'A');
|
_rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
||||||
rcondv.put(RCONDV_PREZZO, prz_vend);
|
_rcondv.put(RCONDV_UM, rec.get(7));
|
||||||
rcondv.write();
|
_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)
|
//scrive i valori delle offerte (prezzi e date)
|
||||||
void TCat2dl_file::write_offerte(const TRecord_text& rec)
|
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;
|
prz_ingr /=100;
|
||||||
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
||||||
{
|
{
|
||||||
TLocalisamfile condv(LF_CONDV);
|
const TDate dataini = rec.get(12);
|
||||||
condv.put(CONDV_TIPO, 'O');
|
const TDate datafine = rec.get(13);
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che l'offerta esiste andiamo in rcondv
|
calcola_offerta(dataini, datafine, _offingr);
|
||||||
rcondv.put(RCONDV_TIPO, 'O');
|
|
||||||
rcondv.put(RCONDV_COD, offeingr);
|
_rcondv.zero();
|
||||||
rcondv.put(RCONDV_TIPORIGA, 'A');
|
_rcondv.put(RCONDV_TIPO, 'O'); //adesso che sa che l'offerta esiste andiamo in rcondv
|
||||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
_rcondv.put(RCONDV_COD, _offingr);
|
||||||
rcondv.put(RCONDV_PREZZO, prz_ingr);
|
_rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||||
rcondv.write();
|
_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
|
real prz_vend = rec.get(18); //legge il prezzo offerta ingrosso
|
||||||
prz_vend /=100;
|
prz_vend /=100;
|
||||||
if (prz_vend != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
if (prz_vend != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
|
||||||
{
|
{
|
||||||
TLocalisamfile condv(LF_CONDV);
|
const TDate dataini = rec.get(16);
|
||||||
condv.put(CONDV_TIPO, 'O');
|
const TDate datafine = rec.get(17);
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che l'offerta esiste andiamo in rcondv
|
calcola_offerta(dataini, datafine, _offven);
|
||||||
rcondv.put(RCONDV_TIPO, 'O');
|
|
||||||
rcondv.put(RCONDV_COD, offevend);
|
_rcondv.zero(); //adesso che sa che l'offerta esiste andiamo in rcondv
|
||||||
rcondv.put(RCONDV_TIPORIGA, 'A');
|
_rcondv.put(RCONDV_TIPO, 'O');
|
||||||
rcondv.put(RCONDV_CODRIGA, rec.get(2));
|
_rcondv.put(RCONDV_COD, _offven);
|
||||||
rcondv.put(RCONDV_PREZZO, prz_vend);
|
_rcondv.put(RCONDV_TIPORIGA, 'A');
|
||||||
rcondv.write();
|
_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;
|
TMask* _msk;
|
||||||
TCat2dl_file* _trasfile;
|
TCat2dl_file* _trasfile;
|
||||||
TString _listingr, _listvend, _offeingr, _offevend;
|
TString _dlfilename, _dlsitepath, _listingr, _listvend, _offeingr, _offevend;
|
||||||
|
TString8 _user, _password, _codiva;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool create(void);
|
virtual bool create(void);
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
virtual bool destroy(void);
|
virtual bool destroy(void);
|
||||||
void transfer(void);
|
void transfer(void);
|
||||||
void inizializza_file(void);
|
|
||||||
static bool annulla_handler(TMask_field& f, KEY k);
|
static bool annulla_handler(TMask_field& f, KEY k);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -317,15 +451,26 @@ inline TCat2dl& app() { return (TCat2dl&) main_app();}
|
|||||||
// creazione dell'applicazione
|
// creazione dell'applicazione
|
||||||
bool TCat2dl::create()
|
bool TCat2dl::create()
|
||||||
{
|
{
|
||||||
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
|
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, LF_TAB, LF_TABCOM, 0);
|
||||||
_msk = new TMask("dl0800a");
|
|
||||||
_msk->set(F_FILENAME,DLFILENAME);
|
|
||||||
_trasfile = NULL;
|
|
||||||
TConfig config("cat2dl.ini","PARAMS");
|
TConfig config("cat2dl.ini","PARAMS");
|
||||||
|
_dlfilename = config.get("DLFILENAME");
|
||||||
|
_dlsitepath = config.get("DLSITEPATH");
|
||||||
_listingr = config.get("LISTINGR");
|
_listingr = config.get("LISTINGR");
|
||||||
_listvend = config.get("LISTVEND");
|
_listvend = config.get("LISTVEND");
|
||||||
_offeingr = config.get("OFFEINGR");
|
_offeingr = config.get("OFFEINGR");
|
||||||
_offevend = config.get("OFFEVEND");
|
_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();
|
return TSkeleton_application::create();
|
||||||
}
|
}
|
||||||
@ -347,56 +492,101 @@ void TCat2dl::main_loop()
|
|||||||
{
|
{
|
||||||
key = _msk->run();
|
key = _msk->run();
|
||||||
if (key == K_ENTER)
|
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();
|
transfer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// trasferimento dati da file su archivi
|
// trasferimento dati da file su archivi
|
||||||
void TCat2dl::transfer()
|
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...");
|
TProgind pi(dimension,"Acquisizione in corso...");
|
||||||
|
|
||||||
TRelation rel(LF_ANAMAG);
|
TRelation rel(LF_ANAMAG);
|
||||||
TRectype& record = rel.curr(); //record corrente della relazione
|
TRectype& record = rel.curr(); //record corrente della relazione
|
||||||
|
|
||||||
TString str; // Stringa jolly di lavoro
|
TString str; // Stringa jolly di lavoro
|
||||||
TRecord_text curr;
|
TRecord_text curr;
|
||||||
while (_trasfile->read(curr) == NOERR)
|
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());
|
const clock_t read_time = clock();
|
||||||
|
if (_trasfile->read(curr) != NOERR)
|
||||||
// read del file dell'ANAMAG
|
break;
|
||||||
str = curr.get(2); //legge il codart
|
const clock_t write_time = clock();
|
||||||
rel.curr().put(ANAMAG_CODART, str);
|
|
||||||
int err = rel.read();
|
processed_rec ++;
|
||||||
|
if (processed_rec%100 == 0)
|
||||||
if (err != NOERR)
|
{
|
||||||
{
|
unsigned long time = (clock()-start_time);
|
||||||
rel.curr().zero();
|
unsigned long rs = processed_rec*1000/time;
|
||||||
rel.curr().put(ANAMAG_CODART, str);
|
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
|
_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();
|
_trasfile->close();
|
||||||
message_box("Operazione terminata");
|
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
|
// handler per gestire la conferma dell'annullamento dei dati inseriti
|
||||||
// nella maschera
|
// nella maschera
|
||||||
bool TCat2dl::annulla_handler(TMask_field& f, KEY k)
|
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
|
// gestione dei messaggi estesi nei campi
|
||||||
void TCat2dl_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
|
void TCat2dl_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
|
||||||
{
|
{
|
||||||
const TString code(s.get(0));
|
const TString16 code = s.get(0);
|
||||||
TString valore;
|
|
||||||
if (code == "_UPPERCASE")
|
if (code == "_UPPERCASE")
|
||||||
{
|
{
|
||||||
valore.upper();
|
str.upper();
|
||||||
}
|
}
|
||||||
else NFCHECK("Macro non definita: %s", (const char *)code);
|
else
|
||||||
str = valore;
|
NFCHECK("Macro non definita: %s", (const char *)code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dl0800(int argc, char* argv[])
|
int dl0800(int argc, char* argv[])
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
// importazione catalogo
|
// importazione catalogo
|
||||||
// definizione campi per maschera di selezione
|
// 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"
|
#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
|
BEGIN
|
||||||
PROMPT -12 -11 ""
|
PROMPT 1 1 "@bSelezioni per l'importazione/aggiornamento"
|
||||||
END
|
END
|
||||||
|
|
||||||
BUTTON DLG_QUIT 9 2
|
RADIOBUTTON F_SELECT 1 18
|
||||||
BEGIN
|
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
|
END
|
||||||
|
|
||||||
ENDPAGE
|
STRING F_FILENAME 80 50
|
||||||
|
|
||||||
PAGE "Importazione catalogo" -1 -1 78 20
|
|
||||||
|
|
||||||
GROUPBOX DLG_NULL 77 9
|
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 1 "Selezioni per l'importazione"
|
PROMPT 20 3 ""
|
||||||
END
|
|
||||||
|
|
||||||
STRING F_FILENAME 52
|
|
||||||
BEGIN
|
|
||||||
PROMPT 2 2 "Nome file "
|
|
||||||
CHECKTYPE REQUIRED
|
|
||||||
VALIDATE FILENAME_FUNC
|
VALIDATE FILENAME_FUNC
|
||||||
FLAGS "A"
|
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"
|
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
|
END
|
||||||
|
|
||||||
ENDPAGE
|
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