diff --git a/ve/ve3800.cpp b/ve/ve3800.cpp index 3ac779b46..cb0e9ae0e 100755 --- a/ve/ve3800.cpp +++ b/ve/ve3800.cpp @@ -76,10 +76,10 @@ public: }; ///////////////////////////////////////////////////////////// -// CSV RECORDSET +// RECORDSET ///////////////////////////////////////////////////////////// -class TStatistiche_ve_csv_recordset : public TCSV_recordset +class TStatistiche_ve_recordset : public TAS400_recordset { real _tot[13]; //array con i totali per mese (e anno) @@ -87,78 +87,51 @@ 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); } + TStatistiche_ve_recordset(); 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 +TStatistiche_ve_recordset::TStatistiche_ve_recordset() +: TAS400_recordset("AS400(512)") { - 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"); + create_field("CODART", -1, 20, _alfafld); + create_field("DESCRIZIONE", -1, 50, _alfafld); + create_field("GENNAIO", -1, 10, _realfld); + create_field("PGEN", -1, 9, _realfld); + create_field("FEBBRAIO", -1, 10, _realfld); + create_field("PFEB", -1, 9, _realfld); + create_field("MARZO", -1, 10, _realfld); + create_field("PMAR", -1, 9, _realfld); + create_field("APRILE", -1, 10, _realfld); + create_field("PAPR", -1, 9, _realfld); + create_field("MAGGIO", -1, 10, _realfld); + create_field("PMAG", -1, 9, _realfld); + create_field("GIUGNO", -1, 10, _realfld); + create_field("PGIU", -1, 9, _realfld); + create_field("LUGLIO", -1, 10, _realfld); + create_field("PLUG", -1, 9, _realfld); + create_field("AGOSTO", -1, 10, _realfld); + create_field("PAGO", -1, 9, _realfld); + create_field("SETTEMBRE", -1, 10, _realfld); + create_field("PSET", -1, 9, _realfld); + create_field("OTTOBRE", -1, 10, _realfld); + create_field("POTT", -1, 9, _realfld); + create_field("NOVEMBRE", -1, 10, _realfld); + create_field("PNOV", -1, 9, _realfld); + create_field("DICEMBRE", -1, 10, _realfld); + create_field("PDIC", -1, 9, _realfld); + create_field("ANNO", -1, 11, _realfld); + create_field("PANNO", -1, 9, _realfld); + create_field("GRMERC", -1, 5, _alfafld); + create_field("CODCLI", -1, 6, _intfld); } //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 TStatistiche_ve_recordset::trova_riga(const TToken_string& key, const char tipo_stat, const char tipo_dettaglio) { long first = 0; long last = items() - 1; @@ -176,41 +149,41 @@ long TStatistiche_ve_csv_recordset::trova_riga(const TToken_string& key, const c switch (tipo_stat) { case 'A': //articolo - guess_key.add(get(0).as_string()); + guess_key.add(get("CODART").as_string()); break; case 'C': //cliente-codart codart-cliente { - switch (tipo_dettaglio) + switch (tipo_dettaglio) { case 'A': { - guess_key.add(get(0).as_string()); //colonna 0=A codart - TString8 codcf = get(29).as_string(); + guess_key.add(get("CODART").as_string()); //colonna 0=A codart + TString8 codcf = get("CODCLI").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 = get("CODCLI").as_string(); //colonna 29=AD codcf guess_key.right_just(6); - guess_key.add(get(0).as_string()); //colonna 0=A codart + guess_key.add(get("CODART").as_string()); //colonna 0=A codart break; case 'G': - guess_key = get(29).as_string(); //colonna 29=AD codcf + guess_key = get("CODCLI").as_string(); //colonna 29=AD codcf guess_key.right_just(6); - guess_key.add(get(28).as_string()); //colonna 28=AC grmerc + guess_key.add(get("GRMERC").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(); + guess_key.add(get("GRMERC").as_string()); //colonna 28=AC grmerc + TString8 codcf = get("CODCLI").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 = get("CODCLI").as_string(); //colonna 29=AD codcf guess_key.right_just(6); break; } //switch(tipo_dettaglio... @@ -218,8 +191,8 @@ long TStatistiche_ve_csv_recordset::trova_riga(const TToken_string& key, const c break; case 'G': //grmerc-codart - guess_key.add(get(28).as_string()); //colonna 28=AC grmerc - guess_key.add(get(0).as_string()); + guess_key.add(get("GRMERC").as_string()); //colonna 28=AC grmerc + guess_key.add(get("CODART").as_string()); break; default: @@ -250,140 +223,32 @@ long TStatistiche_ve_csv_recordset::trova_riga(const TToken_string& key, const c // METODI DI COMPARE /////////////////////////////////////////////// +static TStatistiche_ve_recordset* _curr_recset = NULL; +static TToken_string _curr_order; + //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) +static int compare_recset_rows(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); + int cmp = 0; + FOR_EACH_TOKEN(_curr_order, fld) + { + const TRecordset_column_info& ci = _curr_recset->column_info(fld); + const TString& f1 = s1.mid(ci._pos, ci._width); + const TString& f2 = s2.mid(ci._pos, ci._width); + cmp = f1.compare(f2); + if (cmp != 0) + break; + } 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) +void TStatistiche_ve_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); @@ -403,7 +268,7 @@ void TStatistiche_ve_csv_recordset::aggiungi_ai_totali(const TRiga_documento& ri } //metodo per la scrittura del csv -bool TStatistiche_ve_csv_recordset::aggiungi_riga(TDocument_recordset& righe, +bool TStatistiche_ve_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()); @@ -422,10 +287,14 @@ bool TStatistiche_ve_csv_recordset::aggiungi_riga(TDocument_recordset& righe, //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(); + TString80 codart = riga.get(RDOC_CODART); + codart.left_just(20); + + TString8 codcf = righe.get("DOC.CODCF").as_string(); codcf.right_just(6); - const TString8 grmerc = righe.get("ANAMAG.GRMERC").as_string(); + + TString8 grmerc = righe.get("ANAMAG.GRMERC").as_string(); + grmerc.left_just(5); //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 @@ -479,39 +348,41 @@ bool TStatistiche_ve_csv_recordset::aggiungi_riga(TDocument_recordset& righe, { //codart new_rec(""); - set(0, TVariant(codart)); + set("CODART", codart); //descrart const TString& descrart = cache().get(LF_ANAMAG, codart, ANAMAG_DESCR); - set(1, TVariant(descrart)); + set("DESCRIZIONE", descrart); - set(28, TVariant(grmerc)); - set(29, TVariant(codcf)); + set("GRMERC", grmerc); + set("CODCLI", 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 'A': _curr_order = "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 + case 'A': _curr_order = "CODART|CODCLI"; break; + case 'C': _curr_order = "CODCLI|CODART"; break; + case 'G': _curr_order = "CODCLI|GRMERC"; break; + case 'M': _curr_order = "GRMERC|CODCLI"; break; + default: _curr_order = "CODCLI"; break; //ordinamento quando non è richiesto il dettaglio } //switch(tipo_dettaglio... break; } //case 'C' - case 'G': sort(compare_csv_rows_grmerc_codart); break; + case 'G': _curr_order = "GRMERC|CODART"; break; default: break; } - - //chiave.add(codart); + _curr_recset = this; + sort(compare_recset_rows); + _curr_recset = NULL; + numriga = trova_riga(key, tipo_stat, tipo_dettaglio); CHECKS(numriga >= 0, "Articolo bastardo ", (const char*)codart); @@ -522,41 +393,47 @@ bool TStatistiche_ve_csv_recordset::aggiungi_riga(TDocument_recordset& righe, //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... - + TString16 str_mese = itom(mese); + str_mese.upper(); //parte comune ai due casi - real datone = get(column).as_real(); //valora totale della colonna mese corrispondente nel csv + real datone = get(str_mese).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 ".") + set(str_mese, 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); + set("GRMERC", grmerc); //aggiunge pure il cliente - set(29, codcf); + set("CODCLI", codcf); return true; } -void TStatistiche_ve_csv_recordset::calcola_percentuali() +void TStatistiche_ve_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) + TString16 str_mese; + for (int i = 1; i <= 12; i++) { - const real imp_art_mese = get(i).as_real(); + str_mese = itom(i); + str_mese.upper(); + const real imp_art_mese = get(str_mese).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 + real perc = imp_art_mese * CENTO / _tot[i - 1]; //calcola la % incidenza articolo sul totale per quel mese perc.round(5); - set(i + 1, perc); + str_mese.cut(3); + str_mese.insert("P"); + set(str_mese, 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); + set("ANNO", totale_anno); + real perc_anno = totale_anno * CENTO / _tot[12]; //calcola la % incidenza articolo sul totale annuale + perc_anno.round(5); + set("PANNO", perc_anno); } } @@ -607,7 +484,7 @@ void TStatistiche_ve::elabora(const TMask& mask) const } //creazione del csv recordset che verra' riempito dai record del recordset righe - TStatistiche_ve_csv_recordset* csv = new TStatistiche_ve_csv_recordset(mask); + TStatistiche_ve_recordset* csv = new TStatistiche_ve_recordset(); //CALCOLO DEI TOTALI //------------------ @@ -746,8 +623,6 @@ void TStatistiche_ve::elabora(const TMask& mask) const //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); @@ -761,9 +636,6 @@ void TStatistiche_ve::elabora(const TMask& mask) const default: break; } csv->save_as(path, fmt_html); - - //accoppa la riga con le intestazioni dei campi - csv->destroy(0); #ifdef DBG xvt_sys_goto_url(path, "open"); @@ -805,6 +677,8 @@ void TStatistiche_ve::elabora(const TMask& mask) const //setta il recordset... rep.set_recordset(csv); + //setta le variabili della maschera sul report + rep.mask2report(mask); if (stampa) { diff --git a/ve/ve3800a.rep b/ve/ve3800a.rep index 08fcaae56..899d6ef62 100755 --- a/ve/ve3800a.rep +++ b/ve/ve3800a.rep @@ -2,7 +2,7 @@ Statistiche per Articolo -
+
@@ -22,9 +22,9 @@
-
+
MESSAGE RESET,F1 - + @@ -54,124 +54,124 @@ #ANNO
-
-
+
+
- A + CODART - B + DESCRIZIONE - C + GENNAIO MESSAGE ADD,F1.101 - D + PGEN MESSAGE ADD,F1.102 - E + FEBBRAIO MESSAGE ADD,F1.103 - F + PFEB MESSAGE ADD,F1.104 - G + MARZO MESSAGE ADD,F1.105 - H + PMAR MESSAGE ADD,F1.106 - I + APRILE MESSAGE ADD,F1.107 - J + PAPR MESSAGE ADD,F1.108 - K + MAGGIO MESSAGE ADD,F1.109 - L + PMAG MESSAGE ADD,F1.110 - M + GIUGNO MESSAGE ADD,F1.111 - N + PGIU MESSAGE ADD,F1.112 - O + LUGLIO MESSAGE ADD,F1.113 - P + PLUG MESSAGE ADD,F1.114 - Q + AGOSTO MESSAGE ADD,F1.115 - R + PAGO MESSAGE ADD,F1.116 - S + SETTEMBRE MESSAGE ADD,F1.117 - T + PSET MESSAGE ADD,F1.118 - U + OTTOBRE MESSAGE ADD,F1.119 - V + POTT MESSAGE ADD,F1.120 - W + NOVEMBRE MESSAGE ADD,F1.121 - X + PNOV MESSAGE ADD,F1.122 - Y + DICEMBRE MESSAGE ADD,F1.123 - Z + PDIC MESSAGE ADD,F1.124 - AA + ANNO MESSAGE ADD,F1.125 - AB + PANNO MESSAGE ADD,F1.126
-
+
@@ -179,7 +179,7 @@ #REPORT.PAGE
-
+
diff --git a/ve/ve3800b.rep b/ve/ve3800b.rep index f1eedc2d0..1a408dcb9 100755 --- a/ve/ve3800b.rep +++ b/ve/ve3800b.rep @@ -2,7 +2,7 @@ Statistiche per GrMerc -
+
@@ -22,9 +22,9 @@
-
+
MESSAGE RESET,F1 - + @@ -54,158 +54,157 @@ #ANNO
-