Patch level :2.1 nopatch per ora

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :programma proforma in corso d'opera


git-svn-id: svn://10.65.10.50/trunk@13469 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2005-11-03 18:38:07 +00:00
parent ba935d2176
commit ba7cfa9079
3 changed files with 338 additions and 297 deletions

View File

@ -12,6 +12,7 @@
#include "cg7.h" #include "cg7.h"
#include "cg7200a.h" #include "cg7200a.h"
#include "cglib01.h"
#include <mov.h> #include <mov.h>
#include <rmov.h> #include <rmov.h>
@ -19,6 +20,10 @@
#include <pagsca.h> #include <pagsca.h>
#include <partite.h> #include <partite.h>
#include "../ca/calib01.h"
#include "../ca/movana.h"
#include "../ca/rmovana.h"
#define ALIAS_PCON1 100 #define ALIAS_PCON1 100
#define ALIAS_PCON2 200 #define ALIAS_PCON2 200
#define ALIAS_ABPCON1 300 #define ALIAS_ABPCON1 300
@ -30,12 +35,12 @@ protected:
virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
public: public:
TInvioP_file(const TString& file_name, const TString& config_name); TInvioP_file(const TString& file_name);
virtual ~TInvioP_file() { } virtual ~TInvioP_file() { }
}; };
TInvioP_file::TInvioP_file(const TString& file_name, const TString& config_name) TInvioP_file::TInvioP_file(const TString& file_name)
: TFile_text(file_name, config_name) : TFile_text(file_name, "proforma.ini")
{ {
} }
@ -76,26 +81,29 @@ class TInvioP : public TSkeleton_application
{ {
TCursor* _cur; TCursor* _cur;
TInvioP_mask* _msk; TInvioP_mask* _msk;
TInvioP_file* _trasfile;
TInvioP_file* _trasfilepag;
TDate _dataini, _datafin; TDate _dataini, _datafin;
long _nregcosto, _nregpag; long _nregcosto, _nregpag;
real _importo; real _importo;
TConfig* _configfile;
protected: protected:
virtual bool create(void); virtual bool create(void);
virtual bool destroy(void); virtual bool destroy(void);
virtual void main_loop() ; virtual void main_loop() ;
void invio_proforma(); void invio_proforma();
bool i_proforma_movimenti(const bool pagamenti); bool i_proforma_movimenti();
bool i_proforma_righe(); bool i_proforma_righe(TCursor& cur, TInvioP_file* trasfile);
bool i_proforma_pagamenti(const TCursor& cur); bool i_proforma_pagamenti();
bool i_proforma_clifor(char tipocf = 'C'); bool i_proforma_clifor(char tipocf = 'C');
bool i_proforma_conti(); bool i_proforma_conti();
public: public:
const real get_importo() {return _importo;}; const real get_importo() {return _importo;};
const char* get_nregcosto() {return format("%d", _nregcosto);}; const char* get_nregcosto() {return format("%d", _nregcosto);};
const char* get_nregpag() {return format("%d", _nregpag);}; const char* get_nregpag() {return format("%d", _nregpag);};
TInvioP_file* apri_file(const char* nome);
void chiudi_file(TInvioP_file* trasfile);
TInvioP() {}; TInvioP() {};
virtual ~TInvioP() {}; virtual ~TInvioP() {};
}; };
@ -161,71 +169,30 @@ void TInvioP_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TS
str = valore; str = valore;
} }
bool TInvioP::create() TInvioP_file* TInvioP::apri_file(const char* nome)
{ {
open_files(LF_CAUSALI, LF_CLIFO, LF_PCON, LF_MOV, LF_RMOV, LF_RMOVIVA, LF_ABPCON, LF_PARTITE, 0); TFilename filename = _msk->get(F_DESTINAZIONE);
_msk = new TInvioP_mask(); filename.add(nome);
_trasfile = NULL; filename.ext("txt");
_trasfilepag = NULL; if (filename.exist())
return TSkeleton_application::create(); remove(filename);
TInvioP_file* trasfile = new TInvioP_file(filename);
trasfile->open(filename,'w');
trasfile->force_record_separator();
return trasfile;
} }
bool TInvioP::destroy() void TInvioP::chiudi_file(TInvioP_file* trasfile)
{ {
if (_trasfile) trasfile->close();
delete _trasfile; delete trasfile;
if (_trasfilepag)
delete _trasfilepag;
delete _msk;
return TSkeleton_application::destroy();
}
void TInvioP::main_loop()
{
TFilename configname = "cg7200a.ini";
TConfig configfile(configname);
_msk->set(F_DATAINI, configfile.get("DATA","OPZIONI"));
_msk->set(F_DESTINAZIONE, configfile.get("PERCORSO","OPZIONI"));
while (_msk->run()!=K_QUIT)
{
configfile.set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI");
configfile.set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI");
_dataini = _msk->get_date(F_DATAINI);
_datafin = _msk->get_date(F_DATAFIN);
const char tipoinvio = _msk->get(F_TIPOINVIO)[0];
if (tipoinvio == 'P')
invio_proforma();
}
}
void TInvioP::invio_proforma()
{
if (_msk->get_bool(F_MOVIMENTI))
{
i_proforma_movimenti(_msk->get_bool(F_PAGAMENTI));
i_proforma_righe();
}
if (_msk->get_bool(F_CLIENTI))
i_proforma_clifor();
if (_msk->get_bool(F_FORNITORI))
i_proforma_clifor('F');
if (_msk->get_bool(F_CONTI))
i_proforma_conti();
} }
bool TInvioP::i_proforma_conti() bool TInvioP::i_proforma_conti()
{ {
TFilename configname = "proforma.ini"; TInvioP_file* trasfile = apri_file("pianocon");
TConfig configfile(configname);
TFilename filename = _msk->get(F_DESTINAZIONE);
filename.add("pianocon.txt");
if (fexist(filename))
remove(filename);
_trasfile = new TInvioP_file(filename, configname);
_trasfile->open(filename,'w');
_trasfile->force_record_separator();
TRelation rel(LF_PCON); TRelation rel(LF_PCON);
TCursor cur(&rel); TCursor cur(&rel);
const long cur_items = cur.items(); const long cur_items = cur.items();
@ -237,95 +204,149 @@ bool TInvioP::i_proforma_conti()
{ {
TRecord_text rec; TRecord_text rec;
rec.set_type("P"); rec.set_type("P");
_trasfile->autoload(rec, cur); trasfile->autoload(rec, cur);
_trasfile->write(rec); trasfile->write(rec);
} }
} }
_trasfile->close(); chiudi_file(trasfile);
delete _trasfile; return true;
_trasfile = NULL;
return TRUE;
} }
bool TInvioP::i_proforma_movimenti(const bool pagamenti) bool TInvioP::i_proforma_movimenti()
{ {
TFilename configname = "proforma.ini"; TInvioP_file* trasfile = apri_file("registra"); //file testate
TConfig configfile(configname); TInvioP_file* trasfilerighe = apri_file("righe"); //file righe movimenti
TFilename filename = _msk->get(F_DESTINAZIONE);
filename.add("registra.txt"); //trasferimento testate movimenti (cerca direttamente sui movimenti analitici in chiave 2..
if (fexist(filename)) //..,cioè per DATACOMP e con NUMREGCG!=0
remove(filename); TRectype da(LF_MOVANA);
_trasfile = new TInvioP_file(filename, configname); TRectype a(LF_MOVANA);
_trasfile->open(filename,'w'); da.put(MOVANA_DATACOMP, _dataini);
_trasfile->force_record_separator(); a.put(MOV_DATACOMP, _datafin);
if (pagamenti) TRelation rel(LF_MOVANA);
{ rel.add(LF_MOV, "NUMREG==NUMREGCG");
TFilename filenamepag = _msk->get(F_DESTINAZIONE); rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
filenamepag.add("pagament.txt"); TCursor cur(&rel, "NUMREGCG!=0", 2, &da, &a);
if (fexist(filenamepag))
remove(filenamepag);
_trasfilepag = new TInvioP_file(filenamepag, configname);
_trasfilepag->open(filenamepag,'w');
_trasfilepag->force_record_separator();
}
TRectype da(LF_MOV);
TRectype a(LF_MOV);
da.put(MOV_DATAREG, _dataini);
a.put(MOV_DATAREG, _datafin);
TRelation rel(LF_MOV);
rel.add(LF_CAUSALI, "CODCAUS==CODCAUS", 1);
TCursor cur(&rel, "", 2, &da, &a);
const long cur_items = cur.items(); const long cur_items = cur.items();
if (cur_items != 0) if (cur_items != 0)
{ {
cur.freeze(); //prepara i record di tipo testata da scrivere
TRectype& cur_rec = cur.curr();
for (cur = 0; cur.pos() < cur_items; ++(cur))
{
TRecord_text rec; TRecord_text rec;
rec.set_type("T"); rec.set_type("T");
_trasfile->autoload(rec, cur);
_trasfile->write(rec); cur.freeze();
if (pagamenti) const TRectype& cur_rec = cur.curr();
i_proforma_pagamenti(cur); for (cur = 0; cur.pos() < cur_items; ++(cur))
}
}
_trasfile->close();
delete _trasfile;
_trasfile = NULL;
if (pagamenti)
{ {
_trasfilepag->close(); //carica e scrive il record di testata in base alle informazioni contenute nel proforma.ini
delete _trasfilepag; trasfile->autoload(rec, cur);
_trasfilepag = NULL; trasfile->write(rec);
//trasferisce le righe del movimento analitico corrente solo
i_proforma_righe(cur, trasfilerighe);
} }
return TRUE; }
chiudi_file(trasfilerighe);
chiudi_file(trasfile);
return true;
} }
bool TInvioP::i_proforma_righe() bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe)
{ {
TFilename configname = "proforma.ini"; //---- righe movimenti analitica ----
TConfig configfile(configname); //necessita del numreg del corrente movimento analitico per poterlo istanziare e prenderne le righe
TFilename filename = _msk->get(F_DESTINAZIONE); const long numreg = cur.curr().get_long(MOVANA_NUMREG);
filename.add("righe.txt"); TAnal_mov analmov(numreg); //..istanzia il movimento analitico cercato..
if (fexist(filename)) int i;
remove(filename); for (i = 1; i <= analmov.body().rows(); i++)
_trasfile = new TInvioP_file(filename, configname); {
_trasfile->open(filename,'w'); //..e scandisce le righe alla ricerca di quelle con conto = gruppo/conto/sottoconto del movimento contabile
_trasfile->force_record_separator(); const TRectype& riga = analmov.body().row(i);
TRectype da(LF_MOV); //inganno il cursore passandogli la riga analitica in esame
TRectype a(LF_MOV); cur.curr(LF_RMOVANA) = riga;
da.put(MOV_DATAREG, _dataini);
a.put(MOV_DATAREG, _datafin); TRecord_text recrighe;
TRelation rel(LF_MOV); recrighe.set_type("R");
rel.add(LF_RMOVIVA, "NUMREG==NUMREG", 1); trasfilerighe->autoload(recrighe, cur);
rel.add(LF_RMOV, "NUMREG==NUMREG", 1); trasfilerighe->write(recrighe);
rel.add(LF_PCON, "GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO", 1, LF_RMOV, ALIAS_PCON1); }
rel.add(LF_PCON, "GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO", 1, LF_RMOVIVA, ALIAS_PCON2);
rel.add(LF_ABPCON, "CODCBL==CODCBL", 1, -ALIAS_PCON1, ALIAS_ABPCON1); //---- righe iva ----
rel.add(LF_ABPCON, "CODCBL==CODCBL", 1, -ALIAS_PCON2, ALIAS_ABPCON2); //adesso tocca alle righe iva...e sara' un casino indicibile!
TCursor cur(&rel, "", 2, &da, &a); const char* numregcg = analmov.get(MOVANA_NUMREGCG);
//record_array con le righe iva aventi il numreg = numregcg analitico
TRecord_array righeiva(numregcg, LF_RMOVIVA);
//assoc array contenente tutti i diversi conti che incontrera' nello scanning delle righe iva
TAssoc_array conti;
//scanning delle righe iva alla ricerca dei conti che compaiono
for (int j = 1; j <= righeiva.rows(); j++)
{
//prende il conto e lo mette nell'assoc_array dei conti (notare che, essendo un assoc_array,..
//..non vengono inseriti doppioni! mitico!!)
TBill conto;
conto.get(righeiva[j]);
const char* codconto = conto.string(8);
//ad ogni conto lega un assoc_array (codivae) che conterra' tutti i codici iva legati a quel..
//..conto nelle righe iva con i relativi importi
TAssoc_array* codivae = (TAssoc_array*) conti.objptr(codconto);
if (codivae == NULL) //se non esiste l'assoc_array legato al conto lo crea
{
codivae = new TAssoc_array;
//aggiunge all'assoc_array conti il suo elemento assoc_array codivae..ho un assoc_array..
//..di assoc_array!
conti.add(codconto, codivae);
}
TString16 codiva = righeiva[j].get(RMI_CODIVA); //prende il codice iva dalla riga iva
//aggiungere qui eventuale numero di indetraibile
//ad ogni codiva presente in codivae lega un importo che risultera' la somma di tutti gli..
//..importi con lo stesso conto e codice iva
real* tot_imp = (real*) codivae->objptr(codiva);
if (tot_imp == NULL) //se non esiste l'importo legato al codice iva lo crea
{
tot_imp = new real;
//aggiunge all'assoc_array codivae il suo elemento real tot_imp
codivae->add(codiva, tot_imp);
}
//accresce l'importo tot_imp relativo alla coppia codiva+codconto corrente
*tot_imp += righeiva[j].get_real(RMI_IMPONIBILE);
//aggiungere qui eventuale imposta
}
for (i = 1; i <= analmov.body().rows(); i++)
{
//scanning delle righe analitiche per estrarne i conti e controllare se compaiono nell'assoc_array..
//..dei conti riempito con i conti trovati nelle righe iva
const TRectype& riga = analmov.body().row(i);
const TString& codconto = riga.get(RMOVANA_CODCONTO);
TAssoc_array* codivae = (TAssoc_array*) conti.objptr(codconto); //assoc_array codivae del codconto
//se ho almeno un codice iva assocoato a questo conto nell'assoc_array dei conti
if (codivae != NULL)
{
}
}
return true;
}
bool TInvioP::i_proforma_pagamenti()
{
TInvioP_file* trasfilepag = apri_file("pagament");
TRectype da(LF_MOVANA);
TRectype a(LF_MOVANA);
da.put(MOVANA_DATACOMP, _dataini);
a.put(MOV_DATACOMP, _datafin);
TRelation rel(LF_MOVANA);
rel.add(LF_MOV, "NUMREG==NUMREGCG");
rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
TCursor cur(&rel, "NUMREGCG!=0", 2, &da, &a);
const long cur_items = cur.items(); const long cur_items = cur.items();
if (cur_items != 0) if (cur_items != 0)
{ {
@ -333,48 +354,10 @@ bool TInvioP::i_proforma_righe()
TRectype& cur_rec = cur.curr(); TRectype& cur_rec = cur.curr();
for (cur = 0; cur.pos() < cur_items; ++(cur)) for (cur = 0; cur.pos() < cur_items; ++(cur))
{ {
const long numreg = cur.curr().get_long(MOV_NUMREG);
bool continua = TRUE;
while (continua)
{
const long numregrig = cur.curr(LF_RMOVIVA).get_long(RMI_NUMREG);
if (numreg == numregrig)
{
TRectype& cur_rec_righe = cur.curr(LF_RMOVIVA);
TRecord_text recrighe;
recrighe.set_type("I");
_trasfile->autoload(recrighe, cur);
_trasfile->write(recrighe);
}
continua = cur.next_match(LF_RMOVIVA, "NUMREG");
}
continua = TRUE;
while (continua)
{
const long numregrig = cur.curr(LF_RMOV).get_long(RMV_NUMREG);
if (numreg == numregrig)
{
TRectype& cur_rec_righe = cur.curr(LF_RMOV);
TRecord_text recrighe;
recrighe.set_type("R");
_trasfile->autoload(recrighe, cur);
_trasfile->write(recrighe);
}
continua = cur.next_match(LF_RMOV, "NUMREG");
}
}
}
_trasfile->close();
delete _trasfile;
_trasfile = NULL;
return TRUE;
}
bool TInvioP::i_proforma_pagamenti(const TCursor& cur) // const char tipomov = cur_rec.get(MOVANA_TIPOMOV)[0];
{ // if (tipomov == '3' || tipomov == '2' || tipomov == '6')
const char tipomov = cur.curr().get(MOV_TIPOMOV)[0]; // {
if (tipomov == '3' || tipomov == '2' || tipomov == '6')
{
TRelation relpart(LF_PARTITE); TRelation relpart(LF_PARTITE);
TRectype da(LF_PARTITE); TRectype da(LF_PARTITE);
da.put(PART_NREG, cur.curr().get(MOV_NUMREG)); da.put(PART_NREG, cur.curr().get(MOV_NUMREG));
@ -417,6 +400,7 @@ bool TInvioP::i_proforma_pagamenti(const TCursor& cur)
if (!is_key) if (!is_key)
pagame.add(indice, somma); pagame.add(indice, somma);
} }
// scrivo i record risultanti // scrivo i record risultanti
real* cp; real* cp;
for (cp = (real*) pagame.first_item(); cp != NULL; cp = (real*) pagame.succ_item()) for (cp = (real*) pagame.first_item(); cp != NULL; cp = (real*) pagame.succ_item())
@ -433,30 +417,31 @@ bool TInvioP::i_proforma_pagamenti(const TCursor& cur)
_importo = *cp; _importo = *cp;
TRecord_text recpag; TRecord_text recpag;
recpag.set_type("G"); recpag.set_type("G");
_trasfilepag->autoload(recpag, curpag); trasfilepag->autoload(recpag, curpag);
_trasfilepag->write(recpag); trasfilepag->write(recpag);
} }
}
} }//if curpag_items..
} }//for curpart =..
} }//if curpart_items..
return TRUE;
// }//if tipomov..
}//for cur =..
}//if cur_items..
chiudi_file(trasfilepag);
return true;
} }
bool TInvioP::i_proforma_clifor(char tipocf) bool TInvioP::i_proforma_clifor(char tipocf)
{ {
TFilename configname = "proforma.ini"; TInvioP_file* trasfile = NULL;
TConfig configfile(configname);
TFilename filename = _msk->get(F_DESTINAZIONE);
if (tipocf == 'C') if (tipocf == 'C')
filename.add("clienti.txt"); TInvioP_file* trasfile = apri_file("clienti");
else else
filename.add("fornit.txt"); TInvioP_file* trasfile = apri_file("fornit");
if (fexist(filename))
remove(filename);
_trasfile = new TInvioP_file(filename, configname);
_trasfile->open(filename,'w');
_trasfile->force_record_separator();
TString80 filtro = ""; TString80 filtro = "";
filtro.format("TIPOCF == \"%c\"", tipocf); filtro.format("TIPOCF == \"%c\"", tipocf);
TRelation rel(LF_CLIFO); TRelation rel(LF_CLIFO);
@ -472,19 +457,74 @@ bool TInvioP::i_proforma_clifor(char tipocf)
TRecord_text rec; TRecord_text rec;
rec.set_type("C"); rec.set_type("C");
_trasfile->autoload(rec, cur); trasfile->autoload(rec, cur);
_trasfile->write(rec); trasfile->write(rec);
} }
} }
_trasfile->close(); chiudi_file(trasfile);
delete _trasfile; return true;
_trasfile = NULL; }
return TRUE;
//"metodo dei metodi":in base ai parametri della maschera esegue la procedura indicata
void TInvioP::invio_proforma()
{
if (_msk->get_bool(F_MOVIMENTI))
i_proforma_movimenti();
if (_msk->get_bool(F_PAGAMENTI))
i_proforma_pagamenti();
if (_msk->get_bool(F_CLIENTI))
i_proforma_clifor();
if (_msk->get_bool(F_FORNITORI))
i_proforma_clifor('F');
if (_msk->get_bool(F_CONTI))
i_proforma_conti();
}
bool TInvioP::create()
{
_msk = new TInvioP_mask();
_configfile = new TConfig("proforma.ini");
return TSkeleton_application::create();
}
bool TInvioP::destroy()
{
if (_configfile != NULL)
delete _configfile;
delete _msk;
return TSkeleton_application::destroy();
}
void TInvioP::main_loop()
{
//il programma si puo' usare SOLO se in contabilita' analitica si usa il pianodeiconti contabile
TConfig& cfg = ca_config();
const bool use_pdcc = cfg.get_bool("UsePdcc");
if (!use_pdcc)
return;
TFilename configname = "cg7200a.ini"; //file configurazione della maschera
configname.custom_path();
TConfig configfile(configname);
_msk->set(F_DATAINI, configfile.get("DATA","OPZIONI"));
_msk->set(F_DESTINAZIONE, configfile.get("PERCORSO","OPZIONI"));
while (_msk->run()!=K_QUIT)
{
configfile.set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI");
configfile.set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI");
_dataini = _msk->get_date(F_DATAINI);
_datafin = _msk->get_date(F_DATAFIN);
const char tipoinvio = _msk->get(F_TIPOINVIO)[0];
if (tipoinvio == 'P')
invio_proforma(); //dopo aver preso i parametri dalla maschera chiama il "metodo dei metodi"
}
} }
int cg7200(int argc, char **argv) int cg7200(int argc, char **argv)
{ {
TInvioP a; TInvioP a;
a.run(argc, argv, "Invio dati contabilità"); a.run(argc, argv, "Invio dati contabilità a Proforma");
return 0; return 0;
} }

