Patch level : 2.2

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :

Implementata richiesta
0000450

Implementare un meccanismo per avere movimenti che in automatico portino a 0
il totale documento con centri di costo, commesee, fasi predefinite


git-svn-id: svn://10.65.10.50/trunk@13403 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2005-10-10 11:26:19 +00:00
parent aef979d285
commit 065ce112d4
12 changed files with 497 additions and 170 deletions

View File

@ -5,12 +5,11 @@
#include "ca0.h"
#include "ca0300a.h"
//-----AUTOMASK---------------------------------------------------------------------------------//
// TConf_mask
class TConf_mask : public TAutomask
{
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
void config_loader(TSheet_field& sf, const char* paragrafo);
@ -20,10 +19,6 @@ public:
virtual ~TConf_mask(){};
};
TConf_mask::TConf_mask(const TFilename& f) :TAutomask (f)
{
}
bool TConf_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
@ -53,15 +48,12 @@ bool TConf_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
break;
case F_FATHER_FASI :
if (e == fe_close)
if (e == fe_close && !o.empty())
{
const TString& lev1 = get(F_LEVEL_1);
const TString& lev2 = get(F_LEVEL_2);
if (lev2.blank())
{
if (o.get() != lev1 && o.get() != lev2)
return error_box(TR("Livello superiore di fase non valido"));
}
if (o.get() != lev1 && o.get() != lev2)
return error_box(TR("Livello superiore di fase non valido"));
}
default: break;
@ -69,15 +61,16 @@ bool TConf_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
return true;
}
TConf_mask::TConf_mask(const TFilename& f) : TAutomask (f)
{
}
//-----CONFIG APPLICATION------------------------------------------------------------------------------------------//
class TConf_Analitica : public TConfig_application
{
TMask* _cm;
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
virtual const char* extra_modules() const { return "cm"; } //funziona anche con autorizzazione CM
protected:
virtual TMask* create_mask(const TFilename& f);
@ -95,8 +88,8 @@ public:
void config_loader(TSheet_field& sf, TConfig& config);
void config_setter(TSheet_field& sf, TConfig& config);
TConf_Analitica() : TConfig_application( CONFIG_DITTA ), _cm(NULL) { }
virtual ~TConf_Analitica( ){ }
TConf_Analitica() : TConfig_application(CONFIG_DITTA), _cm(NULL) { }
virtual ~TConf_Analitica() { }
};
TMask* TConf_Analitica::get_mask()
@ -104,7 +97,6 @@ TMask* TConf_Analitica::get_mask()
return _cm;
}
TMask* TConf_Analitica::create_mask(const TFilename& f)
{
if (_cm == NULL)
@ -132,13 +124,11 @@ void TConf_Analitica::config_loader(TSheet_field& sf, TConfig& config)
void TConf_Analitica::config_setter(TSheet_field& sf, TConfig& config)
{
const int items = sf.items();
for (int i = items;;i++)
for (int i = items; ;i++)
{
TToken_string num_doc(config.get("ND", NULL, i));
if (num_doc.blank())
break;
config.remove("ND", i);
}
@ -149,7 +139,7 @@ void TConf_Analitica::config_setter(TSheet_field& sf, TConfig& config)
num_doc.add(row->get(2));
num_doc.add(row->get(3));
num_doc.add(row->get(4));
config.set("ND", (const char*) num_doc, NULL, true, j); //setta i valori nel config
config.set("ND", num_doc, NULL, true, j); //setta i valori nel config
}
}
@ -167,8 +157,8 @@ bool TConf_Analitica::postprocess_config (TMask& mask, TConfig& config)
bool TConf_Analitica::user_create( )
{
TConfig& cfg = ca_config();
cfg.set( "EdMask", "ca0300a");
TConfig cfg(CONFIG_DITTA, "ca");
cfg.set("EdMask", "ca0300a");
return true;
}
@ -184,4 +174,4 @@ int ca0300(int argc, char* argv[])
TConf_Analitica app;
app.run(argc, argv, TR("Parametri Contabilita' Analitica"));
return 0;
}
}

View File

@ -48,8 +48,8 @@
#define F_FSCREQ 142
#define F_PDCREQ 143
//sheet delle numerazioni documenti
#define F_RIGHE_NUM 170
#define F_RIGHE_CMS 171
//elementi dello sheet dei documenti
#define SN_CODNUM 101

