Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/branches/R_10_00@22018 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			274 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "../ca/commesse.h"
 | 
						|
#include "../ca/cdc.h"
 | 
						|
#include "../ca/fasi.h"
 | 
						|
 | 
						|
#include "ci1350.h"
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// Recordset
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
//recordset per stampe mensili (dettagliate per giorno)
 | 
						|
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, 7, _realfld, false);
 | 
						|
  create_field("TotCons", -1, 7, _realfld, false);
 | 
						|
 | 
						|
  TString4 name;
 | 
						|
  for (int i = 1; i <= 31; i++)
 | 
						|
  {
 | 
						|
    name.format("G%02d", i);
 | 
						|
    create_field(name, -1, 6, _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)
 | 
						|
{
 | 
						|
  //se mese > 0 -> stampa per mese dettagliata per giorno, sennò stampa per anno dettagliata per mese
 | 
						|
  TDate inizio, fine;
 | 
						|
 | 
						|
  if (mese > 0)
 | 
						|
  {
 | 
						|
  //date del mese
 | 
						|
    TDate ini_mese(1, mese, anno);
 | 
						|
    TDate fine_mese = ini_mese;
 | 
						|
    fine_mese.set_end_month();
 | 
						|
    inizio = ini_mese;
 | 
						|
    fine = fine_mese;
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    TDate ini_anno(1, 1, anno);
 | 
						|
    TDate fine_anno(31, 12, anno);
 | 
						|
    inizio = ini_anno;
 | 
						|
    fine = fine_anno;
 | 
						|
  }
 | 
						|
 | 
						|
  //se la commessa non "interseca" il periodo selezionato -> finisce qui
 | 
						|
  if (fine_cms < inizio || ini_cms > fine)
 | 
						|
    return 0;
 | 
						|
  //se le date limite lavorative non "intersecano" il periodo selezionato -> finisce qui
 | 
						|
  if (datafine < inizio || dataini > fine)
 | 
						|
    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(inizio, ini_cms);
 | 
						|
  fine_lav = fnc_min(fine, 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, bool split)
 | 
						|
{
 | 
						|
  //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...
 | 
						|
		if (split)
 | 
						|
		{
 | 
						|
			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);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			TString4 name;
 | 
						|
 | 
						|
			for (int k = 1; k <= 31; k++)
 | 
						|
			{
 | 
						|
				real ore = record_ass.get(k);
 | 
						|
				name.format("G%02d", k);
 | 
						|
				recset->set(name, ore);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
    //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
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//formattazione report per stampa mensile dettagliata per giorno
 | 
						|
void format_report_month(const int anno, const int mese, TReport& rep)
 | 
						|
{
 | 
						|
  //maggico giro per formattare la testata del calendario di pagina nel report
 | 
						|
  const TDate primo_del_mese(1, mese, anno);
 | 
						|
  TDate ultimo_del_mese = primo_del_mese;
 | 
						|
  ultimo_del_mese.set_end_month();
 | 
						|
 | 
						|
  TString16 code;
 | 
						|
 | 
						|
  for (TDate giorno = primo_del_mese; giorno <= ultimo_del_mese; ++giorno)
 | 
						|
  {
 | 
						|
    code.format("H0.%d", giorno.day() + 100);
 | 
						|
    TReport_field* rep_field = rep.field(code);
 | 
						|
 | 
						|
    if (rep_field != NULL)
 | 
						|
    {
 | 
						|
      if (!ci_is_ferial_day(giorno))
 | 
						|
        rep_field->set_back_color(COLOR_LTGRAY);
 | 
						|
 | 
						|
      code = itow(giorno.wday());
 | 
						|
      code.cut(3);
 | 
						|
      code << '\n' << giorno.day();
 | 
						|
      rep_field->set(code);
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |