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:
guy 2005-02-02 10:02:36 +00:00
parent d1fab0f6de
commit dcc9ea95d7
13 changed files with 1035 additions and 198 deletions

View File

@ -27,7 +27,6 @@ BEGIN
FIELD SOSPESO
END
ENDPAGE
ENDMASK
ENDMASK

View File

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

View File

@ -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
View 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;
}

2
ca/ca2.h Executable file
View File

@ -0,0 +1,2 @@
int ca2100(int argc, char* argv[]);

367
ca/ca2100.cpp Executable file
View 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
View 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
View 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

View File

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

View File

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

View File

@ -1,3 +1,3 @@
107
0
$movana|0|0|125|0|Movimenti di Analitica|||
$movana|1|1|152|0|Movimenti di Analitica|||

View File

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

View File

@ -14,5 +14,6 @@
#define MOVANA_TIPOMOV "TIPOMOV"
#define MOVANA_SEZIONE "SEZIONE"
#define MOVANA_TOTDOC "TOTDOC"
#define MOVANA_BLOCCATO "BLOCCATO"
#endif