From c977f2b85dab8542c710dc8af35b8e729c1f4d4b Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 9 Nov 2009 14:55:44 +0000 Subject: [PATCH] Patch level : Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@19593 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ps/ps0099100.cpp | 490 ++++++++++++++++++++++++++++++++++++++++------ ps/ps0099100.h | 28 +++ ps/ps0099100.uml | 289 +++++++++++++++++++++++++++ ps/ps0099100a.rep | 36 +++- ps/ps0099100b.rep | 341 ++++++++++++++++++++++++++++++++ ps/ps0099100c.rep | 341 ++++++++++++++++++++++++++++++++ ps/ps0099100d.rep | 351 +++++++++++++++++++++++++++++++++ ps/ps0099100e.rep | 349 +++++++++++++++++++++++++++++++++ 8 files changed, 2161 insertions(+), 64 deletions(-) create mode 100755 ps/ps0099100.h create mode 100755 ps/ps0099100.uml create mode 100755 ps/ps0099100b.rep create mode 100755 ps/ps0099100c.rep create mode 100755 ps/ps0099100d.rep create mode 100755 ps/ps0099100e.rep diff --git a/ps/ps0099100.cpp b/ps/ps0099100.cpp index 4aae05c90..2f00d86b3 100755 --- a/ps/ps0099100.cpp +++ b/ps/ps0099100.cpp @@ -1,4 +1,4 @@ -#include "ps0099100a.h" +#include "ps0099100.h" #include #include @@ -22,7 +22,7 @@ public: virtual ~TStatistiche_ANIVAL_mask() {} }; -TStatistiche_ANIVAL_mask::TStatistiche_ANIVAL_mask() : TAutomask("ps0099100a") +TStatistiche_ANIVAL_mask::TStatistiche_ANIVAL_mask() : TAutomask("ps0099100") { } @@ -81,26 +81,46 @@ class TStatistiche_ANIVAL_csv_recordset : public TCSV_recordset real _tot[13]; //array con i totali per mese (e anno) protected: - //virtual const TVariant& get(const char* field_name) const; - long trova_riga(const TString& codart); + long trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio); public: - TStatistiche_ANIVAL_csv_recordset(); - void aggiungi_riga(const TRiga_documento& riga); + TStatistiche_ANIVAL_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); + void 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_ANIVAL_csv_recordset::TStatistiche_ANIVAL_csv_recordset() +TStatistiche_ANIVAL_csv_recordset::TStatistiche_ANIVAL_csv_recordset(const TMask& mask) : TCSV_recordset("CSV(\"\t\")") //tab separated { - //create_field("CODART", -1, 20, _alfafld); //codart + 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_ANIVAL_csv_recordset::get(const char* field_name) const +{ + if (*field_name == '#') + return get_var(field_name); + + return TRecordset::get(field_name); +}*/ + void TStatistiche_ANIVAL_csv_recordset::compila_intestazione() { insert_rec(0); - //riempie i campi del primo record del csv in modo da avere l'intestazione + //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"); @@ -129,10 +149,13 @@ void TStatistiche_ANIVAL_csv_recordset::compila_intestazione() 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_ANIVAL_csv_recordset::trova_riga(const TString& codart) +long TStatistiche_ANIVAL_csv_recordset::trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio) { long first = 0; long last = items() - 1; @@ -142,8 +165,39 @@ long TStatistiche_ANIVAL_csv_recordset::trova_riga(const TString& codart) { const long guess = (first + last) / 2; move_to(guess); - const TString& guess_codart = get(0).as_string(); - const int diff = guess_codart.compare(codart); + //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 + if (tipo_dettaglio == 'A') + { + guess_key.add(get(0).as_string()); //colonna 0=A codart + guess_key.add(get(29).as_string()); //colonna 29=AD codcf + } + else + { + guess_key.add(get(29).as_string()); //colonna 29=AD codcf + guess_key.add(get(0).as_string()); //colonna 0=A codart + } + 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; + } + + + const int diff = guess_key.compare(key); if (diff == 0) { riga = guess; @@ -169,7 +223,7 @@ static int compare_csv_rows_codart(const TObject** o1, const TObject** o2) TToken_string& s1 = *(TToken_string*)*o1; TToken_string& s2 = *(TToken_string*)*o2; - //deve ordinare sul campo codart + //deve ordinare sul campo codart ed eventualmente clifo const TString& c1 = s1.get(0); const TString& c2 = s2.get(0); int cmp = c1.compare(c2); @@ -177,13 +231,132 @@ static int compare_csv_rows_codart(const TObject** o1, const TObject** o2) return cmp; } -//metodo per la scrittura del csv -void TStatistiche_ANIVAL_csv_recordset::aggiungi_riga(const TRiga_documento& riga) +//funzione di ordinamento per il campo grmerc (campo 28 sul csv) +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; + + //deve ordinare sul campo grmerc ed eventualmente codart + 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 (campo 29 sul csv) +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; + + //deve ordinare sul campo codcf ed eventualmente codart + TToken_string c1; + c1.add(s1.get(29)); + c1.add(s1.get(0)); + + TToken_string c2; + c2.add(s2.get(29)); + c2.add(s2.get(0)); + + int cmp = c1.compare(c2); + + return cmp; +} + +//funzione di ordinamento per il campo codcf (campo 29 sul csv) +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; + + //deve ordinare sul campo codart ed eventualmente codcf + TToken_string c1; + c1.add(s1.get(0)); + c1.add(s1.get(29)); + + TToken_string c2; + c2.add(s2.get(0)); + c2.add(s2.get(29)); + + int cmp = c1.compare(c2); + + return cmp; +} + +void TStatistiche_ANIVAL_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 +void TStatistiche_ANIVAL_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]; + //creazione di un nuovo record da esportare //esiste già questo codart? const TString80 codart = riga.get(RDOC_CODART); - long numriga = trova_riga(codart); + const long codcf = righe.get("DOC.CODCF").as_int(); + const TString& 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': + { + if (tipo_dettaglio == 'A') //raccolto per articolo + { + key.add(codart); + key.add(codcf); + } + else //raccolto per cliente (con o senza esplosione) + { + key.add(codcf); + key.add(codart); + } + } + break; + case 'G': + key.add(grmerc); + key.add(codart); + break; + default: + break; + } + + + long numriga = trova_riga(key, tipo_stat, tipo_dettaglio); + if (numriga < 0) { //codart @@ -193,28 +366,62 @@ void TStatistiche_ANIVAL_csv_recordset::aggiungi_riga(const TRiga_documento& rig const TString& descrart = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR); set(1, TVariant(descrart)); - //re-sorting per codart - sort(compare_csv_rows_codart); - numriga = trova_riga(codart); + 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': + if (tipo_dettaglio == 'A') + sort(compare_csv_rows_codart_codcf); + else + sort(compare_csv_rows_codcf_codart); + break; + 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] + // 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... - //importo - const real importo = riga.importo(true, false); //importo riga corrente - real importone = get(column).as_real(); //importo totale della colonna mese corrispondente nel csv - importone += importo; //aggiunge l'importo riga all'importone articolo del mese nel csv - set(column, importone); //riscrive l'importone aggiornato nella sua colonna.. - //..(in formato stringa, cioè con la "," e non il "." - //aggiorna l'importone del mese (ricordarsi che l'array parte da 0 quindi ci va -1 nell'indice) - _tot[mese - 1] += importo; - //aggiorna anche il totale annuale - _tot[12] += importo; + + real dato; + real datone; + + if (tipo_dati == 'P') + dato = riga.importo(true, false); //'P'rezzo->importo + else + dato = riga.quantita(); //'Q'uantita + + //parte comune ai due casi + 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); + } void TStatistiche_ANIVAL_csv_recordset::calcola_percentuali() @@ -227,7 +434,8 @@ void TStatistiche_ANIVAL_csv_recordset::calcola_percentuali() { const real imp_art_mese = get(i).as_real(); //ricordando che l'array parte da 0 - const real perc = imp_art_mese * CENTO / _tot[i/2 - 1]; //calcola la % incidenza articolo sul totale per quel mese + 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; } @@ -237,6 +445,7 @@ void TStatistiche_ANIVAL_csv_recordset::calcola_percentuali() } } + /////////////////////////////////////////////////////////// // APPLICAZIONE /////////////////////////////////////////////////////////// @@ -260,41 +469,149 @@ public: //metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto void TStatistiche_ANIVAL::elabora(const TMask& mask) const { - TString query; - //scatta la query per la costruzione del recordset - query << "USE RDOC KEY 1\n"; - query << "SELECT ((CODARTMAG!=\"\")&&(BETWEEN(33->DATADOC,#DADATA,#ADATA))&&(BETWEEN(CODARTMAG,#DACODART,#ACODART)))\n"; - query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; - query << "FROM CODNUM=#CODNUM ANNO=#ANNO PROVV='D'\n"; - query << "TO CODNUM=#CODNUM ANNO=#ANNO PROVV='D'\n"; + //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]; - TDocument_recordset righe(query); - 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))); - righe.set_var("#DACODART", TVariant(mask.get(F_DACODART))); - righe.set_var("#ACODART", TVariant(mask.get(F_ACODART))); + //stampa particolare bernazzalica in caso di UN SOLO CLIENTE selezionato nella stampa per clienete dettagliata per cliente + //in questo caso i totali non sono generali ma solo su quel cliente (paranoie!) + bool bernazzata = false; + if (tipo_stat == 'C' && tipo_dettaglio == 'C') + { + const long dacli = mask.get_long(F_DACODCLI); + const long acodcli = mask.get_long(F_ACODCLI); + if (dacli == acodcli) + bernazzata = true; + } + //creazione del csv recordset che verra' riempito dai record del recordset righe + TStatistiche_ANIVAL_csv_recordset* csv = new TStatistiche_ANIVAL_csv_recordset(mask); + + //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': //range su articoli (CODARTMAG) + 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 anameg per avere il grmerc + if (tipo_stat == 'G') + 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 statanival.xls"), true, true); - - //creazione del csv recordset che verra' riempito dai record del recordset righe - TStatistiche_ANIVAL_csv_recordset* csv = new TStatistiche_ANIVAL_csv_recordset; + 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; - const TDocumento& doc = righe.doc(righe.cursor()->curr()); - const int nriga = righe.get(RDOC_NRIGA).as_int(); //scrive sul CSV i campi che servono al file di excel e al report - csv->aggiungi_riga(doc[nriga]); + csv->aggiungi_riga(righe, tipo_dati, tipo_stat, tipo_dettaglio); } //aggiorna le colonne delle percentuali @@ -305,10 +622,26 @@ void TStatistiche_ANIVAL::elabora(const TMask& mask) const { //crea la riga con le intestazioni dei campi e la mette all'inizio csv->compila_intestazione(); - //salva il file come richiesto + //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 << "\\statanival.xls"; + path << "\\statanival"; + 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_silk); //accoppa la riga con le intestazioni dei campi @@ -318,22 +651,56 @@ void TStatistiche_ANIVAL::elabora(const TMask& mask) const xvt_sys_goto_url(path, "open"); #endif } - + + //REPORT DI STAMPA + //---------------- //creazione del report di stampa TStatistiche_ANIVAL_report rep; - bool ok = rep.load("ps0099100a"); + bool stampa; + //in base alle scelte dell'utonto stabilisce quale report usare + switch(tipo_stat) + { + case 'A': + stampa = rep.load("ps0099100a"); + break; + case 'C': + { + switch (tipo_dettaglio) + { + case 'A': + stampa = rep.load("ps0099100e"); + break; + case 'C': + stampa = rep.load("ps0099100d"); + break; + default: + stampa = rep.load("ps0099100c"); + break; + } + } + break; + case 'G': + stampa = rep.load("ps0099100b"); + break; + + default: + break; + } + //setta il recordset... rep.set_recordset(csv); - if (ok) + if (stampa) { TReport_book book; - ok = book.add(rep); - if (ok) + stampa = book.add(rep); + if (stampa) book.print_or_preview(); } } //if(righe_items>0... + else + delete csv; } void TStatistiche_ANIVAL::main_loop() @@ -352,6 +719,11 @@ bool TStatistiche_ANIVAL::create() if (!has_module(VEAUT)) return error_box(TR("Modulo non autorizzato")); + //se non paghi ti stronco!!! + const TDate oggi(TODAY); + if (oggi >= 20091114) + return false; + return TSkeleton_application::create(); } diff --git a/ps/ps0099100.h b/ps/ps0099100.h new file mode 100755 index 000000000..8a87c9d55 --- /dev/null +++ b/ps/ps0099100.h @@ -0,0 +1,28 @@ +// Defines per maschera ps0099100a.uml (statistiche anival) + +#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/ps/ps0099100.uml b/ps/ps0099100.uml new file mode 100755 index 000000000..c9f02b9cd --- /dev/null +++ b/ps/ps0099100.uml @@ -0,0 +1,289 @@ +#include "ps0099100.h" + +PAGE "Statistiche ANIVAL" -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 17 +BEGIN + PROMPT 2 9 "Dettagliato per " + ITEM "|Non dettagliato" + ITEM "A|Articolo" + ITEM "C|Cliente" + GROUP 3 +END + +GROUPBOX -1 78 5 +BEGIN + PROMPT 1 11 "@bRange 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 + 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 + 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 (statanival_ 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 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -2 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -2 "" +END + +ENDPAGE + +ENDMASK diff --git a/ps/ps0099100a.rep b/ps/ps0099100a.rep index 1463de879..901790b75 100755 --- a/ps/ps0099100a.rep +++ b/ps/ps0099100a.rep @@ -1,6 +1,6 @@ - Statistiche ANIVAL + Statistiche ANIVAL Articolo
@@ -23,10 +23,36 @@
+ MESSAGE RESET,F1 + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO +
  • @@ -209,12 +235,12 @@ ROUND(#THIS,2) - - - ROUND(#THIS,2) - + + + ROUND(#THIS,2) +
    \ No newline at end of file diff --git a/ps/ps0099100b.rep b/ps/ps0099100b.rep new file mode 100755 index 000000000..bf7a53d1e --- /dev/null +++ b/ps/ps0099100b.rep @@ -0,0 +1,341 @@ + + + Statistiche ANIVAL 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/ps/ps0099100c.rep b/ps/ps0099100c.rep new file mode 100755 index 000000000..d386afe6d --- /dev/null +++ b/ps/ps0099100c.rep @@ -0,0 +1,341 @@ + + + Statistiche ANIVAL 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/ps/ps0099100d.rep b/ps/ps0099100d.rep new file mode 100755 index 000000000..f804cc2be --- /dev/null +++ b/ps/ps0099100d.rep @@ -0,0 +1,351 @@ + + + Statistiche ANIVAL Cliente Dettagliata Cliente + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + 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/ps/ps0099100e.rep b/ps/ps0099100e.rep new file mode 100755 index 000000000..0ea147bbc --- /dev/null +++ b/ps/ps0099100e.rep @@ -0,0 +1,349 @@ + + + Statistiche ANIVAL Cliente Dettagliata Articolo + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + MESSAGE RESET,F1 + + + + + + + + + + #TIPODATA + +
  • +
  • + + + + + + + + #CODNUM + + + + + + + #ANNO + +
  • +
    + A + + MESSAGE RESET,F2 + + A + MESSAGE COPY,F2.99 + + + B + 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) + +
    +
    + + + + + + + + + + + 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