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);
 | |
|     }
 | |
|   }
 | |
| }
 |