Parametrizzazione e stampa statistiche

git-svn-id: svn://10.65.10.50/trunk@5104 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1997-08-26 13:40:34 +00:00
parent 3103a7a6e4
commit b21a147663
13 changed files with 337 additions and 90 deletions

View File

@ -1,3 +1,3 @@
86 86
0 0
$svriep|0|0|95|0|Riepilogo statistiche di vendita||| $svriep|2|15|98|0|Riepilogo statistiche di vendita|||

View File

@ -1,5 +1,5 @@
86 86
12 13
ANNO|2|4|0|Anno solare ANNO|2|4|0|Anno solare
PERIODO|2|3|0|Periodo di riferimento PERIODO|2|3|0|Periodo di riferimento
TIPODOC|1|4|0|Tipo documento TIPODOC|1|4|0|Tipo documento
@ -8,9 +8,10 @@ CODART|1|20|0|Codice articolo
UMQTA|1|2|0|Unita' di misura UMQTA|1|2|0|Unita' di misura
CODAG|1|5|0|Codice agente CODAG|1|5|0|Codice agente
CODCF|1|6|0|Codice cliente/fornitore CODCF|1|6|0|Codice cliente/fornitore
LIVELLO|1|15|0|Livello di giacenza ZONA|1|3|0|Codice Zona
CODMAG|1|5|0|Codice magazzino GIAC|1|15|0|Livello di giacenza
MAG|1|5|0|Codice magazzino
QUANTITA|4|11|3|Quantita QUANTITA|4|11|3|Quantita
VALORE|4|18|2|Valore VALORE|4|18|2|Valore
1 1
ANNO+PERIODO+TIPODOC+TIPOART+CODART+UMQTA+CODAG+CODCF+LIVELLO+CODMAG| ANNO+PERIODO+TIPODOC+TIPOART+CODART+UMQTA+CODAG+CODCF+ZONA+GIAC|

View File

