#include #include #include #include #include #include #include "lv2700a.h" 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; long _numeroDoc; long _qta; TStruttura():_cliente(0),_numeroDoc(0),_qta(0) {} TStruttura(long cliente, const TString& articolo, const 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; long _numeroDoc; long _cliente; int _posizione; TStrutturaData():_cliente(0),_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) { switch (o.dlg()) { case F_DATA_DA: if (e == fe_init && o.empty()) { TDate oggi(TODAY); oggi.set_day(1); o.set(oggi.string()); } break; default: break; } 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 get_query(bool isArticolo,const TMask& mask) const; }; TString TRiepBolle_app::get_query(bool isArticolo,const TMask& mask) 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; //Richiamo parametri della ditta di configurazione file Ditta.ini //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 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(DOC.DATADOC,#F_DATA_FROM,#F_DATA_TO))&&(STR(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"; 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"; //from_ << "FROM CODNUM='" << codnum << "'\n"; //to_ << "TO CODNUM='" << codnum << "'"; query << select << between << orderBy << join; return query; } class TRiepilogo: public TArray { public: void add(int count,long cliente, const TString& articolo, const TString& descr, const TDate& dataDoc, long numeroDoc, long qta); }; class TRiepilogoData: public TArray { public: void add(int posizione, long cliente, const TDate& dataDoc, long numeroDoc); }; void TRiepilogo::add(int count,long cliente, const TString& articolo, const TString& descr, const TDate& dataDoc, long numeroDoc, long qta) { TStruttura* struttura = new TStruttura(cliente,articolo, descr,dataDoc,numeroDoc,qta); TArray::add(struttura,count); } void TRiepilogoData::add(int posizione, long cliente, const TDate& dataDoc, long numeroDoc) { TStrutturaData* strutturaData = new TStrutturaData(posizione,cliente, dataDoc,numeroDoc); TArray::add(strutturaData,posizione); } void TRiepBolle_app:: elabora(const TMask& mask)const { TRiepilogo riepilogo; { TISAM_recordset riep(get_query(true,mask)); //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",mask.get_long(F_CODCF_DA)); riep.set_var("#F_CODCF_TO",mask.get_long(F_CODCF_A)); riep.set_var("#F_ZONA_FROM",TVariant(mask.get(F_ZONA))); TProgind pi(riep.items(), TR("Estrazione articoli"), true, true); int count = 1; for(bool ok = riep.move_first(); ok && pi.addstatus(1); ok=riep.move_next()) { const TDate dataDoc = riep.get("DOC.DATADOC").as_date(); const long cliente = riep.get("DOC.CODCF").as_int(); const TString articolo = riep.get("CODART").as_string(); const TString descr = riep.get("DESCR").as_string(); const long numeroDoc = riep.get("NDOC").as_int(); const 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); long clienteOld = 0; TString articoloOld; int contatore = 0; TRiepilogoData riepilogoData, riepilogoData2; TProgind pi(riepilogo.items(), TR("Estrazione documenti"), true, true); FOR_EACH_ARRAY_ITEM(riepilogo, c, obj)//scandisce clienti e tiene buoni solo quelli valorizzati { if (!pi.addstatus(1)) break; const TStruttura& s = *(TStruttura*)obj; if (clienteOld!=s._cliente || articoloOld!=s._articolo) { riep_set->new_rec(); riep_set->set(0, TVariant(s._cliente)); //CAMPO DI ROTTURA riep_set->set(1, TVariant(s._cliente)); riep_set->set(2, TVariant(s._articolo)); riep_set->set(3, TVariant(s._descr)); contatore = 4; if (clienteOld != s._cliente) { riepilogoData.destroy(); riepilogoData2.destroy(); //Per ogni cliente creo una struttura di date. è necessario per il report. TISAM_recordset dateDocAll(get_query(false, mask)); //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", s._cliente); dateDocAll.set_var("#F_CODCF_TO", s._cliente); dateDocAll.set_var("#F_ZONA_FROM", TVariant(mask.get(F_ZONA))); TDate dateOld; long numeroOld = 0; long cliente = 0; int posizione = 4; for (bool ok = dateDocAll.move_first(); ok; ok=dateDocAll.move_next()) { TDate dataDocTot = dateDocAll.get("DOC.DATADOC").as_date(); long numeroDocTot = dateDocAll.get("NDOC").as_int(); long 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) { // Imposta data e numero documento, mentre azzera la qta FOR_EACH_ARRAY_ITEM(riepilogoData2,f,obj) { TStrutturaData& sD2 = *(TStrutturaData*) obj; int contatore2 = sD2._posizione; TString8 ggmm; ggmm.format("%02d-%02d", sD2._dataDoc.day(), sD2._dataDoc.month()); riep_set->set(contatore2, ggmm); // data doc. contatore2++; riep_set->set(contatore2, sD2._numeroDoc); // num. doc. contatore2++; riep_set->set(contatore2, NULL_VARIANT); // qta contatore2++; } } //posizionamento qta in base alla data-numero if(s._dataDoc==sD._dataDoc && s._numeroDoc==sD._numeroDoc) { contatore = sD._posizione; TString8 tt2; tt2.format("%02d-%02d", s._dataDoc.day(), s._dataDoc.month()); riep_set->set(contatore, tt2); contatore++; riep_set->set(contatore,s._numeroDoc); contatore++; const long qta = riep_set->get(contatore).as_int() + s._qta; riep_set->set(contatore,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++; } } } #ifdef DBG //Crea file che contiene il recordset per debug riep_set->save_as("c:/temp/riepilogoBolla.txt"); #endif 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("Riepilogo Bolle di Lavanderia")); return 0; }