Patch level : 2.2

Files correlati     : ca0
Ricompilazione Demo : [ ]
Commento            :

Aggiunta gestione tabelle di ripartizione


git-svn-id: svn://10.65.10.50/trunk@12563 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-12-31 09:58:58 +00:00
parent 1c2839ebbd
commit 6dd2e7816f
7 changed files with 829 additions and 17 deletions

View File

@ -24,7 +24,6 @@ class TAnalisi_app : public TAnal_app
{
protected:
virtual TAnal_msk* create_mask() const { return new TPiano_conti_anal_msk; }
virtual TConfig* create_config() const { return new TConfig(CONFIG_DITTA, "ca"); }
virtual bool create();
};

425
ca/ca0800.cpp Executable file
View File

@ -0,0 +1,425 @@
#include <automask.h>
#include <recarray.h>
#include <relapp.h>
#include "ca0800a.h"
const char* get_key_fieldname(int logic, int k)
{
const RecDes& rd = prefix().get_recdes(logic);
CHECKD(k > 0 && k <= rd.NKeys, "Invalid key on file ", logic);
const KeyDes& ky = rd.Ky[k-1];
const int idx = (logic == LF_TAB || logic == LF_TABCOM) ? 1 : 0;
const int pos = ky.FieldSeq[idx] % MaxFields;
return rd.Fd[pos].Name;
}
void append_select_clause(ostream& out, int level, const TArray& key1)
{
const TFieldref& key = (const TFieldref&)key1[level-1];
TString str;
str << " SE STR(";
if (level > 1)
str << "(NUM(LEN(" << key.name() << "))>" << key.from() << ')'; // SE LEN(CODCONTO)>=4
if (level < key1.items())
{
if (level > 1) str << "&&";
str << "(NUM(LEN(" << key.name() << "))<=" << key.to() << ')'; // SE LEN(CODCONTO)<=7
}
str << ')';
out << str << endl;
}
void append_run_clause(ostream& out, int logicnum)
{
const TRectype r(logicnum);
TString app; r.get_relapp(app);
if (app.not_empty())
out << "AD RU " << app << endl;
}
void create_browse1(TEdit_field& kfld, int level, TConfig& cfg,
int logic,
const char* key_var, short key_id,
const char* des_var, short des_id,
const TArray& key1, const TArray& key2)
{
TFilename tmp; tmp.temp();
ofstream out(tmp);
out << "US " << logic << endl;
append_select_clause(out, level, key1);
append_run_clause(out, logic);
for (int i = 1; i <= level; i++)
{
const TString& picture = cfg.get(key_var, NULL, i);
const TString& prompt = cfg.get(des_var, NULL, i);
const TFieldref& field = (const TFieldref&)key1[i-1];
const int length = field.to() - field.from();
out << "IN " << field << ' ' << (key_id+i-1) << endl;
out << "DI \"" << prompt;
if (length > prompt.len())
out << '@' << length;
out << "\" " << field << endl;
out << "OU " << (key_id+i-1) << ' ' << field << endl;
out << "FI " << field << endl;
}
const TFieldref& field = (const TFieldref&)key2[0];
out << "DI \"Descrizione@50\" " << field << endl;
out << "OU " << (des_id+level-1) << ' ' << field << endl;
out << "CH RE" << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
void create_browse2(TEdit_field& kfld, int level, TConfig& cfg,
int logic,
const char* key_var, short key_id,
const char* des_var, short des_id,
const TArray& key1, const TArray& key2)
{
const TFieldref& field = (const TFieldref&)key2[0];
TString str2; str2 << field;
TFilename tmp; tmp.temp();
ofstream out(tmp);
out << "US " << logic << " KE 2";
append_select_clause(out, level, key1);
append_run_clause(out, logic);
out << "DI \"Descrizione@50\" " << str2 << endl;
out << "IN " << str2 << ' ' << kfld.dlg() << endl;
out << "OU " << kfld.dlg() << ' ' << str2 << endl;
int from = 1, to = 1;
for (int i = 1; i <= level; i++)
{
const TString& picture = cfg.get(key_var, NULL, i);
const TString& prompt = cfg.get(des_var, NULL, i);
const TFieldref& field = (const TFieldref&)key1[i-1];
const int length = field.to() - field.from();
out << "DI \"" << prompt;
if (length > prompt.len())
out << '@' << length;
out << "\" " << field << endl;
out << "OU " << (key_id+i-1) << ' ' << field << endl;
from = to+1;
}
out << "CH NO" << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
int create_fields(TMask& msk, int logicnum, int x, int y,
const char* key_var, short key_id,
const char* des_var, short des_id)
{
TConfig cfg(CONFIG_DITTA, "ca");
TArray key1, key2;
int maxkeylen = 0, maxdeslen = 0;
int level;
int from = 1, to = 1;
for (level = 1; ; level++)
{
const TString& prompt = cfg.get(des_var, NULL, level);
if (prompt.blank())
break;
const TString& picture = cfg.get(key_var, NULL, level);
const int keylen = picture.len();
const int deslen = prompt.len();
if (keylen > maxkeylen) maxkeylen = keylen;
if (deslen > maxdeslen) maxdeslen = deslen;
to = from+keylen-1;
TString80 str; str = get_key_fieldname(logicnum, 1);
str << '[' << from << ',' << to << ']';
key1.add(new TFieldref(str, logicnum));
from = to+1;
}
key2.add(new TFieldref(get_key_fieldname(logicnum, 2), logicnum));
maxdeslen++;
const int tab0 = x;
const int tab1 = tab0 + maxdeslen + maxkeylen + 4;
for (int i = 1; i < level; i++)
{
const short kid = key_id+i-1;
const TString& picture = cfg.get(key_var, NULL, i);
TString80 prompt = cfg.get(des_var, NULL, i);
prompt.left_just(maxdeslen);
TEdit_field& kfld = msk.add_string(kid, 0, prompt, tab0, y+i-1, picture.len(), "BU");
create_browse1(kfld, i, cfg, logicnum, key_var, key_id, des_var, des_id, key1, key2);
kfld.set_group(2);
const short did = des_id+i-1;
TEdit_field& dfld = msk.add_string(did, 0, "", tab1, y+i-1, 50, "B", 72+tab0-tab1);
create_browse2(dfld, i, cfg, logicnum, key_var, key_id, des_var, des_id, key1, key2);
dfld.set_group(2);
}
return level;
}
///////////////////////////////////////////////////////////
// TRiparti_msk
///////////////////////////////////////////////////////////
class TRiparti_msk : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void create_sheet();
public:
TRiparti_msk();
};
bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_TIPORIP:
if (e == fe_init || e == fe_modify)
{
TSheet_field& sf = sfield(F_SHEET);
TMask& sm = sf.sheet_mask();
const int t = atoi(o.get());
sm.show(101, t == 0); // Percentuale
sm.show(201, t == 2); // Parti
}
if (e == fe_close && atoi(o.get()) == 0)
{
TSheet_field& sf = sfield(F_SHEET);
real tot;
FOR_EACH_SHEET_ROW(sf, i, row)
tot += real(row->get(0));
tot.round(2);
if (tot != CENTO)
return error_box(TR("Il totale delle percentuali di riparto deve essere 100"));
}
break;
default:
break;
}
return true;
}
void TRiparti_msk::create_sheet()
{
TSheet_field& sf = sfield(F_SHEET);
TMask& sm = sf.sheet_mask();
sm.hide(-1);
TConfig ini(CONFIG_DITTA, "ca");
const bool use_pdc = ini.get_bool("UsePdcc");
create_fields(sm, LF_CDC, 1, 1, "CdC", 202, "CdCDes", 252);
create_fields(sm, LF_COMMESSE, 1, 5, "Cms", 206, "CmsDes", 256);
create_fields(sm, LF_CDC, 1, 9, "CdC", 210, "CdCDes", 260);
if (!use_pdc)
{
create_fields(sm, LF_PCONANA,1, 13, "Pdci", 214, "PdciDes", 264);
sm.hide(-6);
}
for (short id = 217; id >= 202; id--)
{
short dlg = id;
if (use_pdc && id >= 213)
dlg -= 100;
const int pos = sm.id2pos(dlg);
if (pos >= 0)
{
TMask_field& f = sm.fld(pos);
const int size = f.size();
const TString& prompt = f.prompt();
sf.set_column_header(id, prompt);
sf.set_column_width(id, (2+max(size, prompt.len())) * CHARX);
}
else
sf.delete_column(id);
}
}
TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a")
{
create_fields(*this, LF_CDC, 2, 5, "CdC", F_CODCDC_1, "CdCDes", F_DESCDC_1);
create_fields(*this, LF_COMMESSE, 2, 11, "Cms", F_CODCMS_1, "CmsDes", F_DESCMS_1);
create_sheet();
}
///////////////////////////////////////////////////////////
// TRiparti_app
///////////////////////////////////////////////////////////
class TRiparti_app : public TRelation_application
{
TRelation* _rel;
TRiparti_msk* _msk;
const TString& somma_campi(TToken_string& row, int first) const;
void write_rows();
void spezza_campo(const TString& str, TToken_string& row, int first) const;
void read_rows();
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual TRelation* get_relation() const { return _rel; }
virtual TMask* get_mask(int) { return _msk; }
};
const TString& TRiparti_app::somma_campi(TToken_string& row, int first) const
{
TSheet_field& sheet = _msk->sfield(F_SHEET);
TMask& m = sheet.sheet_mask();
short id = 200 + first;
if (m.id2pos(id) < 0)
id -= 100;
TString& str = get_tmp_string(20);
for (int i = first; i < first+4; i++)
{
TString80 token = row.get(i);
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+1);
token.left_just(fld.size());
str << token;
}
return str;
}
void TRiparti_app::spezza_campo(const TString& str, TToken_string& row, int first) const
{
TSheet_field& sheet = _msk->sfield(F_SHEET);
TMask& m = sheet.sheet_mask();
short id = 200 + first;
if (m.id2pos(id) < 0)
id -= 100;
int start = 0;
for (int i = first; i < first+4; i++)
{
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+1);
const int len = fld.size();
const TString& token = str.mid(start, len);
row.add(token, i);
start += len;
}
}
void TRiparti_app::write_rows()
{
TRectype* key = new TRectype(LF_RRIP);
const char tipo = _msk->get(F_TIPO)[0];
key->put("TIPO", tipo);
key->put("CODICE", _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I));
TRecord_array a(LF_RRIP, "NRIGA");
a.set_key(key);
TSheet_field& sheet = _msk->sfield(F_SHEET);
FOR_EACH_SHEET_ROW(sheet, i, row)
{
TRectype& rec = a.row(i+1, true); // Crea una riga nuova
rec.put("RIPARTO", row->get(0));
rec.put("CODCOSTO", somma_campi(*row, 1));
rec.put("CODCMS", somma_campi(*row, 5));
rec.put("CODFASE", somma_campi(*row, 9));
rec.put("CODCONTO", somma_campi(*row,13));
}
a.rewrite();
}
void TRiparti_app::read_rows()
{
TRectype key (LF_RRIP);
const char tipo = _msk->get(F_TIPO)[0];
key.put("TIPO", tipo);
key.put("CODICE", _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I));
TRecord_array a(key, "NRIGA");
TSheet_field& sheet = _msk->sfield(F_SHEET);
sheet.destroy();
for (int i = 1; i <= a.rows(); i++)
{
const TRectype& rec = a.row(i);
TToken_string& row = sheet.row(i-1);
row = rec.get("RIPARTO");
spezza_campo(rec.get("CODCOSTO"), row, 1);
spezza_campo(rec.get("CODCMS"), row, 5);
spezza_campo(rec.get("CODFASE"), row, 9);
spezza_campo(rec.get("CODCONTO"), row,13);
}
}
int TRiparti_app::write(const TMask& m)
{
const int err = TRelation_application::write(m);
if (err == NOERR)
write_rows();
return err;
}
int TRiparti_app::rewrite(const TMask& m)
{
const int err = TRelation_application::rewrite(m);
if (err == NOERR)
write_rows();
return err;
}
bool TRiparti_app::user_create()
{
_rel = new TRelation(LF_RIP);
_msk = new TRiparti_msk;
return true;
}
bool TRiparti_app::user_destroy()
{
delete _rel;
delete _msk;
return true;
}
int ca0800(int argc, char* argv[])
{
TRiparti_app a;
a.run(argc, argv, TR("Tabella di ripartizione"));
return 0;
}

