Patch level :4.0 744
Files correlati : Ricompilazione Demo : [ ] Commento :superstampa adolfica (e braunica) in corso! Adesso implode ma scazza una parte degli importi... git-svn-id: svn://10.65.10.50/trunk@15485 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
f56d53d4b6
commit
a247a12bb4
110
ca/ca2200.cpp
110
ca/ca2200.cpp
@ -129,14 +129,7 @@ class TRib_movanal_app : public TSkeleton_application
|
||||
protected:
|
||||
virtual void main_loop();
|
||||
|
||||
void implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows) const;
|
||||
bool explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows, const int annoes);
|
||||
bool ori_present(const TRectype& rec) const;
|
||||
|
||||
void copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) const;
|
||||
void taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst) const;
|
||||
bool can_merge_rows(const TRectype& compact_rec, const TRectype& rec) const;
|
||||
|
||||
bool pareggia_commessa(TAnal_mov& anal_mov);
|
||||
|
||||
public:
|
||||
@ -144,91 +137,6 @@ public:
|
||||
TRib_movanal_app(){}
|
||||
};
|
||||
|
||||
void TRib_movanal_app::copia_campo(const TRectype& src, const char* campo_src,
|
||||
TRectype& dst, const char* campo_dst) const
|
||||
{
|
||||
const TString& valore = src.get(campo_src);
|
||||
if (!valore.blank())
|
||||
dst.put(campo_dst, valore);
|
||||
}
|
||||
|
||||
void TRib_movanal_app::taglia_campo(TRectype& src, const char* campo_src,
|
||||
TRectype& dst, const char* campo_dst) const
|
||||
{
|
||||
copia_campo(src, campo_src, dst, campo_dst);
|
||||
src.zero(campo_src);
|
||||
}
|
||||
|
||||
bool TRib_movanal_app::can_merge_rows(const TRectype& compact_rec, const TRectype& rec) const
|
||||
{
|
||||
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) const
|
||||
{
|
||||
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) const
|
||||
{
|
||||
for (int r = 1; r <= input_rows.rows(); r++)
|
||||
{
|
||||
const TRectype& rec = input_rows.row(r); //record originale
|
||||
//se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere
|
||||
if (ori_present(rec))
|
||||
{
|
||||
int i = 0;
|
||||
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
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_array& output_rows, const int annoes)
|
||||
{
|
||||
bool ho_cambiato_qualchecosa = false;
|
||||
@ -271,15 +179,15 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr
|
||||
newrec->put(RMOVANA_NUMRIG, output_rows.rows() + 1);
|
||||
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);
|
||||
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);
|
||||
//e mette nei campi std i valori che trova nelle righe ripartizione
|
||||
copia_campo(rrip[i], RRIP_CODCOSTO, *newrec, RMOVANA_CODCCOSTO);
|
||||
copia_campo(rrip[i], RRIP_CODCMS, *newrec, RMOVANA_CODCMS);
|
||||
copia_campo(rrip[i], RRIP_CODFASE, *newrec, RMOVANA_CODFASE);
|
||||
copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO);
|
||||
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_CODFASE, *newrec, RMOVANA_CODFASE);
|
||||
ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO);
|
||||
|
||||
output_rows.add_row(newrec);
|
||||
ho_cambiato_qualchecosa = true;
|
||||
@ -354,7 +262,7 @@ bool TRib_movanal_app::cappotta_movimento(TAnal_mov& anal_mov)
|
||||
TRecord_array compact_rows = input_rows; //record array con le righe compattate da creare con la..
|
||||
compact_rows.destroy_rows(); //..implode_rows(); intanto le azzera per sicurezza
|
||||
//Imploditore
|
||||
implode_rows(input_rows, compact_rows);
|
||||
ca_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..
|
||||
|
@ -235,6 +235,7 @@ class TPrint_rendiconto_ca_recordset : public TISAM_recordset
|
||||
TExternisamfile* _tmp;
|
||||
bool _riclassificato;
|
||||
bool _reverse_cos_ric;
|
||||
bool _implode_rows;
|
||||
TString _prefix;
|
||||
TAssoc_array _ratrisc;
|
||||
|
||||
@ -1031,13 +1032,59 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana()
|
||||
const TRectype& rmovana = cur_rmovana.curr();
|
||||
const TRectype& movana = rel_rmovana.curr(LF_MOVANA);
|
||||
TProgind pi(rmovana_items, "Scansione righe movimenti...", true, true);
|
||||
for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana)
|
||||
{
|
||||
pi.addstatus(1);
|
||||
if (pi.iscancelled())
|
||||
break;
|
||||
scrive_riga(rmovana, movana, NULL);
|
||||
}
|
||||
//aggiunta adolfica di implosione righe movimenti eventualmente ripartite in precedenza..
|
||||
//..modifica che serve solo al CRPA
|
||||
//se si e' scelto di compattare le rmovana...
|
||||
if (_implode_rows)
|
||||
{
|
||||
TRecord_array righe_attuali(LF_RMOVANA, RMOVANA_NUMRIG);
|
||||
TRecord_array righe_compattate(LF_RMOVANA, RMOVANA_NUMRIG);
|
||||
TRectype old_movana(LF_MOVANA);
|
||||
long old_numreg = 0L;
|
||||
//si usa <= per forzare il cambio testata anche sull'ultimo movimento (in modo da uscire correttamente)
|
||||
//NON mettere < e basta che sbaglia l'ultimo!!!
|
||||
for (cur_rmovana = 0; cur_rmovana.pos() <= rmovana_items; ++cur_rmovana)
|
||||
{
|
||||
//legge la testata iniziale
|
||||
const long numreg = rmovana.get_long(RMOVANA_NUMREG);
|
||||
//se la testata e' cambiata, allora ha cambiato movana e quindi le righe da compattare sono..
|
||||
//..quelle che ha gia' messo nell'array delle righe_attuali
|
||||
if (numreg != old_numreg)
|
||||
{
|
||||
if (righe_attuali.rows() > 0) //quando righe_attuali e' vuoto sei al primo giro
|
||||
{
|
||||
//quindi implode le righe attuali del movimento, generando l'array delle righe_compattate
|
||||
ca_implode_rows(righe_attuali, righe_compattate);
|
||||
//adesso fa la scrittura delle righe compattate
|
||||
const int last_row = righe_compattate.last_row();
|
||||
for (int i = righe_compattate.first_row(); i > 0 && i <= last_row; i = righe_compattate.succ_row(i))
|
||||
scrive_riga(righe_compattate.row(i), old_movana, NULL);
|
||||
}
|
||||
//aggiorna il valore di testata con quella nuova per il prossimo movimento
|
||||
old_movana = movana;
|
||||
old_numreg = numreg;
|
||||
//pulisce gli array che sono pronti ad essere nuovamente riempiti
|
||||
righe_attuali.destroy_rows();
|
||||
righe_compattate.destroy_rows();
|
||||
}
|
||||
//aggiunge le righe analitiche all'array da compattare (se rmovana e' vuoto ha gia' terminato)
|
||||
if (numreg > 0)
|
||||
{
|
||||
righe_attuali.insert_row(rmovana);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
else //if(_implode_rows.. metodo standard senza ripartizioni
|
||||
{
|
||||
for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana)
|
||||
{
|
||||
if (!pi.addstatus(1))
|
||||
break;
|
||||
scrive_riga(rmovana, movana, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1346,6 +1393,8 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask&
|
||||
}
|
||||
//vuoi l'ordinamento normale o sei la Roberta del CRPA?
|
||||
_reverse_cos_ric = msk.get_bool(F_REV_COSRIC);
|
||||
//sei al CRPA e vuoi implodere le righemovana ripartite in precedenza?
|
||||
_implode_rows = msk.get_bool(F_IMPLODE_ROWS);
|
||||
|
||||
//c'e' un fottuto range di date?
|
||||
_dadata = msk.get_date(F_DATAINI);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#define F_DATAINI 256
|
||||
#define F_DATAFIN 257
|
||||
#define F_REV_COSRIC 258
|
||||
#define F_IMPLODE_ROWS 259
|
||||
|
||||
//campi generati dai piani dei conti
|
||||
#define F_PIANO 319
|
||||
|
@ -68,9 +68,14 @@ BEGIN
|
||||
PROMPT 1 3 "Stampa Ricavi prima dei Costi"
|
||||
END
|
||||
|
||||
BOOLEAN F_IMPLODE_ROWS
|
||||
BEGIN
|
||||
PROMPT 1 4 "Compatta movimenti ripartiti"
|
||||
END
|
||||
|
||||
SPREADSHEET F_RIGHE -1 -4
|
||||
BEGIN
|
||||
PROMPT 0 5 "Centro di Costo / Commessa / Fase"
|
||||
PROMPT 0 6 "Centro di Costo / Commessa / Fase"
|
||||
ITEM "Cdc1"
|
||||
ITEM "Cdc2"
|
||||
ITEM "Cdc3"
|
||||
|
@ -1598,4 +1598,90 @@ const TAnal_ripartizioni_batch& TCache_ripartizioni::righe(const TBill& bill, co
|
||||
TCache_ripartizioni::TCache_ripartizioni()
|
||||
{
|
||||
_codes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Metodi per la ricompattazione delle righe ripartite
|
||||
///////////////////////////////////////////////////////////
|
||||
bool ca_can_merge_rows(const TRectype& compact_rec, const TRectype& rec)
|
||||
{
|
||||
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 ca_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 ca_taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst)
|
||||
{
|
||||
ca_copia_campo(src, campo_src, dst, campo_dst);
|
||||
src.zero(campo_src);
|
||||
}
|
||||
|
||||
void ca_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);
|
||||
}
|
||||
|
||||
void ca_implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows)
|
||||
{
|
||||
const int last_row = input_rows.last_row();
|
||||
for (int r = input_rows.first_row(); r > 0 && r <= last_row; r = input_rows.succ_row(r))
|
||||
{
|
||||
const TRectype& rec = input_rows.row(r); //record originale
|
||||
//se esiste almeno un campo origine compilato puo' implodere, senno' lascia perdere
|
||||
if (ca_ori_present(rec))
|
||||
{
|
||||
int i = 0;
|
||||
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 (ca_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
|
||||
{
|
||||
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 (ca_ori_present(compact_rec))
|
||||
{
|
||||
ca_taglia_campo(compact_rec, RMOVANA_CODCCORI, compact_rec, RMOVANA_CODCCOSTO);
|
||||
ca_taglia_campo(compact_rec, RMOVANA_CODCMSORI, compact_rec, RMOVANA_CODCMS);
|
||||
ca_taglia_campo(compact_rec, RMOVANA_CODFASEORI, compact_rec, RMOVANA_CODFASE);
|
||||
ca_taglia_campo(compact_rec, RMOVANA_CODCONTORI, compact_rec, RMOVANA_CODCONTO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -198,4 +198,11 @@ public:
|
||||
TCache_ripartizioni();
|
||||
};
|
||||
|
||||
// metodi di implosione movimenti ripartiti!! Serve nel ribaltamento movimenti, stampa rendiconto...
|
||||
void ca_implode_rows(const TRecord_array& input_rows, TRecord_array& compact_rows);
|
||||
bool ca_ori_present(const TRectype& rec);
|
||||
bool ca_can_merge_rows(const TRectype& compact_rec, const TRectype& rec);
|
||||
void ca_taglia_campo(TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst);
|
||||
void ca_copia_campo(const TRectype& src, const char* campo_src, TRectype& dst, const char* campo_dst);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user