View File

@ -406,11 +406,11 @@ END
ENDPAGE
PAGE "Regole num. doc." -1 -1 78 20
PAGE "Regole" -1 -1 78 20
SPREADSHEET F_RIGHE_NUM -1 -2
SPREADSHEET F_RIGHE_NUM
BEGIN
PROMPT 1 2 ""
PROMPT 1 1 ""
ITEM "Numerazione"
ITEM "Descrizione@50"
ITEM "Da escludere"
@ -418,6 +418,8 @@ BEGIN
ITEM "A stato"
END
END
ENDPAGE
ENDMASK
@ -489,3 +491,4 @@ END
ENDPAGE
ENDMASK

View File

@ -9,8 +9,7 @@ int main(int argc, char** argv)
{
case 1: ca2200(argc, argv); break; // ribaltamenti movimenti analitica
case 2: ca2300(argc, argv); break; // ricalcolo saldi
default: ca2100(argc,argv); break; // gestione movimenti
default: ca2100(argc, argv); break; // gestione movimenti
}
exit(0);
return 0;
}

View File

@ -1,10 +1,12 @@
#include <applicat.h>
#include <automask.h>
#include <progind.h>
#include <defmask.h>
#include <recarray.h>
#include <relation.h>
#include "calib01.h"
#include "calib02.h"
#include "ca2.h"
#include "ca2200a.h"
@ -16,45 +18,88 @@
//--------------------------------------------------------------------
// MASCHERA
//--------------------------------------------------------------------
class TRib_movanal_msk : public TAutomask
class TRib_movanal_msk : public TAnal_report_mask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly);
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void save_to_ini();
void load_from_ini();
public:
TRib_movanal_msk();
virtual ~TRib_movanal_msk(){};
TRib_movanal_msk();
};
TRib_movanal_msk::TRib_movanal_msk() :TAutomask ("ca2200a") { }
bool TRib_movanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
/* switch (o.dlg())
void TRib_movanal_msk::save_to_ini()
{
TConfig ini(CONFIG_DITTA, "ca");
// Cancella tutte le variabili di pareggio
int j;
for (j = 1; ini.remove("Pareggio", j); j++);
TSheet_field& sf = sfield(F_RIGHE);
const int idx = sf.cid2index(F_CODCAUS);
// Salva tutte le righe dello sheet nel formato
// Pareggio(1) = Causale|Costo|Commessa|Fase
j = 0;
FOR_EACH_SHEET_ROW(sf, i, row)
{
case :
break;
default: break;
}*/
return true;
TToken_string par = row->get(idx); // Codice causale
if (!par.blank())
{
TAnal_bill bill;
const int flags = get_row_bill(sf, i, bill);
if (flags != 0)
{
if (flags & 1) par.add(bill.costo(), 1);
if (flags & 2) par.add(bill.commessa(), 2);
if (flags & 4) par.add(bill.fase(), 3);
ini.set("Pareggio", par, NULL, true, ++j);
}
}
}
}
//--------------------------------------------------------------------
// CLASSE PER RIPARTIZIONI RIGHE E TESTATE
//--------------------------------------------------------------------
class TRipartizione : public TMultiple_rectype
void TRib_movanal_msk::load_from_ini()
{
public:
TRipartizione(TString16 codice);
};
// Svuota lo sheet
TSheet_field& sf = sfield(F_RIGHE);
sf.destroy();
// Carica tutte le variabili di pareggio nello sheet
TConfig ini(CONFIG_DITTA, "ca");
TToken_string par;
for (int j = 1; ; j++)
{
par = ini.get("Pareggio", NULL, j);
if (par.empty_items())
break;
const TAnal_bill bill("", par.get(1), par.get(2), par.get(3));
set_row_bill(sf, -1, bill);
}
}
TRipartizione::TRipartizione(TString16 codice) : TMultiple_rectype(LF_RIP)
bool TRib_movanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
add_file(LF_RRIP, RRIP_CODICE);
if (codice.not_empty())
read();
switch (o.dlg())
{
case DLG_OK:
case DLG_SAVEREC:
if (e == fe_button)
save_to_ini();
break;
default:
break;
}
return TAnal_report_mask::on_field_event(o, e, jolly);
}
TRib_movanal_msk::TRib_movanal_msk() : TAnal_report_mask("ca2200a")
{
create_sheet(F_RIGHE);
load_from_ini();
}
//--------------------------------------------------------------------
@ -62,69 +107,59 @@ TRipartizione::TRipartizione(TString16 codice) : TMultiple_rectype(LF_RIP)
//--------------------------------------------------------------------
class TRib_movanal_app : public TSkeleton_application
{
TRib_movanal_msk * _mask;
TCache_ripartizioni _cache_rip;
bool _definitivo;
TAssoc_array _caus_cms;
virtual const char * extra_modules() const {return "cm";} //deve funzionare anche per le commesse
virtual const char* extra_modules() const { return "cm"; } //deve funzionare anche per le commesse
protected:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
static bool cappotta_movimento(const TRelation& rel, void* pJolly);
void implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows);
void implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows) const;
bool explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows);
bool can_merge_rows(const TRectype& compact_rec, const TRectype& rec);
bool ori_present(const TRectype& rec);
bool ori_present(const TRectype& rec) const;
void copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) const;
void taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) const;
bool can_merge_rows(const TRectype& compact_rec, const TRectype& rec) const;
bool pareggia_commessa(TAnal_mov& anal_mov);
public:
TRib_movanal_app() {}
bool cappotta_movimento(TAnal_mov& anal_mov);
};
bool TRib_movanal_app::create()
{
_mask = new TRib_movanal_msk;
return TSkeleton_application::create();
}
bool TRib_movanal_app::destroy()
{
delete _mask;
return TSkeleton_application::destroy();
}
static void copia_campo (const TRectype& src, const char* campo_src,
TRectype& dst, const char* campo_dst)
void TRib_movanal_app::copia_campo(const TRectype& src, const char* campo_src,
TRectype& dst, const char* campo_dst) const
{
const TString& valore = src.get(campo_src);
if (!valore.blank())
dst.put(campo_dst, valore);
}
static void taglia_campo (TRectype& src, const char* campo_src,
TRectype& dst, const char* campo_dst)
void TRib_movanal_app::taglia_campo(TRectype& src, const char* campo_src,
TRectype& dst, const char* campo_dst) const
{
copia_campo(src, campo_src, dst, campo_dst);
src.zero(campo_src);
}
bool TRib_movanal_app::can_merge_rows(const TRectype& compact_rec, const TRectype& rec)
bool TRib_movanal_app::can_merge_rows(const TRectype& compact_rec, const TRectype& rec) const
{
return (compact_rec.get(RMOVANA_CODCCORI) == rec.get(RMOVANA_CODCCORI) &&
compact_rec.get(RMOVANA_CODCMSORI) == rec.get(RMOVANA_CODCMSORI) &&
compact_rec.get(RMOVANA_CODFASEORI) == rec.get(RMOVANA_CODFASEORI) &&
compact_rec.get(RMOVANA_CODCONTORI) == rec.get(RMOVANA_CODCONTORI) );
return compact_rec.get(RMOVANA_CODCCORI) == rec.get(RMOVANA_CODCCORI) &&
compact_rec.get(RMOVANA_CODCMSORI) == rec.get(RMOVANA_CODCMSORI) &&
compact_rec.get(RMOVANA_CODFASEORI) == rec.get(RMOVANA_CODFASEORI) &&
compact_rec.get(RMOVANA_CODCONTORI) == rec.get(RMOVANA_CODCONTORI);
}
bool TRib_movanal_app::ori_present(const TRectype& rec)
bool TRib_movanal_app::ori_present(const TRectype& rec) const
{
return (rec.get(RMOVANA_CODCCORI).not_empty() || rec.get(RMOVANA_CODCMSORI).not_empty() ||
rec.get(RMOVANA_CODFASEORI).not_empty() || rec.get(RMOVANA_CODCONTORI).not_empty());
}
void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows)
void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows) const
{
for (int r = 1; r <= input_rows.rows(); r++)
{
@ -132,7 +167,7 @@ void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_arr
//se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere
if (ori_present(rec))
{
int i;
int i = 0;
for (i = compact_rows.rows(); i > 0; i--) //giro sulle righe gia' compattate per scoprire se
{ //il nostro record esiste gia' o e' da aggiungere
const TRectype& nuovo_rec = compact_rows.row(i); //
@ -156,7 +191,6 @@ void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_arr
newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1);
compact_rows.add_row(newrec);
}
}
else
{
@ -212,14 +246,13 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr
copia_campo(rec, RMOVANA_CODCONTO, *newrec, RMOVANA_CODCONTORI);
//e mette nei campi std i valori che trova nelle righe ripartizione
copia_campo(rrip[i], RRIP_CODCOSTO, *newrec, RMOVANA_CODCCOSTO);
copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS);
copia_campo(rrip[i], RRIP_CODFASE, *newrec, RMOVANA_CODFASE);
copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS);
copia_campo(rrip[i], RRIP_CODFASE, *newrec, RMOVANA_CODFASE);
copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO);
output_rows.add_row(newrec);
ho_cambiato_qualchecosa = true;
}
}
else //nessuna riga di ripartizione->aggiungo la riga input all'output
{
@ -231,20 +264,64 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr
return ho_cambiato_qualchecosa;
}
bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly)
bool TRib_movanal_app::pareggia_commessa(TAnal_mov& anal_mov)
{
TRib_movanal_app& app = *(TRib_movanal_app*)pJolly;
bool ho_cambiato_qualchecosa = false;
TAnal_mov& anal_mov = (TAnal_mov&)rel.curr(); //movimento analitica
const TString& codcaus = anal_mov.get(MOVANA_CODCAUS);
const TAnal_bill* cms = (const TAnal_bill*)_caus_cms.objptr(codcaus);
if (cms != NULL) // La causale del movimento e' tra quelle da pareggiare
{
const TImporto totdoc(anal_mov.get_char(MOVANA_SEZIONE), anal_mov.get_real(MOVANA_TOTDOC));
if (!totdoc.is_zero()) // Movimento da pareggiare
{
TRecord_array& body = anal_mov.body();
// Cerco la commessa/fase/costo tra le righe esistenti
for (int i = body.last_row(); i > 0; i--)
{
const TRectype& row = body[i];
if ((cms->costo().blank() || row.get(RMOVANA_CODCCOSTO) == cms->costo()) &&
(cms->commessa().blank() || row.get(RMOVANA_CODCMS) == cms->commessa()) &&
(cms->fase().blank() || row.get(RMOVANA_CODFASE) == cms->fase()))
break;
}
// Se non trovo nessuna riga compatibile, me la creo
if (i <= 0)
{
TRectype& rmovana = anal_mov.new_row();
rmovana.put(RMOVANA_DESCR, TR("Pareggio commessa"));
rmovana.put(RMOVANA_CODCCOSTO, cms->costo());
rmovana.put(RMOVANA_CODCMS, cms->commessa());
rmovana.put(RMOVANA_CODFASE, cms->fase());
i = rmovana.get_int(RMOVANA_NUMRIG);
}
// Sottraggo all'importo della riga il totale documento,
// il quale verra' quindi azzerato
TRectype& rmovana = body[i];
TImporto importo(rmovana.get_char(RMOVANA_SEZIONE), rmovana.get_real(RMOVANA_IMPORTO));
importo -= totdoc;
importo.normalize();
rmovana.put(RMOVANA_SEZIONE, importo.sezione());
rmovana.put(RMOVANA_IMPORTO, importo.valore());
anal_mov.put(MOVANA_TOTDOC, ZERO);
ho_cambiato_qualchecosa = true;
}
}
return ho_cambiato_qualchecosa;
}
bool TRib_movanal_app::cappotta_movimento(TAnal_mov& anal_mov)
{
TRecord_array& input_rows = anal_mov.body(); //record_array con le righe del mov_anal (INPUT)
//Per prima cosa prende le righe del movimento su RMOVANA e le ricompatta..
TRecord_array compact_rows = input_rows; //record array con le righe compattate da creare con la
compact_rows.destroy_rows(); //implode_rows()
//Imploditore
app.implode_rows(input_rows, compact_rows);
implode_rows(input_rows, compact_rows);
//..poi lo riesplode in tutte le righe che possono nascere secondo le regole delle ripartizioni!
TRecord_array output_rows = input_rows; //crea il record_array di output come copia dell'INPUT..
@ -252,60 +329,84 @@ bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly)
bool do_rewrite = false;
//Esploditore
if (app.explode_rows(compact_rows, output_rows))
if (explode_rows(compact_rows, output_rows))
{
input_rows = output_rows; //rimette i record elaborati negli originali
do_rewrite = true;
}
if (app._definitivo) //se l'elaborazione e' definitiva...
if (pareggia_commessa(anal_mov))
do_rewrite = true;
if (_definitivo) //se l'elaborazione e' definitiva...
{
anal_mov.put(MOVANA_BLOCCATO, 'X'); //..mette bloccato = X nella testata del movimento
do_rewrite = true;
}
if (do_rewrite) //se ha elaborato delle righe e/o e' una elaborazione definitiva, riscrive la..
anal_mov.rewrite(rel.lfile()); //testata ed aggiorna i saldi
return do_rewrite; //se ha elaborato delle righe e/o e' una elaborazione definitiva, riscrive la..
}
static bool cappotta_callback(const TRelation& rel, void* pJolly)
{
TRib_movanal_app& app = *(TRib_movanal_app*)pJolly;
const long numreg = rel.curr().get_long(MOVANA_NUMREG);
TAnal_mov anal_mov(numreg);
if (app.cappotta_movimento(anal_mov))
anal_mov.rewrite(rel.lfile());
return true;
}
void TRib_movanal_app::main_loop()
{
while (_mask->run() == K_ENTER)
TRib_movanal_msk mask;
while (mask.run() == K_ENTER)
{
//avvisa l'utente scapestrato che se fa una elaborazione definitiva blocchera' i movimenti
//che processa
_definitivo = _mask->get_bool(F_DEFINITIVO);
// avvisa l'utente scapestrato che se fa una elaborazione definitiva
// blocchera' i movimenti che processa
_definitivo = mask.get_bool(F_DEFINITIVO);
//deve scandire il file MOVANA con chiave 2 (per data e numero di registrazione)
TRelation rel_movana(LF_MOVANA);
TRectype darec(LF_MOVANA), arec(LF_MOVANA);
darec.put(MOVANA_DATAREG, _mask->get_date(F_DATAINI));
arec.put(MOVANA_DATAREG, _mask->get_date(F_DATAFIN));
TString filtro;
filtro << "BLOCCATO!=\"X\"";
darec.put(MOVANA_DATAREG, mask.get_date(F_DATAINI));
arec.put(MOVANA_DATAREG, mask.get_date(F_DATAFIN));
TCursor cur_movana(&rel_movana, filtro, 2, &darec, &arec);
TCursor cur_movana(&rel_movana, "BLOCCATO!=\"X\"", 2, &darec, &arec);
const long items = cur_movana.items();
//usa la scan dei TCursor,quindi niente progind e for,x' gia' nel metodo
if (items > 0)
{
bool run = yesno_box(FR("Si desidera elaborare %ld movimenti?"), items);
if (run && _definitivo)
run = yesno_box(FR("Selezionata l'elaborazione definitiva\nSi desidera proseguire?"));
run = yesno_box(TR("E' stata selezionata l'elaborazione definitiva\nSi desidera proseguire?"));
if (run)
{
rel_movana.lfile().set_curr(new TAnal_mov); //il record principale della rel e' un TMov_anal!!
cur_movana.scan(cappotta_movimento, this, "Ribaltamento movimenti...");
// Riempie la lista della causali dei movimenti da pareggiare
_caus_cms.destroy();
TSheet_field& sf = mask.sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sf, i, row)
{
const TString4 codcaus = row->get(0);
if (!codcaus.blank())
{
TAnal_bill* bill = new TAnal_bill;
if (mask.get_row_bill(sf, i, *bill) != 0)
_caus_cms.add(codcaus, bill);
else
delete bill;
}
}
cur_movana.scan(cappotta_callback, this, TR("Ribaltamento movimenti..."));
}
}
else
message_box(TR("Non ci sono movimenti da elaborare nel periodo selezionato"));
}
}
int ca2200(int argc, char* argv[])
{
TRib_movanal_app app;
app.run(argc, argv, "Ribaltamento movimenti di analitica");
app.run(argc, argv, TR("Ribaltamento movimenti di analitica"));
return 0;
}

