From 5d6a9bef1a5be234239ea688df58f4a3b7f1719c Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 8 Sep 2010 10:09:59 +0000 Subject: [PATCH] Patch level : 10.0 patch 804 Files correlati : ve0.exe ve6.exe Ricompilazione Demo : [ ] Commento : MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug 0001690: Gestione documenti (ve0), Contabilizzazione documenti( ve6) Aggiungere la possibilità di distribuire le spese sui conti contabili quando quest'ultime non hanno un conto proprio git-svn-id: svn://10.65.10.50/branches/R_10_00@20829 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/clifor.cpp | 33 ++++++++++++++ ve/clifor.h | 3 ++ ve/velib.h | 2 + ve/velib04.h | 10 ++++- ve/velib04b.cpp | 114 ++++++++++++++++++++++++++++++++---------------- ve/velib04f.cpp | 98 +++++++++++++++++++++++++++++++++-------- ve/vetbeld.h | 1 + ve/vetbeld.uml | 11 ++++- 8 files changed, 212 insertions(+), 60 deletions(-) diff --git a/ve/clifor.cpp b/ve/clifor.cpp index 00e4e3cc0..39087bec6 100755 --- a/ve/clifor.cpp +++ b/ve/clifor.cpp @@ -1,5 +1,6 @@ #include #include "clifor.h" +#include "velib.h" #include "../li/letint.h" #include #include @@ -173,6 +174,38 @@ void TCli_for::init() _use_lettere = ini_get_bool(CONFIG_DITTA, "ve", "USELETTERE"); } +void TCli_for::cli2doc(TDocumento & doc) +{ + const TRectype & v = vendite(); + + doc.put(DOC_CODVAL, get(CLI_CODVAL)); + doc.put(DOC_CODLIN, get(CLI_CODLIN)); + doc.put(DOC_CODPAG, get(CLI_CODPAG)); + doc.put(DOC_CODABIA, get(CLI_CODABI)); + doc.put(DOC_CODCABA, get(CLI_CODCAB)); + doc.put(DOC_IBAN, get(CLI_IBAN)); + doc.put(DOC_CODABIP, v.get(CFV_CODABIPR)); + doc.put(DOC_CODCABP, v.get(CFV_CODCABPR)); + doc.put(DOC_RAGGR, v.get(CFV_RAGGDOC)); + doc.put(DOC_RAGGREFF, v.get(CFV_RAGGEFF)); + doc.put(DOC_CODINDSP, v.get(CFV_CODINDSP)); + doc.put(DOC_CODAG, v.get(CFV_CODAG)); + doc.put(DOC_CODAGVIS, v.get(CFV_CODAG1)); + doc.put(DOC_CODSPMEZZO, v.get(CFV_CODSPMEZZO)); + doc.put(DOC_CODPORTO, v.get(CFV_CODPORTO)); + doc.put(DOC_CODNOTESP1, v.get(CFV_CODNOTESP1)); + doc.put(DOC_CODNOTESP2, v.get(CFV_CODNOTESP2)); + doc.put(DOC_CODNOTE, v.get(CFV_CODNOTE)); + doc.put(DOC_CODVETT1, v.get(CFV_CODVETT1)); + doc.put(DOC_CODVETT2, v.get(CFV_CODVETT2)); + doc.put(DOC_CODVETT3, v.get(CFV_CODVETT3)); + doc.put(DOC_PERCSPINC, v.get(CFV_PERCSPINC)); + doc.put(DOC_ADDBOLLI, v.get(CFV_ADDBOLLI)); + doc.put(DOC_CATVEN, v.get(CFV_CATVEN)); + doc.put(DOC_LIQDIFF, get_int(CLI_ALLEG) == 7 && v.get_bool(CFV_FATTSOSP) ? "X" : ""); +} + + TCli_for::TCli_for(char tipo, long codice) : TMultiple_rectype( LF_CLIFO ), _ven_rec(LF_CFVEN), _letint(LF_LETINT), _use_lettere(false), _lettera_found(false) { diff --git a/ve/clifor.h b/ve/clifor.h index 8ff482adf..6e4b7960e 100755 --- a/ve/clifor.h +++ b/ve/clifor.h @@ -21,6 +21,8 @@ #include #endif +class TDocumento; + class TOccasionale : public TRectype { public: @@ -67,6 +69,7 @@ public: virtual int read(const TRectype& rec, word op = _isequal, word lockop = _nolock); int read(char tipo, long codice, word op = _isequal, word lockop = _nolock); virtual int remove(TBaseisamfile& f) const; + void cli2doc(TDocumento & doc); TCli_for(char tipo = ' ', long codice = 0L); TCli_for(const TRectype & rec); diff --git a/ve/velib.h b/ve/velib.h index 8bfe763da..56ca44d93 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -868,6 +868,8 @@ public: const TString & codesiva() const; void get_protocolli_esenzione(TString & esenzione, TString & data_esenzione, TString & registrazione, TString & data_registrazione) const; + + void cli2doc() { clifor().cli2doc(*this); } TDocumento (); TDocumento (const TDocumento & d); TDocumento(char provv, int anno, const char* codnum, long numdoc); diff --git a/ve/velib04.h b/ve/velib04.h index a3c2f817d..64059be30 100755 --- a/ve/velib04.h +++ b/ve/velib04.h @@ -428,8 +428,11 @@ protected: error_type compile_head_mov(TDocumento&); // Compila la testata del movimento per le fatture da emettere / ricevere; error_type compile_head_mov_re(TDocumento&); + bool spalma_spese() const { return get("I2") == "X"; } + // Funzione per distribuire le spese + void split_sp_amount(const real & amount, int decimals); // Funzione per ricercare il conto di costo/ricavo - error_type search_costo_ricavo(TBill&, const TRiga_documento&); + error_type search_costo_ricavo(TBill& conto, const TRiga_documento& r, real & amount_to_split, const real & valore); // Funzione per ricercare il conto di costo/ricavo materiali error_type search_costo_ricavo_mat(TBill&, const TRiga_documento&); // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva @@ -613,7 +616,9 @@ class TContabilizzazione_analitica : public TElaborazione // velib04f protected: bool find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti, int annoes, const char tipomov, bool & pareggio); - bool find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, bool & pareggio); + bool spalma_spese() const { return get("I2") == "X"; } + void split_sp_amount(TAnal_mov & mov, char sezione, bool pareggio, const real & amount, const real & no_ca_amount, int decimals); + bool find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, real & amount_to_split, real & no_ca_amount, const real & valore, bool & pareggio); void init(); virtual const TCausale& doc2caus(const TDocumento& doc); @@ -632,6 +637,7 @@ public: TContabilizzazione_analitica(const char* cod = NULL); TContabilizzazione_analitica(const TRectype& rec); + TContabilizzazione_analitica(const TContabilizzazione & el); virtual ~TContabilizzazione_analitica(); }; diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 0dd7ab3dc..96f1ac528 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -1597,7 +1597,7 @@ error_type TContabilizzazione::compile_head_mov_re(TDocumento& doc) return _error; } -error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_documento& r) +error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_documento& r, real & amount_to_split, const real & valore) { const int items = _search_seq->items(); TLocalisamfile & cli_file = _clifo->lfile(); // YES, arriva qui dentro quando la relazione e' gia' posizionata @@ -1770,6 +1770,11 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc if (!conto.ok() && t == RIGA_SPESEDOC && !__searching) { + if (spalma_spese()) + { + amount_to_split += valore; + return _error; + } const int rows = r.doc().physical_rows(); int row = -1; @@ -1783,7 +1788,7 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc if (row > 0) { __searching = true; - search_costo_ricavo(conto, r.doc()[row]); + search_costo_ricavo(conto, r.doc()[row], amount_to_split, valore); __searching = false; } } @@ -2228,12 +2233,39 @@ bool TContabilizzazione::valid_row_type(const char* rt) const return !tri.empty(); } +void TContabilizzazione::split_sp_amount(const real & amount, int decimals) +{ + TGeneric_distrib d(amount, decimals); + + FOR_EACH_ASSOC_OBJECT((*_righe_iva), obj, key, itm) + { + TRectype & r = (TRectype &)*itm; + + const real imp = r.get_real(RMI_IMPONIBILE); + d.add(imp); + } + FOR_EACH_ASSOC_OBJECT((*_righe_iva), obj1, key1, itm1) + { + TRectype & r = (TRectype &)*itm1; + + real imp = r.get_real(RMI_IMPONIBILE); + const TCodiceIVA i(r.get(RMI_CODIVA)); + + imp += d.get(); + r.put(RMI_IMPONIBILE, imp); + real const imposta = i.imposta(imp); + r.put(RMI_IMPOSTA, imposta); + } +} + error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) // Compila le righe { TString4 tiporiga, codiva1, codiva2; const int rows = doc.rows(); const int ndec = doc.decimals(); + real amount_to_split; + const bool fat_com = doc.tipo().fattura_commerciale(); @@ -2280,7 +2312,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) { if (!riga_omaggio && r.imponibile().is_zero()) continue; - search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro + search_costo_ricavo(conto, r, amount_to_split, r.imponibile()); // l'errore eventuale viene settato qui dentro if (good()) { @@ -2330,6 +2362,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) r.put(RDOC_CODIVA, codiva2); //Restore } else + { if (ritenuta) { TCurrency_documento c(r.ritenuta(tipo_rit)); @@ -2355,7 +2388,6 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) } } else - { if (riga_omaggio) { _error = _righe_iva->add_omaggi(r, conto); @@ -2363,40 +2395,39 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) _nrow = i; } else - { - if (contomat.ok() && contomat != conto && pricemat != 0) - { - TRiga_documento rlav(r); - TRiga_documento rmat(r); - const real prezzo = r.get_real(RDOC_PREZZO); - rmat.put(RDOC_PREZZO, pricemat); - rmat.zero(RDOC_SCONTO); - const real valmat = rmat.imponibile(); - const real diff = r.imponibile() - valmat; + if (contomat.ok() && contomat != conto && pricemat != 0) + { + TRiga_documento rlav(r); + TRiga_documento rmat(r); + const real prezzo = r.get_real(RDOC_PREZZO); + rmat.put(RDOC_PREZZO, pricemat); + rmat.zero(RDOC_SCONTO); + const real valmat = rmat.imponibile(); + const real diff = r.imponibile() - valmat; - rlav.put(RDOC_PREZZO, diff); - rlav.put(RDOC_QTA, 1); - rlav.zero(RDOC_SCONTO); - rmat.put(RDOC_PREZZO, valmat); - rmat.put(RDOC_QTA, 1); - rmat.zero(RDOC_SCONTO); - _righe_iva->add(rlav, conto); - _righe_iva->add(rmat, contomat); - } - else - _righe_iva->add(r, conto); - } + rlav.put(RDOC_PREZZO, diff); + rlav.put(RDOC_QTA, 1); + rlav.zero(RDOC_SCONTO); + rmat.put(RDOC_PREZZO, valmat); + rmat.put(RDOC_QTA, 1); + rmat.zero(RDOC_SCONTO); + _righe_iva->add(rlav, conto); + _righe_iva->add(rmat, contomat); + } + else + if (conto.ok()) + _righe_iva->add(r, conto); - if (r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi. - { - // Totalizza per ogni codice iva il lordo - const TString& cod = r.get(RDOC_CODIVA); - if (!_totali_lordi.is_key(cod)) - _totali_lordi.add(cod, new real); - real& rl = (real&) _totali_lordi[cod]; - rl += r.imponibile(true); - } + if (!ritenuta && r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi. + { + // Totalizza per ogni codice iva il lordo + const TString& cod = r.get(RDOC_CODIVA); + if (!_totali_lordi.is_key(cod)) + _totali_lordi.add(cod, new real); + real& rl = (real&) _totali_lordi[cod]; + rl += r.imponibile(true); } + } } } } @@ -2408,6 +2439,9 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) } + if (amount_to_split != ZERO) + split_sp_amount(amount_to_split, ndec); + if (good() && _righe_iva->empty()) _error = no_rows_error; @@ -2501,6 +2535,7 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc) { const int rows = doc.rows(); const int ndec = doc.decimals(); + real amount_to_split; _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 @@ -2512,10 +2547,12 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc) const char tipo = r.tipo().tipo(); // Le righe omaggio senza addebito IVA vanno saltate const bool riga_omaggio = tipo == RIGA_OMAGGI && r.get_bool(RDOC_ADDIVA); + const bool spesa = r.tipo().tipo() == RIGA_SPESEDOC; + if ((tipo != RIGA_DESCRIZIONI && tipo != RIGA_SCONTI && tipo != RIGA_RETTIFICHE) && !riga_omaggio) { TBill conto; - search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro + search_costo_ricavo(conto, r, amount_to_split, r.imponibile()); // l'errore eventuale viene settato qui dentro if (good()) _righe_iva->add(r, conto); } @@ -2527,6 +2564,7 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc) } } + split_sp_amount(amount_to_split, ndec); if (good() && _righe_iva->items() == 0) _error = no_rows_error; @@ -3692,7 +3730,7 @@ error_type TContabilizzazione::write_anal(TDocumento& doc, const TMovimentoPN& m } if (has_anal_bill) { - TContabilizzazione_analitica canal; + TContabilizzazione_analitica canal(*this); const long numreg_cg = movimento.curr().get_long(MOV_NUMREG); TAnal_mov mov; canal.elabora(doc, numreg_cg, _viswin, _can_write, mov); @@ -4407,4 +4445,4 @@ bool TContabilizzazione::call_exe(const TDocumento& doc, const TMovimentoPN& mov ::remove(ininame); return ok; -} \ No newline at end of file +} diff --git a/ve/velib04f.cpp b/ve/velib04f.cpp index 80b24eae7..6f59d6fe1 100755 --- a/ve/velib04f.cpp +++ b/ve/velib04f.cpp @@ -263,9 +263,11 @@ bool TContabilizzazione_analitica::search_costo_ricavo(const TRiga_documento& r, } static int __searching = false; - if (!conto.ok() && t == RIGA_SPESEDOC && !__searching) { + if (spalma_spese()) + return true; + const int rows = r.doc().physical_rows(); int row = -1; @@ -367,7 +369,7 @@ bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_docum return !conti.empty(); } -bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, bool & pareggio) +bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes, bool riclassifica_fdr_fde, const char tipomov, real & amount_to_split, real & no_ca_amount, const real & valore, bool & pareggio) { bool bArcticleFound = false; @@ -392,8 +394,11 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri { if (!search_costo_ricavo(riga, bill, riclassifica_fdr_fde)) return true; - if (!bill.is_analitico()) + if (!bill.is_analitico() && !_usepdcc && !riga.is_spese()) + { + no_ca_amount += valore; return true; + } if (riga.is_articolo()) { @@ -406,8 +411,8 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri } else { - if (riga.is_spese() || riga.is_prestazione() || - riga.is_risorsa() || riga.is_attrezzatura()) + if (riga.is_spese() || riga.is_prestazione() || + riga.is_risorsa() || riga.is_attrezzatura()) { const char tipo = riga.tipo().tipo(); const TSpesa_prest spp(riga.get(RDOC_CODART), tipo); @@ -417,6 +422,12 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri contanal.format("%03d%03d%06ld", bill.gruppo(), bill.conto(), bill.sottoconto()); else contanal = tipocf == 'F' ? spp.conto_analitico_acquisti() : spp.conto_analitico_vendite() ; + + TFilename pname; + + if (ini_get_bool(riga.doc().tipo().profile_name(pname), "MAIN", "DistribuzioneSpese", true) && + riga.is_spese() && (contanal.blank() || atoi(contanal))) + amount_to_split += valore; } } if (!bArcticleFound) // Se l'anagrafica non esiste va bene cosi' @@ -438,28 +449,32 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri conto.add(100, 4); conti.add(conto); } - const TAnal_ripartizioni_batch & rip = _rip.righe(bill, annoes, tipomov); - pareggio = rip.rows() > 0; - for (int i = 1; i <= rip.rows(); i++) + if (bill.ok()) { - const TRectype& rigarip = rip.row(i); + const TAnal_ripartizioni_batch & rip = _rip.righe(bill, annoes, tipomov); + + pareggio = rip.rows() > 0; + for (int i = 1; i <= rip.rows(); i++) + { + const TRectype& rigarip = rip.row(i); - conto = rigarip.get(RRIP_CODCONTO); + conto = rigarip.get(RRIP_CODCONTO); - const TString costo = rigarip.get(RRIP_CODCOSTO); + const TString costo = rigarip.get(RRIP_CODCOSTO); - conto.add(costo.full() ? costo : riga_cos, 1); + conto.add(costo.full() ? costo : riga_cos, 1); - const TString & commessa = rigarip.get(RRIP_CODCMS); + const TString & commessa = rigarip.get(RRIP_CODCMS); - conto.add(commessa.full() ? commessa : riga_cms, 2); + conto.add(commessa.full() ? commessa : riga_cms, 2); - const TString & fase = rigarip.get(RRIP_CODFASE); + const TString & fase = rigarip.get(RRIP_CODFASE); - conto.add(fase.full() ? fase: riga_fsc, 3); - conto.add(rigarip.get(RRIP_RIPARTO), 4); - conti.add(conto); + conto.add(fase.full() ? fase: riga_fsc, 3); + conto.add(rigarip.get(RRIP_RIPARTO), 4); + conti.add(conto); + } } return !conti.empty(); @@ -492,6 +507,37 @@ void TContabilizzazione_analitica::calcola_date_comp(const TDocumento& doc, TDat annoes = esercizi().date2esc(datacomp); //ci potrebbe andare datacomp? All'analisi l'ardua sentenza } +void TContabilizzazione_analitica::split_sp_amount(TAnal_mov & mov, char sezione, bool pareggio, const real & amount, const real & no_ca_amount, int decimals) +{ + TGeneric_distrib w(amount, decimals); + + w.add(mov.get_real(MOVANA_TOTDOC)); + w.add(no_ca_amount); + const real ca_amount = w.get(); + + TGeneric_distrib d(ca_amount, decimals); + const int rows = mov.rows(); + + for (int i = pareggio ? 2 : 1; i <= rows; i++) + { + TRectype& r = mov.body()[i]; + TImporto imp(r.get_char(RMOVANA_SEZIONE), r.get_real(RMOVANA_IMPORTO)); + + imp.normalize(sezione); + d.add(imp.valore()); + } + for (int i = pareggio ? 2 : 1; i <= rows; i++) + { + TRectype& r = mov.body()[i]; + TImporto imp(r.get_char(RMOVANA_SEZIONE), r.get_real(RMOVANA_IMPORTO)); + + imp += TImporto(imp.sezione(), d.get()); + imp.normalize(); + r.put(RMOVANA_IMPORTO, imp.valore()); + r.put(RMOVANA_SEZIONE, imp.sezione()); + } +} + bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TViswin* viswin, bool can_write, TAnal_mov& mov, bool riclassifica_fdr_fde) { TDate datareg, datacomp, datafcomp; @@ -579,6 +625,9 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis const TipoIVA tiva = caus.iva(); const bool vendita = tiva == iva_vendite; TBill bill; caus.bill(RIGA_IVA_NON_DETRAIBILE, bill); + bool has_pareggio = false; + real amount_to_split; + real no_ca_amount; // Scandisco le righe del documento, const int righe_doc = doc.physical_rows(); //ignora sconti ed esenzioni (sennò sarebbe doc.rows() @@ -652,7 +701,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis TString_array conti; const char tipomov = mov.get_char(MOVANA_TIPOMOV); - const bool ok = find_conti(riga, conti, annoes, riclassifica_fdr_fde, tipomov, pareggio); + const bool ok = find_conti(riga, conti, annoes, riclassifica_fdr_fde, tipomov, amount_to_split, no_ca_amount, valore, pareggio); if (!ok) { if (viswin != NULL) @@ -690,6 +739,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis rmov.put(RMOVANA_IMPORTO, imp.valore()); totdoc += imp; } + has_pareggio |= pareggio; } if (_usepdcc) @@ -746,6 +796,9 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis } } + if (amount_to_split != ZERO) + split_sp_amount(mov, sezione, has_pareggio, amount_to_split, no_ca_amount, doc.decimals()); + if (can_write && mov.rows() > 0) { totdoc.normalize(); @@ -894,6 +947,13 @@ TContabilizzazione_analitica::TContabilizzazione_analitica(const TRectype& rec) init(); } +TContabilizzazione_analitica::TContabilizzazione_analitica(const TContabilizzazione & el) + : TElaborazione(el), _error(no_error), _caus(NULL) +{ + put("I0", 7); + init(); +} + TContabilizzazione_analitica::~TContabilizzazione_analitica() { if (_caus != NULL) diff --git a/ve/vetbeld.h b/ve/vetbeld.h index 0668cdb1d..5b4bd9e80 100755 --- a/ve/vetbeld.h +++ b/ve/vetbeld.h @@ -82,6 +82,7 @@ #define F_USA_DOCRIF 331 #define F_RIF_DOCIN 332 #define F_COMMESSA 333 +#define F_SPALMA 334 #define F_PREZZO_DA_ORDINE 340 #define F_AGGIORNA_PREZZO 341 diff --git a/ve/vetbeld.uml b/ve/vetbeld.uml index 7b2cf2de8..ade3fd819 100755 --- a/ve/vetbeld.uml +++ b/ve/vetbeld.uml @@ -741,9 +741,18 @@ BEGIN FIELD B8 END +LISTBOX F_SPALMA 1 12 +BEGIN + PROMPT 2 17 "Spalma le spese" + ITEM " |Non spalmare" + ITEM "X|Spalma" + FIELD I2 + GROUP 3 9 +END + STRING F_RIF_DOCIN 4 BEGIN - PROMPT 2 17 "Numerazione documenti in entrata " + PROMPT 40 17 "Numerazione documenti in entrata" USE %NUM INPUT CODTAB F_RIF_DOCIN DISPLAY "Codice" CODTAB