campo-sirio/ci/ci1350.cpp
luca b64d2a95c4 Patch level :10.0
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
stampa incredibilmente per giorno sia per cms/cdc che per ris/att


git-svn-id: svn://10.65.10.50/branches/R_10_00@21694 c028cbd2-c16b-5b4b-a496-9718f37d4682
2011-02-22 11:44:01 +00:00

214 lines
7.2 KiB
C++
Executable File

#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)
///////////////////////////////////////////////////////////////////////////////////////
bool ci_is_ferial_day(const TDate& data)
{
return data.wday() < 6 && !data.is_holiday();
}
long ci_calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine)
{
long num_giorni_lav = datafine - dataini + 1;
//e qui si parrà l'ultima stilla di nobilitate! deve eliminare i giorni festivi dal mucchio!
if (num_giorni_lav > 1)
{
for (TDate data = dataini; data <= datafine; ++data)
{
if (!ci_is_ferial_day(data))
num_giorni_lav--;
}
}
return num_giorni_lav;
}
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)
{
//date del mese
TDate ini_mese(1, mese, anno);
TDate fine_mese = ini_mese;
fine_mese.set_end_month();
//se la commessa non "interseca" il mese selezionato -> finisce qui
if (fine_cms < ini_mese || ini_cms > fine_mese)
return 0;
//se le date limite lavorative non "intersecano" il mese selezionato -> finisce qui
if (datafine < ini_mese || dataini > fine_mese)
return 0;
//se è arrivato fin qui -> c'è qualcosa da considerare
//vanno prese la massima data inizio e la minima data fine
inizio_lav = fnc_max(ini_mese, ini_cms);
fine_lav = fnc_min(fine_mese, fine_cms);
//e qui si parrà l'ultima stilla di nobilitate! deve eliminare i giorni festivi dal mucchio!
return ci_calcola_giorni_lavorativi(inizio_lav, fine_lav);
}
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);
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);
}
// ridistribuzione delle ore per giorno nel recordset
TString4 name;
for (int k = 1; k <= 31; k++)
{
const real ore_giorno = esso.get();
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); //se ci1300 -> fase
//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"));
}
}
}
//ordina il recordset per chiave
recset->sort();
#ifdef DBG
recset->save_as("C:/temp/cazzone.txt");
#endif
}