Files correlati : at5.exe Ricompilazione Demo : [ ] Commento : uso della cache() git-svn-id: svn://10.65.10.50/trunk@10571 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			473 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			473 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <form.h>
 | |
| #include <mask.h>
 | |
| #include <printapp.h>
 | |
| #include <tabutil.h>
 | |
| #include <utility.h>
 | |
| 
 | |
| #include "donaz.h"
 | |
| #include "contsan.h"
 | |
| #include "soggetti.h"
 | |
| #include "sezioni.h"
 | |
| 
 | |
| #include "at5.h"
 | |
| #include "at5700a.h"
 | |
| 
 | |
| class TFogliDonazione : public TPrintapp
 | |
| {
 | |
|   TRelation*					_rel;
 | |
|   TMask*      				_msk;
 | |
|   int									_contatore, _totfinestampa;
 | |
|   TDate								_dataold, _dataini, _datafin;
 | |
|   TString16						_tipodon, _luogodon, _luogoold, _sezold;
 | |
|   TString16						_sezini, _sotini, _sezfin, _sotfin;
 | |
|   TString16						_tipostampa, _ordinamento;
 | |
|   
 | |
| protected:
 | |
|   virtual bool user_create();
 | |
|   virtual bool user_destroy();
 | |
|   virtual bool set_print(int m);
 | |
|   virtual void set_page(int file, int cnt);
 | |
|   virtual bool preprocess_page(int file, int counter);
 | |
|   virtual print_action postprocess_print(int file, int counter);
 | |
| 
 | |
| public:
 | |
|   void crea_intestazione();
 | |
|   void header_stampa(const TDate data, const TString16 luogo, const TString16 sezione, const TString16 sottog, const TString16 gruppoazie);
 | |
|   void footer_stampa();
 | |
|   void fine_stampa();
 | |
|   TMask& app_mask() { return *_msk; }
 | |
|   TFogliDonazione() : _cognome_nome("",35) {}
 | |
| };
 | |
| 
 | |
| HIDDEN inline TFogliDonazione& app() { return (TFogliDonazione&) main_app(); }
 | |
| 
 | |
| void TFogliDonazione::set_page(int file, int cnt)
 | |
