Patch level : 2.2 nopatch
Files correlati : ca0.exe Ricompilazione Demo : [ ] Commento : Terminata prima versione inserimento tabelle di riclassificazione git-svn-id: svn://10.65.10.50/trunk@12599 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
d59a5ee6ed
commit
0a5d7b7b05
@ -13,7 +13,7 @@ int main(int argc, char** argv)
|
||||
case 4: ca0500(argc,argv); break; //gestione centri di costo
|
||||
case 5: ca0600(argc,argv); break; //gestione commesse
|
||||
case 6: ca0700(argc,argv); break; //gestione fasi
|
||||
// case 7: ca0800(argc,argv); break; // ribaltamenti
|
||||
case 7: ca0800(argc,argv); break; // ribaltamenti
|
||||
default: ca0100(argc,argv); break; // gestione tabelle
|
||||
}
|
||||
exit(0);
|
||||
|
2
ca/ca0.h
2
ca/ca0.h
@ -8,6 +8,6 @@ int ca0400(int argc, char* argv[]);
|
||||
int ca0500(int argc, char* argv[]);
|
||||
int ca0600(int argc, char* argv[]);
|
||||
int ca0700(int argc, char* argv[]);
|
||||
//int ca0800(int argc, char* argv[]);
|
||||
int ca0800(int argc, char* argv[]);
|
||||
|
||||
#endif // __CA0_H
|
||||
|
@ -223,7 +223,7 @@ END
|
||||
|
||||
TEXT -1
|
||||
BEGIN
|
||||
PROMPT 17 2 "Descrizione"
|
||||
PROMPT 21 2 "Descrizione"
|
||||
END
|
||||
|
||||
STRING F_FASE_1 10
|
||||
@ -236,7 +236,7 @@ END
|
||||
|
||||
STRING F_DESFASE_1 50
|
||||
BEGIN
|
||||
PROMPT 17 3 ""
|
||||
PROMPT 21 3 ""
|
||||
FIELD FscDes(1)
|
||||
END
|
||||
|
||||
@ -251,7 +251,7 @@ END
|
||||
|
||||
STRING F_DESFASE_2 50
|
||||
BEGIN
|
||||
PROMPT 17 4 ""
|
||||
PROMPT 21 4 ""
|
||||
FIELD FscDes(2)
|
||||
END
|
||||
|
||||
@ -266,7 +266,7 @@ END
|
||||
|
||||
STRING F_DESFASE_3 50
|
||||
BEGIN
|
||||
PROMPT 17 5 ""
|
||||
PROMPT 21 5 ""
|
||||
FIELD FscDes(3)
|
||||
END
|
||||
|
||||
@ -280,7 +280,7 @@ END
|
||||
|
||||
STRING F_DESFASE_4 50
|
||||
BEGIN
|
||||
PROMPT 17 6 ""
|
||||
PROMPT 21 6 ""
|
||||
FIELD FscDes(4)
|
||||
END
|
||||
|
||||
|
@ -9,8 +9,6 @@ class TPiano_conti_anal_msk : public TSimple_anal_msk
|
||||
{
|
||||
protected:
|
||||
virtual int get_logicnum() const { return LF_PCONANA; }
|
||||
virtual const char* get_key_var() const { return "Pdci"; }
|
||||
virtual const char* get_des_var() const { return "PdciDes"; }
|
||||
|
||||
public:
|
||||
TPiano_conti_anal_msk() { read("ca0400a"); }
|
||||
@ -23,7 +21,7 @@ public:
|
||||
class TAnalisi_app : public TAnal_app
|
||||
{
|
||||
protected:
|
||||
virtual TAnal_msk* create_mask() const { return new TPiano_conti_anal_msk; }
|
||||
virtual TSimple_anal_msk* create_mask() const { return new TPiano_conti_anal_msk; }
|
||||
|
||||
virtual bool create();
|
||||
};
|
||||
|
@ -12,8 +12,6 @@ class TCdc_anal_msk : public TSimple_anal_msk
|
||||
{
|
||||
protected:
|
||||
virtual int get_logicnum() const { return LF_CDC; }
|
||||
virtual const char* get_key_var() const { return "CdC"; }
|
||||
virtual const char* get_des_var() const { return "CdCDes"; }
|
||||
|
||||
public:
|
||||
TCdc_anal_msk() { read("ca0500a"); }
|
||||
@ -26,7 +24,7 @@ public:
|
||||
class TCdC_app : public TAnal_app
|
||||
{
|
||||
protected:
|
||||
virtual TAnal_msk* create_mask() const { return new TCdc_anal_msk; }
|
||||
virtual TSimple_anal_msk* create_mask() const { return new TCdc_anal_msk; }
|
||||
};
|
||||
|
||||
int ca0500(int argc, char* argv[])
|
||||
|
@ -12,8 +12,6 @@ class TCms_anal_msk : public TSimple_anal_msk
|
||||
{
|
||||
protected:
|
||||
virtual int get_logicnum() const { return LF_COMMESSE; }
|
||||
virtual const char* get_key_var() const { return "Cms"; }
|
||||
virtual const char* get_des_var() const { return "CmsDes"; }
|
||||
|
||||
public:
|
||||
TCms_anal_msk() { read("ca0600a"); }
|
||||
@ -26,7 +24,7 @@ public:
|
||||
class TCms_app : public TAnal_app
|
||||
{
|
||||
protected:
|
||||
virtual TAnal_msk* create_mask() const { return new TCms_anal_msk; }
|
||||
virtual TSimple_anal_msk* create_mask() const { return new TCms_anal_msk; }
|
||||
};
|
||||
|
||||
int ca0600(int argc, char* argv[])
|
||||
|
@ -13,48 +13,48 @@ END
|
||||
|
||||
MEMO F_CMS_DESCRAGG 78 5
|
||||
BEGIN
|
||||
PROMPT 2 8 "Descrizione aggiuntiva"
|
||||
PROMPT 2 6 "Descrizione aggiuntiva"
|
||||
FIELD DESCRAGG
|
||||
END
|
||||
|
||||
STRING F_CMS_ANNO 4
|
||||
BEGIN
|
||||
PROMPT 2 14 "Anno "
|
||||
PROMPT 2 12 "Anno "
|
||||
FIELD ANNO
|
||||
END
|
||||
|
||||
BOOLEAN F_CMS_LOCDIV
|
||||
BEGIN
|
||||
PROMPT 2 15 "Commessa in località diversa"
|
||||
PROMPT 2 13 "Commessa in località diversa"
|
||||
FIELD LOCDIV
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 7
|
||||
BEGIN
|
||||
PROMPT 1 16 "@bLocazione"
|
||||
PROMPT 1 14 "@bLocazione"
|
||||
END
|
||||
|
||||
STRING F_CMS_INDIR 35
|
||||
BEGIN
|
||||
PROMPT 2 17 "Indirizzo "
|
||||
PROMPT 2 15 "Indirizzo "
|
||||
FIELD INDIR
|
||||
END
|
||||
|
||||
STRING F_CMS_CIV 10
|
||||
BEGIN
|
||||
PROMPT 50 17 "N. "
|
||||
PROMPT 50 15 "N. "
|
||||
FIELD CIV
|
||||
END
|
||||
|
||||
STRING F_CMS_LOC 35
|
||||
BEGIN
|
||||
PROMPT 2 18 "Localita' "
|
||||
PROMPT 2 16 "Localita' "
|
||||
FIELD LOC
|
||||
END
|
||||
|
||||
STRING F_CMS_STATO 3
|
||||
BEGIN
|
||||
PROMPT 2 19 "Stato "
|
||||
PROMPT 2 17 "Stato "
|
||||
FIELD STATO
|
||||
FLAGS "Z"
|
||||
USE %STA
|
||||
@ -69,7 +69,7 @@ END
|
||||
|
||||
STRING F_CMS_DESTATO 50
|
||||
BEGIN
|
||||
PROMPT 20 19 ""
|
||||
PROMPT 20 17 ""
|
||||
USE %STA KEY 2
|
||||
INPUT S0 F_CMS_DESTATO
|
||||
DISPLAY "Stato@50" S0
|
||||
@ -79,7 +79,7 @@ END
|
||||
|
||||
STRING F_CMS_COM 4
|
||||
BEGIN
|
||||
PROMPT 2 20 "Comune "
|
||||
PROMPT 2 18 "Comune "
|
||||
FIELD COM
|
||||
FLAGS "U"
|
||||
USE LF_COMUNI
|
||||
@ -100,19 +100,19 @@ END
|
||||
|
||||
STRING F_CMS_PROV 2
|
||||
BEGIN
|
||||
PROMPT 21 20 "Provincia "
|
||||
PROMPT 21 18 "Provincia "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_CMS_CAP 5
|
||||
BEGIN
|
||||
PROMPT 38 20 "CAP "
|
||||
PROMPT 38 18 "CAP "
|
||||
FIELD CAP
|
||||
END
|
||||
|
||||
STRING F_CMS_DEN 50
|
||||
BEGIN
|
||||
PROMPT 2 21 " "
|
||||
PROMPT 2 19 " "
|
||||
USE LF_COMUNI KEY 2
|
||||
INPUT DENCOM F_CMS_DEN
|
||||
DISPLAY "Denominazione@50" DENCOM
|
||||
|
@ -12,8 +12,6 @@ class TFsc_anal_msk : public TSimple_anal_msk
|
||||
{
|
||||
protected:
|
||||
virtual int get_logicnum() const { return LF_FASI; }
|
||||
virtual const char* get_key_var() const { return "Fsc"; }
|
||||
virtual const char* get_des_var() const { return "FscDes"; }
|
||||
|
||||
public:
|
||||
TFsc_anal_msk() { read("ca0700a"); }
|
||||
@ -26,7 +24,7 @@ public:
|
||||
class TFsc_app : public TAnal_app
|
||||
{
|
||||
protected:
|
||||
virtual TAnal_msk* create_mask() const { return new TFsc_anal_msk; }
|
||||
virtual TSimple_anal_msk* create_mask() const { return new TFsc_anal_msk; }
|
||||
};
|
||||
|
||||
int ca0700(int argc, char* argv[])
|
||||
|
262
ca/ca0800.cpp
262
ca/ca0800.cpp
@ -3,32 +3,37 @@
|
||||
#include <relapp.h>
|
||||
|
||||
#include "ca0800a.h"
|
||||
#include "calib01.h"
|
||||
|
||||
const char* get_key_fieldname(int logic, int k)
|
||||
void append_select_clause(ostream& out, int level, int logic)
|
||||
{
|
||||
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 (logic == LF_PCON)
|
||||
{
|
||||
if (level > 1) str << "&&";
|
||||
str << "(NUM(LEN(" << key.name() << "))<=" << key.to() << ')'; // SE LEN(CODCONTO)<=7
|
||||
switch (level)
|
||||
{
|
||||
case 0: str = "CONTO==\"\""; break;
|
||||
case 1: str = "SOTTOCONTO==\"\""; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
str << ')';
|
||||
out << str << endl;
|
||||
else
|
||||
{
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(logic);
|
||||
const TFieldref& key = mci.fieldref(level);
|
||||
|
||||
str << "STR(";
|
||||
if (level > 1)
|
||||
str << "(NUM(LEN(" << key.name() << "))>" << key.from() << ')'; // SE LEN(CODCONTO)>=4
|
||||
if (level < mci.levels())
|
||||
{
|
||||
if (level > 1) str << "&&";
|
||||
str << "(NUM(LEN(" << key.name() << "))<=" << key.to() << ')'; // SE LEN(CODCONTO)<=7
|
||||
}
|
||||
str << ')';
|
||||
}
|
||||
if (str.not_empty())
|
||||
out << " SE " << str << endl;
|
||||
}
|
||||
|
||||
void append_run_clause(ostream& out, int logicnum)
|
||||
@ -39,37 +44,35 @@ void append_run_clause(ostream& out, int logicnum)
|
||||
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)
|
||||
void create_browse1(TEdit_field& kfld, int level, int logic, short key_id, short des_id)
|
||||
{
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(logic);
|
||||
|
||||
TFilename tmp; tmp.temp();
|
||||
ofstream out(tmp);
|
||||
|
||||
out << "US " << logic << endl;
|
||||
append_select_clause(out, level, key1);
|
||||
append_select_clause(out, level, logic);
|
||||
append_run_clause(out, logic);
|
||||
|
||||
for (int i = 1; i <= level; i++)
|
||||
for (int i = 0; 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 TString& picture = mci.picture(i);
|
||||
const TString& prompt = mci.prompt(i);
|
||||
const TFieldref& field = mci.fieldref(i);
|
||||
const int length = field.to() - field.from();
|
||||
out << "IN " << field << ' ' << (key_id+i-1) << endl;
|
||||
out << "IN " << field << ' ' << (key_id+i) << 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;
|
||||
out << "OU " << (key_id+i) << ' ' << field << endl;
|
||||
}
|
||||
const TFieldref& field = (const TFieldref&)key2[0];
|
||||
out << "DI \"Descrizione@50\" " << field << endl;
|
||||
out << "OU " << (des_id+level-1) << ' ' << field << endl;
|
||||
const TFieldref& field = mci.fieldref(0, 2);
|
||||
out << "DI \"" << TR("Descrizione") << "@50\" " << field << endl;
|
||||
out << "OU " << (des_id+level) << ' ' << field << endl;
|
||||
out << "CH RE" << endl;
|
||||
//out << "FI " << mci.fieldref(level) << endl;
|
||||
out << "EN" << endl;
|
||||
out.close();
|
||||
|
||||
@ -80,38 +83,34 @@ void create_browse1(TEdit_field& kfld, int level, TConfig& cfg,
|
||||
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)
|
||||
void create_browse2(TEdit_field& kfld, int level, int logic, short key_id, short des_id)
|
||||
{
|
||||
const TFieldref& field = (const TFieldref&)key2[0];
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(logic);
|
||||
|
||||
const TFieldref& field = mci.fieldref(0, 2);
|
||||
TString str2; str2 << field;
|
||||
|
||||
TFilename tmp; tmp.temp();
|
||||
ofstream out(tmp);
|
||||
out << "US " << logic << " KE 2";
|
||||
append_select_clause(out, level, key1);
|
||||
out << "US " << logic << " KE 2" << endl;
|
||||
append_select_clause(out, level, logic);
|
||||
append_run_clause(out, logic);
|
||||
|
||||
out << "DI \"Descrizione@50\" " << str2 << endl;
|
||||
out << "IN " << str2 << ' ' << kfld.dlg() << endl;
|
||||
out << "DI \"" << TR("Descrizione") << "@50\" " << str2 << endl;
|
||||
out << "OU " << kfld.dlg() << ' ' << str2 << endl;
|
||||
|
||||
int from = 1, to = 1;
|
||||
for (int i = 1; i <= level; i++)
|
||||
for (int i = 0; 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 TString& picture = mci.picture(i);
|
||||
const TString& prompt = mci.prompt(i);
|
||||
const TFieldref& field = mci.fieldref(i);
|
||||
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 << "OU " << (key_id+i) << ' ' << field << endl;
|
||||
}
|
||||
out << "CH NO" << endl;
|
||||
out << "EN" << endl;
|
||||
@ -126,58 +125,49 @@ void create_browse2(TEdit_field& kfld, int level, TConfig& cfg,
|
||||
|
||||
|
||||
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)
|
||||
short key_id, short des_id)
|
||||
{
|
||||
TConfig cfg(CONFIG_DITTA, "ca");
|
||||
|
||||
TArray key1, key2;
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(logicnum);
|
||||
|
||||
int maxkeylen = 0, maxdeslen = 0;
|
||||
int level;
|
||||
int from = 1, to = 1;
|
||||
for (level = 1; ; level++)
|
||||
for (int level = 0; level < mci.levels(); level++)
|
||||
{
|
||||
const TString& prompt = cfg.get(des_var, NULL, level);
|
||||
if (prompt.blank())
|
||||
break;
|
||||
const TString& picture = cfg.get(key_var, NULL, level);
|
||||
const TString& prompt = mci.prompt(level);
|
||||
const TString& picture = mci.picture(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++)
|
||||
for (int i = 0; i < mci.levels(); i++)
|
||||
{
|
||||
const short kid = key_id+i-1;
|
||||
const short kid = key_id+i;
|
||||
|
||||
const TString& picture = cfg.get(key_var, NULL, i);
|
||||
TString80 prompt = cfg.get(des_var, NULL, i);
|
||||
const TString& picture = mci.picture(i);
|
||||
TString80 prompt = mci.prompt(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);
|
||||
const char* flags = picture[0] == '0' ? "BUZ" : "BU";
|
||||
TEdit_field* kfld = NULL;
|
||||
if (picture.find('A') < 0) // Numeric
|
||||
kfld = &msk.add_number(kid, 0, prompt, tab0, y+i, picture.len(), flags);
|
||||
else
|
||||
kfld = &msk.add_string(kid, 0, prompt, tab0, y+i, picture.len(), flags);
|
||||
create_browse1(*kfld, i, logicnum, key_id, des_id);
|
||||
kfld->set_group(2);
|
||||
|
||||
const short did = des_id+i;
|
||||
TEdit_field& dfld = msk.add_string(did, 0, "", tab1, y+i, 50, "B", 72+tab0-tab1);
|
||||
create_browse2(dfld, i, logicnum, key_id, des_id);
|
||||
dfld.set_group(2);
|
||||
}
|
||||
|
||||
return level;
|
||||
return mci.levels();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -204,8 +194,11 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
|
||||
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(101, t < 2); // Percentuale
|
||||
sm.show(201, t == 2); // Parti
|
||||
sm.enable(101, t != 1);
|
||||
sf.enable_column(0, t != 1);
|
||||
sf.force_update();
|
||||
}
|
||||
if (e == fe_close && atoi(o.get()) == 0)
|
||||
{
|
||||
@ -218,7 +211,47 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
|
||||
return error_box(TR("Il totale delle percentuali di riparto deve essere 100"));
|
||||
}
|
||||
break;
|
||||
case F_SHEET:
|
||||
if (e == fe_init)
|
||||
{
|
||||
TSheet_field& sf = sfield(F_SHEET);
|
||||
TMask& sm = sf.sheet_mask();
|
||||
const bool on = get(F_TIPO)[0] != 'C';
|
||||
for (short id = 202; id < 214; id++)
|
||||
{
|
||||
if (sm.id2pos(id) > 0)
|
||||
{
|
||||
sf.enable_column(id, on);
|
||||
sm.enable(id, on);
|
||||
}
|
||||
if (sm.id2pos(id+50) > 0)
|
||||
sm.enable(id+50, on);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (e == fe_modify || e == fe_close)
|
||||
{
|
||||
const short id = o.dlg();
|
||||
int level = -1;
|
||||
if (id >= 202 && id <= 217)
|
||||
{
|
||||
level = (o.dlg()-202) % 4;
|
||||
} else
|
||||
if (id >= F_CODCDC_1 && id <= F_CODCDC_4)
|
||||
{
|
||||
level = id-F_CODCDC_1;
|
||||
} else
|
||||
if (id >= F_CODCMS_1 && id <= F_CODCMS_4)
|
||||
{
|
||||
level = id-F_CODCMS_1;
|
||||
}
|
||||
if (level >= 0)
|
||||
{
|
||||
TEdit_field& fld = (TEdit_field&)o;
|
||||
return test_multilevel_field(fld, level);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
@ -234,38 +267,34 @@ void TRiparti_msk::create_sheet()
|
||||
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);
|
||||
}
|
||||
create_fields(sm, LF_CDC, 1, 1, 202, 252);
|
||||
create_fields(sm, LF_COMMESSE, 1, 5, 206, 256);
|
||||
create_fields(sm, LF_FASI, 1, 9, 210, 260);
|
||||
create_fields(sm, use_pdc ? LF_PCON : LF_PCONANA, 1, 13, 214, 264);
|
||||
|
||||
for (short id = 217; id >= 202; id--)
|
||||
{
|
||||
short dlg = id;
|
||||
if (use_pdc && id >= 213)
|
||||
dlg -= 100;
|
||||
const int pos = sm.id2pos(dlg);
|
||||
const int pos = sm.id2pos(id);
|
||||
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);
|
||||
sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD));
|
||||
sf.set_column_width(id, (max(3+size, prompt.len()+1)) * 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_fields(*this, LF_CDC, 2, 5, F_CODCDC_1, F_DESCDC_1);
|
||||
create_fields(*this, LF_COMMESSE, 2, 11, F_CODCMS_1, F_DESCMS_1);
|
||||
create_sheet();
|
||||
}
|
||||
|
||||
@ -290,6 +319,7 @@ protected:
|
||||
virtual bool user_destroy();
|
||||
virtual int write(const TMask& m);
|
||||
virtual int rewrite(const TMask& m);
|
||||
virtual int read(TMask& m);
|
||||
|
||||
virtual TRelation* get_relation() const { return _rel; }
|
||||
virtual TMask* get_mask(int) { return _msk; }
|
||||
@ -300,17 +330,15 @@ 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;
|
||||
const short id = 201 + first;
|
||||
|
||||
TString& str = get_tmp_string(20);
|
||||
for (int i = first; i < first+4; i++)
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
TString80 token = row.get(i);
|
||||
TString80 token = row.get(first+i);
|
||||
if (m.id2pos(id+i) < 0)
|
||||
break;
|
||||
const TEdit_field& fld = m.efield(id+1);
|
||||
const TEdit_field& fld = m.efield(id+i);
|
||||
token.left_just(fld.size());
|
||||
str << token;
|
||||
}
|
||||
@ -321,20 +349,18 @@ void TRiparti_app::spezza_campo(const TString& str, TToken_string& row, int firs
|
||||
{
|
||||
TSheet_field& sheet = _msk->sfield(F_SHEET);
|
||||
TMask& m = sheet.sheet_mask();
|
||||
|
||||
short id = 200 + first;
|
||||
if (m.id2pos(id) < 0)
|
||||
id -= 100;
|
||||
TString80 token;
|
||||
|
||||
const short id = 201 + first;
|
||||
int start = 0;
|
||||
for (int i = first; i < first+4; i++)
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if (m.id2pos(id+i) < 0)
|
||||
break;
|
||||
const TEdit_field& fld = m.efield(id+1);
|
||||
const TEdit_field& fld = m.efield(id+i);
|
||||
const int len = fld.size();
|
||||
const TString& token = str.mid(start, len);
|
||||
row.add(token, i);
|
||||
token = str.mid(start, len); token.trim();
|
||||
row.add(token, first+i);
|
||||
start += len;
|
||||
}
|
||||
}
|
||||
@ -402,6 +428,14 @@ int TRiparti_app::rewrite(const TMask& m)
|
||||
return err;
|
||||
}
|
||||
|
||||
int TRiparti_app::read(TMask& m)
|
||||
{
|
||||
const int err = TRelation_application::read(m);
|
||||
if (err == NOERR)
|
||||
read_rows();
|
||||
return err;
|
||||
}
|
||||
|
||||
bool TRiparti_app::user_create()
|
||||
{
|
||||
_rel = new TRelation(LF_RIP);
|
||||
|
@ -11,12 +11,14 @@ BEGIN
|
||||
PROMPT 1 0 ""
|
||||
END
|
||||
|
||||
RADIOBUTTON F_TIPO 1 40
|
||||
RADIOBUTTON F_TIPO 1 76
|
||||
BEGIN
|
||||
PROMPT 2 0 ""
|
||||
FLAGS "Z"
|
||||
ITEM "I|Interattiva"
|
||||
MESSAGE SHOW,1@|HIDE,2@
|
||||
ITEM "C|Conversione"
|
||||
MESSAGE SHOW,1@|HIDE,2@
|
||||
ITEM "B|Batch"
|
||||
MESSAGE SHOW,2@|HIDE,1@
|
||||
FIELD TIPO
|
||||
@ -25,10 +27,10 @@ END
|
||||
|
||||
STRING F_CODICE_I 8
|
||||
BEGIN
|
||||
PROMPT 49 1 "Codice "
|
||||
PROMPT 2 2 "Codice "
|
||||
FLAGS "Z"
|
||||
USE LF_RIP
|
||||
INPUT TIPO "I"
|
||||
INPUT TIPO F_TIPO SELECT
|
||||
INPUT CODICE F_CODICE_I
|
||||
DISPLAY "Codice " CODICE
|
||||
DISPLAY "Gruppo" GRUPPO
|
||||
@ -45,7 +47,7 @@ END
|
||||
|
||||
STRING F_CODICE_B 8
|
||||
BEGIN
|
||||
PROMPT 49 1 "Codice "
|
||||
PROMPT 2 2 "Codice "
|
||||
COPY USE F_CODICE_I
|
||||
INPUT TIPO "B"
|
||||
INPUT CODICE F_CODICE_B
|
||||
@ -63,7 +65,7 @@ END
|
||||
|
||||
STRING F_DESCRIZ_I 50
|
||||
BEGIN
|
||||
PROMPT 2 2 "Descrizione "
|
||||
PROMPT 24 2 ""
|
||||
USE LF_RIP KEY 2
|
||||
INPUT TIPO "I"
|
||||
INPUT DESCRIZ F_DESCRIZ_I
|
||||
@ -80,7 +82,7 @@ END
|
||||
|
||||
STRING F_DESCRIZ_B 50
|
||||
BEGIN
|
||||
PROMPT 2 2 "Descrizione "
|
||||
PROMPT 24 2 ""
|
||||
COPY USE F_DESCRIZ_I
|
||||
INPUT TIPO "B"
|
||||
INPUT DESCRIZ F_DESCRIZ_B
|
||||
@ -94,7 +96,6 @@ BEGIN
|
||||
GROUP 2
|
||||
END
|
||||
|
||||
|
||||
GROUPBOX DLG_NULL 78 4
|
||||
BEGIN
|
||||
PROMPT 1 4 "@bConto"
|
||||
@ -182,7 +183,7 @@ END
|
||||
SPREADSHEET F_SHEET
|
||||
BEGIN
|
||||
PROMPT 0 3 ""
|
||||
ITEM "Riparto@6"
|
||||
ITEM "Ripartiz.@9F"
|
||||
ITEM "Cdc1"
|
||||
ITEM "Cdc2"
|
||||
ITEM "Cdc3"
|
||||
@ -250,96 +251,85 @@ END
|
||||
STRING 106 20
|
||||
BEGIN
|
||||
PROMPT 1 5 "Cms1 "
|
||||
USE LF_COMMESSE
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 107 20
|
||||
BEGIN
|
||||
PROMPT 1 6 "Cms2 "
|
||||
USE LF_COMMESSE
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 108 20
|
||||
BEGIN
|
||||
PROMPT 1 7 "Cms3 "
|
||||
USE LF_COMMESSE
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 109 20
|
||||
BEGIN
|
||||
PROMPT 1 8 "Cms4 "
|
||||
USE LF_COMMESSE
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 110 20
|
||||
BEGIN
|
||||
PROMPT 1 9 "Fas1 "
|
||||
USE LF_FASI
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 111 10
|
||||
BEGIN
|
||||
PROMPT 1 10 "Fas2 "
|
||||
COPY ALL 110
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 112 10
|
||||
BEGIN
|
||||
PROMPT 1 11 "Fas3 "
|
||||
COPY ALL 110
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 113 10
|
||||
BEGIN
|
||||
PROMPT 1 12 "Fas4 "
|
||||
COPY ALL 110
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
NUMBER 114 3
|
||||
STRING 114 20
|
||||
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
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
NUMBER 115 3
|
||||
STRING 115 20
|
||||
BEGIN
|
||||
PROMPT 27 14 "Conto "
|
||||
COPY ALL 114
|
||||
GROUP 6
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
NUMBER 116 6
|
||||
STRING 116 20
|
||||
BEGIN
|
||||
PROMPT 46 14 "Sottoconto "
|
||||
COPY ALL 114
|
||||
GROUP 6
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 117 50
|
||||
STRING 117 20
|
||||
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
|
||||
PROMPT 1 15 "Sottoconticino "
|
||||
COPY ALL 114
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
|
586
ca/calib01.cpp
586
ca/calib01.cpp
@ -1,8 +1,163 @@
|
||||
#include "calib01.h"
|
||||
#include "calibmsk.h"
|
||||
|
||||
#include <tabutil.h>
|
||||
#include <tree.h>
|
||||
#include <pconti.h>
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TMultilevel_code_info
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
int TMultilevel_code_info::levels() const
|
||||
{
|
||||
return _picture.items();
|
||||
}
|
||||
|
||||
const TString& TMultilevel_code_info::picture(int level) const
|
||||
{
|
||||
return _picture.row(level);
|
||||
}
|
||||
|
||||
int TMultilevel_code_info::len(int level) const
|
||||
{
|
||||
return picture(level).len();
|
||||
}
|
||||
|
||||
const TString& TMultilevel_code_info::prompt(int level) const
|
||||
{
|
||||
return _prompt.row(level);
|
||||
}
|
||||
|
||||
const TFieldref& TMultilevel_code_info::fieldref(int level, int key) const
|
||||
{
|
||||
const TArray& a = key == 1 ? _key1_fields : _key2_fields;
|
||||
const TFieldref& fr = (const TFieldref&)a[level];
|
||||
return fr;
|
||||
}
|
||||
|
||||
const char* TMultilevel_code_info::get_key_fieldname(int k) const
|
||||
{
|
||||
const RecDes& rd = prefix().get_recdes(_logicnum);
|
||||
CHECKD(k > 0 && k <= rd.NKeys, "Invalid key ", k);
|
||||
const KeyDes& ky = rd.Ky[k-1];
|
||||
const int idx = (_logicnum == LF_TAB || _logicnum == LF_TABCOM) ? 1 : 0;
|
||||
const int pos = ky.FieldSeq[idx] % MaxFields;
|
||||
return rd.Fd[pos].Name;
|
||||
}
|
||||
|
||||
bool TMultilevel_code_info::get_cfg_vars(TString& key, TString& des) const
|
||||
{
|
||||
switch (_logicnum)
|
||||
{
|
||||
case LF_PCONANA: key = "Pdci"; des = "PdciDes"; break;
|
||||
case LF_CDC : key = "CdC"; des = "CdCDes"; break;
|
||||
case LF_COMMESSE:key = "Cms"; des = "CmsDes"; break;
|
||||
case LF_FASI : key = "Fsc"; des = "FscDes"; break;
|
||||
default: break;
|
||||
}
|
||||
return key.not_empty();
|
||||
}
|
||||
|
||||
void TMultilevel_code_info::add_fieldref(int k, int from, int to)
|
||||
{
|
||||
TArray& a = k == 1 ? _key1_fields : _key2_fields;
|
||||
TString80 str = get_key_fieldname(k);
|
||||
if (from > 0)
|
||||
str << '[' << from << ',' << to << ']';
|
||||
|
||||
TFieldref* fr = new TFieldref(str, _logicnum);
|
||||
a.add(fr);
|
||||
}
|
||||
|
||||
TMultilevel_code_info::TMultilevel_code_info(int logicnum) : _logicnum(logicnum)
|
||||
{
|
||||
if (logicnum == LF_PCON)
|
||||
{
|
||||
_key1_fields.add(new TFieldref(PCN_GRUPPO, LF_PCON));
|
||||
_picture.add("999");
|
||||
_prompt.add("Gruppo");
|
||||
|
||||
_key1_fields.add(new TFieldref(PCN_CONTO, LF_PCON));
|
||||
_picture.add("999");
|
||||
_prompt.add("Conto");
|
||||
|
||||
_key1_fields.add(new TFieldref(PCN_SOTTOCONTO, LF_PCON));
|
||||
_picture.add("999999");
|
||||
_prompt.add("Sottoconto");
|
||||
|
||||
_key2_fields.add(new TFieldref(PCN_DESCR, LF_PCON));
|
||||
}
|
||||
else
|
||||
{
|
||||
TConfig cfg(CONFIG_DITTA);
|
||||
|
||||
TString16 keyvar, desvar;
|
||||
get_cfg_vars(keyvar, desvar);
|
||||
|
||||
int from = 1, to = 1;
|
||||
for (int level = 1; ; level++)
|
||||
{
|
||||
const TString& prompt = cfg.get(desvar, NULL, level);
|
||||
if (prompt.blank())
|
||||
break;
|
||||
_prompt.add(prompt);
|
||||
|
||||
const TString& picture = cfg.get(keyvar, NULL, level);
|
||||
_picture.add(picture);
|
||||
|
||||
const int keylen = picture.len();
|
||||
to = from+keylen-1;
|
||||
add_fieldref(1, from, to);
|
||||
from = to+1;
|
||||
}
|
||||
add_fieldref(2, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
const TMultilevel_code_info& multilevel_code_info(int logicnum)
|
||||
{
|
||||
static TArray* cache = NULL;
|
||||
if (cache == NULL)
|
||||
cache = new TArray;
|
||||
TMultilevel_code_info* info = (TMultilevel_code_info*)cache->objptr(logicnum);
|
||||
if (info == NULL)
|
||||
{
|
||||
info = new TMultilevel_code_info(logicnum);
|
||||
cache->add(info, logicnum);
|
||||
}
|
||||
return *info;
|
||||
}
|
||||
|
||||
bool test_multilevel_field(TEdit_field& fld, int level)
|
||||
{
|
||||
const int logic = fld.browse()->cursor()->curr().num();
|
||||
const TMultilevel_code_info& info = multilevel_code_info(logic);
|
||||
const TString& pic = info.picture(level);
|
||||
const TString& val = fld.get();
|
||||
|
||||
bool ok = val.len() <= pic.len();
|
||||
for (int i = 0; val[i] && ok; i++)
|
||||
{
|
||||
const char v = val[i];
|
||||
const char p = pic[i];
|
||||
switch (p)
|
||||
{
|
||||
case 'A': ok = (v >= '0' && v <= '9') || (v >= 'A' && v <= 'Z'); break;
|
||||
case '0':
|
||||
case '9': ok = v >= '0' && v <= '9'; break;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
if (!ok)
|
||||
{
|
||||
TString msg;
|
||||
msg << TR("Il codice non rispetta il formato impostato nella configurazione")
|
||||
<< '\n' << val << " <> " << pic;
|
||||
return fld.error_box(msg);
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_tree
|
||||
@ -32,9 +187,6 @@ void TAnal_tree_pos::reset()
|
||||
class TAnal_tree : public TBidirectional_tree
|
||||
{
|
||||
TLocalisamfile* _file;
|
||||
const TArray& _key1_fields;
|
||||
const TArray& _key2_fields;
|
||||
|
||||
TAnal_tree_pos _curr;
|
||||
|
||||
protected:
|
||||
@ -50,7 +202,6 @@ protected:
|
||||
|
||||
protected:
|
||||
void update_curr();
|
||||
const char* get_key_field(int key = 1) const;
|
||||
int level_of(const TToken_string& key) const;
|
||||
int level_of_file() const;
|
||||
const TToken_string& curr_of_file() const;
|
||||
@ -63,7 +214,7 @@ protected:
|
||||
public:
|
||||
virtual bool goto_root();
|
||||
|
||||
TAnal_tree(int logicnum, const char* tabname, const TArray& key1, const TArray& key2);
|
||||
TAnal_tree(int logicnum);
|
||||
virtual ~TAnal_tree();
|
||||
};
|
||||
|
||||
@ -73,20 +224,27 @@ public:
|
||||
|
||||
#define F_TREE 99
|
||||
|
||||
short TAnal_msk::get_field_id(int n, int k) const
|
||||
short TSimple_anal_msk::get_field_id(int n, int k) const
|
||||
{
|
||||
short id = 0;
|
||||
if (n >= 0 && n < fieldrefs(1))
|
||||
{
|
||||
if (k == 2)
|
||||
id = F_DES1+n;
|
||||
else
|
||||
if (k == 1)
|
||||
id = F_KEY1+n;
|
||||
else
|
||||
id = F_DES1+n;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
bool TAnal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
bool TSimple_anal_msk::test_key_field(short id)
|
||||
{
|
||||
TEdit_field& fld = efield(id);
|
||||
const int level = id - F_KEY1;
|
||||
return test_multilevel_field(fld, level);
|
||||
}
|
||||
|
||||
bool TSimple_anal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
@ -116,13 +274,20 @@ bool TAnal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
beep(0);
|
||||
}
|
||||
break;
|
||||
case F_KEY1:
|
||||
case F_KEY2:
|
||||
case F_KEY3:
|
||||
case F_KEY4:
|
||||
if (e == fe_modify || e == fe_close)
|
||||
return test_key_field(o.dlg());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int TAnal_msk::compute_offset() const
|
||||
int TSimple_anal_msk::compute_offset() const
|
||||
{
|
||||
int delta = 0;
|
||||
RCT rct; xvt_vobj_get_client_rect(TASK_WIN, &rct);
|
||||
@ -131,7 +296,7 @@ int TAnal_msk::compute_offset() const
|
||||
return delta;
|
||||
}
|
||||
|
||||
void TAnal_msk::read(const char* name)
|
||||
void TSimple_anal_msk::read(const char* name)
|
||||
{
|
||||
const int delta = compute_offset();
|
||||
|
||||
@ -181,6 +346,7 @@ void TAnal_msk::read(const char* name)
|
||||
|
||||
read_mask(outname, 0, 0);
|
||||
xvt_fsys_removefile(outname);
|
||||
set_source_file(name);
|
||||
}
|
||||
else
|
||||
read_mask(name, 0, 0);
|
||||
@ -189,12 +355,7 @@ void TAnal_msk::read(const char* name)
|
||||
create_tree_field();
|
||||
}
|
||||
|
||||
int TAnal_msk::create_key_fields()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
short TAnal_msk::create_tree_field()
|
||||
short TSimple_anal_msk::create_tree_field()
|
||||
{
|
||||
short id = 0;
|
||||
const int delta = compute_offset();
|
||||
@ -203,7 +364,7 @@ short TAnal_msk::create_tree_field()
|
||||
id = F_TREE;
|
||||
add_tree(id, 0, 0, 1, (delta-1)*2, -1);
|
||||
|
||||
TAnal_tree* t = new TAnal_tree(get_logicnum(), get_tabname(), _key1_fields, _key2_fields);
|
||||
TAnal_tree* t = new TAnal_tree(get_logicnum());
|
||||
tfield(id).set_tree(t);
|
||||
t->goto_root();
|
||||
t->expand();
|
||||
@ -212,7 +373,7 @@ short TAnal_msk::create_tree_field()
|
||||
return id;
|
||||
}
|
||||
|
||||
void TAnal_msk::update_tree_field()
|
||||
void TSimple_anal_msk::update_tree_field()
|
||||
{
|
||||
const int pos = id2pos(F_TREE);
|
||||
if (pos >= 0)
|
||||
@ -222,31 +383,25 @@ void TAnal_msk::update_tree_field()
|
||||
}
|
||||
}
|
||||
|
||||
void TAnal_msk::add_fieldref(const char* name, int from, int to, int key)
|
||||
int TSimple_anal_msk::fieldrefs(int k) const
|
||||
{
|
||||
TArray& a = key == 1 ? _key1_fields : _key2_fields;
|
||||
TString80 str; str << name;
|
||||
if (from > 0)
|
||||
str << '[' << from << ',' << to << ']';
|
||||
|
||||
TFieldref* fr = new TFieldref(str, get_logicnum());
|
||||
a.add(fr);
|
||||
int n = 1;
|
||||
if (k == 1)
|
||||
{
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(get_logicnum());
|
||||
n = mci.levels();
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
int TAnal_msk::fieldrefs(int k) const
|
||||
const TFieldref& TSimple_anal_msk::fieldref(int n, int k) const
|
||||
{
|
||||
const TArray& a = k == 1 ? _key1_fields : _key2_fields;
|
||||
return a.items();
|
||||
}
|
||||
|
||||
const TFieldref& TAnal_msk::fieldref(int n, int k) const
|
||||
{
|
||||
const TArray& a = k == 1 ? _key1_fields : _key2_fields;
|
||||
return (const TFieldref&)a[n];
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(get_logicnum());
|
||||
return mci.fieldref(n, k);
|
||||
|
||||
}
|
||||
|
||||
const TToken_string& TAnal_msk::get_key_value(const TRectype& rec, int c) const
|
||||
const TToken_string& TSimple_anal_msk::get_key_value(const TRectype& rec, int c) const
|
||||
{
|
||||
TToken_string& val = get_tmp_string();
|
||||
const int tot = fieldrefs(c);
|
||||
@ -258,7 +413,7 @@ const TToken_string& TAnal_msk::get_key_value(const TRectype& rec, int c) const
|
||||
return val;
|
||||
}
|
||||
|
||||
const TToken_string& TAnal_msk::get_key_value(int c) const
|
||||
const TToken_string& TSimple_anal_msk::get_key_value(int c) const
|
||||
{
|
||||
TToken_string& val = get_tmp_string();
|
||||
for (TEditable_field* f = get_key_field(c, true); f != NULL; f = get_key_field(c, false))
|
||||
@ -268,6 +423,155 @@ const TToken_string& TAnal_msk::get_key_value(int c) const
|
||||
return val;
|
||||
}
|
||||
|
||||
const char* TSimple_anal_msk::get_key_fieldname(int k) const
|
||||
{
|
||||
const int logic = get_logicnum();
|
||||
const RecDes& rd = prefix().get_recdes(logic);
|
||||
CHECKD(k > 0 && k <= rd.NKeys, "Invalid key ", k);
|
||||
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 TSimple_anal_msk::append_select_clause(ostream& out, int level) const
|
||||
{
|
||||
const TFieldref& key = fieldref(level, 1);
|
||||
|
||||
TString str;
|
||||
str << " SE STR(";
|
||||
if (level > 1)
|
||||
str << "(NUM(LEN(" << key.name() << "))>" << key.from() << ')'; // SE LEN(CODCONTO)>=4
|
||||
if (level < fieldrefs())
|
||||
{
|
||||
if (level > 1) str << "&&";
|
||||
str << "(NUM(LEN(" << key.name() << "))<=" << key.to() << ')'; // SE LEN(CODCONTO)<=7
|
||||
}
|
||||
str << ')';
|
||||
out << str << endl;
|
||||
}
|
||||
|
||||
void TSimple_anal_msk::create_key_browse(TEdit_field& kfld, int level)
|
||||
{
|
||||
TFilename tmp; tmp.temp();
|
||||
ofstream out(tmp);
|
||||
|
||||
const int logic = get_logicnum();
|
||||
out << "US " << get_logicnum() << " KE 1";
|
||||
append_select_clause(out, level);
|
||||
out << "KE 1" << endl;
|
||||
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(logic);
|
||||
|
||||
for (int i = 0; i <= level; i++)
|
||||
{
|
||||
const TString& picture = mci.picture(i);
|
||||
const TString& prompt = mci.prompt(i);
|
||||
const TFieldref& field = mci.fieldref(i, 1);
|
||||
const int length = field.to() - field.from();
|
||||
out << "IN " << field << ' ' << get_field_id(i, 1) << endl;
|
||||
out << "DI \"" << prompt << '@' << length << "\" " << field << endl;
|
||||
out << "OU " << get_field_id(i, 1) << ' ' << field << endl;
|
||||
if (i == level)
|
||||
out << "FI " << field << endl;
|
||||
}
|
||||
const TFieldref& field = mci.fieldref(0, 2);
|
||||
out << "DI \"" << TR("Descrizione") << "@50\" " << field << endl;
|
||||
out << "OU " << get_field_id(level, 2) << ' ' << field << endl;
|
||||
out << "CH " << (level == 1 ? "RE" : "NO") << endl;
|
||||
out << "EN" << endl;
|
||||
out.close();
|
||||
|
||||
TScanner scan(tmp);
|
||||
while (scan.pop() != "EN")
|
||||
kfld.parse_item(scan);
|
||||
|
||||
xvt_fsys_removefile(tmp);
|
||||
}
|
||||
|
||||
void TSimple_anal_msk::create_des_browse(TEdit_field& kfld, int level)
|
||||
{
|
||||
TString key2; key2 << fieldref(0, 2);
|
||||
|
||||
TFilename tmp; tmp.temp();
|
||||
ofstream out(tmp);
|
||||
const int logic = get_logicnum();
|
||||
out << "US " << get_logicnum() << " KE 2";
|
||||
append_select_clause(out, level);
|
||||
out << "KE 2" << endl;
|
||||
out << "IN " << key2 << ' ' << kfld.dlg() << endl;
|
||||
out << "DI \"" << TR("Descrizione") << "@50\" " << key2 << endl;
|
||||
out << "OU " << kfld.dlg() << ' ' << key2 << endl;
|
||||
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(logic);
|
||||
|
||||
for (int i = 0; i <= level; i++)
|
||||
{
|
||||
const TString& picture = mci.picture(i);
|
||||
const TString& prompt = mci.prompt(i);
|
||||
const TFieldref& field = mci.fieldref(i, 1);
|
||||
const int length = field.to() - field.from();
|
||||
out << "DI \"" << prompt << '@' << length << "\" " << field << endl;
|
||||
out << "OU " << get_field_id(i, 1) << ' ' << field << endl;
|
||||
}
|
||||
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 TSimple_anal_msk::create_key_fields()
|
||||
{
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(get_logicnum());
|
||||
|
||||
int maxkeylen = 0, maxdeslen = 0;
|
||||
for (int level = 0; level < mci.levels(); level++)
|
||||
{
|
||||
const TString& prompt = mci.prompt(level);
|
||||
const int deslen = prompt.len();
|
||||
const int keylen = mci.len(level);
|
||||
if (deslen > maxdeslen) maxdeslen = deslen;
|
||||
if (keylen > maxkeylen) maxkeylen = keylen;
|
||||
}
|
||||
|
||||
maxdeslen++;
|
||||
const int tab0 = compute_offset()+2;
|
||||
const int tab1 = tab0 + maxdeslen + maxkeylen + 4;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < level; i++)
|
||||
{
|
||||
const short kid = get_field_id(i, 1);
|
||||
CHECKD(kid > 100, "Invalid field id:", kid);
|
||||
|
||||
const TString& picture = mci.picture(i);
|
||||
TString80 prompt = mci.prompt(i);
|
||||
prompt.left_just(maxdeslen);
|
||||
|
||||
TEdit_field* kfld = NULL;
|
||||
const char* flags = picture[0] == '0' ? "BUZ" : "BU";
|
||||
if (picture.find('A') < 0) // Numeric
|
||||
kfld = &add_string(kid, 0, prompt, tab0, i+1, picture.len(), flags);
|
||||
else
|
||||
kfld = &add_string(kid, 0, prompt, tab0, i+1, picture.len(), flags);
|
||||
create_key_browse(*kfld, i);
|
||||
}
|
||||
|
||||
for (i = 0; i < level; i++)
|
||||
{
|
||||
const short did = get_field_id(i, 2);
|
||||
TEdit_field& dfld = add_string(did, 0, "", tab1, i+1, 50, "B", 72+tab0-tab1);
|
||||
create_des_browse(dfld, i);
|
||||
}
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_tree
|
||||
@ -275,11 +579,14 @@ const TToken_string& TAnal_msk::get_key_value(int c) const
|
||||
|
||||
const TToken_string& TAnal_tree::curr_of_file() const
|
||||
{
|
||||
TToken_string& k = get_tmp_string();
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(_file->num());
|
||||
const TRectype& rec = _file->curr();
|
||||
for (int i = 0; i < max_level(); i++)
|
||||
|
||||
TToken_string& k = get_tmp_string();
|
||||
|
||||
for (int i = 0; i < mci.levels(); i++)
|
||||
{
|
||||
const TFieldref& fld = (const TFieldref&)_key1_fields[i];
|
||||
const TFieldref& fld = mci.fieldref(i);
|
||||
k.add(fld.read(rec));
|
||||
}
|
||||
|
||||
@ -312,7 +619,8 @@ int TAnal_tree::curr_level() const
|
||||
|
||||
int TAnal_tree::max_level() const
|
||||
{
|
||||
return _key1_fields.items();
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(_file->num());
|
||||
return mci.levels();
|
||||
}
|
||||
|
||||
const TToken_string& TAnal_tree::father_of(const TToken_string& key) const
|
||||
@ -428,10 +736,11 @@ bool TAnal_tree::goto_father()
|
||||
TRectype& rec = _file->curr();
|
||||
rec.zero();
|
||||
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(_file->num());
|
||||
for (int i = 0; i < lev-1; i++)
|
||||
{
|
||||
const char* val = _curr._key.get(i);
|
||||
const TFieldref& fld = (const TFieldref&)_key1_fields[i];
|
||||
const TFieldref& fld = mci.fieldref(i);
|
||||
fld.write(val, rec);
|
||||
}
|
||||
ok = _file->read() == NOERR;
|
||||
@ -476,22 +785,20 @@ bool TAnal_tree::get_description(TString& desc) const
|
||||
const int lev = _curr.level();
|
||||
if (lev > 0)
|
||||
{
|
||||
const TFieldref& fld1 = (const TFieldref&)_key1_fields[lev-1];
|
||||
const TFieldref& fld2 = (const TFieldref&)_key2_fields[0];
|
||||
desc = fld1.read(_file->curr());
|
||||
desc << ' ' << fld2.read(_file->curr());
|
||||
const TMultilevel_code_info& mci = multilevel_code_info(_file->num());
|
||||
const TFieldref& fld1 = mci.fieldref(lev-1, 1);
|
||||
const TFieldref& fld2 = mci.fieldref(0, 2);
|
||||
const TRectype& rec = _file->curr();
|
||||
desc = fld1.read(rec);
|
||||
desc << ' ' << fld2.read(rec);
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
TAnal_tree::TAnal_tree(int logicnum, const char* tabname, const TArray& key1, const TArray& key2)
|
||||
: _key1_fields(key1), _key2_fields(key2)
|
||||
TAnal_tree::TAnal_tree(int logicnum)
|
||||
{
|
||||
if (tabname && *tabname)
|
||||
_file = new TTable(tabname);
|
||||
else
|
||||
_file = new TLocalisamfile(logicnum);
|
||||
_file = new TLocalisamfile(logicnum);
|
||||
}
|
||||
|
||||
TAnal_tree::~TAnal_tree()
|
||||
@ -499,173 +806,6 @@ TAnal_tree::~TAnal_tree()
|
||||
delete _file;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TSimple_anal_msk
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
const char* TSimple_anal_msk::get_key_fieldname(int k) const
|
||||
{
|
||||
const int logic = get_logicnum();
|
||||
const RecDes& rd = prefix().get_recdes(logic);
|
||||
CHECKD(k > 0 && k <= rd.NKeys, "Invalid key ", k);
|
||||
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 TSimple_anal_msk::append_select_clause(ostream& out, int level) const
|
||||
{
|
||||
const TFieldref& key = fieldref(level-1, 1);
|
||||
|
||||
TString str;
|
||||
str << " SE STR(";
|
||||
if (level > 1)
|
||||
str << "(NUM(LEN(" << key.name() << "))>" << key.from() << ')'; // SE LEN(CODCONTO)>=4
|
||||
if (level < fieldrefs())
|
||||
{
|
||||
if (level > 1) str << "&&";
|
||||
str << "(NUM(LEN(" << key.name() << "))<=" << key.to() << ')'; // SE LEN(CODCONTO)<=7
|
||||
}
|
||||
str << ')';
|
||||
out << str << endl;
|
||||
}
|
||||
|
||||
void TSimple_anal_msk::create_key_browse(TEdit_field& kfld, int level, TConfig& cfg)
|
||||
{
|
||||
TFilename tmp; tmp.temp();
|
||||
ofstream out(tmp);
|
||||
|
||||
const int logic = get_logicnum();
|
||||
out << "US ";
|
||||
if (logic == LF_TAB || logic == LF_TABCOM)
|
||||
out << get_tabname();
|
||||
else
|
||||
out << get_logicnum();
|
||||
out << " KE 1";
|
||||
append_select_clause(out, level);
|
||||
out << "KE 1" << endl;
|
||||
|
||||
for (int i = 1; i <= level; i++)
|
||||
{
|
||||
const TString& picture = cfg.get(get_key_var(), NULL, i);
|
||||
const TString& prompt = cfg.get(get_des_var(), NULL, i);
|
||||
const TFieldref& field = fieldref(i-1, 1);
|
||||
const int length = field.to() - field.from();
|
||||
out << "IN " << field << ' ' << get_field_id(i-1, 1) << endl;
|
||||
out << "DI \"" << prompt << '@' << length << "\" " << field << endl;
|
||||
out << "OU " << get_field_id(i-1, 1) << ' ' << field << endl;
|
||||
if (i == level)
|
||||
out << "FI " << field << endl;
|
||||
}
|
||||
const TFieldref& field = fieldref(0, 2);
|
||||
out << "DI \"Descrizione@50\" " << fieldref(0, 2) << endl;
|
||||
out << "OU " << get_field_id(level-1, 2) << ' ' << field << endl;
|
||||
out << "CH " << (level == 1 ? "RE" : "NO") << endl;
|
||||
out << "EN" << endl;
|
||||
out.close();
|
||||
|
||||
TScanner scan(tmp);
|
||||
while (scan.pop() != "EN")
|
||||
kfld.parse_item(scan);
|
||||
|
||||
xvt_fsys_removefile(tmp);
|
||||
}
|
||||
|
||||
void TSimple_anal_msk::create_des_browse(TEdit_field& kfld, int level, TConfig& cfg)
|
||||
{
|
||||
TString key2; key2 << fieldref(0, 2);
|
||||
|
||||
TFilename tmp; tmp.temp();
|
||||
ofstream out(tmp);
|
||||
const int logic = get_logicnum();
|
||||
out << "US ";
|
||||
if (logic == LF_TAB || logic == LF_TABCOM)
|
||||
out << get_tabname();
|
||||
else
|
||||
out << get_logicnum();
|
||||
out << " KE 2";
|
||||
append_select_clause(out, level);
|
||||
out << "KE 2" << endl;
|
||||
out << "DI \"Descrizione@50\" " << key2 << endl;
|
||||
out << "IN " << key2 << ' ' << kfld.dlg() << endl;
|
||||
out << "OU " << kfld.dlg() << ' ' << key2 << endl;
|
||||
|
||||
int from = 1, to = 1;
|
||||
for (int i = 1; i <= level; i++)
|
||||
{
|
||||
const TString& picture = cfg.get(get_key_var(), NULL, i);
|
||||
const TString& prompt = cfg.get(get_des_var(), NULL, i);
|
||||
const TFieldref& field = fieldref(i-1, 1);
|
||||
const int length = field.to() - field.from();
|
||||
out << "DI \"" << prompt << '@' << length << "\" " << field << endl;
|
||||
out << "OU " << get_field_id(i-1, 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 TSimple_anal_msk::create_key_fields()
|
||||
{
|
||||
TConfig cfg(CONFIG_DITTA, "ca");
|
||||
const char* keyvar = get_key_var();
|
||||
const char* desvar = get_des_var();
|
||||
|
||||
int maxkeylen = 0, maxdeslen = 0;
|
||||
int level;
|
||||
int from = 1, to = 1;
|
||||
for (level = 1; ; level++)
|
||||
{
|
||||
const TString& prompt = cfg.get(desvar, NULL, level);
|
||||
if (prompt.blank())
|
||||
break;
|
||||
const TString& picture = cfg.get(keyvar, 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;
|
||||
add_fieldref(get_key_fieldname(1), from, to, 1);
|
||||
from = to+1;
|
||||
}
|
||||
add_fieldref(get_key_fieldname(2), 0, 0, 2);
|
||||
|
||||
maxdeslen++;
|
||||
const int tab0 = compute_offset()+2;
|
||||
const int tab1 = tab0 + maxdeslen + maxkeylen + 4;
|
||||
|
||||
int i;
|
||||
for (i = 1; i < level; i++)
|
||||
{
|
||||
const short kid = get_field_id(i-1, 1);
|
||||
CHECKD(kid > 100, "Invalid field id:", kid);
|
||||
|
||||
const TString& picture = cfg.get(keyvar, NULL, i);
|
||||
TString80 prompt = cfg.get(desvar, NULL, i);
|
||||
prompt.left_just(maxdeslen);
|
||||
TEdit_field& kfld = add_string(kid, 0, prompt, tab0, i, picture.len(), "BU");
|
||||
create_key_browse(kfld, i, cfg);
|
||||
}
|
||||
|
||||
for (i = 1; i < level; i++)
|
||||
{
|
||||
const short did = get_field_id(i-1, 2);
|
||||
TEdit_field& dfld = add_string(did, 0, "", tab1, i, 50, "B", 72+tab0-tab1);
|
||||
create_des_browse(dfld, i, cfg);
|
||||
}
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_app
|
||||
@ -726,7 +866,7 @@ bool TAnal_app::user_create()
|
||||
|
||||
void TAnal_app::init_query_mode(TMask& mask)
|
||||
{
|
||||
TAnal_msk& m = (TAnal_msk&)mask;
|
||||
TSimple_anal_msk& m = (TSimple_anal_msk&)mask;
|
||||
for (int i = 0; ; i++)
|
||||
{
|
||||
const short id = m.get_field_id(i, 1);
|
||||
|
70
ca/calib01.h
70
ca/calib01.h
@ -9,26 +9,56 @@
|
||||
#include <relapp.h>
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_msk
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TAnal_msk : public TAutomask
|
||||
class TMultilevel_code_info : public TObject
|
||||
{
|
||||
int _logicnum;
|
||||
TString_array _prompt;
|
||||
TString_array _picture;
|
||||
TArray _key1_fields;
|
||||
TArray _key2_fields;
|
||||
|
||||
protected:
|
||||
void add_fieldref(const char* name, int from, int to, int key = 1);
|
||||
bool get_cfg_vars(TString& key, TString& des) const;
|
||||
const char* get_key_fieldname(int k = 1) const;
|
||||
void add_fieldref(int k, int from, int to);
|
||||
|
||||
public:
|
||||
int levels() const;
|
||||
int len(int level) const;
|
||||
const TString& picture(int level) const;
|
||||
const TString& prompt(int level) const;
|
||||
const TFieldref& fieldref(int level, int key = 1) const;
|
||||
|
||||
TMultilevel_code_info(int logicnum);
|
||||
virtual ~TMultilevel_code_info() { }
|
||||
};
|
||||
|
||||
const TMultilevel_code_info& multilevel_code_info(int logicnum);
|
||||
bool test_multilevel_field(TEdit_field& fld, int level);
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TSimple_anal_msk
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TSimple_anal_msk : public TAutomask
|
||||
{
|
||||
protected:
|
||||
bool test_key_field(short id);
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
virtual void read(const char* msk);
|
||||
|
||||
const char* get_key_fieldname(int k) const;
|
||||
|
||||
void append_select_clause(ostream& out, int level) const;
|
||||
void create_key_browse(TEdit_field& kfld, int level);
|
||||
void create_des_browse(TEdit_field& kfld, int level);
|
||||
virtual int create_key_fields();
|
||||
|
||||
virtual short create_tree_field();
|
||||
int compute_offset() const;
|
||||
TAnal_msk() { }
|
||||
|
||||
protected:
|
||||
TSimple_anal_msk() { }
|
||||
|
||||
public:
|
||||
void update_tree_field();
|
||||
@ -37,32 +67,10 @@ public:
|
||||
int fieldrefs(int key = 1) const;
|
||||
|
||||
virtual int get_logicnum() const pure;
|
||||
virtual const char* get_tabname() const { return ""; }
|
||||
virtual short get_field_id(int n, int key = 1) const;
|
||||
|
||||
virtual const TToken_string& get_key_value(const TRectype& rec, int k = 1) const;
|
||||
virtual const TToken_string& get_key_value(int k = 1) const;
|
||||
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TSimple_anal_msk
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TSimple_anal_msk : public TAnal_msk
|
||||
{
|
||||
protected:
|
||||
virtual const char* get_key_var() const pure;
|
||||
virtual const char* get_des_var() const pure;
|
||||
const char* get_key_fieldname(int k) const;
|
||||
|
||||
void append_select_clause(ostream& out, int level) const;
|
||||
void create_key_browse(TEdit_field& kfld, int level, TConfig& cfg);
|
||||
void create_des_browse(TEdit_field& kfld, int level, TConfig& cfg);
|
||||
virtual int create_key_fields();
|
||||
|
||||
protected:
|
||||
TSimple_anal_msk() { }
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -72,7 +80,7 @@ protected:
|
||||
class TAnal_app : public TRelation_application
|
||||
{
|
||||
TRelation* _rel;
|
||||
TAnal_msk* _msk;
|
||||
TSimple_anal_msk* _msk;
|
||||
|
||||
protected:
|
||||
virtual TMask* get_mask(int) { return _msk; }
|
||||
@ -87,7 +95,7 @@ protected:
|
||||
virtual void init_insert_mode(TMask& m);
|
||||
|
||||
protected:
|
||||
virtual TAnal_msk* create_mask() const pure;
|
||||
virtual TSimple_anal_msk* create_mask() const pure;
|
||||
virtual TRelation* create_relation() const;
|
||||
};
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
8
|
||||
TIPO|1|1|0|Tipo Ripartizione (<I>nterattiva, <B>atch)+
|
||||
CODICE|1|8|0|Codice ripartizione
|
||||
NRIGA|1|3|0|Numero riga
|
||||
NRIGA|2|3|0|Numero riga
|
||||
CODCOSTO|1|20|0|Codice centro di costo
|
||||
CODCMS|1|20|0|Codice commessa
|
||||
CODFASE|1|10|0|Codice fase
|
||||
|
Loading…
x
Reference in New Issue
Block a user