Patch level :2.2 46
Files correlati :ca2.exe ca2200a.msk Ricompilazione Demo : [ ] Commento :cappottiamoci! git-svn-id: svn://10.65.10.50/trunk@12796 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
a8aa726335
commit
384d3df36f
127
ca/ca2200.cpp
127
ca/ca2200.cpp
@ -101,6 +101,7 @@ class TRib_movanal_app : public TSkeleton_application
|
||||
{
|
||||
TRib_movanal_msk * _mask;
|
||||
TCache_ripartizioni _cache_rip;
|
||||
bool _definitivo;
|
||||
|
||||
virtual const char * extra_modules() const {return "cm";} //deve funzionare anche per le commesse
|
||||
|
||||
@ -113,7 +114,7 @@ protected:
|
||||
void implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows);
|
||||
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);
|
||||
|
||||
public:
|
||||
TRib_movanal_app() {}
|
||||
@ -148,10 +149,16 @@ static void taglia_campo (TRectype& src, const char* campo_src,
|
||||
|
||||
bool TRib_movanal_app::can_merge_rows(const TRectype& compact_rec, const TRectype& rec)
|
||||
{
|
||||
return (compact_rec.get(RMOVANA_CODCCOSTO) == rec.get(RMOVANA_CODCCOSTO) &&
|
||||
compact_rec.get(RMOVANA_CODCMS) == rec.get(RMOVANA_CODCMS) &&
|
||||
compact_rec.get(RMOVANA_CODFASE) == rec.get(RMOVANA_CODFASE) &&
|
||||
compact_rec.get(RMOVANA_CODFASE) == rec.get(RMOVANA_CODFASE) );
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -159,33 +166,54 @@ void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_arr
|
||||
for (int r = 1; r <= input_rows.rows(); r++)
|
||||
{
|
||||
const TRectype& rec = input_rows.row(r); //record originale
|
||||
TRectype* newrec = new TRectype(rec); //record destinazione
|
||||
|
||||
//ripristina i campi originali sul record di destinazione
|
||||
taglia_campo(*newrec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCCOSTO);
|
||||
taglia_campo(*newrec, RMOVANA_CODCMSORI, *newrec, RMOVANA_CODCMS);
|
||||
taglia_campo(*newrec, RMOVANA_CODFASEORI, *newrec, RMOVANA_CODFASE);
|
||||
taglia_campo(*newrec, RMOVANA_CODCONTORI, *newrec, RMOVANA_CODCONTO);
|
||||
|
||||
int i;
|
||||
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); //
|
||||
if (can_merge_rows(nuovo_rec, rec)) //se esiste gia'...
|
||||
break;
|
||||
}
|
||||
if (i > 0) //...aggiunge solo importo e sezione...
|
||||
//se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere
|
||||
if (ori_present(rec))
|
||||
{
|
||||
const TImporto imp_rec(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO));
|
||||
TRectype& compact_rec = (TRectype&) compact_rows[i]; //record originale
|
||||
TImporto imp_orig(compact_rec.get_char(RMOVANA_SEZIONE), compact_rec.get_real(RMOVANA_IMPORTO));
|
||||
imp_orig += imp_rec;
|
||||
imp_orig.normalize();
|
||||
compact_rec.put(RMOVANA_SEZIONE, imp_orig.sezione());
|
||||
compact_rec.put(RMOVANA_IMPORTO, imp_orig.valore());
|
||||
int i;
|
||||
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); //
|
||||
if (can_merge_rows(nuovo_rec, rec)) //se esiste gia'...
|
||||
break;
|
||||
}
|
||||
if (i > 0) //...aggiunge solo importo e sezione...
|
||||
{
|
||||
const TImporto imp_rec(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO));
|
||||
TRectype& compact_rec = compact_rows.row(i, false); //record originale
|
||||
|
||||
TImporto imp_orig(compact_rec.get_char(RMOVANA_SEZIONE), compact_rec.get_real(RMOVANA_IMPORTO));
|
||||
imp_orig += imp_rec;
|
||||
imp_orig.normalize();
|
||||
compact_rec.put(RMOVANA_SEZIONE, imp_orig.sezione());
|
||||
compact_rec.put(RMOVANA_IMPORTO, imp_orig.valore());
|
||||
}
|
||||
else //...senno' aggiunge direttamente tutta la riga
|
||||
{
|
||||
TRectype* newrec = new TRectype(rec); //record destinazione
|
||||
newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1);
|
||||
compact_rows.add_row(newrec);
|
||||
}
|
||||
|
||||
}
|
||||
else //...senno' aggiunge direttamente tutta la riga
|
||||
else
|
||||
{
|
||||
TRectype* newrec = new TRectype(rec);
|
||||
newrec->put(RMOVANA_NUMRIG, compact_rows.rows() + 1);
|
||||
compact_rows.add_row(newrec);
|
||||
}
|
||||
}
|
||||
|
||||
//ripristina i campi originali sul record di destinazione
|
||||
for (int k = 1; k <= compact_rows.rows(); k++)
|
||||
{
|
||||
TRectype& compact_rec = compact_rows.row(k, false);
|
||||
if (ori_present(compact_rec))
|
||||
{
|
||||
taglia_campo(compact_rec, RMOVANA_CODCCORI, compact_rec, RMOVANA_CODCCOSTO);
|
||||
taglia_campo(compact_rec, RMOVANA_CODCMSORI, compact_rec, RMOVANA_CODCMS);
|
||||
taglia_campo(compact_rec, RMOVANA_CODFASEORI, compact_rec, RMOVANA_CODFASE);
|
||||
taglia_campo(compact_rec, RMOVANA_CODCONTORI, compact_rec, RMOVANA_CODCONTO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,9 +239,10 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr
|
||||
for (i = 1; i <= rrip.rows(); i++)
|
||||
{
|
||||
TRectype* newrec = new TRectype(rec);
|
||||
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
||||
const real imp = distrib.get(); // Legge la quota da distribuire
|
||||
newrec->put("IMPORTO", imp); //e la mette nella nuova riga
|
||||
//poi copia i valori dei campi cdc,cms,fsc,con in quelli di tipo ori (nello stesso record)
|
||||
newrec->put(RMOVANA_IMPORTO, imp); //e la mette nella nuova riga
|
||||
//poi copia i valori dei campi cdc,cms,fsc,in quelli di tipo ori (nello stesso record)
|
||||
copia_campo(rec, RMOVANA_CODCCOSTO, *newrec, RMOVANA_CODCCORI);
|
||||
copia_campo(rec, RMOVANA_CODCMS, *newrec, RMOVANA_CODCMSORI);
|
||||
copia_campo(rec, RMOVANA_CODFASE, *newrec, RMOVANA_CODFASEORI);
|
||||
@ -231,7 +260,9 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr
|
||||
}
|
||||
else //nessuna riga di ripartizione->aggiungo la riga input all'output
|
||||
{
|
||||
output_rows.add_row(rec);
|
||||
TRectype* newrec = new TRectype(rec);
|
||||
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
||||
output_rows.add_row(newrec);
|
||||
}
|
||||
}
|
||||
return ho_cambiato_qualchecosa;
|
||||
@ -255,9 +286,21 @@ bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly)
|
||||
//..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..
|
||||
output_rows.destroy_rows(); //..e poi lo pulisce
|
||||
|
||||
bool do_rewrite = false;
|
||||
//Esploditore
|
||||
if (app.explode_rows(compact_rows, output_rows))
|
||||
output_rows.rewrite();
|
||||
{
|
||||
input_rows = output_rows; //rimette i record elaborati negli originali
|
||||
do_rewrite = true;
|
||||
}
|
||||
if (app._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 true;
|
||||
}
|
||||
@ -266,25 +309,33 @@ void TRib_movanal_app::main_loop()
|
||||
{
|
||||
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);
|
||||
//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==''";
|
||||
filtro << "BLOCCATO!=\"X\"";
|
||||
|
||||
TCursor cur_movana(&rel_movana, filtro, 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)
|
||||
{
|
||||
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...");
|
||||
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?"));
|
||||
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...");
|
||||
}
|
||||
}
|
||||
else
|
||||
message_box(TR("Non ci sono movimenti da ribaltare nel periodo selezionato"));
|
||||
|
||||
message_box(TR("Non ci sono movimenti da elaborare nel periodo selezionato"));
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2,3 +2,4 @@
|
||||
|
||||
#define F_DATAINI 102
|
||||
#define F_DATAFIN 103
|
||||
#define F_DEFINITIVO 104
|
||||
|
@ -34,6 +34,11 @@ BEGIN
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
BOOLEAN F_DEFINITIVO
|
||||
BEGIN
|
||||
PROMPT 2 5 "Blocca movimenti elaborati"
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user