From e106e46ff4f61c19288493ccc5160978395a3d2f Mon Sep 17 00:00:00 2001 From: luca Date: Wed, 11 Nov 2009 09:52:02 +0000 Subject: [PATCH] Patch level :10.0 Files correlati : Ricompilazione Demo : [ ] Commento :modulo per utenti paganti git-svn-id: svn://10.65.10.50/trunk@19603 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve2700.cpp | 2 +- ve/ve3.cpp | 1 + ve/ve3.h | 1 + ve/ve3500.cpp | 2 +- ve/ve3500c.rep | 2 + ve/ve3500l.rep | 4 + ve/ve3500o.rep | 4 + ve/ve3800.cpp | 837 +++++++++++++++++++++++++++++++++++++++++++++++++ ve/ve3800.h | 28 ++ ve/ve3800.uml | 287 +++++++++++++++++ ve/ve3800a.rep | 246 +++++++++++++++ ve/ve3800b.rep | 341 ++++++++++++++++++++ ve/ve3800c.rep | 341 ++++++++++++++++++++ ve/ve3800d.rep | 351 +++++++++++++++++++++ ve/ve3800e.rep | 399 +++++++++++++++++++++++ ve/ve3800f.rep | 448 ++++++++++++++++++++++++++ ve/ve3800g.rep | 496 +++++++++++++++++++++++++++++ ve/ve3900.cpp | 2 +- ve/ve3900a.rep | 14 +- ve/ve3900a.uml | 12 +- 20 files changed, 3805 insertions(+), 13 deletions(-) create mode 100755 ve/ve3800.cpp create mode 100755 ve/ve3800.h create mode 100755 ve/ve3800.uml create mode 100755 ve/ve3800a.rep create mode 100755 ve/ve3800b.rep create mode 100755 ve/ve3800c.rep create mode 100755 ve/ve3800d.rep create mode 100755 ve/ve3800e.rep create mode 100755 ve/ve3800f.rep create mode 100755 ve/ve3800g.rep diff --git a/ve/ve2700.cpp b/ve/ve2700.cpp index b9c8e3298..295cbda42 100755 --- a/ve/ve2700.cpp +++ b/ve/ve2700.cpp @@ -1167,7 +1167,7 @@ bool TAggiorna_listini::create() //se non paghi ti stronco!!! const TDate oggi(TODAY); - if (oggi >= 20091120) + if (oggi >= 20091130) return false; } return TSkeleton_application::create(); diff --git a/ve/ve3.cpp b/ve/ve3.cpp index cd66551c0..b2cb7e7ee 100755 --- a/ve/ve3.cpp +++ b/ve/ve3.cpp @@ -10,6 +10,7 @@ int main(int argc, char **argv) case 1: ve3200(argc, argv); break; // antichissima stampa listini/contratti/offerte case 3: ve3400(argc, argv); break; // stampa anagrafica di magazzino case 4: ve3500(argc, argv); break; // moderna stampa condizioni di vendita + case 7: ve3800(argc, argv); break; // stampe statistiche standard case 8: ve3900(argc, argv); break; // stampe varie delle vendite (a=fatturato) default: ve3100(argc, argv); break; // stampa tabelle sconti (di riga/di documento/incondizionati) } diff --git a/ve/ve3.h b/ve/ve3.h index 812a79bf5..4cfb67f5b 100755 --- a/ve/ve3.h +++ b/ve/ve3.h @@ -5,6 +5,7 @@ int ve3100(int argc, char* argv[]); // stampa tabelle sconti (di riga/di docume int ve3200(int argc, char* argv[]); // antichissima stampa testate listini/contratti/offerte int ve3400(int argc, char* argv[]); // stampa anagrafica di magazzino int ve3500(int argc, char* argv[]); // moderna stampa condizioni di vendita +int ve3800(int argc, char* argv[]); //stampa statistiche standard int ve3900(int argc, char* argv[]); //stampe varie vendite #endif diff --git a/ve/ve3500.cpp b/ve/ve3500.cpp index 5fc21a9ae..739afbfd0 100755 --- a/ve/ve3500.cpp +++ b/ve/ve3500.cpp @@ -172,7 +172,7 @@ bool TPrint_condven::create() //se non paghi ti stronco!!! const TDate oggi(TODAY); - if (oggi >= 20091120) + if (oggi >= 20091130) return false; } return TSkeleton_application::create(); diff --git a/ve/ve3500c.rep b/ve/ve3500c.rep index a94befdb1..a85eff604 100755 --- a/ve/ve3500c.rep +++ b/ve/ve3500c.rep @@ -127,6 +127,7 @@ CODIVA + ANAMAG.CODIVA @@ -199,6 +200,7 @@ USE RCONDV SELECT ((TIPORIGA="A")(BETWEEN(CODRIGA,#DACODART,#ACODART))(BETWEEN(ANAMAG.GRMERC,#DAGRMERC,#AGRMERC))(BETWEEN(ANAMAG.RAGGFIS,#DARAGFIS,#ARAGFIS)))||((TIPORIGA="G")(BETWEEN(CODRIGA,#DAGRMERC,#AGRMERC)))||((TIPORIGA="R")(BETWEEN(CODRIGA,#DARAGFIS,#ARAGFIS))) JOIN ANAMAG INTO CODART=CODRIGA +JOIN UMART TO RCONDV INTO CODART=CODRIGA NRIGA=1 FROM TIPO=C TIPOCF=#TIPOCF CODCF=#CODCF COD=#COD TO TIPO=C TIPOCF=#TIPOCF CODCF=#CODCF COD=#COD diff --git a/ve/ve3500l.rep b/ve/ve3500l.rep index 5bdfab0c9..341a301c8 100755 --- a/ve/ve3500l.rep +++ b/ve/ve3500l.rep @@ -111,8 +111,10 @@
+ PREZZOE;0 UM + UMART.UM PREZZO @@ -120,6 +122,7 @@ CODIVA + ANAMAG.CODIVA @@ -185,6 +188,7 @@ USE RCONDV SELECT ((TIPORIGA="A")(BETWEEN(CODRIGA,#DACODART,#ACODART))(BETWEEN(ANAMAG.GRMERC,#DAGRMERC,#AGRMERC))(BETWEEN(ANAMAG.RAGGFIS,#DARAGFIS,#ARAGFIS)))||((TIPORIGA="G")(BETWEEN(CODRIGA,#DAGRMERC,#AGRMERC)))||((TIPORIGA="R")(BETWEEN(CODRIGA,#DARAGFIS,#ARAGFIS))) JOIN ANAMAG INTO CODART=CODRIGA +JOIN UMART TO RCONDV INTO CODART=CODRIGA NRIGA=1 FROM TIPO=L CATVEN=#CATVEN COD=#COD TO TIPO=L CATVEN=#CATVEN COD=#COD diff --git a/ve/ve3500o.rep b/ve/ve3500o.rep index 8011aa4a2..cc56f9765 100755 --- a/ve/ve3500o.rep +++ b/ve/ve3500o.rep @@ -96,8 +96,10 @@
+ PREZZOE;0 UM + UMART.UM PREZZO @@ -105,6 +107,7 @@ CODIVA + ANAMAG.CODIVA @@ -172,6 +175,7 @@ USE RCONDV SELECT ((TIPORIGA="A")(BETWEEN(CODRIGA,#DACODART,#ACODART))(BETWEEN(ANAMAG.GRMERC,#DAGRMERC,#AGRMERC))(BETWEEN(ANAMAG.RAGGFIS,#DARAGFIS,#ARAGFIS)))||((TIPORIGA="G")(BETWEEN(CODRIGA,#DAGRMERC,#AGRMERC)))||((TIPORIGA="R")(BETWEEN(CODRIGA,#DARAGFIS,#ARAGFIS))) JOIN ANAMAG INTO CODART=CODRIGA +JOIN UMART TO RCONDV INTO CODART=CODRIGA NRIGA=1 FROM TIPO=O COD=#COD TO TIPO=O COD=#COD diff --git a/ve/ve3800.cpp b/ve/ve3800.cpp new file mode 100755 index 000000000..6d4270261 --- /dev/null +++ b/ve/ve3800.cpp @@ -0,0 +1,837 @@ +#include "ve3800.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "../cg/cglib01.h" +#include "velib07.h" + +/////////////////////////////////////////////////////////// +// MASCHERA +/////////////////////////////////////////////////////////// +class TStatistiche_ve_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TStatistiche_ve_mask(); + virtual ~TStatistiche_ve_mask() {} +}; + +TStatistiche_ve_mask::TStatistiche_ve_mask() : TAutomask("ve3800") +{ +} + +bool TStatistiche_ve_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_ANNO: + if (e == fe_modify && !o.empty()) + { + TEsercizi_contabili esc; + TDate inies, fines; + if (esc.code2range(atoi(o.get()), inies, fines)) + { + set(F_DADATA, inies); + set(F_ADATA, fines); + } + } + break; + case F_DADATA: + case F_ADATA: + if (e == fe_close) + { + const int anno = get_int(F_ANNO); + + TEsercizi_contabili esc; //..le date devono essere incluse nell'esercizio selezionato! + const TDate data = o.get(); + if (!data.empty() && esc.date2esc(data) != anno) + return error_box(TR("La data deve appartenere all'anno selezionato")); + } + break; + default: + break; + } + + return true; +} + +///////////////////////////////////////////////////////////// +// REPORT +///////////////////////////////////////////////////////////// +class TStatistiche_ve_report : public TReport +{ +protected: +virtual bool use_mask() { return false; } +public: + TStatistiche_ve_report() {} +}; + +///////////////////////////////////////////////////////////// +// CSV RECORDSET +///////////////////////////////////////////////////////////// + +class TStatistiche_ve_csv_recordset : public TCSV_recordset +{ + real _tot[13]; //array con i totali per mese (e anno) + +protected: + long trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio); + +public: + TStatistiche_ve_csv_recordset(const TMask& mask); + + //virtual const TVariant& get(const char* column_name) const; + //virtual const TVariant& get(unsigned int column) const { return TCSV_recordset::get(column); } + + void aggiungi_ai_totali(const TRiga_documento& riga, const char tipo_dati); + bool aggiungi_riga(TDocument_recordset& righe, const char tipo_dati, const char tipo_stat, const char tipo_dettaglio); //const TRiga_documento& riga, const char tipo_dati); + void compila_intestazione(); + void calcola_percentuali(); +}; + +TStatistiche_ve_csv_recordset::TStatistiche_ve_csv_recordset(const TMask& mask) +: TCSV_recordset("CSV(\"\t\")") //tab separated +{ + FOR_EACH_MASK_FIELD(mask, i, field) + { + const TFieldref* f = field->field(); + if (f != NULL) + { + const TString& name = f->name(); + set_var(name, field->get(), true); + } + } +} + +/*const TVariant& TStatistiche_ve_csv_recordset::get(const char* field_name) const +{ + if (*field_name == '#') + return get_var(field_name); + + return TRecordset::get(field_name); +}*/ + +void TStatistiche_ve_csv_recordset::compila_intestazione() +{ + insert_rec(0); + //riempie i campi del primo record del csv in modo da avere l'intestazione (0=A...29=AD in excel) + set(0, "CODART"); + set(1, "DESCRIZIONE"); + set(2, "GENNAIO"); + set(3, "%GEN"); + set(4, "FEBBRAIO"); + set(5, "%FEB"); + set(6, "MARZO"); + set(7, "%MAR"); + set(8, "APRILE"); + set(9, "%APR"); + set(10, "MAGGIO"); + set(11, "%MAG"); + set(12, "GIUGNO"); + set(13, "%GIU"); + set(14, "LUGLIO"); + set(15, "%LUG"); + set(16, "AGOSTO"); + set(17, "%AGO"); + set(18, "SETTEMBRE"); + set(19, "%SET"); + set(20, "OTTOBRE"); + set(21, "%OTT"); + set(22, "NOVEMBRE"); + set(23, "%NOV"); + set(24, "DICEMBRE"); + set(25, "%DIC"); + set(26, "ANNO"); + set(27, "%ANNO"); + set(28, "GRMERC"); + set(29, "CODCLI"); +} + + +//metodo plutonico di ricerca dicotomica su una colonna di csv_recordset +long TStatistiche_ve_csv_recordset::trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio) +{ + long first = 0; + long last = items() - 1; + long riga = -1; + + while(first <= last) + { + const long guess = (first + last) / 2; + move_to(guess); + //const TString& guess_codart = get(0).as_string(); //ori + //const int diff = guess_codart.compare(codart); //ori + + TToken_string guess_key; + + switch (tipo_stat) + { + case 'A': //articolo + guess_key.add(get(0).as_string()); + break; + + case 'C': //cliente-codart codart-cliente + { + switch (tipo_dettaglio) + { + case 'A': + { + guess_key.add(get(0).as_string()); //colonna 0=A codart + TString8 codcf = get(29).as_string(); + codcf.right_just(6); + guess_key.add(codcf); //colonna 29=AD codcf + } + break; + case 'C': + guess_key = get(29).as_string(); //colonna 29=AD codcf + guess_key.right_just(6); + guess_key.add(get(0).as_string()); //colonna 0=A codart + break; + case 'G': + guess_key = get(29).as_string(); //colonna 29=AD codcf + guess_key.right_just(6); + guess_key.add(get(28).as_string()); //colonna 28=AC grmerc + break; + case 'M': + { + guess_key.add(get(28).as_string()); //colonna 28=AC grmerc + TString8 codcf = get(29).as_string(); + codcf.right_just(6); + guess_key.add(codcf); //colonna 29=AD codcf + } + break; + default: + guess_key = get(29).as_string(); //colonna 29=AD codcf + guess_key.right_just(6); + break; + } //switch(tipo_dettaglio... + } //case 'C'... + break; + + case 'G': //grmerc-codart + guess_key.add(get(28).as_string()); //colonna 28=AC grmerc + guess_key.add(get(0).as_string()); + break; + + default: + break; + } //switch(tipo_stat... + + + const int diff = guess_key.compare(key); + if (diff == 0) + { + riga = guess; + break; + } + if (diff > 0) + { + last = guess - 1; + } + else + { + first = guess + 1; + } + } + + return riga; +} + +/////////////////////////////////////////////// +// METODI DI COMPARE +/////////////////////////////////////////////// + +//funzione di ordinamento per il campo codart (campo 0 sul csv) +//è una stringa semplice +static int compare_csv_rows_codart(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + const TString80 c1 = s1.get(0); + const TString80 c2 = s2.get(0); + int cmp = c1.compare(c2); + + return cmp; +} + +//funzione di ordinamento per il campo coscf (campo 29 sul csv) +//è un long +static int compare_csv_rows_codcf(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + long c1 = s1.get_long(29); + long c2 = s2.get_long(29); + int cmp = c1 - c2; + + return cmp; +} + +//funzione di ordinamento per il campo grmerc/codart (campi 28/0 sul csv) +//sono 2 stringhe +static int compare_csv_rows_grmerc_codart(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + TToken_string c1; + c1.add(s1.get(28)); + c1.add(s1.get(0)); + + TToken_string c2; + c2.add(s2.get(28)); + c2.add(s2.get(0)); + + int cmp = c1.compare(c2); + + return cmp; +} + +//funzione di ordinamento per il campo codcf/codart (campi 29/0 sul csv) +//è un long + una stringa +static int compare_csv_rows_codcf_codart(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + long c1 = s1.get_long(29); + long c2 = s2.get_long(29); + int cmp = c1 - c2; + if (cmp == 0) + { + const TString80 a1 = s1.get(0); + const TString80 a2 = s2.get(0); + cmp = a1.compare(a2); + } + + return cmp; +} + +//funzione di ordinamento per il campo codcf/grmerc (campi 29/28 sul csv) +//è un long + una stringa +static int compare_csv_rows_codcf_grmerc(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + const long c1 = s1.get_long(29); + const long c2 = s2.get_long(29); + int cmp = c1 - c2; + if (cmp == 0) + { + const TString80 g1 = s1.get(28); + const TString80 g2 = s2.get(28); + cmp = g1.compare(g2); + } + + return cmp; +} + +//funzione di ordinamento per il campo codart/codcf (campi 0/29 sul csv) +//sono una stringa ed un long +static int compare_csv_rows_codart_codcf(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + const TString80 a1 = s1.get(0); + const TString80 a2 = s2.get(0); + int cmp = a1.compare(a2); + + if (cmp == 0) + { + const long c1 = s1.get_long(29); + const long c2 = s2.get_long(29); + cmp = c1 - c2; + } + + return cmp; +} + +//funzione di ordinamento per il campo grmerc/codcf (campo 28/29 sul csv) +//sono una stringa ed un long +static int compare_csv_rows_grmerc_codcf(const TObject** o1, const TObject** o2) +{ + TToken_string& s1 = *(TToken_string*)*o1; + TToken_string& s2 = *(TToken_string*)*o2; + + //deve ordinare sul campo codart ed eventualmente codcf + const TString80 g1 = s1.get(28); + const TString80 g2 = s2.get(28); + int cmp = g1.compare(g2); + + if (cmp == 0) + { + const long c1 = s1.get_long(29); + const long c2 = s2.get_long(29); + cmp = c1 - c2; + } + + return cmp; +} + + + +void TStatistiche_ve_csv_recordset::aggiungi_ai_totali(const TRiga_documento& riga, const char tipo_dati) +{ + //datadoc (serve a stabilire in quale colonna andrà a sommarsi l'importo della riga corrente + const TDate datadoc = riga.doc().get_date(DOC_DATADOC); + const int mese = datadoc.month(); + + real dato; + //i dati da analizzare possono essere 'P'rezzi o 'Q'uantità + if (tipo_dati == 'P') + dato = riga.importo(true, false); //importo riga corrente + else + dato = riga.quantita(); //qta riga corrente + + //aggiorna l'importone del mese (ricordarsi che l'array parte da 0 quindi ci va -1 nell'indice) + _tot[mese - 1] += dato; + //aggiorna anche il totale annuale + _tot[12] += dato; +} + +//metodo per la scrittura del csv +bool TStatistiche_ve_csv_recordset::aggiungi_riga(TDocument_recordset& righe, + const char tipo_dati, const char tipo_stat, const char tipo_dettaglio) +{ + const TDocumento& doc = righe.doc(righe.cursor()->curr()); + const int nriga = righe.get(RDOC_NRIGA).as_int(); + const TRiga_documento& riga = doc[nriga]; + + //se non ci sono dati da sommere è inutile perdere tempo! + real dato; + if (tipo_dati == 'P') + dato = riga.importo(true, false); //'P'rezzo->importo + else + dato = riga.quantita(); //'Q'uantita + + if (dato.is_zero()) + return false; + + //creazione di un nuovo record da esportare + //esiste già questo codart? + const TString80 codart = riga.get(RDOC_CODART); + TString8 codcf = righe.get("DOC.CODCF").as_string(); + codcf.right_just(6); + const TString8 grmerc = righe.get("ANAMAG.GRMERC").as_string(); + + //attenzione ai vari casi di composizione chiave! + //A=articolo G=GrMerc+Articolo C=Cliente+Articolo o Articolo+Cliente in base al tipo di stampa scelta + TToken_string key; + switch (tipo_stat) + { + case 'A': + key.add(codart); + break; + + case 'C': + { + switch (tipo_dettaglio) + { + case 'A': + key.add(codart); + key.add(codcf); + break; + case 'C': + key.add(codcf); + key.add(codart); + break; + case 'G': + key.add(codcf); + key.add(grmerc); + break; + case 'M': + key.add(grmerc); + key.add(codcf); + break; + default: + key.add(codcf); //se non c'e' dettaglio basta codcf! + break; + } //switch(tipo_dettaglio... + } + break; + + case 'G': + key.add(grmerc); + key.add(codart); + break; + + default: + break; + } //switch(tipo_stat... + + + long numriga = trova_riga(key, tipo_stat, tipo_dettaglio); + + if (numriga < 0) + { + //codart + new_rec(""); + set(0, TVariant(codart)); + //descrart + const TString& descrart = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR); + set(1, TVariant(descrart)); + + set(28, TVariant(grmerc)); + set(29, TVariant(codcf)); + + //re-sorting per codart (serve perchè solo il recordset ordinato è scannerizzabile con il plutonico metodo dicotomico) + switch (tipo_stat) + { + case 'A': sort(compare_csv_rows_codart); break; + + case 'C': + { + switch (tipo_dettaglio) + { + case 'A': sort(compare_csv_rows_codart_codcf); break; + case 'C': sort(compare_csv_rows_codcf_codart); break; + case 'G': sort(compare_csv_rows_codcf_grmerc); break; + case 'M': sort(compare_csv_rows_grmerc_codcf); break; + default: sort(compare_csv_rows_codcf); break; //ordinamento quando non è richiesto il dettaglio + } //switch(tipo_dettaglio... + break; + } //case 'C' + + case 'G': sort(compare_csv_rows_grmerc_codart); break; + + default: break; + } + + //chiave.add(codart); + + numriga = trova_riga(key, tipo_stat, tipo_dettaglio); + + CHECKS(numriga >= 0, "Articolo bastardo ", (const char*)codart); + } + //riempimento del record secondo il tracciato: + // codart+descrart+12*[impns+%incid]+grmerc+codcf + + //datadoc (serve a stabilire in quale colonna andrà a sommarsi l'importo della riga corrente + const TDate datadoc = riga.doc().get_date(DOC_DATADOC); + const int mese = datadoc.month(); + const int column = mese * 2; //le colonne dei mesi sono gennaio=2,febbraio=4,marzo=6... + + + //parte comune ai due casi + real datone = get(column).as_real(); //valora totale della colonna mese corrispondente nel csv + datone += dato; //aggiunge il valore riga al valore totale articolo del mese nel csv + set(column, datone); //riscrive il valore totale aggiornato nella sua colonna(in formato stringa, cioè con la "," e non il ".") + + + //aggiunge anche grmerc, utilizzando codartmag per risalire al grmerc (se usasse codart potrebbe non esistere in anagrafica!) + set(28, grmerc); + //aggiunge pure il cliente + set(29, codcf); + + return true; +} + +void TStatistiche_ve_csv_recordset::calcola_percentuali() +{ + //%incidenza articolo sul mese = imp_articolo mese / imp tot mese + for (bool ok = move_first(); ok; ok = move_next()) + { + real totale_anno; + for (int i = 2; i <= 24; i += 2) + { + const real imp_art_mese = get(i).as_real(); + //ricordando che l'array parte da 0 + real perc = imp_art_mese * CENTO / _tot[i/2 - 1]; //calcola la % incidenza articolo sul totale per quel mese + perc.round(5); + set(i + 1, perc); + totale_anno += imp_art_mese; + } + set(26, totale_anno); + const real perc_anno = totale_anno * CENTO / _tot[12]; //calcola la % incidenza articolo sul totale annuale + set(27, perc_anno); + } +} + + +/////////////////////////////////////////////////////////// +// APPLICAZIONE +/////////////////////////////////////////////////////////// + +class TStatistiche_ve : public TSkeleton_application +{ + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "ve";} + +protected: + void elabora(const TMask& mask) const; + +public: + virtual bool create(); + virtual void main_loop(); + +}; + + + +//metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto +void TStatistiche_ve::elabora(const TMask& mask) const +{ + //PARAMETRI DI STAMPA + //-------------------- + //tipo dati da estrarre (si utilizza nel metodo di scrittura riga e totali;stabilisce se si vuole qta o prezzo) + const char tipo_dati = mask.get(F_TIPODATA)[0]; + //tipologia di statistica (Articolo - GruppoMerceologico - Cliente) + const char tipo_stat = mask.get(F_TIPOSTAT)[0]; + //se sceglie per cliente ha 3 possibilità di dettaglio (''=nessuno,'C'=raccolto per cliente,'A'=raccolto per articolo) + const char tipo_dettaglio = mask.get(F_DETTAGLIO)[0]; + + //stampa particolare bernazzalica in caso di UN SOLO CLIENTE selezionato nella stampa per cliente + //in questo caso i totali non sono generali ma solo su quel cliente + bool bernazzata = false; + if (tipo_stat == 'C') + { + const long dacli = mask.get_long(F_DACODCLI); + const long acodcli = mask.get_long(F_ACODCLI); + if (dacli == acodcli && dacli > 0) + bernazzata = true; + } + + //creazione del csv recordset che verra' riempito dai record del recordset righe + TStatistiche_ve_csv_recordset* csv = new TStatistiche_ve_csv_recordset(mask); + + //CALCOLO DEI TOTALI + //------------------ + //recordset per il calcolo dei totali mese/anno;servono per i calcoli futuri delle percentuali + TString prequery; + prequery << "USE RDOC KEY 1\n"; + prequery << "SELECT ((CODARTMAG!=\"\")&&(BETWEEN(33->DATADOC,#DADATA,#ADATA))"; + if (bernazzata) + prequery << "&&(DOC.TIPOCF=='C')&&(DOC.CODCF==#DACODCLI)"; + prequery <<")\n"; + prequery << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; + prequery << "FROM CODNUM=#CODNUM ANNO=#ANNO PROVV='D'\n"; + prequery << "TO CODNUM=#CODNUM ANNO=#ANNO PROVV='D'\n"; + TDocument_recordset totali(prequery); + totali.set_var("#CODNUM", TVariant(mask.get(F_CODNUM))); + totali.set_var("#DADATA", mask.get_date(F_DADATA)); + totali.set_var("#ADATA", mask.get_date(F_ADATA)); + totali.set_var("#ANNO", TVariant((long)mask.get_int(F_ANNO))); + if (bernazzata) + totali.set_var("#DACODCLI", mask.get_long(F_DACODCLI)); + const long totali_items = totali.items(); + if (totali_items > 0) + { + //E crea pure la progind.. + TProgind pi(totali_items, TR("Calcolo totali mensili ed annuali"), true, true); + + //Scansione del recordset trovato + for (bool ok = totali.move_first(); ok; ok = totali.move_next()) + { + if (!pi.addstatus(1)) + break; + const TDocumento& doc = totali.doc(totali.cursor()->curr()); + const int nriga = totali.get(RDOC_NRIGA).as_int(); + //scrive sul CSV i campi che servono al file di excel e al report + csv->aggiungi_ai_totali(doc[nriga], tipo_dati); + } + } + + + + + + //CREAZIONE QUERY + //--------------- + //scatta la query per la costruzione del recordset + TString query; + query << "USE RDOC KEY 1\n"; + query << "SELECT ((CODARTMAG!=\"\")&&(BETWEEN(33->DATADOC,#DADATA,#ADATA))&&"; + + switch (tipo_stat) + { + case 'A': query << "(BETWEEN(CODARTMAG,#DACODART,#ACODART)))\n"; break; + case 'C': query << "(DOC.TIPOCF=='C')&&(BETWEEN(DOC.CODCF,#DACODCLI,#ACODCLI)))\n"; break; + case 'G': query << "(BETWEEN(ANAMAG.GRMERC,#DAGRMERC,#AGRMERC)))\n"; break; + default: break; + } + + //parte comune ai vari casi di statistica della query + query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; + + //parte non comune (deve joinare anamag per avere il grmerc + if (tipo_stat == 'G' || (tipo_stat == 'C' && (tipo_dettaglio == 'G' || tipo_dettaglio == 'M'))) + query << "JOIN ANAMAG INTO CODART==CODARTMAG\n"; + + + //ri-parte comune + query << "FROM CODNUM=#CODNUM ANNO=#ANNO PROVV='D'\n"; + query << "TO CODNUM=#CODNUM ANNO=#ANNO PROVV='D'\n"; + + + //CREAZIONE RECORDSET + //------------------- + TDocument_recordset righe(query); + + //parte comune di settaggio variabili + righe.set_var("#CODNUM", TVariant(mask.get(F_CODNUM))); + righe.set_var("#DADATA", mask.get_date(F_DADATA)); + righe.set_var("#ADATA", mask.get_date(F_ADATA)); + righe.set_var("#ANNO", TVariant((long)mask.get_int(F_ANNO))); + + switch(tipo_stat) + { + case 'A': + righe.set_var("#DACODART", TVariant(mask.get(F_DACODART))); + righe.set_var("#ACODART", TVariant(mask.get(F_ACODART))); + break; + case 'C': + righe.set_var("#DACODCLI", TVariant(mask.get(F_DACODCLI))); + righe.set_var("#ACODCLI", TVariant(mask.get(F_ACODCLI))); + break; + case 'G': + righe.set_var("#DAGRMERC", TVariant(mask.get(F_DAGRMERC))); + righe.set_var("#AGRMERC", TVariant(mask.get(F_AGRMERC))); + break; + + default: + break; + } + + + //CREAZIONE STAMPE/ESPORTAZIONI + //----------------------------- + //se trova (si spera!) almeno una rigadoc buona comincia il bello del programma + const long righe_items = righe.items(); + if (righe_items > 0) + { + //E crea pure la progind.. + TProgind pi(righe_items, TR("Generazione file statistiche..."), true, true); + + //Scansione del recordset trovato + for (bool ok = righe.move_first(); ok; ok = righe.move_next()) + { + if (!pi.addstatus(1)) + break; + //scrive sul CSV i campi che servono al file di excel e al report + csv->aggiungi_riga(righe, tipo_dati, tipo_stat, tipo_dettaglio); + } + + //aggiorna le colonne delle percentuali + csv->calcola_percentuali(); + + //se richiesto il file in formato excel... + if (mask.get_bool(F_EXCEL)) + { + //crea la riga con le intestazioni dei campi e la mette all'inizio + csv->compila_intestazione(); + //salva il file come richiesto; il nome del file viene deciso in base al tipo di statistica richiesta; il file alla fine.. + //..della storia è sempre lo stesso ma ordinato in modo diverso + TString path = mask.get(F_PATH); + path.lower(); + path << "\\stat"; + switch (tipo_stat) + { + case 'A': path << "_art.xls"; break; + case 'C': path << "_cli.xls"; break; + case 'G': path << "_gmc.xls"; break; + default: break; + } + csv->save_as(path, fmt_text); + + //accoppa la riga con le intestazioni dei campi + csv->destroy(0); + +#ifdef DBG + xvt_sys_goto_url(path, "open"); +#endif + } + + //REPORT DI STAMPA + //---------------- + //creazione del report di stampa + TStatistiche_ve_report rep; + bool stampa; + //in base alle scelte dell'utonto stabilisce quale report usare + switch(tipo_stat) + { + case 'A': + stampa = rep.load("ve3800a"); + break; + + case 'C': + { + switch (tipo_dettaglio) + { + case 'A': stampa = rep.load("ve3800e"); break; //raggr per art. - dett. per cli + case 'C': stampa = rep.load("ve3800d"); break; //raggr. per cli - dett. per art + case 'G': stampa = rep.load("ve3800f"); break; //raggr. per cli - dett. per grmerc + case 'M': stampa = rep.load("ve3800g"); break; //raggr. per grmerc - dett. per cli + default: stampa = rep.load("ve3800c"); break; + } + } + break; + + case 'G': + stampa = rep.load("ve3800b"); + break; + + default: + break; + } + + //setta il recordset... + rep.set_recordset(csv); + + if (stampa) + { + TReport_book book; + stampa = book.add(rep); + if (stampa) + book.print_or_preview(); + } + + } //if(righe_items>0... + else + delete csv; +} + +void TStatistiche_ve::main_loop() +{ + TStatistiche_ve_mask mask; + + while (mask.run() == K_ENTER) + { + elabora(mask); + } +} + +bool TStatistiche_ve::create() +{ + //controlla che solo il producer AGA possa usare questo programma + if (!is_power_reseller()) + { + error_box(TR("Programma non autorizzato!")); + return false; + + //se non paghi ti stronco!!! + const TDate oggi(TODAY); + if (oggi >= 20091130) + return false; + } + + return TSkeleton_application::create(); +} + +int ve3800(int argc, char* argv[]) +{ + TStatistiche_ve stat_anal; + stat_anal.run(argc, argv, TR("Statistiche di vendita")); + return 0; +} \ No newline at end of file diff --git a/ve/ve3800.h b/ve/ve3800.h new file mode 100755 index 000000000..2d0abe7d7 --- /dev/null +++ b/ve/ve3800.h @@ -0,0 +1,28 @@ +// Defines per maschera ve3800.uml (statistiche generiche vendite) + +#define F_CODNUM 101 +#define F_DESNUM 102 +#define F_ANNO 103 +#define F_DADATA 104 +#define F_ADATA 105 +#define F_TIPOSTAT 106 +#define F_TIPODATA 107 +#define F_DETTAGLIO 108 + +#define F_DACODART 110 +#define F_DADESART 111 +#define F_ACODART 112 +#define F_ADESART 113 + +#define F_DAGRMERC 114 +#define F_DADESGRM 115 +#define F_AGRMERC 116 +#define F_ADESGRM 117 + +#define F_DACODCLI 118 +#define F_DADESCLI 119 +#define F_ACODCLI 120 +#define F_ADESCLI 121 + +#define F_EXCEL 125 +#define F_PATH 126 diff --git a/ve/ve3800.uml b/ve/ve3800.uml new file mode 100755 index 000000000..6d0ea6eac --- /dev/null +++ b/ve/ve3800.uml @@ -0,0 +1,287 @@ +#include "ve3800.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "Statistiche di vendita" -1 -1 0 0 + +GROUPBOX -1 78 5 +BEGIN + PROMPT 1 1 "@bParametri documenti di vendita" +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 2 "Numerazione " + USE %NUM + INPUT CODTAB F_CODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESNUM S0 + CHECKTYPE FORCED + FLAGS "UPA" + FIELD #CODNUM +END + +STRING F_DESNUM 50 +BEGIN + PROMPT 22 2 "" + USE %NUM KEY 2 + INPUT S0 F_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODNUM +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 3 "Anno " + USE ESC + INPUT CODTAB F_ANNO + DISPLAY "Codice Esercizio" CODTAB + DISPLAY "Data inizio esercizio" D0 + DISPLAY "Data fine esercizio " D1 + CHECKTYPE REQUIRED + OUTPUT F_ANNO CODTAB + OUTPUT F_DADATA D0 + OUTPUT F_ADATA D1 + NUM_EXPR #F_ANNO>0 + FLAG "AP" + FIELD #ANNO +END + +DATE F_DADATA +BEGIN + PROMPT 2 4 "Da data " +END + +DATE F_ADATA +BEGIN + PROMPT 30 4 "A data " +END + +GROUPBOX -1 78 5 +BEGIN + PROMPT 1 6 "@bParametri per la generazione statistiche" +END + +LIST F_TIPOSTAT 21 +BEGIN + PROMPT 2 7 "Tipo di statistica " + ITEM "A|Articoli" MESSAGE HIDE,2@|HIDE,3@|SHOW,1@ //group1=articoli,2=grmerc,3=clienti + ITEM "G|Gruppi merceologici" MESSAGE HIDE,1@|HIDE,3@|SHOW,2@ + ITEM "C|Clienti" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ +END + +LIST F_TIPODATA 10 +BEGIN + PROMPT 2 8 "Dati da analizzare " + ITEM "P|Prezzi" + ITEM "Q|Quantità" + FIELD #TIPODATA +END + +LIST F_DETTAGLIO 20 +BEGIN + PROMPT 2 9 "Dettagliato per " + ITEM "|Non dettagliato" + ITEM "A|Articolo - Cliente" + ITEM "M|Gr.Merc. - Cliente" + ITEM "C|Cliente - Articolo" + ITEM "G|Cliente - Gr.Merc." + GROUP 3 +END + +GROUPBOX -1 78 5 +BEGIN + PROMPT 1 11 "@bIntervallo di selezione" +END + +//group 1: articoli + +STRING F_DACODART 20 +BEGIN + PROMPT 2 12 "Da articolo " + KEY 1 + FLAG "UG" + USE LF_ANAMAG + INPUT CODART F_DACODART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_DACODART CODART + OUTPUT F_DADESART DESCR + CHECKTYPE SEARCH + GROUP 1 +END + +STRING F_DADESART 50 38 +BEGIN + PROMPT 38 12 "" + USE LF_ANAMAG KEY 2 + INPUT DESCR F_DADESART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_DACODART CODART + OUTPUT F_DADESART DESCR + GROUP 1 +END + +STRING F_ACODART 20 +BEGIN + PROMPT 2 13 "A articolo " + KEY 1 + FLAG "UG" + USE LF_ANAMAG + INPUT CODART F_ACODART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ACODART CODART + OUTPUT F_ADESART DESCR + CHECKTYPE SEARCH + GROUP 1 +END + +STRING F_ADESART 50 38 +BEGIN + PROMPT 38 13 "" + USE LF_ANAMAG KEY 2 + INPUT DESCR F_ADESART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ACODART CODART + OUTPUT F_ADESART DESCR + GROUP 1 +END + +//group 2: gruppi merceologici + +STRING F_DAGRMERC 3 +BEGIN + PROMPT 2 12 "Da gr.merc. " + FLAGS "U" + USE GMC KEY 1 SELECT CODTAB[4,5]=="" + INPUT CODTAB F_DAGRMERC + DISPLAY "Codice" CODTAB[1,3] + DISPLAY "Descrizione@50" S0 + OUTPUT F_DAGRMERC CODTAB[1,3] + OUTPUT F_DADESGRM S0 + CHECKTYPE NORMAL + GROUP 2 +END + +STRING F_DADESGRM 50 +BEGIN + PROMPT 22 12 "" + USE GMC KEY 2 SELECT CODTAB[4,5]=="" + INPUT S0 F_DADESGRM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB[1,3] + COPY OUTPUT F_DAGRMERC + CHECKTYPE NORMAL + GROUP 2 +END + +STRING F_AGRMERC 3 +BEGIN + PROMPT 2 13 "A gr.merc. " + FLAGS "U" + COPY USE F_DAGRMERC + INPUT CODTAB F_AGRMERC + COPY DISPLAY F_DAGRMERC + OUTPUT F_AGRMERC CODTAB[1,3] + OUTPUT F_ADESGRM S0 + CHECKTYPE NORMAL + GROUP 2 +END + +STRING F_ADESGRM 50 +BEGIN + PROMPT 22 13 "" + COPY USE F_DADESGRM + INPUT S0 F_ADESGRM + COPY DISPLAY F_DADESGRM + COPY OUTPUT F_AGRMERC + CHECKTYPE NORMAL + GROUP 2 +END + +//group 3: clienti + +NUMBER F_DACODCLI 6 +BEGIN + PROMPT 2 12 "Da cliente " + FLAGS "GR" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_DACODCLI + DISPLAY "Codice@6R" CODCF + DISPLAY "Ragione sociale@50" RAGSOC + OUTPUT F_DACODCLI CODCF + OUTPUT F_DADESCLI RAGSOC + CHECKTYPE NORMAL + FIELD #DACODCLI + GROUP 3 +END + +STRING F_DADESCLI 50 +BEGIN + PROMPT 24 12 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF "C" + INPUT RAGSOC F_DADESCLI + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice@6R" CODCF + COPY OUTPUT F_DACODCLI + CHECKTYPE NORMAL + GROUP 3 +END + +NUMBER F_ACODCLI 6 +BEGIN + PROMPT 2 13 "A cliente " + FLAGS "GR" + COPY USE F_DACODCLI + INPUT TIPOCF "C" + INPUT CODCF F_ACODCLI + COPY DISPLAY F_DACODCLI + OUTPUT F_ACODCLI CODCF + OUTPUT F_ADESCLI RAGSOC + CHECKTYPE NORMAL + FIELD #ACODCLI + GROUP 3 +END + +STRING F_ADESCLI 50 +BEGIN + PROMPT 24 13 "" + COPY USE F_DADESCLI + INPUT TIPOCF "C" + INPUT RAGSOC F_ADESCLI + COPY DISPLAY F_DADESCLI + COPY OUTPUT F_ACODCLI + CHECKTYPE NORMAL + GROUP 3 +END + +//dati per file excel + +BOOLEAN F_EXCEL +BEGIN + PROMPT 2 16 "Genera file in formato Excel (stat_ art/gmc/cli .xls)" + MESSAGE FALSE CLEAR,F_PATH + MESSAGE TRUE ENABLE,F_PATH +END + +STRING F_PATH 256 50 +BEGIN + PROMPT 2 17 "Cartella dove salvare il file " + DSELECT + FLAGS "M" + CHECKTYPE REQUIRED +END + +ENDPAGE + +ENDMASK diff --git a/ve/ve3800a.rep b/ve/ve3800a.rep new file mode 100755 index 000000000..08fcaae56 --- /dev/null +++ b/ve/ve3800a.rep @@ -0,0 +1,246 @@ + + + Statistiche per Articolo + +
+ + + + + + + + + + + + + + + + + + +
+
+ MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + +
  • +
    +
    + + A + + + B + + + + C + MESSAGE ADD,F1.101 + + + D + MESSAGE ADD,F1.102 + + + E + MESSAGE ADD,F1.103 + + + F + MESSAGE ADD,F1.104 + + + G + MESSAGE ADD,F1.105 + + + H + MESSAGE ADD,F1.106 + + + I + MESSAGE ADD,F1.107 + + + J + MESSAGE ADD,F1.108 + + + K + MESSAGE ADD,F1.109 + + + L + MESSAGE ADD,F1.110 + + + M + MESSAGE ADD,F1.111 + + + N + MESSAGE ADD,F1.112 + + + O + MESSAGE ADD,F1.113 + + + P + MESSAGE ADD,F1.114 + + + Q + MESSAGE ADD,F1.115 + + + R + MESSAGE ADD,F1.116 + + + S + MESSAGE ADD,F1.117 + + + T + MESSAGE ADD,F1.118 + + + U + MESSAGE ADD,F1.119 + + + V + MESSAGE ADD,F1.120 + + + W + MESSAGE ADD,F1.121 + + + X + MESSAGE ADD,F1.122 + + + Y + MESSAGE ADD,F1.123 + + + Z + MESSAGE ADD,F1.124 + + + + + AA + MESSAGE ADD,F1.125 + + + + AB + MESSAGE ADD,F1.126 + +
    +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + + ROUND(#THIS,2) + +
    + \ No newline at end of file diff --git a/ve/ve3800b.rep b/ve/ve3800b.rep new file mode 100755 index 000000000..f1eedc2d0 --- /dev/null +++ b/ve/ve3800b.rep @@ -0,0 +1,341 @@ + + + Statistiche per GrMerc + +
    + + + + + + + + + + + + + + + + + + +
    +
    + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + +
  • + +
    + +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    +
    + + + + + MESSAGE TABLEREAD,GMC,#99,S0 + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    + \ No newline at end of file diff --git a/ve/ve3800c.rep b/ve/ve3800c.rep new file mode 100755 index 000000000..55e616338 --- /dev/null +++ b/ve/ve3800c.rep @@ -0,0 +1,341 @@ + + + Statistiche per Cliente + +
    + + + + + + + + + + + + + + + + + + +
    +
    + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + +
  • + +
    + +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    +
    + + + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    + \ No newline at end of file diff --git a/ve/ve3800d.rep b/ve/ve3800d.rep new file mode 100755 index 000000000..6201da66d --- /dev/null +++ b/ve/ve3800d.rep @@ -0,0 +1,351 @@ + + + Statistiche Raggr. Cliente - Dett. Articolo + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + +
  • +
    + AD + + MESSAGE RESET,F2 + + AD + MESSAGE COPY,F2.99 + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC +MESSAGE COPY,F2.100 + +
    +
    +
    + + A + + + B + + + + C + MESSAGE ADD,F1.101 +MESSAGE ADD,F2.101 + + + D + MESSAGE ADD,F1.102 +MESSAGE ADD,F2.102 + + + E + MESSAGE ADD,F1.103 +MESSAGE ADD,F2.103 + + + F + MESSAGE ADD,F1.104 +MESSAGE ADD,F2.104 + + + G + MESSAGE ADD,F1.105 +MESSAGE ADD,F2.105 + + + H + MESSAGE ADD,F1.106 +MESSAGE ADD,F2.106 + + + I + MESSAGE ADD,F1.107 +MESSAGE ADD,F2.107 + + + J + MESSAGE ADD,F1.108 +MESSAGE ADD,F2.108 + + + K + MESSAGE ADD,F1.109 +MESSAGE ADD,F2.109 + + + L + MESSAGE ADD,F1.110 +MESSAGE ADD,F2.110 + + + M + MESSAGE ADD,F1.111 +MESSAGE ADD,F2.111 + + + N + MESSAGE ADD,F1.112 +MESSAGE ADD,F2.112 + + + O + MESSAGE ADD,F1.113 +MESSAGE ADD,F2.113 + + + P + MESSAGE ADD,F1.114 +MESSAGE ADD,F2.114 + + + Q + MESSAGE ADD,F1.115 +MESSAGE ADD,F2.115 + + + R + MESSAGE ADD,F1.116 +MESSAGE ADD,F2.116 + + + S + MESSAGE ADD,F1.117 +MESSAGE ADD,F2.117 + + + T + MESSAGE ADD,F1.118 +MESSAGE ADD,F2.118 + + + U + MESSAGE ADD,F1.119 +MESSAGE ADD,F2.119 + + + V + MESSAGE ADD,F1.120 +MESSAGE ADD,F2.120 + + + W + MESSAGE ADD,F1.121 +MESSAGE ADD,F2.121 + + + X + MESSAGE ADD,F1.122 +MESSAGE ADD,F2.122 + + + Y + MESSAGE ADD,F1.123 +MESSAGE ADD,F2.123 + + + Z + MESSAGE ADD,F1.124 +MESSAGE ADD,F2.124 + + + + + AA + MESSAGE ADD,F1.125 +MESSAGE ADD,F2.125 + + + + AB + MESSAGE ADD,F1.126 +MESSAGE ADD,F2.126 + +
    +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + +
    +
    + + + + + + + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    + \ No newline at end of file diff --git a/ve/ve3800e.rep b/ve/ve3800e.rep new file mode 100755 index 000000000..7a4a58491 --- /dev/null +++ b/ve/ve3800e.rep @@ -0,0 +1,399 @@ + + + Statistiche Raggr. Articolo - Dett. Cliente + +
    + + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + 99 HIDE +ELSE + 99 SHOW +THEN + + + + + + + + + + + + + + + + + + + + + +
    +
    + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + 97 SHOW + 98 SHOW + 99 SHOW +ELSE + 97 HIDE + 98 HIDE + 99 HIDE +THEN + + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + + + + + + + #DACODCLI + + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#98,RAGSOC + +
  • +
    + A + + MESSAGE RESET,F2 + + A + MESSAGE COPY,F2.99 + + + B + MESSAGE ISAMREAD,47,CODART=#99,DESCR +MESSAGE COPY,F2.100 + +
    +
    +
    + + + C + MESSAGE ADD,F1.101 +MESSAGE ADD,F2.101 + + + D + MESSAGE ADD,F1.102 +MESSAGE ADD,F2.102 + + + E + MESSAGE ADD,F1.103 +MESSAGE ADD,F2.103 + + + F + MESSAGE ADD,F1.104 +MESSAGE ADD,F2.104 + + + G + MESSAGE ADD,F1.105 +MESSAGE ADD,F2.105 + + + H + MESSAGE ADD,F1.106 +MESSAGE ADD,F2.106 + + + I + MESSAGE ADD,F1.107 +MESSAGE ADD,F2.107 + + + J + MESSAGE ADD,F1.108 +MESSAGE ADD,F2.108 + + + K + MESSAGE ADD,F1.109 +MESSAGE ADD,F2.109 + + + L + MESSAGE ADD,F1.110 +MESSAGE ADD,F2.110 + + + M + MESSAGE ADD,F1.111 +MESSAGE ADD,F2.111 + + + N + MESSAGE ADD,F1.112 +MESSAGE ADD,F2.112 + + + O + MESSAGE ADD,F1.113 +MESSAGE ADD,F2.113 + + + P + MESSAGE ADD,F1.114 +MESSAGE ADD,F2.114 + + + Q + MESSAGE ADD,F1.115 +MESSAGE ADD,F2.115 + + + R + MESSAGE ADD,F1.116 +MESSAGE ADD,F2.116 + + + S + MESSAGE ADD,F1.117 +MESSAGE ADD,F2.117 + + + T + MESSAGE ADD,F1.118 +MESSAGE ADD,F2.118 + + + U + MESSAGE ADD,F1.119 +MESSAGE ADD,F2.119 + + + V + MESSAGE ADD,F1.120 +MESSAGE ADD,F2.120 + + + W + MESSAGE ADD,F1.121 +MESSAGE ADD,F2.121 + + + X + MESSAGE ADD,F1.122 +MESSAGE ADD,F2.122 + + + Y + MESSAGE ADD,F1.123 +MESSAGE ADD,F2.123 + + + Z + MESSAGE ADD,F1.124 +MESSAGE ADD,F2.124 + + + + + AA + MESSAGE ADD,F1.125 +MESSAGE ADD,F2.125 + + + + AB + MESSAGE ADD,F1.126 +MESSAGE ADD,F2.126 + + + AD + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC + +
    +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + +
    +
    + + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + 98 HIDE +ELSE + 98 SHOW +THEN + + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + "H2" HIDE \ nasconde sezioni e campi indesiderati + "B1" HIDE +ELSE + "H2" SHOW \ mostra sezioni e campi desiderati + "B1" SHOW +THEN + + \ No newline at end of file diff --git a/ve/ve3800f.rep b/ve/ve3800f.rep new file mode 100755 index 000000000..497a2e7d3 --- /dev/null +++ b/ve/ve3800f.rep @@ -0,0 +1,448 @@ + + + Statistiche Raggr. Cliente - Dett. Gr.Merc. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + +
  • +
    + AD + + MESSAGE RESET,F2 + + AD + MESSAGE COPY,F2.99 + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC +MESSAGE COPY,F2.100 + +
    + +
    + +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + +
    +
    + + + + + + + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    +
    + + + + + MESSAGE TABLEREAD,GMC,#99,S0 + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    + \ No newline at end of file diff --git a/ve/ve3800g.rep b/ve/ve3800g.rep new file mode 100755 index 000000000..d28088bc4 --- /dev/null +++ b/ve/ve3800g.rep @@ -0,0 +1,496 @@ + + + Statistiche Raggr. Gr.Merc. - Dett. Cliente + +
    + + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + 99 HIDE +ELSE + 99 SHOW +THEN + + + + + + + + + + + + + + + + + + + + + +
    +
    + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + 97 SHOW + 98 SHOW + 99 SHOW +ELSE + 97 HIDE + 98 HIDE + 99 HIDE +THEN + + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + + + + + + + #DACODCLI + + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#98,RAGSOC + +
  • +
    + AC + + MESSAGE RESET,F2 + + AC + MESSAGE COPY,F2.99 + + + MESSAGE TABLEREAD,GMC,#99,S0 +MESSAGE COPY,F2.100 + +
    + +
    +
    + + + C + MESSAGE ADD,F1.101 +MESSAGE ADD,F2.101 +MESSAGE ADD,F3.101 + + + D + MESSAGE ADD,F1.102 +MESSAGE ADD,F2.102 +MESSAGE ADD,F3.102 + + + E + MESSAGE ADD,F1.103 +MESSAGE ADD,F2.103 +MESSAGE ADD,F3.103 + + + F + MESSAGE ADD,F1.104 +MESSAGE ADD,F2.104 +MESSAGE ADD,F3.104 + + + G + MESSAGE ADD,F1.105 +MESSAGE ADD,F2.105 +MESSAGE ADD,F3.105 + + + H + MESSAGE ADD,F1.106 +MESSAGE ADD,F2.106 +MESSAGE ADD,F3.106 + + + I + MESSAGE ADD,F1.107 +MESSAGE ADD,F2.107 +MESSAGE ADD,F3.107 + + + J + MESSAGE ADD,F1.108 +MESSAGE ADD,F2.108 +MESSAGE ADD,F3.108 + + + K + MESSAGE ADD,F1.109 +MESSAGE ADD,F2.109 +MESSAGE ADD,F3.109 + + + L + MESSAGE ADD,F1.110 +MESSAGE ADD,F2.110 +MESSAGE ADD,F3.110 + + + M + MESSAGE ADD,F1.111 +MESSAGE ADD,F2.111 +MESSAGE ADD,F3.111 + + + N + MESSAGE ADD,F1.112 +MESSAGE ADD,F2.112 +MESSAGE ADD,F3.112 + + + O + MESSAGE ADD,F1.113 +MESSAGE ADD,F2.113 +MESSAGE ADD,F3.113 + + + P + MESSAGE ADD,F1.114 +MESSAGE ADD,F2.114 +MESSAGE ADD,F3.114 + + + Q + MESSAGE ADD,F1.115 +MESSAGE ADD,F2.115 +MESSAGE ADD,F3.115 + + + R + MESSAGE ADD,F1.116 +MESSAGE ADD,F2.116 +MESSAGE ADD,F3.116 + + + S + MESSAGE ADD,F1.117 +MESSAGE ADD,F2.117 +MESSAGE ADD,F3.117 + + + T + MESSAGE ADD,F1.118 +MESSAGE ADD,F2.118 +MESSAGE ADD,F3.118 + + + U + MESSAGE ADD,F1.119 +MESSAGE ADD,F2.119 +MESSAGE ADD,F3.119 + + + V + MESSAGE ADD,F1.120 +MESSAGE ADD,F2.120 +MESSAGE ADD,F3.120 + + + W + MESSAGE ADD,F1.121 +MESSAGE ADD,F2.121 +MESSAGE ADD,F3.121 + + + X + MESSAGE ADD,F1.122 +MESSAGE ADD,F2.122 +MESSAGE ADD,F3.122 + + + Y + MESSAGE ADD,F1.123 +MESSAGE ADD,F2.123 +MESSAGE ADD,F3.123 + + + Z + MESSAGE ADD,F1.124 +MESSAGE ADD,F2.124 +MESSAGE ADD,F3.124 + + + + + AA + MESSAGE ADD,F1.125 +MESSAGE ADD,F2.125 +MESSAGE ADD,F3.125 + + + + AB + MESSAGE ADD,F1.126 +MESSAGE ADD,F2.126 +MESSAGE ADD,F3.126 + + + AD + + + MESSAGE ISAMREAD,20,TIPOCF='C'!CODCF=#99,RAGSOC + +
    +
    + + + + + #REPORT.PAGE + +
    +
    + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + +
    +
    + + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + 98 HIDE +ELSE + 98 SHOW +THEN + + + + + + + + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + ROUND(#THIS,2) + + + + + + ROUND(#THIS,2) + +
    + + #DACODCLI @ #ACODCLI @ = \ se clienti coincidono +#DACODCLI @ EMPTY= NEGATE AND \ e se non sono vuoti +IF + "H2" HIDE \ nasconde sezioni e campi indesiderati + "B1" HIDE +ELSE + "H2" SHOW \ mostra sezioni e campi desiderati + "B1" SHOW +THEN + + \ No newline at end of file diff --git a/ve/ve3900.cpp b/ve/ve3900.cpp index 3ca560de6..ecfafdfc0 100755 --- a/ve/ve3900.cpp +++ b/ve/ve3900.cpp @@ -23,7 +23,7 @@ bool TGeneral_sell::create() //se non paghi ti stronco!!! const TDate oggi(TODAY); - if (oggi >= 20091220) + if (oggi >= 20091230) return false; } return TKlarkKent_app::create(); diff --git a/ve/ve3900a.rep b/ve/ve3900a.rep index 75c689777..a6b22ea3d 100755 --- a/ve/ve3900a.rep +++ b/ve/ve3900a.rep @@ -42,7 +42,13 @@ MESSAGE RESET,F2.100|RESET,F2.110|RESET,F2.120|RESET,F2.130|RESET,F2.140 MESSAGE RESET,B1 - + + TIPOCF + +
  • +
  • + + @@ -71,10 +77,10 @@ MESSAGE RESET,B1 - + CODCF - + MESSAGE ISAMREAD,20,TIPOCF=C!CODCF=#101,RAGSOC
  • @@ -190,7 +196,7 @@ THEN
    USE DOC KEY 3 -SELECT (BETWEEN(CODNUM,#CODNUM,#CODNUM))(BETWEEN(STATO,#DASTATO,#ASTATO))(BETWEEN(TIPODOC,#TIPODOC,#TIPODOC))(BETWEEN(CODCF,#DACLIFO,#ACLIFO)) +SELECT (BETWEEN(CODNUM,#CODNUM,#CODNUM))(BETWEEN(STATO,#DASTATO,#ASTATO))(BETWEEN(TIPODOC,#TIPODOC,#TIPODOC))STR(BETWEEN(CODCF,#DACLIFO,#ACLIFO)) BY CODCF NDOC TIPODOC FROM DATADOC=#DADATA PROVV='D' ANNO=#ANNO CODNUM=#CODNUM TO DATADOC=#ADATA PROVV='D' ANNO=#ANNO CODNUM=#CODNUM diff --git a/ve/ve3900a.uml b/ve/ve3900a.uml index 28ccc6def..d83acb6ee 100755 --- a/ve/ve3900a.uml +++ b/ve/ve3900a.uml @@ -93,7 +93,7 @@ BEGIN CHECKTYPE NORMAL END -NUMBER F_DASTATO 1 +STRING F_DASTATO 1 BEGIN PROMPT 2 5 "Da stato " USE %STD @@ -118,7 +118,7 @@ BEGIN CHECKTYPE NORMAL END -NUMBER F_ASTATO 1 +STRING F_ASTATO 1 BEGIN PROMPT 2 6 "A stato " USE %STD @@ -166,7 +166,7 @@ END NUMBER F_DACLIFO 6 BEGIN PROMPT 2 11 "Da Cliente " - USE 20 + USE LF_CLIFO INPUT TIPOCF "C" INPUT CODCF F_DACLIFO DISPLAY "Codice" CODCF @@ -181,7 +181,7 @@ END STRING F_DARAGSOC 50 BEGIN PROMPT 25 11 "" - USE 20 KEY 2 + USE LF_CLIFO KEY 2 INPUT TIPOCF "C" INPUT RAGSOC F_DARAGSOC DISPLAY "Ragione Sociale@50" RAGSOC @@ -193,7 +193,7 @@ END NUMBER F_ACLIFO 6 BEGIN PROMPT 2 12 "A Cliente " - USE 20 + USE LF_CLIFO INPUT TIPOCF "C" INPUT CODCF F_ACLIFO DISPLAY "Codice" CODCF @@ -208,7 +208,7 @@ END STRING F_ARAGSOC 50 BEGIN PROMPT 25 12 "" - USE 20 KEY 2 + USE LF_CLIFO KEY 2 INPUT TIPOCF "C" INPUT RAGSOC F_ARAGSOC DISPLAY "Ragione Sociale@50" RAGSOC