View File

@ -1,5 +1,9 @@
// campi maschera ca2200a.uml
#define F_DATAINI 102
#define F_DATAFIN 103
#define F_DEFINITIVO 104
#define F_DATAINI 201
#define F_DATAFIN 202
#define F_DEFINITIVO 203
#define F_RIGHE 300
#define F_CODCAUS 113
#define F_DESCAUS 114

View File

@ -1,44 +1,189 @@
#include "ca2200a.h"
#include "camask.h"
TOOLBAR "" 0 -3 0 3
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -11 "~Elabora"
PROMPT -13 -11 "~Elabora"
PICTURE BMP_ELABORA
END
BUTTON DLG_SAVEREC 10 2
BEGIN
PROMPT -23 -11 ""
PICTURE BMP_SAVEREC
PICTURE BMP_SAVERECDN
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -11 ""
PROMPT -33 -11 ""
END
ENDPAGE
PAGE "Ribaltamento movimenti di contabilita' analitica" 0 0 64 12
PAGE "Ribaltamento movimenti" 0 0 64 12
GROUPBOX DLG_NULL 78 4
BEGIN
PROMPT 1 1 "@bIntervallo date"
PROMPT 1 1 "@bParametri di elaborazione"
END
DATA F_DATAINI
BEGIN
PROMPT 2 2 "Da data "
PROMPT 2 2 "Dalla data "
CHECKTYPE REQUIRED
END
DATA F_DATAFIN
BEGIN
PROMPT 2 3 "A data "
PROMPT 2 3 "Alla data "
CHECKTYPE REQUIRED
END
BOOLEAN F_DEFINITIVO
BEGIN
PROMPT 2 5 "Blocca movimenti elaborati"
PROMPT 42 2 "Blocca movimenti elaborati"
END
SPREADSHEET F_RIGHE
BEGIN
PROMPT 0 5 ""
ITEM "Cms 1"
ITEM "Cms 2"
ITEM "Cms 3"
ITEM "Cms 4"
ITEM "Cms 5"
ITEM "Cms 6"
ITEM "Cms 7"
ITEM "Cms 8"
ITEM "Cms 9"
ITEM "Cms 10"
ITEM "Cms 11"
ITEM "Cms 12"
ITEM "Causale "
ITEM "Descrizione@50"
END
ENDPAGE
ENDMASK
PAGE "Riga Commesse" -1 -1 78 15
STRING F_CODCAUS 3
BEGIN
PROMPT 1 1 "Causale "
USE LF_CAUSALI SELECT MOVIND!=""
CHECKTYPE REQUIRED
INPUT CODCAUS F_CODCAUS
DISPLAY "Codice" CODCAUS
DISPLAY "Descrizione@50" DESCR
OUTPUT F_CODCAUS CODCAUS
OUTPUT F_DESCAUS DESCR
ADD RUN cg0 -4
FLAGS "U"
END
STRING F_DESCAUS 50
BEGIN
PROMPT 17 1 ""
USE LF_CAUSALI KEY 2 SELECT MOVIND!=""
INPUT DESCR F_DESCAUS
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice" CODCAUS
COPY OUTPUT F_CODCAUS
ADD RUN cg0 -4
END
STRING S_CDC1 20
BEGIN
PROMPT 1 2 "Cms1 "
FLAGS "B"
END
STRING S_CDC2 20
BEGIN
PROMPT 1 3 "Cms2 "
FLAGS "B"
END
STRING S_CDC3 20
BEGIN
PROMPT 1 4 "Cms3 "
FLAGS "B"
END
STRING S_CDC4 20
BEGIN
PROMPT 1 5 "Cms4 "
FLAGS "B"
END
STRING S_CDC5 20
BEGIN
PROMPT 1 6 "Cms5 "
FLAGS "B"
END
STRING S_CDC6 20
BEGIN
PROMPT 1 7 "Cms6 "
FLAGS "B"
END
STRING S_CDC7 20
BEGIN
PROMPT 1 8 "Cms7 "
FLAGS "B"
END
STRING S_CDC8 20
BEGIN
PROMPT 1 9 "Cms8 "
FLAGS "B"
END
STRING S_CDC9 20
BEGIN
PROMPT 1 10 "Cms9 "
FLAGS "B"
END
STRING S_CDC10 20
BEGIN
PROMPT 1 11 "Cms10 "
FLAGS "B"
END
STRING S_CDC11 20
BEGIN
PROMPT 1 12 "Cms11 "
FLAGS "B"
END
STRING S_CDC12 20
BEGIN
PROMPT 1 13 "Cms12 "
FLAGS "B"
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
ENDMASK

