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:
luca 2003-04-22 09:13:51 +00:00
parent 41b36659a8
commit f6b085b355
34 changed files with 3128 additions and 267 deletions

1
dl/DL0.PDB Executable file

@ -0,0 +1 @@
Microsoft C/C++ program database 1.00

BIN
dl/DL0700.OBJ Executable file

Binary file not shown.

BIN
dl/DLINST.OBJ Executable file

Binary file not shown.

@ -1,8 +1,11 @@
[PARAMS]
CODIVASTD =
DLFILENAME =
DLSITEPATH =
LISTINGR = LI1
LISTVEND = LI2
OFFEINGR = OF1
OFFEVEND = OF2
OFFEINGR = I00
OFFEVEND = V00
[MAIN]
DECSEP =
@ -75,7 +78,7 @@ LENGTH(2) = 15
NAME(3) = CTTITO
TYPE(3) = STRINGA
FIELD(3) = 47->USER1
FIELD(3) = 47->DESCR
POSITION(3) = 29
LENGTH(3) = 40
@ -120,42 +123,42 @@ FIELD(10) = 47->USER6
POSITION(10) = 141
LENGTH(10) = 8
NAME(11) = CTPRIE //listino ingrosso prezzo
NAME(11) = CTPRIE //listino ingrosso prezzo
TYPE(11) = EURO
POSITION(11) = 158
LENGTH(11) = 9
NAME(12) = CTDIPI //offerta ingrosso dataini
NAME(12) = CTDIPI //offerta ingrosso dataini
TYPE(12) = DATA
POSITION(12) = 167
LENGTH(12) = 8
NAME(13) = CTDFPI //offerta ingrosso datafin
NAME(13) = CTDFPI //offerta ingrosso datafin
TYPE(13) = DATA
POSITION(13) = 175
LENGTH(13) = 8
NAME(14) = CTCAPE //offerta ingrosso prezzo
NAME(14) = CTCAPE //offerta ingrosso prezzo
TYPE(14) = EURO
POSITION(14) = 192
LENGTH(14) = 9
NAME(15) = CTPRVU //listino pubblico prezzo
NAME(15) = CTPRVU //listino pubblico prezzo
TYPE(15) = EURO
POSITION(15) = 210
LENGTH(15) = 9
NAME(16) = CTDIVE //campagna vendita dataini
NAME(16) = CTDIVE //campagna vendita dataini
TYPE(16) = DATA
POSITION(16) = 219
LENGTH(16) = 8
NAME(17) = CTDFVE //campagna vendita datafin
NAME(17) = CTDFVE //campagna vendita datafin
TYPE(17) = DATA
POSITION(17) = 227
LENGTH(17) = 8
NAME(18) = CTCAVU //campagna vendita prezzo
NAME(18) = CTCAVU //campagna vendita prezzo
TYPE(18) = EURO
POSITION(18) = 244
LENGTH(18) = 9

@ -14,22 +14,16 @@ int main(int argc,char** argv)
switch (r)
{
/* case 0:
rt = dl0100(argc,argv) ; break;
case 1:
rt = dl0200(argc,argv) ; break;
case 2:
rt = dl0300(argc,argv) ; break;
case 3:
rt = dl0400(argc,argv) ; break;
case 4:
rt = dl0500(argc,argv) ; break;
rt = dl0500(argc,argv) ; break; //ricerca avanzata
case 5:
rt = dl0600(argc,argv) ; break;
rt = dl0600(argc,argv) ; break; //interrogazione magazzino
case 6:
rt = dl0700(argc,argv) ; break; */
rt = dl0700(argc,argv) ; break; //top ten
case 7:
rt = dl0800(argc,argv) ; break;
rt = dl0800(argc,argv) ; break; //acquisizione dati da file testo formattato
case 8:
rt = dl0900(argc,argv) ; break; //invio ordini
default:
error_box(usage, argv[0]) ; break;
}

@ -4,11 +4,12 @@
/*int dl0100(int argc, char* argv[]);
int dl0200(int argc, char* argv[]);
int dl0300(int argc, char* argv[]);
int dl0400(int argc, char* argv[]);
int dl0400(int argc, char* argv[]); */
int dl0500(int argc, char* argv[]);
int dl0600(int argc, char* argv[]);
int dl0700(int argc, char* argv[]);*/
int dl0700(int argc, char* argv[]);
int dl0800(int argc, char* argv[]);
int dl0900(int argc, char* argv[]);
#endif // __DL0_H

BIN
dl/dl00.bmp Executable file

Binary file not shown.

After

(image error) Size: 117 KiB