| {
 | |
| 	set_row(1,"@0g#D", &_contatore);
 | |
| 	set_row(2,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
 | |
| 	set_row(1,"@9g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########"));
 | |
| 	set_row(1,"@19g@S", FLD(LF_SOGGETTI,SOG_CATDON));
 | |
| //	set_row(2,"@16g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS));
 | |
| 	set_row(1,"@22g@S", FLD(LF_SOGGETTI,SOG_COGNOME));
 | |
| 	set_row(2,"@22g@S", FLD(LF_SOGGETTI,SOG_NOME));
 | |
| 	set_row(1,"@48g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0));
 | |
| 	set_row(1,"@52g@S", FLD(LF_SOGGETTI, SOG_RHANTID));
 | |
| 	set_row(2,"@48g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
 | |
| 
 | |
| 	set_row(1,"@59g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
 | |
| 	set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_CODSOT));
 | |
| 	set_row(1,"@64g@ld", FLD(LF_DONAZ,DON_DATADON));
 | |
| 	set_row(2,"@64g@S", FLD(LF_DONAZ,DON_TIPODON));
 | |
| 	set_row(1,"@79g#t", &_controllo);
 | |
| 	set_row(2,"@79g#t", &_prima);
 | |
| }
 | |
| 
 | |
| bool TFogliDonazione::preprocess_page(int file, int counter)
 | |
| {
 | |
| 	bool prima = current_cursor()->curr().get_bool(DON_PRIMADON);
 | |
| 	if (prima)
 | |
| 		_prima = "X";
 | |
| 	else
 | |
| 		_prima = " ";		
 | |
| 	// salto pagina se cambio punto di rottura
 | |
| 	switch (_tipostampa[0])
 | |
| 	{
 | |
| 		case 'D':
 | |
| 		{
 | |
| 			const TDate datanew = current_cursor()->curr().get(DON_DATADON);		
 | |
| 			if (datanew != _dataold )
 | |
| 			{
 | |
| 				if (_dataold.ok())
 | |
| 					footer_stampa();
 | |
| 				_dataold = datanew;				
 | |
| 				header_stampa(datanew,"","","","");
 | |
| 				_contatore = 0;
 | |
| 			} 
 | |
| 		}
 | |
| 		break;
 | |
| 		case 'L':
 | |
| 		{
 | |
| 			const TString16 luogonew = current_cursor()->curr().get(DON_LUOGODON);		
 | |
| 			if (luogonew != _luogoold )
 | |
| 			{
 | |
| 				if (_luogoold != "****")
 | |
| 					footer_stampa();
 | |
| 				_luogoold = luogonew;				
 | |
| 				header_stampa(NULLDATE,luogonew,"","","");
 | |
| 				_contatore = 0;
 | |
| 			} 
 | |
| 		}
 | |
| 		break;			
 | |
| 		case 'S':
 | |
| 		{ 
 | |
| 			//TString16 sezione = current_cursor()->curr(LF_SOGGETTI).get(SOG_CODSEZ);		
 | |
| 			//TString16 sottog = current_cursor()->curr(LF_SOGGETTI).get(SOG_CODSOT);		
 | |
| 			TString16 sezione = current_cursor()->curr().get(DON_CODSEZ);		
 | |
| 			TString16 sottog = current_cursor()->curr().get(DON_CODSOT);		
 | |
| 			TString16 seznew = "";
 | |
| 			seznew << sezione;
 | |
| 			seznew << "/";
 | |
| 			seznew << sottog;
 | |
| 			if (seznew != _sezold )
 | |
| 			{
 | |
| 				if (_sezold != "****")
 | |
| 					footer_stampa();
 | |
| 				_sezold = seznew;				
 | |
| 				header_stampa(NULLDATE,"",sezione,sottog,"");
 | |
| 				_contatore = 0;
 | |
| 			} 
 | |
| 		}
 | |
| 		break;			
 | |
| 		case 'G':
 | |
| 		{ 
 | |
| 			TString16 grupponew = current_cursor()->curr(LF_SOGGETTI).get(SOG_GRUPPOAZIE);		
 | |
| 			if (grupponew != _gruppoold )
 | |
| 			{
 | |
| 				if (_gruppoold != "****")
 | |
| 					footer_stampa();
 | |
| 				_gruppoold = grupponew;				
 | |
| 				header_stampa(NULLDATE,"","","",grupponew);
 | |
| 				_contatore = 0;
 | |
| 			} 
 | |
| 		}
 | |
| 		break;			
 | |
| 	}		
 | |
| 	// salto pagina se non ci sono abbastanza righe per il record
 | |
| 	if ((_stampa80) && (printer().rows_left() < 2))
 | |
| 		printer().formfeed();
 | |
| 	_contatore++;
 | |
| 	_totfinestampa++;
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| print_action TFogliDonazione::postprocess_print(int file, int counter)
 | |
| { 
 | |
| 	if (_contatore > 0)
 | |
| 		footer_stampa();
 | |
| 	if (_totfinestampa > 0 && _contatore != _totfinestampa)
 | |
| 		fine_stampa();				
 | |
| 	return NEXT_PAGE;
 | |
| }
 | |
| 
 | |
| void TFogliDonazione::footer_stampa()
 | |
| {
 | |
| 	// stampa totale soggetti a fine pagina
 | |
| 	if (_contatore > 0)
 | |
| 	{
 | |
| 		reset_footer();
 | |
| 		TString sep(80);
 | |
| 		sep.fill('-');
 | |
| 		set_footer(1, (const char *) sep);
 | |
| 		if (_dataini == _datafin)
 | |
| 			set_footer(2,"TOTALE DONAZIONI DEL %s   %d", _dataini.string(), _contatore);
 | |
| 		else                              
 | |
| 		{
 | |
| 			TString d1 = _dataini.string();
 | |
| 			TString d2 = _datafin.string();
 | |
| 			set_footer(2,"TOTALE DONAZIONI DAL %s AL %s   %d", (const char*)d1, (const char*)d2, _contatore);
 | |
| 		}			
 | |
| 		printer().formfeed(); 
 | |
| 		reset_footer();
 | |
| 	}		
 | |
| }
 | |
| 
 | |
| void TFogliDonazione::fine_stampa()
 | |
| {
 | |
| 	// stampa totale soggetti a fine stampa
 | |
| 	
 | |
| 	reset_footer();
 | |
|  	printer().footerlen(20);
 | |
| 	TString sep(80);
 | |
| 	sep.fill('-');
 | |
| 	set_footer(1, (const char *) sep);
 | |
| 	set_footer(2,"DONAZIONI TOTALI STAMPATE %d", _totfinestampa);
 | |
| 	printer().formfeed();
 | |
| 	reset_footer();
 | |
| }
 | |
| 
 | |
| void TFogliDonazione::header_stampa(const TDate data, const TString16 luogo, const TString16 sezione, const TString16 sottog, const TString16 gruppoazie)
 | |
| {
 | |
| 	TString intestazione(132);
 | |
| 	intestazione = "STAMPA FOGLI DELLE DONAZIONI";
 | |
| 	switch (_tipostampa[0])
 | |
| 	{
 | |
| 		case 'D':
 | |
| 		{
 | |
| 			intestazione << "PER DATA ";
 | |
| 			intestazione << data;
 | |
| 		}			
 | |
| 		break;
 | |
| 		case 'L':
 | |
| 		{
 | |
| 			intestazione << "PER PUNTO DI PRELIEVO ";
 | |
| 			intestazione << luogo;
 | |
| 			intestazione << " ";
 | |
| 			intestazione << cache().get("LDN", luogo).get("S0");
 | |
| 		}			
 | |
| 		break;
 | |
| 		case 'S':
 | |
| 		{
 | |
| 			intestazione << "PER SEZIONE ";
 | |
| 			intestazione << sezione;
 | |
| 			if (sottog.not_empty())
 | |
| 			{
 | |
| 				intestazione << "/";
 | |
| 				intestazione << sottog;
 | |
| 			}
 | |
| 			TLocalisamfile sez(LF_SEZIONI);
 | |
| 			sez.setkey(1);
 | |
| 			TRectype& recsez = sez.curr();
 | |
| 			recsez.zero();
 | |
| 			recsez.put(SEZ_CODSEZ, sezione);
 | |
| 			recsez.put(SEZ_CODSOT, sottog);
 | |
| 			if (sez.read() == NOERR)
 | |
| 			{
 | |
| 				intestazione << " ";
 | |
| 				intestazione << recsez.get(SEZ_DENSEZ);
 | |
| 				TString80 densot = recsez.get(SEZ_DENSOT);
 | |
| 				if (densot.not_empty())
 | |
| 				{
 | |
| 					intestazione << "/";
 | |
| 					intestazione << densot;
 | |
| 				}
 | |
| 			}			
 | |
| 		}			
 | |
| 		break;
 | |
| 		case 'G':
 | |
| 		{
 | |
| 			intestazione << "PER GRUPPO AZIENDALE ";
 | |
| 			if (gruppoazie.not_empty())
 | |
| 			{
 | |
| 				intestazione << " ";
 | |
| 				intestazione << cache().get("GAZ", gruppoazie).get("S0");
 | |
| 			}		
 | |
| 		}			
 | |
| 		break;
 | |
| 	}		
 | |
| 	if (_stampa80)
 | |
| 		intestazione.center_just(80);
 | |
| 	else		
 | |
| 		intestazione.center_just(132);	
 | |
| 	set_header(1,"@0g%s", (const char*) intestazione);
 | |
|  	intestazione = "Pag. @#";
 | |
|  	if (_stampa80)
 | |
|  		set_header(1, "@73g%s", (const char*) intestazione);  				 	
 | |
|  	else
 | |
|  		set_header(1, "@110g%s", (const char*) intestazione);  
 | |
| 	return;
 | |
| }
 | |
| 
 | |
| bool TFogliDonazione::set_print(int m)
 | |
| { 
 | |
|   KEY tasto;
 | |
|  	tasto = _msk->run();
 | |
|  	if (tasto != K_QUIT)
 | |
|  	{ 
 | |
| 		_sezini = 	_msk->get(F_SEZINI);
 | |
|  		_sotini = 	_msk->get(F_SOTINI);
 | |
| 		_sezfin = 	_msk->get(F_SEZFIN);
 | |
|  		_sotfin = 	_msk->get(F_SOTFIN);
 | |
| 		_dataini = 	_msk->get_date(F_DATADA);	
 | |
| 		_datafin = 	_msk->get_date(F_DATAA);	
 | |
| 		_tipodon = 	_msk->get(F_TIPODON);
 | |
|  		_luogodon =	_msk->get(F_LUOGODON);
 | |
| 		_tipostampa = 
 | |
| 		TString80 chiave = "";
 | |
| 		switch (_tipostampa[0])
 | |
| 		{
 | |
| 			case 'D':
 | |
| 				chiave = "92->DATADON|";
 | |
| 			break;
 | |
| 			case 'L':
 | |
| 				chiave = "92->LUOGODON|";
 | |
| 			break;
 | |
| 			case 'S':
 | |
| 				chiave = "92->CODSEZ|92->CODSOT|";
 | |
| 			break;
 | |
| 			case 'G':
 | |
| 				chiave = "90->GRUPPOAZIE|";
 | |
| 			break;
 | |
| 		}
 | |
| 		switch (_ordinamento[0])
 | |
| 		{
 | |
| 			case 'C':
 | |
| 				chiave << "92->DATADON|UPPER(90->COGNOME)|UPPER(90->NOME)";
 | |
| 			break;
 | |
| 			case 'I':
 | |
| 				chiave << "92->DATADON|92->PROGINS";
 | |
| 			break;
 | |
| 			case 'E':
 | |
| 				chiave << "92->DATADON|92->ETICHETTA";
 | |
| 			break;
 | |
| 			case 'X':
 | |
| 				chiave << "UPPER(90->COGNOME)|UPPER(90->NOME)|92->DATADON";
 | |
| 			break;
 | |
| 			case 'Y':
 | |
| 				chiave << "92->PROGINS|92->DATADON";
 | |
| 			break;
 | |
| 			case 'Z':
 | |
| 				chiave << "92->ETICHETTA|92->DATADON";
 | |
| 			break;
 | |
| 		}
 | |
| 		TString256 filtro = "";			
 | |
| 		TString80 filtrotmp ="";
 | |
| 		// filtro per tipo donazione			
 | |
|   	if (_tipodon.not_empty())
 | |
|   		filtro.format("(TIPODON == \"%s\")",(const char*)_tipodon);
 | |
|   	// filtro per luogo donazione
 | |
|   	if (_luogodon.not_empty())
 | |
|   	{
 | |
|   		filtrotmp.format("(LUOGODON == \"%s\")",(const char*)_luogodon);
 | |
|   		if (filtro.not_empty())	
 | |
| 				filtro << " && ";
 | |
| 			filtro << filtrotmp;
 | |
| 		}				
 | |
| 		// filtro per prime donazioni
 | |
|   	if (_primedon)
 | |
|   	{
 | |
|  			filtrotmp.format("(PRIMADON == \"X\")");
 | |
|   		if (filtro.not_empty())	
 | |
| 				filtro << " && ";
 | |
| 			filtro << filtrotmp;
 | |
| 		}				              
 | |
| 		// filtro per gruppo aziendale
 | |
|   	if (_pergruppo)
 | |
|   	{ 	
 | |
|   		if (_gruppoazie.not_empty())
 | |
| 	  		filtrotmp.format("(90->GRUPPOAZIE == \"%s\")",(const char*)_gruppoazie);
 | |
| 			else	  		
 | |
| 	  		filtrotmp.format("(90->GRUPPOAZIE != \"\")");
 | |
|   		if (filtro.not_empty())	
 | |
| 				filtro << " && ";
 | |
| 			filtro << filtrotmp;
 | |
| 		}		
 | |
| 
 | |
| 		TString16 inizio = "";
 | |
| 		inizio << _sezini;
 | |
| 		inizio << _sotini;
 | |
| 		TString16 fine = "";
 | |
| 		fine << _sezfin;
 | |
| 		fine << _sotfin;
 | |
| 		if (inizio.not_empty())
 | |
| 		{
 | |
|   		if (filtro.empty())
 | |
|   			filtro = format("(92->CODSEZ+92->CODSOT >= \"%s\")",(const char*)inizio);
 | |
| 			else
 | |
| 			{
 | |
| 				filtro << " && ";
 | |
|   			filtro << format("(92->CODSEZ+92->CODSOT >= \"%s\")",(const char*)inizio);
 | |
| 			}				
 | |
| 			if (fine.not_empty())
 | |
| 			{
 | |
| 	  		if (filtro.empty())
 | |
| 	  			filtro = format("(92->CODSEZ+92->CODSOT <= \"%s\")",(const char*)fine);
 | |
| 				else
 | |
| 				{
 | |
| 					filtro  << " && ";
 | |
| 	  			filtro << format("(92->CODSEZ+92->CODSOT <= \"%s\")",(const char*)fine);
 | |
| 				}				
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		// filtro per data
 | |
| 	  TRectype da(LF_DONAZ);
 | |
|   	TRectype a (LF_DONAZ);
 | |
| 		if (_riepfinale)
 | |
| 		{
 | |
| 			TDate inizio (_dataini);
 | |
| 			TDate fine   (_datafin);
 | |
| 			inizio.set_day(1);
 | |
| 			inizio.set_month(1);
 | |
| 			fine.set_end_month();
 | |
| 			da.put(DON_DATADON, inizio);
 | |
| 			a.put(DON_DATADON, fine);
 | |
| 			
 | |
| 			_giorni.destroy();
 | |
| 			_mesi.destroy();
 | |
| 			_giornifinale.destroy();
 | |
| 			for (int i=0;i<31;i++)
 | |
| 			{
 | |
|      		_giorni.add(new real(ZERO),i);
 | |
|      		_giornifinale.add(new real(ZERO),i);
 | |
| 			}	     		
 | |
| 			for (int j=0;j<12;j++)
 | |
|      		_mesi.add(new real(ZERO),j);
 | |
| 		}
 | |
| 		else
 | |
| 		{			
 | |
| 	  	if (_dataini.ok())
 | |
| 				da.put(DON_DATADON, _dataini);
 | |
| 	  	if (_datafin.ok())
 | |
| 				a.put(DON_DATADON, _datafin);
 | |
| 		}	
 | |
| 		current_cursor()->setregion(da, a);
 | |
| 		current_cursor()->setfilter(filtro, TRUE);
 | |
| 		((TSorted_cursor*)current_cursor())->change_order(chiave);
 | |
|  		_contatore = 0;
 | |
|  		_totfinestampa = 0;
 | |
| 		_dataold = NULLDATE;
 | |
| 		_luogoold = "****";
 | |
| 		_sezold = "****";
 | |
| 		_gruppoold = "****";
 | |
| 	  reset_files(); 
 | |
|   	add_file(LF_DONAZ);
 | |
| 		reset_print();
 | |
| 		printer().footerlen(0);		
 | |
| 		crea_intestazione();
 | |
| 		return TRUE;
 | |
|   }	            
 | |
|  	else
 | |
|   	return FALSE;
 | |
| }
 | |
| 
 | |
| void TFogliDonazione::crea_intestazione()
 | |
| {
 | |
|   reset_header();
 | |
|   TString sep(132);
 | |
|   sep = "STAMPA FOGLI DELLE DONAZIONI - ";
 | |
| 	if (_dataini.ok())
 | |
| 	{
 | |
| 		sep << "dal ";
 | |
| 		sep << _dataini.string();
 | |
| 	}
 | |
| 	if (_datafin.ok())
 | |
| 	{
 | |
| 		sep << " al ";
 | |
| 		sep << _datafin.string();
 | |
| 	}
 | |
| 	if (_luogodon.not_empty())
 | |
| 	{		
 | |
| 		sep << "effettuate a ";
 | |
| 		sep << _luogodon;
 | |
| 	}		
 | |
| 	sep.center_just(132);			
 | |
| 	set_header(2,"@0g%s", (const char*) sep);
 | |
| 	
 | |
| 	set_header(3,"@0gProg.@9gEt.sacca@30gCat.@34gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh@118gFen.Rh@125gKellDu");
 | |
| 	
 | |
| 	set_header(4,"@0gCodice@7gEt.sacca@17gCodice@26gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh@118gFen.Rh@125gKellDu");
 | |
| }
 | |
| 
 | |
| bool TFogliDonazione::user_create()
 | |
| {
 | |
|   _rel = new TRelation(LF_DONAZ);
 | |
|   _rel->add(LF_SOGGETTI, "CODICE==CODICE");
 | |
|   _msk = new TMask("at5700a");
 | |
|   add_cursor(new TSorted_cursor(_rel,"","",2));
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| bool TFogliDonazione::user_destroy()
 | |
| {
 | |
|   delete _msk;
 | |
|   delete _rel;
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| int at5700(int argc, char* argv[])
 | |
| {
 | |
|   TFogliDonazione a;
 | |
|   a.run(argc, argv, "Stampa fogli di donazioni");
 | |
|   return 0;
 | |
| }
 |