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
|
FIELD SOSPESO
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
ENDPAGE
|
ENDPAGE
|
||||||
|
|
||||||
ENDMASK
|
ENDMASK
|
||||||
|
179
ca/ca0800.cpp
179
ca/ca0800.cpp
@ -5,171 +5,6 @@
|
|||||||
#include "ca0800a.h"
|
#include "ca0800a.h"
|
||||||
#include "calib01.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
|
// TRiparti_msk
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
@ -249,7 +84,7 @@ bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
|
|||||||
if (level >= 0)
|
if (level >= 0)
|
||||||
{
|
{
|
||||||
TEdit_field& fld = (TEdit_field&)o;
|
TEdit_field& fld = (TEdit_field&)o;
|
||||||
return test_multilevel_field(fld, level);
|
return ca_test_multilevel_field(fld, level);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -267,10 +102,10 @@ void TRiparti_msk::create_sheet()
|
|||||||
TConfig ini(CONFIG_DITTA, "ca");
|
TConfig ini(CONFIG_DITTA, "ca");
|
||||||
const bool use_pdc = ini.get_bool("UsePdcc");
|
const bool use_pdc = ini.get_bool("UsePdcc");
|
||||||
|
|
||||||
create_fields(sm, LF_CDC, 1, 1, 202, 252);
|
ca_create_fields(sm, LF_CDC, 1, 1, 202, 252);
|
||||||
create_fields(sm, LF_COMMESSE, 1, 5, 206, 256);
|
ca_create_fields(sm, LF_COMMESSE, 1, 5, 206, 256);
|
||||||
create_fields(sm, LF_FASI, 1, 9, 210, 260);
|
ca_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, use_pdc ? LF_PCON : LF_PCONANA, 1, 13, 214, 264);
|
||||||
|
|
||||||
for (short id = 217; id >= 202; id--)
|
for (short id = 217; id >= 202; id--)
|
||||||
{
|
{
|
||||||
@ -293,8 +128,8 @@ void TRiparti_msk::create_sheet()
|
|||||||
|
|
||||||
TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a")
|
TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a")
|
||||||
{
|
{
|
||||||
create_fields(*this, LF_CDC, 2, 5, F_CODCDC_1, F_DESCDC_1);
|
ca_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_COMMESSE, 2, 11, F_CODCMS_1, F_DESCMS_1);
|
||||||
create_sheet();
|
create_sheet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,21 +230,21 @@ END
|
|||||||
STRING 103 20
|
STRING 103 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 2 "Cdc2 "
|
PROMPT 1 2 "Cdc2 "
|
||||||
USE LF_CDC
|
COPY USE 102
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 104 20
|
STRING 104 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 3 "Cdc3 "
|
PROMPT 1 3 "Cdc3 "
|
||||||
USE LF_CDC
|
COPY USE 102
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 105 20
|
STRING 105 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 4 "Cdc4 "
|
PROMPT 1 4 "Cdc4 "
|
||||||
USE LF_CDC
|
COPY USE 102
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
@ -258,21 +258,21 @@ END
|
|||||||
STRING 107 20
|
STRING 107 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 6 "Cms2 "
|
PROMPT 1 6 "Cms2 "
|
||||||
USE LF_COMMESSE
|
COPY USE 106
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 108 20
|
STRING 108 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 7 "Cms3 "
|
PROMPT 1 7 "Cms3 "
|
||||||
USE LF_COMMESSE
|
COPY USE 106
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 109 20
|
STRING 109 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 8 "Cms4 "
|
PROMPT 1 8 "Cms4 "
|
||||||
USE LF_COMMESSE
|
COPY USE 106
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
@ -286,21 +286,21 @@ END
|
|||||||
STRING 111 10
|
STRING 111 10
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 10 "Fas2 "
|
PROMPT 1 10 "Fas2 "
|
||||||
COPY ALL 110
|
COPY USE 110
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 112 10
|
STRING 112 10
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 11 "Fas3 "
|
PROMPT 1 11 "Fas3 "
|
||||||
COPY ALL 110
|
COPY USE 110
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 113 10
|
STRING 113 10
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 12 "Fas4 "
|
PROMPT 1 12 "Fas4 "
|
||||||
COPY ALL 110
|
COPY USE 110
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
@ -314,21 +314,21 @@ END
|
|||||||
STRING 115 20
|
STRING 115 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 27 14 "Conto "
|
PROMPT 27 14 "Conto "
|
||||||
COPY ALL 114
|
COPY USE 114
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 116 20
|
STRING 116 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 46 14 "Sottoconto "
|
PROMPT 46 14 "Sottoconto "
|
||||||
COPY ALL 114
|
COPY USE 114
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
END
|
||||||
|
|
||||||
STRING 117 20
|
STRING 117 20
|
||||||
BEGIN
|
BEGIN
|
||||||
PROMPT 1 15 "Sottoconticino "
|
PROMPT 1 15 "Sottoconticino "
|
||||||
COPY ALL 114
|
COPY USE 114
|
||||||
GROUP 1
|
GROUP 1
|
||||||
END
|
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);
|
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
|
int TMultilevel_code_info::len(int level) const
|
||||||
{
|
{
|
||||||
return picture(level).len();
|
return picture(level).len();
|
||||||
@ -128,7 +140,7 @@ const TMultilevel_code_info& multilevel_code_info(int logicnum)
|
|||||||
return *info;
|
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 int logic = fld.browse()->cursor()->curr().num();
|
||||||
const TMultilevel_code_info& info = multilevel_code_info(logic);
|
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);
|
TEdit_field& fld = efield(id);
|
||||||
const int level = id - F_KEY1;
|
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)
|
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);
|
const TFieldref& field = mci.fieldref(0, 2);
|
||||||
out << "DI \"" << TR("Descrizione") << "@50\" " << field << endl;
|
out << "DI \"" << TR("Descrizione") << "@50\" " << field << endl;
|
||||||
out << "OU " << get_field_id(level, 2) << ' ' << 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 << "EN" << endl;
|
||||||
out.close();
|
out.close();
|
||||||
|
|
||||||
@ -556,8 +568,8 @@ int TSimple_anal_msk::create_key_fields()
|
|||||||
|
|
||||||
TEdit_field* kfld = NULL;
|
TEdit_field* kfld = NULL;
|
||||||
const char* flags = picture[0] == '0' ? "BUZ" : "BU";
|
const char* flags = picture[0] == '0' ? "BUZ" : "BU";
|
||||||
if (picture.find('A') < 0) // Numeric
|
if (mci.is_numeric_picture(i)) // Numeric
|
||||||
kfld = &add_string(kid, 0, prompt, tab0, i+1, picture.len(), flags);
|
kfld = &add_number(kid, 0, prompt, tab0, i+1, picture.len(), flags);
|
||||||
else
|
else
|
||||||
kfld = &add_string(kid, 0, prompt, tab0, i+1, picture.len(), flags);
|
kfld = &add_string(kid, 0, prompt, tab0, i+1, picture.len(), flags);
|
||||||
create_key_browse(*kfld, i);
|
create_key_browse(*kfld, i);
|
||||||
@ -915,7 +927,6 @@ bool TAnal_app::user_destroy()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TAnal_mov
|
// TAnal_mov
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
@ -931,4 +942,177 @@ TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA)
|
|||||||
add_file(LF_RMOVANA, "NUMRIG");
|
add_file(LF_RMOVANA, "NUMRIG");
|
||||||
if (numreg > 0)
|
if (numreg > 0)
|
||||||
read (numreg);
|
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 levels() const;
|
||||||
int len(int level) const;
|
int len(int level) const;
|
||||||
const TString& picture(int level) const;
|
const TString& 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;
|
||||||
|
|
||||||
@ -37,8 +38,10 @@ public:
|
|||||||
virtual ~TMultilevel_code_info() { }
|
virtual ~TMultilevel_code_info() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
const TMultilevel_code_info& multilevel_code_info(int logicnum);
|
const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
|
||||||
bool 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);
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TSimple_anal_msk
|
// TSimple_anal_msk
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
107
|
107
|
||||||
0
|
0
|
||||||
$movana|0|0|125|0|Movimenti di Analitica|||
|
$movana|1|1|152|0|Movimenti di Analitica|||
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
107
|
107
|
||||||
13
|
17
|
||||||
ANNOES|9|4|0|Codice esercizio
|
ANNOES|9|4|0|Codice esercizio
|
||||||
NUMREG|3|7|0|Numero di operazione
|
NUMREG|3|7|0|Numero di operazione
|
||||||
DATAREG|5|8|0|Data operazione
|
DATAREG|5|8|0|Data operazione
|
||||||
@ -11,8 +11,12 @@ TIPODOC|1|2|0|Tipo documento
|
|||||||
DESCR|1|50|0|Descrizione
|
DESCR|1|50|0|Descrizione
|
||||||
CODCAUS|1|3|0|Codice causale contabile
|
CODCAUS|1|3|0|Codice causale contabile
|
||||||
TIPOMOV|1|1|0|Tipo movimento < >Normale, <P>reventivo, <V>ariazione preventivo
|
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
|
TOTDOC|4|18|3|Totale documento
|
||||||
|
SEZIONE|1|1|0|Sezione del totale documento
|
||||||
|
BLOCCATO|8|1|0|Movimento bloccato
|
||||||
2
|
2
|
||||||
NUMREG|
|
NUMREG|
|
||||||
DATAREG+NUMREG|X
|
DATAREG+NUMREG|X
|
||||||
|
@ -14,5 +14,6 @@
|
|||||||
#define MOVANA_TIPOMOV "TIPOMOV"
|
#define MOVANA_TIPOMOV "TIPOMOV"
|
||||||
#define MOVANA_SEZIONE "SEZIONE"
|
#define MOVANA_SEZIONE "SEZIONE"
|
||||||
#define MOVANA_TOTDOC "TOTDOC"
|
#define MOVANA_TOTDOC "TOTDOC"
|
||||||
|
#define MOVANA_BLOCCATO "BLOCCATO"
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
x
Reference in New Issue
Block a user