From 9a81d20aa79f024e847d990e56d55afe01ee480b Mon Sep 17 00:00:00 2001
From: cris <cris@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Fri, 7 Aug 1998 10:46:18 +0000
Subject: [PATCH] Patch level         : Files correlati     : Ricompilazione
 Demo : [ ] Commento            : Stampa scadenze per controlli

git-svn-id: svn://10.65.10.50/trunk@6938 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
 at/at6700.cpp  | 443 +++++++++++++++++++++++++++++++++++++++++++++++++
 at/at6700a.h   |  34 ++++
 at/at6700a.uml | 320 +++++++++++++++++++++++++++++++++++
 3 files changed, 797 insertions(+)
 create mode 100755 at/at6700.cpp
 create mode 100755 at/at6700a.h
 create mode 100755 at/at6700a.uml

diff --git a/at/at6700.cpp b/at/at6700.cpp
new file mode 100755
index 000000000..ce48a63a9
--- /dev/null
+++ b/at/at6700.cpp
@@ -0,0 +1,443 @@
+#include <form.h>
+#include <mask.h>
+#include <printapp.h>
+#include <recarray.h>
+#include <tabutil.h>
+#include <utility.h>
+
+#include "at6.h"
+
+#define ALIAS_TCS	200
+#define ALIAS_LCPRES	101		// localita' postale di residenza
+#define ALIAS_LCPDOM	100		// localita' postale di domicilio
+#define ALIAS_COMRES 	502		// comune di residenza
+#define ALIAS_COMDOM 	501		// comune di domicilio
+#define ALIAS_COMNAS 	500		// comune di nascita
+
+// nomi campi maschera
+#include "at6700a.h"
+          
+// nomi dei campi
+#include "soggetti.h"
+#include "contsan.h"
+#include "sezioni.h"
+#include <comuni.h>
+
+enum ts { undefined = 0, elenco = 1, etichette = 2 };
+
+// definizione form per etichette
+class TEti_scadenzectrl_form : public TForm
+{
+public:
+	
+	virtual TCursor* cursor() const;
+	virtual TRelation* relation() const;
+	TPrint_section& get_body() { return section('B'); } ;
+  TEti_scadenzectrl_form(): TForm() {};
+  TEti_scadenzectrl_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "")
+    						: TForm(form,code,editlevel,desc) {};
+  virtual ~TEti_scadenzectrl_form() {};
+};
+
+class TScadenzeControlli : public TPrintapp
+{
+	TMask*						_msk;
+	TRelation*   			_rel;
+	TLocalisamfile*		_contsan;
+	TRecord_array* 		_scontrolli;
+  TEti_scadenzectrl_form*	_form_eti;
+  TAssoc_array		  _categorie;
+	int 							_cur;	
+	int								_contatore, _totale;
+	TDate							_data_stampa, _dataini, _datafin;
+	TString16					_codsez, _codsot;
+	TString16					_tipo1;
+  TString16					_lettini, _lettfin;	
+  TParagraph_string _cognome_nome, _rigastampa, _dencom;
+	ts 	      				_tipostampa;
+	int								_etlarghezza, _etcolonne;
+
+	static bool filter_func_scadenzectrl(const TRelation* rel);
+
+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 filtra_sezioni();
+  void crea_intestazione();
+  void header_sezione(const TString16 codsez, const TString16 codsot);
+  void footer_sezione();
+  void fine_stampa();
+	TScadenzeControlli() : _data_stampa(TODAY), _cognome_nome("",51), _rigastampa("", 71), _dencom("",51)  {}
+};
+
+HIDDEN inline TScadenzeControlli& app() { return (TScadenzeControlli&) main_app(); }
+
+TCursor* TEti_scadenzectrl_form::cursor() const { return app().current_cursor(); }
+
+TRelation* TEti_scadenzectrl_form::relation() const { return cursor()->relation(); }
+
+print_action TScadenzeControlli::postprocess_print(int file, int counter)
+{ 
+	if (_contatore > 0)
+		footer_sezione();
+	fine_stampa();				
+	return NEXT_PAGE;
+}
+
+void TScadenzeControlli::fine_stampa()
+{
+	// stampa totale soggetti a fine stampa
+	reset_footer();
+	TString sep(80);
+	sep.fill('-');
+	set_footer(2, (const char *) sep);
+	if (_totale > 0)
+	{
+		if (_totale != _contatore)
+		{
+			set_footer(3,"TOTALE SOGGETTI SBLOCCATI %d", _totale);
+			printer().formfeed();		
+		}			
+	}			
+	else		
+	{
+		set_footer(3,"NON CI SONO SOGGETTI SOSPESI DA SBLOCCARE");		
+		printer().formfeed();		
+	}		
+	reset_footer(); 
+}
+
+void TScadenzeControlli::footer_sezione()
+{
+	if (_contatore > 0)
+	{
+		reset_footer();
+		TString sep(80);
+		sep.fill('-');
+		set_footer(2, (const char *) sep);
+		set_footer(3,"TOTALE SOGGETTI STAMPATI %d", _contatore);
+		printer().formfeed(); 
+		reset_footer();
+	}				
+}
+
+void TScadenzeControlli::filtra_sezioni()
+{
+ 	const TString16 sezini = _msk->get(F_SEZINI);
+ 	const TString16 sotini = _msk->get(F_SOTINI);
+ 	const TString16 sezfin = _msk->get(F_SEZFIN);
+ 	const TString16 sotfin = _msk->get(F_SOTFIN);
+  TRectype da(LF_SOGGETTI);
+  TRectype a(LF_SOGGETTI);   
+  if (sezini.not_empty())
+		da.put(SOG_CODSEZ, sezini);
+  if (sotini.not_empty())
+		da.put(SOG_CODSOT, sotini);
+  if (sezfin.not_empty())
+		a.put(SOG_CODSEZ, sezfin);
+  if (sotfin.not_empty())
+		a.put(SOG_CODSOT, sotfin);
+	current_cursor()->setregion(da, a);
+}	
+
+bool TScadenzeControlli::preprocess_page(int file, int counter)
+{ 
+	if (_tipostampa == elenco)
+	{
+		TRectype& recsog = current_cursor()->curr();
+		TString80 nome = recsog.get(SOG_COGNOME);
+		nome << " ";
+		nome << recsog.get(SOG_NOME);
+		_cognome_nome = nome;
+		TString256 localita = "";
+		localita << current_cursor()->curr(-ALIAS_LCPDOM).get("S6");
+		if (localita.not_empty() && localita.ok())
+		{
+			localita << " ";
+			localita << current_cursor()->curr(-ALIAS_LCPDOM).get("S0");
+			localita << " - ";		
+		}
+		else
+		{
+			localita = current_cursor()->curr(-ALIAS_COMDOM).get(COM_CAPCOM);
+			localita << " ";
+		}			
+		localita << current_cursor()->curr(-ALIAS_COMDOM).get(COM_DENCOM);
+		localita.trim();
+		_dencom = localita;
+		
+		TRectype* key = new TRectype(LF_CONTSAN);
+		long codice = recsog.get_long(SOG_CODICE);
+		key->put(CON_CODICE, codice);
+		int err = _scontrolli->read(key);
+		if ((err == NOERR) && (app()._scontrolli->rows()>0))
+		{
+			const TRectype& riga = app()._scontrolli->row(app()._scontrolli->rows());
+			TDate prossdata = riga.get_date(CON_PROSSDATA);
+		
+			TString80 rigastampa;
+			rigastampa = "";
+			rigastampa << "@72g"<<prossdata<<" ";
+			rigastampa << riga.get(CON_RESPONSAB);
+			_rigastampa = rigastampa;
+		}			
+		// salto pagina se cambio sezione
+		const TString16 codsez = recsog.get(SOG_CODSEZ);		
+		const TString16 codsot = recsog.get(SOG_CODSOT);		
+		if ((_codsez!=codsez)||(_codsot!=codsot))
+		{
+			if ((_codsez != "**") && (_contatore > 0))
+				footer_sezione();
+			_contatore = 0;			
+			_codsez = codsez;
+			_codsot = codsot;
+			header_sezione(codsez, codsot);
+		}
+		if (printer().rows_left() < 4)
+			printer().formfeed();
+	}		
+	if (_tipostampa==etichette)		
+		if (printer().rows_left() < _form_eti->get_body().height())
+			printer().formfeed();
+	_contatore++;			
+	_totale++;
+  return TRUE;
+}
+
+void TScadenzeControlli::set_page(int file, int cnt)
+{ 
+	switch (_tipostampa)
+	{
+		case etichette:
+		{
+			TPrint_section& corpo = _form_eti->get_body();
+			corpo.update();
+  		for (word i = 0; i < corpo.height(); i++)
+  		{
+  			TPrintrow& riga = corpo.row(i);
+  			set_row(i+1,riga);
+			}  			
+			force_setpage(TRUE);	// serve perch� alla prossima etichetta rifaccia la setpage
+														// altrimenti stampa sempre la stessa etichetta
+		}
+		break;
+		case elenco:
+		{
+			set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
+			set_row(2,"@0g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS));
+			set_row(3,"@0g@S", FLD(LF_SOGGETTI,SOG_CATDON));
+			
+			set_row(1,"@9g#a", &_cognome_nome);
+			set_row(2,"@9g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
+			set_row(3,"@9g#a", &_dencom);
+
+			set_row(1,"@61g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
+			set_row(2,"@61g@S", FLD(LF_SOGGETTI,SOG_GRUPPOAB0));
+			set_row(2,"@66g@S", FLD(LF_SOGGETTI,SOG_RHANTID));
+
+			set_row(1,"@72g@S", FLD(LF_SOGGETTI,SOG_TELABI));
+			set_row(1,"@87g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
+			set_row(1,"@102g@S", FLD(LF_SOGGETTI,SOG_TELALT));
+			
+			set_row(2,"@72g#a", &_rigastampa);
+			
+			set_row(4,"");
+		}			
+		break;
+	}		
+}
+
+bool TScadenzeControlli::filter_func_scadenzectrl(const TRelation* rel)
+{   
+	bool filtrato = TRUE;
+	TRectype& recsog = rel->lfile().curr();
+	// filtro per categorie
+	TAssoc_array& categorie = app()._categorie;
+	if (categorie.items() != 0)
+	{
+		const TString16 cat = recsog.get(SOG_CATDON);
+		filtrato = categorie.is_key((const char*) cat);
+	}	
+	// filtro per iniziale cognome		
+	if (filtrato && (!app()._lettini.blank()) && (!app()._lettfin.blank()))
+	{
+		TString80 cognome = recsog.get(SOG_COGNOME);
+		int leni = app()._lettini.len();
+		TString16 cognomei = cognome.left(leni);
+		int lenf = app()._lettfin.len();
+		TString16 cognomef = cognome.left(lenf);
+		if (!(cognomei >= app()._lettini && cognomef <= app()._lettfin))
+			filtrato = FALSE;
+	}	
+	if (filtrato)
+	{
+		TRectype* key = new TRectype(LF_CONTSAN);
+		long codice = recsog.get_long(SOG_CODICE);
+		key->put(CON_CODICE, codice);
+		int err = app()._scontrolli->read(key);
+		if ((err == NOERR) && (app()._scontrolli->rows()>0))
+		{
+			const TRectype& riga = app()._scontrolli->row(app()._scontrolli->rows());
+			TString16 prosstipo = riga.get(CON_PROSSTIPO);
+			TDate prossdata = riga.get_date(CON_PROSSDATA);
+			if (!((prosstipo == app()._tipo1) && (prossdata >= app()._dataini) && (prossdata <= app()._datafin)))
+				filtrato = FALSE;				
+		}
+		else
+			filtrato = FALSE;
+	}
+	return filtrato;
+}
+
+void TScadenzeControlli::header_sezione(const TString16 codsez, const TString16 codsot)
+{
+	const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ);
+	const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT);
+	TString intestazione(132);
+	intestazione = "Sezione: ";
+	intestazione << codsez;
+	intestazione << "/";
+	intestazione << codsot;
+	intestazione << " ";
+	intestazione << densez;
+	if ((densot.ok())&& (densot.not_empty()))
+	{
+		intestazione << "/";
+		intestazione << densot;
+	}		
+	intestazione.center_just();
+	set_header(1,"@0g%s", (const char*) intestazione);
+	return;
+}
+
+bool TScadenzeControlli::set_print(int)
+{
+	_tipostampa = undefined;
+  KEY tasto;
+  tasto = _msk->run();
+  switch (tasto)
+  {
+  case F_ELENCO:
+  	_tipostampa = elenco;
+  	_codsez = "**";
+  	_codsot = "**";
+  	break;
+  case F_ETICHETTE:
+  	_tipostampa = etichette;	
+  	break;
+  }	
+	if (_tipostampa != undefined)
+  {
+		_tipo1 = _msk->get(F_TIPO1);
+		_dataini = _msk->get_date(F_DATAINI);
+		_datafin = _msk->get_date(F_DATAFIN);
+		_lettini = _msk->get(F_LETTINI);
+		_lettini.left(15);
+		_lettfin = _msk->get(F_LETTFIN);
+		_lettfin.left(15);		
+		_contatore = 0;
+		_totale = 0;
+    reset_files(); 
+    add_file(LF_SOGGETTI);
+		filtra_sezioni();
+	  // filtro per categorie
+	  _categorie.destroy();
+  	const TString16 catpri = _msk->get(F_CAT1);
+  	const TString16 catsec = _msk->get(F_CAT2);
+  	const TString16 catter = _msk->get(F_CAT3);
+  	const TString16 catqua = _msk->get(F_CAT4);
+  	const TString16 catqui = _msk->get(F_CAT5);
+  	const TString16 catses = _msk->get(F_CAT6);
+	  if (catpri.not_empty() && catpri.ok())
+  		_categorie.add((const char*) catpri);
+  	if (catsec.not_empty() && catsec.ok())
+  		_categorie.add((const char*) catsec);
+  	if (catter.not_empty() && catter.ok())
+  		_categorie.add((const char*) catter);
+  	if (catqua.not_empty() && catqua.ok())
+  		_categorie.add((const char*) catqua);
+  	if (catqui.not_empty() && catqui.ok())
+  		_categorie.add((const char*) catqui);
+  	if (catses.not_empty() && catses.ok())
+  		_categorie.add((const char*) catses);
+		current_cursor()->set_filterfunction(filter_func_scadenzectrl,TRUE);
+		reset_print();		
+    crea_intestazione();
+    return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+void TScadenzeControlli::crea_intestazione()
+{
+	reset_header();
+	TString sep(132);
+ 	sep = "STAMPA SCADENZE PER CONTROLLI SANITARI";	
+	sep.center_just();
+ 	set_header(2, "@0g%s", (const char*) sep);
+ 	TDate data_stampa = _data_stampa.string();
+  set_header(2,"@0g%10s", (const char*) data_stampa);
+  sep = "";
+  sep << "Pag. @#";
+  set_header(2, "@125g%s", (const char*) sep);  
+  	
+  sep = "";
+  sep.fill('-');
+  set_header(3, (const char *) sep);
+ 	set_header(4,"@0gCodice@9gCognome e nome@61gNato il@72gTelefono abit.@87gTelefono lav.@102gTelefono altro");
+ 	set_header(5,"@0gTessera@9gIndirizzo");
+	TString256 riga = "@0gCat.@61gGruppo Rh@72gData pros.";
+	//riga << _tipo1 << "@83gUltimo " << _tipo2 << "@94gUltimo " << _tipo3 << "@105gUltimo " << _tipo4 << "@116gUltimo " << _tipo5;
+ 	set_header(6,riga);
+ 	set_header(7,"@0g--------@9g---------------------------------------------------@61g----------@72g------------------------------------------------------");
+ 	printer().footerlen(3);
+}
+
+bool TScadenzeControlli::user_create()
+{
+	_msk = new TMask("at6700a");
+	_rel = new TRelation(LF_SOGGETTI);
+	_rel->add(LF_SEZIONI,"CODSEZ==CODSEZ|CODSOT==CODSOT");
+  _rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS);
+  _rel->add("LCP", "CODTAB==RES_CODLOC",1,LF_SOGGETTI,ALIAS_LCPRES);
+  _rel->add("LCP", "CODTAB==DOM_CODLOC",1,LF_SOGGETTI,ALIAS_LCPDOM);
+  _rel->add(LF_COMUNI, "COM==RES_CODCOM",1,LF_SOGGETTI,ALIAS_COMRES);
+  _rel->add(LF_COMUNI, "COM==DOM_CODCOM",1,LF_SOGGETTI,ALIAS_COMDOM);
+  _rel->add(LF_COMUNI, "COM==COMNASC",1,LF_SOGGETTI,ALIAS_COMNAS);
+  
+	//cursore ordinamento per sezione+sottogruppo+cognome+nome  
+  _cur = add_cursor(new TCursor(_rel, "", 3));
+	_contsan = new TLocalisamfile(LF_CONTSAN);
+	_scontrolli = new TRecord_array(LF_CONTSAN, CON_PROGCON);
+  TConfig config(CONFIG_STUDIO);
+  TString16 etformato = config.get("EtFormato");
+  _etlarghezza = config.get_int("EtLarghezza");
+  _etcolonne = config.get_int("EtColonne");
+	_form_eti = new TEti_scadenzectrl_form(etformato);
+	
+	return TRUE;
+}	
+
+bool TScadenzeControlli::user_destroy()	
+{
+	delete _form_eti;
+	delete _scontrolli;
+	delete _contsan;
+	delete _rel;
+	delete _msk;
+	return TRUE;
+}
+
+int at6700(int argc, char* argv[])
+{
+	TScadenzeControlli a;
+	a.run(argc, argv, "Stampa scadenze per controlli");
+	return 0;
+}
\ No newline at end of file
diff --git a/at/at6700a.h b/at/at6700a.h
new file mode 100755
index 000000000..4371011c7
--- /dev/null
+++ b/at/at6700a.h
@@ -0,0 +1,34 @@
+// stampa scadenze per controlli sanitari
+// definizione campi per maschera di selezione
+
+#define F_SEZINI    101
+#define F_D_SEZINI  102
+#define F_SOTINI    103
+#define F_D_SOTINI  104
+#define F_SEZFIN    105
+#define F_D_SEZFIN  106
+#define F_SOTFIN    107
+#define F_D_SOTFIN  108
+
+#define F_CAT1      201
+#define F_D_CAT1    202
+#define F_CAT2      203
+#define F_D_CAT2    204
+#define F_CAT3      205
+#define F_D_CAT3    206
+#define F_CAT4      207
+#define F_D_CAT4    208
+#define F_CAT5      209
+#define F_D_CAT5    210
+#define F_CAT6      211
+#define F_D_CAT6    212
+
+#define F_TIPO1         301
+#define F_D_TIPO1       302
+#define F_DATAINI       303
+#define F_DATAFIN       304
+#define F_LETTINI       305
+#define F_LETTFIN       306
+
+#define F_ELENCO    401
+#define F_ETICHETTE 402
diff --git a/at/at6700a.uml b/at/at6700a.uml
new file mode 100755
index 000000000..5e7bac119
--- /dev/null
+++ b/at/at6700a.uml
@@ -0,0 +1,320 @@
+#include "at6700a.h"
+
+TOOLBAR "" 0 20 0 2
+
+BUTTON F_ELENCO 9 2
+BEGIN
+        PROMPT -13 -11 "~Elenco"
+        MESSAGE EXIT,F_ELENCO
+END
+
+BUTTON F_ETICHETTE 9 2
+BEGIN
+        PROMPT -23 -11 "E~tichette"
+        MESSAGE EXIT,F_ETICHETTE
+END
+
+BUTTON DLG_QUIT 9 2
+BEGIN
+        PROMPT -33 -11 ""
+END
+
+ENDPAGE
+
+PAGE "Scadenze per controlli sanitari" -1 -1 78 20
+
+GROUPBOX DLG_NULL 77 4
+BEGIN
+        PROMPT 1 1 "Scelta sezioni/sottogruppi"
+END
+
+STRING F_SEZINI  2
+BEGIN
+  PROMPT 2 2 "Da "
+  FLAGS "U"
+  USE LF_SEZIONI
+  INPUT CODSEZ F_SEZINI
+  INPUT CODSOT F_SOTINI
+  DISPLAY "Cod.sez" CODSEZ
+  DISPLAY "Cod.sot." CODSOT
+  DISPLAY "Sezione@25" DENSEZ
+  DISPLAY "Sottogruppo@25" DENSOT
+  OUTPUT F_SEZINI CODSEZ
+  OUTPUT F_D_SEZINI DENSEZ
+  OUTPUT F_SOTINI CODSOT
+  OUTPUT F_D_SOTINI DENSOT
+  CHECKTYPE SEARCH
+  HELP "Codice sezione da cui partire"
+END
+
+STRING F_D_SEZINI 25
+BEGIN
+  PROMPT 11 2 ""
+  FLAGS "U"
+  USE LF_SEZIONI KEY 2
+  INPUT DENSEZ F_D_SEZINI
+  DISPLAY "Sezione@25" DENSEZ
+  DISPLAY "Sottogruppo@25" DENSOT
+  DISPLAY "Cod.sez" CODSEZ
+  DISPLAY "Cod.sot." CODSOT
+  COPY OUTPUT F_SEZINI
+  CHECKTYPE NORMAL
+  HELP "Sezione da cui partire"
+END
+
+STRING F_SOTINI 2
+BEGIN
+  PROMPT 2 3 "   "
+  COPY ALL F_SEZINI
+  CHECKTYPE SEARCH
+  HELP "Codice sottogruppo da cui partire"
+END
+
+STRING F_D_SOTINI 25
+BEGIN        	
+  PROMPT 11 3 ""
+  FLAGS "U"
+  COPY USE F_D_SEZINI
+  INPUT DENSEZ F_D_SEZINI
+  INPUT DENSOT F_D_SOTINI
+  COPY DISPLAY F_D_SEZINI
+  COPY OUTPUT F_D_SEZINI
+  CHECKTYPE NORMAL
+  HELP "Sottogruppo da cui partire"
+END
+
+STRING F_SEZFIN  2
+BEGIN
+  PROMPT 41 2 "A "
+  FLAGS "U"
+  USE LF_SEZIONI
+  INPUT CODSEZ F_SEZFIN
+  INPUT CODSOT F_SOTFIN
+  DISPLAY "Cod.sez" CODSEZ
+  DISPLAY "Cod.sot." CODSOT
+  DISPLAY "Sezione@25" DENSEZ
+  DISPLAY "Sottogruppo@25" DENSOT
+  OUTPUT F_SEZFIN CODSEZ
+  OUTPUT F_D_SEZFIN DENSEZ
+  OUTPUT F_SOTFIN CODSOT
+  OUTPUT F_D_SOTFIN DENSOT
+  CHECKTYPE SEARCH
+  HELP "Codice sezione finale"
+END
+
+STRING F_D_SEZFIN 25
+BEGIN
+  PROMPT 49 2 ""
+  FLAGS "U"
+  USE LF_SEZIONI KEY 2
+  INPUT DENSEZ F_D_SEZFIN
+  DISPLAY "Sezione@25" DENSEZ
+  DISPLAY "Sottogruppo@25" DENSOT
+  DISPLAY "Cod.sez" CODSEZ
+  DISPLAY "Cod.sot." CODSOT
+  COPY OUTPUT F_SEZFIN
+  CHECKTYPE NORMAL
+  HELP "Sezione finale"
+END
+
+STRING F_SOTFIN 2
+BEGIN
+  PROMPT 41 3 "  "
+  COPY ALL F_SEZFIN
+  CHECKTYPE SEARCH
+  HELP "Codice sottogruppo finale"
+END
+
+STRING F_D_SOTFIN 25
+BEGIN        	
+  PROMPT 49 3 ""
+  FLAGS "U"
+  COPY USE F_D_SEZFIN
+  INPUT DENSEZ F_D_SEZFIN
+  INPUT DENSOT F_D_SOTFIN
+  COPY DISPLAY F_D_SEZFIN
+  COPY OUTPUT F_D_SEZFIN
+  CHECKTYPE NORMAL
+  HELP "Sottogruppo finale"
+END
+
+GROUPBOX DLG_NULL 77 5
+BEGIN
+  PROMPT 1 5 "Categorie"
+END
+
+
+STRING F_CAT1 2
+BEGIN
+  PROMPT 2 6 ""
+  FLAGS "U"
+  USE CTD
+  INPUT CODTAB F_CAT1
+  DISPLAY "Codice" CODTAB
+  DISPLAY "Descrizione@30" S0
+  OUTPUT F_CAT1 CODTAB
+  OUTPUT F_D_CAT1 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Categoria di appartenenza"
+END
+
+STRING F_D_CAT1 30
+BEGIN
+  PROMPT 8 6 ""
+  FLAGS "D"
+END
+
+STRING F_CAT2 2
+BEGIN
+  PROMPT 2 7 ""
+  FLAGS "U"
+  USE CTD
+  INPUT CODTAB F_CAT2
+  COPY DISPLAY F_CAT1
+  OUTPUT F_CAT2 CODTAB
+  OUTPUT F_D_CAT2 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Categoria di appartenenza"
+END
+
+STRING F_D_CAT2 30
+BEGIN
+  PROMPT 8 7 ""
+  FLAGS "D"
+END
+
+STRING F_CAT3 2
+BEGIN
+  PROMPT 2 8 ""
+  FLAGS "U"
+  USE CTD
+  INPUT CODTAB F_CAT3
+  COPY DISPLAY F_CAT1
+  OUTPUT F_CAT3 CODTAB
+  OUTPUT F_D_CAT3 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Categoria di appartenenza"
+END
+
+STRING F_D_CAT3 30
+BEGIN
+  PROMPT 8 8 ""
+  FLAGS "D"
+END
+
+STRING F_CAT4 2
+BEGIN
+  PROMPT 40 6 ""
+  FLAGS "U"
+  USE CTD
+  INPUT CODTAB F_CAT4
+  COPY DISPLAY F_CAT1
+  OUTPUT F_CAT4 CODTAB
+  OUTPUT F_D_CAT4 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Categoria di appartenenza"
+END
+
+STRING F_D_CAT4 30
+BEGIN
+  PROMPT 46 6 ""
+  FLAGS "D"
+END
+
+STRING F_CAT5 2
+BEGIN
+  PROMPT 40 7 ""
+  FLAGS "U"
+  USE CTD
+  INPUT CODTAB F_CAT5
+  COPY DISPLAY F_CAT1
+  OUTPUT F_CAT5 CODTAB
+  OUTPUT F_D_CAT5 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Categoria di appartenenza"
+END
+
+STRING F_D_CAT5 30
+BEGIN
+  PROMPT 46 7 ""
+  FLAGS "D"
+END
+
+STRING F_CAT6 2
+BEGIN
+  PROMPT 40 8 ""
+  FLAGS "U"
+  USE CTD
+  INPUT CODTAB F_CAT6
+  COPY DISPLAY F_CAT1
+  OUTPUT F_CAT6 CODTAB
+  OUTPUT F_D_CAT6 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Categoria di appartenenza"
+END
+
+STRING F_D_CAT6 30
+BEGIN
+  PROMPT 46 8 ""
+  FLAGS "D"
+END
+
+GROUPBOX DLG_NULL 77 4
+BEGIN
+        PROMPT 1 10 "Selezioni per la stampa"
+END
+
+STRING F_TIPO1 2
+BEGIN
+  PROMPT 2 11 "Tipo controllo "
+  FLAGS "U"
+  USE TCS
+  INPUT CODTAB F_TIPO1
+  DISPLAY "Codice" CODTAB
+  DISPLAY "Descrizione@30" S0
+  OUTPUT F_TIPO1 CODTAB
+  OUTPUT F_D_TIPO1 S0
+  CHECKTYPE NORMAL
+  WARNING "Codice non presente"
+  HELP "Tipo/Esito controllo sanitario"
+END
+
+STRING F_D_TIPO1 30
+BEGIN
+  PROMPT 22 11 ""
+  FLAGS "D"
+END
+
+DATE F_DATAINI
+BEGIN
+   PROMPT 2 12 "Data iniziale  "
+END
+
+DATE F_DATAFIN
+BEGIN
+   PROMPT 30 12 "Data finale "
+END
+
+STRING F_LETTINI 15
+BEGIN
+   PROMPT 2 15 "Selezione iniziali cognome: da "
+   FLAG "U"
+   //PICTURE "!!"
+END
+
+STRING F_LETTFIN 15
+BEGIN
+   PROMPT 50 15 "a "
+   FLAG "U"
+   //VALIDATE (#F_LETTINI<=#F_LETTFIN)
+   //PICTURE "!!"
+END
+
+ENDPAGE
+ENDMASK