2009-03-11 14:11:30 +00:00
|
|
|
|
#include <applicat.h>
|
|
|
|
|
#include <automask.h>
|
2009-01-30 10:26:09 +00:00
|
|
|
|
#include <config.h>
|
2009-03-11 14:11:30 +00:00
|
|
|
|
#include <reprint.h>
|
|
|
|
|
#include <textset.h>
|
|
|
|
|
|
|
|
|
|
#include "lv2800a.h"
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
//Stampa Venduto Per Cliente nei 12 Mesi
|
|
|
|
|
//lvietri
|
2009-02-02 14:27:54 +00:00
|
|
|
|
class TVend_cli_recordset: public TCSV_recordset
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TVend_cli_recordset(): TCSV_recordset("CSV(\"\t\")") {}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
};
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
struct TStruttura_venduto: public TObject
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
long _cliente;
|
2009-02-02 14:27:54 +00:00
|
|
|
|
const TString _articolo;
|
|
|
|
|
const TString _descr;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
TDate _dataDoc;
|
|
|
|
|
int _numeroDoc;
|
|
|
|
|
long _qta;
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TStruttura_venduto():_cliente(0),_articolo(""),_descr(""),_dataDoc(""),_numeroDoc(0),_qta(0) {}
|
|
|
|
|
TStruttura_venduto(long cliente, TString articolo, TString descr,
|
|
|
|
|
TDate dataDoc, int numeroDoc,long qta):
|
|
|
|
|
_cliente(cliente),_articolo(articolo),
|
|
|
|
|
_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
};
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
class TVend_cli_mask: public TAutomask
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
|
public:
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TVend_cli_mask():TAutomask("lv2800a"){}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
};
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
bool TVend_cli_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
2009-12-14 08:02:55 +00:00
|
|
|
|
switch (o.dlg())
|
|
|
|
|
{
|
|
|
|
|
case F_DATA_DA:
|
|
|
|
|
if (e == fe_init)
|
|
|
|
|
{
|
|
|
|
|
TDate oggi(TODAY);
|
|
|
|
|
oggi.set_day(1);
|
|
|
|
|
o.set (oggi.string());
|
|
|
|
|
}
|
|
|
|
|
default: break;
|
|
|
|
|
}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
class TVend_cli_report : public TReport
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
virtual bool use_mask() { return false; }
|
|
|
|
|
};
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
class TVend_cli_app: public TSkeleton_application
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
virtual void main_loop();
|
|
|
|
|
void elabora(const TMask& mask) const;
|
2009-12-14 08:02:55 +00:00
|
|
|
|
TString getQuery(const TMask& mask) const;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
bool ctl(TDate dataInizio,
|
|
|
|
|
TDate dataFine,
|
|
|
|
|
bool isAnno) const;
|
2009-01-30 11:51:55 +00:00
|
|
|
|
bool erroreBox(TString aMsg) const;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
};
|
|
|
|
|
|
2009-12-14 08:02:55 +00:00
|
|
|
|
TString TVend_cli_app::getQuery(const TMask& mask) const
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
//Stringhe x composizione query
|
2009-12-14 08:02:55 +00:00
|
|
|
|
TString query, select, between, orderBy, join;
|
|
|
|
|
|
|
|
|
|
//Richiamo parametri della ditta di configurazione file Ditta.ini
|
|
|
|
|
|
|
|
|
|
//andare su bolle senza numeratore
|
|
|
|
|
//const TString4 codnum = ini_get_string(CONFIG_DITTA, "lv", "NUM_FAT");
|
|
|
|
|
//const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_FAT");
|
|
|
|
|
const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
|
|
|
|
|
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select << "USE RDOC KEY 1\n";
|
2009-12-14 08:02:55 +00:00
|
|
|
|
select << "SELECT ((DOC.TIPODOC='" << tipodoc << "')&&";
|
|
|
|
|
|
|
|
|
|
if(!mask.get_bool(F_CHECK_NO_RESI)){
|
|
|
|
|
select << "(2000@.B2!='X')&&";
|
|
|
|
|
}
|
|
|
|
|
if(mask.get_bool(F_CHECK_FATT)){
|
|
|
|
|
select << "(3000@.S2[37,38] ='+1')&&";
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-30 10:26:09 +00:00
|
|
|
|
between << "(BETWEEN(DOC.ZONA,#F_ZONA_FROM,#F_ZONA_FROM))";
|
|
|
|
|
between << "&&(BETWEEN(CODART,#F_CODART_FROM,#F_CODART_TO))";
|
|
|
|
|
between << "&&(BETWEEN(DOC.DATADOC,#F_DATA_FROM,#F_DATA_TO))";
|
2011-06-07 10:51:17 +00:00
|
|
|
|
between << "&&(STR(BETWEEN(DOC.CODCF,#F_CODCF_FROM,#F_CODCF_TO))))\n";
|
2009-01-30 10:26:09 +00:00
|
|
|
|
orderBy << "BY DOC.CODCF CODART DOC.DATADOC NDOC\n";
|
|
|
|
|
join << "JOIN DOC TO RDOC ALIAS 1000 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC\n";
|
2009-12-14 08:02:55 +00:00
|
|
|
|
|
|
|
|
|
if(!mask.get_bool(F_CHECK_NO_RESI)){
|
|
|
|
|
join << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n";
|
|
|
|
|
}
|
|
|
|
|
if(mask.get_bool(F_CHECK_FATT)){
|
|
|
|
|
join << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n";
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
2009-12-14 08:02:55 +00:00
|
|
|
|
query << select << between << orderBy << join;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
return query;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class TRiepVendCli: public TArray
|
|
|
|
|
{
|
|
|
|
|
public:
|
2009-02-02 14:27:54 +00:00
|
|
|
|
void add(long cliente, TString articolo, TString descr,
|
|
|
|
|
TDate dataDoc, int numeroDoc, long qta);
|
2009-01-30 11:51:55 +00:00
|
|
|
|
TRiepVendCli():TArray(){}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
void TRiepVendCli::add(long cliente, TString articolo, TString descr,
|
|
|
|
|
TDate dataDoc, int numeroDoc, long qta)
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TStruttura_venduto* struttura = new TStruttura_venduto(cliente,articolo, descr,dataDoc,numeroDoc,qta);
|
|
|
|
|
TArray::add(struttura);
|
2009-01-30 10:26:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-01-30 11:51:55 +00:00
|
|
|
|
/*
|
|
|
|
|
Metodo di visualizzazione pop errore
|
|
|
|
|
ritorna sempre false.
|
|
|
|
|
*/
|
2009-02-02 14:27:54 +00:00
|
|
|
|
bool TVend_cli_app::erroreBox(TString aMsg) const
|
2009-01-30 11:51:55 +00:00
|
|
|
|
{
|
|
|
|
|
error_box (aMsg);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2009-01-30 10:26:09 +00:00
|
|
|
|
/*
|
|
|
|
|
Effettuo Controlli. Ritorna false-Errore se:
|
|
|
|
|
- data iniziale vuota
|
|
|
|
|
- data finale vuota
|
|
|
|
|
- date appartenenti ad anno differente
|
|
|
|
|
(msk gestisce controllo se data iniziale <EFBFBD> maggiore di
|
|
|
|
|
quella finale)
|
|
|
|
|
*/
|
2009-02-02 14:27:54 +00:00
|
|
|
|
bool TVend_cli_app:: ctl(TDate dataInizio,
|
2009-01-30 10:26:09 +00:00
|
|
|
|
TDate dataFine,
|
|
|
|
|
bool isAnno) const
|
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
if(!isAnno)
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
int annoInizio = dataInizio.year();
|
|
|
|
|
int annoFine = dataFine.year();
|
|
|
|
|
if(annoInizio!=annoFine)
|
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
return erroreBox(TR("le date non fanno parte dello stesso anno!"));;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//metodo principale di elaborazione
|
2009-02-02 14:27:54 +00:00
|
|
|
|
void TVend_cli_app:: elabora(const TMask& mask)const
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
Se i controlli vanno a buon fine, allora
|
|
|
|
|
va avanti nella gestione
|
|
|
|
|
*/
|
|
|
|
|
if(ctl(mask.get_date(F_DATA_DA),
|
|
|
|
|
mask.get_date(F_DATA_A),
|
|
|
|
|
mask.get_bool(F_CHECK_ANNO)))
|
|
|
|
|
{
|
2009-12-14 08:02:55 +00:00
|
|
|
|
TISAM_recordset riep(getQuery(mask));
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
TDate dataDa = mask.get_date(F_DATA_DA);
|
|
|
|
|
TDate dataA = mask.get_date(F_DATA_A);
|
|
|
|
|
|
|
|
|
|
if(mask.get_bool(F_CHECK_ANNO))
|
|
|
|
|
{
|
|
|
|
|
dataDa.set_day(1);
|
|
|
|
|
dataDa.set_month(1);
|
|
|
|
|
dataDa.set_year(mask.get_int(F_ANNO));
|
|
|
|
|
|
|
|
|
|
dataA.set_day(31);
|
|
|
|
|
dataA.set_month(12);
|
|
|
|
|
dataA.set_year(mask.get_int(F_ANNO));
|
|
|
|
|
}
|
2011-06-07 10:51:17 +00:00
|
|
|
|
|
|
|
|
|
const long cazzone1 = mask.get_long(F_CODCF_DA);
|
|
|
|
|
const long cazzone2 = mask.get_long(F_CODCF_A);
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
//inserire parametri filtri
|
2011-06-07 10:51:17 +00:00
|
|
|
|
riep.set_var("#F_DATA_FROM", dataDa);
|
|
|
|
|
riep.set_var("#F_DATA_TO", dataA);
|
|
|
|
|
riep.set_var("#F_CODCF_FROM", cazzone1);
|
|
|
|
|
riep.set_var("#F_CODCF_TO", cazzone2);
|
|
|
|
|
riep.set_var("#F_ZONA_FROM", TVariant(mask.get(F_ZONA)));
|
|
|
|
|
riep.set_var("#F_ANNO_TO", TVariant(mask.get(F_ANNO)));
|
|
|
|
|
riep.set_var("#F_CHECK_ANNO_TO", TVariant(mask.get(F_CHECK_ANNO)));
|
|
|
|
|
riep.set_var("#F_CODART_FROM", TVariant(mask.get(F_CODART_FROM)));
|
|
|
|
|
riep.set_var("#F_CODART_TO", TVariant(mask.get(F_CODART_TO)));
|
|
|
|
|
riep.set_var("#F_CHECK_NO_RESI_TO", TVariant(mask.get(F_CHECK_NO_RESI)));
|
|
|
|
|
riep.set_var("#F_CHECK_FATT_TO", TVariant(mask.get(F_CHECK_FATT)));
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TRiepVendCli riepilogo;
|
|
|
|
|
|
|
|
|
|
//inizializzazione variabili da utilizzare nella
|
|
|
|
|
//struttura
|
|
|
|
|
TDate dataDoc;
|
|
|
|
|
TString articolo;
|
|
|
|
|
TString descr;
|
|
|
|
|
int numeroDoc;
|
|
|
|
|
long cliente;
|
|
|
|
|
long qta;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
for(bool ok = riep.move_first();ok;ok=riep.move_next())
|
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
dataDoc = riep.get("DOC.DATADOC").as_date();
|
|
|
|
|
articolo = riep.get("CODART").as_string();
|
|
|
|
|
descr = riep.get("DESCR").as_string();
|
|
|
|
|
|
|
|
|
|
numeroDoc = riep.get("NDOC").as_int();
|
|
|
|
|
cliente = riep.get("DOC.CODCF").as_int();
|
|
|
|
|
qta = riep.get("QTA").as_int();
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
riepilogo.add(cliente,articolo,descr,dataDoc,numeroDoc,qta);
|
2009-01-30 10:26:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//gestione report
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TVend_cli_report rep;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
bool stampa = rep.load("lv2800a");
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TVend_cli_recordset* riep_set = new TVend_cli_recordset();
|
2009-01-30 10:26:09 +00:00
|
|
|
|
rep.set_recordset(riep_set);
|
|
|
|
|
|
|
|
|
|
//inizializzazione variabili
|
|
|
|
|
TString articoloOld;
|
|
|
|
|
TString descrOld;
|
2012-06-18 14:12:17 +00:00
|
|
|
|
long clienteOld = 0;
|
2009-02-02 14:27:54 +00:00
|
|
|
|
bool start = true;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
int colonna = 0;
|
|
|
|
|
|
2009-01-30 11:51:55 +00:00
|
|
|
|
//inizializzazione array di quantit<69>
|
|
|
|
|
//12 mesi valorizzati inizialmente a 0
|
2012-06-18 14:12:17 +00:00
|
|
|
|
long qtaArray[16]; memset(qtaArray, 0, sizeof(qtaArray));
|
2009-01-30 11:51:55 +00:00
|
|
|
|
int meseArray = 0;
|
|
|
|
|
|
2009-01-30 10:26:09 +00:00
|
|
|
|
//scandisce clienti e tiene buoni solo quelli valorizzati
|
|
|
|
|
FOR_EACH_ARRAY_ITEM(riepilogo,c,obj)
|
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TStruttura_venduto& s = *(TStruttura_venduto*) obj;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
//Solo la prima volta setto le variabili altrimenti
|
|
|
|
|
//entrerebbe sempre nel metodo creazione record
|
|
|
|
|
//in report
|
2009-02-02 14:27:54 +00:00
|
|
|
|
if(start)
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
clienteOld=s._cliente;
|
|
|
|
|
articoloOld=s._articolo;
|
2009-02-02 14:27:54 +00:00
|
|
|
|
start = false;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//metodo creazione record in report
|
2012-06-18 14:12:17 +00:00
|
|
|
|
if (clienteOld!=s._cliente || articoloOld!=s._articolo)
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
riep_set->new_rec();
|
|
|
|
|
colonna = 0;
|
2012-06-18 14:12:17 +00:00
|
|
|
|
riep_set->set(colonna,TVariant(clienteOld));//CAMPO DI ROTTURA
|
2009-01-30 10:26:09 +00:00
|
|
|
|
colonna++;
|
2012-06-18 14:12:17 +00:00
|
|
|
|
riep_set->set(colonna,TVariant(clienteOld));
|
2009-01-30 10:26:09 +00:00
|
|
|
|
colonna++;
|
|
|
|
|
riep_set->set(colonna,TVariant(articoloOld));
|
|
|
|
|
colonna++;
|
|
|
|
|
riep_set->set(colonna,TVariant(descrOld));
|
2009-01-30 11:51:55 +00:00
|
|
|
|
|
|
|
|
|
for(int a = 1; a<13; a++)
|
|
|
|
|
{
|
|
|
|
|
//colonna=3
|
|
|
|
|
riep_set->set((colonna+a),TVariant(long (qtaArray[a])));
|
|
|
|
|
qtaArray[a] = 0;
|
|
|
|
|
}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
clienteOld = s._cliente;
|
|
|
|
|
articoloOld= s._articolo;
|
|
|
|
|
descrOld = s._descr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Gestione Somma qta in base al mese
|
2009-01-30 11:51:55 +00:00
|
|
|
|
meseArray = (s._dataDoc).month();
|
|
|
|
|
qtaArray[meseArray] = qtaArray[meseArray] + s._qta;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Stampa Ultimo record se ne ha fatto almeno 1
|
2009-02-02 14:27:54 +00:00
|
|
|
|
if(!start)
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
|
|
|
|
riep_set->new_rec();
|
|
|
|
|
colonna = 0;
|
2012-06-18 14:12:17 +00:00
|
|
|
|
riep_set->set(colonna,TVariant(clienteOld));//CAMPO DI ROTTURA
|
2009-01-30 10:26:09 +00:00
|
|
|
|
colonna++;
|
2012-06-18 14:12:17 +00:00
|
|
|
|
riep_set->set(colonna,TVariant(clienteOld));
|
2009-01-30 10:26:09 +00:00
|
|
|
|
colonna++;
|
|
|
|
|
riep_set->set(colonna,TVariant(articoloOld));
|
|
|
|
|
colonna++;
|
|
|
|
|
riep_set->set(colonna,TVariant(descrOld));
|
2009-01-30 11:51:55 +00:00
|
|
|
|
|
|
|
|
|
for(int a = 1; a<13; a++)
|
|
|
|
|
{
|
|
|
|
|
//colonna=3
|
2012-06-18 14:12:17 +00:00
|
|
|
|
riep_set->set((colonna+a),TVariant(qtaArray[a]));
|
2009-01-30 11:51:55 +00:00
|
|
|
|
qtaArray[a] = 0;
|
|
|
|
|
}
|
2009-01-30 10:26:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Crea file che contiene il recordset
|
|
|
|
|
//riep_set->save_as("c:\\riepilogoBolla.txt");
|
|
|
|
|
|
|
|
|
|
//Se il report esiste..
|
|
|
|
|
if(stampa)
|
|
|
|
|
{
|
|
|
|
|
//carica tutte le variabili del report.
|
|
|
|
|
rep.mask2report(mask);
|
|
|
|
|
|
|
|
|
|
TReport_book b;
|
|
|
|
|
bool ok = b.add(rep);// Richiede parametri di stampa in base alla maschera omonima
|
|
|
|
|
if (ok)
|
|
|
|
|
{
|
|
|
|
|
//Se esiste almeno 1 pagina
|
|
|
|
|
if (b.pages() > 0)
|
|
|
|
|
b.print_or_preview(); // Stampa effettivamente
|
|
|
|
|
else
|
|
|
|
|
warning_box (TR("Nessun record estratto per i parametri inseriti"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-02-02 14:27:54 +00:00
|
|
|
|
void TVend_cli_app::main_loop()
|
2009-01-30 10:26:09 +00:00
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TVend_cli_mask mask;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
|
|
|
|
|
//Settaggio della data finale come
|
|
|
|
|
//31-12-(anno in corso)
|
|
|
|
|
TString data = "31-12-";
|
|
|
|
|
data << mask.get_int(F_ANNO);
|
|
|
|
|
mask.set("#F_DATA_TO",data);
|
|
|
|
|
|
|
|
|
|
while(mask.run()==K_ENTER)
|
|
|
|
|
{
|
|
|
|
|
elabora(mask);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int lv2800(int argc, char* argv[])
|
|
|
|
|
{
|
2009-02-02 14:27:54 +00:00
|
|
|
|
TVend_cli_app app;
|
2009-01-30 10:26:09 +00:00
|
|
|
|
app.run(argc, argv, TR("Stampa Venduto Per Cliente nei 12 Mesi"));
|
|
|
|
|
return 0;
|
|
|
|
|
}
|