#include #include #include #include #include "lv0.h" #include "lv2700a.h" #include class TRiepBolle_recordset: public TCSV_recordset { public: TRiepBolle_recordset(): TCSV_recordset("CSV(\"\t\")") {} }; struct TStruttura: public TObject { long _cliente; TString _articolo; TString _descr; TDate _dataDoc; int _numeroDoc; long _qta; TStruttura():_cliente(0),_articolo(""),_descr(""),_dataDoc(""),_numeroDoc(0),_qta(0) {} TStruttura(long cliente, TString articolo, TString descr, TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo),_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {} }; struct TStrutturaData: public TObject { TDate _dataDoc; int _numeroDoc; int _cliente; int _posizione; TStrutturaData():_cliente(0),_dataDoc(""),_numeroDoc(0),_posizione(0) {} TStrutturaData(int posizione, int cliente, TDate dataDoc, int numeroDoc):_posizione(posizione), _dataDoc(dataDoc),_numeroDoc(numeroDoc) {} }; class TRiepBolle_mask: public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TRiepBolle_mask():TAutomask("lv2700a"){} }; bool TRiepBolle_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { return true; } class TRiepBolle_report : public TReport { protected: virtual bool use_mask() { return false; } }; class TRiepBolle_app: public TSkeleton_application { protected: virtual void main_loop(); void elabora(const TMask& mask) const; TString getQuery(bool isArticolo) const; }; TString TRiepBolle_app::getQuery(bool isArticolo) const { /* RICHIESTA QUERY: estrazione di tutte le bolle in base ai range della parametrica: - cliente - data - zona Inoltre estrarre in base alla causale di lavanderia tutte quelle righe che non sono di reso (2000@.B2!='X'). Dalla causale di lavanderia agganciare la causale di magazzino consegnata e verificare che abbiano il segno '+' nel campo consegnato mese (3000@.S2[37,38] ='+1'). le bolle sono determinate dal file di configurazione Ditta.ini */ //Stringhe x composizione query TString query, select, between, orderBy, join, from_, to_; //Richiamo parametri della ditta di configurazione //file Ditta.ini TConfig lvini(CONFIG_DITTA, "lv"); const TString4 codnum = lvini.get("NUM_GEN"); const TString4 tipodoc = lvini.get("TIPODOC_GEN"); select << "USE RDOC KEY 1\n"; select << "SELECT ((2000@.B2!='X')&&(3000@.S2[37,38] ='+1')&&(DOC.TIPODOC='" << tipodoc << "')&&"; between << "(BETWEEN(DOC.ZONA,#F_ZONA_FROM,#F_ZONA_FROM))&&(BETWEEN(DOC.DATADOC,#F_DATA_FROM,#F_DATA_TO))&&(BETWEEN(DOC.CODCF,#F_CODCF_FROM,#F_CODCF_TO)))\n"; if(isArticolo) orderBy << "BY DOC.CODCF CODART DOC.DATADOC NDOC\n"; else orderBy << "BY DOC.CODCF DOC.DATADOC NDOC\n"; join << "JOIN DOC TO RDOC ALIAS 1000 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC\n"; join << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n"; join << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n"; from_ << "FROM CODNUM='" << codnum << "'\n"; to_ << "TO CODNUM='" << codnum << "'"; query << select << between << orderBy << join << from_ << to_; return query; } class TRiepilogo: public TArray { public: void add(int count,long cliente, TString articolo, TString descr, TDate dataDoc, int numeroDoc, long qta); TRiepilogo():TArray(9){} }; class TRiepilogoData: public TArray { public: void add(int posizione,int cliente, TDate dataDoc, int numeroDoc); TRiepilogoData():TArray(){} }; void TRiepilogo::add(int count,long cliente, TString articolo, TString descr, TDate dataDoc, int numeroDoc, long qta) { TStruttura* struttura = new TStruttura(cliente,articolo, descr,dataDoc,numeroDoc,qta); TArray::add(struttura,count); } void TRiepilogoData::add(int posizione,int cliente, TDate dataDoc, int numeroDoc) { TStrutturaData* strutturaData = new TStrutturaData(posizione,cliente, dataDoc,numeroDoc); TArray::add(strutturaData,posizione); } void TRiepBolle_app:: elabora(const TMask& mask)const { TISAM_recordset riep(getQuery(true)); //inserire parametri filtri riep.set_var("#F_DATA_FROM",mask.get_date(F_DATA_DA)); riep.set_var("#F_DATA_TO",mask.get_date(F_DATA_A)); 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))); TRiepilogo riepilogo; TRiepilogoData riepilogoData; TRiepilogoData riepilogoData2; int count = 1; for(bool ok = riep.move_first();ok;ok=riep.move_next()) { TDate dataDoc = riep.get("DOC.DATADOC").as_date(); long cliente = riep.get("DOC.CODCF").as_int(); TString articolo = riep.get("CODART").as_string(); TString descr = riep.get("DESCR").as_string(); int numeroDoc = riep.get("NDOC").as_int(); long qta = riep.get("QTA").as_int(); riepilogo.add(count,cliente,articolo,descr,dataDoc,numeroDoc,qta); count++; } TRiepBolle_report rep; bool stampa = rep.load("lv2700a"); TRiepBolle_recordset* riep_set = new TRiepBolle_recordset(); rep.set_recordset(riep_set); int clienteOld = 0; TString articoloOld; int contatore = 0; FOR_EACH_ARRAY_ITEM(riepilogo,c,obj)//scandisce clienti e tiene //buoni solo quelli valorizzati { TStruttura& s = *(TStruttura*) obj; if(clienteOld!=s._cliente || articoloOld!=s._articolo) { riep_set->new_rec(); riep_set->set(0,TVariant(long (s._cliente)));//CAMPO DI ROTTURA riep_set->set(1,TVariant(long (s._cliente))); riep_set->set(2,TVariant(s._articolo)); riep_set->set(3,TVariant(s._descr)); contatore=4; if(clienteOld!=s._cliente) { //Per ogni cliente creo una struttura di date. è necessario //per il report. TISAM_recordset dateDocAll(getQuery(false)); //inserire parametri filtri dateDocAll.set_var("#F_DATA_FROM",mask.get_date(F_DATA_DA)); dateDocAll.set_var("#F_DATA_TO",mask.get_date(F_DATA_A)); dateDocAll.set_var("#F_CODCF_FROM",TVariant(long (s._cliente))); dateDocAll.set_var("#F_CODCF_TO",TVariant(long (s._cliente))); dateDocAll.set_var("#F_ZONA_FROM",TVariant(mask.get(F_ZONA))); TDate dateOld; int numeroOld=0; int cliente=0; int posizione = 4; for(bool ok = dateDocAll.move_first();ok;ok=dateDocAll.move_next()) { TDate dataDocTot = dateDocAll.get("DOC.DATADOC").as_date(); int numeroDocTot = dateDocAll.get("NDOC").as_int(); int clientDocTot = dateDocAll.get("DOC.CODCF").as_int(); if(dateOld !=dataDocTot || numeroOld !=numeroDocTot || cliente!=clientDocTot ) { dateOld=dataDocTot; numeroOld=numeroDocTot; cliente=clientDocTot; riepilogoData.add(posizione,clientDocTot,dataDocTot,numeroDocTot); riepilogoData2.add(posizione,clientDocTot,dataDocTot,numeroDocTot); posizione=posizione+3; } } } clienteOld=s._cliente; articoloOld=s._articolo; } FOR_EACH_ARRAY_ITEM(riepilogoData,f,obj) { TStrutturaData& sD = *(TStrutturaData*) obj; //ogni primo record riporto come titolo tutte le date-numero if(contatore==4) { FOR_EACH_ARRAY_ITEM(riepilogoData2,f,obj) { TStrutturaData& sD2 = *(TStrutturaData*) obj; int contatore2 = sD2._posizione; TString tt = sD2._dataDoc; TString tt2 = tt.sub(0,5); riep_set->set(contatore2,TVariant(tt2)); contatore2++; riep_set->set(contatore2,TVariant(long (sD2._numeroDoc))); contatore2++; riep_set->set(contatore2,TVariant(long (0))); contatore2++; } } //posizionamento qta in base alla data-numero if(s._dataDoc==sD._dataDoc && s._numeroDoc==sD._numeroDoc) { contatore = sD._posizione; TString tt = s._dataDoc; TString tt2 = tt.sub(0,5); riep_set->set(contatore,TVariant(tt2)); contatore++; riep_set->set(contatore,TVariant(long (s._numeroDoc))); contatore++; riep_set->set(contatore,TVariant(long (s._qta))); contatore++; TArray* p = (TArray*) obj; int e = p->size(); e=e+1; while(72>contatore) { contatore++; contatore++; riep_set->set(contatore,TVariant(long (0))); contatore++; } break; } else { contatore++; contatore++; riep_set->set(contatore,TVariant(long (0))); contatore++; } } } //Crea file che contiene il recordset //riep_set->save_as("c:\\riepilogoBolla.txt"); 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) { if (b.pages() > 0) b.print_or_preview(); // Stampa effettivamente else warning_box (TR("Nessun record estratto per i parametri inseriti")); } } } void TRiepBolle_app::main_loop() { TRiepBolle_mask m; while(m.run()==K_ENTER) { elabora(m); } } int lv2700(int argc, char* argv[]) { TRiepBolle_app app; app.run(argc, argv, TR("Stampa Riepilogo Bolle di Lavanderia")); return 0; }