Prosegue la contabilizzazione:

corretti i controlli di input e spostati solo all'uscita della maschera.
Aggiunta la contabilizzazione di sconti/omaggi/spese/prestazioni.
Manca ancora la contabilizzazione dei bolli/spese di'incasso.


git-svn-id: svn://10.65.10.50/trunk@3689 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1996-10-01 06:56:36 +00:00
parent 9d4f0a2bcc
commit 9ec6c584c2
2 changed files with 185 additions and 134 deletions

View File

@ -444,7 +444,7 @@ public:
void zero(){ _imp = 0.0; _iva = 0.0; _ali = 0.0; }
virtual TObject* dup() const { return new TIVA_element(*this); }
TIVA_element& operator = (TIVA_element& a);
TIVA_element& operator += (TRiepilogo_Iva& a);
TIVA_element& operator += (const TRiga_documento& a);
TIVA_element() {_imp = 0.0; _iva = 0.0; _ali = 0.0;}
~TIVA_element() {};
};
@ -455,10 +455,10 @@ TIVA_element& TIVA_element::operator=(TIVA_element& a)
return *this;
}
TIVA_element& TIVA_element::operator+=(TRiepilogo_Iva& a)
TIVA_element& TIVA_element::operator+=(const TRiga_documento& a)
// It's horrible, I know.
{
_imp += a.imp(); _iva += a.iva(); _ali = a.ali();
_imp += a.imponibile(); _iva += a.imposta(); _ali = a.iva().aliquota();
return *this;
}
@ -478,6 +478,8 @@ class TContabilizzazione_app : public TApplication
TRelation *_clifo; // relazione dei clienti e fornitori + cfven
TLocalisamfile *_attiv, // file delle attivita' (per far funzionare TRegistro)
*_fcaus, // file delle causale (per far funzionare TCausale)
*_docfile, // file dei documenti (per far funzionare TDocumento)
*_rdocfile, // file delle righe documento (per far funzionare TDocumento)
*_frcaus, // file delle righe causali (per far funzionare TCausale)
*_part, // file delle partite (per far funzionare TPartita)
*_scad, // file delle scadenze (per far funzionare TPartita)
@ -489,6 +491,8 @@ class TContabilizzazione_app : public TApplication
*_cve, // tabella categorie di vendita
*_val, // tabella valute estere
*_tri, // tabella tipi di riga
*_prs, // tabella prestazioni
*_spp, // tabella spese
*_caa, // tabella categorie acquisto articoli
*_cra, // tabella categorie ricavo articoli
*_cco; // tabella categorie contabili
@ -519,12 +523,13 @@ class TContabilizzazione_app : public TApplication
// Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF
// non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa
// di ricerca.
TBill _sco_perc_bill, _sco_imp_bill; // Conti per gli sconti a percentuale ed importi (dalla configurazione)
protected: // TApplication
bool sc_enabled() const ;
// Funzione per ricercare il conto di costo/ricavo
error_type search_costo_ricavo(TBill& conto, const TRiga_documento& r);
// Funzione per aggiungere la riga iva al TAssoc_array _righe_iva
error_type add_iva_row(const TBill& conto, TRiepilogo_Iva& ri);
error_type add_iva_row(const TBill& conto, const TRiga_documento& r);
// Crea le righe iva su _movimento
error_type create_iva_rows();
// Crea la riga di totale documento
@ -581,12 +586,13 @@ inline TContabilizzazione_app& app() { return (TContabilizzazione_app&) main_app
bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
{
if (f.to_check(k))
if (k==K_ENTER && f.dirty())
{
TMask& m = f.mask();
TDate da(m.get_date(F_DATA_INI));
TDate a(m.get_date(F_DATA_FIN));
if (a == botime || da == botime) return TRUE;
m.field(F_DATA_REG).set_dirty();
//if (a == botime || da == botime) return TRUE;
if (a < da)
{
f.error_box("La data di inizio deve essere minore della data di fine.");
@ -603,13 +609,14 @@ bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
bool TContabilizzazione_app::handle_data_reg(TMask_field& f, KEY k)
{
if (f.to_check(k))
if (k==K_ENTER && f.dirty())
{
TMask& m = f.mask();
TDate data_reg(f.get());
if (data_reg == botime) return TRUE;
TDate da(m.get_date(F_DATA_INI));
//if (!da.ok()) return TRUE;
if ((data_reg - da) > 15)
{
f.error_box("L'intervallo tra la data di registrazione e la data di inizio non puo' eccedere i 15 giorni.");
@ -730,10 +737,14 @@ bool TContabilizzazione_app::create()
_msk->set_handler(DLG_USER,handle_select);
_num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione",
"@1|Cod. numerazione|Descrizione@50");
_docfile = new TLocalisamfile(LF_DOC);
_rdocfile = new TLocalisamfile(LF_RIGHEDOC);
_doc = new TDocumentoEsteso;
_cpg = new TTable("%CPG");
_tri = new TTable("%TRI");
_val = new TTable("%VAL");
_prs = new TTable("PRS");
_spp = new TTable("SPP");
_caa = new TTable("CAA");
_cra = new TTable("CRA");
_gmc = new TTable("GMC");
@ -750,17 +761,13 @@ bool TContabilizzazione_app::create()
_attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va!
_anamag = new TLocalisamfile(LF_ANAMAG);
TConfig conf(CONFIG_DITTA);
TString val;
_search_seq = conf.get("RICERCACR","ve");
// costruisce la stringa che controlla la ricerca del conto costo/ricavo
// Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza
// presuppone che il programma di configurazione abbia generato correttamente
// il tutto.
for (int i=0; i<5;i++)
{
val = conf.get("RICERCACR","ve",i+1);
if (val.not_empty()) _search_seq.add(val);
}
if (_search_seq.items() == 0)
{
@ -769,6 +776,20 @@ bool TContabilizzazione_app::create()
}
_sc_enabled = conf.get_bool("GesSal","cg");
_nump_cfg = conf.get_bool("RifPro","cg");
int gr,co;
long so;
gr = conf.get_int("SCOPRCODCON","ve",1);
co = conf.get_int("SCOPRCODCON","ve",2);
so = conf.get_long("SCOPRCODCON","ve",3);
_sco_perc_bill.set(gr,co,so);
gr = conf.get_int("SCOIMCODCON","ve",1);
co = conf.get_int("SCOIMCODCON","ve",2);
so = conf.get_long("SCOIMCODCON","ve",3);
_sco_imp_bill.set(gr,co,so);
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
@ -777,6 +798,8 @@ bool TContabilizzazione_app::destroy()
{
if (_msk) delete _msk;
if (_num_sheet) delete _num_sheet;
if (_docfile) delete _docfile;
if (_rdocfile) delete _rdocfile;
if (_doc) delete _doc;
if (_cpg) delete _cpg;
if (_tri) delete _tri;
@ -785,6 +808,8 @@ bool TContabilizzazione_app::destroy()
if (_rfa) delete _rfa;
if (_cve) delete _cve;
if (_cco) delete _cco;
if (_prs) delete _prs;
if (_spp) delete _spp;
if (_caa) delete _caa;
if (_cra) delete _cra;
if (_fcaus) delete _fcaus;
@ -807,6 +832,7 @@ bool TContabilizzazione_app::menu(MENU_TAG mt)
_data_fine = _msk->get_date(F_DATA_FIN);
_data_reg = _msk->get_date(F_DATA_REG);
_auto_data = _msk->get_bool(F_DATA_AUTO);
//_data_fine++;
contabilize();
}
return FALSE;
@ -820,99 +846,132 @@ error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga
bool skip_art_related = FALSE;
bool skip_clifo = _clifo->bad();
TCodiceIVA codiva(r.get("CODIVA"));
const char t = r.tipo().tipo();
int gr,co;
long so;
// posiziona l'anagrafica sull'articolo specificato sulla ..iga
_anamag->put("CODART",r.get("CODART"));
if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa.
skip_art_related = TRUE;
// Scorre la stringa di ricerca
for (int i=0;good() && i<items;i++)
{
TString16 tok(_search_seq.get(i));
if (tok == "CF")
switch (t)
{
case 'O': // righe omaggio come articoli spiaccicato identico (avranno imponibile 0)
case 'M': // righe di merce
{
if (skip_clifo) continue;
gr = cli_file.get_int(CLI_GRUPPORIC);
co = cli_file.get_int(CLI_CONTORIC);
so = cli_file.get_long(CLI_SOTTOCRIC);
conto.set(gr,co,so);
if (conto.ok()) break; // se lo trova esce (tutti != 0)
}
else
if (tok == "CA")
{
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
if (_caus->IVA2bill(codiva,conto)) break; // se lo trova esce
}
else
if (tok == "AR")
{
if (skip_art_related) continue;
gr = _anamag->get_int(is_cli ? "GRUPPOV" : "GRUPPOA");
co = _anamag->get_int(is_cli ? "CONTOV" : "CONTOA");
so = _anamag->get_long(is_cli ? "SOTTOCV" : "SOTTOCA");
conto.set(gr,co,so);
if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite
{
TTable *t = is_cli ? _cra : _caa;
t->put("CODTAB",_anamag->get(is_cli ? "CATCONV" : "CATCONA"));
if (t->read() == NOERR)
// posiziona l'anagrafica sull'articolo specificato sulla ..iga
_anamag->put("CODART",r.get("CODART"));
if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa.
skip_art_related = TRUE;
// Scorre la stringa di ricerca
for (int i=0;good() && i<items;i++)
{
TString16 tok(_search_seq.get(i));
if (tok == "CF")
{
gr = atoi(t->get("S1"));
co = atoi(t->get("S2"));
so = atol(t->get("S3"));
if (skip_clifo) continue;
gr = cli_file.get_int(CLI_GRUPPORIC);
co = cli_file.get_int(CLI_CONTORIC);
so = cli_file.get_long(CLI_SOTTOCRIC);
conto.set(gr,co,so);
if (conto.ok()) break; // se lo trova esce (tutti != 0)
}
else
if (tok == "CA")
{
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
if (_caus->IVA2bill(codiva,conto)) break; // se lo trova esce
}
else
if (tok == "AR")
{
if (skip_art_related) continue;
gr = _anamag->get_int(is_cli ? "GRUPPOV" : "GRUPPOA");
co = _anamag->get_int(is_cli ? "CONTOV" : "CONTOA");
so = _anamag->get_long(is_cli ? "SOTTOCV" : "SOTTOCA");
conto.set(gr,co,so);
if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite
{
TTable *t = is_cli ? _cra : _caa;
t->put("CODTAB",_anamag->get(is_cli ? "CATCONV" : "CATCONA"));
if (t->read() == NOERR)
{
gr = atoi(t->get("S1"));
co = atoi(t->get("S2"));
so = atol(t->get("S3"));
conto.set(gr,co,so);
}
}
if (conto.ok()) break;
}
else
if (tok == "GM" || tok == "SM" || tok == "RF")
{
if (skip_art_related) continue;
const bool is_fis = tok == "RF";
TTable * tab = is_fis ? _rfa : _gmc;
TString codtab(_anamag->get(is_fis ? "GRMERC" : "RAGGFIS"));
if (tok == "GM")
codtab.cut(2); // gli ultimi 2 si riferiscono al sottogruppo.
tab->put("CODTAB",codtab);
if (tab->read() == NOERR)
{
gr = tab->get_int(is_cli ? "I3" : "I0");
co = tab->get_int(is_cli ? "I4" : "I1");
so = tab->get_long(is_cli ? "I5" : "I2");
conto.set(gr,co,so);
}
if (conto.ok()) break;
}
else
if (tok == "CV" || tok == "CC")
{
const bool is_cve = tok == "CV";
if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione
TTable* t = is_cve ? _cve : _cco;
TString cod(is_cve ? _doc->get("CATVEN") : "");
if (cod.empty())
{
if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo
cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC);
}
t->put("CODTAB",cod);
if (t->read() == NOERR)
{
const bool x =(is_cve || is_cli);
gr = t->get_int(x ? "I3" : "I0");
co = t->get_int(x ? "I4" : "I1");
so = t->get_long(x ? "I5": "I2");
conto.set(gr,co,so);
}
if (conto.ok()) break;
}
}
if (conto.ok()) break;
break; // case 'M'
}
else
if (tok == "GM" || tok == "SM" || tok == "RF")
case 'P': // righe prestazione
case 'S': // righe spese
{
if (skip_art_related) continue;
const bool is_fis = tok == "RF";
TTable * tab = is_fis ? _rfa : _gmc;
TString codtab(_anamag->get(is_fis ? "GRMERC" : "RAGGFIS"));
if (tok == "GM")
codtab.cut(2); // gli ultimi 2 si riferiscono al sottogruppo.
tab->put("CODTAB",codtab);
if (tab->read() == NOERR)
TTable* tab = t == 'P' ? _prs : _spp;
tab->put("CODTAB",r.get("CODART"));
if (tab->read())
{
gr = tab->get_int(is_cli ? "I3" : "I0");
co = tab->get_int(is_cli ? "I4" : "I1");
so = tab->get_long(is_cli ? "I5" : "I2");
gr = tab->get_int(is_cli ? "I0" : "I3");
co = tab->get_int(is_cli ? "I1" : "I4");
so = tab->get_long(is_cli ? "I2" : "I5");
conto.set(gr,co,so);
}
if (conto.ok()) break;
break; // case 'P','S'
}
else
if (tok == "CV" || tok == "CC")
{
const bool is_cve = tok == "CV";
if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione
TTable* t = is_cve ? _cve : _cco;
TString cod(is_cve ? _doc->get("CATVEN") : "");
if (cod.empty())
{
if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo
cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC);
}
t->put("CODTAB",cod);
if (t->read() == NOERR)
{
const bool x =(is_cve || is_cli);
gr = t->get_int(x ? "I3" : "I0");
co = t->get_int(x ? "I4" : "I1");
so = t->get_long(x ? "I5": "I2");
conto.set(gr,co,so);
}
if (conto.ok()) break;
}
}
case 'C': // righe sconti (TBI) (reperire l'imposta e l'imponibile normalizzare. Il conto e' nei parametri)
// quale sconto deve reperire dalla configurazione? Sconto ad importo o sconto a percentuale?
if (!r.get("SCONTO").empty()) // se c'e' la percentuale reperisce il conto dello sconto a percentuale
conto = _sco_perc_bill;
else // altrimenti quello dello sconto ad importo
conto = _sco_imp_bill;
break; // case 'C'
case 'D': // righe descrizioni (saltare)
default :
break;
} // end of switch
if (good() && !conto.find())
_error = conto_error;
return _error;
@ -1101,7 +1160,7 @@ error_type TContabilizzazione_app::compile_head_mov()
if (registro.agenzia_viaggi()) mov_rec.put(MOV_DATA74TER,data_reg);
mov_rec.put(MOV_NUMDOC,numdoc); mov_rec.put(MOV_TIPODOC,_caus->tipo_doc());
mov_rec.put(MOV_CODCAUS,_caus->codice()); mov_rec.put(MOV_DESCR,descr);
mov_rec.put(MOV_TIPOMOV,_caus->tipomov()+'0'); mov_rec.put(MOV_ANNOIVA,data_reg.year());
mov_rec.put(MOV_TIPOMOV,char(_caus->tipomov()+'0')); mov_rec.put(MOV_ANNOIVA,data_reg.year());
mov_rec.put(MOV_REG,registro.name());
mov_rec.put(MOV_PROTIVA,ult_prot); mov_rec.put(MOV_CODVAL,codval);
mov_rec.put(MOV_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf);
@ -1111,7 +1170,7 @@ error_type TContabilizzazione_app::compile_head_mov()
if (_caus->intra())
{
mov_rec.put(MOV_CODVALI,codval);mov_rec.put(MOV_CAMBIOI,cambio);
real corrval(_doc->tot_imponibili(1));
real corrval(_doc->imponibile());
real corrlire = corrval*cambio;
if (codval.not_empty() && codval != "LIT")
{
@ -1120,7 +1179,7 @@ error_type TContabilizzazione_app::compile_head_mov()
} else
mov_rec.put(MOV_CORRLIRE,corrval);
}
real totdocval(_doc->tot_documento());
real totdocval(_doc->totale_doc());
real totdoclit = totdocval * cambio;
if (codval.not_empty() && codval != "LIT")
{
@ -1131,11 +1190,11 @@ error_type TContabilizzazione_app::compile_head_mov()
return _error;
}
error_type TContabilizzazione_app::add_iva_row(const TBill& conto, TRiepilogo_Iva& ri)
error_type TContabilizzazione_app::add_iva_row(const TBill& conto, const TRiga_documento& r)
// Aggiunge le righe iva all'assoc_array di raggruppamento
{
TIVA_element el_tmp;
TString cod(ri.cod());
TString cod(r.iva().codice());
const char tipo = conto.tipo();
const int gr = conto.gruppo();
const int co = conto.conto();
@ -1144,7 +1203,7 @@ error_type TContabilizzazione_app::add_iva_row(const TBill& conto, TRiepilogo_Iv
key.format("%-4s|%c|%3d|%3d|%6ld",(const char*)cod,tipo,gr,co,so);
const bool exists = _righe_iva.is_key(key);
TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp);
el += ri;
el += r;
_righe_iva.add(key,el,exists);
return no_error;
}
@ -1275,7 +1334,6 @@ error_type TContabilizzazione_app::compile_rows_mov()
// Compila le righe
{
const int rows = _doc->rows();
const TArray& sum_arr = _doc->summary_array();
_righe_iva.destroy(); // resetta l'assoc_array delle righe di iva
for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows
@ -1285,28 +1343,10 @@ error_type TContabilizzazione_app::compile_rows_mov()
_tri->put("CODTAB",tiporiga);
if (_tri->read() == NOERR) // controlla l'esistenza della riga
{
char s4 = _tri->get("S4")[0];
switch (s4)
{
case 'M': // righe merce
{
TBill conto;
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
if (good())
{
TRiepilogo_Iva& ri = (TRiepilogo_Iva&) sum_arr[i];
add_iva_row(conto,ri);
}
break;
}
case 'S': // righe spese (TBI)
break;
case 'C': // righe sconti (TBI)
break;
case 'D':
default :
break;
}
TBill conto;
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
if (good())
add_iva_row(conto,r);
}
else
_error = row_type_error;
@ -1332,9 +1372,9 @@ void TContabilizzazione_app::calc_pagament()
TString16 codpag(head.get(MOV_CODPAG));
TString16 data(_doc->get("DATAINSC"));
_pagamento = new TPagamento(codpag, data);
real totspese = _doc->tot_spese();
real totimposte = _doc->tot_imposte();
real totimponibili = _doc->tot_documento() - totimposte - totspese;
real totspese = _doc->spese();
real totimposte = _doc->imposta();
real totimponibili = _doc->totale_doc() - totimposte - totspese;
const bool valuta = head.get(MOV_CODVAL).not_empty();
if (valuta)
{
@ -1564,11 +1604,11 @@ void TContabilizzazione_app::display_error()
break;
case conto_error:
msg.format("Rilevato un conto di costo/ricavo inesistente relativamente al documento %s/%ld."
"Verificare l'esistenza dei conti associati.",(const char*)_doc->numerazione(),_doc->numero());
"Verificare l'esistenza dei conti associati alle righe.",(const char*)_doc->numerazione(),_doc->numero());
break;
case movement_error:
msg.format("Rilevato uno sbilancio nel movimento relativamente al documento %s/%ld."
"Verificare la correttezza degli importi.",(const char*)_doc->numerazione(),_doc->numero());
"Verificare la correttezza degli importi delle righe.",(const char*)_doc->numerazione(),_doc->numero());
break;
case mov_write_error:
msg.format("Rilevato un errore in scrittura movimento relativamente al documento %s/%ld."
@ -1588,7 +1628,7 @@ void TContabilizzazione_app::contabilize_document()
{
_movimento = new TMovimentoPN_VE;
_doc->compile_summary(); // ricalcola il documento
//_doc->compile_summary(); // ricalcola il documento
compile_head_mov();
if (good()) compile_rows_mov();
@ -1613,6 +1653,8 @@ void TContabilizzazione_app::contabilize()
TLocalisamfile righe_doc(LF_RIGHEDOC);
TRectype da(LF_DOC),a(LF_DOC);
const long items = _num_sheet->items();
int year_from = _data_ini.year();
int year_to = _data_fine.year();
TString16 codnum;
TString msg;
@ -1623,11 +1665,20 @@ void TContabilizzazione_app::contabilize()
{ // istanzia un cursore per la numerazione corrente, con i limiti di data
codnum = _num_sheet->row(i).get(1);
da.put("DATADOC",_data_ini);
da.put("PROVV","D");
da.put("ANNO",year_from);
da.put("CODNUM",codnum);
a.put("DATADOC",_data_fine);
a.put("PROVV","D");
a.put("ANNO",year_to);
a.put("CODNUM",codnum);
TCursor doc_cur(&doc_rel,"",3,&da,&a);
const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
if (cur_items == 0)
{
warning_box("Non vi sono documenti da contabilizzare per il codice numerazione %s",(const char*)codnum);
continue;
}
msg = "Contabilizzazione documenti ";
msg << codnum << " dal ";
msg << _data_ini.string() << " al ";

View File

@ -9,7 +9,7 @@ BEGIN
USE %ELD SELECT S3 == "TC"
INPUT CODTAB F_CODICE_ELAB
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "Descrizione@55" S0
OUTPUT F_CODICE_ELAB CODTAB
OUTPUT F_DESC_ELAB S0
CHECKTYPE REQUIRED
@ -20,11 +20,10 @@ STRING F_DESC_ELAB 50 39
BEGIN
PROMPT 35 2 ""
USE %ELD KEY 2 SELECT S3 == "TC"
INPUT S0 F_CODICE_ELAB
DISPLAY "Descrizione@50" S0
INPUT S0 F_DESC_ELAB
DISPLAY "Descrizione@55" S0
DISPLAY "Codice" CODTAB
OUTPUT F_CODICE_ELAB CODTAB
OUTPUT F_DESC_ELAB S0
COPY OUTPUT F_CODICE_ELAB
END
GROUPBOX DLG_NULL 32 4
@ -36,14 +35,14 @@ DATE F_DATA_INI
BEGIN
PROMPT 2 5 "Inizio "
VALIDATE NOT_EMPTY_FUNC
WARNING "La data di inizio e' obbligatoria"
WARNING "La data di inizio intervallo e' obbligatoria"
END
DATE F_DATA_FIN
BEGIN
PROMPT 2 6 "Fine "
VALIDATE NOT_EMPTY_FUNC
WARNING "La data di fine e' obbligatoria"
WARNING "La data di fine intervallo e' obbligatoria"
END
BOOLEAN F_DATA_AUTO
@ -58,6 +57,7 @@ BEGIN
PROMPT 42 6 "Data registrazione "
FLAG "A"
VALIDATE NOT_EMPTY_FUNC
WARNING "La data registrazione e' obbligatoria"
END
BUTTON DLG_OK 10 2