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
+
+
+
+ AC
+ MESSAGE RESET,F2
+
+ AC
+ MESSAGE COPY,F2.99
+
+
+
+
+
+ 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 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
+
+
+
+ AD
+ MESSAGE RESET,F2
+
+ AD
+ MESSAGE COPY,F2.99
+
+
+
+
+
+ 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/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
+
+
+
+ AC
+
+ MESSAGE RESET,F3
+
+ AC
+ MESSAGE COPY,F3.99
+
+
+
+
+
+ A
+
+
+ B
+
+
+
+ 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
+
+
+
+
+
+
+
+ #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
+
+
+
+ A
+ MESSAGE RESET,F3
+
+ A
+ MESSAGE COPY,F3.99
+
+
+ B
+ MESSAGE ISAMREAD,47,CODART=#99,DESCR
+MESSAGE COPY,F3.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)
+
+
+
+
+
+
+
+
+ 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