@ -8,8 +8,11 @@ int main(int argc, char** argv)
int n = argc > 1 ? atoi(argv[1]+1) : 0; int n = argc > 1 ? atoi(argv[1]+1) : 0;
switch(n) switch(n)
{ {
case 0:
sv0100(argc, argv);
break;
case 3: case 3:
st0400(argc, argv); sv0400(argc, argv);
break; break;
default: default:
error_box("Invalid argument %s", argv[1]); error_box("Invalid argument %s", argv[1]);

View File

@ -1,9 +1,9 @@
#ifndef __ST0_H #ifndef __SV0_H
#define __ST0_H #define __SV0_H
int st0100(int argc, char* argv[]); int sv0100(int argc, char* argv[]);
int st0200(int argc, char* argv[]); int sv0200(int argc, char* argv[]);
int st0300(int argc, char* argv[]); int sv0300(int argc, char* argv[]);
int st0400(int argc, char* argv[]); int sv0400(int argc, char* argv[]);
#endif #endif

View File

@ -8,7 +8,7 @@ class TParametri_stat : public TConfig_application
bool _ask_update; bool _ask_update;
protected: protected:
virtual bool postprocess_config_changed (const char* par, const char* var, const char* oldv, const char* newv); virtual bool postprocess_config_changed (const char*, const char*, const char*, const char*);
virtual bool user_destroy(); virtual bool user_destroy();
public: public:
@ -39,7 +39,7 @@ TParametri_stat::TParametri_stat()
: TConfig_application(CONFIG_DITTA), _ask_update(FALSE) : TConfig_application(CONFIG_DITTA), _ask_update(FALSE)
{ } { }
int st0400(int argc, char* argv[]) int sv0400(int argc, char* argv[])
{ {
TParametri_stat app; TParametri_stat app;
app.run(argc, argv, "Parametri statistiche"); app.run(argc, argv, "Parametri statistiche");

View File

@ -11,7 +11,8 @@
#define F_RAGGRUPPA_OMAGGI 114 #define F_RAGGRUPPA_OMAGGI 114
#define F_AGENTE 121 #define F_AGENTE 121
#define F_CLIENTE 122 #define F_CLIENTE 122
#define F_GIACENZA 123 #define F_ZONA 123
#define F_MAGAZZINO 124 #define F_GIACENZA 124
#define F_MAGAZZINO 125
#endif #endif

View File

@ -21,15 +21,18 @@ BEGIN
PROMPT 1 1 "@bFrequenza di raggruppamento" PROMPT 1 1 "@bFrequenza di raggruppamento"
END END
LIST F_FREQUENZA 1 20 LIST F_FREQUENZA 1 15
BEGIN BEGIN
PROMPT 2 2 "Frequenza " PROMPT 2 2 "Frequenza "
ITEM "G|Giornaliera" ITEM "G|Giornaliera"
ITEM "S|Settimanale" ITEM "S|Settimanale"
ITEM "Q|Quindicinale" ITEM "Q|Quindicinale"
ITEM "M|Mensile" ITEM "1|Mensile"
ITEM "B|Bimestrale" ITEM "2|Bimestrale"
ITEM "T|Trimestrale" ITEM "3|Trimestrale"
ITEM "4|Quadrimestrale"
ITEM "6|Semestrale"
ITEM "A|Annuale"
FIELD Frequenza FIELD Frequenza
END END
@ -130,15 +133,21 @@ BEGIN
FIELD ClienteGrp FIELD ClienteGrp
END END
BOOLEAN F_ZONA
BEGIN
PROMPT 40 17 "Zona"
FIELD ZonaGrp
END
BOOLEAN F_GIACENZA BOOLEAN F_GIACENZA
BEGIN BEGIN
PROMPT 40 17 "Giacenza" PROMPT 40 18 "Giacenza"
FIELD GiacenzaGrp FIELD GiacenzaGrp
END END
BOOLEAN F_MAGAZZINO BOOLEAN F_MAGAZZINO
BEGIN BEGIN
PROMPT 40 18 "Magazzino" PROMPT 40 19 "Magazzino"
FIELD MagazzinoGrp FIELD MagazzinoGrp
END END

View File

@ -8,12 +8,9 @@ int main(int argc, char** argv)
int n = argc > 1 ? atoi(argv[1]+1) : 0; int n = argc > 1 ? atoi(argv[1]+1) : 0;
switch(n) switch(n)
{ {
case 0: case 0 : sv1100(argc, argv); break;
sv1100(argc, argv); case 1 : sv1200(argc, argv); break;
break; default: error_box("Invalid argument %s", argv[1]); break;
default:
error_box("Invalid argument %s", argv[1]);
break;
} }
exit(0); exit(0);
return 0; return 0;

View File

@ -2,5 +2,6 @@
#define __SV1_H #define __SV1_H
int sv1100(int argc, char* argv[]); int sv1100(int argc, char* argv[]);
int sv1200(int argc, char* argv[]);
#endif #endif

View File

@ -127,14 +127,14 @@ END
RADIOBUTTON F_PROVVIS 1 24 RADIOBUTTON F_PROVVIS 1 24
BEGIN BEGIN
PROMPT 1 15 "Tipo movimenti" PROMPT 1 15 "@bTipo movimenti"
ITEM "D|Definitivi" ITEM "D|Definitivi"
ITEM "P|Provvisori" ITEM "P|Provvisori"
END END
RADIOBUTTON F_TIPO 1 26 RADIOBUTTON F_TIPO 1 26
BEGIN BEGIN
PROMPT 27 15 "Tipo stampa" PROMPT 27 15 "@bTipo stampa"
ITEM "S|Sintetica" ITEM "S|Sintetica"
MESSAGE CLEAR,F_ORDINE MESSAGE CLEAR,F_ORDINE
ITEM "D|Dettagliata" ITEM "D|Dettagliata"
@ -143,7 +143,7 @@ END
RADIOBUTTON F_ORDINE 1 24 RADIOBUTTON F_ORDINE 1 24
BEGIN BEGIN
PROMPT 55 15 "Ordinamento" PROMPT 55 15 "@bOrdinamento"
ITEM "D|Documento" ITEM "D|Documento"
ITEM "A|Articolo" ITEM "A|Articolo"
END END
@ -161,7 +161,7 @@ SPREADSHEET F_SINTETICA 0 8
BEGIN BEGIN
PROMPT 1 2 "" PROMPT 1 2 ""
ITEM "Campo@12" ITEM "Campo@12"
ITEM "Testata@12" ITEM "Intestazione@17"
ITEM "Descrizione@50" ITEM "Descrizione@50"
ITEM "Importo" ITEM "Importo"
END END
@ -175,7 +175,7 @@ SPREADSHEET F_DETTAGLIATA
BEGIN BEGIN
PROMPT 1 12 "" PROMPT 1 12 ""
ITEM "Campo@12" ITEM "Campo@12"
ITEM "Testata@12" ITEM "Intestazione@17"
ITEM "Descrizione@50" ITEM "Descrizione@50"
ITEM "Importo" ITEM "Importo"
END END
@ -199,7 +199,7 @@ BEGIN
CHECKTYPE NORMAL CHECKTYPE NORMAL
END END
STRING S_HEAD 15 STRING S_HEAD 17
BEGIN BEGIN
PROMPT 1 2 "Intestazione " PROMPT 1 2 "Intestazione "
END END
@ -212,7 +212,7 @@ END
BOOLEAN S_IMPORTO BOOLEAN S_IMPORTO
BEGIN BEGIN
PROMPT 1 4 "Importo" PROMPT 41 1 "Importo"
FLAGS "D" FLAGS "D"
END END
@ -250,7 +250,7 @@ BEGIN
CHECKTYPE NORMAL CHECKTYPE NORMAL
END END
STRING S_HEAD 15 STRING S_HEAD 17
BEGIN BEGIN
PROMPT 1 2 "Intestazione " PROMPT 1 2 "Intestazione "
END END
@ -263,7 +263,7 @@ END
BOOLEAN S_IMPORTO BOOLEAN S_IMPORTO
BEGIN BEGIN
PROMPT 1 4 "Importo" PROMPT 41 1 "Importo"
FLAGS "D" FLAGS "D"
END END

View File

@ -6,58 +6,117 @@
#include "svriep.h" #include "svriep.h"
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TStats_agg // Funzioni di utilita' comune
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
void TStats_agg::init() TFrequenza_statistiche char2frequency(char c)
{ {
TConfig ini(CONFIG_DITTA, "sv"); const TFixed_string list(" GSQ12346A");
TFrequenza_statistiche f = TFrequenza_statistiche(list.find(c));
switch(ini.get_char("Frequenza")) return f;
{
case 'B': _frequenza = fs_bimestrale; break;
case 'M': _frequenza = fs_mensile; break;
case 'Q': _frequenza = fs_quindicinale; break;
case 'S': _frequenza = fs_settimanale; break;
case 'T': _frequenza = fs_trimestrale; break;
default : _frequenza = fs_giornaliera; break;
}
_merce = ini.get_bool("StatMerce");
_prestazioni = ini.get_bool("StatPrestazioni");
_omaggi = ini.get_bool("StatOmaggi");
_omaggio_is_merce = ini.get_bool("OmaggioIsMerce");
_art_nocode = ini.get_bool("ArtNoCode");
_art_noanag = ini.get_bool("ArtNoAnag");
_art_noanag_grp = ini.get_bool("ArtNoAnagGrp");
_agente = ini.get_bool("AgenteGrp");
_cliente = ini.get_bool("ClienteGrp");
_giacenza = ini.get_bool("GiacenzaGrp");
_magazzino = ini.get_bool("MagazzinoGrp");
} }
void TStats_agg::test_firm() const char frequency2char(TFrequenza_statistiche f)
{ {
const long ditta = prefix().get_codditta(); const char* list = " GSQ12346A";
if (ditta != _ditta) return list[f];
{
CHECK(_data.items() == 0, "Non cambiare ditta durante un'operazione di ricalcolo!");
((TStats_agg*)this)->init();
((TStats_agg*)this)->_ditta = ditta;
}
} }
int TStats_agg::date2period(const TDate& datadoc) const int last_period(int anno, TFrequenza_statistiche f)
{ {
test_firm(); int n = 0;
switch(f)
{
case fs_giornaliera : n = 365 + (TDate::last_day(2, anno) == 29); break;
case fs_settimanale : n = 52; break;
case fs_quindicinale : n = 24; break;
case fs_mensile : n = 12; break;
case fs_bimestrale : n = 6; break;
case fs_trimestrale : n = 4; break;
case fs_quadrimestrale : n = 3; break;
case fs_semestrale : n = 2; break;
case fs_annuale : n = 1; break;
default: NFCHECK("Invalid frequency");
}
return n;
}
int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2)
{
CHECK(f1 >= f2 && f2 != fs_nulla, "Invalid frequency division");
if (f1 == f2)
return 1;
switch (f1)
{
case fs_annuale:
switch(f2)
{
case fs_semestrale : return 2;
case fs_quadrimestrale: return 3;
case fs_trimestrale : return 4;
case fs_bimestrale : return 6;
case fs_mensile : return 12;
case fs_quindicinale : return 24;
case fs_settimanale : return 52;
default : break;
}
break;
case fs_semestrale:
switch(f2)
{
case fs_trimestrale :return 2;
case fs_bimestrale :return 3;
case fs_mensile :return 6;
case fs_quindicinale :return 12;
case fs_settimanale :return 26;
default :break;
}
break;
case fs_quadrimestrale:
switch(f2)
{
case fs_bimestrale :return 2;
case fs_mensile :return 4;
case fs_quindicinale :return 8;
default :break;
}
case fs_trimestrale:
switch(f2)
{
case fs_mensile :return 3;
case fs_quindicinale :return 6;
case fs_settimanale :return 13;
default :break;
}
break;
case fs_bimestrale:
switch(f2)
{
case fs_mensile :return 2;
case fs_quindicinale :return 4;
default :break;
}
break;
case fs_mensile:
if (f2 == fs_quindicinale)
return 2;
break;
default:
break;
}
return 0;
}
int date2period(const TDate& datadoc, TFrequenza_statistiche freq)
{
int classe; int classe;
if (_frequenza > fs_settimanale) if (freq > fs_settimanale)
{ {
classe = datadoc.month(); classe = datadoc.month();
switch(_frequenza) switch(freq)
{ {
case fs_quindicinale: case fs_quindicinale:
classe = (classe-1) * 2 + 1; classe = (classe-1) * 2 + 1;
@ -69,7 +128,16 @@ int TStats_agg::date2period(const TDate& datadoc) const
case fs_trimestrale: case fs_trimestrale:
classe = (classe-1) / 3 + 1; classe = (classe-1) / 3 + 1;
break; break;
default: case fs_quadrimestrale:
classe = (classe-1) / 4 + 1;
break;
case fs_semestrale:
classe = (classe-1) / 6 + 1;
break;
case fs_annuale:
classe = 1;
break;
default: // fs_mensile
break; break;
} }
} }
@ -77,18 +145,147 @@ int TStats_agg::date2period(const TDate& datadoc) const
{ {
const TDate primo(1, 1, datadoc.year()); const TDate primo(1, 1, datadoc.year());
classe = int(datadoc - primo); classe = int(datadoc - primo);
if (_frequenza == fs_settimanale) if (freq == fs_settimanale)
{
classe /= 7; classe /= 7;
if (classe > 51) classe = 51;
}
classe++; classe++;
} }
return classe; return classe;
} }
const TDate& floor(TDate& data, TFrequenza_statistiche freq)
{
switch (freq)
{
case fs_settimanale:
{
const TDate primo(1, 1, data.year());
int settimana = int((data - primo) / 7);
if (settimana > 51) settimana = 51;
data = primo;
data += settimana * 7;
}
break;
case fs_quindicinale:
data.set_day(data.day() <= 15 ? 1 : 16);
break;
case fs_mensile:
data.set_day(1);
break;
case fs_bimestrale:
data.set_day(1);
data.set_month(((data.month()-1) / 2) * 2 + 1);
break;
case fs_trimestrale:
data.set_day(1);
data.set_month(((data.month()-1) / 3) * 3 + 1);
break;
case fs_quadrimestrale:
data.set_day(1);
data.set_month(((data.month()-1) / 4) * 4 + 1);
break;
case fs_semestrale:
data.set_day(1);
data.set_month(data.month() <= 6 ? 1 : 7);
break;
case fs_annuale:
data.set_day(1);
data.set_month(1);
break;
default: break;
}
return data;
}
const TDate& ceil(TDate& data, TFrequenza_statistiche freq)
{
floor(data, freq);
switch (freq)
{
case fs_settimanale:
data += 6;
if (data.month() == 12 && data.day() >= 29)
data.set_end_month();
break;
case fs_quindicinale:
if (data.day() == 1)
data.set_day(15);
else
data.set_end_month();
break;
case fs_mensile:
data.set_end_month();
break;
case fs_bimestrale:
data.addmonth(1);
data.set_end_month();
break;
case fs_trimestrale:
data.addmonth(2);
data.set_end_month();
break;
case fs_quadrimestrale:
data.addmonth(3);
data.set_end_month();
break;
case fs_semestrale:
data.addmonth(5);
data.set_end_month();
break;
case fs_annuale:
data.set_month(12);
data.set_day(31);
break;
default: break;
}
return data;
}
///////////////////////////////////////////////////////////
// TStats_agg
///////////////////////////////////////////////////////////
void TStats_agg::init()
{
_ditta = prefix().get_codditta();
TConfig ini(CONFIG_DITTA, "sv");
_frequenza = char2frequency(ini.get_char("Frequenza"));
_merce = ini.get_bool("StatMerce");
_prestazioni = ini.get_bool("StatPrestazioni");
_omaggi = ini.get_bool("StatOmaggi");
_omaggio_is_merce = ini.get_bool("OmaggioIsMerce");
_art_nocode = ini.get_bool("ArtNoCode");
_art_noanag = ini.get_bool("ArtNoAnag");
_art_noanag_grp = ini.get_bool("ArtNoAnagGrp");
_agente = ini.get_bool("AgenteGrp");
_cliente = ini.get_bool("ClienteGrp");
_zona = ini.get_bool("ZonaGrp");
_giacenza = ini.get_bool("GiacenzaGrp");
_magazzino = ini.get_bool("MagazzinoGrp");
}
void TStats_agg::test_firm() const
{
const long ditta = prefix().get_codditta();
if (ditta > 0 && ditta != _ditta)
{
CHECK(_data.items() == 0, "Non cambiare ditta durante un'operazione di ricalcolo!");
((TStats_agg*)this)->init();
}
}
void TStats_agg::put_key(TRectype& stat, TToken_string& key) const void TStats_agg::put_key(TRectype& stat, TToken_string& key) const
{ {
CHECK(stat.num() == LF_SVRIEP, "Ci vuole un record delle statistiche"); CHECK(stat.num() == LF_SVRIEP, "Ci vuole un record delle statistiche");
stat.zero(); stat.zero();
stat.put(SVR_ANNO, key.get(0)); key.restart();
stat.put(SVR_ANNO, key.get());
stat.put(SVR_PERIODO, key.get()); stat.put(SVR_PERIODO, key.get());
stat.put(SVR_TIPODOC, key.get()); stat.put(SVR_TIPODOC, key.get());
stat.put(SVR_TIPOART, key.get()); stat.put(SVR_TIPOART, key.get());
@ -96,8 +293,9 @@ void TStats_agg::put_key(TRectype& stat, TToken_string& key) const
stat.put(SVR_UMQTA, key.get()); stat.put(SVR_UMQTA, key.get());
stat.put(SVR_CODAG, key.get()); stat.put(SVR_CODAG, key.get());
stat.put(SVR_CODCF, key.get()); stat.put(SVR_CODCF, key.get());
stat.put(SVR_LIVELLO, key.get()); stat.put(SVR_ZONA, key.get());
stat.put(SVR_CODMAG, key.get()); stat.put(SVR_GIAC, key.get());
stat.put(SVR_MAG, key.get());
} }
TStats_agg::TStats_data& TStats_agg::find(const TRiga_documento& rdoc) TStats_agg::TStats_data& TStats_agg::find(const TRiga_documento& rdoc)
@ -140,6 +338,11 @@ TStats_agg::TStats_data& TStats_agg::find(const TRiga_documento& rdoc)
else else
key.add(""); key.add("");
if (_zona)
key.add(doc.get(DOC_ZONA));
else
key.add("");
if (_giacenza) if (_giacenza)
key.add(rdoc.get(RDOC_LIVELLO)); key.add(rdoc.get(RDOC_LIVELLO));
else else
@ -282,6 +485,6 @@ bool TStats_agg::update()
return ok; return ok;
} }
TStats_agg::TStats_agg() : _ditta(0) TStats_agg::TStats_agg() : _ditta(-1)
{ {
} }

View File

@ -9,12 +9,32 @@
#include "..\ve\velib.h" #include "..\ve\velib.h"
#endif #endif
enum TFrequenza_statistiche { fs_nulla, fs_giornaliera,
fs_settimanale, fs_quindicinale,
fs_mensile, fs_bimestrale,
fs_trimestrale, fs_quadrimestrale,
fs_semestrale, fs_annuale };
// Converte una carattere in una frequenza delle statisitiche
TFrequenza_statistiche char2frequency(char c);
// Converte una frequenza delle statisitiche in un carattere
char frequency2char(TFrequenza_statistiche f);
// Arrotondamento di una data alla frequenza specificata
const TDate& floor(TDate& data, TFrequenza_statistiche freq);
const TDate& ceil(TDate& data, TFrequenza_statistiche freq);
// Ritorna il rapporto tra le frequenze: 0 se impossibile stabilirlo
int divide(TFrequenza_statistiche f1, TFrequenza_statistiche f2);
// Ritorna l'ultimo perido di un anno (primo = 1)
int last_period(int anno, TFrequenza_statistiche freq);
// Converte una data nella classe temporale definita dalla frequenza
int date2period(const TDate& data, TFrequenza_statistiche freq);
class TStats_agg : public TObject class TStats_agg : public TObject
{ {
enum TFrequenza_statistiche { fs_giornaliera, fs_settimanale, fs_quindicinale,
fs_mensile, fs_bimestrale, fs_trimestrale };
class TStats_data : public TObject class TStats_data : public TObject
{ {
public: public:
@ -27,7 +47,7 @@ class TStats_agg : public TObject
TFrequenza_statistiche _frequenza; TFrequenza_statistiche _frequenza;
bool _merce, _prestazioni, _omaggi, _omaggio_is_merce; bool _merce, _prestazioni, _omaggi, _omaggio_is_merce;
bool _art_nocode, _art_noanag, _art_noanag_grp; bool _art_nocode, _art_noanag, _art_noanag_grp;
bool _agente, _cliente, _articolo, _giacenza, _magazzino; bool _agente, _cliente, _zona, _articolo, _giacenza, _magazzino;
protected: protected:
void test_firm() const; void test_firm() const;
@ -35,7 +55,6 @@ protected:
TStats_agg::TStats_data& find(const TRiga_documento& rdoc); TStats_agg::TStats_data& find(const TRiga_documento& rdoc);
bool can_add(const TRiga_documento& rdoc) const; bool can_add(const TRiga_documento& rdoc) const;
public: public:
void init(); void init();
void reset(); void reset();
@ -43,8 +62,20 @@ public:
bool add(const TRiga_documento& rdoc); bool add(const TRiga_documento& rdoc);
bool update(); bool update();
// Converte una data nella classe temporale definita dalla frequenza delle statisitiche TFrequenza_statistiche frequency() const
int date2period(const TDate& datadoc) const; { return _frequenza; }
int date2period(const TDate& datadoc) const
{ return ::date2period(datadoc, _frequenza); }
bool grp_agente() const { test_firm(); return _agente; }
bool grp_cliente() const { test_firm(); return _cliente; }
bool grp_zona() const { test_firm(); return _zona; }
bool grp_articolo() const { test_firm(); return _articolo; }
bool grp_giacenza() const { test_firm(); return _giacenza; }
bool grp_magazzino() const { test_firm(); return _magazzino; }
bool omaggio_is_merce() const { test_firm(); return _omaggio_is_merce; }
TStats_agg(); TStats_agg();
virtual ~TStats_agg() { } virtual ~TStats_agg() { }

View File

@ -9,8 +9,9 @@
#define SVR_UMQTA "UMQTA" #define SVR_UMQTA "UMQTA"
#define SVR_CODAG "CODAG" #define SVR_CODAG "CODAG"
#define SVR_CODCF "CODCF" #define SVR_CODCF "CODCF"
#define SVR_LIVELLO "LIVELLO" #define SVR_ZONA "ZONA"
#define SVR_CODMAG "CODMAG" #define SVR_GIAC "GIAC"
#define SVR_MAG "MAG"
#define SVR_QUANTITA "QUANTITA" #define SVR_QUANTITA "QUANTITA"
#define SVR_VALORE "VALORE" #define SVR_VALORE "VALORE"