Patch level : 2.2 44

Files correlati     : ca0, ca2
Ricompilazione Demo : [ ]
Commento            :

Riveduta e corretta gestione fasi collegate (o no) a commesse o centri di costo


git-svn-id: svn://10.65.10.50/trunk@12792 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2005-03-08 15:55:27 +00:00
parent 315d0194fc
commit a8aa726335
9 changed files with 595 additions and 513 deletions

View File

@ -81,7 +81,7 @@ protected:
public: public:
// @cmember Disabilita la verifica del modulo in chiave // @cmember Disabilita la verifica del modulo in chiave
virtual bool check_autorization() const { return FALSE; } virtual bool check_autorization() const { return false; }
virtual bool preprocess_config (TMask& mask, TConfig& config); virtual bool preprocess_config (TMask& mask, TConfig& config);
virtual bool postprocess_config (TMask& mask, TConfig& config); virtual bool postprocess_config (TMask& mask, TConfig& config);

View File

@ -3,20 +3,34 @@
#include <relapp.h> #include <relapp.h>
#include "calib01.h" #include "calib01.h"
#include "calibmsk.h"
#include "ca0700a.h" #include "ca0700a.h"
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//MASCHERA //MASCHERA
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
class TFsc_anal_msk : public TSimple_anal_msk class TFsc_anal_msk : public TSimple_anal_msk
{ {
protected: protected:
virtual int get_logicnum() const { return LF_FASI; } virtual int get_logicnum() const { return LF_FASI; }
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public: public:
TFsc_anal_msk() { read("ca0700a"); } TFsc_anal_msk() { read("ca0700a"); }
}; };
bool TFsc_anal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
const short id = o.dlg();
if (id > F_KEY4 && id <= F_KEY4+4)
{
const int level = id - F_KEY4 - 1;
return ca_test_multilevel_field(efield(id), level);
}
return TSimple_anal_msk::on_field_event(o, e, jolly);
}
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//APPLICAZIONE //APPLICAZIONE
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////

View File

