Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
prosegue la nuova gestione movimenti di budget


git-svn-id: svn://10.65.10.50/trunk@20446 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-05-12 15:14:28 +00:00
parent 24d509402e
commit a6de1757cc
3 changed files with 350 additions and 108 deletions

View File

@ -10,6 +10,7 @@
#include "../ca/commesse.h"
#include "../ca/movana.h"
#include "../ca/rmovana.h"
#include "../ca/saldana.h"
#include "ps1001.h"
#include "ps1001300a.h"
@ -64,21 +65,31 @@ static int compare_by_numrig(TSheet_field& s, int r1, int r2)
}
//nota: nelle ststic non si possono usare i _pos_quel, perchè sono di maschera
//ordina le righe per sede/fase/conto (string+string+string)
//ordina le righe per cms/sede/fase/conto (string+string+string)
static int compare_by_fase(TSheet_field & s, int r1, int r2)
{
TToken_string& s1 = s.row(r1);
TToken_string& s2 = s.row(r2);
const int tipo_pos = s.cid2index(S_TIPOMOV);
const int cms_pos = s.cid2index(S_CMS);
const int cdc_pos = s.cid2index(S_CDC);
const int fase_pos = s.cid2index(S_FASE);
const int conto_pos = s.cid2index(S_CONTO);
TToken_string c1;
c1.add(s1.get(1));
c1.add(s1.get(2));
c1.add(s1.get(3));
c1.add(s1.get(tipo_pos));
c1.add(s1.get(cms_pos));
c1.add(s1.get(cdc_pos));
c1.add(s1.get(fase_pos));
c1.add(s1.get(conto_pos));
TToken_string c2;
c2.add(s2.get(1));
c2.add(s2.get(2));
c2.add(s2.get(3));
c2.add(s2.get(tipo_pos));
c2.add(s2.get(cms_pos));
c2.add(s2.get(cdc_pos));
c2.add(s2.get(fase_pos));
c2.add(s2.get(conto_pos));
int cmp = c1.compare(c2);
@ -95,14 +106,20 @@ class TVariazione_budget_mask : public TAutomask
{
bool _dirty;
//posizioni dei vari campi dello sheet: vengono assegnati nel costruttore
int _pos_check, _pos_cdc, _pos_fase, _pos_conto, _pos_datacomp, _pos_autofcomp, _pos_datafcomp,
int _pos_cms, _pos_check, _pos_cdc, _pos_fase, _pos_conto, _pos_datacomp, _pos_autofcomp, _pos_datafcomp,
_pos_cosric, _pos_imp, _pos_prev, _pos_mat, _pos_descr, _pos_numreg, _pos_numrig, _pos_tipomov;
TToken_string _cms_supporto;
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void set_status(bool edit);
int load(); //(costruttore e on_field) carica i dati per riempire lo sheet
int load_rmovana(const TString& cms, const bool include_cms_supp, TSheet_field& sf_righe); //(load()) carica le righe analitiche di preventivo
int load_saldana(const TString& cms, TSheet_field& sf_righe); //(load()) carica le righe di saldo consuntivo
TToken_string& add_rmovana(const TRectype& movana, const TRectype& rmovana, TSheet_field& sf_righe); //(load_rmovana()) metodo di basso livello..
//..per caricare fisicamente le righe sullo sheet
bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato
void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check
@ -113,6 +130,7 @@ protected:
void sistema_date_cms(TDate& datainicms, TDate& datafinecms);
void trova_cms_supporto(const TString& codcms); //(load(),on_field()) riempie la lista con le commesse di supporto valide
void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(load()) crea i saldi preventivi in base agli importi
bool save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata
@ -131,10 +149,12 @@ TVariazione_budget_mask::TVariazione_budget_mask() : TAutomask ("ps1001300a")
//carica la causale che trova nel ditta.ini
TConfig ditta_ini(CONFIG_DITTA, "ps1001");
set(F_CODCAUS, ditta_ini.get("CodCaus"), 0x3);
set(F_INCLUDESUPP, ditta_ini.get_bool("InclSupp"));
//setta le posizioni dei campi dello sheet
TSheet_field& sf_righe = sfield(F_RIGHE);
_pos_check = sf_righe.cid2index(S_CHECK);
_pos_cms = sf_righe.cid2index(S_CMS);
_pos_cdc = sf_righe.cid2index(S_CDC);
_pos_fase = sf_righe.cid2index(S_FASE);
_pos_conto = sf_righe.cid2index(S_CONTO);
@ -156,6 +176,7 @@ TVariazione_budget_mask::~TVariazione_budget_mask()
//salva nel ditta.ini la causale sulla maschera
TConfig ditta_ini(CONFIG_DITTA, "ps1001");
ditta_ini.set("CodCaus", get(F_CODCAUS));
ditta_ini.set("InclSupp", get_bool(F_INCLUDESUPP));
}
//crea la chiave cdc/fase/conto
@ -275,6 +296,13 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e,
{
case se_query_add: return field(DLG_CANCEL).enabled();
case se_query_del: return false;
case se_notify_add:
{
const TString& codcms = get(F_CODCMS);
TMask& sheet_mask = sfield(F_RIGHE).sheet_mask();
sheet_mask.set(S_CMS, codcms);
}
break;
default: break;
}
break;
@ -334,7 +362,7 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e,
case S_SO:
if (e == fe_init)
{
TMask& m = o.mask(); //mascehra di riga
TMask& m = o.mask(); //maschera di riga
const TString& contone = m.get(S_CONTO);
m.set(S_GR, contone.left(3));
m.set(S_CO, contone.mid(3,3));
@ -342,7 +370,7 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e,
}
if (e == fe_modify || e == fe_close)
{
TMask& m = o.mask(); //mascehra di riga
TMask& m = o.mask(); //maschera di riga
TString16 contone;
contone << m.get(S_GR) << m.get(S_CO) << m.get(S_SO);
m.set(S_CONTO, contone);
@ -757,8 +785,114 @@ void TVariazione_budget_mask::aggiorna_saldi_preventivi(TSheet_field& sf_righe,
}
}
//in base alla commessa parametro, trova tutte le commesse di supporto
void TVariazione_budget_mask::trova_cms_supporto(const TString& codcms)
{
const TRectype& rec_cms = cache().get(LF_COMMESSE, codcms);
const bool is_cms_supporto = rec_cms.get_bool(COMMESSE_APPOGGIO);
//comunque la commessa selezionata ci va
_cms_supporto = codcms;
int TVariazione_budget_mask::load()
//tutto il casino vale solo per le commesse normali; se viene selezionata una commessa di supporto..
//..si può agire solo su di lei!
if (!is_cms_supporto)
{
const TDate cms_dataini = rec_cms.get_date(COMMESSE_DATAINIZIO);
TDate cms_datafine;
const bool pro = rec_cms.get_bool(COMMESSE_PROROGA);
if (pro)
cms_datafine = rec_cms.get_date(COMMESSE_DATAPROR);
if (!pro || !cms_datafine.ok())
cms_datafine = rec_cms.get_date(COMMESSE_DATAFINE);
TString query;
query << "USE COMMESSE\n";
query << "SELECT ((APPOGGIO=\"X\")&&((NUM(ANSI(DATAINIZIO)<=ANSI(#DATAFINECMS)))&&(NUM(ANSI(DATAFINE)>=ANSI(#DATAINIZIOCMS)))))\n";
TISAM_recordset commesse(query);
commesse.set_var("#DATAFINECMS", cms_datafine);
commesse.set_var("#DATAINIZIOCMS", cms_dataini);
const int items = commesse.items();
for(bool ok = commesse.move_first(); ok; ok = commesse.move_next())
_cms_supporto.add(commesse.get(COMMESSE_CODCMS).as_string());
}
//alla fine assegna al campo lista S_CMS della maschera di riga i valori possibili della lista
TMask& sheet_mask = sfield(F_RIGHE).sheet_mask();
TList_field& cms_list = sheet_mask.lfield(S_CMS);
cms_list.replace_items(_cms_supporto, _cms_supporto);
sheet_mask.reset();
}
TToken_string& TVariazione_budget_mask::add_rmovana(const TRectype& movana, const TRectype& rmovana, TSheet_field& sf_righe)
{
TToken_string& row = sf_righe.row(-1);
//chiave iniziale di riga
const TString& cms = rmovana.get(RMOVANA_CODCMS);
row.add(cms, _pos_cms);
const TString& cdc = rmovana.get(RMOVANA_CODCCOSTO);
row.add(cdc, _pos_cdc);
const TString& fase = rmovana.get(RMOVANA_CODFASE);
row.add(fase, _pos_fase);
const TString& conto = rmovana.get(RMOVANA_CODCONTO);
row.add(conto, _pos_conto);
//date competenza iniziale e finale
const TDate datacomp = movana.get_date(MOVANA_DATACOMP);
TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP);
const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP);
if (!datafcomp.ok() && !autofcomp)
datafcomp = datacomp;
row.add(datacomp, _pos_datacomp);
row.add(autofcomp ? "X" : "", _pos_autofcomp);
//se c'è l'auto fine competenza la cella con la data fine competenza va svuotata..
//..e disabilitata senno' ci va messa e basta
if (!autofcomp)
row.add(datafcomp, _pos_datafcomp);
else
sf_righe.disable_cell(sf_righe.items() - 1, _pos_datafcomp);
//costo o ricavo? all'indbil l'ardua sentenza!
TAnal_bill bill(conto, cdc, cms, fase);
const int indbil = bill.indicatore_bilancio();
const char* str_indbil = indbil == 3 ? "C" : "R";
row.add(str_indbil, _pos_cosric);
real valore = rmovana.get_real(RMOVANA_IMPORTO);
const char sezione = rmovana.get_char(RMOVANA_SEZIONE);
TImporto importo(sezione, valore);
importo.normalize(indbil == 3 ? 'D' : 'A');
valore = importo.valore();
row.add(valore.string(), _pos_imp);
const TDate dataini, datafin;
//recupera il saldo finale consuntivo! in base alla chiave cms/cdc/fase/conto e lo mette nel campo consuntivo
const TSaldanal& saldanal_cons = ca_saldo(bill, dataini, datafin, _saldanal_consuntivo | _saldanal_ultima_imm);
TImporto saldo_cons = saldanal_cons._fin;
saldo_cons.normalize(indbil == 3 ? 'D' : 'A');
const real saldo_cons_valore = saldo_cons.valore();
row.add(saldo_cons_valore.string(), _pos_mat);
//completa la riga
row.add(rmovana.get(RMOVANA_DESCR), _pos_descr);
//il numreg lo deve ricordare per le righe di appoggio
const long numreg = rmovana.get_long(RMOVANA_NUMREG);
row.add(numreg, _pos_numreg);
row.add(rmovana.get_int(RMOVANA_NUMRIG), _pos_numrig);
const TString& tipomov = movana.get(MOVANA_TIPOMOV);
row.add(tipomov, _pos_tipomov);
return row;
}
int TVariazione_budget_mask::load_rmovana(const TString& cms, const bool include_cms_supp, TSheet_field& sf_righe)
{
TString query;
query << "USE RMOVANA KEY 4\n";
@ -767,80 +901,55 @@ int TVariazione_budget_mask::load()
query << "FROM CODCMS=#CODCMS\n";
query << "TO CODCMS=#CODCMS\n";
//instanzio un TISAM_recordset sulle rmovana
TISAM_recordset rmovana(query);
const TString& cms = get(F_CODCMS);
rmovana.set_var("#CODCMS", cms);
TISAM_recordset recset(query);
recset.set_var("#CODCMS", cms);
const long rmovana_items = rmovana.items();
TProgind pi(rmovana_items, TR("Caricamento righe..."), true, true);
const long recset_items = recset.items();
TProgind pi(recset_items, TR("Caricamento righe..."), true, true);
//recupero sheet e realtiva mashera di riga
TSheet_field& sf_righe = sfield(F_RIGHE);
TMask& msk = sf_righe.sheet_mask();
sf_righe.destroy();
//riempie lo string_array _cms_supporto in base ai parametri della commessa scelta..
//..e al fatto che l'utente lo voglia o meno...
if (include_cms_supp)
trova_cms_supporto(cms);
TAssoc_array numreg_cms;
//per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga)
for (bool ok = rmovana.move_first(); ok; ok = rmovana.move_next())
const TRectype& movana = recset.cursor()->curr(LF_MOVANA);
const TRectype& rmovana = recset.cursor()->curr(LF_RMOVANA);
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
TToken_string& row = sf_righe.row(-1);
//chiave iniziale di riga
const TString& cdc = rmovana.get(RMOVANA_CODCCOSTO).as_string();
row.add(cdc, _pos_cdc);
const TString& fase = rmovana.get(RMOVANA_CODFASE).as_string();
row.add(fase, _pos_fase);
const TString& conto = rmovana.get(RMOVANA_CODCONTO).as_string();
row.add(conto, _pos_conto);
//date competenza iniziale e finale
const TDate datacomp = rmovana.get("MOVANA."MOVANA_DATACOMP).as_date();
TDate datafcomp = rmovana.get("MOVANA."MOVANA_DATAFCOMP).as_date();
const bool autofcomp = rmovana.get("MOVANA."MOVANA_AUTOFCOMP).as_bool();
if (!datafcomp.ok() && !autofcomp)
datafcomp = datacomp;
row.add(datacomp, _pos_datacomp);
row.add(autofcomp ? "X" : "", _pos_autofcomp);
//se c'è l'auto fine competenza la cella con la data fine competenza va svuotata..
//..e disabilitata senno' ci va messa e basta
if (!autofcomp)
row.add(datafcomp, _pos_datafcomp);
else
sf_righe.disable_cell(sf_righe.items() - 1, _pos_datafcomp);
//costo o ricavo? all'indbil l'ardua sentenza!
TAnal_bill bill(conto, cdc, cms, fase);
const int indbil = bill.indicatore_bilancio();
const char* str_indbil = indbil == 3 ? "C" : "R";
row.add(str_indbil, _pos_cosric);
real valore = rmovana.get(RMOVANA_IMPORTO).as_real();
const char sezione = rmovana.get(RMOVANA_SEZIONE).as_string()[0];
TImporto importo(sezione, valore);
importo.normalize(indbil == 3 ? 'D' : 'A');
valore = importo.valore();
row.add(valore.string(), _pos_imp);
const TDate dataini, datafin;
//recupera il saldo finale consuntivo! in base alla chiave cms/cdc/fase/conto e lo mette nel campo consuntivo
const TSaldanal& saldanal_cons = ca_saldo(bill, dataini, datafin, _saldanal_consuntivo | _saldanal_ultima_imm);
TImporto saldo_cons = saldanal_cons._fin;
saldo_cons.normalize(indbil == 3 ? 'D' : 'A');
const real saldo_cons_valore = saldo_cons.valore();
row.add(saldo_cons_valore.string(), _pos_mat);
//completa la riga
row.add(rmovana.get(RMOVANA_DESCR).as_string(), _pos_descr);
row.add(rmovana.get(RMOVANA_NUMREG).as_int(), _pos_numreg);
row.add(rmovana.get(RMOVANA_NUMRIG).as_int(), _pos_numrig);
const TString& tipomov = rmovana.get("MOVANA."MOVANA_TIPOMOV).as_string();
row.add(tipomov, _pos_tipomov);
TToken_string& row = add_rmovana(movana, rmovana, sf_righe);
numreg_cms.add(row.get(_pos_numreg));
} //for(bool ok.move....
//prima di riempire lo sheet a video ordina le righe per sede/fase/numreg/numrig
//panegirico per trovare le righe delle commesse di supporto
//ovviamente ce ne deve essere almeno 1, quindi..
if (_cms_supporto.items() > 1 && include_cms_supp)
{
FOR_EACH_ASSOC_OBJECT(numreg_cms, obj, key, itm)
{
TAnal_mov movana(atol(key));
const int righe_movana = movana.rows();
for (int r = 1; r <= righe_movana; r++)
{
const TRectype& rec_rmovana = movana.body()[r];
const TString& curr_cms = rec_rmovana.get(RMOVANA_CODCMS);
if (_cms_supporto.get_pos(curr_cms) > 0) // NON >= o ci metterebbe anche la commessa standard!!!!
{
TToken_string& row = add_rmovana(movana, rec_rmovana, sf_righe);
row.add("S", _pos_tipomov); //è una riga di 'S'upporto
}
}
}
} //if (_cms_supporto.items() > 1)
//prima di riempire lo sheet a video ordina le righe per tipo/cms/sede/fase/numreg/numrig
sf_righe.sort(compare_by_fase);
//in base alle righe caricate ricava i saldi preventivi
@ -851,7 +960,124 @@ int TVariazione_budget_mask::load()
if (str_saldo_prev.blank())
aggiorna_saldi_preventivi(sf_righe, i);
}
return sf_righe.items();
}
int TVariazione_budget_mask::load_saldana(const TString& cms, TSheet_field& sf_righe)
{
//caricamento di tutti i saldi consuntivi che riguardano la commessa
//chiave 2 per averli ordinati per conto
TString query;
query << "USE SALDANA KEY 2\n";
query << "SELECT (COMMESSA=#CODCMS)\n";
//instanzio un TISAM_recordset sui saldana
TISAM_recordset saldana(query);
saldana.set_var("#CODCMS", cms);
const long saldana_items = saldana.items();
TProgind pi(saldana_items, TR("Caricamento saldi consuntivi..."), true, true);
TAssoc_array chiavi_saldana;
TToken_string chiave;
//riempie l'assoc_array conto/cdc/cms/fase/saldo
for (bool ok = saldana.move_first(); ok; ok = saldana.move_next())
{
const TString& conto = saldana.get(SALDANA_CONTO).as_string();
const TString& cdc = saldana.get(SALDANA_COSTO).as_string();
const TString& fase = saldana.get(SALDANA_FASE).as_string();
const real saldop = saldana.get(SALDANA_SALDOP).as_real();
const real saldo = saldana.get(SALDANA_SALDO).as_real();
//solo i record senza saldop vanno considerati!!! Quelli con con saldop != 0 vengono fuori in load_rmovana
if (saldop.is_zero() && saldo != ZERO)
{
chiave.cut(0);
chiave.add(conto);
chiave.add(cdc);
chiave.add(cms);
chiave.add(fase);
//se non trova la chiave la aggiunge
TImporto* s = (TImporto*)chiavi_saldana.objptr(chiave);
if (s == NULL)
{
s = new TImporto;
chiavi_saldana.add(chiave, s);
}
//poi somma il saldo (come importo!)
const char sez = saldana.get(SALDANA_SEZIONE).as_string()[0];
TImporto imp_saldo_curr(sez, saldo);
*s += imp_saldo_curr;
}
}
//per ogni riga dell'assoc_array con conto/cdc/cms/fase/saldo va ad aggiornare lo sheet sulla maschera (aggiunge la riga)
FOR_EACH_ASSOC_OBJECT(chiavi_saldana, obj, key, itm)
{
if (!pi.addstatus(1))
break;
TToken_string& row = sf_righe.row(-1);
//estrae l'elemento dell'assoc_array
TToken_string key_bill(key);
const TString80 conto = key_bill.get(0);
const TString80 cdc = key_bill.get(1);
const TString80 cms = key_bill.get(2);
const TString16 fase = key_bill.get(3);
row.add(cms, _pos_cms);
row.add(cdc, _pos_cdc);
row.add(fase, _pos_fase);
row.add(conto, _pos_conto);
const TDate oggi(TODAY);
row.add(oggi, _pos_datacomp);
row.add(oggi, _pos_datafcomp);
//costo o ricavo? all'indbil l'ardua sentenza!
TAnal_bill bill(conto, cdc, cms, fase);
const int indbil = bill.indicatore_bilancio();
const char* str_indbil = indbil == 3 ? "C" : "R";
row.add(str_indbil, _pos_cosric);
TImporto& saldo_cons = *(TImporto*)itm;
saldo_cons.normalize(indbil == 3 ? 'D' : 'A');
const real saldo_cons_valore = saldo_cons.valore();
row.add(saldo_cons_valore.string(), _pos_mat);
//aggiunge una descrizione civetta
row.add("Riga da saldo", _pos_descr);
//segna il tipo riga come saldo
row.add("P", _pos_tipomov);
}
//prima di riempire lo sheet a video ordina le righe per tipo/cms/sede/fase/numreg/numrig
sf_righe.sort(compare_by_fase);
return sf_righe.items();
}
int TVariazione_budget_mask::load()
{
//commessa in esame
const TString& cms = get(F_CODCMS);
//deve includere anche le righe con commesse di supporto?
const bool include_cms_supp = get_bool(F_INCLUDESUPP);
//recupero sheet e realtiva mashera di riga
TSheet_field& sf_righe = sfield(F_RIGHE);
TMask& msk = sf_righe.sheet_mask();
sf_righe.destroy();
//carica le righe dei movimenti preventivi
const int righe_rmovana = load_rmovana(cms, include_cms_supp, sf_righe);
//carica le righe dei saldi consuntivi
const int righe_saldana = load_saldana(cms, sf_righe);
//e poi aggiorna il video!
sf_righe.force_update();

View File

@ -5,9 +5,10 @@
#define F_DATAFINECMS 204
#define F_PROROGATA 205
#define F_DATAPRORCMS 206
#define F_DATAREG 207
#define F_CODCAUS 208
#define F_DESCAUS 209
#define F_INCLUDESUPP 207
#define F_DATAREG 208
#define F_CODCAUS 209
#define F_DESCAUS 210
#define F_RIGHE 220
@ -20,25 +21,27 @@
//campi dello sheet
#define S_CHECK 101
#define S_CDC 102
#define S_FASE 103
#define S_CONTO 104
#define S_DATACOMP 105
#define S_AUTOFCOMP 106
#define S_DATAFCOMP 107
#define S_COSRIC 108
#define S_IMPORTO 109
#define S_PREVENTIVO 110
#define S_MATURATO 111
#define S_DESCR 112
#define S_NUMREG 113
#define S_NUMRIG 114
#define S_TIPOMOV 115
#define S_CMS 102
#define S_CDC 103
#define S_FASE 104
#define S_CONTO 105
#define S_DATACOMP 106
#define S_AUTOFCOMP 107
#define S_DATAFCOMP 108
#define S_COSRIC 109
#define S_IMPORTO 110
#define S_PREVENTIVO 111
#define S_MATURATO 112
#define S_DESCR 113
#define S_NUMREG 114
#define S_NUMRIG 115
#define S_TIPOMOV 116
#define S_CDC_DESCR 142
#define S_FASE_DESCR 143
#define S_GR 144
#define S_CO 145
#define S_SO 146
#define S_CONTO_DESCR 147
#define S_CMS_DESCR 142
#define S_CDC_DESCR 143
#define S_FASE_DESCR 144
#define S_GR 145
#define S_CO 146
#define S_SO 147
#define S_CONTO_DESCR 148

View File

@ -55,7 +55,7 @@ ENDPAGE
PAGE "Gestione Budget" 0 2 0 0
GROUPBOX DLG_NULL 78 4
GROUPBOX DLG_NULL 78 5
BEGIN
PROMPT 0 0 "@bCommessa"
END
@ -114,21 +114,26 @@ BEGIN
GROUP 3
END
BOOLEAN F_INCLUDESUPP
BEGIN
PROMPT 1 3 "Includere le righe con commesse di supporto"
END
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 0 4 "@bParametri movimenti analitici da generare"
PROMPT 0 5 "@bParametri movimenti analitici da generare"
END
DATE F_DATAREG
BEGIN
PROMPT 1 5 "Data reg. "
PROMPT 1 6 "Data reg. "
CHECKTYPE REQUIRED
FLAGS "A"
END
STRINGA F_CODCAUS 3
BEGIN
PROMPT 24 5 "Causale "
PROMPT 24 6 "Causale "
USE LF_CAUSALI SELECT MOVIND!=""
INPUT CODCAUS F_CODCAUS
DISPLAY "Codice" CODCAUS
@ -141,7 +146,7 @@ END
STRINGA F_DESCAUS 50 37
BEGIN
PROMPT 38 5 ""
PROMPT 38 6 ""
USE LF_CAUSALI KEY 2 SELECT MOVIND!=''
INPUT DESCR F_DESCAUS
DISPLAY "Descrizione@50" DESCR
@ -152,13 +157,14 @@ END
TEXT DLG_NULL
BEGIN
PROMPT -11 7 "@bRighe movimenti di budget"
PROMPT -11 8 "@bRighe movimenti di budget e saldi consuntivi"
END
SPREADSHEET F_RIGHE
BEGIN
PROMPT 1 8 "Righe"
PROMPT 1 9 "Righe"
ITEM "@1C"
ITEM "Commessa@20"
ITEM "Sede@4"
ITEM "Fase@5"
ITEM "Conto@12"
@ -237,11 +243,18 @@ ENDMASK
/////////////////////////////////////////
//maschera di riga
PAGE "Riga analitica" -1 -1 74 18
PAGE "Riga analitica" -1 -1 74 20
BOOLEAN S_CHECK
BEGIN
PROMPT 1 1 "Applica"
PROMPT 1 0 "Applica"
END
LIST S_CMS 20
BEGIN
PROMPT 1 1 "Commessa "
FLAGS "D"
GROUP 1
END
STRING S_CDC 4