Patch level : 10.0 nopatch
Files correlati : pd6342.exe Ricompilazione Demo : [ ] Commento Habilita ripartizione ricorsiva step 2 git-svn-id: svn://10.65.10.50/branches/R_10_00@20905 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
2f85214265
commit
d41d970279
170
ps/pd6342300.cpp
170
ps/pd6342300.cpp
@ -3,6 +3,7 @@
|
|||||||
#include <defmask.h>
|
#include <defmask.h>
|
||||||
#include <recarray.h>
|
#include <recarray.h>
|
||||||
#include <relation.h>
|
#include <relation.h>
|
||||||
|
#include <textset.h>
|
||||||
|
|
||||||
#include "../cg/cglib01.h"
|
#include "../cg/cglib01.h"
|
||||||
#include "../ca/calib01.h"
|
#include "../ca/calib01.h"
|
||||||
@ -56,6 +57,65 @@ TRib_movanal_msk::TRib_movanal_msk() : TAnal_report_mask("ca2200a")
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TCSV_recset : public TCSV_recordset
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TCSV_recset(TAssoc_array & calc);
|
||||||
|
};
|
||||||
|
|
||||||
|
TCSV_recset::TCSV_recset(TAssoc_array & calc) : TCSV_recordset(TString("CSV(;)\n"))
|
||||||
|
{
|
||||||
|
TAssoc_array kcol;
|
||||||
|
TString_array rowkeys;
|
||||||
|
TString_array colkeys;
|
||||||
|
|
||||||
|
FOR_EACH_ASSOC_OBJECT(calc, obj, key, item)
|
||||||
|
{
|
||||||
|
rowkeys.add(key);
|
||||||
|
TAssoc_array * row = (TAssoc_array *) item;
|
||||||
|
|
||||||
|
FOR_EACH_ASSOC_OBJECT((*row), rowobj, colkey, rowitem)
|
||||||
|
kcol.add(colkey);
|
||||||
|
}
|
||||||
|
rowkeys.sort();
|
||||||
|
krow.get_keys(colkeys);
|
||||||
|
colkeys.sort();
|
||||||
|
create_columns(colkeys.items() + 1);
|
||||||
|
|
||||||
|
const int ncols = columns();
|
||||||
|
const int nrows = rowkeys.items();
|
||||||
|
|
||||||
|
TRecordset_column_info & c = (TRecordset_column_info &) column_info(0);
|
||||||
|
|
||||||
|
c._name = "Key";
|
||||||
|
for (int i= 1; i < ncols; i++)
|
||||||
|
{
|
||||||
|
TRecordset_column_info & c = (TRecordset_column_info &) column_info(i);
|
||||||
|
|
||||||
|
c._name = colkeys.row(i);
|
||||||
|
c._name.ltrim(5);
|
||||||
|
}
|
||||||
|
for (int i= 0; i < ncols; i++)
|
||||||
|
{
|
||||||
|
new_rec("");
|
||||||
|
TString rowkey = rowkeys.row(i);
|
||||||
|
TAssoc_array * row = (TAssoc_array *) calc.objptr(rowkey);
|
||||||
|
|
||||||
|
rowkey.ltrim(5);
|
||||||
|
set(0, rowkey);
|
||||||
|
if (row != NULL)
|
||||||
|
{
|
||||||
|
for (int j= 1; j < ncols; j++)
|
||||||
|
{
|
||||||
|
const TRecordset_column_info & c = column_info(i);
|
||||||
|
const real * val = (const real *) row->objptr(c._name);
|
||||||
|
if (val != NULL)
|
||||||
|
set(j, *val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// APPLICAZIONE
|
// APPLICAZIONE
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
@ -63,13 +123,14 @@ class TRib_movanal_app : public TSkeleton_application
|
|||||||
{
|
{
|
||||||
TCache_ripartizioni _cache_rip;
|
TCache_ripartizioni _cache_rip;
|
||||||
bool _definitivo;
|
bool _definitivo;
|
||||||
|
TAssoc_array _calc;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void main_loop();
|
virtual void main_loop();
|
||||||
|
|
||||||
bool elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows, TRecord_array& output_rows);
|
bool elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows, TRecord_array& output_rows);
|
||||||
bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, TRecord_array& output_rows);
|
bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path, TRecord_array& output_rows, TArray & output_paths);
|
||||||
bool pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, TRecord_array& output_rows);
|
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);
|
||||||
@ -77,8 +138,8 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec,
|
bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path,
|
||||||
TRecord_array& output_rows)
|
TRecord_array& output_rows, TArray & output_paths)
|
||||||
{
|
{
|
||||||
bool ho_pareggiato = false;
|
bool ho_pareggiato = false;
|
||||||
|
|
||||||
@ -101,7 +162,7 @@ bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_ba
|
|||||||
//..originale ed ottenere cosi' il pareggio
|
//..originale ed ottenere cosi' il pareggio
|
||||||
TRectype swaprec(rec);
|
TRectype swaprec(rec);
|
||||||
swaprec.put(RMOVANA_SEZIONE, imp_riga.sezione() == 'D' ? 'A' : 'D');
|
swaprec.put(RMOVANA_SEZIONE, imp_riga.sezione() == 'D' ? 'A' : 'D');
|
||||||
ho_pareggiato = ripartizione(rrip, swaprec, output_rows);
|
ho_pareggiato = ripartizione(rrip, swaprec, path, output_rows, output_paths);
|
||||||
|
|
||||||
//elimina il codcontoori da tutte le righe aggiunte per il pareggio
|
//elimina il codcontoori da tutte le righe aggiunte per il pareggio
|
||||||
for (int i = output_rows.rows(); i > original_nriga; i--)
|
for (int i = output_rows.rows(); i > original_nriga; i--)
|
||||||
@ -110,13 +171,30 @@ 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, TRecord_array& output_rows, TArray & output_paths)
|
||||||
bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, TRecord_array& output_rows)
|
|
||||||
{
|
{
|
||||||
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
|
||||||
TGeneric_distrib distrib(rec.get_real(RMOVANA_IMPORTO), TCurrency::get_firm_dec());
|
const real importo = rec.get_real(RMOVANA_IMPORTO);
|
||||||
|
TGeneric_distrib distrib(importo, TCurrency::get_firm_dec());
|
||||||
|
TToken_string rowkey("Code", ',');
|
||||||
|
|
||||||
|
rowkey.add(rec.get(RMOVANA_CODCCOSTO));
|
||||||
|
rowkey.add(rec.get(RMOVANA_CODCMS));
|
||||||
|
rowkey.add(rec.get(RMOVANA_CODFASE));
|
||||||
|
rowkey.add(rec.get(RMOVANA_CODCONTO));
|
||||||
|
|
||||||
|
TAssoc_array * row = (TAssoc_array *)_calc.objptr(rowkey);
|
||||||
|
|
||||||
|
if (row == NULL)
|
||||||
|
row = (TAssoc_array *) _calc.add(rowkey, new TAssoc_array);
|
||||||
|
|
||||||
|
real * value = (real *) row->objptr(rowkey);
|
||||||
|
|
||||||
|
if (value == NULL)
|
||||||
|
value = (real *) row->add(rowkey, new real);
|
||||||
|
|
||||||
|
*value -= importo;
|
||||||
// Calcolo tutte le percentuali da ripartire
|
// Calcolo tutte le percentuali da ripartire
|
||||||
int i;
|
int i;
|
||||||
const int righe_ripartizione = rrip.rows();
|
const int righe_ripartizione = rrip.rows();
|
||||||
@ -136,10 +214,21 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
||||||
newrec->put(RMOVANA_IMPORTO, imp); //e la mette nella nuova riga
|
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)
|
//poi copia i valori dei campi cdc,cms,fsc,in quelli di tipo ori (nello stesso record)
|
||||||
ca_copia_campo(rec, RMOVANA_CODCCOSTO, *newrec, RMOVANA_CODCCORI);
|
if (rec.get(RMOVANA_CODCCORI).blank() && rec.get(RMOVANA_CODCMSORI).blank() &&
|
||||||
ca_copia_campo(rec, RMOVANA_CODCMS, *newrec, RMOVANA_CODCMSORI);
|
rec.get(RMOVANA_CODFASEORI).blank()) // RMOVANA_CODCONTORI è vuoto nel caso di pareggio
|
||||||
ca_copia_campo(rec, RMOVANA_CODFASE, *newrec, RMOVANA_CODFASEORI);
|
{
|
||||||
ca_copia_campo(rec, RMOVANA_CODCONTO, *newrec, RMOVANA_CODCONTORI);
|
ca_copia_campo(rec, RMOVANA_CODCCOSTO, *newrec, RMOVANA_CODCCORI);
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODCMS, *newrec, RMOVANA_CODCMSORI);
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODFASE, *newrec, RMOVANA_CODFASEORI);
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODCONTO, *newrec, RMOVANA_CODCONTORI);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCCORI);
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODCMSORI);
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, RMOVANA_CODFASEORI);
|
||||||
|
ca_copia_campo(rec, RMOVANA_CODCCORI, *newrec, 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, *newrec, RMOVANA_CODCCOSTO);
|
||||||
ca_copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS);
|
ca_copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS);
|
||||||
@ -147,6 +236,20 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const
|
|||||||
ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO);
|
ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO);
|
||||||
|
|
||||||
output_rows.add_row(newrec);
|
output_rows.add_row(newrec);
|
||||||
|
output_paths.add(path);
|
||||||
|
TToken_string ripkey("Code", ',');
|
||||||
|
|
||||||
|
ripkey.add(rec.get(RMOVANA_CODCCOSTO));
|
||||||
|
ripkey.add(rec.get(RMOVANA_CODCMS));
|
||||||
|
ripkey.add(rec.get(RMOVANA_CODFASE));
|
||||||
|
ripkey.add(rec.get(RMOVANA_CODCONTO));
|
||||||
|
|
||||||
|
real * value = (real *) row->objptr(ripkey);
|
||||||
|
|
||||||
|
if (value == NULL)
|
||||||
|
value = (real *) row->add(ripkey, new real);
|
||||||
|
*value += imp;
|
||||||
|
|
||||||
ho_ripartito = true;
|
ho_ripartito = true;
|
||||||
} //if(imp!=ZERO)...
|
} //if(imp!=ZERO)...
|
||||||
} //for(i=1;i<=righe_ripartizione...
|
} //for(i=1;i<=righe_ripartizione...
|
||||||
@ -161,9 +264,11 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r
|
|||||||
|
|
||||||
const int annoes = anal_mov.get_int(MOVANA_ANNOES);
|
const int annoes = anal_mov.get_int(MOVANA_ANNOES);
|
||||||
const char tipomov = anal_mov.get_char(MOVANA_TIPOMOV);
|
const char tipomov = anal_mov.get_char(MOVANA_TIPOMOV);
|
||||||
|
TArray input_paths;
|
||||||
|
TArray output_paths;
|
||||||
int loop = 0;
|
int loop = 0;
|
||||||
|
|
||||||
while (loop < 50)
|
while (loop++ < 50)
|
||||||
{
|
{
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
for (int r = 1; r <= input_rows.rows(); r++)
|
for (int r = 1; r <= input_rows.rows(); r++)
|
||||||
@ -175,6 +280,9 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r
|
|||||||
//ripartizione batch: passa il conto perche' per prima cosa provera' una ripartizione di tipo 'P' con chiave 3; se non..
|
//ripartizione batch: passa il conto perche' per prima cosa provera' una ripartizione di tipo 'P' con chiave 3; se non..
|
||||||
//..ci riuscira', provera' da solo (metodi della TCache_ripartizioni) le ripartizioni di tipo 'B' con chiave 4.
|
//..ci riuscira', provera' da solo (metodi della TCache_ripartizioni) le ripartizioni di tipo 'B' con chiave 4.
|
||||||
const TAnal_ripartizioni_batch& rrip = _cache_rip.righe(zio, annoes, rmovana_indbil, tipomov);
|
const TAnal_ripartizioni_batch& rrip = _cache_rip.righe(zio, annoes, rmovana_indbil, tipomov);
|
||||||
|
if (input_paths.objptr(r) == NULL)
|
||||||
|
input_paths.add(new TToken_string, r);
|
||||||
|
const TToken_string & input_path = (TToken_string &) input_paths[r];
|
||||||
const char tiporip = rrip.tiporip();
|
const char tiporip = rrip.tiporip();
|
||||||
|
|
||||||
//ci sono righe di ripartizione
|
//ci sono righe di ripartizione
|
||||||
@ -182,16 +290,26 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r
|
|||||||
bool ripartisci = righe_ripartizione > 0;
|
bool ripartisci = righe_ripartizione > 0;
|
||||||
|
|
||||||
//se ci sono righe di ripartizione/pareggio si va a ripartire!
|
//se ci sono righe di ripartizione/pareggio si va a ripartire!
|
||||||
if (ripartisci)
|
TToken_string path_item("Code", ',');
|
||||||
|
|
||||||
|
path_item.add(rec.get(RRIP_CODCOSTO));
|
||||||
|
path_item.add(rec.get(RRIP_CODCMS));
|
||||||
|
path_item.add(rec.get(RRIP_CODFASE));
|
||||||
|
path_item.add(rec.get(RRIP_CODCONTO));
|
||||||
|
|
||||||
|
if (ripartisci)
|
||||||
|
ripartisci = input_path.find(path_item) < 0;
|
||||||
|
if (ripartisci)
|
||||||
{
|
{
|
||||||
|
input_paths.add(path_item);
|
||||||
switch (tiporip)
|
switch (tiporip)
|
||||||
{
|
{
|
||||||
//procedura di ripartizione batch 'B' originale; se tiporip=='P' invece ci vuole il pareggio del movana
|
//procedura di ripartizione batch 'B' originale; se tiporip=='P' invece ci vuole il pareggio del movana
|
||||||
case 'B':
|
case 'B':
|
||||||
modified |= ripartizione(rrip, rec, output_rows);
|
modified |= ripartizione(rrip, rec, input_path, output_rows, output_paths);
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
modified |= pareggio(anal_mov, rrip, rec, output_rows);
|
modified |= pareggio(anal_mov, rrip, rec, input_path, output_rows, output_paths);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -202,12 +320,14 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r
|
|||||||
TRectype* newrec = new TRectype(rec);
|
TRectype* newrec = new TRectype(rec);
|
||||||
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
||||||
output_rows.add_row(newrec);
|
output_rows.add_row(newrec);
|
||||||
|
output_paths.add(input_path, output_rows.rows() + 1);
|
||||||
}
|
}
|
||||||
} //for(int r=1; r<=input_rows.rows()...
|
} //for(int r=1; r<=input_rows.rows()...
|
||||||
if (modified)
|
if (modified)
|
||||||
{
|
{
|
||||||
ho_cambiato_qualchecosa = true;
|
ho_cambiato_qualchecosa = true;
|
||||||
input_rows = output_rows;
|
input_rows = output_rows;
|
||||||
|
input_paths = output_paths;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
@ -250,6 +370,15 @@ bool TRib_movanal_app::elabora_movimento(TAnal_mov& anal_mov, const bool esplodi
|
|||||||
{
|
{
|
||||||
//Imploditore
|
//Imploditore
|
||||||
do_rewrite = ca_implode_rows(input_rows, compact_rows);
|
do_rewrite = ca_implode_rows(input_rows, compact_rows);
|
||||||
|
for (int r = 1; r <= compact_rows.rows(); r++)
|
||||||
|
{
|
||||||
|
TRectype& rec = compact_rows[r];
|
||||||
|
|
||||||
|
rec.zero(RMOVANA_CODCCORI);
|
||||||
|
rec.zero(RMOVANA_CODCMSORI);
|
||||||
|
rec.zero(RMOVANA_CODFASEORI);
|
||||||
|
rec.zero(RMOVANA_CODCONTORI);
|
||||||
|
}
|
||||||
if (do_rewrite)
|
if (do_rewrite)
|
||||||
{
|
{
|
||||||
input_rows = compact_rows; // rimette i record compattati negli originali
|
input_rows = compact_rows; // rimette i record compattati negli originali
|
||||||
@ -332,6 +461,15 @@ 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));
|
||||||
|
|
||||||
|
fname.add(mask.get(F_NAME));
|
||||||
|
if (fname.full())
|
||||||
|
{
|
||||||
|
TCSV_recset recset(_calc);
|
||||||
|
|
||||||
|
recset.save_as(fname);
|
||||||
|
}
|
||||||
} //if(run)...
|
} //if(run)...
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -10,3 +10,6 @@
|
|||||||
//..sheet
|
//..sheet
|
||||||
#define F_CODCAUS 113
|
#define F_CODCAUS 113
|
||||||
#define F_DESCAUS 114
|
#define F_DESCAUS 114
|
||||||
|
#define F_PATH 115
|
||||||
|
#define F_NAME 116
|
||||||
|
|
||||||
|
@ -83,6 +83,22 @@ BEGIN
|
|||||||
PROMPT 2 7 "Blocca movimenti elaborati (DEFINITIVO e vale solo per ripartizione)"
|
PROMPT 2 7 "Blocca movimenti elaborati (DEFINITIVO e vale solo per ripartizione)"
|
||||||
END
|
END
|
||||||
|
|
||||||
|
GROUPBOX DLG_NULL 78 8
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 8 "@bFoglio Excel del calcolo"
|
||||||
|
END
|
||||||
|
STRING F_PATH 255 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 9 "Cartella "
|
||||||
|
DSELECT
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_NAME 255 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 10 "File "
|
||||||
|
FSELECT "*.xls"
|
||||||
|
END
|
||||||
|
|
||||||
ENDPAGE
|
ENDPAGE
|
||||||
|
|
||||||
ENDMASK
|
ENDMASK
|
||||||
|
Loading…
x
Reference in New Issue
Block a user