@ -1,35 +1,110 @@
#include <applicat.h>
#include <filetext.h>
#include <automask.h>
#include <execp.h>
#include <form.h>
#include <mask.h>
#include <relation.h>
#include <tabutil.h>
#include <printer.h>
#include <progind.h>
#include <recarray.h>
#include <utility.h>
#include <utility.h>
#include <doc.h>
#include <rdoc.h>
#include "..\mg\umart.h"
#include "..\mg\anamag.h"
#include "..\ve\condv.h"
#include "..\ve\rcondv.h"
#include "dl0.h"
#include "dl0500.h"
#include "dl0500a.h"
#include "dl0500b.h"
//-----FORM--------------------------------------------------------------------------------------//
class TRicerca_form : public TForm
{
public:
TRicerca_form();
virtual ~TRicerca_form();
};
TRicerca_form::TRicerca_form() :TForm ("dl0500a")
{
}
TRicerca_form::~TRicerca_form()
{
}
//-----AUTOMASK---------------------------------------------------------------------------------//
class TRicerca_mask : public TAutomask
{
TRelation * _rel;
TCursor * _cur;
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TRicerca_mask();
virtual ~TRicerca_mask(){};
};
TRicerca_mask::TRicerca_mask() :TAutomask ("dl0500a")
{
}
bool TRicerca_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_P_BARCODE:
case F_P_GIAC:
case F_P_TITOLO:
case F_P_ARTISTA:
case F_P_COMPOSITORE:
case F_P_PREZZO:
case F_P_GENERE:
case F_P_TIPOSUPPORTO:
if (e == fe_close)
{
for (int i = 7; i >= 0; i--) //attenzione! e' necessario che gli ID dei bools siano contigui
{
if (get_bool(F_P_BARCODE+i))
break;
}
if (i < 0)
return error_box("Selezionare almeno un campo per la stampa");
}
default:
break;
}
return TRUE;
}
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
class TRicerca: public TSkeleton_application
{
TMask* _msk;
TRicerca_file* _trasfile;
TString _listingr, _listvend, _offeingr, _offevend;
TRicerca_mask * _mask;
static TMask * _ordmask;
bool _barcode, _giac, _titolo, _artista, _compositore, _prezzo, _genere, _tiposupp;
protected:
virtual bool create(void);
virtual void main_loop();
virtual bool destroy(void);
static bool annulla_handler(TMask_field& f, KEY k);
virtual void main_loop();
static void process_link(int id, const char * lnk);
static void genera_ordine();
public:
const TMask& msk() const { return *_msk; }
void add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const;
void add_meta_filter(TString& filtro, const char * field, short id) const;
void add_range_filter(TString& filtro, const char * field, short fid, short tid = -1) const;
TRicerca() {}
virtual ~TRicerca() {}
};
@ -37,48 +112,305 @@ public:
// restituisce un riferimento all' applicazione
inline TRicerca& app() { return (TRicerca&) main_app();}
//la maschera dl0500b, essendo statica, va dichiarata anche fuori dalla classe
TMask * TRicerca::_ordmask = NULL;
// creazione dell'applicazione
bool TRicerca::create()
{
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
_msk = new TMask("dl0500a");
_msk->set(F_FILENAME,DLFILENAME);
_trasfile = NULL;
open_files(LF_ANAMAG, LF_UMART, LF_MAG, LF_DOC, LF_RCONDV, 0);
_mask = new TRicerca_mask;
TConfig config("discolat.ini","ADVRES");
_barcode = config.get_bool("BARCODE");
_giac = config.get_bool("GIAC");
_titolo = config.get_bool("TITOLO");
_artista = config.get_bool("ARTISTA");
_compositore = config.get_bool("COMPOSITORE");
_prezzo = config.get_bool("PREZZO");
_genere = config.get_bool("GENERE");
_tiposupp = config.get_bool("TIPOSUPP");
_mask->set(F_P_BARCODE, _barcode);
_mask->set(F_P_GIAC, _giac);
_mask->set(F_P_TITOLO, _titolo);
_mask->set(F_P_ARTISTA, _artista);
_mask->set(F_P_COMPOSITORE, _compositore);
_mask->set(F_P_PREZZO, _prezzo);
_mask->set(F_P_GENERE, _genere);
_mask->set(F_P_TIPOSUPPORTO, _tiposupp);
const int leadtime = config.get_int("LEADTIME");
_ordmask = new TMask("dl0500b"); //creazione della maschera intermedia per la generazione righe ordini
config.set_paragraph("SENDORD");
_ordmask->set(F_CODCF, config.get("CODDL"));
_ordmask->set(F_CODORD, config.get("CODORD"));
TDate datacons(TODAY);
datacons += leadtime;
_ordmask->set(F_DATACONS, datacons);
return TSkeleton_application::create();
}
// distruzione dell'applicazione
bool TRicerca::destroy()
{
delete _msk;
{
TConfig config("discolat.ini", "SENDORD");
config.set("CODDL", _ordmask->get(F_CODCF));
config.set("CODORD", _ordmask->get(F_CODORD));
delete _ordmask;
delete _mask;
return TSkeleton_application::destroy();
}
// carica la maschera
void TRicerca::main_loop()
{
// Preimposta gli eventuali valori specificati sulla riga di comando
//error_box("Attenzione: manca la configurazione del trasferimento!");
KEY key = K_ENTER;
while (key != K_QUIT)
//aggiunge effettivamente una espressione ad un filtro
void TRicerca::add_expr_filter(TString& filtro, const char * field, short id, const char * cmp) const
{
TMask_field& fld = _mask->field(id); //prende il campo dalla maschera
if (!fld.empty()) //..se non e' vuoto
{
key = _msk->run();
if (key == K_ENTER)
transfer();
}
if (filtro.not_empty()) //distinzione tra filtro vuoto e filtro esistente
filtro << "&&";
if (fld.class_id() == CLASS_DATE_FIELD) //se e' un campo data deve ANSIzzare il contenuto del campo per aggiungerlo al filtro
{
const TDate data = fld.get();
TString8 val = data.string(ANSI);
filtro << "(ANSI(" << field << ")" << cmp << val << ")";
}
else
filtro << "(" << field << cmp << "\"" << fld.get() << "\")"; //aggiunge il contenuto del campo al filtro
}
}
// handler per gestire la conferma dell'annullamento dei dati inseriti
// nella maschera
bool TRicerca::annulla_handler(TMask_field& f, KEY k)
//aggiunge ad un filtro una espressione con l'*
void TRicerca::add_meta_filter(TString& filtro, const char * field, short id) const
{
const TString& value = _mask->get(id);
const char* cmp = "==";
if (value.find('*') >= 0 || value.find('?') >= 0)
cmp = "?=";
add_expr_filter(filtro, field, id, cmp);
}
//aggiunge ad un filtro un range di valori presi due campi o da uno (se coincidenti)
void TRicerca::add_range_filter(TString& filtro, const char * field, short fid, short tid) const
{
TMask &m = f.mask();
if (k == K_SPACE)
if (tid > fid)
{
if (yesno_box("Vuoi veramente annullare i dati inseriti"))
m.reset();
add_expr_filter(filtro, field, fid, ">=");
add_expr_filter(filtro, field, tid, "<=");
}
else
add_expr_filter(filtro, field, fid, "==");
}
//metodo ascetico per generare le righe di uno sheet dalla setlinkhandler (vedi la chiamata + sotto)
void TRicerca::process_link(int id, const char * lnk)
{
TSheet_field& sheet = _ordmask->sfield(F_RIGHE);
TToken_string& row = sheet.row(-1);
row = "1"; //mette innanzitutto la qta di default (1)
row.add(lnk); //poi ci aggiunge il codart
sheet.check_row(sheet.items()-1);
KEY k = _ordmask->run();
switch(k)
{
case K_ESC:
sheet.destroy(sheet.items()-1);
break;
case K_ENTER:
break;
default:
genera_ordine(); //chiama il metodo x la generazione dell'ordine
break;
}
}
// metodo x la generazione dell'ordine
void TRicerca::genera_ordine()
{
TFilename iniord; //creazione di un file di configurazione temporaneo contenente i dati dell'ordine
iniord.temp("DL"); // il nome comincia con DL
TConfig ini(iniord,"Transaction"); //paragrafo Transaction del file iniord
ini.set("Action", "Insert");
const TDate datacons = _ordmask->get(F_DATACONS); //setta la data di consegna in base alla data di compilazione ordine
const TDate oggi(TODAY); //e al leadtime che legge nel file discolat.ini
const long leadtime = datacons - oggi;
if (leadtime > 0)
{
TConfig inidata("discolat.ini", "ADVRES");
inidata.set("LEADTIME", leadtime);
}
//paragrafo testata documento ordine
TString16 para;
para.format("%d",LF_DOC);
ini.set_paragraph(para); //paragrafo della testata: scrive tutti i parametri utili nell'ini
ini.set(DOC_PROVV, "D");
ini.set(DOC_ANNO, oggi.year()); //anno di compilazione ordine
ini.set(DOC_CODNUM, _ordmask->get(F_CODORD)); //codice numerazione ordine
ini.set(DOC_TIPODOC, _ordmask->get(F_TIPODOC)); //tipo documento dell'ordine
ini.set(DOC_TIPOCF, "F");
ini.set(DOC_CODCF, _ordmask->get(F_CODCF)); //codice fornitore
ini.set(DOC_DATACONS, datacons); //data di consegna
TConfig inilist("cat2dl.ini", "PARAMS"); //codice del listino all'ingrosso
ini.set(DOC_CODLIST, inilist.get("LISTINGR"));
//l'ordine deve essere aggiunto come il successivo all'ultimo gia' presente nelle testate documento
TLocalisamfile doc(LF_DOC); //prepara i dati della chiave 1 a meno del campo NDOC
doc.put(DOC_PROVV, ini.get(DOC_PROVV));
doc.put(DOC_ANNO, ini.get(DOC_ANNO));
doc.put(DOC_CODNUM, ini.get(DOC_CODNUM));
const TRectype test(doc.curr()); //come record di confronto si prende quello corrente
doc.put(DOC_NDOC, "9999999");
/* long ndoc = 1; //metodo per autonumerare il documento (ultimo +1); tolto x' la DL setta a TRUE il flag di..
int err = doc.read(_isgreat); //..autonumerazione nelle vendite
if (err == NOERR)
err = doc.prev();
else
err = doc.last();
if (err == NOERR)
{
if (doc.curr().compare_key(test,1,1)==0) //confronta la chiave del record appena trovato con quella del
ndoc+=doc.get_long(DOC_NDOC); //record campione (test), a meno dell'ultimo campo NDOC
}
ini.set(DOC_NDOC, ndoc); */ //trovato il primo numero libero documento libero lo scrive nell'ini
//paragrafi delle righe dell'ordine
TSheet_field& sheet = _ordmask->sfield(F_RIGHE);
TString80 codart;
for (int i = 0; i < sheet.items(); i++)
{
para.format("%d,%d",LF_RIGHEDOC,i+1);
ini.set_paragraph(para);
TToken_string& row = sheet.row(i);
real qta = row.get(0); //la qta sta nel primo campo dello sheet...
codart = row.get(1); //..il codart nella seconda
ini.set(RDOC_TIPORIGA, "01"); //tiporigamerce
ini.set(RDOC_CODART, codart);
// ini.set(RDOC_CODARTMAG, codart); inutile
ini.set(RDOC_QTA, qta.string());
}
ini.set_paragraph("Transaction"); //forza la scrittura dell'ultimo paragrafo!
//prepara la stringa di esecuzione del programma degli ordini e lo lancia
TString cmd;
cmd << "ve0 -0 /i" << iniord;
TExternal_app app(cmd);
app.run();
sheet.destroy(); //accoppa lo sheet da cui e' nato l'ordine
::remove(iniord); //sopprime il file temporaneo
}
static TString16 fast_field;
static TString80 fast_value;
static bool meta_type;
static bool fast_filter(const TRelation* rel)
{
const TRectype& rec = rel->curr();
if (meta_type)
return rec.get(fast_field).match(fast_value);
return rec.get(fast_field) == fast_value;
}
void TRicerca::main_loop()
{
while (_mask->run() == K_ENTER)
{
//prende dalla maschera i booleani dei campi da stampare...
_barcode = _mask->get_bool(F_P_BARCODE);
_giac = _mask->get_bool(F_P_GIAC);
_titolo = _mask->get_bool(F_P_TITOLO);
_artista = _mask->get_bool(F_P_ARTISTA);
_compositore = _mask->get_bool(F_P_COMPOSITORE);
_prezzo = _mask->get_bool(F_P_PREZZO);
_genere = _mask->get_bool(F_P_GENERE);
_tiposupp = _mask->get_bool(F_P_TIPOSUPPORTO);
//..e li scrive nel file ini
TConfig config("discolat.ini","ADVRES");
config.set("BARCODE", _barcode);
config.set("GIAC", _giac);
config.set("TITOLO", _titolo);
config.set("ARTISTA", _artista);
config.set("COMPOSITORE", _compositore);
config.set("PREZZO", _prezzo);
config.set("GENERE", _genere);
config.set("TIPOSUPP", _tiposupp);
TString16 nomecampo;
//laboriosissima costruzione del filtro
TString filtro;
add_range_filter(filtro, ANAMAG_CODART, F_DABARCODE, F_ABARCODE);
add_meta_filter(filtro, ANAMAG_DESCR, F_TITOLO);
add_meta_filter(filtro, ANAMAG_USER2, F_ARTISTA);
add_meta_filter(filtro, ANAMAG_USER3, F_COMPOSITORE);
add_meta_filter(filtro, ANAMAG_USER4, F_ETICHETTA);
add_range_filter(filtro, ANAMAG_GRMERC, F_GENEREMUSICALE);
add_range_filter(filtro, ANAMAG_USER5, F_DATAE_INI, F_DATAE_FIN);
add_range_filter(filtro, ANAMAG_USER6, F_DATAV_INI, F_DATAV_FIN);
//caso sfigato: c'e' il tipo supporto tra i parametri di filtro!
nomecampo.format("%d->%s", LF_UMART, "UM");
add_range_filter(filtro, nomecampo, F_TIPOSUPPORTO);
// setta i links presenti nel form (sono gli elementi scritti in blu(b) su bianco(w))
// procedimento standard in questi casi
TArray& arr = printer().links();
if (arr.items() == 0)
arr.add(new TToken_string("Ordina|b|w"));
printer().setlinkhandler(process_link);
//dopo il filtrone tocca al cursore x scandire i records
TRicerca_form form;
//ottimizzazione tempi di ricerca: caso di filtro semplice (senza AND, con ?= o ==)
if (filtro.find("&&") < 0 && filtro.find('=') > 0)
{
filtro.strip("()");
meta_type = filtro.find("?=") > 0;
const int pos = filtro.rfind('=');
fast_value = filtro.mid(pos+1);
fast_value.strip("\"");
fast_field = filtro.left(pos-1);
form.cursor()->set_filterfunction(fast_filter, !_mask->field(F_TIPOSUPPORTO).empty());
}
else
form.cursor()->setfilter(filtro, !_mask->field(F_TIPOSUPPORTO).empty());
//setta il form columnwise
form.find_field('B', odd_page, FF_B_CODART).show(_barcode);
form.find_field('B', odd_page, FF_B_GIAC).show(_giac);
form.find_field('B', odd_page, FF_B_TITOLO).show(_titolo);
form.find_field('B', odd_page, FF_B_ARTISTA).show(_artista);
form.find_field('B', odd_page, FF_B_COMPOSITORE).show(_compositore);
form.find_field('B', odd_page, FF_B_PREZZO).show(_prezzo);
form.find_field('B', odd_page, FF_B_GENERE).show(_genere);
form.find_field('B', odd_page, FF_B_SUPPORTO).show(_tiposupp);
//procedimento mistico di costruzione del form columnwise
const int hh = 5; //altezza header = 5 righe
int rows[4];
rows[0] = hh - 2;
rows[1] = hh;
rows[2] = printer().formlen();
rows[3] = 0;
form.genera_intestazioni(odd_page, hh - 1);
form.genera_fincatura(odd_page, hh - 2, rows[2], rows);
form.print();
}
return TRUE;
}
int dl0500(int argc, char* argv[])

13
dl/dl0500.h Executable file

@ -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

@ -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

@ -1,7 +1,7 @@
// ricerca avanzata
// definizione campi per maschera di selezione dl0500a
#define F_BARCODE 101
#define F_DABARCODE 101
#define F_TIPOSUPPORTO 102
#define F_TITOLO 103
#define F_ARTISTA 104
@ -12,5 +12,14 @@
#define F_DATAE_FIN 109
#define F_DATAV_INI 110
#define F_DATAV_FIN 111
#define F_D_TIPOSUPPORTO 112
#define F_ABARCODE 112
#define F_P_BARCODE 115
#define F_P_GIAC 116
#define F_P_TITOLO 117
#define F_P_ARTISTA 118
#define F_P_COMPOSITORE 119
#define F_P_PREZZO 120
#define F_P_GENERE 121
#define F_P_TIPOSUPPORTO 122

@ -1,74 +1,177 @@
#include "dl0500a.h"
TOOLBAR "" 0 20 0 2
PAGE "Ricerca avanzata" -1 -1 70 19
BUTTON DLG_OK 9 2
GROUPBOX DLG_NULL 68 11
BEGIN
PROMPT -12 -11 ""
PROMPT 1 1 "@bParametri di selezione"
END
BUTTON DLG_QUIT 9 2
STRING F_DABARCODE 20
BEGIN
PROMPT -22 -11 ""
PROMPT 2 2 "Barcode da: "
FLAGS "U"
USE LF_ANAMAG KEY 1
INPUT CODART F_DABARCODE
DISPLAY "Codice a barre@20" CODART
DISPLAY "Titolo@50" DESCR
OUTPUT F_DABARCODE CODART
END
ENDPAGE
PAGE "Ricerca avanzata" -1 -1 78 20
STRING F_BARCODE 20
STRING F_ABARCODE 20
BEGIN
PROMPT 2 1 "Barcode "
PROMPT 43 2 "a: "
FLAGS "U"
USE LF_ANAMAG KEY 1
INPUT CODART F_ABARCODE
DISPLAY "Codice a barre@20" CODART
DISPLAY "Titolo@50" DESCR
OUTPUT F_ABARCODE CODART
END
STRING F_TIPOSUPPORTO 10
BEGIN
PROMPT 2 2 "Tipo supporto "
FLAGS "U"
PROMPT 2 3 "Tipo supporto "
USE %UMS
INPUT CODTAB F_TIPOSUPPORTO
DISPLAY "Tipo supporto" CODTAB
DISPLAY "Descrizione@60" S0
OUTPUT F_TIPOSUPPORTO CODTAB
CHECKTYPE NORMAL
END
STRING F_TITOLO 40
STRING F_TITOLO 50 45
BEGIN
PROMPT 2 3 "Titolo "
PROMPT 2 4 "Titolo "
FLAGS "U"
USE LF_ANAMAG KEY 2
INPUT DESCR F_TITOLO
DISPLAY "Titolo@50" DESCR
DISPLAY "Codice a barre@20" CODART
COPY OUTPUT F_DABARCODE
END
STRING F_ARTISTA 20
BEGIN
PROMPT 2 4 "Artista "
PROMPT 2 5 "Artista "
FLAGS "U"
COPY USE F_DABARCODE
INPUT USER2 F_ARTISTA
DISPLAY "Artista@30" USER2
OUTPUT F_ARTISTA USER2
END
STRING F_COMPOSITORE 20
BEGIN
PROMPT 2 5 "Compositore "
PROMPT 2 6 "Compositore "
FLAGS "U"
COPY USE F_DABARCODE
INPUT USER3 F_COMPOSITORE
DISPLAY "Compositore@30" USER3
OUTPUT F_COMPOSITORE USER3
END
STRING F_ETICHETTA 20
BEGIN
PROMPT 2 6 "Etichetta "
PROMPT 2 7 "Etichetta "
FLAGS "U"
COPY USE F_DABARCODE
INPUT USER4 F_ETICHETTA
DISPLAY "Etichetta@30" USER4
OUTPUT F_ETICHETTA USER4
END
STRING F_GENEREMUSICALE
STRING F_GENEREMUSICALE 3
BEGIN
PROMPT 2 7 "Genere musicale "
PROMPT 2 8 "Genere musicale "
FLAGS "U"
USE GMC
INPUT CODTAB F_GENEREMUSICALE
DISPLAY "Genere" CODTAB
DISPLAY "Descrizione@60" S0
OUTPUT F_GENEREMUSICALE CODTAB
CHECKTYPE NORMAL
END
DATE F_DATAE_INI
BEGIN
PROMPT 2 8 "Data emissione: da "
PROMPT 2 9 "Data emissione: da "
END
DATE F_DATAE_FIN
BEGIN
PROMPT 35 8 "a "
PROMPT 35 9 "a "
VALIDATE DATE_CMP_FUNC >= F_DATAE_INI
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
END
DATE F_DATAV_INI
BEGIN
PROMPT 2 9 "Data variazione da "
PROMPT 2 10 "Data variazione da "
END
DATE F_DATAV_FIN
BEGIN
PROMPT 35 9 "a "
PROMPT 35 10 "a "
VALIDATE DATE_CMP_FUNC >= F_DATAV_INI
WARNING "Specificare una 'Data fine' non inferiore alla 'Data inizio'"
END
GROUPBOX DLG_NULL 68 6
BEGIN
PROMPT 1 12 "@bCampi da stampare"
END
BOOL F_P_BARCODE
BEGIN
PROMPT 2 13 "Codice articolo"
FLAGS "D"
END
BOOL F_P_GIAC
BEGIN
PROMPT 25 13 "Giacenza"
END
BOOL F_P_TITOLO
BEGIN
PROMPT 2 14 "Titolo"
END
BOOL F_P_ARTISTA
BEGIN
PROMPT 25 14 "Artista"
END
BOOL F_P_COMPOSITORE
BEGIN
PROMPT 2 15 "Compositore"
END
BOOL F_P_PREZZO
BEGIN
PROMPT 25 15 "Prezzo"
END
BOOL F_P_GENERE
BEGIN
PROMPT 2 16 "Genere"
END
BOOL F_P_TIPOSUPPORTO
BEGIN
PROMPT 25 16 "Tipo supporto"
END
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE

14
dl/dl0500b.h Executable file

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -1,31 +1,40 @@
#include <applicat.h>
#include <filetext.h>
#include <form.h>
#include <isamrpc.h>
#include <mask.h>
#include <relation.h>
#include <tabutil.h>
#include <printer.h>
#include <progind.h>
#include <recarray.h>
#include <utility.h>
#include "..\cg\cglib01.h"
#include "..\mg\umart.h"
#include "..\mg\anamag.h"
#include "..\ve\condv.h"
#include "..\ve\rcondv.h"
#include "dl0.h"
#include "dl0800a.h"
#define DLFILENAME "XCATT00F"
#include "dlutils.h"
////////////////////////////////////////////////////////
// Classe TCat2dl_file customizzata dalla TFile_text //
////////////////////////////////////////////////////////
class TCat2dl_file: public TFile_text
{
{
TArray _lista_offerte;
TAssoc_array _lista_codici_iva;
TString _listingr,_listven,_offingr,_offven,_codiva;
TLocalisamfile _condv, _rcondv, _umart;
protected:
virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
void calcola_offerta(const TDate& dataini, const TDate& datafine, TString& codoff);
void add_table_entry(const char * table, const char * entry);
TCodiceIVA& codice_iva(const TString& codice); //viene usata dalla scorpora qui sotto
real scorpora(const real& lordo, const TRecord_text& rec);
public:
virtual int autosave(TRelation& rel, const TRecord_text& rec);
@ -33,15 +42,25 @@ public:
void write_supporto(const TRecord_text& rec);
void write_listini(const TRecord_text& rec);
void write_offerte(const TRecord_text& rec);
void set_config(const char * listingr,const char * listven, const char * offingr, const char * offven, const char * codiva);
TCat2dl_file(const TString& file_name, const TString& config_name);
virtual ~TCat2dl_file() { }
};
TCat2dl_file::TCat2dl_file(const TString& file_name, const TString& config_name)
: TFile_text(file_name, config_name)
: TFile_text(file_name, config_name), _condv(LF_CONDV), _rcondv(LF_RCONDV), _umart(LF_UMART)
{
}
void TCat2dl_file::set_config(const char * listingr,const char * listven, const char * offingr, const char * offven, const char * codiva)
{
_listingr = listingr;
_listven = listven;
_offingr = offingr;
_offven = offven;
_codiva = codiva;
}
int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
{
const TString& type = rec.type(); //prendo il tracciato record del tipo del record_text
@ -53,11 +72,11 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
for (int i = 0; i < items; i++)
{
const TTracciato_campo& tc = tr.get(i);
TFieldref field(tc.field());
if (field.name().not_empty())
if (tc.field().name().not_empty())
{
if (field.file()==0)
field.set_file(rel.lfile().num());
const TFieldref& field = tc.field();
// if (field.file()==0)
// field.set_file(rel.lfile().num());
valore = rec.row(i);
// formatta il campo del file di testo secondo le specifiche del campo su file isam
preformat_field(field,valore,rel,tr.type());
@ -98,7 +117,12 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
valore = format_field(tc, rel.lfile().num(), valore);//formatta il campo secondo le specifiche del record
break;
}
if (vuoto && field.name()=="CODIVA") //se il codice iva e' vuoto...
{
valore = _codiva;
vuoto = FALSE;
}
if (!vuoto && rel.exist(field.file()))
field.write(valore, rel);//faccio una write sulla relazione del fieldref
}
@ -115,52 +139,111 @@ int TCat2dl_file::autosave(TRelation& rel, const TRecord_text& rec)
}
bool TCat2dl_file::pre_writerel(TRelation& rel,const TRecord_text& rec)
{
// 1) sistema i tipi di supporto
{
// 1) sistema i tipi di supporto e genere
write_supporto(rec);
// 2) legge e scrive i dati dei listini: se il listino non esiste lo crea
write_listini(rec);
// 3) legge e scrive i dati delle offerte: se l'offerta non esiste la crea
write_offerte(rec);
return TRUE;
}
void TCat2dl_file::add_table_entry(const char * table, const char * entry)
{
if (entry && *entry > ' ')
{
const TRectype& rec = cache().get(table, entry);
if (rec.empty())
{
TTable tab(table);
tab.put("CODTAB", entry);
tab.put("S0", entry);
tab.write();
}
}
}
//scrive il supporto dell'articolo nel campo UM del file umart (unita' di misura)
void TCat2dl_file::write_supporto(const TRecord_text& rec)
{
const TString& codart = rec.get(2);
const TString& um = rec.get(7);
if (!um.blank()) //il casino lo fa solo se ha un codice supporto non nullo
{
TLocalisamfile umart(LF_UMART); //prende il file delle unita' di misura...
umart.put(UMART_CODART, codart);
umart.put(UMART_UM, um);
umart.setkey(2); //..con chiave 2...
TString80 codart = rec.get(2); //Sistemiamo 'sto cavolo di supporto!
codart.trim();
int err = umart.read(); //..e lo legge
_umart.zero(); //prende il file delle unita' di misura...
_umart.put(UMART_CODART, codart);
_umart.put(UMART_UM, um);
_umart.setkey(2); //..con chiave 2...
const int err = _umart.read(); //..e lo legge
if (err != NOERR) //Se non trova l'unita' di misura tra quelle gia' presenti...
{
umart.setkey(1);
umart.put(UMART_CODART, codart);
umart.put(UMART_NRIGA, 999);
err = umart.read(_isgreat);
err = umart.prev();
_umart.setkey(1);
_umart.put(UMART_CODART, codart);
_umart.put(UMART_NRIGA, 999);
_umart.read(_isgreat);
const int uerr = _umart.prev();
int nriga = 1;
if (err == NOERR && umart.get(UMART_CODART) == codart)
nriga = umart.get_int(UMART_NRIGA) + 1;
if (uerr == NOERR && _umart.get(UMART_CODART) == codart)
nriga = _umart.get_int(UMART_NRIGA) + 1;
umart.zero(); //..la aggiunge come ultima unita' di misura.
umart.put(UMART_CODART, codart);
umart.put(UMART_NRIGA, nriga);
umart.put(UMART_UM, um);
umart.put(UMART_FC, 1);
umart.write();
_umart.zero(); //..la aggiunge come ultima unita' di misura.
_umart.put(UMART_CODART, codart);
_umart.put(UMART_NRIGA, nriga);
_umart.put(UMART_UM, um);
_umart.put(UMART_FC, 1);
}
}
real prz = rec.get(11); //legge il prezzo listino ingrosso e lo mette nel campo prezzo di UMART
prz/=100;
_umart.put(UMART_PREZZO, prz);
if (err == NOERR)
_umart.rewrite();
else
_umart.write();
add_table_entry("%UMS", um);
}
const TString& genere = rec.get(8); //Adesso tocca al genere! Va aggiornata la tabella di ditta GMC
if (!genere.blank())
{
add_table_entry("GMC", genere);
}
}
//metodo x accelerare la lettura: se il codice iva esiste gia' evita di rileggere la percentuale dalla tabella
TCodiceIVA& TCat2dl_file::codice_iva(const TString& codice)
{
TCodiceIVA* ci = (TCodiceIVA*)_lista_codici_iva.objptr(codice); //cerca nell'assoc_array dei codici iva se l'ha gia'letto
if (ci == NULL)
{
ci = new TCodiceIVA(codice);
_lista_codici_iva.add(codice, ci);
}
return *ci;
}
//metodo per lo scorporo iva
real TCat2dl_file::scorpora(const real& lordo, const TRecord_text& rec)
{
TString8 codice = rec.get(19);
if (codice.blank())
codice = _codiva;
const TCodiceIVA& pippo = codice_iva(codice); //utilizza la codice_iva
real valore = lordo;
pippo.scorpora(valore);
return valore;
}
//scrive i valori dei listini (prezzi e date)
@ -169,58 +252,129 @@ void TCat2dl_file::write_listini(const TRecord_text& rec)
real prz_ingr = rec.get(11); //legge il prezzo listino ingrosso
prz_ingr /=100;
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
{
TLocalisamfile condv(LF_CONDV);
condv.put(CONDV_TIPO, 'L');
TConfig config("cat2dl.ini","PARAMS");
TString4 listingr = config.get("LISTINGR");
condv.put(CONDV_COD, listingr);
int err = condv.read();
if (err != NOERR) //se il listino indicato nell'ini non esiste..
{
condv.zero(); //..se lo crea!
condv.put(CONDV_TIPO, 'L');
condv.put(CONDV_COD, listingr);
condv.write();
{
//cache del listino ingrosso
TToken_string condv_key;
condv_key.add("L");
condv_key.add("");
condv_key.add("");
condv_key.add("");
condv_key.add(_listingr);
const TRectype& listino_ingrosso = cache().get(LF_CONDV, condv_key);
//creazione di un nuovo listino ingrosso se non esiste
if (listino_ingrosso.empty()) //se il listino indicato nell'ini non esiste..
{
_condv.zero(); //..se lo crea!
_condv.put(CONDV_TIPO, 'L'); //listino
_condv.put(CONDV_COD, _listingr); //ingrosso
_condv.put(CONDV_DESCR, "LISTINO INGROSSO");
_condv.put(CONDV_SEQRIC, "A---"); //combinazione di AGR (vedi file che fai prima!)
_condv.put(CONDV_GESTUM, "X"); //abilita gestione unita' di misura
_condv.write();
}
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che il listino esiste andiamo in rcondv
rcondv.put(RCONDV_TIPO, 'L');
rcondv.put(RCONDV_COD, listingr);
rcondv.put(RCONDV_TIPORIGA, 'A'); //uguale anche x le righe listino (come sopra)
rcondv.put(RCONDV_CODRIGA, rec.get(2));
rcondv.put(RCONDV_PREZZO, prz_ingr);
rcondv.write();
_rcondv.zero();
_rcondv.put(RCONDV_TIPO, 'L');
_rcondv.put(RCONDV_COD, _listingr);
_rcondv.put(RCONDV_TIPORIGA, 'A'); //uguale anche x le righe listino (come sopra)
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
_rcondv.put(RCONDV_UM, rec.get(7));
_rcondv.put(RCONDV_PREZZO, prz_ingr);
int err = _rcondv.write();
if (err != NOERR)
_rcondv.rewrite();
}
real prz_vend = rec.get(15); //legge il prezzo listino vendite e fa lo stesso procedimento del caso precedente
prz_vend /=100;
if (prz_vend != ZERO)
{
TLocalisamfile condv(LF_CONDV);
condv.put(CONDV_TIPO, 'L');
TConfig config("cat2dl.ini","PARAMS");
TString4 listvend = config.get("LISTVEND");
condv.put(CONDV_COD, listvend);
int err = condv.read();
if (err != NOERR)
{
condv.zero();
condv.put(CONDV_TIPO, 'L');
condv.put(CONDV_COD, listvend);
condv.write();
//cache del listino vendita
TToken_string condv_key;
condv_key.add("L");
condv_key.add("");
condv_key.add("");
condv_key.add("");
condv_key.add(_listven);
const TRectype& listino_vendita = cache().get(LF_CONDV, condv_key);
if (listino_vendita.empty())
{
_condv.zero();
_condv.put(CONDV_TIPO, 'L');
_condv.put(CONDV_COD, _listven);
_condv.put(CONDV_DESCR, "LISTINO VENDITA");
_condv.put(CONDV_SEQRIC, "A---");
_condv.put(CONDV_GESTUM, "X");
_condv.write();
}
TLocalisamfile rcondv(LF_RCONDV);
rcondv.put(RCONDV_TIPO, 'L');
rcondv.put(RCONDV_COD, listvend);
rcondv.put(RCONDV_TIPORIGA, 'A');
rcondv.put(RCONDV_CODRIGA, rec.get(2));
rcondv.put(RCONDV_PREZZO, prz_vend);
rcondv.write();
_rcondv.zero();
_rcondv.put(RCONDV_TIPO, 'L');
_rcondv.put(RCONDV_COD, _listven);
_rcondv.put(RCONDV_TIPORIGA, 'A');
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
_rcondv.put(RCONDV_UM, rec.get(7));
_rcondv.put(RCONDV_PREZZO, scorpora(prz_vend, rec));
int err = _rcondv.write();
if (err != NOERR)
_rcondv.rewrite();
}
}
//metodo per determinare le campagne di offerta cui appartengono gli articoli importati
void TCat2dl_file::calcola_offerta(const TDate& dataini, const TDate& datafine, TString& codoff)
{
if (_lista_offerte.items() == 0)
{
for (int err = _condv.first(); err != NOERR; err = _condv.next())
{
if (_condv.get_char(CONDV_TIPO) == 'O')
_lista_offerte.add(_condv.curr());
}
}
int last_off = 0;
for (int i = _lista_offerte.last(); i>=0; i--)
{
const TRectype& condv = (const TRectype&) _lista_offerte[i];
const TString4 cod = condv.get(CONDV_COD);
if (cod[0] == codoff[0])
{
if (last_off == 0)
last_off = atoi(cod.mid(1));
if (dataini >= condv.get_date(CONDV_VALIN) && datafine <= condv.get_date(CONDV_VALFIN))
{
codoff = cod;
break;
}
}
}
if (i < 0 )
{
const char pref = codoff[0];
codoff.format("%c%02d", pref, last_off + 1);
_condv.zero();
_condv.put(CONDV_TIPO, 'O');
_condv.put(CONDV_COD, codoff);
TString descr = "CAMPAGNA ";
descr << codoff << " (dal " << dataini << " al " << datafine << ")";
_condv.put(CONDV_DESCR, descr);
_condv.put(CONDV_GESTUM, "X");
_condv.put(CONDV_VALIN, dataini);
_condv.put(CONDV_VALFIN, datafine);
_condv.write();
_lista_offerte.add(_condv.curr());
}
}
//scrive i valori delle offerte (prezzi e date)
void TCat2dl_file::write_offerte(const TRecord_text& rec)
{
@ -228,62 +382,42 @@ void TCat2dl_file::write_offerte(const TRecord_text& rec)
prz_ingr /=100;
if (prz_ingr != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
{
TLocalisamfile condv(LF_CONDV);
condv.put(CONDV_TIPO, 'O');
TConfig config("cat2dl.ini","PARAMS");
TString4 offeingr = config.get("OFFEINGR");
condv.put(CONDV_COD, offeingr);
int err = condv.read();
if (err != NOERR) //se l'offerta indicata nell'ini non esiste..
{
condv.zero(); //..se la crea!
condv.put(CONDV_TIPO, 'O');
condv.put(CONDV_COD, offeingr);
TDate dataini = rec.get(12);
TDate datafine = rec.get(13);
condv.put(CONDV_VALIN, dataini);
condv.put(CONDV_VALFIN, datafine);
condv.write();
}
const TDate dataini = rec.get(12);
const TDate datafine = rec.get(13);
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che l'offerta esiste andiamo in rcondv
rcondv.put(RCONDV_TIPO, 'O');
rcondv.put(RCONDV_COD, offeingr);
rcondv.put(RCONDV_TIPORIGA, 'A');
rcondv.put(RCONDV_CODRIGA, rec.get(2));
rcondv.put(RCONDV_PREZZO, prz_ingr);
rcondv.write();
calcola_offerta(dataini, datafine, _offingr);
_rcondv.zero();
_rcondv.put(RCONDV_TIPO, 'O'); //adesso che sa che l'offerta esiste andiamo in rcondv
_rcondv.put(RCONDV_COD, _offingr);
_rcondv.put(RCONDV_TIPORIGA, 'A');
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
_rcondv.put(RCONDV_UM, rec.get(7));
_rcondv.put(RCONDV_PREZZO, prz_ingr);
int err = _rcondv.write();
if (err != NOERR)
_rcondv.rewrite();
}
real prz_vend = rec.get(18); //legge il prezzo offerta ingrosso
prz_vend /=100;
if (prz_vend != ZERO) //tutto il casino lo fa solo se il prezzo non e' nullo
{
TLocalisamfile condv(LF_CONDV);
condv.put(CONDV_TIPO, 'O');
TConfig config("cat2dl.ini","PARAMS");
TString4 offevend = config.get("OFFEVEND");
condv.put(CONDV_COD, offevend);
int err = condv.read();
if (err != NOERR) //se l'offerta indicata nell'ini non esiste..
{
condv.zero(); //..se la crea!
condv.put(CONDV_TIPO, 'O');
condv.put(CONDV_COD, offevend);
TDate dataini = rec.get(16);
TDate datafine = rec.get(17);
condv.put(CONDV_VALIN, dataini);
condv.put(CONDV_VALFIN, datafine);
condv.write();
}
const TDate dataini = rec.get(16);
const TDate datafine = rec.get(17);
TLocalisamfile rcondv(LF_RCONDV); //adesso che sa che l'offerta esiste andiamo in rcondv
rcondv.put(RCONDV_TIPO, 'O');
rcondv.put(RCONDV_COD, offevend);
rcondv.put(RCONDV_TIPORIGA, 'A');
rcondv.put(RCONDV_CODRIGA, rec.get(2));
rcondv.put(RCONDV_PREZZO, prz_vend);
rcondv.write();
calcola_offerta(dataini, datafine, _offven);
_rcondv.zero(); //adesso che sa che l'offerta esiste andiamo in rcondv
_rcondv.put(RCONDV_TIPO, 'O');
_rcondv.put(RCONDV_COD, _offven);
_rcondv.put(RCONDV_TIPORIGA, 'A');
_rcondv.put(RCONDV_CODRIGA, rec.get(2));
_rcondv.put(RCONDV_UM, rec.get(7));
_rcondv.put(RCONDV_PREZZO, scorpora(prz_vend, rec));
int err = _rcondv.write();
if (err != NOERR)
_rcondv.rewrite();
}
}
@ -295,14 +429,14 @@ class TCat2dl: public TSkeleton_application
{
TMask* _msk;
TCat2dl_file* _trasfile;
TString _listingr, _listvend, _offeingr, _offevend;
TString _dlfilename, _dlsitepath, _listingr, _listvend, _offeingr, _offevend;
TString8 _user, _password, _codiva;
protected:
virtual bool create(void);
virtual void main_loop();
virtual bool destroy(void);
void transfer(void);
void inizializza_file(void);
static bool annulla_handler(TMask_field& f, KEY k);
public:
@ -317,15 +451,26 @@ inline TCat2dl& app() { return (TCat2dl&) main_app();}
// creazione dell'applicazione
bool TCat2dl::create()
{
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
_msk = new TMask("dl0800a");
_msk->set(F_FILENAME,DLFILENAME);
_trasfile = NULL;
open_files(LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, LF_TAB, LF_TABCOM, 0);
TConfig config("cat2dl.ini","PARAMS");
_dlfilename = config.get("DLFILENAME");
_dlsitepath = config.get("DLSITEPATH");
_listingr = config.get("LISTINGR");
_listvend = config.get("LISTVEND");
_offeingr = config.get("OFFEINGR");
_offevend = config.get("OFFEVEND");
_user = config.get("USER");
_password = config.get("PASSWORD");
_codiva = config.get("CODIVASTD");
_msk = new TMask("dl0800a");
_msk->set(F_FILENAME,_dlfilename);
_msk->set(F_INTERNET,_dlsitepath);
_msk->set(F_USER, _user);
_msk->set(F_PASSWORD, _password);
_msk->set(F_CODIVA, _codiva);
_trasfile = NULL;
return TSkeleton_application::create();
}
@ -347,56 +492,101 @@ void TCat2dl::main_loop()
{
key = _msk->run();
if (key == K_ENTER)
{
_dlfilename = _msk->get(F_FILENAME);
_dlsitepath = _msk->get(F_INTERNET);
_user = _msk->get(F_USER);
_password = _msk->get(F_PASSWORD);
_codiva = _msk->get(F_CODIVA);
{
TConfig config("Cat2dl.ini", "PARAMS");
config.set("DLFILENAME", _dlfilename);
config.set("DLSITEPATH", _dlsitepath);
config.set("USER", _user);
config.set("PASSWORD", _password);
config.set("CODIVASTD", _codiva);
}
transfer();
}
}
}
// trasferimento dati da file su archivi
void TCat2dl::transfer()
{
TFilename catdlini = "cat2dl.ini";
const TFilename catdlini = "cat2dl.ini";
//selezione del tipo di omportazione
const bool web = _msk->get_bool(F_SELECT);
TFilename fileimport;
if (web) //via web
{
TString site; // sito dl
TFilename remote; // file remoto
TString16 auth; // user+password cifrati
split_url(_msk->get(F_INTERNET), site, remote);
fileimport.temp("DL"); //file temporaneo locale su cui vengono trasferiti i dati
cifratura_laziale(_user, _password, auth);
if (!http_get(site, remote, fileimport, auth))
{
error_box("Impossibile aggiornare i dati dall'indirizzo web specificato");
return;
}
}
else
fileimport = _msk->get(F_FILENAME);
_trasfile = new TCat2dl_file(fileimport, catdlini); //file da importare in locale
const unsigned long dimension = fsize(fileimport);
_trasfile->set_config(_listingr,_listvend,_offeingr,_offevend,_codiva); //parametri dell'.ini
_trasfile->open(fileimport,'r');
_trasfile = new TCat2dl_file(_msk->get(F_FILENAME), catdlini);
inizializza_file();
const long dimension = fsize(_msk->get(F_FILENAME));
TProgind pi(dimension,"Acquisizione in corso...");
TRelation rel(LF_ANAMAG);
TRectype& record = rel.curr(); //record corrente della relazione
TString str; // Stringa jolly di lavoro
TRecord_text curr;
while (_trasfile->read(curr) == NOERR)
TRecord_text curr;
unsigned long processed_rec = 0L;
const clock_t start_time = clock();
clock_t rt = 0, wt = 0;
while (TRUE)
{
pi.setstatus(_trasfile->read_file()->tellg());
// read del file dell'ANAMAG
str = curr.get(2); //legge il codart
rel.curr().put(ANAMAG_CODART, str);
int err = rel.read();
if (err != NOERR)
{
rel.curr().zero();
rel.curr().put(ANAMAG_CODART, str);
}
const clock_t read_time = clock();
if (_trasfile->read(curr) != NOERR)
break;
const clock_t write_time = clock();
processed_rec ++;
if (processed_rec%100 == 0)
{
unsigned long time = (clock()-start_time);
unsigned long rs = processed_rec*1000/time;
rt /= 100; wt /= 100;
str.format("%lu rec; %lu sec; %lu rec/sec;\nmean read %lu; mean write %lu", processed_rec, time/1000, rs, rt, wt);
rt = wt = 0;
pi.set_text(str);
pi.setstatus(_trasfile->read_file()->tellg());
}
if (pi.iscancelled()) //se clicchi annulla si ferma davvero
break;
_trasfile->autosave(rel, curr); //esegue l'effettivo passaggio dati basandosi sulla formattazione del file .ini
rt += write_time - read_time;
wt += clock() - write_time;
}
ofstream pippo("dl.log");
pippo << "records = " << processed_rec << endl;
pippo << "time = " << (clock() - start_time)/1000 << endl;
pippo << "speed = " << (processed_rec*1000/(clock() - start_time)) << endl;
_trasfile->close();
message_box("Operazione terminata");
}
//inizializza il file di testo su cui emettere i dati
void TCat2dl::inizializza_file()
{
TFilename filect = _msk->get(F_FILENAME); //aggiungere lettura automatica nomi file
_trasfile->open(filect,'r');
}
// handler per gestire la conferma dell'annullamento dei dati inseriti
// nella maschera
bool TCat2dl::annulla_handler(TMask_field& f, KEY k)
@ -413,14 +603,13 @@ bool TCat2dl::annulla_handler(TMask_field& f, KEY k)
// gestione dei messaggi estesi nei campi
void TCat2dl_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
{
const TString code(s.get(0));
TString valore;
const TString16 code = s.get(0);
if (code == "_UPPERCASE")
{
valore.upper();
str.upper();
}
else NFCHECK("Macro non definita: %s", (const char *)code);
str = valore;
else
NFCHECK("Macro non definita: %s", (const char *)code);
}
int dl0800(int argc, char* argv[])

@ -1,4 +1,9 @@
// importazione catalogo
// definizione campi per maschera di selezione
#define F_FILENAME 102 // nome del file da cui scaricare i dati
#define F_SELECT 101 // selezione origine dati
#define F_FILENAME 102 // nome del file da cui caricare i dati
#define F_INTERNET 103 // indirizzo upload da remoto
#define F_USER 104
#define F_PASSWORD 105
#define F_CODIVA 106 // codice IVA di default (nel caso non sia presente nel record)

@ -1,34 +1,73 @@
#include "dl0800a.h"
TOOLBAR "" 0 20 0 2
PAGE "Importazione catalogo" -1 -1 74 10
BUTTON DLG_OK 9 2
GROUPBOX DLG_NULL 72 7
BEGIN
PROMPT -12 -11 ""
PROMPT 1 1 "@bSelezioni per l'importazione/aggiornamento"
END
BUTTON DLG_QUIT 9 2
RADIOBUTTON F_SELECT 1 18
BEGIN
PROMPT -22 -11 ""
PROMPT 2 2 ""
ITEM " |File su disco" MESSAGE ENABLE,1@|DISABLE,2@
ITEM "X|Sito Web" MESSAGE ENABLE,2@|DISABLE,1@
END
ENDPAGE
PAGE "Importazione catalogo" -1 -1 78 20
GROUPBOX DLG_NULL 77 9
STRING F_FILENAME 80 50
BEGIN
PROMPT 1 1 "Selezioni per l'importazione"
END
STRING F_FILENAME 52
BEGIN
PROMPT 2 2 "Nome file "
CHECKTYPE REQUIRED
PROMPT 20 3 ""
VALIDATE FILENAME_FUNC
FLAGS "A"
HELP "Nome del file da cui caricare i dati"
HELP "Nome del file locale da cui caricare i dati"
WARNING "E' necessario specificare un nome di file"
GROUP 1
END
STRING F_INTERNET 80 50
BEGIN
PROMPT 20 4 ""
HELP "Indirizzo del sito da cui caricare i dati"
WARNING "E' necessario specificare un indirizzo web"
GROUP 2
END
STRING F_USER 8
BEGIN
PROMPT 20 5 "Utente "
FLAGS "U"
CHECKTYPE REQUIRED
GROUP 2
END
STRING F_PASSWORD 8
BEGIN
PROMPT 43 5 "Password "
FLAGS "U*"
CHECKTYPE REQUIRED
GROUP 2
END
STRING F_CODIVA 4
BEGIN
PROMPT 5 6 "Codice IVA standard "
USE %IVA
INPUT CODTAB F_CODIVA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione @50" S0
OUTPUT F_CODIVA CODTAB
CHECKTYPE REQUIRED
WARNING "E' necessario specificare un codice IVA valido"
END
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE

308
dl/dl0900.cpp Executable file

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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