31
ca/ca0800a.h Executable file
View File

@ -0,0 +1,31 @@
#define F_TIPO 101
#define F_CODICE_I 102
#define F_CODICE_B 103
#define F_DESCRIZ_I 104
#define F_DESCRIZ_B 105
#define F_TIPORIP 106
#define F_GRUPPO 111
#define F_CONTO 112
#define F_SOTTOCONTO 113
#define F_DESCR 114
#define F_CODCDC_1 121
#define F_CODCDC_2 122
#define F_CODCDC_3 123
#define F_CODCDC_4 124
#define F_DESCDC_1 126
#define F_DESCDC_2 127
#define F_DESCDC_3 128
#define F_DESCDC_4 129
#define F_CODCMS_1 131
#define F_CODCMS_2 132
#define F_CODCMS_3 133
#define F_CODCMS_4 134
#define F_DESCMS_1 136
#define F_DESCMS_2 137
#define F_DESCMS_3 138
#define F_DESCMS_4 139
#define F_SHEET 151

362
ca/ca0800a.uml Executable file
View File

@ -0,0 +1,362 @@
#include "ca0800a.h"
TOOLBAR "" 0 -2 0 2
#include <toolbar.h>
ENDPAGE
PAGE "Ripartizioni" -1 -1 64 6
GROUPBOX DLG_NULL 78 4
BEGIN
PROMPT 1 0 ""
END
RADIOBUTTON F_TIPO 1 40
BEGIN
PROMPT 2 0 ""
FLAGS "Z"
ITEM "I|Interattiva"
MESSAGE SHOW,1@|HIDE,2@
ITEM "B|Batch"
MESSAGE SHOW,2@|HIDE,1@
FIELD TIPO
KEY 1
END
STRING F_CODICE_I 8
BEGIN
PROMPT 49 1 "Codice "
FLAGS "Z"
USE LF_RIP
INPUT TIPO "I"
INPUT CODICE F_CODICE_I
DISPLAY "Codice " CODICE
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" CONTO
DISPLAY "Descrizione@50" DESCRIZ
OUTPUT F_CODICE_I CODICE
OUTPUT F_DESCRIZ_I DESCRIZ
CHECKTYPE REQUIRED
FIELD CODICE
KEY 1
GROUP 1
END
STRING F_CODICE_B 8
BEGIN
PROMPT 49 1 "Codice "
COPY USE F_CODICE_I
INPUT TIPO "B"
INPUT CODICE F_CODICE_B
DISPLAY "Codice " CODICE
DISPLAY "Costo@20" CODCOSTO
DISPLAY "Commessa@20" CODCMS
DISPLAY "Descrizione@50" DESCRIZ
OUTPUT F_CODICE_B CODICE
OUTPUT F_DESCRIZ_B DESCRIZ
CHECKTYPE REQUIRED
FIELD CODICE
KEY 1
GROUP 2
END
STRING F_DESCRIZ_I 50
BEGIN
PROMPT 2 2 "Descrizione "
USE LF_RIP KEY 2
INPUT TIPO "I"
INPUT DESCRIZ F_DESCRIZ_I
DISPLAY "Descrizione@50" DESCRIZ
DISPLAY "Codice " CODICE
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" CONTO
COPY OUTPUT F_CODICE_I
FIELD DESCRIZ
KEY 2
GROUP 1
END
STRING F_DESCRIZ_B 50
BEGIN
PROMPT 2 2 "Descrizione "
COPY USE F_DESCRIZ_I
INPUT TIPO "B"
INPUT DESCRIZ F_DESCRIZ_B
DISPLAY "Descrizione@50" DESCRIZ
DISPLAY "Codice " CODICE
DISPLAY "Costo@20" CODCOSTO
DISPLAY "Commessa@20" CODCMS
COPY OUTPUT F_CODICE_B
FIELD DESCRIZ
KEY 2
GROUP 2
END
GROUPBOX DLG_NULL 78 4
BEGIN
PROMPT 1 4 "@bConto"
GROUP 1
END
NUMBER F_GRUPPO 3
BEGIN
PROMPT 2 5 "Conto "
USE LF_PCON
INPUT GRUPPO F_GRUPPO
INPUT CONTO F_CONTO
INPUT SOTTOCONTO F_SOTTOCONTO
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
DISPLAY "Descrizione@50" DESCR
OUTPUT F_GRUPPO GRUPPO
OUTPUT F_CONTO CONTO
OUTPUT F_SOTTOCONTO SOTTOCONTO
OUTPUT F_DESCR DESCR
CHECKTYPE REQUIRED
FIELD GRUPPO
GROUP 1
END
NUMBER F_CONTO 3
BEGIN
PROMPT 22 5 ""
COPY ALL F_GRUPPO
FIELD CONTO
CHECKTYPE NORMAL
GROUP 1
END
NUMBER F_SOTTOCONTO 6
BEGIN
PROMPT 30 5 ""
COPY ALL F_GRUPPO
FIELD SOTTOCONTO
CHECKTYPE NORMAL
GROUP 1
END
STRING F_DESCR 50
BEGIN
PROMPT 2 6 "Descrizione "
USE LF_PCON KEY 2
INPUT DESCR F_DESCR
DISPLAY "Descrizione@50" DESCR
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
COPY OUTPUT F_GRUPPO
CHECKTYPE REQUIRED
GROUP 1
END
GROUPBOX DLG_NULL 78 6
BEGIN
PROMPT 1 4 "@bCentro di costo"
GROUP 2
END
GROUPBOX DLG_NULL 78 6
BEGIN
PROMPT 1 10 "@bCommessa"
GROUP 2
END
ENDPAGE
PAGE "Righe" -1 -1 78 22
RADIOBUTTON F_TIPORIP 1 78
BEGIN
PROMPT 1 0 "Ripartizione"
FLAGS "Z"
ITEM "0|Percentuale"
ITEM "1|Perc. su costo"
ITEM "2|Parti"
FIELD TIPORIP
END
SPREADSHEET F_SHEET
BEGIN
PROMPT 0 3 ""
ITEM "Riparto@6"
ITEM "Cdc1"
ITEM "Cdc2"
ITEM "Cdc3"
ITEM "Cdc4"
ITEM "Cms1"
ITEM "Cms2"
ITEM "Cms3"
ITEM "Cms4"
ITEM "Fas1"
ITEM "Fas2"
ITEM "Fas3"
ITEM "Fas4"
ITEM "Con1"
ITEM "Con2"
ITEM "Con3"
ITEM "Con4"
END
ENDPAGE
ENDMASK
PAGE "Sheet" -1 -1 78 19
NUMBER 101 6 2
BEGIN
PROMPT 1 0 "% Ripartizione "
FLAGS "U"
END
NUMBER 201 6
BEGIN
PROMPT 1 0 "Numero parti "
FLAGS "U"
END
STRING 102 20
BEGIN
PROMPT 1 1 "Cdc1 "
USE LF_CDC
GROUP 1
END
STRING 103 20
BEGIN
PROMPT 1 2 "Cdc2 "
USE LF_CDC
GROUP 1
END
STRING 104 20
BEGIN
PROMPT 1 3 "Cdc3 "
USE LF_CDC
GROUP 1
END
STRING 105 20
BEGIN
PROMPT 1 4 "Cdc4 "
USE LF_CDC
GROUP 1
END
STRING 106 20
BEGIN
PROMPT 1 5 "Cms1 "
GROUP 1
END
STRING 107 20
BEGIN
PROMPT 1 6 "Cms2 "
GROUP 1
END
STRING 108 20
BEGIN
PROMPT 1 7 "Cms3 "
GROUP 1
END
STRING 109 20
BEGIN
PROMPT 1 8 "Cms4 "
GROUP 1
END
STRING 110 20
BEGIN
PROMPT 1 9 "Fas1 "
GROUP 1
END
STRING 111 10
BEGIN
PROMPT 1 10 "Fas2 "
GROUP 1
END
STRING 112 10
BEGIN
PROMPT 1 11 "Fas3 "
GROUP 1
END
STRING 113 10
BEGIN
PROMPT 1 12 "Fas4 "
GROUP 1
END
NUMBER 114 3
BEGIN
PROMPT 1 14 "Gruppo "
USE LF_PCON
INPUT GRUPPO 114
INPUT CONTO 115
INPUT SOTTOCONTO 116
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
DISPLAY "Descrizione@50" DESCR
OUTPUT 114 GRUPPO
OUTPUT 115 CONTO
OUTPUT 116 SOTTOCONTO
OUTPUT 117 DESCR
CHECKTYPE NORMAL
GROUP 6
END
NUMBER 115 3
BEGIN
PROMPT 27 14 "Conto "
COPY ALL 114
GROUP 6
END
NUMBER 116 6
BEGIN
PROMPT 46 14 "Sottoconto "
COPY ALL 114
GROUP 6
END
STRING 117 50
BEGIN
PROMPT 1 15 "Descrizione "
USE LF_PCON KEY 2
INPUT DESCR 117
DISPLAY "Descrizione@50" DESCR
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
COPY OUTPUT 114
CHECKTYPE NORMAL
GROUP 6
END
BUTTON DLG_OK 10 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_DELREC 10 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_CANCEL 10 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -75,7 +75,6 @@ class TAnal_app : public TRelation_application
TAnal_msk* _msk;
protected:
virtual bool changing_mask(int) { return false; }
virtual TMask* get_mask(int) { return _msk; }
virtual TRelation* get_relation() const { return _rel; }
virtual bool user_create();

