Patch level : 2.2
Files correlati : ca2 Ricompilazione Demo : [ ] Commento : Aggiunto programma gestione movimenti anali...tici git-svn-id: svn://10.65.10.50/trunk@12651 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
d1fab0f6de
commit
dcc9ea95d7
@ -27,7 +27,6 @@ BEGIN
|
||||
FIELD SOSPESO
|
||||
END
|
||||
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
ENDMASK
|
||||
|
179
ca/ca0800.cpp
179
ca/ca0800.cpp
@ -5,171 +5,6 @@
|
||||
#include "ca0800a.h"
|
||||
#include "calib01.h"
|
||||
|
||||
void 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 append_run_clause(ostream& out, int logicnum)
|
||||
{
|
||||
const TRectype r(logicnum);
|
||||
TString app; r.get_relapp(app);
|
||||
if (app.not_empty())
|
||||
out << "AD RU " << app << endl;
|
||||
}
|
||||
|
||||
void create_browse1(TEdit_field& kfld, int level, 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, logic);
|
||||
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 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;
|
||||
append_select_clause(out, level, logic);
|
||||
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;
|
||||
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 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 (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 mci.levels();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TRiparti_msk
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -249,7 +84,7 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
|
||||
if (level >= 0)
|
||||
{
|
||||
TEdit_field& fld = (TEdit_field&)o;
|
||||
return test_multilevel_field(fld, level);
|
||||
return ca_test_multilevel_field(fld, level);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -267,10 +102,10 @@ 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, 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);
|
||||
ca_create_fields(sm, LF_CDC, 1, 1, 202, 252);
|
||||
ca_create_fields(sm, LF_COMMESSE, 1, 5, 206, 256);
|
||||
ca_create_fields(sm, LF_FASI, 1, 9, 210, 260);
|
||||
ca_create_fields(sm, use_pdc ? LF_PCON : LF_PCONANA, 1, 13, 214, 264);
|
||||
|
||||
for (short id = 217; id >= 202; id--)
|
||||
{
|
||||
@ -293,8 +128,8 @@ void TRiparti_msk::create_sheet()
|
||||
|
||||
TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a")
|
||||
{
|
||||
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);
|
||||
ca_create_fields(*this, LF_CDC, 2, 5, F_CODCDC_1, F_DESCDC_1);
|
||||
ca_create_fields(*this, LF_COMMESSE, 2, 11, F_CODCMS_1, F_DESCMS_1);
|
||||
create_sheet();
|
||||
}
|
||||
|
||||
|
@ -230,21 +230,21 @@ END
|
||||
STRING 103 20
|
||||
BEGIN
|
||||
PROMPT 1 2 "Cdc2 "
|
||||
USE LF_CDC
|
||||
COPY USE 102
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 104 20
|
||||
BEGIN
|
||||
PROMPT 1 3 "Cdc3 "
|
||||
USE LF_CDC
|
||||
COPY USE 102
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 105 20
|
||||
BEGIN
|
||||
PROMPT 1 4 "Cdc4 "
|
||||
USE LF_CDC
|
||||
COPY USE 102
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
@ -258,21 +258,21 @@ END
|
||||
STRING 107 20
|
||||
BEGIN
|
||||
PROMPT 1 6 "Cms2 "
|
||||
USE LF_COMMESSE
|
||||
COPY USE 106
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 108 20
|
||||
BEGIN
|
||||
PROMPT 1 7 "Cms3 "
|
||||
USE LF_COMMESSE
|
||||
COPY USE 106
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 109 20
|
||||
BEGIN
|
||||
PROMPT 1 8 "Cms4 "
|
||||
USE LF_COMMESSE
|
||||
COPY USE 106
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
@ -286,21 +286,21 @@ END
|
||||
STRING 111 10
|
||||
BEGIN
|
||||
PROMPT 1 10 "Fas2 "
|
||||
COPY ALL 110
|
||||
COPY USE 110
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 112 10
|
||||
BEGIN
|
||||
PROMPT 1 11 "Fas3 "
|
||||
COPY ALL 110
|
||||
COPY USE 110
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 113 10
|
||||
BEGIN
|
||||
PROMPT 1 12 "Fas4 "
|
||||
COPY ALL 110
|
||||
COPY USE 110
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
@ -314,21 +314,21 @@ END
|
||||
STRING 115 20
|
||||
BEGIN
|
||||
PROMPT 27 14 "Conto "
|
||||
COPY ALL 114
|
||||
COPY USE 114
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 116 20
|
||||
BEGIN
|
||||
PROMPT 46 14 "Sottoconto "
|
||||
COPY ALL 114
|
||||
COPY USE 114
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING 117 20
|
||||
BEGIN
|
||||
PROMPT 1 15 "Sottoconticino "
|
||||
COPY ALL 114
|
||||
COPY USE 114
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
|
15
ca/ca2.cpp
Executable file
15
ca/ca2.cpp
Executable file
@ -0,0 +1,15 @@
|
||||
#include <xvt.h>
|
||||
|
||||
#include "ca2.h"
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
const int r = (argc > 1) ? argv[1][1] - '0' : 0;
|
||||
switch (r)
|
||||
{
|
||||
case 1: break;
|
||||
default: ca2100(argc,argv); break; // gestione movimenti
|
||||
}
|
||||
exit(0);
|
||||
return 0;
|
||||
}
|
367
ca/ca2100.cpp
Executable file
367
ca/ca2100.cpp
Executable file
@ -0,0 +1,367 @@
|
||||
#include <automask.h>
|
||||
#include <defmask.h>
|
||||
#include <recarray.h>
|
||||
#include <relapp.h>
|
||||
|
||||
#include "ca2.h"
|
||||
#include "ca2100a.h"
|
||||
#include "calib01.h"
|
||||
|
||||
#include "../cg/cglib01.h"
|
||||
|
||||
#include "movana.h"
|
||||
#include "rmovana.h"
|
||||
|
||||
|
||||
class TMovanal_msk : public TAutomask
|
||||
{
|
||||
protected:
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly);
|
||||
virtual bool can_be_closed() const;
|
||||
|
||||
public:
|
||||
TMovanal_msk();
|
||||
virtual ~TMovanal_msk() { }
|
||||
};
|
||||
|
||||
bool TMovanal_msk::can_be_closed() const
|
||||
{
|
||||
return !get_bool(F_BLOCCATO);
|
||||
}
|
||||
|
||||
bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
switch (o.dlg())
|
||||
{
|
||||
case F_DATAREG:
|
||||
if ((e == fe_modify || e == fe_close) && !query_mode())
|
||||
{
|
||||
const TDate datareg = o.get();
|
||||
const TEsercizi_contabili ec;
|
||||
if (ec.date2esc(datareg) <= 0)
|
||||
return error_box(((TEdit_field&)o).get_warning());
|
||||
if (e == fe_close && field(F_DATACOMP).empty())
|
||||
set(F_DATACOMP, datareg);
|
||||
}
|
||||
break;
|
||||
case F_DATACOMP:
|
||||
if ((e == fe_modify || e == fe_close) && !query_mode())
|
||||
{
|
||||
const TDate datareg = get(F_DATAREG);
|
||||
TDate datacomp = o.get();
|
||||
if (!datacomp.ok())
|
||||
datacomp = datareg;
|
||||
if (datacomp > datareg)
|
||||
return error_box(TR("La data di competenza non puo' superare la data di registrazione"));
|
||||
|
||||
const TEsercizi_contabili ec;
|
||||
const int ae = ec.date2esc(datacomp);
|
||||
if (ae > 0)
|
||||
set(F_ANNOES, ae, 0x1);
|
||||
else
|
||||
return error_box(((TEdit_field&)o).get_warning());
|
||||
|
||||
const int ar = ec.date2esc(datareg);
|
||||
const int ap = ec.pred(ar);
|
||||
if (ae != ar && ae != ap)
|
||||
return error_box(FR("La data di competenza deve appartenere all'esercizio in corso o al precedente"));
|
||||
}
|
||||
break;
|
||||
case F_TOTDOC:
|
||||
if (e == fe_close)
|
||||
{
|
||||
const real imp = o.get();
|
||||
const char sez = get(F_SEZIONE)[0];
|
||||
const TImporto totdoc(sez, imp);
|
||||
TImporto totrig;
|
||||
TSheet_field& sf = sfield(F_RIGHE);
|
||||
FOR_EACH_SHEET_ROW(sf, i, row)
|
||||
{
|
||||
const real dare = row->get(0);
|
||||
const real avere = row->get();
|
||||
TImporto imp;
|
||||
if (dare.is_zero())
|
||||
imp.set('A', avere);
|
||||
else
|
||||
imp.set('D', dare);
|
||||
totrig += imp;
|
||||
}
|
||||
|
||||
if (totrig != totdoc)
|
||||
return error_box(FR("Il totale delle righe e' %s %s"),
|
||||
totrig.valore().string(),
|
||||
totrig.sezione() == 'D' ? TR("Dare") : TR("Avere"));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
|
||||
{
|
||||
TSheet_field& sf = sfield(F_RIGHE);
|
||||
TMask& sm = sf.sheet_mask();
|
||||
sm.hide(-1); // Nasconde tutti campi fittizi
|
||||
|
||||
TConfig ini(CONFIG_DITTA, "ca");
|
||||
const bool use_pdc = ini.get_bool("UsePdcc");
|
||||
|
||||
const short id_cdc = 201+sf.cid2index(S_CDC1);
|
||||
const short id_cms = 201+sf.cid2index(S_CMS1);
|
||||
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);
|
||||
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);
|
||||
ca_create_fields(sm, use_pdc ? LF_PCON : LF_PCONANA, 1, 14, id_con, id_con+50);
|
||||
|
||||
for (short id = id_con+3; id >= id_cdc; id--)
|
||||
{
|
||||
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_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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TMovanal_app : public TRelation_application
|
||||
{
|
||||
TRelation* _rel;
|
||||
TMovanal_msk* _msk;
|
||||
|
||||
protected:
|
||||
virtual bool user_create();
|
||||
virtual bool user_destroy();
|
||||
virtual TMask* get_mask(int);
|
||||
virtual TRelation* get_relation() const;
|
||||
|
||||
const TString& somma_campi(TToken_string& row, int first) const;
|
||||
void spezza_campo(const TString& str, TToken_string& row, int first) const;
|
||||
int write_rows(const TMask& m);
|
||||
void read_rows(const TMask& m);
|
||||
|
||||
virtual bool protected_record(TRectype& rec);
|
||||
virtual int write(const TMask& m);
|
||||
virtual int rewrite(const TMask& m);
|
||||
virtual int read(TMask& m);
|
||||
|
||||
virtual void init_query_mode(TMask& m);
|
||||
virtual void init_insert_mode(TMask& m);
|
||||
virtual void init_modify_mode(TMask& m);
|
||||
};
|
||||
|
||||
TMask* TMovanal_app::get_mask(int)
|
||||
{
|
||||
return _msk;
|
||||
}
|
||||
|
||||
TRelation* TMovanal_app::get_relation() const
|
||||
{
|
||||
return _rel;
|
||||
}
|
||||
|
||||
const TString& TMovanal_app::somma_campi(TToken_string& row, int first) const
|
||||
{
|
||||
TSheet_field& sheet = _msk->sfield(F_RIGHE);
|
||||
TMask& m = sheet.sheet_mask();
|
||||
|
||||
const short id = 201 + first;
|
||||
TString& str = get_tmp_string(20);
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
TString80 token = row.get(first+i);
|
||||
if (m.id2pos(id+i) < 0)
|
||||
break;
|
||||
const TEdit_field& fld = m.efield(id+i);
|
||||
token.left_just(fld.size());
|
||||
str << token;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
int TMovanal_app::write_rows(const TMask& m)
|
||||
{
|
||||
TRecord_array a(LF_RMOVANA, RMOVANA_NUMRIG);
|
||||
TRectype* key = new TRectype(LF_RMOVANA);
|
||||
key->put(RMOVANA_NUMREG, m.get(F_NUMREG));
|
||||
a.set_key(key);
|
||||
|
||||
TSheet_field& sheet = _msk->sfield(F_RIGHE);
|
||||
|
||||
// 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);
|
||||
|
||||
// Scandisce lo sheet e riempie il recarray
|
||||
FOR_EACH_SHEET_ROW(sheet, i, row)
|
||||
{
|
||||
TRectype& rec = a.row(i+1, true); // Crea una riga nuova
|
||||
rec.put(RMOVANA_ANNOES, m.get(F_ANNOES));
|
||||
rec.put(RMOVANA_DATAREG, m.get(F_DATAREG));
|
||||
rec.put(RMOVANA_DESCR, row->get(sheet.cid2index(S_DESCR)));
|
||||
|
||||
const real dare = row->get(0), avere = row->get();
|
||||
if (!avere.is_zero())
|
||||
{
|
||||
rec.put(RMOVANA_SEZIONE, 'A');
|
||||
rec.put(RMOVANA_IMPORTO, avere);
|
||||
}
|
||||
else
|
||||
{
|
||||
rec.put(RMOVANA_SEZIONE, 'D');
|
||||
rec.put(RMOVANA_IMPORTO, dare);
|
||||
}
|
||||
rec.put(RMOVANA_CODCCOSTO, somma_campi(*row, pos_cdc));
|
||||
rec.put(RMOVANA_CODCMS, somma_campi(*row, pos_cms));
|
||||
rec.put(RMOVANA_CODFASE, somma_campi(*row, pos_fas));
|
||||
rec.put(RMOVANA_CODCONTO, somma_campi(*row, pos_con));
|
||||
}
|
||||
a.rewrite();
|
||||
return NOERR;
|
||||
}
|
||||
|
||||
void TMovanal_app::spezza_campo(const TString& str, TToken_string& row, int first) const
|
||||
{
|
||||
TSheet_field& sheet = _msk->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;
|
||||
}
|
||||
}
|
||||
|
||||
void TMovanal_app::read_rows(const TMask& m)
|
||||
{
|
||||
TRectype key (LF_RMOVANA);
|
||||
key.put(RMOVANA_NUMREG, _msk->get(F_NUMREG));
|
||||
TRecord_array a(key, RMOVANA_NUMRIG);
|
||||
|
||||
TSheet_field& sheet = m.sfield(F_RIGHE);
|
||||
sheet.destroy();
|
||||
for (int i = 1; i <= a.rows(); i++)
|
||||
{
|
||||
const TRectype& rec = a.row(i);
|
||||
TToken_string& row = sheet.row(i-1);
|
||||
const char sez = rec.get_char(RMOVANA_SEZIONE);
|
||||
const real imp = rec.get(RMOVANA_IMPORTO);
|
||||
row.add(sez == 'D' ? imp.string() : "");
|
||||
row.add(sez == 'A' ? imp.string() : "");
|
||||
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);
|
||||
spezza_campo(rec.get(RMOVANA_CODCCOSTO), row, pos_cdc);
|
||||
spezza_campo(rec.get(RMOVANA_CODCMS), row, pos_cms);
|
||||
spezza_campo(rec.get(RMOVANA_CODFASE), row, pos_fas);
|
||||
spezza_campo(rec.get(RMOVANA_CODCONTO), row, pos_con);
|
||||
}
|
||||
}
|
||||
|
||||
bool TMovanal_app::protected_record(TRectype& rec)
|
||||
{
|
||||
return rec.get_bool(MOVANA_BLOCCATO);
|
||||
}
|
||||
|
||||
int TMovanal_app::write(const TMask& m)
|
||||
{
|
||||
int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR;
|
||||
if (err == NOERR)
|
||||
{
|
||||
err = TRelation_application::write(m);
|
||||
if (err == NOERR)
|
||||
write_rows(m);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int TMovanal_app::rewrite(const TMask& m)
|
||||
{
|
||||
int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR;
|
||||
if (err == NOERR)
|
||||
{
|
||||
err = TRelation_application::rewrite(m);
|
||||
if (err == NOERR)
|
||||
write_rows(m);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int TMovanal_app::read(TMask& m)
|
||||
{
|
||||
int err = TRelation_application::read(m);
|
||||
if (err == NOERR)
|
||||
{
|
||||
read_rows(m);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
void TMovanal_app::init_query_mode(TMask& m)
|
||||
{
|
||||
m.enable(F_BLOCCATO);
|
||||
m.enable(DLG_SAVEREC);
|
||||
m.enable(DLG_QUIT);
|
||||
}
|
||||
|
||||
void TMovanal_app::init_insert_mode(TMask& m)
|
||||
{
|
||||
m.enable(F_BLOCCATO);
|
||||
m.enable(DLG_SAVEREC);
|
||||
}
|
||||
|
||||
void TMovanal_app::init_modify_mode(TMask& m)
|
||||
{
|
||||
const bool unlocked = m.can_be_closed();
|
||||
m.enable(F_BLOCCATO, unlocked);
|
||||
m.enable(DLG_SAVEREC, unlocked);
|
||||
m.enable(DLG_QUIT, unlocked);
|
||||
}
|
||||
|
||||
bool TMovanal_app::user_create()
|
||||
{
|
||||
_rel = new TRelation(LF_MOVANA);
|
||||
_msk = new TMovanal_msk;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TMovanal_app::user_destroy()
|
||||
{
|
||||
delete _msk; _msk = NULL;
|
||||
delete _rel; _rel = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
int ca2100(int argc, char* argv[])
|
||||
{
|
||||
TMovanal_app app;
|
||||
app.run(argc, argv, "Movimenti analitici");
|
||||
return 0;
|
||||
}
|
44
ca/ca2100a.h
Executable file
44
ca/ca2100a.h
Executable file
@ -0,0 +1,44 @@
|
||||
#define F_NUMREG 101
|
||||
#define F_ANNOES 102
|
||||
#define F_DESCR 103
|
||||
#define F_DATAREG 104
|
||||
#define F_DATACOMP 105
|
||||
#define F_DATADOC 106
|
||||
#define F_CODDITTA 107
|
||||
#define F_RAGSOC 108
|
||||
#define F_TIPODOC 109
|
||||
#define F_SEZIONE 110
|
||||
#define F_TOTDOC 111
|
||||
#define F_NUMREGCG 112
|
||||
#define F_CODCAUS 113
|
||||
#define F_DESCAUS 114
|
||||
#define F_DARE 115
|
||||
#define F_AVERE 116
|
||||
#define F_BLOCCATO 117
|
||||
|
||||
#define F_NUMREG2 201
|
||||
#define F_ANNOES2 202
|
||||
#define F_DATAREG2 203
|
||||
#define F_DESCR2 204
|
||||
#define F_RIGHE 300
|
||||
|
||||
|
||||
#define S_DARE 101
|
||||
#define S_AVERE 102
|
||||
#define S_DESCR 103
|
||||
#define S_CDC1 104
|
||||
#define S_CDC2 105
|
||||
#define S_CDC3 106
|
||||
#define S_CDC4 107
|
||||
#define S_CMS1 108
|
||||
#define S_CMS2 109
|
||||
#define S_CMS3 110
|
||||
#define S_CMS4 111
|
||||
#define S_FAS1 112
|
||||
#define S_FAS2 113
|
||||
#define S_FAS3 114
|
||||
#define S_FAS4 115
|
||||
#define S_CON1 116
|
||||
#define S_CON2 117
|
||||
#define S_CON3 118
|
||||
#define S_CON4 119
|
383
ca/ca2100a.uml
Executable file
383
ca/ca2100a.uml
Executable file
@ -0,0 +1,383 @@
|
||||
#include "ca2100a.h"
|
||||
|
||||
TOOLBAR "" 0 -3 0 3
|
||||
|
||||
#include <toolbar.h>
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Testata" -1 -1 80 20
|
||||
|
||||
GROUPBOX DLG_NULL 78 3
|
||||
BEGIN
|
||||
PROMPT 1 1 "@bDitta"
|
||||
END
|
||||
|
||||
NUMBER F_CODDITTA 5
|
||||
BEGIN
|
||||
PROMPT 3 2 "Codice "
|
||||
FLAGS "DFR"
|
||||
USE LF_NDITTE KEY 1
|
||||
INPUT CODDITTA F_CODDITTA
|
||||
OUTPUT F_RAGSOC RAGSOC
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_RAGSOC 50 52
|
||||
BEGIN
|
||||
PROMPT 17 2 ""
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 6
|
||||
BEGIN
|
||||
PROMPT 1 4 "@bTestata"
|
||||
END
|
||||
|
||||
DATE F_DATAREG
|
||||
BEGIN
|
||||
PROMPT 2 5 "Data di registrazione "
|
||||
CHECKTYPE REQUIRED
|
||||
MESSAGE COPY,F_DATAREG2
|
||||
FIELD DATAREG
|
||||
FLAGS "A"
|
||||
WARNING "La data di registrazione non appartiene ad un esercizio valido"
|
||||
END
|
||||
|
||||
NUMBER F_NUMREG 7
|
||||
BEGIN
|
||||
PROMPT 52 5 "Movimento n. "
|
||||
USE LF_MOVANA
|
||||
INPUT NUMREG F_NUMREG
|
||||
DISPLAY "Numero@7" NUMREG
|
||||
DISPLAY "Data reg.@10" DATAREG
|
||||
DISPLAY "Data comp.@10" DATACOMP
|
||||
DISPLAY "Eser." ANNOES
|
||||
DISPLAY "Descrizione@50" DESCR
|
||||
OUTPUT F_NUMREG NUMREG
|
||||
CHECKTYPE REQUIRED
|
||||
KEY 1
|
||||
FIELD NUMREG
|
||||
MESSAGE COPY,F_NUMREG2
|
||||
END
|
||||
|
||||
DATE F_DATACOMP
|
||||
BEGIN
|
||||
PROMPT 2 6 "Data di competenza "
|
||||
FIELD DATACOMP
|
||||
WARNING "La data di competenza non appartiene ad un esercizio valido"
|
||||
END
|
||||
|
||||
NUMBER F_ANNOES 4
|
||||
BEGIN
|
||||
PROMPT 52 6 "Esercizio "
|
||||
FIELD ANNOES
|
||||
MESSAGE COPY,F_ANNOES2
|
||||
FLAGS "DG"
|
||||
END
|
||||
|
||||
DATE F_DATADOC
|
||||
BEGIN
|
||||
PROMPT 2 7 "Data del documento "
|
||||
FIELD DATADOC
|
||||
END
|
||||
|
||||
STRING F_TIPODOC 2
|
||||
BEGIN
|
||||
PROMPT 42 7 "Tipo documento "
|
||||
USE %TPD
|
||||
INPUT CODTAB F_TIPODOC
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@60" S0
|
||||
OUTPUT F_TIPODOC CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESCR 50
|
||||
BEGIN
|
||||
PROMPT 2 8 "Descrizione "
|
||||
FIELD DESCR
|
||||
MESSAGE COPY,F_DESCR2
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 4
|
||||
BEGIN
|
||||
PROMPT 1 10 "@bPrima nota"
|
||||
END
|
||||
|
||||
NUMBER F_NUMREGCG 7
|
||||
BEGIN
|
||||
PROMPT 2 11 "Numero "
|
||||
FLAGS "D"
|
||||
FIELD NUMREGCG
|
||||
END
|
||||
|
||||
STRINGA F_CODCAUS 3
|
||||
BEGIN
|
||||
PROMPT 19 11 "Causale "
|
||||
USE LF_CAUSALI
|
||||
INPUT CODCAUS F_CODCAUS
|
||||
DISPLAY "Codice" CODCAUS
|
||||
DISPLAY "Descrizione@50" DESCR
|
||||
OUTPUT F_CODCAUS CODCAUS
|
||||
OUTPUT F_DESCAUS DESCR
|
||||
CHECKTYPE REQUIRED
|
||||
FIELD CODCAUS
|
||||
END
|
||||
|
||||
STRINGA F_DESCAUS 50 40
|
||||
BEGIN
|
||||
PROMPT 34 11 ""
|
||||
USE LF_CAUSALI KEY 2
|
||||
INPUT DESCR F_DESCAUS
|
||||
DISPLAY "Descrizione@50" DESCR
|
||||
DISPLAY "Codice" CODCAUS
|
||||
COPY OUTPUT F_CODCAUS
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 4
|
||||
BEGIN
|
||||
PROMPT 1 14 "@bMovimento"
|
||||
END
|
||||
|
||||
CURRENCY F_TOTDOC 18
|
||||
BEGIN
|
||||
PROMPT 2 15 "Totale documento "
|
||||
FIELD TOTDOC
|
||||
END
|
||||
|
||||
LISTBOX F_SEZIONE 1 5
|
||||
BEGIN
|
||||
PROMPT 39 15 ""
|
||||
ITEM "D|Dare"
|
||||
ITEM "A|Avere"
|
||||
FIELD SEZIONE
|
||||
END
|
||||
|
||||
BOOLEAN F_BLOCCATO
|
||||
BEGIN
|
||||
PROMPT 2 19 "Movimento bloccato"
|
||||
FIELD BLOCCATO
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Righe" -1 -1 80 20
|
||||
|
||||
GROUPBOX DLG_NULL 78 4
|
||||
BEGIN
|
||||
PROMPT 1 1 "@bMovimento"
|
||||
END
|
||||
|
||||
NUMBER F_NUMREG2 7
|
||||
BEGIN
|
||||
PROMPT 2 2 "Numero "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
NUMBER F_DATAREG2 7
|
||||
BEGIN
|
||||
PROMPT 22 2 "Data registrazione "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
NUMBER F_ANNOES2 7
|
||||
BEGIN
|
||||
PROMPT 59 2 "Esercizio "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_DESCR2 50
|
||||
BEGIN
|
||||
PROMPT 2 3 "Descrizione "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
CURRENCY F_DARE 18
|
||||
BEGIN
|
||||
PROMPT 1 5 "Saldo riga corrente: Dare "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
CURRENCY F_AVERE 18
|
||||
BEGIN
|
||||
PROMPT 41 5 "Avere "
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
SPREADSHEET F_RIGHE
|
||||
BEGIN
|
||||
PROMPT 0 6 ""
|
||||
ITEM "Dare@15"
|
||||
ITEM "Avere@15"
|
||||
ITEM "Descrizione@30"
|
||||
ITEM "Cdc 1"
|
||||
ITEM "Cdc 2"
|
||||
ITEM "Cdc 3"
|
||||
ITEM "Cdc 4"
|
||||
ITEM "Cms 1"
|
||||
ITEM "Cms 2"
|
||||
ITEM "Cms 3"
|
||||
ITEM "Cms 4"
|
||||
ITEM "Fas 1"
|
||||
ITEM "Fas 2"
|
||||
ITEM "Fas 3"
|
||||
ITEM "Fas 4"
|
||||
ITEM "Con 1"
|
||||
ITEM "Con 2"
|
||||
ITEM "Con 3"
|
||||
ITEM "Con 4"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
|
||||
PAGE "Riga" -1 -1 78 19
|
||||
|
||||
CURRENCY S_DARE 15
|
||||
BEGIN
|
||||
PROMPT 1 0 "Dare "
|
||||
END
|
||||
|
||||
CURRENCY S_AVERE 15
|
||||
BEGIN
|
||||
PROMPT 31 0 "Avere "
|
||||
END
|
||||
|
||||
STRING S_DESCR 50
|
||||
BEGIN
|
||||
PROMPT 1 1 "Descrizione "
|
||||
END
|
||||
|
||||
STRING S_CDC1 20
|
||||
BEGIN
|
||||
PROMPT 1 2 "Cdc 1"
|
||||
USE LF_CDC
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CDC2 20
|
||||
BEGIN
|
||||
PROMPT 21 2 "Cdc 2"
|
||||
COPY USE S_CDC1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CDC3 20
|
||||
BEGIN
|
||||
PROMPT 41 2 "Cdc 3"
|
||||
COPY USE S_CDC1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CDC4 20
|
||||
BEGIN
|
||||
PROMPT 61 2 "Cdc 4"
|
||||
COPY USE S_CDC1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CMS1 20
|
||||
BEGIN
|
||||
PROMPT 1 3 "Cms 1"
|
||||
USE LF_COMMESSE
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CMS2 20
|
||||
BEGIN
|
||||
PROMPT 21 3 "Cms 2"
|
||||
COPY USE S_CMS1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CMS3 20
|
||||
BEGIN
|
||||
PROMPT 41 3 "Cms 3"
|
||||
COPY USE S_CMS1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CMS4 20
|
||||
BEGIN
|
||||
PROMPT 61 3 "Cms 4"
|
||||
COPY USE S_CMS1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_FAS1 20
|
||||
BEGIN
|
||||
PROMPT 1 4 "Fas 1"
|
||||
USE LF_FASI
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_FAS2 20
|
||||
BEGIN
|
||||
PROMPT 21 4 "Fas 2"
|
||||
COPY USE S_FAS1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_FAS3 20
|
||||
BEGIN
|
||||
PROMPT 41 4 "Fas 3"
|
||||
COPY USE S_FAS1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_FAS4 20
|
||||
BEGIN
|
||||
PROMPT 61 4 "Fas 4"
|
||||
COPY USE S_FAS1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CON1 20
|
||||
BEGIN
|
||||
PROMPT 1 5 "Con 1"
|
||||
USE LF_PCON
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CON2 20
|
||||
BEGIN
|
||||
PROMPT 21 5 "Con 2"
|
||||
COPY USE S_CON1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CON3 20
|
||||
BEGIN
|
||||
PROMPT 41 5 "Con 3"
|
||||
COPY USE S_CON1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
STRING S_CON4 20
|
||||
BEGIN
|
||||
PROMPT 61 5 "Con 4"
|
||||
COPY USE S_CON1
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
BUTTON DLG_OK 10 2
|
||||
BEGIN
|
||||
PROMPT -13 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_DELREC 10 2
|
||||
BEGIN
|
||||
PROMPT -23 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BEGIN
|
||||
PROMPT -33 -1 ""
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
198
ca/calib01.cpp
198
ca/calib01.cpp
@ -18,6 +18,18 @@ const TString& TMultilevel_code_info::picture(int level) const
|
||||
return _picture.row(level);
|
||||
}
|
||||
|
||||
bool TMultilevel_code_info::is_numeric_picture(int level) const
|
||||
{
|
||||
const TString& pic = picture(level);
|
||||
if (pic.blank())
|
||||
return false;
|
||||
|
||||
for (int i = 0; pic[i]; i++)
|
||||
if (pic[i] != '0' && pic[i] != '9')
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
int TMultilevel_code_info::len(int level) const
|
||||
{
|
||||
return picture(level).len();
|
||||
@ -128,7 +140,7 @@ const TMultilevel_code_info& multilevel_code_info(int logicnum)
|
||||
return *info;
|
||||
}
|
||||
|
||||
bool 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 TMultilevel_code_info& info = multilevel_code_info(logic);
|
||||
@ -241,7 +253,7 @@ 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);
|
||||
return ca_test_multilevel_field(fld, level);
|
||||
}
|
||||
|
||||
bool TSimple_anal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
@ -478,7 +490,7 @@ void TSimple_anal_msk::create_key_browse(TEdit_field& kfld, int level)
|
||||
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 << "CH " << (level == 0 ? "RE" : "NO") << endl;
|
||||
out << "EN" << endl;
|
||||
out.close();
|
||||
|
||||
@ -556,8 +568,8 @@ int TSimple_anal_msk::create_key_fields()
|
||||
|
||||
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);
|
||||
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);
|
||||
@ -915,7 +927,6 @@ bool TAnal_app::user_destroy()
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_mov
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -931,4 +942,177 @@ TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA)
|
||||
add_file(LF_RMOVANA, "NUMRIG");
|
||||
if (numreg > 0)
|
||||
read (numreg);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// 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();
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ public:
|
||||
int levels() const;
|
||||
int len(int level) const;
|
||||
const TString& picture(int level) const;
|
||||
bool is_numeric_picture(int level) const;
|
||||
const TString& prompt(int level) const;
|
||||
const TFieldref& fieldref(int level, int key = 1) const;
|
||||
|
||||
@ -37,8 +38,10 @@ public:
|
||||
virtual ~TMultilevel_code_info() { }
|
||||
};
|
||||
|
||||
const TMultilevel_code_info& multilevel_code_info(int logicnum);
|
||||
bool test_multilevel_field(TEdit_field& fld, int level);
|
||||
const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
|
||||
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);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TSimple_anal_msk
|
||||
|
@ -1,3 +1,3 @@
|
||||
107
|
||||
0
|
||||
$movana|0|0|125|0|Movimenti di Analitica|||
|
||||
$movana|1|1|152|0|Movimenti di Analitica|||
|
||||
|
@ -1,5 +1,5 @@
|
||||
107
|
||||
13
|
||||
17
|
||||
ANNOES|9|4|0|Codice esercizio
|
||||
NUMREG|3|7|0|Numero di operazione
|
||||
DATAREG|5|8|0|Data operazione
|
||||
@ -11,8 +11,12 @@ TIPODOC|1|2|0|Tipo documento
|
||||
DESCR|1|50|0|Descrizione
|
||||
CODCAUS|1|3|0|Codice causale contabile
|
||||
TIPOMOV|1|1|0|Tipo movimento < >Normale, <P>reventivo, <V>ariazione preventivo
|
||||
SEZIONE|1|1|0|Sezione
|
||||
CODVAL|1|3|0|Codice valuta
|
||||
DATACAM|5|8|0|Data del cambio
|
||||
CAMBIO|4|15|6|Cambio della valuta
|
||||
TOTDOC|4|18|3|Totale documento
|
||||
SEZIONE|1|1|0|Sezione del totale documento
|
||||
BLOCCATO|8|1|0|Movimento bloccato
|
||||
2
|
||||
NUMREG|
|
||||
DATAREG+NUMREG|X
|
||||
|
@ -14,5 +14,6 @@
|
||||
#define MOVANA_TIPOMOV "TIPOMOV"
|
||||
#define MOVANA_SEZIONE "SEZIONE"
|
||||
#define MOVANA_TOTDOC "TOTDOC"
|
||||
#define MOVANA_BLOCCATO "BLOCCATO"
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user