Patch level : 10.0
Files correlati : pd6342 Ricompilazione Demo : [ ] Commento : Reasa più veloce elaborazione file LF_*ANA git-svn-id: svn://10.65.10.50/branches/R_10_00@21736 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
ad13d4030c
commit
d4f93fc8cb
127
ps/pd6342300.cpp
127
ps/pd6342300.cpp
@ -4,7 +4,6 @@
|
|||||||
#include <defmask.h>
|
#include <defmask.h>
|
||||||
#include <progind.h>
|
#include <progind.h>
|
||||||
#include <recarray.h>
|
#include <recarray.h>
|
||||||
#include <relation.h>
|
|
||||||
#include <textset.h>
|
#include <textset.h>
|
||||||
|
|
||||||
#include "../cg/cglib01.h"
|
#include "../cg/cglib01.h"
|
||||||
@ -129,18 +128,23 @@ class TRib_movanal_app : public TSkeleton_application
|
|||||||
TCache_ripartizioni _cache_rip;
|
TCache_ripartizioni _cache_rip;
|
||||||
bool _definitivo;
|
bool _definitivo;
|
||||||
TAssoc_array _calc;
|
TAssoc_array _calc;
|
||||||
|
TArray _excl;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual const char * extra_modules() const {return "ca";}
|
virtual const char* extra_modules() const { return "ca"; }
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
|
virtual bool create();
|
||||||
|
virtual bool destroy();
|
||||||
|
|
||||||
bool elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows);
|
bool elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows);
|
||||||
bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path_item, TRecord_array& output_rows, TArray & output_paths);
|
bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path_item,
|
||||||
bool pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path, TRecord_array& output_rows, TArray & output_paths);
|
TRecord_array& output_rows, TArray & output_paths);
|
||||||
|
bool pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec,
|
||||||
|
const TToken_string& path, TRecord_array& output_rows, TArray & output_paths);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool elabora_movimento(TAnal_mov& anal_mov, const bool esplodi);
|
bool elabora_movimento(TAnal_mov& anal_mov, const bool esplodi);
|
||||||
TRib_movanal_app(){}
|
TSystemisamfile& movana() { return *(TSystemisamfile*)_excl.objptr(LF_MOVANA); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -177,7 +181,9 @@ bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_ba
|
|||||||
return ho_pareggiato;
|
return ho_pareggiato;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path_item, TRecord_array& output_rows, TArray & output_paths)
|
bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec,
|
||||||
|
const TToken_string& path_item, TRecord_array& output_rows,
|
||||||
|
TArray& output_paths)
|
||||||
{
|
{
|
||||||
bool ho_ripartito = false;
|
bool ho_ripartito = false;
|
||||||
// Importo totale da distribuire arrotondato ai decimali della valuta di conto
|
// Importo totale da distribuire arrotondato ai decimali della valuta di conto
|
||||||
@ -191,12 +197,12 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
rowkey.add(rec.get(RMOVANA_CODFASE));
|
rowkey.add(rec.get(RMOVANA_CODFASE));
|
||||||
TToken_string browkey = rowkey;
|
TToken_string browkey = rowkey;
|
||||||
|
|
||||||
TAssoc_array * row = (TAssoc_array *)_calc.objptr(rowkey);
|
TAssoc_array* row = (TAssoc_array*)_calc.objptr(rowkey);
|
||||||
|
|
||||||
if (row == NULL)
|
if (row == NULL)
|
||||||
_calc.add(rowkey, row = new TAssoc_array);
|
_calc.add(rowkey, row = new TAssoc_array);
|
||||||
|
|
||||||
real * value = (real *) row->objptr(browkey);
|
real* value = (real*)row->objptr(browkey);
|
||||||
|
|
||||||
if (value == NULL)
|
if (value == NULL)
|
||||||
row->add(rowkey, value = new real);
|
row->add(rowkey, value = new real);
|
||||||
@ -204,7 +210,7 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
*value = *value + (sez == 'D' ? importo : -importo);
|
*value = *value + (sez == 'D' ? importo : -importo);
|
||||||
|
|
||||||
browkey.add("+");
|
browkey.add("+");
|
||||||
row = (TAssoc_array *)_calc.objptr(browkey);
|
row = (TAssoc_array*)_calc.objptr(browkey);
|
||||||
|
|
||||||
if (row == NULL)
|
if (row == NULL)
|
||||||
_calc.add(browkey, row = new TAssoc_array);
|
_calc.add(browkey, row = new TAssoc_array);
|
||||||
@ -216,62 +222,64 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
|
|
||||||
*value = *value + (sez == 'D' ? -importo : importo);
|
*value = *value + (sez == 'D' ? -importo : importo);
|
||||||
// Calcolo tutte le percentuali da ripartire
|
// Calcolo tutte le percentuali da ripartire
|
||||||
int i;
|
|
||||||
const int righe_ripartizione = rrip.rows();
|
const int righe_ripartizione = rrip.rows();
|
||||||
for (i = 1; i <= rrip.rows(); i++)
|
for (int i = 1; i <= righe_ripartizione; i++)
|
||||||
{
|
{
|
||||||
const real importanza_riga = rrip[i].get_real(RRIP_RIPARTO);
|
const real importanza_riga = rrip[i].get_real(RRIP_RIPARTO);
|
||||||
distrib.add(importanza_riga);
|
distrib.add(importanza_riga);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 1; i <= righe_ripartizione; i++)
|
for (int i = 1; i <= righe_ripartizione; i++)
|
||||||
{
|
{
|
||||||
const real imp = distrib.get(); // Legge la quota da distribuire
|
const real imp = distrib.get(); // Legge la quota da distribuire
|
||||||
|
|
||||||
if (imp != ZERO)
|
if (!imp.is_zero())
|
||||||
{
|
{
|
||||||
TRectype* newrec = new TRectype(rec);
|
TRectype nuorec(rec);
|
||||||
|
|
||||||
//poi copia i valori dei campi cdc,cms,fsc,in quelli di tipo ori (nello stesso record)
|
//poi copia i valori dei campi cdc,cms,fsc,in quelli di tipo ori (nello stesso record)
|
||||||
if (rec.get(RMOVANA_CODCCORI).blank() && rec.get(RMOVANA_CODCMSORI).blank() &&
|
if (rec.get(RMOVANA_CODCCORI).blank() && rec.get(RMOVANA_CODCMSORI).blank() &&
|
||||||
rec.get(RMOVANA_CODFASEORI).blank()) // RMOVANA_CODCONTORI è vuoto nel caso di pareggio
|
rec.get(RMOVANA_CODFASEORI).blank()) // RMOVANA_CODCONTORI è vuoto nel caso di pareggio
|
||||||
{
|
{
|
||||||
ca_copia_campo(rec, RMOVANA_CODCCOSTO, *newrec, RMOVANA_CODCCORI);
|
ca_copia_campo(rec, RMOVANA_CODCCOSTO, nuorec, RMOVANA_CODCCORI);
|
||||||
ca_copia_campo(rec, RMOVANA_CODCMS, *newrec, RMOVANA_CODCMSORI);
|
ca_copia_campo(rec, RMOVANA_CODCMS, nuorec, RMOVANA_CODCMSORI);
|
||||||
ca_copia_campo(rec, RMOVANA_CODFASE, *newrec, RMOVANA_CODFASEORI);
|
ca_copia_campo(rec, RMOVANA_CODFASE, nuorec, RMOVANA_CODFASEORI);
|
||||||
ca_copia_campo(rec, RMOVANA_CODCONTO, *newrec, RMOVANA_CODCONTORI);
|
ca_copia_campo(rec, RMOVANA_CODCONTO, nuorec, RMOVANA_CODCONTORI);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCCORI);
|
ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODCCORI);
|
||||||
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCMSORI);
|
ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODCMSORI);
|
||||||
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODFASEORI);
|
ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODFASEORI);
|
||||||
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCONTORI);
|
ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODCONTORI);
|
||||||
}
|
}
|
||||||
//e mette nei campi std i valori che trova nelle righe ripartizione
|
//e mette nei campi std i valori che trova nelle righe ripartizione
|
||||||
|
|
||||||
ca_copia_campo(rrip[i], RRIP_CODCOSTO, *newrec, RMOVANA_CODCCOSTO);
|
ca_copia_campo(rrip[i], RRIP_CODCOSTO, nuorec, RMOVANA_CODCCOSTO);
|
||||||
ca_copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS);
|
ca_copia_campo(rrip[i], RRIP_CODCMS, nuorec, RMOVANA_CODCMS);
|
||||||
ca_copia_campo(rrip[i], RRIP_CODFASE, *newrec, RMOVANA_CODFASE);
|
ca_copia_campo(rrip[i], RRIP_CODFASE, nuorec, RMOVANA_CODFASE);
|
||||||
ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO);
|
ca_copia_campo(rrip[i], RRIP_CODCONTO, nuorec, RMOVANA_CODCONTO);
|
||||||
TToken_string ripkey("", ',');
|
TToken_string ripkey("", ',');
|
||||||
|
|
||||||
ripkey.add(newrec->get(RMOVANA_CODCCOSTO));
|
ripkey.add(nuorec.get(RMOVANA_CODCCOSTO));
|
||||||
ripkey.add(newrec->get(RMOVANA_CODCMS));
|
ripkey.add(nuorec.get(RMOVANA_CODCMS));
|
||||||
ripkey.add(newrec->get(RMOVANA_CODFASE));
|
ripkey.add(nuorec.get(RMOVANA_CODFASE));
|
||||||
// ripkey.add(newrec->get(RMOVANA_CODCONTO));
|
// ripkey.add(nuorec.get(RMOVANA_CODCONTO));
|
||||||
|
|
||||||
const int rows = output_rows.rows();
|
const int rows = output_rows.rows();
|
||||||
int r = -1;
|
int r = -1;
|
||||||
for (int j = 1; r < 0 && j <= rows; j++)
|
for (int j = 1; r < 0 && j <= rows; j++)
|
||||||
if (ca_can_pack_rows(*newrec, output_rows[j]))
|
{
|
||||||
|
if (ca_can_pack_rows(nuorec, output_rows[j]))
|
||||||
r = j;
|
r = j;
|
||||||
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
{
|
{
|
||||||
newrec->put(RMOVANA_NUMRIG, rows + 1);
|
nuorec.put(RMOVANA_NUMRIG, rows + 1);
|
||||||
newrec->put(RMOVANA_IMPORTO, imp); //e la mette nella nuova riga
|
nuorec.put(RMOVANA_IMPORTO, imp); //e la mette nella nuova riga
|
||||||
output_rows.add_row(newrec);
|
output_rows.add_row(nuorec);
|
||||||
TToken_string * rowpath = (TToken_string *) output_paths.objptr(r);
|
TToken_string * rowpath = (TToken_string*) output_paths.objptr(r);
|
||||||
|
|
||||||
if (rowpath == NULL)
|
if (rowpath == NULL)
|
||||||
output_paths.add(rowpath = new TToken_string, r);
|
output_paths.add(rowpath = new TToken_string, r);
|
||||||
@ -282,8 +290,7 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
output_rows[r].add(RMOVANA_IMPORTO, imp);
|
output_rows[r].add(RMOVANA_IMPORTO, imp);
|
||||||
}
|
}
|
||||||
|
|
||||||
real * value = (real *) row->objptr(ripkey);
|
real* value = (real*)row->objptr(ripkey);
|
||||||
|
|
||||||
if (value == NULL)
|
if (value == NULL)
|
||||||
row->add(ripkey, value = new real);
|
row->add(ripkey, value = new real);
|
||||||
*value = *value + (sez == 'D' ? imp : -imp);
|
*value = *value + (sez == 'D' ? imp : -imp);
|
||||||
@ -295,7 +302,6 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
return ho_ripartito;
|
return ho_ripartito;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows)
|
bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows)
|
||||||
{
|
{
|
||||||
bool ho_cambiato_qualchecosa = false;
|
bool ho_cambiato_qualchecosa = false;
|
||||||
@ -305,9 +311,8 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r
|
|||||||
TRecord_array output_rows = input_rows; output_rows.destroy_rows();
|
TRecord_array output_rows = input_rows; output_rows.destroy_rows();
|
||||||
TArray input_paths;
|
TArray input_paths;
|
||||||
TArray output_paths;
|
TArray output_paths;
|
||||||
int loop = 0;
|
|
||||||
|
|
||||||
while (loop++ < 20)
|
for (int loop = 1; loop <= 20; loop++)
|
||||||
{
|
{
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
const int nrows = input_rows.rows();
|
const int nrows = input_rows.rows();
|
||||||
@ -379,7 +384,6 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r
|
|||||||
return ho_cambiato_qualchecosa;
|
return ho_cambiato_qualchecosa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool TRib_movanal_app::elabora_movimento(TAnal_mov& anal_mov, const bool esplodi)
|
bool TRib_movanal_app::elabora_movimento(TAnal_mov& anal_mov, const bool esplodi)
|
||||||
{
|
{
|
||||||
TRecord_array& input_rows = anal_mov.body(); //record_array con le righe del mov_anal (INPUT)
|
TRecord_array& input_rows = anal_mov.body(); //record_array con le righe del mov_anal (INPUT)
|
||||||
@ -435,7 +439,7 @@ static bool ripartisci_callback(const TRelation& rel, void* pJolly)
|
|||||||
//se va tutto bene riscrive l'intero movimento analitico con conseguente ricalcolo saldi
|
//se va tutto bene riscrive l'intero movimento analitico con conseguente ricalcolo saldi
|
||||||
app.elabora_movimento(anal_mov, false);
|
app.elabora_movimento(anal_mov, false);
|
||||||
if (app.elabora_movimento(anal_mov, true))
|
if (app.elabora_movimento(anal_mov, true))
|
||||||
anal_mov.rewrite(rel.lfile());
|
anal_mov.rewrite(app.movana());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -447,7 +451,7 @@ static bool compatta_callback(const TRelation& rel, void* pJolly)
|
|||||||
TAnal_mov anal_mov(numreg);
|
TAnal_mov anal_mov(numreg);
|
||||||
//se va tutto bene riscrive l'intero movimento analitico con conseguente ricalcolo saldi
|
//se va tutto bene riscrive l'intero movimento analitico con conseguente ricalcolo saldi
|
||||||
if (app.elabora_movimento(anal_mov, false))
|
if (app.elabora_movimento(anal_mov, false))
|
||||||
anal_mov.rewrite(rel.lfile());
|
anal_mov.rewrite(app.movana());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -460,22 +464,24 @@ void TRib_movanal_app::main_loop()
|
|||||||
//deve scandire il file MOVANA con chiave 2 (per data e numero di registrazione)
|
//deve scandire il file MOVANA con chiave 2 (per data e numero di registrazione)
|
||||||
TRelation rel_movana(LF_MOVANA);
|
TRelation rel_movana(LF_MOVANA);
|
||||||
TRectype darec(LF_MOVANA), arec(LF_MOVANA);
|
TRectype darec(LF_MOVANA), arec(LF_MOVANA);
|
||||||
const TDate & dal = mask.get_date(F_DATAINI);
|
const TDate dal = mask.get_date(F_DATAINI);
|
||||||
darec.put(MOVANA_DATACOMP, dal);
|
darec.put(MOVANA_DATACOMP, dal);
|
||||||
const TDate & al = mask.get_date(F_DATAFIN);
|
const TDate al = mask.get_date(F_DATAFIN);
|
||||||
arec.put(MOVANA_DATACOMP, al);
|
arec.put(MOVANA_DATACOMP, al);
|
||||||
_cache_rip.set_esercizio(mask.get_int(F_ANNO));
|
_cache_rip.set_esercizio(mask.get_int(F_ANNO));
|
||||||
|
|
||||||
const TString & tipo = mask.get(F_CLASSEMOV);
|
const TString& tipo = mask.get(F_CLASSEMOV);
|
||||||
TString filter;
|
TString filter;
|
||||||
|
|
||||||
if (tipo.blank())
|
if (tipo.blank())
|
||||||
filter = "BLOCCATO!=\"X\"";
|
filter = "BLOCCATO!=\"X\"";
|
||||||
else
|
else
|
||||||
|
{
|
||||||
if (tipo == "N")
|
if (tipo == "N")
|
||||||
filter = "(BLOCCATO!=\"X\")&&(TIPOMOV==\"\")";
|
filter = "(BLOCCATO!=\"X\")&&(TIPOMOV==\"\")";
|
||||||
else
|
else
|
||||||
filter = "(BLOCCATO!=\"X\")&&(TIPOMOV!=\"\")";
|
filter = "(BLOCCATO!=\"X\")&&(TIPOMOV!=\"\")";
|
||||||
|
}
|
||||||
TCursor cur_movana(&rel_movana, filter, 2, &darec, &arec);
|
TCursor cur_movana(&rel_movana, filter, 2, &darec, &arec);
|
||||||
const long items = cur_movana.items();
|
const long items = cur_movana.items();
|
||||||
if (items > 0)
|
if (items > 0)
|
||||||
@ -500,13 +506,12 @@ void TRib_movanal_app::main_loop()
|
|||||||
cur_movana.scan(compatta_callback, this, TR("Compattamento movimenti..."));
|
cur_movana.scan(compatta_callback, this, TR("Compattamento movimenti..."));
|
||||||
else
|
else
|
||||||
cur_movana.scan(ripartisci_callback, this, TR("Ripartizione movimenti..."));
|
cur_movana.scan(ripartisci_callback, this, TR("Ripartizione movimenti..."));
|
||||||
TFilename fname(mask.get(F_PATH));
|
|
||||||
|
TFilename fname(mask.get(F_PATH));
|
||||||
fname.add(mask.get(F_NAME));
|
fname.add(mask.get(F_NAME));
|
||||||
if (fname.full())
|
if (fname.full())
|
||||||
{
|
{
|
||||||
TCSV_recset recset(_calc);
|
TCSV_recset recset(_calc);
|
||||||
|
|
||||||
recset.save_as(fname, fmt_unknown);
|
recset.save_as(fname, fmt_unknown);
|
||||||
}
|
}
|
||||||
} //if(run)...
|
} //if(run)...
|
||||||
@ -516,6 +521,28 @@ void TRib_movanal_app::main_loop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TRib_movanal_app::create()
|
||||||
|
{
|
||||||
|
int lognum[] = { LF_MOVANA, LF_RMOVANA, LF_PCONANA, LF_SALDANA, 0 };
|
||||||
|
|
||||||
|
for (int i = 0; lognum[i]; i++)
|
||||||
|
{
|
||||||
|
const int num = lognum[i];
|
||||||
|
TSystemisamfile* sif = new TSystemisamfile(num);
|
||||||
|
_excl.add(sif, num);
|
||||||
|
if (sif->open(_excllock) != NOERR)
|
||||||
|
return error_box(TR("Il file dei movimenti analitici è gia' in uso"));
|
||||||
|
}
|
||||||
|
return TSkeleton_application::create();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TRib_movanal_app::destroy()
|
||||||
|
{
|
||||||
|
_excl.destroy();
|
||||||
|
return TSkeleton_application::destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int pd6342300(int argc, char* argv[])
|
int pd6342300(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
TRib_movanal_app app;
|
TRib_movanal_app app;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user