diff --git a/ps/ps1001300.cpp b/ps/ps1001300.cpp index a77b28d07..af68c2e15 100755 --- a/ps/ps1001300.cpp +++ b/ps/ps1001300.cpp @@ -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(); diff --git a/ps/ps1001300a.h b/ps/ps1001300a.h index a55448b63..5eaf4a5f4 100755 --- a/ps/ps1001300a.h +++ b/ps/ps1001300a.h @@ -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 diff --git a/ps/ps1001300a.uml b/ps/ps1001300a.uml index 570a146ba..7c61e0ebc 100755 --- a/ps/ps1001300a.uml +++ b/ps/ps1001300a.uml @@ -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