diff --git a/ve/ve2400.cpp b/ve/ve2400.cpp index 19f7c1d22..ebba84626 100755 --- a/ve/ve2400.cpp +++ b/ve/ve2400.cpp @@ -13,12 +13,10 @@ class TMask_anamag: public TMask { TRelation * _rel; // relazione principale - TMag_livelli * livelli_giac;// oggetto handler per i livelli di giacenza - TMag_livelli * livelli_art;// oggetto handler per i livelli di anagraficca - TMetachar * metac; + TCodgiac_livelli * livelli_giac;// oggetto handler per i livelli di giacenza + TCodart_livelli * livelli_art;// oggetto handler per i livelli di anagraficca int last_annogiac; int last_annosto; - TString16 um_principale; static bool handle_codice(TMask_field &, KEY); // handler del campo codice articolo static bool handle_livart(TMask_field &, KEY); // handler dei campi codice articolo (livelli) @@ -28,6 +26,7 @@ class TMask_anamag: public TMask { static bool notify_sheet_um(TSheet_field & s, int r, KEY k); // notify dello sheet delle unità di misura static bool handle_sheet_deslin(TMask_field &, KEY); // handler dello sheet delle descrizioni in lingua static bool handle_sheet_cod(TMask_field &, KEY); // handler dello sheet dei codici alternativi + static bool notify_sheet_giac(TSheet_field & s, int r, KEY k); // notify delle giacenze static bool handle_sheetgiac(TMask_field &, KEY); // handler dello sheet giacenze static bool notify_sheet_sto(TSheet_field & s, int r, KEY k); // notify dello storico static bool handle_sheetstomag(TMask_field &, KEY); // handler dello sheet storico giacenze @@ -41,12 +40,13 @@ class TMask_anamag: public TMask { void clear_info_sto(); bool info_sto_dirty(); - void converti_storico(TString newum); + void ricalcola_giacenze(TString newum,real fc); int add_totali_storico(TString &codmag); bool remove_totali_storico(TString & codmag); void update_totali_storico(TString & codmag); bool check_totali_storico(); public: + TString16 um_principale; TEsercizi_contabili esercizi_contabili; TMask_anamag(TRelation * rel,bool mg_autorized); @@ -58,40 +58,39 @@ public: TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") { _rel=rel; - // imposta il riconoscimento dei caratteri del formato dell'ultima parte dell'articolo - TString80 format(""); - TTable _tabfca("FCA"); - if (_tabfca.last()==NOERR) { - format = _tabfca.get("S1"); - } - metac = new TMetachar(format); // imposta il puntatore al gestore livelli giacenze - livelli_giac= new TMag_livelli("FCG"); - livelli_art= new TMag_livelli("FCA"); + livelli_giac= new TCodgiac_livelli(); + livelli_art= new TCodart_livelli(); // imposta il valore dell'anno per le giacenze last_annogiac=-1; last_annosto=-1; - + // maschera set_handler(F_ANNO, handle_anno); set_handler(F_STOANNO, handle_stoanno); + // sheet unità di misura set_handler(F_SHEETUM, handle_sheet_um); - ((TSheet_field &)field(F_SHEETUM)).set_notify(notify_sheet_um); + TSheet_field &f= (TSheet_field &)field(F_SHEETUM); + f.set_notify(notify_sheet_um); + TMask &fm= f.sheet_mask(); + fm.set_handler(FS_CODUM, handle_sheet_um_um); + fm.set_handler(FS_PREZZO, handle_sheet_um_price); + fm.set_handler(FS_PREZZO_LORDO, handle_sheet_um_price); + // sheet descrizioni in lingua set_handler(F_SHEETDESLIN, handle_sheet_deslin); + // sheet codici corrispondenti set_handler(F_SHEETCOD, handle_sheet_cod); + // sheet giacenze set_handler(F_SHEETGIAC, handle_sheetgiac); + ((TSheet_field &)field(F_SHEETGIAC)).set_notify(notify_sheet_giac); ((TSheet_field &)field(F_SHEETGIAC)).set_userget(sheetgiac_get); ((TSheet_field &)field(F_SHEETGIAC)).set_userput(sheetgiac_put); + // sheet storico set_handler(F_SHEETSTOMAG, handle_sheetstomag); ((TSheet_field &)field(F_SHEETSTOMAG)).set_notify(notify_sheet_sto); ((TSheet_field &)field(F_SHEETSTOMAG)).set_userget(sheetsto_get); ((TSheet_field &)field(F_SHEETSTOMAG)).set_userput(sheetsto_put); - TSheet_field &f= (TSheet_field &)field(F_SHEETUM); - TMask &fm= f.sheet_mask(); - fm.set_handler(FS_CODUM, handle_sheet_um_um); - fm.set_handler(FS_PREZZO, handle_sheet_um_price); - fm.set_handler(FS_PREZZO_LORDO, handle_sheet_um_price); // *************************************************** // ABILITAZIONI PARAMETRICHE @@ -107,14 +106,7 @@ TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") // disabilita le colonne quando non sono utilizzati i livelli di giacenza for (int i=0; i<4; i++) { - if (mgconfig.get_bool("GESLIVGIAC") && livelli_giac->enabled(1+i)) { - fld_giac.sheet_mask().field(F_LIV1+i).show(); - fld_giac.set_column_header(fld_giac.cid2index(F_LIV1+i),livelli_giac->name(1+i)); - fld_giac.sheet_mask().field(F_LIV1+i).set_prompt(livelli_giac->name(1+i)); - } else { - fld_giac.sheet_mask().field(F_LIV1+i).hide(); - fld_giac.delete_column(fld_giac.cid2index(F_LIV1+i)); - } + livelli_giac->set_sheetcolumn(fld_giac,F_LIV1+i,i+1); } // disabilita la colonna numero distinte if (FALSE) { @@ -160,9 +152,9 @@ TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") set_handler(F_CODART, handle_codice); for (int i=0; i<9; i++) field(F_LIVART1+i).hide(); - } else if (!livelli_art->enabled(2)) - // .. nasconde il pulsante dei livelli + field(F_GCA).hide(); + } else field(F_GCA).hide(); } } @@ -183,8 +175,9 @@ void TMask_anamag::sheetsto_put(TSheet_field &sheet_sto, int item) void TMask_anamag::sheetsto_get(TSheet_field &sheet_sto, int item) { - if (item>1) return; TMask_anamag & m=(TMask_anamag &) sheet_sto.mask(); + + if (item>1) return; TRectype & first_rec=sheet_sto.record()->row(1,TRUE); m.set(F_STOULTCOS1, first_rec.get_real(STOMAG_ULTCOS1)); m.set(F_STOULTCOS2, first_rec.get_real(STOMAG_ULTCOS2 )); @@ -252,8 +245,8 @@ bool TMask_anamag::handle_codice(TMask_field &fld, KEY k) fld.error_box("Il codice articolo non può essere vuoto"); return(FALSE); } - if (!mask.metac->recognized(codepart)) { - fld.error_box("Il codice articolo non corrisponde al formato previsto \n('%s' ?? '%s')",(const char *)codepart,(const char *)mask.metac->language()); + if (!mask.livelli_art->fit_to_format(codepart)) { + fld.error_box("Il codice articolo non corrisponde al formato previsto \n('%s' ?? '%s')",(const char *)codepart,(const char *)mask.livelli_art->code_format()); return(FALSE); } } @@ -362,30 +355,49 @@ bool TMask_anamag::handle_sheet_um(TMask_field &fld, KEY k) TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i=f.items()) { + return error_box("L'unità di misura %s deve essere presente in tabella",(const char *)m.um_principale); + } else { + m.um_principale=f.cell(0,f.cid2index(FS_CODUM)); + } + m.ricalcola_giacenze(f.cell(0,f.cid2index(FS_CODUM)),f.cell(i,f.cid2index(FS_FCUM))); + } } } else if (k==K_TAB) { - if (m.um_principale!=f.cell(0,0)) { - m.converti_storico(f.cell(0,0)); - m.um_principale=f.cell(0,0); - } } else if (k==K_SPACE) { - m.um_principale=f.cell(0,0); + m.um_principale=f.cell(0,f.cid2index(FS_CODUM)); } return TRUE; } -bool TMask_anamag::notify_sheet_um(TSheet_field &s, int r, KEY k) +bool TMask_anamag::notify_sheet_um(TSheet_field &fld_um, int r, KEY k) { - if (k == K_TAB) - s.sheet_mask().enable(DLG_DELREC, r > 0); + if (k == K_TAB) { + fld_um.sheet_mask().enable(DLG_DELREC, r > 0); + if (r == 0) { + if (fld_um.items() == 0) + ((TToken_string &)fld_um.row(0)) = "|1"; // aggiunge una riga allo sheet + else + ((TToken_string &)fld_um.row(0)).add("1",fld_um.cid2index(FS_FCUM)); // forza la prima unita' di misura a 1 + fld_um.disable_cell(0, fld_um.cid2index(FS_FCUM)); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) + fld_um.force_update(0); + } + } return TRUE; } @@ -405,7 +417,7 @@ bool TMask_anamag::handle_sheet_deslin(TMask_field &fld, KEY k) { const TString16 codlin(f.cell(i,0)); - if (codlin.empty()) + if (codlin.blank()) return error_box("I codici lingua non possono essere vuoti"); if (v.add(codlin)) return error_box("I codici lingua devono essere diversi tra loro"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già @@ -432,7 +444,7 @@ bool TMask_anamag::handle_sheet_cod(TMask_field &fld, KEY k) { const TString80 codart(f.cell(i,0)); - if (codart.empty()) + if (codart.blank()) return error_box("I codici alternativi non possono essere vuoti"); if (v.add(codart)) return error_box("I codici alternativi devono essere diversi tra loro e dal codice dell'articolo"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già @@ -463,12 +475,13 @@ bool TMask_anamag::handle_sheetgiac(TMask_field &fld, KEY k) codgiac << f.cell(i,F_LIV3-FIRST_FIELD); codgiac << f.cell(i,F_LIV4-FIRST_FIELD); - if (codgiac.empty()) + if (codgiac.blank()) return error_box("I codici delle giacenze non possono essere vuoti"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già if (v.add(codgiac)) return error_box("Esistono due righe con lo stesso codice di giacenza"); - // ordina le righe per livello+codmag + if (!notify_sheet_giac(f, i, K_ENTER)) + return FALSE; } // ordina le righe per livello+codmag // f.rows_array().sort(); @@ -511,18 +524,16 @@ int TMask_anamag::add_totali_storico(TString & codmag) s.insert(r,FALSE); s.row(r ).add(SIMBOLO_TOTALI,s.cid2index(F_STOTIPORIGA)); s.row(r ).add(codmag,s.cid2index(F_STOCODMAG)); - s.row(r ).add("----",s.cid2index(F_STOANNOES)); - s.row(r ).add(um_principale,s.cid2index(F_STOUM)); + s.row(r ).add("Totale",s.cid2index(F_STOANNOES)); s.disable_cell(r,-1); + s.insert(r+1,FALSE); s.row(r+1).add(SIMBOLO_TOTALI,s.cid2index(F_STOTIPORIGA)); s.row(r+1).add(codmag,s.cid2index(F_STOCODMAG)); - s.row(r+1).add("",s.cid2index(F_STOANNOES)); - s.row(r+1).add(um_principale,s.cid2index(F_STOUM)); + s.row(r+1).add("Rim.in",s.cid2index(F_STOANNOES)); s.row(r+1).add(totq.string(),s.cid2index(F_STOQUANT)); s.row(r+1).add(totval.string(),s.cid2index(F_STOVAL)); s.disable_cell(r+1,-1); - s.force_update(r+1); } update_totali_storico(codmag); return r; @@ -589,14 +600,46 @@ bool TMask_anamag::check_totali_storico() for (; r< s.items() && *s.cell(r,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI; r++) ; real totq1(s.cell(r,s.cid2index(F_STOQUANT))),totq2(s.cell(r+1,s.cid2index(F_STOQUANT))); if (totq1!=totq2) - return yesno_box("La somma delle composizioni dello storico non corrisponde alla rimanenza\n Proseguo ugualmente ?"); + if (!yesno_box("La somma delle composizioni dello storico \nper il magazzino %s non corrisponde \nalla rimanenza dell'esercizio successivo\n Proseguo ugualmente ?", + (const char *)s.cell(r,s.cid2index(F_STOCODMAG)))) + return FALSE; real totval1(s.cell(r,s.cid2index(F_STOVAL))),totval2(s.cell(r+1,s.cid2index(F_STOVAL))); if (totval1!=totval2) - return yesno_box("La somma del valore delle composizioni dello storico non corrisponde al valore della rimanenza\n Proseguo ugualmente ?"); + return yesno_box("La somma del valore delle composizioni dello storico \n per il magazzino %s non corrisponde \nal valore della rimanenza dell'esercizio successivo\n Proseguo ugualmente ?", + (const char *)s.cell(r,s.cid2index(F_STOCODMAG))); + r++; } return TRUE; } + +bool TMask_anamag::notify_sheet_giac(TSheet_field &f, int i, KEY k) +{ + switch (k) + { + case (K_ENTER): // fine modifica + real ck(f.cell(i,f.cid2index(F_RIM))); + ck+=f.cell(i,f.cid2index(F_ACQ)); + ck+=f.cell(i,f.cid2index(F_ENTR)); + ck-=f.cell(i,f.cid2index(F_VEN)); + ck-=f.cell(i,f.cid2index(F_USC)); + ck-=f.cell(i,f.cid2index(F_ACL)); + ck+=f.cell(i,f.cid2index(F_INCL)); + ck-=f.cell(i,f.cid2index(F_INPRODF)); + ck+=f.cell(i,f.cid2index(F_INPRODC)); + ck-=f.cell(i,f.cid2index(F_SCARTI)); + + ck-=f.cell(i,f.cid2index(F_GIAC)); + if (!ck.is_zero()) + { + f.error_box("La giacenza deve essere pari a RIM+(ACQ+ENTR)-(VEN+USC)-(ACL-INCL)-(PRODF-PRODC) - SCARTI)"); + return FALSE; + } + } + return TRUE; +} + + bool TMask_anamag::notify_sheet_sto(TSheet_field &s, int r, KEY k) { static TString16 oldcodmag,newcodmag,oldanno,newanno; @@ -652,7 +695,6 @@ bool TMask_anamag::notify_sheet_sto(TSheet_field &s, int r, KEY k) } m.add_totali_storico(newcodmag); TSheet_field & s_um=(TSheet_field & )s.mask().field(F_SHEETUM); - s.row(r).add(m.um_principale,s.cid2index(F_STOUM)); s.force_update(); } break; @@ -680,11 +722,15 @@ bool TMask_anamag::handle_sheetstomag(TMask_field &fld, KEY k) { if (*f.cell(i,f.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI) { + TString codmg(f.cell(i,f.cid2index(F_STOCODMAG))); TString codeser(f.cell(i,f.cid2index(F_STOANNOES))); - if (codeser.empty()) + if (codmg.blank()) + return error_box("Il codice del magazzino non può essere vuoto"); + if (codeser.blank()) return error_box("I codici degli esercizi non possono essere vuoti"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già - if (v.add(codeser)) + codmg.overwrite(codeser,3); + if (v.add(codmg)) return error_box("La composizione delle rimanenze deve far riferimento a esercizi tutti diversi tra loro"); TLocalisamfile stor_aux(LF_STOMAG); @@ -715,6 +761,7 @@ bool TMask_anamag::handle_sheetstomag(TMask_field &fld, KEY k) TString16 codmag(f.cell(i,f.cid2index(F_STOCODMAG))); i=m.add_totali_storico(codmag)+2; } + f.force_update(); } return TRUE; } @@ -726,7 +773,7 @@ bool TMask_anamag::handle_sheet_um_um(TMask_field &fld, KEY k) TMask &m = fld.mask(); // prende la maschera d'origine del campo (maschera dello sheet) const TString16 curr_um(fld.get()); // prende il contenuto del campo corrente (unità di misura corrente) - if (curr_um.not_empty()) // se il codice dell'unità di misura è vuoto non viene fatto alcun calcolo + if (!curr_um.blank()) // se il codice dell'unità di misura è vuoto non viene fatto alcun calcolo { TSheet_field *f= m.get_sheet(); // prende lo sheet d'origine della maschera del campo @@ -762,20 +809,29 @@ bool TMask_anamag::handle_sheet_um_um(TMask_field &fld, KEY k) t.put("CODTAB", first_um); if (t.read() == NOERR) { - TString16 first_um_rif(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura di rapporto - const real first_um_rif_fc(t.get_real("R10")); // prende il suo fattore di conversione - if (first_um_rif == rif_um) + TString16 rif_first_um(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura di rapporto + const real rif_fc_first_um(t.get_real("R10")); // prende il suo fattore di conversione + + if (rif_first_um == rif_um) { - x /= first_um_rif_fc; // calcola il rapporto tra i fattori di conversione + x /= rif_fc_first_um; // calcola il rapporto tra i fattori di conversione x.round(5); // arrotonda il risultato a 5 decimali + } else { + if (rif_first_um == curr_um) { + x= 1/rif_fc_first_um; + } } } - } + } } if (x == ZERO) x = 1.00; m.set(FS_FCUM, x); // il risultato viene scritto nel campo del fattore di conversione - } + } else { + // prima unità di misura + f->mask().set(F_UMPRINCIPALE,curr_um); + f->mask().set(F_UMPRINCIPALE2,curr_um); + } } } return TRUE; @@ -847,9 +903,11 @@ void TMask_anamag::sheetgiac_put(TSheet_field &fld_righe, int item) } } -void TMask_anamag:: converti_storico(TString newum) +// aggiorna il valore delle giacenze del fattore indicato +void TMask_anamag:: ricalcola_giacenze(TString newum, real fc) { - + + return; } @@ -859,9 +917,6 @@ class TAnagrafica_magazzino : public TRelation_application { TMask_anamag *_msk; // maschera principale TRelation *_rel; // relazione principale di un solo file (anagrafiche di magazzino) - //TRecord_array *_linee_rec_um; // record array di accoppiamento delle unità di misura - //TRecord_array *_linee_rec_deslin; // record array di accoppiamento delle descrizioni in lingua con il primo sheet - //TRecord_array *_linee_rec_cod; // record array di accoppiamento delle codici corrispondenti con il secondo sheet virtual bool user_create(); virtual bool user_destroy(); @@ -888,9 +943,6 @@ bool TAnagrafica_magazzino::user_create() // crea l'oggetto per i parametri di livello giacenza // apre la maschera e dispone gli sheet _rel= new TRelation(LF_ANAMAG); - //_linee_rec_um= new TRecord_array(LF_UMART, "NRIGA"); - //_linee_rec_deslin= new TRecord_array(LF_DESLIN, "NRIGA"); - //_linee_rec_cod= new TRecord_array(LF_CODCORR, "NRIGA"); _msk= new TMask_anamag(_rel,has_module(MGAUT)); @@ -899,9 +951,6 @@ bool TAnagrafica_magazzino::user_create() bool TAnagrafica_magazzino::user_destroy() { - //delete _linee_rec_cod; - //delete _linee_rec_deslin; - //delete _linee_rec_um; delete _rel; delete _msk; @@ -925,10 +974,14 @@ int TAnagrafica_magazzino::read(TMask& m) if (fld_um.items() == 0) ((TToken_string &)fld_um.row(0)) = "|1"; // aggiunge una riga allo sheet else - ((TToken_string &)fld_um.row(0)).add("1",1); // forza la prima unita' di misura a 1 - fld_um.disable_cell(0, 1); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) + ((TToken_string &)fld_um.row(0)).add("1",fld_um.cid2index(FS_FCUM)); // forza la prima unita' di misura a 1 + fld_um.disable_cell(0, fld_um.cid2index(FS_FCUM)); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) fld_um.force_update(0); // aggiorna lo stato della riga 0 - + TString16 um_principale; + //((TMask_anamag&)m).um_principale=fld_um.cell(0, fld_um.cid2index(FS_CODUM)); + um_principale=fld_um.cell(0, fld_um.cid2index(FS_CODUM)); + m.set(F_UMPRINCIPALE,um_principale); + m.set(F_UMPRINCIPALE2,um_principale); } // no errors in TRelation_application::read(m); return err; } diff --git a/ve/ve2400.h b/ve/ve2400.h index 7d0c9ea99..9359d2e34 100755 --- a/ve/ve2400.h +++ b/ve/ve2400.h @@ -65,29 +65,33 @@ #define F_INDBILA 176 #define F_INDBILV 177 -#define H_ANNO 180 -#define F_ANNO 181 -#define F_ANNORIF 182 +#define H_ANNO 180 +#define F_ANNO 181 +#define F_ANNORIF 182 -#define F_STOANNO 183 -#define F_STOANNORIF 184 +#define F_STOANNO 183 +#define F_STOANNORIF 184 +#define F_UMPRINCIPALE 185 +#define F_UMPRINCIPALE2 186 -#define F_GCA 185 -#define F_LIVART1 190 -#define F_LIVART2 191 -#define F_LIVART3 192 -#define F_LIVART4 193 -#define F_LIVART5 194 -#define F_LIVART6 195 -#define F_LIVART7 196 -#define F_LIVART8 197 -#define F_LIVART9 198 +#define F_GCA 189 +#define F_LIVART1 190 +#define F_LIVART2 191 +#define F_LIVART3 192 +#define F_LIVART4 193 +#define F_LIVART5 194 +#define F_LIVART6 195 +#define F_LIVART7 196 +#define F_LIVART8 197 +#define F_LIVART9 198 +#define F_ARTALT 199 +#define F_DESCRALT 200 -#define F_SHEETUM 200 -#define F_SHEETDESLIN 201 -#define F_SHEETCOD 202 -#define F_SHEETGIAC 203 -#define F_SHEETSTOMAG 204 +#define F_SHEETUM 201 +#define F_SHEETDESLIN 202 +#define F_SHEETCOD 203 +#define F_SHEETGIAC 204 +#define F_SHEETSTOMAG 205 #define F_STOULTCOS1 210 #define F_STOULTCOS2 211 @@ -97,8 +101,29 @@ #define F_STOCODLIST 215 #define F_STOPREZZOLIST 216 -#define F_STOTOTALE_RIM 217 -#define F_STOTOTALE_VAL 218 +#define F_STOTOTALE_RIM 217 +#define F_STOTOTALE_VAL 218 + +#define F_CODARTPAGE2 250 +#define F_DESCRPAGE2 251 +#define F_CODARTPAGE3 252 +#define F_DESCRPAGE3 253 +#define F_CODARTPAGE4 254 +#define F_DESCRPAGE4 255 +#define F_CODARTPAGE5 256 +#define F_DESCRPAGE5 257 +#define F_CODARTPAGE6 258 +#define F_DESCRPAGE6 259 + + +#define G_CODART 1 +#define G_DESART 2 +#define G_GRMERC 3 +#define G_CATACQ 4 +#define G_CONACQ 5 +#define G_CATVEN 6 +#define G_CONVEN 7 +#define G_RAGGFISC 8 // definizioni per l'archivio di misura articoli #define FS_CODUM 101 @@ -118,12 +143,12 @@ #include "ve2400d.h" // definizioni per l'archivio storico giacenze -#define F_STOTIPORIGA 101 -#define F_STOCODMAG 102 -#define F_STOANNOES 103 -#define F_STOUM 104 -#define F_STOQUANT 105 -#define F_STOVAL 106 -#define F_STOCODART 120 +#define F_STOTIPORIGA 101 +#define F_STOCODMAG 102 +#define F_STOANNOES 103 +#define F_NOMETOT 203 +#define F_STOQUANT 104 +#define F_STOVAL 105 +#define F_STOCODART 120 #define SIMBOLO_TOTALI '>'