Patch level :2.2 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento :ribaltamenti in progress git-svn-id: svn://10.65.10.50/trunk@12759 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
7a69fa0061
commit
fa512e0b63
@ -104,6 +104,10 @@ protected:
|
||||
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);
|
||||
bool explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows);
|
||||
bool can_merge_rows(const TRectype& compact_rec, const TRectype& rec);
|
||||
|
||||
|
||||
public:
|
||||
TRib_movanal_app() {}
|
||||
@ -121,31 +125,72 @@ bool TRib_movanal_app::destroy()
|
||||
return TSkeleton_application::destroy();
|
||||
}
|
||||
|
||||
static void copia_campo(const TRectype& src, const char* campo_src,
|
||||
TRectype& dst, const char* campo_dst)
|
||||
static void copia_campo (const TRectype& src, const char* campo_src,
|
||||
TRectype& dst, const char* campo_dst)
|
||||
{
|
||||
const TString& valore = src.get(campo_src);
|
||||
if (!valore.blank())
|
||||
dst.put(campo_dst, valore);
|
||||
}
|
||||
|
||||
bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly)
|
||||
static void taglia_campo (TRectype& src, const char* campo_src,
|
||||
TRectype& dst, const char* campo_dst)
|
||||
{
|
||||
TRib_movanal_app* app = (TRib_movanal_app*)pJolly;
|
||||
copia_campo(src, campo_src, dst, campo_dst);
|
||||
src.zero(campo_src);
|
||||
}
|
||||
|
||||
TAnal_mov& anal_mov = (TAnal_mov&)rel.curr(); //movimento analitica
|
||||
TRecord_array& input_rows = anal_mov.body(); //record_array con le righe del mov_anal (INPUT)
|
||||
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) );
|
||||
}
|
||||
|
||||
TRecord_array output_rows = input_rows; //crea il record_array di output come copia dell'INPUT..
|
||||
output_rows.destroy_rows(); //..e poi lo pulisce
|
||||
void TRib_movanal_app::implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows)
|
||||
{
|
||||
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 recoed 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 = (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());
|
||||
}
|
||||
else //...senno' aggiunge direttamente tutta la riga
|
||||
compact_rows.add_row(newrec);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows)
|
||||
{
|
||||
bool ho_cambiato_qualchecosa = false;
|
||||
|
||||
//Esploditore
|
||||
for (int r = 1; r <= input_rows.rows(); r++)
|
||||
{
|
||||
const TRectype& rec = input_rows.row(r);
|
||||
const TRecord_array& rrip = app->_cache_rip.righe(rec.get(RMOVANA_CODCCOSTO));
|
||||
const TRecord_array& rrip = _cache_rip.righe(rec.get(RMOVANA_CODCCOSTO));
|
||||
|
||||
if (rrip.rows() > 0) //ci sono righe di ripartizione
|
||||
{
|
||||
@ -183,9 +228,31 @@ bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly)
|
||||
output_rows.add_row(rec);
|
||||
}
|
||||
}
|
||||
return ho_cambiato_qualchecosa;
|
||||
}
|
||||
|
||||
if (ho_cambiato_qualchecosa)
|
||||
|
||||
|
||||
bool TRib_movanal_app::cappotta_movimento(const TRelation& rel, void* pJolly)
|
||||
{
|
||||
TRib_movanal_app& app = *(TRib_movanal_app*)pJolly;
|
||||
|
||||
TAnal_mov& anal_mov = (TAnal_mov&)rel.curr(); //movimento analitica
|
||||
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);
|
||||
|
||||
//..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
|
||||
//Esploditore
|
||||
if (app.explode_rows(compact_rows, output_rows))
|
||||
output_rows.rewrite();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user