campo-sirio/lv/lv2800.cpp

339 lines
9.4 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <reprint.h>
#include <textset.h>
#include "lv2800a.h"
//Stampa Venduto Per Cliente nei 12 Mesi
//lvietri
class TVend_cli_recordset: public TCSV_recordset
{
public:
TVend_cli_recordset(): TCSV_recordset("CSV(\"\t\")") {}
};
struct TStruttura_venduto: public TObject
{
long _cliente;
const TString _articolo;
const TString _descr;
TDate _dataDoc;
int _numeroDoc;
long _qta;
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) {}
};
class TVend_cli_mask: public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TVend_cli_mask():TAutomask("lv2800a"){}
};
bool TVend_cli_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_DATA_DA:
if (e == fe_init)
{
TDate oggi(TODAY);
oggi.set_day(1);
o.set (oggi.string());
}
default: break;
}
return true;
}
class TVend_cli_report : public TReport
{
protected:
virtual bool use_mask() { return false; }
};
class TVend_cli_app: public TSkeleton_application
{
protected:
virtual void main_loop();
void elabora(const TMask& mask) const;
TString getQuery(const TMask& mask) const;
bool ctl(const TDate& dataInizio, const TDate& dataFine, bool isAnno) const;
};
TString TVend_cli_app::getQuery(const TMask& mask) const
{
//Stringhe x composizione query
TString query, select, between, orderBy, join, limit;
//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 codnum = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN");
const TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN");
select << "USE RDOC KEY 3\n";
select << "SELECT (DOC.TIPODOC='" << tipodoc << "')";
between << "&&(BETWEEN(DOC.ZONA,#ZONA_FROM,#ZONA_FROM))";
between << "&&(BETWEEN(CODART,#CODART_FROM,#CODART_TO))";
between << "&&(BETWEEN(DOC.DATADOC,#DATA_FROM,#DATA_TO))";
between << "&&(STR(BETWEEN(DOC.CODCF,#CODCF_FROM,#CODCF_TO)))\n";
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";
if(!mask.get_bool(F_CHECK_NO_RESI))
{
select << "&&(2000@.B2!='X')";
join << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n";
}
if(mask.get_bool(F_CHECK_FATT))
{
select << "&&(3000@.S2[37,38] ='+1')";
join << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n";
}
limit << "PROVV=D ANNO=" << mask.get(F_ANNO) << " CODNUM=" << codnum;
query << select << between << orderBy << join;
query << "\nFROM " << limit;
query << "\nTO " << limit;
return query;
}
class TRiepVendCli: public TArray
{
public:
void add(long cliente, TString articolo, TString descr,
TDate dataDoc, int numeroDoc, long qta);
TRiepVendCli():TArray(){}
};
void TRiepVendCli::add(long cliente, TString articolo, TString descr,
TDate dataDoc, int numeroDoc, long qta)
{
TStruttura_venduto* struttura = new TStruttura_venduto(cliente,articolo, descr,dataDoc,numeroDoc,qta);
TArray::add(struttura);
}
/*
Effettuo Controlli. Ritorna false-Errore se:
- data iniziale vuota
- data finale vuota
- date appartenenti ad anno differente
(msk gestisce controllo se data iniziale <20> maggiore di
quella finale)
*/
bool TVend_cli_app::ctl(const TDate& dataInizio, const TDate& dataFine, bool isAnno) const
{
if (!isAnno)
{
const int annoInizio = dataInizio.year();
const int annoFine = dataFine.year();
if (annoInizio != annoFine)
return error_box(TR("Le date non fanno parte dello stesso anno!"));
}
return true;
}
//metodo principale di elaborazione
void TVend_cli_app:: elabora(const TMask& mask)const
{
/*
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)))
{
TISAM_recordset riep(getQuery(mask));
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));
}
const long cazzone1 = mask.get_long(F_CODCF_DA);
const long cazzone2 = mask.get_long(F_CODCF_A);
//inserire parametri filtri
riep.set_var("#DATA_FROM", dataDa);
riep.set_var("#DATA_TO", dataA);
riep.set_var("#CODCF_FROM", cazzone1);
riep.set_var("#CODCF_TO", cazzone2);
riep.set_var("#ZONA_FROM", TVariant(mask.get(F_ZONA)));
riep.set_var("#ANNO_TO", TVariant(mask.get(F_ANNO)));
riep.set_var("#CODART_FROM", TVariant(mask.get(F_CODART_FROM)));
riep.set_var("#CODART_TO", TVariant(mask.get(F_CODART_TO)));
riep.set_var("#CHECK_NO_RESI_TO", TVariant(mask.get(F_CHECK_NO_RESI)));
riep.set_var("#CHECK_FATT_TO", TVariant(mask.get(F_CHECK_FATT)));
TRiepVendCli riepilogo;
//inizializzazione variabili da utilizzare nella
//struttura
TDate dataDoc;
TString80 articolo;
TString descr;
int numeroDoc;
long cliente, qta;
for (bool ok = riep.move_first(); ok; ok=riep.move_next())
{
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();
riepilogo.add(cliente,articolo,descr,dataDoc,numeroDoc,qta);
}
//gestione report
TVend_cli_report rep;
bool stampa = rep.load("lv2800a");
TVend_cli_recordset* riep_set = new TVend_cli_recordset();
rep.set_recordset(riep_set);
//inizializzazione variabili
TString articoloOld;
TString descrOld;
long clienteOld = 0;
bool start = true;
int colonna = 0;
//inizializzazione array di quantit<69>
//12 mesi valorizzati inizialmente a 0
long qtaArray[16]; memset(qtaArray, 0, sizeof(qtaArray));
int meseArray = 0;
//scandisce clienti e tiene buoni solo quelli valorizzati
FOR_EACH_ARRAY_ITEM(riepilogo,c,obj)
{
TStruttura_venduto& s = *(TStruttura_venduto*) obj;
//Solo la prima volta setto le variabili altrimenti
//entrerebbe sempre nel metodo creazione record
//in report
if(start)
{
clienteOld=s._cliente;
articoloOld=s._articolo;
start = false;
}
//metodo creazione record in report
if (clienteOld!=s._cliente || articoloOld!=s._articolo)
{
riep_set->new_rec();
colonna = 0;
riep_set->set(colonna,TVariant(clienteOld));//CAMPO DI ROTTURA
colonna++;
riep_set->set(colonna,TVariant(clienteOld));
colonna++;
riep_set->set(colonna,TVariant(articoloOld));
colonna++;
riep_set->set(colonna,TVariant(descrOld));
for(int a = 1; a<13; a++)
{
//colonna=3
riep_set->set((colonna+a),TVariant(long (qtaArray[a])));
qtaArray[a] = 0;
}
clienteOld = s._cliente;
articoloOld= s._articolo;
descrOld = s._descr;
}
//Gestione Somma qta in base al mese
meseArray = (s._dataDoc).month();
qtaArray[meseArray] = qtaArray[meseArray] + s._qta;
}
//Stampa Ultimo record se ne ha fatto almeno 1
if (!start)
{
riep_set->new_rec();
colonna = 0;
riep_set->set(colonna,TVariant(clienteOld));//CAMPO DI ROTTURA
colonna++;
riep_set->set(colonna,TVariant(clienteOld));
colonna++;
riep_set->set(colonna,TVariant(articoloOld));
colonna++;
riep_set->set(colonna,TVariant(descrOld));
for (int a = 1; a<13; a++)
{
//colonna=3
riep_set->set((colonna+a),TVariant(qtaArray[a]));
qtaArray[a] = 0;
}
}
//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"));
}
}
}
}
void TVend_cli_app::main_loop()
{
TVend_cli_mask mask;
//Settaggio della data finale come
//31-12-(anno in corso)
TString16 data = "31-12-"; data << mask.get_int(F_ANNO);
mask.set(F_DATA_A, data);
while (mask.run()==K_ENTER)
elabora(mask);
}
int lv2800(int argc, char* argv[])
{
TVend_cli_app app;
app.run(argc, argv, TR("Venduto per cliente nei 12 mesi"));
return 0;
}