diff --git a/ci/ci1300.cpp b/ci/ci1300.cpp index 2829bec47..cae151d5b 100755 --- a/ci/ci1300.cpp +++ b/ci/ci1300.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include "../ca/calib01.h" #include "../ca/commesse.h" @@ -14,19 +13,6 @@ #include "ci1350.h" #include "ci1300a.h" -/////////////////////////////////////////////////////////// -// Recordset -/////////////////////////////////////////////////////////// -class TRil_ore_ris_recordset : public TCSV_recordset -{ -public: - TRil_ore_ris_recordset(); -}; - -TRil_ore_ris_recordset::TRil_ore_ris_recordset() -: TCSV_recordset("CSV(\"|\")") -{ -} /////////////////////////////////////////////////////////// // Report @@ -38,10 +24,16 @@ protected: virtual bool use_mask() { return false; } public: - TRil_ore_ris_report() { load("ci1300a"); } + TRil_ore_ris_report(); }; +TRil_ore_ris_report::TRil_ore_ris_report() +{ + load("ci1300a"); + TRil_ore_recordset* recset = new TRil_ore_recordset; + set_recordset(recset); +} /////////////////////////////////////////////////////////// // Maschera /////////////////////////////////////////////////////////// @@ -75,7 +67,6 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re //creare un assoc_array con chiave TToken_string cms-sede-fase(1) o sede-cms-fase(2) in base ai parametri.. //..indicati sulla maschera const int tipo_ordinamento = get_int(F_ORDINAMENTO); - const bool show_fasi = get_bool(F_SHOW_FASI); //il contenuto dell'assoc_array sarà: tot_Prev - 31 valori giornalieri Consuntivi - tot_Consuntivo TAssoc_array righe; @@ -144,17 +135,16 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re TToken_string key; switch(tipo_ordinamento) { - case 1: - key.add(codcms); - key.add(codcosto); - break; - case 2: - key.add(codcosto); - key.add(codcms); - break; + case 1: key.add(codcms); break; + case 2: key.add(codcms); key.add(codcosto); break; + case 3: key.add(codcms); key.add(codfase); break; + case 4: key.add(codcms); key.add(codcosto); key.add(codfase); break; + case 5: key.add(codcosto); break; + case 6: key.add(codcosto); key.add(codcms); break; + case 7: key.add(codcosto); key.add(codfase); break; + case 8: key.add(codcosto); key.add(codcms); key.add(codfase); break; + default: break; } - if (show_fasi) - key.add(codfase); //se la chiave non esiste già nell'assoc_array allora crea l'elemento TToken_string* record = (TToken_string*)righe.objptr(key); @@ -191,24 +181,15 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re } //for (int i = 0; i < 2; i++)... - //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. - //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report - TRil_ore_ris_recordset* righe_da_stampare = new TRil_ore_ris_recordset; - - ci_fill_recset_from_ass(righe, *righe_da_stampare); - -#ifdef DBG - righe_da_stampare->save_as_text("C:/temp/cazzone.txt"); -#endif - - //deve settare almeno un campo manualmente perche' funzioni la mask2report - righe_da_stampare->set_var("#CODRIS", TVariant(curr_risorsa), true); - - //setta il recordset ordinato al report - rep.set_recordset(righe_da_stampare); - //tenta la mask2report per far apparire sul report i campi di selezione della maschera rep.mask2report(*this); + //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. + //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report + //Il tutto nel magico metodo che segue! + ci_fill_recset_from_ass(righe, rep); + + rep.recordset()->set_var("#CODRIS", curr_risorsa, true); + } diff --git a/ci/ci1300a.rep b/ci/ci1300a.rep index 72b88c0ea..983882537 100755 --- a/ci/ci1300a.rep +++ b/ci/ci1300a.rep @@ -1,53 +1,88 @@ - + Rilevazione ore mensili per Risorsa - Attrezzatura
- - - - - - - + + #ORDINAMENTO -
  • -
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + #ORDINAMENTO + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + + + + + + + + + + + #ORDINAMENTO + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • @@ -101,8 +136,8 @@ #SYSTEM.DATE - - + + #CODRIS @@ -116,183 +151,217 @@ MESSAGE TABLEREAD,ATR,#90,S0
    +
    + (#ORDINAMENTO==4)||(#ORDINAMENTO==8) + Key1 + + + Key1 + + + Des1 + +
    +
    + (#ORDINAMENTO!=1)(#ORDINAMENTO!=5) + Key1+Key2 + + + IF ((#ORDINAMENTO==2)||(#ORDINAMENTO==3)||(#ORDINAMENTO==6)||(#ORDINAMENTO==7);Key1;Key2) + + + + + IF ((#ORDINAMENTO==2)||(#ORDINAMENTO==3)||(#ORDINAMENTO==6)||(#ORDINAMENTO==7);Des1;Des2) + + +
    - - - A + + + TotPrev + MESSAGE ADD,F1.99 - - B + + TotCons MESSAGE ADD,F1.100 - - C + + G01 MESSAGE ADD,F1.101 - - D + + G02 MESSAGE ADD,F1.102 - - E + + G03 MESSAGE ADD,F1.103 - - F + + G04 MESSAGE ADD,F1.104 - - G + + G05 MESSAGE ADD,F1.105 - - H + + G06 MESSAGE ADD,F1.106 - - I + + G07 MESSAGE ADD,F1.107 - - J + + G08 MESSAGE ADD,F1.108 - - K + + G09 MESSAGE ADD,F1.109 - - L + + G10 MESSAGE ADD,F1.110 - - M + + G11 MESSAGE ADD,F1.111 - - N + + G12 MESSAGE ADD,F1.112 - - O + + G13 MESSAGE ADD,F1.113 - - P + + G14 MESSAGE ADD,F1.114 - - Q + + G15 MESSAGE ADD,F1.115 - - R + + G16 MESSAGE ADD,F1.116 - - S + + G17 MESSAGE ADD,F1.117 - - T + + G18 MESSAGE ADD,F1.118 - - U + + G19 MESSAGE ADD,F1.119 - - V + + G20 MESSAGE ADD,F1.120 - - W + + G21 MESSAGE ADD,F1.121 - - X + + G22 MESSAGE ADD,F1.122 - - Y + + G23 MESSAGE ADD,F1.123 - - Z + + G24 MESSAGE ADD,F1.124 - - AA + + G25 MESSAGE ADD,F1.125 - - AB + + G26 MESSAGE ADD,F1.126 - - AC + + G27 MESSAGE ADD,F1.127 - - AD + + G28 MESSAGE ADD,F1.128 - - AE + + G29 MESSAGE ADD,F1.129 - - AF + + G30 MESSAGE ADD,F1.130 - - AG + + G31 MESSAGE ADD,F1.131 - - AH - MESSAGE ADD,F1.132 + + + IF ((#ORDINAMENTO==4)||(#ORDINAMENTO==8);Key3;IF ((#ORDINAMENTO==1)||(#ORDINAMENTO==5);Key1;Key2)) + + + + + IF ((#ORDINAMENTO==4)||(#ORDINAMENTO==8);Des3;IF ((#ORDINAMENTO==1)||(#ORDINAMENTO==5);Des1;Des2)) +
    - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    \ No newline at end of file diff --git a/ci/ci1300a.uml b/ci/ci1300a.uml index bade7c311..8c11980ee 100755 --- a/ci/ci1300a.uml +++ b/ci/ci1300a.uml @@ -142,26 +142,20 @@ BEGIN FIELD #MESE END -GROUPBOX -1 78 5 -BEGIN - PROMPT 1 9 "@bTipo ordinamento dati" -END - RADIOBUTTON F_ORDINAMENTO 40 BEGIN - PROMPT 2 10 "Principale" - ITEM "1|Commessa - CdC" - ITEM "2|CdC - commessa" - FLAGS "Z" + PROMPT 1 9 "@bStampa e ordina per:" + ITEM "1|Commessa" + ITEM "2|Commessa - CdC" + ITEM "3|Commessa - Fase" + ITEM "4|Commessa - CdC - Fase" + ITEM "5|CdC" + ITEM "6|CdC - Commessa" + ITEM "7|CdC - Fase" + ITEM "8|CdC - Commessa - Fase" FIELD #ORDINAMENTO END -BOOLEAN F_SHOW_FASI -BEGIN - PROMPT 55 11 "Dettaglio per fase" - FIELD #SHOW_FASI -END - ENDPAGE ENDMASK \ No newline at end of file diff --git a/ci/ci1350.cpp b/ci/ci1350.cpp index 3b36bc2a2..38ab450c8 100755 --- a/ci/ci1350.cpp +++ b/ci/ci1350.cpp @@ -1,5 +1,36 @@ +#include "../ca/commesse.h" +#include "../ca/cdc.h" +#include "../ca/fasi.h" + #include "ci1350.h" +/////////////////////////////////////////////////////////// +// Recordset +/////////////////////////////////////////////////////////// +TRil_ore_recordset::TRil_ore_recordset() +: TAS400_recordset("AS400(512)") +{ + //const char* name, int pos, int len, TFieldtypes t = _alfafld, bool required = false, const TVariant& def = NULL_VARIANT + create_field("Key1", -1, 20, _alfafld, true); + create_field("Key2", -1, 20, _alfafld, false); + create_field("Key3", -1, 10, _alfafld, false); + create_field("Des1", -1, 50, _alfafld, true); + create_field("Des2", -1, 50, _alfafld, false); + create_field("Des3", -1, 50, _alfafld, false); + + create_field("TotPrev", -1, 6, _realfld, false); + create_field("TotCons", -1, 6, _realfld, false); + + TString4 name; + for (int i = 1; i <= 31; i++) + { + name.format("G%02d", i); + create_field(name, -1, 5, _realfld, false); + } + +} + + /////////////////////////////////////////////////////////////////////////////////////// // Metodi liberi per determinare giorni lavorativi e feriali (nati per ci1300 ci1400) /////////////////////////////////////////////////////////////////////////////////////// @@ -51,52 +82,133 @@ long ci_calcola_giorni_lavorativi_cms(const int anno, const int mese, const TDat } -void ci_fill_recset_from_ass(TAssoc_array& ass, TCSV_recordset& recset) +void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep) { + //deve informarsi sul tipo di report che è in uso + const TString& rep_class = rep.get_class(); + const bool per_ris_att = rep_class == "ci1300"; + + int ordinamento = 0; + + //richiesta delle variabili di filtro sulla maschera + //ca1300 + if (per_ris_att) + { + TVariant var; + rep.evaluate("#ORDINAMENTO", var, _intfld); + ordinamento = var.as_int(); + } + + //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. + //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report + TRil_ore_recordset* recset = (TRil_ore_recordset*)rep.recordset(); + + FOR_EACH_ASSOC_OBJECT(ass, obj, key, itm) { + //il totale consuntivo va ridistribuito con un TDistrib sui giorni lavorativi TToken_string& record_ass = (TToken_string&)*itm; + + //aggiunge la riga al recordset + recset->new_rec(); + + //1) valori delle ore + // Totale preventivo (lo prende dall'assoc_array e lo butta nel recset appena arrotondato) + real totale_p = record_ass.get(0); + totale_p.round(1); + recset->set("TotPrev", totale_p); + // Totale consuntivo (lo prende dall'assoc_array e lo butta nel recset appena arrotondato) real totale_c = record_ass.get(32); totale_c.round(1); - TGeneric_distrib esso(totale_c, 1); + recset->set("TotCons", totale_c); + //per avere una distribuzione di ore giornaliera che faccia ritornare il totale consuntivo.. + //..indipendentemente da arrotondamenti e troncamenti, si ricorre al mitico TGeneric_distrib... + TGeneric_distrib esso(totale_c, 1); for (int j = 1; j <= 31; j++) { real ore = record_ass.get(j); esso.add(ore); } - - //chiave della riga (Cms-CdC-Fase o CdC-Cms-Fase) - TToken_string linea; - TToken_string chiave = key; - FOR_EACH_TOKEN(chiave, tok) - { - if (*tok > ' ') - { - if (!linea.empty()) - linea << " -- "; - linea << tok; - } - } - - // Totale preventivo - real totale_p = record_ass.get(0); - totale_p.round(1); - linea.add(totale_p.string()); - - // Totale consuntivo + // ridistribuzione delle ore per giorno nel recordset + TString4 name; for (int k = 1; k <= 31; k++) { const real ore_giorno = esso.get(); - const char* str_ore = ore_giorno.string(); - linea.add(str_ore, k+1); + name.format("G%02d", k); + recset->set(name, ore_giorno); + } + + + //2) chiavi delle righe + //chiave della riga: dipende dal tipo di report e dai parametri di fordinamento + TToken_string chiave = key; + TString80 chiave1 = chiave.get(0); + TString80 chiave2 = chiave.get(1); + TString16 chiave3 = chiave.get(2); + + recset->set("Key1", chiave1); //se ci1300 ->(cms o cdc) se ci1400 ->(A o R) + recset->set("Key2", chiave2); //se ci1300 ->(cdc o cms) se ci1400 ->(codris o codattr) + recset->set("Key3", chiave3); + //report di risorsa / attrezzatura (ci1300) + if (per_ris_att) + { + switch (ordinamento) + { + case 1: //cms + recset->set("Des1", cache().get(LF_COMMESSE, chiave1, COMMESSE_DESCRIZ)); + break; + case 2: //cms - cdc + recset->set("Des1", cache().get(LF_COMMESSE, chiave1, COMMESSE_DESCRIZ)); + recset->set("Des2", cache().get(LF_CDC, chiave2, CDC_DESCRIZ)); + break; + case 3: //cms - fase + recset->set("Des1", cache().get(LF_COMMESSE, chiave1, COMMESSE_DESCRIZ)); + recset->set("Des2", cache().get(LF_FASI, chiave2, FASI_DESCRIZ)); + break; + case 4: //cms - cdc - fase + recset->set("Des1", cache().get(LF_COMMESSE, chiave1, COMMESSE_DESCRIZ)); + recset->set("Des2", cache().get(LF_CDC, chiave2, CDC_DESCRIZ)); + recset->set("Des3", cache().get(LF_FASI, chiave3, FASI_DESCRIZ)); + break; + case 5: //cdc + recset->set("Des1", cache().get(LF_CDC, chiave1, CDC_DESCRIZ)); + break; + case 6: //cdc - cms + recset->set("Des1", cache().get(LF_CDC, chiave1, CDC_DESCRIZ)); + recset->set("Des2", cache().get(LF_COMMESSE, chiave2, COMMESSE_DESCRIZ)); + break; + case 7: //cdc - fase + recset->set("Des1", cache().get(LF_CDC, chiave1, CDC_DESCRIZ)); + recset->set("Des2", cache().get(LF_FASI, chiave2, FASI_DESCRIZ)); + break; + case 8: //cdc - cms - fase + recset->set("Des1", cache().get(LF_CDC, chiave1, CDC_DESCRIZ)); + recset->set("Des2", cache().get(LF_COMMESSE, chiave2, COMMESSE_DESCRIZ)); + recset->set("Des3", cache().get(LF_FASI, chiave3, FASI_DESCRIZ)); + break; + } + } + else //report di commessa / sede (ci1400) + { + if (chiave1 == "R") //risorsa + { + recset->set("Des1", "Risorsa"); + recset->set("Des2", cache().get("RSS", chiave2, "S0")); + } + else //attrezzatura + { + recset->set("Des1", "Attrezzatura"); + recset->set("Des2", cache().get("ATR", chiave2, "S0")); + } } - - linea.add(totale_c.string()); - //aggiunge la riga tokenstringata al csv_recordset - recset.new_rec(linea); } //ordina il recordset per chiave - recset.sort(); + recset->sort(); + +#ifdef DBG + recset->save_as("C:/temp/cazzone.txt"); +#endif + } \ No newline at end of file diff --git a/ci/ci1350.h b/ci/ci1350.h index a39c55a8f..98f9d35f7 100755 --- a/ci/ci1350.h +++ b/ci/ci1350.h @@ -1,10 +1,20 @@ #ifndef __CI1350_H #define __CI1350_H -#include -#include +#include +#include #include +/////////////////////////////////////////////////////////// +// Recordset generico valido per le stampe ci1300 ci1400 +/////////////////////////////////////////////////////////// +class TRil_ore_recordset : public TAS400_recordset +{ +public: + TRil_ore_recordset(); +}; + + /////////////////////////////////////////////////////////////////////////////////////// // Metodi liberi per determinare giorni lavorativi e feriali (nati per ci1300 ci1400) /////////////////////////////////////////////////////////////////////////////////////// @@ -14,6 +24,6 @@ long ci_calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine); long ci_calcola_giorni_lavorativi_cms(const int anno, const int mese, const TDate& ini_cms, const TDate& fine_cms, const TDate& dataini, const TDate& datafine, TDate& inizio_lav, TDate& fine_lav); -void ci_fill_recset_from_ass(TAssoc_array& ass, TCSV_recordset& recset); +void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep); #endif \ No newline at end of file diff --git a/ci/ci1400.cpp b/ci/ci1400.cpp index eb6df11f8..5c3404b79 100755 --- a/ci/ci1400.cpp +++ b/ci/ci1400.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include "../ca/calib01.h" #include "../ca/commesse.h" @@ -13,20 +12,6 @@ #include "ci1350.h" #include "ci1400a.h" -/////////////////////////////////////////////////////////// -// Recordset -/////////////////////////////////////////////////////////// -class TRil_ore_cms_recordset : public TCSV_recordset -{ -public: - TRil_ore_cms_recordset(); -}; - -TRil_ore_cms_recordset::TRil_ore_cms_recordset() -: TCSV_recordset("CSV(\"|\")") -{ -} - /////////////////////////////////////////////////////////// // Report /////////////////////////////////////////////////////////// @@ -37,9 +22,15 @@ protected: virtual bool use_mask() { return false; } public: - TRil_ore_cms_report() { load("ci1400a"); } + TRil_ore_cms_report(); }; +TRil_ore_cms_report::TRil_ore_cms_report() +{ + load("ci1400a"); + TRil_ore_recordset* recset = new TRil_ore_recordset; + set_recordset(recset); +} /////////////////////////////////////////////////////////// // Maschera @@ -195,20 +186,9 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport& //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report - TRil_ore_cms_recordset* righe_da_stampare = new TRil_ore_cms_recordset; - - ci_fill_recset_from_ass(righe, *righe_da_stampare); - -#ifdef DBG - righe_da_stampare->save_as_text("C:/temp/culone.txt"); -#endif - - //deve settare almeno un campo manualmente perche' funzioni la mask2report - righe_da_stampare->set_var("#CODCMSCDC", TVariant(curr_commessa), true); - - //setta il recordset ordinato al report - rep.set_recordset(righe_da_stampare); + ci_fill_recset_from_ass(righe, rep); + rep.recordset()->set_var("#CODCMS", curr_commessa, true); //tenta la mask2report per far apparire sul report i campi di selezione della maschera rep.mask2report(*this);