diff --git a/lv/lv2.cpp b/lv/lv2.cpp index 9e805a6de..d213dc621 100755 --- a/lv/lv2.cpp +++ b/lv/lv2.cpp @@ -13,6 +13,7 @@ int main(int argc, char** argv) case 3: lv2400(argc, argv); break; //generazione automatica bolle di consegna case 4: lv2600(argc, argv); break; //acquisizione bolle di rientro case 6: lv2700(argc, argv); break; //Riepilogo Bolle di Lavanderie + case 7: lv2800(argc, argv); break; //Venduto Per Cliente nei 12 Mesi default: lv2100(argc, argv); break; //generazione automatica del planning } return 0; diff --git a/lv/lv2.h b/lv/lv2.h index f94fe1ba7..f60b7bbe9 100755 --- a/lv/lv2.h +++ b/lv/lv2.h @@ -7,5 +7,6 @@ int lv2300(int argc, char* argv[]);//Stampa Giri -2 int lv2400(int argc, char* argv[]); int lv2600(int argc, char* argv[]); int lv2700(int argc, char* argv[]);//Riepilogo Bolle di Lavanderie -6 +int lv2800(int argc, char* argv[]);//Venduto Per Cliente nei 12 Mesi -7 #endif // __LV2_H \ No newline at end of file diff --git a/lv/lv2300.cpp b/lv/lv2300.cpp index 47f19c34d..976240bac 100755 --- a/lv/lv2300.cpp +++ b/lv/lv2300.cpp @@ -287,6 +287,7 @@ void TGiri_app::main_loop() else { TGiri_report r(false); //Stampa Giro Giornaliero + r.mask2report(m); TReport_book b; bool ok = b.add(r); // Richiede parametri di stampa in base alla maschera omonima if (ok) diff --git a/lv/lv2800.cpp b/lv/lv2800.cpp new file mode 100755 index 000000000..556164c16 --- /dev/null +++ b/lv/lv2800.cpp @@ -0,0 +1,433 @@ +#include +#include +#include +#include +#include "lv0.h" +#include "lv2800a.h" +#include + +//Stampa Venduto Per Cliente nei 12 Mesi +//lvietri +class TVendCli_recordset: public TCSV_recordset +{ +public: + TVendCli_recordset(): TCSV_recordset("CSV(\"\t\")") {} +}; + +struct TStruttura: public TObject +{ + long _prezzo; + 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, long prezzo):_cliente(cliente),_articolo(articolo), + _descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc), + _qta(qta),_prezzo(prezzo) {} +}; + +class TVendCli_mask: public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + TVendCli_mask():TAutomask("lv2800a"){} +}; + +bool TVendCli_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + return true; +} + +class TVendCli_report : public TReport +{ +protected: + virtual bool use_mask() { return false; } +}; + +class TVendCli_app: public TSkeleton_application +{ +protected: + virtual void main_loop(); + void elabora(const TMask& mask) const; + TString getQuery() const; + bool ctl(TDate dataInizio, + TDate dataFine, + int dataNum, + bool isAnno) const; +}; + +TString TVendCli_app::getQuery() const +{ + //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 = "B01";//lvini.get("NUM_GEN"); ?? + const TString4 tipodoc = "B01";//lvini.get("TIPODOC_GEN");?? + + select << "USE RDOC KEY 1\n"; + select << "SELECT ((DOC.TIPODOC='" << tipodoc << "')&&"; + 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"; + from_ << "FROM CODNUM='" << codnum << "'\n"; + to_ << "TO CODNUM='" << codnum << "'"; + + query << select << between << orderBy << join << from_ << to_; + + return query; +} + +class TRiepVendCli: public TArray +{ +public: + void add(int count,long cliente, TString articolo, TString descr, + TDate dataDoc, int numeroDoc, long qta, long prezzo); + TRiepVendCli():TArray(9){} +}; + + +void TRiepVendCli::add(int count,long cliente, TString articolo, TString descr, + TDate dataDoc, int numeroDoc, long qta, long prezzo) +{ + TStruttura* struttura = new TStruttura(cliente,articolo, descr,dataDoc,numeroDoc,qta, prezzo); + TArray::add(struttura,count); +} + +/* +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 TVendCli_app:: ctl(TDate dataInizio, + TDate dataFine, + int dataNum, + bool isAnno) const +{ + bool vRc = true; + + if(isAnno) + { + if(dataNum==0) + { + error_box (TR("ERRORE:Valorizzare l'anno")); + return false; + } + } + else + { + if(dataInizio.empty()) + { + error_box (TR("ERRORE:Valorizzare la data iniziale!")); + return false; + } + if(dataFine.empty()) + { + error_box (TR("ERRORE:Valorizzare la data finale!")); + return false; + } + + int annoInizio = dataInizio.year(); + int annoFine = dataFine.year(); + if(annoInizio!=annoFine) + { + error_box (TR("ERRORE:le date non fanno parte dello stesso anno!")); + return false; + } + } + return true; +} + + +//metodo principale di elaborazione +void TVendCli_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_int(F_ANNO), + mask.get_bool(F_CHECK_ANNO))) + { + TISAM_recordset riep(getQuery()); + + 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))); + + TRiepVendCli riepilogo; + int count = 1; + + for(bool ok = riep.move_first();ok;ok=riep.move_next()) + { + TDate dataDoc = riep.get("DOC.DATADOC").as_date(); + TString articolo = riep.get("CODART").as_string(); + TString descr = riep.get("DESCR").as_string(); + + int numeroDoc = riep.get("NDOC").as_int(); + long cliente = riep.get("DOC.CODCF").as_int(); + long qta = riep.get("QTA").as_int(); + long prezzo = riep.get("PREZZO").as_int(); + + riepilogo.add(count,cliente,articolo,descr,dataDoc,numeroDoc,qta,prezzo); + count++; + } + + //gestione report + TVendCli_report rep; + bool stampa = rep.load("lv2800a"); + TVendCli_recordset* riep_set = new TVendCli_recordset(); + rep.set_recordset(riep_set); + + //inizializzazione variabili + TString articoloOld; + TString descrOld; + int clienteOld = 0; + bool START = true; + int colonna = 0; + long qt01 = 0; + long qt02 = 0; + long qt03 = 0; + long qt04 = 0; + long qt05 = 0; + long qt06 = 0; + long qt07 = 0; + long qt08 = 0; + long qt09 = 0; + long qt10 = 0; + long qt11 = 0; + long qt12 = 0; + + //scandisce clienti e tiene buoni solo quelli valorizzati + FOR_EACH_ARRAY_ITEM(riepilogo,c,obj) + { + TStruttura& s = *(TStruttura*) 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)); + colonna++; + riep_set->set(colonna,TVariant(qt01)); + colonna++; + riep_set->set(colonna,TVariant(qt02)); + colonna++; + riep_set->set(colonna,TVariant(qt03)); + colonna++; + riep_set->set(colonna,TVariant(qt04)); + colonna++; + riep_set->set(colonna,TVariant(qt05)); + colonna++; + riep_set->set(colonna,TVariant(qt06)); + colonna++; + riep_set->set(colonna,TVariant(qt07)); + colonna++; + riep_set->set(colonna,TVariant(qt08)); + colonna++; + riep_set->set(colonna,TVariant(qt09)); + colonna++; + riep_set->set(colonna,TVariant(qt10)); + colonna++; + riep_set->set(colonna,TVariant(qt11)); + colonna++; + riep_set->set(colonna,TVariant(qt12)); + + clienteOld = s._cliente; + articoloOld= s._articolo; + descrOld = s._descr; + + qt01=0; + qt02=0; + qt03=0; + qt04=0; + qt05=0; + qt06=0; + qt07=0; + qt08=0; + qt09=0; + qt10=0; + qt11=0; + qt12=0; + } + + //Gestione Somma qta in base al mese + TString data = s._dataDoc; + TString mese = data.mid(3,2); + + if(mese=="01"){ + qt01 = qt01 + s._qta; + } + if(mese=="02"){ + qt02 = qt02 + s._qta; + } + if(mese=="03"){ + qt03 = qt03 + s._qta; + } + if(mese=="04"){ + qt04 = qt04 + s._qta; + } + if(mese=="05"){ + qt05 = qt05 + s._qta; + } + if(mese=="06"){ + qt06 = qt06 + s._qta; + } + if(mese=="07"){ + qt07 = qt07 + s._qta; + } + if(mese=="08"){ + qt08 = qt08 + s._qta; + } + if(mese=="09"){ + qt09 = qt09 + s._qta; + } + if(mese=="10"){ + qt10 = qt10 + s._qta; + } + if(mese=="11"){ + qt11 = qt11 + s._qta; + } + if(mese=="12"){ + qt12 = qt12 + 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)); + colonna++; + riep_set->set(colonna,TVariant(qt01)); + colonna++; + riep_set->set(colonna,TVariant(qt02)); + colonna++; + riep_set->set(colonna,TVariant(qt03)); + colonna++; + riep_set->set(colonna,TVariant(qt04)); + colonna++; + riep_set->set(colonna,TVariant(qt05)); + colonna++; + riep_set->set(colonna,TVariant(qt06)); + colonna++; + riep_set->set(colonna,TVariant(qt07)); + colonna++; + riep_set->set(colonna,TVariant(qt08)); + colonna++; + riep_set->set(colonna,TVariant(qt09)); + colonna++; + riep_set->set(colonna,TVariant(qt10)); + colonna++; + riep_set->set(colonna,TVariant(qt11)); + colonna++; + riep_set->set(colonna,TVariant(qt12)); + } + + //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 TVendCli_app::main_loop() +{ + TVendCli_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[]) +{ + TVendCli_app app; + app.run(argc, argv, TR("Stampa Venduto Per Cliente nei 12 Mesi")); + return 0; +} \ No newline at end of file diff --git a/lv/lv2800a.h b/lv/lv2800a.h new file mode 100755 index 000000000..4187b8530 --- /dev/null +++ b/lv/lv2800a.h @@ -0,0 +1,15 @@ +//Stampa Venduto Per Cliente nei 12 Mesi +#define F_CODCF_DA 203 +#define F_RAGSOC_DA 204 +#define F_CODCF_A 205 +#define F_RAGSOC_A 206 +#define F_DATA_DA 207 +#define F_DATA_A 208 +#define F_ANNO 209 +#define F_CHECK_ANNO 210 +#define F_CODART_FROM 211 +#define F_DESART_FROM 212 +#define F_CODART_TO 213 +#define F_DESART_TO 214 +#define F_ZONA 215 +#define F_DESZONA 216 diff --git a/lv/lv2800a.rep b/lv/lv2800a.rep new file mode 100755 index 000000000..9f62bbe9b --- /dev/null +++ b/lv/lv2800a.rep @@ -0,0 +1,152 @@ + + + Stampa Riepilogo Bolle di Lavanderia + +
+ + + MESSAGE _TODAY + + + + + + + MESSAGE _PAGENO + +
+
+
+ A + + + + + B + + + B + MESSAGE _ISAMREAD,20,TIPOCF='C'!CODCF=#THIS,RAGSOC + + + B + MESSAGE _ISAMREAD,20,TIPOCF='C'!CODCF=#THIS,INDCF + + + B + MESSAGE _ISAMREAD,20,TIPOCF='C'!CODCF=#THIS,LOCALITACF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + C + MESSAGE RESET,1000 + + + D + + + E + MESSAGE ADD,1000 + + + F + MESSAGE ADD,1000 + + + G + MESSAGE ADD,1000 + + + H + MESSAGE ADD,1000 + + + I + MESSAGE ADD,1000 + + + J + MESSAGE ADD,1000 + + + K + MESSAGE ADD,1000 + + + L + MESSAGE ADD,1000 + + + M + MESSAGE ADD,1000 + + + N + MESSAGE ADD,1000 + + + O + MESSAGE ADD,1000 + + + P + MESSAGE ADD,1000 + + +
+
+
+
+ \ No newline at end of file diff --git a/lv/lv2800a.uml b/lv/lv2800a.uml new file mode 100755 index 000000000..4b59810e4 --- /dev/null +++ b/lv/lv2800a.uml @@ -0,0 +1,195 @@ +#include "lv2800a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include "printbar.h" +ENDPAGE + +PAGE "Venduto Per Cliente nei 12 Mesi" -1 -1 40 5 + +GROUPBOX DLG_NULL 80 4 +BEGIN + PROMPT 1 1 "@b Parametri Cliente" +END + +NUMBER F_CODCF_DA 6 +BEGIN + PROMPT 2 2 "Da Cliente " + FLAGS "U" + KEY 1 + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CODCF_DA + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CODCF_DA CODCF + OUTPUT F_RAGSOC_DA RAGSOC + FIELD #F_CODCF_FROM +END + +STRING F_RAGSOC_DA 50 +BEGIN + PROMPT 25 2 "" + KEY 2 + USE LF_CLIFO KEY 2 + INPUT TIPOCF "C" + INPUT RAGSOC F_RAGSOC_DA + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + OUTPUT F_CODCF_DA CODCF + OUTPUT F_RAGSOC_DA RAGSOC +END + +NUMBER F_CODCF_A 6 +BEGIN + PROMPT 2 3 "A Cliente " + FLAGS "U" + KEY 1 + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CODCF_A + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CODCF_A CODCF + OUTPUT F_RAGSOC_A RAGSOC + FIELD #F_CODCF_TO +END + +STRING F_RAGSOC_A 50 +BEGIN + PROMPT 25 3 "" + KEY 2 + USE LF_CLIFO KEY 2 + INPUT TIPOCF "C" + INPUT RAGSOC F_RAGSOC_A + DISPLAY "Ragione Sociale@50" RAGSOC + DISPLAY "Codice" CODCF + OUTPUT F_CODCF_A CODCF + OUTPUT F_RAGSOC_A RAGSOC +END + +GROUPBOX DLG_NULL 80 3 +BEGIN + PROMPT 1 5 "@b Parametri Data" +END + +DATE F_DATA_DA + BEGIN + PROMPT 2 6 "Da Data " + FLAGS "A" + FIELD #F_DATA_FROM + GROUP 1 +END + +DATE F_DATA_A + BEGIN + PROMPT 30 6 "A Data " + FIELD #F_DATA_TO + VALITATE DATE_CMP_FUNC >= F_DATA_DA + WARNING "La data finale deve essere successiva a quella iniziale" + GROUP 1 +END + +BOOLEAN F_CHECK_ANNO + BEGIN + PROMPT 60 6 "Per Anno " + FIELD #F_CHECK_ANNO_TO + MESSAGE TRUE DISABLE,1@|ENABLE,F_ANNO + MESSAGE FALSE ENABLE,1@|DISABLE,F_ANNO +END + +NUMBER F_ANNO 4 + BEGIN + PROMPT 72 6 "" + FLAGS "A" + FIELD #F_ANNO_TO +END + +GROUPBOX DLG_NULL 80 4 +BEGIN + PROMPT 1 8 "@b Parametri Articolo" +END + +STRING F_CODART_FROM 20 +BEGIN + PROMPT 2 9 "Da Articolo " + FLAG "U" + USE 47 + INPUT CODART F_CODART_FROM + DISPLAY "Codice@20" CODART + DISPAY "Descrizione@50" DESCR + OUTPUT F_CODART_FROM CODART + OUTPUT F_DESART_FROM DESCR + FIELD #F_CODART_FROM +END + +STRING F_DESART_FROM 40 +BEGIN + PR 38 9 "" + USE 47 KEY 2 + INPUT DESCR F_DESART_FROM + DISPLAY "Codice@20" CODART + DISPALY "Descrizione@50" DESCR + OUTPUT F_CODART_FROM CODART + OUTPUT F_DESART_FROM DESCR + FIELD #F_DESART_FROM +END + +STRING F_CODART_TO 20 +BEGIN + PROMPT 2 10 "Ad Articolo " + FLAG "U" + USE 47 + INPUT CODART F_CODART_TO + DISPLAY "Codice@20" CODART + DISPAY "Descrizione@50" DESCR + OUTPUT F_CODART_TO CODART + OUTPUT F_DESART_TO DESCR + FIELD #F_CODART_TO +END + +STRING F_DESART_TO 40 +BEGIN + PR 38 10 "" + USE 47 KEY 2 + INPUT DESCR F_DESART_TO + DISPLAY "Codice@20" CODART + DISPALY "Descrizione@50" DESCR + OUTPUT F_CODART_TO CODART + OUTPUT F_DESART_TO DESCR + FIELD #F_DESART_TO +END + +GROUPBOX DLG_NULL 80 3 +BEGIN + PROMPT 1 12 "@b Parametri Zona" +END + +STRING F_ZONA 2 +BEGIN + PROMPT 2 13 "Codice Zona" + USE ZON + INPUT CODTAB F_ZONA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_ZONA CODTAB + OUTPUT F_DESZONA S0 + CHECKTYPE NORMAL + FIELD #F_ZONA_FROM +END + +STRING F_DESZONA 50 +BEGIN + PROMPT 20 13 "" + USE ZON KEY 2 + INPUT CODTAB F_ZONA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_ZONA CODTAB + OUTPUT F_DESZONA S0 +END + + +ENDPAGE +ENDMASK + +