View File

@ -1,3 +1,3 @@
149
0
$rip|0|0|122|0|Archivio tabelle di ripartizione analitica|||
$rip|0|0|113|0|Archivio tabelle di ripartizione analitica|||

View File

@ -1,18 +1,14 @@
149
13
TIPO|1|1|0|Tipo Ripartizione (<I>nterattiva, <B>atch)
CODICE|1|8|0|Codice Legame
GRUPPO|2|3|0|Gruppo
CONTO|2|3|0|Conto
SOTTOCONTO|3|6|0|Sottoconto
CODCOSTO|1|20|0|Codice centro di costo
CODCMS|1|20|0|Codice commessa
DESCRIZ|1|50|0|Descrizione
PERC|8|1|0|Ripartizione in percentuale
SUCOSTO|8|1|0|Ripartizione in percentuale su costo
PARTI|8|1|0|Ripartizione in parti uguali
TIPORIP|1|3|0|Riporto su < > Nulla, <CDC>Centro di costo, <CMS>Commessa
CODRIP|1|4|0|Codice parametro di ripartizione centri di costo
9
TIPO|1|1|0|
CODICE|1|8|0|
GRUPPO|2|3|0|
CONTO|2|3|0|
SOTTOCONTO|3|6|0|
CODCOSTO|1|20|0|
CODCMS|1|20|0|
DESCRIZ|1|50|0|
TIPORIP|1|1|0|
5
TIPO+CODICE|
TIPO+DESCRIZ|X