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:
guy 2005-01-14 15:14:34 +00:00
parent d59a5ee6ed
commit 0a5d7b7b05
13 changed files with 602 additions and 438 deletions

@ -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);

@ -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[])

@ -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

@ -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);

@ -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