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:
luca 2005-03-02 13:37:46 +00:00
parent 7a69fa0061
commit fa512e0b63

View File

@ -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;
}