@ -5,6 +5,8 @@
#include "ca0800a.h" #include "ca0800a.h"
#include "calib01.h" #include "calib01.h"
#include "rrip.h"
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TRiparti_msk // TRiparti_msk
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -13,6 +15,7 @@ class TRiparti_msk : public TAutomask
{ {
protected: protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
int create_sheet_fields(int lf, int& y, short& dlg);
void create_sheet(); void create_sheet();
public: public:
@ -67,6 +70,7 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
default: default:
if (e == fe_modify || e == fe_close) if (e == fe_modify || e == fe_close)
{ {
/*
const short id = o.dlg(); const short id = o.dlg();
int level = -1; int level = -1;
if (id >= 202 && id <= 217) if (id >= 202 && id <= 217)
@ -86,26 +90,89 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
TEdit_field& fld = (TEdit_field&)o; TEdit_field& fld = (TEdit_field&)o;
return ca_test_multilevel_field(fld, level); return ca_test_multilevel_field(fld, level);
} }
*/
} }
break; break;
} }
return true; return true;
} }
int TRiparti_msk::create_sheet_fields(int lf, int& y, short& dlg)
{
TSheet_field& sf = sfield(F_SHEET);
TMask& sm = sf.sheet_mask();
const int h = ca_create_fields(sm, lf, 1, y, dlg, dlg+50);
for (int i = 0; i < h; i++)
{
TEdit_field& fld = sm.efield(dlg+i);
int logic = lf;
if (logic == LF_FASI)
{
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
if (fasinfo.parent() != 0)
{
const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent());
if (i < parinfo.levels())
logic = fasinfo.parent();
}
}
const char* fieldname = NULL;
switch(logic)
{
case LF_CDC : fieldname = RRIP_CODCOSTO; break;
case LF_COMMESSE: fieldname = RRIP_CODCMS; break;
case LF_FASI : fieldname = RRIP_CODFASE; break;
default : fieldname = RRIP_CODCONTO; break;
}
TFieldref* f = (TFieldref*)fld.field();
f->set_name(fieldname);
}
y += h+1;
dlg += h;
return h;
}
void TRiparti_msk::create_sheet() void TRiparti_msk::create_sheet()
{ {
TSheet_field& sf = sfield(F_SHEET); TSheet_field& sf = sfield(F_SHEET);
TMask& sm = sf.sheet_mask(); TMask& sm = sf.sheet_mask();
sm.hide(-1); sm.hide(-1);
TConfig ini(CONFIG_DITTA, "ca"); const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
const bool use_pdc = ini.get_bool("UsePdcc");
ca_create_fields(sm, LF_CDC, 1, 1, 202, 252); TConfig ini(CONFIG_DITTA, "ca");
ca_create_fields(sm, LF_COMMESSE, 1, 5, 206, 256);
ca_create_fields(sm, LF_FASI, 1, 9, 210, 260); int y = 1;
ca_create_fields(sm, use_pdc ? LF_PCON : LF_PCONANA, 1, 13, 214, 264); short dlg = 202;
for (int i = 0; i < 2; i++)
{
const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2
if (level == "CDC") // Crea centro di costo
{
if (fasinfo.parent() == LF_CDC)
create_sheet_fields(LF_FASI, y, dlg);
else
create_sheet_fields(LF_CDC, y, dlg);
} else
if (level == "CMS") // Crea commessa
{
if (fasinfo.parent() == LF_COMMESSE)
create_sheet_fields(LF_FASI, y, dlg);
else
create_sheet_fields(LF_COMMESSE, y, dlg);
}
}
if (fasinfo.levels() > 0 && fasinfo.parent() <= 0)
create_sheet_fields(LF_FASI, y, dlg);
const bool use_pdc = ini.get_bool("UsePdcc");
create_sheet_fields(use_pdc ? LF_PCON : LF_PCONANA, y, dlg);
for (short id = 217; id >= 202; id--) for (short id = 217; id >= 202; id--)
{ {
@ -128,8 +195,39 @@ void TRiparti_msk::create_sheet()
TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a") TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a")
{ {
ca_create_fields(*this, LF_CDC, 2, 5, F_CODCDC_1, F_DESCDC_1); TConfig ini(CONFIG_DITTA, "ca");
ca_create_fields(*this, LF_COMMESSE, 2, 11, F_CODCMS_1, F_DESCMS_1);
// Crea gli eventuali campi per commessa e centro di costo
int y = 5;
for (int i = 0; i < 2; i++)
{
const char* prompt = NULL;
int h = 0;
const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2
if (level == "CDC") // Crea centro di costo
{
h = ca_create_fields(*this, LF_CDC, 2, y, F_CODCDC_1, F_DESCDC_1);
prompt = TR("@bCentro di costo");
} else
if (level == "CMS") // Crea commessa
{
h = ca_create_fields(*this, LF_COMMESSE, 2, y, F_CODCMS_1, F_DESCMS_1);
prompt = TR("@bCommessa");
}
if (prompt != NULL) // Crea groupbox
{
const int last = fields()-1;
for (int j = 0; j < 2*h; j++)
fld(last-j).set_group(2);
h += 2;
TGroup_field& grp = add_groupbox(F_LEVEL_1+i, 0, prompt, 1, y-1, 78, h);
grp.set_group(2);
y += h;
}
}
create_sheet(); create_sheet();
} }
@ -203,7 +301,6 @@ void TRiparti_app::spezza_campo(const TString& str, TToken_string& row, int firs
} }
} }
void TRiparti_app::write_rows() void TRiparti_app::write_rows()
{ {
TRectype* key = new TRectype(LF_RRIP); TRectype* key = new TRectype(LF_RRIP);
@ -214,45 +311,53 @@ void TRiparti_app::write_rows()
TRecord_array a(LF_RRIP, "NRIGA"); TRecord_array a(LF_RRIP, "NRIGA");
a.set_key(key); a.set_key(key);
TConfig ini(CONFIG_DITTA, "ca");
const bool use_pdc = ini.get_bool("UsePdcc");
TSheet_field& sheet = _msk->sfield(F_SHEET); TSheet_field& sheet = _msk->sfield(F_SHEET);
TMask& sm = sheet.sheet_mask();
FOR_EACH_SHEET_ROW(sheet, i, row) FOR_EACH_SHEET_ROW(sheet, i, row)
{ {
TRectype& rec = a.row(i+1, true); // Crea una riga nuova TRectype& rec = a.row(i+1, true); // Crea una riga nuova
rec.put("RIPARTO", row->get(0)); for (int i = sm.fields()-1; i >= 0; i--)
rec.put("CODCOSTO", somma_campi(*row, 1)); {
rec.put("CODCMS", somma_campi(*row, 5)); TMask_field& mf = sm.fld(i);
rec.put("CODFASE", somma_campi(*row, 9)); if (mf.field() != NULL)
rec.put("CODCONTO", somma_campi(*row,13,use_pdc)); {
const int idx = sheet.cid2index(mf.dlg());
if (idx < 17)
mf.field()->write(row->get(idx), rec);
}
}
} }
a.rewrite(); a.rewrite();
} }
void TRiparti_app::read_rows() void TRiparti_app::read_rows()
{ {
TRectype key (LF_RRIP);
const char tipo = _msk->get(F_TIPO)[0]; const char tipo = _msk->get(F_TIPO)[0];
key.put("TIPO", tipo); TToken_string key;
key.put("CODICE", _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I)); key << tipo << '|' << _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I);
TRecord_array a(key, "NRIGA"); TRecord_array a(key, LF_RRIP);
TSheet_field& sheet = _msk->sfield(F_SHEET); TSheet_field& sheet = _msk->sfield(F_SHEET);
TMask& sm = sheet.sheet_mask();
sheet.destroy(); sheet.destroy();
for (int i = 1; i <= a.rows(); i++) for (int i = 1; i <= a.rows(); i++)
{ {
const TRectype& rec = a.row(i);
TToken_string& row = sheet.row(i-1); TToken_string& row = sheet.row(i-1);
row = rec.get("RIPARTO"); const TRectype& rec = a.row(i);
spezza_campo(rec.get("CODCOSTO"), row, 1); for (int i = sm.fields()-1; i >= 0; i--)
spezza_campo(rec.get("CODCMS"), row, 5); {
spezza_campo(rec.get("CODFASE"), row, 9); TMask_field& mf = sm.fld(i);
spezza_campo(rec.get("CODCONTO"), row,13); if (mf.field() != NULL)
{
const int idx = sheet.cid2index(mf.dlg());
if (idx < 17)
row.add(mf.field()->read(rec), idx);
}
}
} }
} }
int TRiparti_app::write(const TMask& m) int TRiparti_app::write(const TMask& m)
{ {
const int err = TRelation_application::write(m); const int err = TRelation_application::write(m);

View File

@ -4,6 +4,8 @@
#define F_DESCRIZ_I 104 #define F_DESCRIZ_I 104
#define F_DESCRIZ_B 105 #define F_DESCRIZ_B 105
#define F_TIPORIP 106 #define F_TIPORIP 106
#define F_LEVEL_1 107
#define F_LEVEL_2 108
#define F_GRUPPO 111 #define F_GRUPPO 111
#define F_CONTO 112 #define F_CONTO 112

View File

@ -154,18 +154,6 @@ BEGIN
GROUP 1 GROUP 1
END END
GROUPBOX DLG_NULL 78 6
BEGIN
PROMPT 1 4 "@bCentro di costo"
GROUP 2
END
GROUPBOX DLG_NULL 78 6
BEGIN
PROMPT 1 10 "@bCommessa"
GROUP 2
END
ENDPAGE ENDPAGE
PAGE "Righe" -1 -1 78 22 PAGE "Righe" -1 -1 78 22
@ -212,12 +200,16 @@ NUMBER 101 6 2
BEGIN BEGIN
PROMPT 1 0 "% Ripartizione " PROMPT 1 0 "% Ripartizione "
FLAGS "U" FLAGS "U"
FIELD RIPARTO
MESSAGE COPY,201
END END
NUMBER 201 6 NUMBER 201 6
BEGIN BEGIN
PROMPT 1 0 "Numero parti " PROMPT 1 0 "Numero parti "
FLAGS "U" FLAGS "U"
FIELD RIPARTO
MESSAGE COPY,101
END END
STRING 102 20 STRING 102 20

View File

@ -1,9 +1,7 @@
#include <automask.h> #include <automask.h>
#include <defmask.h> #include <defmask.h>
#include <recarray.h>
#include <recset.h> #include <recset.h>
#include <relapp.h> #include <relapp.h>
#include <statbar.h>
#include "ca2.h" #include "ca2.h"
#include "ca2100a.h" #include "ca2100a.h"
@ -16,13 +14,13 @@
#include "movana.h" #include "movana.h"
#include "rmovana.h" #include "rmovana.h"
#include "rrip.h"
#include "saldana.h" #include "saldana.h"
class TMovanal_msk : public TAutomask class TMovanal_msk : public TAutomask
{ {
TAssoc_array _saldi; TAssoc_array _saldi;
bool _use_pdc;
protected: protected:
virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly);
@ -31,7 +29,6 @@ protected:
const TToken_string& rec2key(const TRectype& rec) const; const TToken_string& rec2key(const TRectype& rec) const;
void aggiorna_saldo_riga(int r); void aggiorna_saldo_riga(int r);
const TString& somma_campi(TToken_string& row, int first, bool pdc = false) const;
// Lettura movimento contabile // Lettura movimento contabile
TToken_string& get_rip_row(const TRectype& rrip); TToken_string& get_rip_row(const TRectype& rrip);
@ -39,17 +36,20 @@ protected:
void load_cg_row(const TRectype& row); void load_cg_row(const TRectype& row);
void load_cg_mov(); void load_cg_mov();
int create_sheet_fields(int lf, int& y, short& dlg, bool required);
void create_sheet();
public: public:
void reset_saldi(); void reset_saldi();
TImporto& saldo(const TRectype& row); TImporto& saldo(const TRectype& row);
void show_locked_buttons(); void show_locked_buttons();
bool row2rec(int row, TRectype& rec) const;
bool row2rec(int row, TRectype& rec) const;
void row2imp(const TToken_string& row, TImporto& imp) const; void row2imp(const TToken_string& row, TImporto& imp) const;
bool row2imp(int r, TImporto& imp) const; bool row2imp(int r, TImporto& imp) const;
void imp2row(const TImporto& imp, TToken_string& row) const;
void spezza_campo(const TString& str, TToken_string& row, int first) const; void imp2row(const TImporto& imp, TToken_string& row) const;
TToken_string& rec2row(const TRectype& rec, int i) const;
TMovanal_msk(); TMovanal_msk();
virtual ~TMovanal_msk() { } virtual ~TMovanal_msk() { }
@ -118,36 +118,35 @@ void TMovanal_msk::show_locked_buttons()
TToken_string& TMovanal_msk::get_rip_row(const TRectype& rrip) TToken_string& TMovanal_msk::get_rip_row(const TRectype& rrip)
{ {
TSheet_field& sheet = sfield(F_RIGHE); TSheet_field& sheet = sfield(F_RIGHE);
const int pos_cdc = sheet.cid2index(S_CDC1);
const int pos_cms = sheet.cid2index(S_CMS1);
const int pos_fas = sheet.cid2index(S_FAS1);
const int pos_con = sheet.cid2index(S_CON1);
TToken_string keyrip, keyrow; TToken_string keyrip;
keyrip.add(rrip.get("CODCOSTO")); keyrip.add(rrip.get(RRIP_CODCOSTO));
keyrip.add(rrip.get("CODCMS")); keyrip.add(rrip.get(RRIP_CODCMS));
keyrip.add(rrip.get("CODFASE")); keyrip.add(rrip.get(RRIP_CODFASE));
keyrip.add(rrip.get("CODCONTO")); keyrip.add(rrip.get(RRIP_CODCONTO));
TRectype rmov(LF_RMOVANA);
if (sheet.items() > 0) if (sheet.items() > 0)
{ {
FOR_EACH_SHEET_ROW(sheet, i, row) for (int i = 0; i < sheet.items(); i++)
{ {
keyrow = somma_campi(*row, pos_cdc); row2rec(i, rmov);
keyrow.add(somma_campi(*row, pos_cms)); TToken_string keyrow;
keyrow.add(somma_campi(*row, pos_fas)); keyrow.add(rmov.get(RMOVANA_CODCCOSTO));
keyrow.add(somma_campi(*row, pos_con, _use_pdc)); keyrow.add(rmov.get(RMOVANA_CODCMS));
keyrow.add(rmov.get(RMOVANA_CODFASE));
keyrow.add(rmov.get(RMOVANA_CODCONTO));
if (keyrow == keyrip) if (keyrow == keyrip)
return *row; return sheet.row(i); // Ho trovato una riga compatibile
} }
} }
TToken_string& row = sheet.row(-1); // Devo creare una riga nuova
spezza_campo(keyrip.get(0), row, pos_cdc); rmov.put(RMOVANA_CODCCOSTO, keyrip.get(0));
spezza_campo(keyrip.get(1), row, pos_cms); rmov.put(RMOVANA_CODCMS, keyrip.get());
spezza_campo(keyrip.get(2), row, pos_fas); rmov.put(RMOVANA_CODFASE, keyrip.get(0));
spezza_campo(keyrip.get(3), row, pos_con); rmov.put(RMOVANA_CODCONTO, keyrip.get());
TToken_string& row = rec2row(rmov, -1);
return row; return row;
} }
@ -208,8 +207,6 @@ void TMovanal_msk::load_cg_row(const TRectype& row)
imp2row(imp, riga); // Ci copio l'importo imp2row(imp, riga); // Ci copio l'importo
riga.add(row.get(RMV_DESCR), 2); // e la descrizione della riga contabile riga.add(row.get(RMV_DESCR), 2); // e la descrizione della riga contabile
} }
statbar_set_title(TASK_WIN, NULL); // Restore mask mode deleted by query stats
} }
// A partire dal movimento contabile calcola il totale documento ed eventualmente prepara lo sheet // A partire dal movimento contabile calcola il totale documento ed eventualmente prepara lo sheet
@ -358,60 +355,17 @@ bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
return true; return true;
} }
const TString& TMovanal_msk::somma_campi(TToken_string& row, int first, bool pdc) const
{
TSheet_field& sheet = sfield(F_RIGHE);
TMask& m = sheet.sheet_mask();
const short id = S_DARE + 100 + first;
TString& str = get_tmp_string(20);
TString80 token;
for (int i = 0; i < 4; i++)
{
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+i);
token = row.get(first+i);
if (pdc)
token.right_just(fld.size(), '0');
else
token.left_just(fld.size());
str << token;
}
return str;
}
void TMovanal_msk::spezza_campo(const TString& str, TToken_string& row, int first) const
{
TSheet_field& sheet = sfield(F_RIGHE);
TMask& m = sheet.sheet_mask();
TString80 token;
const short id = 201 + first;
int start = 0;
for (int i = 0; i < 4; i++)
{
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+i);
const int len = fld.size();
token = str.mid(start, len); token.trim();
row.add(token, first+i);
start += len;
}
}
// Prende dalla riga r dello sheet i dati da scrivere nel record rec dei movimenti analitici // Prende dalla riga r dello sheet i dati da scrivere nel record rec dei movimenti analitici
bool TMovanal_msk::row2rec(int r, TRectype& rec) const bool TMovanal_msk::row2rec(int r, TRectype& rec) const
{ {
TSheet_field& sheet = sfield(F_RIGHE); TSheet_field& sheet = sfield(F_RIGHE);
if (r < 0 || r >= sheet.items()) if (r < 0 || r >= sheet.items())
return false; return false;
TMask& sm = sheet.sheet_mask();
TToken_string& row = sheet.row(r); TToken_string& row = sheet.row(r);
rec.put(RMOVANA_ANNOES, get(F_ANNOES)); rec.put(RMOVANA_ANNOES, get(F_ANNOES));
rec.put(RMOVANA_DATAREG, get(F_DATAREG)); rec.put(RMOVANA_DATAREG, get(F_DATAREG));
rec.put(RMOVANA_DESCR, row.get(sheet.cid2index(S_DESCR)));
const real dare = row.get(sheet.cid2index(S_DARE)), avere = row.get(); const real dare = row.get(sheet.cid2index(S_DARE)), avere = row.get();
if (dare.is_zero()) if (dare.is_zero())
@ -424,10 +378,17 @@ bool TMovanal_msk::row2rec(int r, TRectype& rec) const
rec.put(RMOVANA_SEZIONE, 'D'); rec.put(RMOVANA_SEZIONE, 'D');
rec.put(RMOVANA_IMPORTO, dare); rec.put(RMOVANA_IMPORTO, dare);
} }
rec.put(RMOVANA_CODCCOSTO, somma_campi(row, sheet.cid2index(S_CDC1)));
rec.put(RMOVANA_CODCMS, somma_campi(row, sheet.cid2index(S_CMS1))); for (int i = sm.fields()-1; i >= 2; i--)
rec.put(RMOVANA_CODFASE, somma_campi(row, sheet.cid2index(S_FAS1))); {
rec.put(RMOVANA_CODCONTO, somma_campi(row, sheet.cid2index(S_CON1), _use_pdc)); TMask_field& mf = sm.fld(i);
if (mf.field() != NULL)
{
const int idx = sheet.cid2index(mf.dlg());
if (idx < 17)
mf.field()->write(row.get(idx), rec);
}
}
return true; return true;
} }
@ -438,6 +399,32 @@ void TMovanal_msk::imp2row(const TImporto& imp, TToken_string& row) const
row.add(imp.sezione() == 'A' ? imp.valore().string() : "", 1); row.add(imp.sezione() == 'A' ? imp.valore().string() : "", 1);
} }
TToken_string& TMovanal_msk::rec2row(const TRectype& rec, int r) const
{
TSheet_field& sheet = sfield(F_RIGHE);
TMask& sm = sheet.sheet_mask();
TToken_string& row = sheet.row(r);
const TImporto imp(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO));
imp2row(imp, row);
// Carica tutti gli altri campi dopo le colonne Dare/Avere
for (int i = sm.fields()-1; i >= 2; i--)
{
TMask_field& mf = sm.fld(i);
if (mf.field() != NULL)
{
const int idx = sheet.cid2index(mf.dlg());
if (idx < 17)
row.add(mf.field()->read(rec), idx);
}
}
return row;
}
void TMovanal_msk::row2imp(const TToken_string& row, TImporto& imp) const void TMovanal_msk::row2imp(const TToken_string& row, TImporto& imp) const
{ {
@ -529,26 +516,96 @@ void TMovanal_msk::aggiorna_saldo_riga(int r)
set(F_AVERE, sld.sezione() == 'A' ? sld.valore() : ZERO); set(F_AVERE, sld.sezione() == 'A' ? sld.valore() : ZERO);
} }
TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a") int TMovanal_msk::create_sheet_fields(int lf, int& y, short& dlg, bool required)
{ {
TSheet_field& sf = sfield(F_RIGHE); TSheet_field& sf = sfield(F_RIGHE);
TMask& sm = sf.sheet_mask(); TMask& sm = sf.sheet_mask();
sm.hide(-1); // Nasconde tutti campi fittizi const int h = ca_create_fields(sm, lf, 1, y, dlg, dlg+50);
for (int i = 0; i < h; i++)
{
TEdit_field& fld = sm.efield(dlg+i);
int logic = lf;
if (logic == LF_FASI)
{
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
if (fasinfo.parent() != 0)
{
const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent());
if (i < parinfo.levels())
logic = fasinfo.parent();
}
}
const char* fieldname = NULL;
switch(logic)
{
case LF_CDC : fieldname = RMOVANA_CODCCOSTO; break;
case LF_COMMESSE: fieldname = RMOVANA_CODCMS; break;
case LF_FASI : fieldname = RMOVANA_CODFASE; break;
default : fieldname = RMOVANA_CODCONTO; break;
}
TFieldref* f = (TFieldref*)fld.field();
f->set_name(fieldname);
fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL);
TEdit_field& dfld = sm.efield(dlg+50+i);
dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output!
}
y += h+1;
dlg += h;
return h;
}
void TMovanal_msk::create_sheet()
{
TSheet_field& sf = sfield(F_RIGHE);
TMask& sm = sf.sheet_mask();
sm.hide(-1);
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
TConfig ini(CONFIG_DITTA, "ca"); TConfig ini(CONFIG_DITTA, "ca");
_use_pdc = ini.get_bool("UsePdcc"); const bool fsc_req = ini.get_bool("FscRequired");
const short id_cdc = 201+sf.cid2index(S_CDC1); int y = 3;
const short id_cms = 201+sf.cid2index(S_CMS1); short dlg = S_CDC1+100; // id del primo campo da generare
const short id_fas = 201+sf.cid2index(S_FAS1);
const short id_con = 201+sf.cid2index(S_CON1);
ca_create_fields(sm, LF_CDC, 1, 2, id_cdc, id_cdc+50); for (int i = 0; i < 2; i++)
ca_create_fields(sm, LF_COMMESSE, 1, 6, id_cms, id_cms+50); {
ca_create_fields(sm, LF_FASI, 1, 10, id_fas, id_fas+50); const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2
ca_create_fields(sm, _use_pdc ? LF_PCON : LF_PCONANA, 1, 14, id_con, id_con+50); if (level == "CDC") // Crea centro di costo
{
if (fasinfo.parent() == LF_CDC)
create_sheet_fields(LF_FASI, y, dlg, fsc_req);
else
{
const bool cdc_req = ini.get_bool("CdcRequired");
create_sheet_fields(LF_CDC, y, dlg, cdc_req);
}
} else
if (level == "CMS") // Crea commessa
{
if (fasinfo.parent() == LF_COMMESSE)
create_sheet_fields(LF_FASI, y, dlg, fsc_req);
else
{
const bool cms_req = ini.get_bool("CmsRequired");
create_sheet_fields(LF_COMMESSE, y, dlg, cms_req);
}
}
}
for (short id = id_con+3; id >= id_cdc; id--) if (fasinfo.levels() > 0 && fasinfo.parent() <= 0)
create_sheet_fields(LF_FASI, y, dlg, fsc_req);
const bool use_pdc = ini.get_bool("UsePdcc");
const bool pdc_req = ini.get_bool("PdciRequired");
create_sheet_fields(use_pdc ? LF_PCON : LF_PCONANA, y, dlg, pdc_req);
for (short id = S_CON4+100; id >= S_CDC1+100; id--)
{ {
const int pos = sm.id2pos(id); const int pos = sm.id2pos(id);
if (pos >= 0) if (pos >= 0)
@ -559,36 +616,6 @@ TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
sf.set_column_header(id, prompt); sf.set_column_header(id, prompt);
sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD)); sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD));
sf.set_column_width(id, (max(3+size, prompt.len()+1)) * CHARX); sf.set_column_width(id, (max(3+size, prompt.len()+1)) * CHARX);
switch (100+(f.dlg()%100))
{
case S_CDC1:
case S_CDC2:
case S_CDC3:
case S_CDC4:
f.check_type(ini.get_bool("CdcRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
case S_CMS1:
case S_CMS2:
case S_CMS3:
case S_CMS4:
f.check_type(ini.get_bool("CmsRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
case S_FAS1:
case S_FAS2:
case S_FAS3:
case S_FAS4:
f.check_type(ini.get_bool("FscRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
case S_CON1:
case S_CON2:
case S_CON3:
case S_CON4:
f.check_type(ini.get_bool("PdciRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
default:
break;
}
} }
else else
{ {
@ -597,6 +624,12 @@ TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
} }
} }
TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
{
create_sheet();
}
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TMovanal_app // TMovanal_app
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -645,26 +678,15 @@ void TMovanal_app::read_rows(const TMask& m)
const TRecord_array& a = mov[LF_RMOVANA]; const TRecord_array& a = mov[LF_RMOVANA];
TSheet_field& sheet = m.sfield(F_RIGHE); TSheet_field& sheet = m.sfield(F_RIGHE);
TMask& sm = sheet.sheet_mask();
sheet.destroy(); sheet.destroy();
_msk->reset_saldi(); _msk->reset_saldi();
for (int i = 1; i <= a.rows(); i++) for (int i = 1; i <= a.rows(); i++)
{ {
const TRectype& rec = a.row(i); const TRectype& rec = a.row(i);
TToken_string& row = sheet.row(i-1); _msk->rec2row(rec, i-1);
const TImporto imp(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO));
_msk->imp2row(imp, row);
row.add(rec.get(RMOVANA_DESCR));
// Calcola le posizioni dei campi multilivello generati
const int pos_cdc = sheet.cid2index(S_CDC1);
const int pos_cms = sheet.cid2index(S_CMS1);
const int pos_fas = sheet.cid2index(S_FAS1);
const int pos_con = sheet.cid2index(S_CON1);
_msk->spezza_campo(rec.get(RMOVANA_CODCCOSTO), row, pos_cdc);
_msk->spezza_campo(rec.get(RMOVANA_CODCMS), row, pos_cms);
_msk->spezza_campo(rec.get(RMOVANA_CODFASE), row, pos_fas);
_msk->spezza_campo(rec.get(RMOVANA_CODCONTO), row, pos_con);
TImporto imp; _msk->row2imp(i-1, imp);
TImporto& sld = _msk->saldo(rec); TImporto& sld = _msk->saldo(rec);
sld -= imp; sld -= imp;
} }

View File

@ -284,12 +284,14 @@ END
STRING S_DESCR 50 STRING S_DESCR 50
BEGIN BEGIN
PROMPT 1 1 "Descrizione " PROMPT 1 1 "Descrizione "
FIELD DESCR
END END
STRING S_CDC1 20 STRING S_CDC1 20
BEGIN BEGIN
PROMPT 1 2 "Cdc 1" PROMPT 1 2 "Cdc 1"
USE LF_CDC USE LF_CDC
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -297,6 +299,7 @@ STRING S_CDC2 20
BEGIN BEGIN
PROMPT 21 2 "Cdc 2" PROMPT 21 2 "Cdc 2"
COPY USE S_CDC1 COPY USE S_CDC1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -304,6 +307,7 @@ STRING S_CDC3 20
BEGIN BEGIN
PROMPT 41 2 "Cdc 3" PROMPT 41 2 "Cdc 3"
COPY USE S_CDC1 COPY USE S_CDC1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -311,6 +315,7 @@ STRING S_CDC4 20
BEGIN BEGIN
PROMPT 61 2 "Cdc 4" PROMPT 61 2 "Cdc 4"
COPY USE S_CDC1 COPY USE S_CDC1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -318,6 +323,7 @@ STRING S_CMS1 20
BEGIN BEGIN
PROMPT 1 3 "Cms 1" PROMPT 1 3 "Cms 1"
USE LF_COMMESSE USE LF_COMMESSE
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -325,6 +331,7 @@ STRING S_CMS2 20
BEGIN BEGIN
PROMPT 21 3 "Cms 2" PROMPT 21 3 "Cms 2"
COPY USE S_CMS1 COPY USE S_CMS1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -332,6 +339,7 @@ STRING S_CMS3 20
BEGIN BEGIN
PROMPT 41 3 "Cms 3" PROMPT 41 3 "Cms 3"
COPY USE S_CMS1 COPY USE S_CMS1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -339,6 +347,7 @@ STRING S_CMS4 20
BEGIN BEGIN
PROMPT 61 3 "Cms 4" PROMPT 61 3 "Cms 4"
COPY USE S_CMS1 COPY USE S_CMS1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -346,6 +355,7 @@ STRING S_FAS1 20
BEGIN BEGIN
PROMPT 1 4 "Fas 1" PROMPT 1 4 "Fas 1"
USE LF_FASI USE LF_FASI
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -353,6 +363,7 @@ STRING S_FAS2 20
BEGIN BEGIN
PROMPT 21 4 "Fas 2" PROMPT 21 4 "Fas 2"
COPY USE S_FAS1 COPY USE S_FAS1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -360,6 +371,7 @@ STRING S_FAS3 20
BEGIN BEGIN
PROMPT 41 4 "Fas 3" PROMPT 41 4 "Fas 3"
COPY USE S_FAS1 COPY USE S_FAS1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -367,6 +379,7 @@ STRING S_FAS4 20
BEGIN BEGIN
PROMPT 61 4 "Fas 4" PROMPT 61 4 "Fas 4"
COPY USE S_FAS1 COPY USE S_FAS1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -374,6 +387,7 @@ STRING S_CON1 20
BEGIN BEGIN
PROMPT 1 5 "Con 1" PROMPT 1 5 "Con 1"
USE LF_PCON USE LF_PCON
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -381,6 +395,7 @@ STRING S_CON2 20
BEGIN BEGIN
PROMPT 21 5 "Con 2" PROMPT 21 5 "Con 2"
COPY USE S_CON1 COPY USE S_CON1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -388,6 +403,7 @@ STRING S_CON3 20
BEGIN BEGIN
PROMPT 41 5 "Con 3" PROMPT 41 5 "Con 3"
COPY USE S_CON1 COPY USE S_CON1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END
@ -395,6 +411,7 @@ STRING S_CON4 20
BEGIN BEGIN
PROMPT 61 5 "Con 4" PROMPT 61 5 "Con 4"
COPY USE S_CON1 COPY USE S_CON1
CHECKTYPE NORMAL
GROUP 1 GROUP 1
END END

View File

@ -47,7 +47,7 @@ const TString& TMultilevel_code_info::prompt(int level) const
const TFieldref& TMultilevel_code_info::fieldref(int level, int key) const const TFieldref& TMultilevel_code_info::fieldref(int level, int key) const
{ {
const TArray& a = key == 1 ? _key1_fields : _key2_fields; const TArray& a = key <= 1 ? _key1_fields : _key2_fields;
const TFieldref& fr = (const TFieldref&)a[level]; const TFieldref& fr = (const TFieldref&)a[level];
return fr; return fr;
} }
@ -68,10 +68,10 @@ bool TMultilevel_code_info::get_cfg_vars(TString& key, TString& des) const
{ {
switch (_logicnum) switch (_logicnum)
{ {
case LF_PCONANA: key = "Pdci"; des = "PdciDes"; break; case LF_PCONANA : key = "Pdci"; des = "PdciDes"; break;
case LF_CDC : key = "CdC"; des = "CdCDes"; break; case LF_CDC : key = "CdC"; des = "CdCDes"; break;
case LF_COMMESSE:key = "Cms"; des = "CmsDes"; break; case LF_COMMESSE: key = "Cms"; des = "CmsDes"; break;
case LF_FASI : key = "Fsc"; des = "FscDes"; break; case LF_FASI : key = "Fsc"; des = "FscDes"; break;
default: break; default: break;
} }
return key.not_empty(); return key.not_empty();
@ -88,21 +88,21 @@ void TMultilevel_code_info::add_fieldref(int k, int from, int to)
a.add(fr); a.add(fr);
} }
TMultilevel_code_info::TMultilevel_code_info(int logicnum) : _logicnum(logicnum) TMultilevel_code_info::TMultilevel_code_info(int logicnum) : _logicnum(logicnum), _parentnum(0)
{ {
if (logicnum == LF_PCON) if (_logicnum == LF_PCON)
{ {
_key1_fields.add(new TFieldref(PCN_GRUPPO, LF_PCON)); _key1_fields.add(new TFieldref(PCN_GRUPPO, LF_PCON));
_picture.add("999"); _picture.add("999");
_prompt.add("Gruppo"); _prompt.add(TR("Gruppo"));
_key1_fields.add(new TFieldref(PCN_CONTO, LF_PCON)); _key1_fields.add(new TFieldref(PCN_CONTO, LF_PCON));
_picture.add("999"); _picture.add("999");
_prompt.add("Conto"); _prompt.add(TR("Conto"));
_key1_fields.add(new TFieldref(PCN_SOTTOCONTO, LF_PCON)); _key1_fields.add(new TFieldref(PCN_SOTTOCONTO, LF_PCON));
_picture.add("999999"); _picture.add("999999");
_prompt.add("Sottoconto"); _prompt.add(TR("Sottoconto"));
_key2_fields.add(new TFieldref(PCN_DESCR, LF_PCON)); _key2_fields.add(new TFieldref(PCN_DESCR, LF_PCON));
} }
@ -110,6 +110,27 @@ TMultilevel_code_info::TMultilevel_code_info(int logicnum) : _logicnum(logicnum)
{ {
TConfig cfg(CONFIG_DITTA); TConfig cfg(CONFIG_DITTA);
if (logicnum == LF_FASI)
{
const TString& father = cfg.get("FathFasi");
if (father == "CMS")
_parentnum = LF_COMMESSE; else
if (father == "CDC")
_parentnum = LF_CDC;
if (_parentnum != 0)
{
const TMultilevel_code_info& info = ca_multilevel_code_info(_parentnum);
for (int i = 0; i < info.levels(); i++)
{
_prompt.add(info.prompt(i));
_picture.add(info.picture(i));
TFieldref fr = info.fieldref(i);
fr.set_name("CODCMSFAS");
_key1_fields.add(fr);
}
}
}
TString16 keyvar, desvar; TString16 keyvar, desvar;
get_cfg_vars(keyvar, desvar); get_cfg_vars(keyvar, desvar);
@ -133,7 +154,7 @@ TMultilevel_code_info::TMultilevel_code_info(int logicnum) : _logicnum(logicnum)
} }
} }
const TMultilevel_code_info& multilevel_code_info(int logicnum) const TMultilevel_code_info& ca_multilevel_code_info(int logicnum)
{ {
static TArray* cache = NULL; static TArray* cache = NULL;
if (cache == NULL) if (cache == NULL)
@ -150,7 +171,7 @@ const TMultilevel_code_info& multilevel_code_info(int logicnum)
bool ca_test_multilevel_field(TEdit_field& fld, int level) bool ca_test_multilevel_field(TEdit_field& fld, int level)
{ {
const int logic = fld.browse()->cursor()->curr().num(); const int logic = fld.browse()->cursor()->curr().num();
const TMultilevel_code_info& info = multilevel_code_info(logic); const TMultilevel_code_info& info = ca_multilevel_code_info(logic);
const TString& pic = info.picture(level); const TString& pic = info.picture(level);
const TString& val = fld.get(); const TString& val = fld.get();
@ -163,7 +184,7 @@ bool ca_test_multilevel_field(TEdit_field& fld, int level)
{ {
case 'A': ok = (v >= '0' && v <= '9') || (v >= 'A' && v <= 'Z'); break; case 'A': ok = (v >= '0' && v <= '9') || (v >= 'A' && v <= 'Z'); break;
case '0': case '0':
case '9': ok = v >= '0' && v <= '9'; break; case '9': ok = (v >= '0' && v <= '9'); break;
default : break; default : break;
} }
} }
@ -178,6 +199,215 @@ bool ca_test_multilevel_field(TEdit_field& fld, int level)
return ok; return ok;
} }
///////////////////////////////////////////////////////////
// Utilities
///////////////////////////////////////////////////////////
void ca_append_select_clause(ostream& out, int level, int logic)
{
TString str;
if (logic == LF_PCON)
{
switch (level)
{
case 0: str = "CONTO==\"\""; break;
case 1: str = "SOTTOCONTO==\"\""; break;
default: break;
}
}
else
{
const TMultilevel_code_info& mci = ca_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 ca_append_run_clause(ostream& out, int logicnum)
{
const TRectype r(logicnum);
TString app; r.get_relapp(app);
if (app.not_empty())
out << "AD RU " << app << endl;
}
void ca_create_browse1(TEdit_field& kfld, int level, int logic, short key_id, short des_id)
{
const TMultilevel_code_info& main_info = ca_multilevel_code_info(logic);
if (logic == LF_FASI)
{
const int par = main_info.parent();
if (par > 0)
{
const TMultilevel_code_info& parinfo = ca_multilevel_code_info(par);
if (level < parinfo.levels())
logic = par;
}
}
const TMultilevel_code_info& mci = ca_multilevel_code_info(logic);
TFilename tmp; tmp.tempdir(); tmp.add("tmp.msk");
ofstream out(tmp);
out << "US " << logic << endl;
ca_append_select_clause(out, level, logic);
ca_append_run_clause(out, 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);
const int length = field.to() - field.from();
out << "IN " << field << ' ' << (key_id+i) << endl;
out << "DI \"" << prompt;
if (length > prompt.len())
out << '@' << length;
out << "\" " << field << endl;
out << "OU " << (key_id+i) << ' ' << 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 " << main_info.fieldref(level) << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
void ca_create_browse2(TEdit_field& kfld, int level, int logic, short key_id, short des_id)
{
const TMultilevel_code_info& main_info = ca_multilevel_code_info(logic);
if (logic == LF_FASI)
{
const int par = main_info.parent();
if (par > 0)
{
const TMultilevel_code_info& parinfo = ca_multilevel_code_info(par);
if (level < parinfo.levels())
logic = par;
}
}
const TMultilevel_code_info& mci = ca_multilevel_code_info(logic);
const TFieldref& field = mci.fieldref(0, 2);
TString str2; str2 << field;
TFilename tmp; tmp.tempdir(); tmp.add("tmp.msk");
ofstream out(tmp);
out << "US " << logic << " KE 2" << endl;
ca_append_select_clause(out, level, logic);
ca_append_run_clause(out, logic);
out << "IN " << str2 << ' ' << kfld.dlg() << endl;
out << "DI \"" << TR("Descrizione") << "@50\" " << str2 << endl;
out << "OU " << kfld.dlg() << ' ' << str2 << endl;
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);
const int length = field.to() - field.from();
out << "DI \"" << prompt;
if (length > prompt.len())
{
out << '@' << length;
if (mci.is_numeric_picture(i))
out << 'R';
}
out << "\" " << field << endl;
out << "OU " << (key_id+i) << ' ' << field << endl;
}
out << "CH NO" << endl;
if (level == main_info.levels()-1)
out << "FI " << main_info.fieldref(0, 2) << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
int ca_create_fields(TMask& msk, int logicnum, int x, int y,
short key_id, short des_id, unsigned int mode)
{
const TMultilevel_code_info& mci = ca_multilevel_code_info(logicnum);
int maxkeylen = 0, maxdeslen = 0;
for (int level = 0; level < mci.levels(); 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;
}
maxdeslen++;
const int tab0 = x;
const int tab1 = tab0 + maxdeslen + maxkeylen + 4;
if (mode == 0 || (mode & 0x1) != 0)
{
for (int i = 0; i < mci.levels(); i++)
{
const short kid = key_id+i;
const TString& picture = mci.picture(i);
TString80 prompt = mci.prompt(i);
prompt.left_just(maxdeslen);
const char* flags = picture[0] == '0' ? "BUZ" : "BU";
TEdit_field* kfld = NULL;
if (mci.is_numeric_picture(i)) // 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);
ca_create_browse1(*kfld, i, logicnum, key_id, des_id);
if (mode & 0x1)
kfld->set_key(1);
}
}
if (mode == 0 || (mode & 0x2) != 0)
{
for (int i = 0; i < mci.levels(); i++)
{
const short did = des_id+i;
TEdit_field& dfld = msk.add_string(did, 0, "", tab1, y+i, 50, "B", 72+tab0-tab1);
ca_create_browse2(dfld, i, logicnum, key_id, des_id);
if (mode & 0x2)
dfld.set_key(2);
}
}
return mci.levels();
}
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TAnal_tree // TAnal_tree
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -321,7 +551,7 @@ void TSimple_anal_msk::read(const char* name)
if (delta > 0) if (delta > 0)
{ {
const TFilename outname = "anal.msk"; TFilename outname; outname.tempdir(); outname.add("tmp.msk");
TFilename inpname = name; inpname.ext("msk"); TFilename inpname = name; inpname.ext("msk");
inpname.custom_path(); inpname.custom_path();
@ -407,7 +637,7 @@ int TSimple_anal_msk::fieldrefs(int k) const
int n = 1; int n = 1;
if (k == 1) if (k == 1)
{ {
const TMultilevel_code_info& mci = multilevel_code_info(get_logicnum()); const TMultilevel_code_info& mci = ca_multilevel_code_info(get_logicnum());
n = mci.levels(); n = mci.levels();
} }
return n; return n;
@ -415,7 +645,7 @@ int TSimple_anal_msk::fieldrefs(int k) const
const TFieldref& TSimple_anal_msk::fieldref(int n, int k) const const TFieldref& TSimple_anal_msk::fieldref(int n, int k) const
{ {
const TMultilevel_code_info& mci = multilevel_code_info(get_logicnum()); const TMultilevel_code_info& mci = ca_multilevel_code_info(get_logicnum());
return mci.fieldref(n, k); return mci.fieldref(n, k);
} }
@ -442,143 +672,14 @@ const TToken_string& TSimple_anal_msk::get_key_value(int c) const
return val; return val;
} }
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 == 0 ? "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() int TSimple_anal_msk::create_key_fields()
{ {
const TMultilevel_code_info& mci = multilevel_code_info(get_logicnum()); const int logic = get_logicnum();
const short kid = get_field_id(0, 1);
int maxkeylen = 0, maxdeslen = 0; const short did = get_field_id(0, 2);
for (int level = 0; level < mci.levels(); level++) const int x = compute_offset()+2;
{ const int y = 1;
const TString& prompt = mci.prompt(level); return ca_create_fields(*this, logic, x, y, kid, did, 0x3);
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 (mci.is_numeric_picture(i)) // Numeric
kfld = &add_number(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;
} }
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -587,7 +688,7 @@ int TSimple_anal_msk::create_key_fields()
const TToken_string& TAnal_tree::curr_of_file() const const TToken_string& TAnal_tree::curr_of_file() const
{ {
const TMultilevel_code_info& mci = multilevel_code_info(_file->num()); const TMultilevel_code_info& mci = ca_multilevel_code_info(_file->num());
const TRectype& rec = _file->curr(); const TRectype& rec = _file->curr();
TToken_string& k = get_tmp_string(); TToken_string& k = get_tmp_string();
@ -627,7 +728,7 @@ int TAnal_tree::curr_level() const
int TAnal_tree::max_level() const int TAnal_tree::max_level() const
{ {
const TMultilevel_code_info& mci = multilevel_code_info(_file->num()); const TMultilevel_code_info& mci = ca_multilevel_code_info(_file->num());
return mci.levels(); return mci.levels();
} }
@ -744,7 +845,7 @@ bool TAnal_tree::goto_father()
TRectype& rec = _file->curr(); TRectype& rec = _file->curr();
rec.zero(); rec.zero();
const TMultilevel_code_info& mci = multilevel_code_info(_file->num()); const TMultilevel_code_info& mci = ca_multilevel_code_info(_file->num());
for (int i = 0; i < lev-1; i++) for (int i = 0; i < lev-1; i++)
{ {
const char* val = _curr._key.get(i); const char* val = _curr._key.get(i);
@ -793,7 +894,7 @@ bool TAnal_tree::get_description(TString& desc) const
const int lev = _curr.level(); const int lev = _curr.level();
if (lev > 0) if (lev > 0)
{ {
const TMultilevel_code_info& mci = multilevel_code_info(_file->num()); const TMultilevel_code_info& mci = ca_multilevel_code_info(_file->num());
const TFieldref& fld1 = mci.fieldref(lev-1, 1); const TFieldref& fld1 = mci.fieldref(lev-1, 1);
const TFieldref& fld2 = mci.fieldref(0, 2); const TFieldref& fld2 = mci.fieldref(0, 2);
const TRectype& rec = _file->curr(); const TRectype& rec = _file->curr();
@ -887,7 +988,7 @@ void TAnal_app::init_query_mode(TMask& mask)
const short did = m.get_field_id(i, 2); const short did = m.get_field_id(i, 2);
TEdit_field& d = m.efield(did); TEdit_field& d = m.efield(did);
d.show(); d.enable(); d.show(); d.enable();
d.set_field(EMPTY_STRING); // d.set_field(EMPTY_STRING);
d.enable_check(); d.enable_check();
} }
} }
@ -1087,175 +1188,3 @@ TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA)
///////////////////////////////////////////////////////////
// Utilities
///////////////////////////////////////////////////////////
void ca_append_select_clause(ostream& out, int level, int logic)
{
TString str;
if (logic == LF_PCON)
{
switch (level)
{
case 0: str = "CONTO==\"\""; break;
case 1: str = "SOTTOCONTO==\"\""; break;
default: break;
}
}
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 ca_append_run_clause(ostream& out, int logicnum)
{
const TRectype r(logicnum);
TString app; r.get_relapp(app);
if (app.not_empty())
out << "AD RU " << app << endl;
}
void ca_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;
ca_append_select_clause(out, level, logic);
ca_append_run_clause(out, 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);
const int length = field.to() - field.from();
out << "IN " << field << ' ' << (key_id+i) << endl;
out << "DI \"" << prompt;
if (length > prompt.len())
out << '@' << length;
out << "\" " << field << endl;
out << "OU " << (key_id+i) << ' ' << 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();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
void ca_create_browse2(TEdit_field& kfld, int level, int logic, short key_id, short des_id)
{
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" << endl;
ca_append_select_clause(out, level, logic);
ca_append_run_clause(out, logic);
out << "IN " << str2 << ' ' << kfld.dlg() << endl;
out << "DI \"" << TR("Descrizione") << "@50\" " << str2 << endl;
out << "OU " << kfld.dlg() << ' ' << str2 << endl;
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);
const int length = field.to() - field.from();
out << "DI \"" << prompt;
if (length > prompt.len())
{
out << '@' << length;
if (mci.is_numeric_picture(i))
out << 'R';
}
out << "\" " << field << endl;
out << "OU " << (key_id+i) << ' ' << 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 ca_create_fields(TMask& msk, int logicnum, int x, int y,
short key_id, short des_id)
{
const TMultilevel_code_info& mci = multilevel_code_info(logicnum);
int maxkeylen = 0, maxdeslen = 0;
for (int level = 0; level < mci.levels(); 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;
}
maxdeslen++;
const int tab0 = x;
const int tab1 = tab0 + maxdeslen + maxkeylen + 4;
for (int i = 0; i < mci.levels(); i++)
{
const short kid = key_id+i;
const TString& picture = mci.picture(i);
TString80 prompt = mci.prompt(i);
prompt.left_just(maxdeslen);
const char* flags = picture[0] == '0' ? "BUZ" : "BU";
TEdit_field* kfld = NULL;
if (mci.is_numeric_picture(i)) // 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);
ca_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);
ca_create_browse2(dfld, i, logicnum, key_id, des_id);
dfld.set_group(2);
}
return mci.levels();
}

View File

@ -15,11 +15,12 @@
class TMultilevel_code_info : public TObject class TMultilevel_code_info : public TObject
{ {
int _logicnum; int _logicnum; // Logic number of main file
TString_array _prompt; TString_array _prompt; // Prompts of mask fields
TString_array _picture; TString_array _picture; // Pictures of mask fields
TArray _key1_fields; TArray _key1_fields; // TFieldrefs of key 1 mask fields
TArray _key2_fields; TArray _key2_fields; // TFieldrefs of key 2 mask fields
int _parentnum; // Logic number of parent file (LF_FASI only)
protected: protected:
bool get_cfg_vars(TString& key, TString& des) const; bool get_cfg_vars(TString& key, TString& des) const;
@ -33,6 +34,7 @@ public:
bool is_numeric_picture(int level) const; bool is_numeric_picture(int level) const;
const TString& prompt(int level) const; const TString& prompt(int level) const;
const TFieldref& fieldref(int level, int key = 1) const; const TFieldref& fieldref(int level, int key = 1) const;
int parent() const { return _parentnum; }
TMultilevel_code_info(int logicnum); TMultilevel_code_info(int logicnum);
virtual ~TMultilevel_code_info() { } virtual ~TMultilevel_code_info() { }
@ -40,8 +42,7 @@ public:
const TMultilevel_code_info& ca_multilevel_code_info(int logicnum); const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
bool ca_test_multilevel_field(TEdit_field& fld, int level); bool ca_test_multilevel_field(TEdit_field& fld, int level);
int ca_create_fields(TMask& msk, int logicnum, int x, int y, short key_id, short des_id); int ca_create_fields(TMask& msk, int logicnum, int x, int y, short key_id, short des_id, unsigned int mode = 0x0);
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TSimple_anal_msk // TSimple_anal_msk