View File

@ -31,7 +31,8 @@ END
BOOLEAN F_MOVIMENTI BOOLEAN F_MOVIMENTI
BEGIN BEGIN
PROMPT 3 5 "Movimenti contabili" PROMPT 3 5 "Movimenti contabili"
MESSAGE TRUE,ENABLE F_DATAFIN MESSAGE FALSE CLEAR,F_PAGAMENTI|DISABLE,F_DATAFIN
MESSAGE TRUE ENABLE,F_PAGAMENTI|ENABLE,F_DATAFIN
END END
BOOLEAN F_CLIENTI BOOLEAN F_CLIENTI

View File

@ -142,7 +142,7 @@ NAME(0) = ID REGISTRAZIONE
TYPE(0) = NUMERO TYPE(0) = NUMERO
POSITION(0) = 0 POSITION(0) = 0
LENGTH(0) = 10 LENGTH(0) = 10
FIELD(0) = 24->NUMREG FIELD(0) = 108->NUMREG
NAME(1) = FLAG RIGA IVA NAME(1) = FLAG RIGA IVA
TYPE(1) = STRINGA TYPE(1) = STRINGA
@ -154,25 +154,25 @@ NAME(2) = FLAG DARE/AVERE
TYPE(2) = STRINGA TYPE(2) = STRINGA
POSITION(2) = 11 POSITION(2) = 11
LENGTH(2) = 1 LENGTH(2) = 1
FIELD(2) = 24->SEZIONE FIELD(2) = 108->SEZIONE
NAME(3) = CODICE MASTRO NAME(3) = CODICE MASTRO
TYPE(3) = STRINGA TYPE(3) = STRINGA
POSITION(3) = 12 POSITION(3) = 12
LENGTH(3) = 5 LENGTH(3) = 5
FIELD(3) = 24->GRUPPO FIELD(3) = 108->CODCONTO[1,3]
NAME(4) = CODICE CONTO NAME(4) = CODICE CONTO
TYPE(4) = STRINGA TYPE(4) = STRINGA
POSITION(4) = 17 POSITION(4) = 17
LENGTH(4) = 5 LENGTH(4) = 5
FIELD(4) = 24->CONTO FIELD(4) = 108->CODCONTO[4,6]
NAME(5) = CODICE SOTTOCONTO NAME(5) = CODICE SOTTOCONTO
TYPE(5) = STRINGA TYPE(5) = STRINGA
POSITION(5) = 22 POSITION(5) = 22
LENGTH(5) = 5 LENGTH(5) = 5
FIELD(5) = 24->SOTTOCONTO FIELD(5) = 108->CODCONTO[7,12]
NAME(6) = FLAG CLIFOR NAME(6) = FLAG CLIFOR
TYPE(6) = STRINGA TYPE(6) = STRINGA
@ -190,12 +190,12 @@ NAME(8) = DESCRIZIONE RIGA
TYPE(8) = STRINGA TYPE(8) = STRINGA
POSITION(8) = 38 POSITION(8) = 38
LENGTH(8) = 40 LENGTH(8) = 40
FIELD(8) = 24->DESCR[1,40] FIELD(8) = 108->DESCR[1,40]
NAME(9) = IMPORTO SOTTOCONTO NAME(9) = IMPORTO SOTTOCONTO
TYPE(9) = IMPORTO TYPE(9) = IMPORTO
POSITION(9) = 78 POSITION(9) = 78
FIELD(9) = 24->IMPORTO FIELD(9) = 108->IMPORTO
NAME(10) = IMPONIBILE NAME(10) = IMPONIBILE
TYPE(10) = IMPORTO TYPE(10) = IMPORTO
@ -215,7 +215,7 @@ NAME(13) = COMMESSA
TYPE(13) = STRINGA TYPE(13) = STRINGA
POSITION(13) = 125 POSITION(13) = 125
LENGTH(13) = 20 LENGTH(13) = 20
FIELD(13) = 24->CODCMS FIELD(13) = 108->CODCMS
NAME(14) = VOCE DI SPESA NAME(14) = VOCE DI SPESA
TYPE(14) = STRINGA TYPE(14) = STRINGA