#include #include #include #include #include #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(TDate dataInizio, TDate dataFine, bool isAnno) const; bool erroreBox(TString aMsg) const; }; TString TVend_cli_app::getQuery(const TMask& mask) const { //Stringhe x composizione query 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"); select << "USE RDOC KEY 1\n"; 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')&&"; } 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))"; between << "&&(BETWEEN(DOC.CODCF,#F_CODCF_FROM,#F_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)){ 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"; } query << select << between << orderBy << join; 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); } /* Metodo di visualizzazione pop errore ritorna sempre false. */ bool TVend_cli_app::erroreBox(TString aMsg) const { error_box (aMsg); return false; } /* Effettuo Controlli. Ritorna false-Errore se: - data iniziale vuota - data finale vuota - date appartenenti ad anno differente (msk gestisce controllo se data iniziale è maggiore di quella finale) */ bool TVend_cli_app:: ctl(TDate dataInizio, TDate dataFine, bool isAnno) const { if(!isAnno) { int annoInizio = dataInizio.year(); int annoFine = dataFine.year(); if(annoInizio!=annoFine) { return erroreBox(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)); } //inserire parametri filtri riep.set_var("#F_DATA_FROM",dataDa); riep.set_var("#F_DATA_TO",dataA); riep.set_var("#F_CODCF_FROM",TVariant(mask.get(F_CODCF_DA))); riep.set_var("#F_CODCF_TO",TVariant(mask.get(F_CODCF_A))); 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))); TRiepVendCli riepilogo; //inizializzazione variabili da utilizzare nella //struttura TDate dataDoc; TString articolo; TString descr; int numeroDoc; long cliente; long 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; int clienteOld = 0; bool start = true; int colonna = 0; //inizializzazione array di quantità //12 mesi valorizzati inizialmente a 0 int qtaArray[12]; for(int a = 0; a<13; a++) {qtaArray[a] = 0;} 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(long (clienteOld)));//CAMPO DI ROTTURA colonna++; riep_set->set(colonna,TVariant(long (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(long (clienteOld)));//CAMPO DI ROTTURA colonna++; riep_set->set(colonna,TVariant(long (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; } } //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) 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[]) { TVend_cli_app app; app.run(argc, argv, TR("Stampa Venduto Per Cliente nei 12 Mesi")); return 0; }