View File

@ -545,37 +545,10 @@ void TPrint_mastrini_ca_rep::set_filter(const TPrint_mastrini_ca_mask& msk, int
////////////////////////////////////////////////////////
class TPrint_mastrini_ca : public TSkeleton_application
{
TPrint_mastrini_ca_mask * _mask;
protected:
bool create();
bool destroy();
public:
const TMultilevel_code_info& get_first_level() const;
virtual void main_loop();
};
bool TPrint_mastrini_ca::create()
{
_mask = new TPrint_mastrini_ca_mask;
return TSkeleton_application::create();
}
bool TPrint_mastrini_ca::destroy()
{
delete _mask;
return TSkeleton_application::destroy();
}
//metodo per accattarsi o' primo livello della configurazione CA
const TMultilevel_code_info& TPrint_mastrini_ca::get_first_level() const
{
TConfig& cfg = ca_config();
const TString& first_lev = cfg.get("Level(1)");
const int logic = first_lev == "CDC" ? LF_CDC : LF_COMMESSE;
return ca_multilevel_code_info(logic);
}
void TPrint_mastrini_ca::main_loop()
{
@ -596,7 +569,8 @@ void TPrint_mastrini_ca::main_loop()
{
TToken_string& row = sheet.row(-1); //crea la prima riga dello sheet
const TMultilevel_code_info& liv1 = get_first_level(); //stabilisce quale è il primo livello (tra CDC e CMS)..
//stabilisce quale è il primo livello (tra CDC e CMS)..
const TMultilevel_code_info& liv1 = *ca_multilevel_code_info_by_index(0);
TISAM_recordset set(liv1.logic() == LF_CDC ? "USE CDC" : "USE COMMESSE"); //..e di conseguenza scrive la use giusta
TProgind pi(set.items(), video_string, true, true);
@ -623,8 +597,7 @@ void TPrint_mastrini_ca::main_loop()
{
FOR_EACH_SHEET_ROW(sheet, r, row)
{
rep.set_filter(*_mask, r);
rep.set_filter(mask, r);
book.add(rep);
}
}

View File

@ -168,6 +168,23 @@ void TMultilevel_code_info::add_fieldref(int k, int from, int to)
a.add(fr);
}
int TMultilevel_code_info::pack(TString& code) const
{
code.strip("|");
return levels();
}
int TMultilevel_code_info::unpack(TString& code) const
{
const int lev = levels();
if (lev > 1)
{
for (int i = lev-2; i >= 0; i--)
code.insert("|", total_len(i));
}
return lev;
}
TMultilevel_code_info::TMultilevel_code_info(int logicnum) : _logicnum(logicnum), _parentnum(0)
{
if (_logicnum == LF_PCON)
@ -251,6 +268,45 @@ const TMultilevel_code_info& ca_multilevel_code_info(int logicnum)
return *info;
}
const TMultilevel_code_info* ca_multilevel_code_info_by_index(int level)
{
static _logicnum[3] = { -1, -1, -1 };
int logic = 0;
if (level >= 0 && level < 3)
{
// Riempie lista dei livelli, ad esempio:
// LF_COMMESSE, LF_FASI, LF_CDC oppure LF_COMMESSE, LF_CDC, ecc...
if (_logicnum[0] < 0)
{
TConfig& cfg = ca_config();
const TString& lev1 = cfg.get("Level", NULL, 1);
if (!lev1.blank())
{
const TMultilevel_code_info& fasi = ca_multilevel_code_info(LF_FASI);
int k = 0;
_logicnum[k] = lev1 == "CDC" ? LF_CDC : LF_COMMESSE;
if (fasi.parent() == _logicnum[k])
_logicnum[++k] = LF_FASI;
const TString& lev2 = cfg.get("Level", NULL, 2);
if (!lev2.blank())
{
_logicnum[k] = _logicnum[0] == LF_COMMESSE ? LF_CDC : LF_COMMESSE;
if (fasi.parent() == _logicnum[k])
_logicnum[++k] = LF_FASI;
}
}
else
memset(_logicnum, 0, sizeof(_logicnum));
}
logic = _logicnum[level];
}
return logic > 0 ? &ca_multilevel_code_info(logic) : NULL;
}
bool ca_test_multilevel_field(TEdit_field& fld, int level)
{
const int logic = fld.browse()->cursor()->curr().num();
@ -1314,7 +1370,6 @@ TAnal_rip::TAnal_rip() : TMultiple_rectype(LF_RIP)
add_file(LF_RRIP, RRIP_NRIGA);
}
///////////////////////////////////////////////////////////
// TCache_ripartizioni
///////////////////////////////////////////////////////////

View File

@ -54,12 +54,15 @@ public:
int logic() const { return _logicnum; }
int parent() const { return _parentnum; }
const TString& editor() const { return _editor; }
int pack(TString& code) const; // Toglie i pipe
int unpack(TString& code) const; // Aggiunge i pipe
TMultilevel_code_info(int logicnum);
virtual ~TMultilevel_code_info() { }
};
const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
const TMultilevel_code_info* ca_multilevel_code_info_by_index(int level);
bool ca_test_multilevel_field(TEdit_field& fld, int level);
int ca_create_fields(TMask& msk, int page, int logicnum, int x, int y, short key_id, short des_id,
unsigned int mode = 0x0, const char* fieldname = NULL);

View File

@ -1,5 +1,3 @@
#include <xvt.h>
#include "calib01.h"
#include "calib02.h"
#include "camask.h"
@ -1042,3 +1040,56 @@ void TAnal_report_mask::create_sheet(short sheet_id)
}
}
int TAnal_report_mask::get_row_bill(TSheet_field& sf, int r, TAnal_bill& bill)
{
int flag = 0;
if (r >= 0 && r < sf.items())
{
int idx = sf.cid2index(S_CDC1);
TToken_string& row = sf.row(r);
for (int level = 0; level <= 2; level++)
{
const TMultilevel_code_info* info = ca_multilevel_code_info_by_index(level);
if (info == NULL)
break;
TString80 code;
for (int i = 0; i < info->levels(); i++)
code << row.get(idx++);
switch (info->logic())
{
case LF_CDC : bill.set_costo(code); flag |= 1; break;
case LF_COMMESSE: bill.set_commessa(code); flag |= 2; break;
case LF_FASI : bill.set_fase(code); flag |= 4; break;
default: break;
}
}
}
return flag;
}
int TAnal_report_mask::set_row_bill(TSheet_field& sf, int r, const TAnal_bill& bill)
{
int flag = 0;
int idx = sf.cid2index(S_CDC1);
TToken_string& row = sf.row(r);
for (int level = 0; level <= 2; level++)
{
const TMultilevel_code_info* info = ca_multilevel_code_info_by_index(level);
if (info == NULL)
break;
TToken_string code;
switch (info->logic())
{
case LF_CDC : code = bill.costo(); flag |= 1; break;
case LF_COMMESSE: code = bill.commessa(); flag |= 2; break;
case LF_FASI : code = bill.fase(); flag |= 4; break;
default: break;
}
info->unpack(code);
FOR_EACH_TOKEN(code, tok)
row.add(tok, idx++);
}
return flag;
}

View File

@ -119,9 +119,9 @@ class TAnal_report : public TReport
protected: // protected is safer
virtual size_t get_usr_words(TString_array& words) const;
virtual bool execute_usr_word(unsigned int opcode, TVariant_stack& stack);
virtual bool use_mask() { return false;}
virtual bool use_mask() { return false; }
virtual void msg_format(int logicnum, TVariant_stack& stack);
virtual void msg_format(int logicnum, TVariant_stack& stack);
virtual void msg_format_costo (TVariant_stack& stack);
virtual void msg_format_commessa (TVariant_stack& stack);
virtual void msg_format_fase (TVariant_stack& stack);
@ -145,7 +145,10 @@ protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TAnal_report_mask(const char* name) : TAutomask(name) {}
int get_row_bill(TSheet_field& sf, int r, TAnal_bill& bill);
int set_row_bill(TSheet_field& sf, int r, const TAnal_bill& bill);
TAnal_report_mask(const char* name) : TAutomask(name) {}
};
#endif