Patch level : 2.2

Files correlati     : ca3.exe
Ricompilazione Demo : [ ]
Commento            :

Ottimizzato calcolo saldi dei conti analitici
introducendo la chiave per conto (2) sul file saldana


git-svn-id: svn://10.65.10.50/trunk@13341 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2005-09-12 16:24:04 +00:00
parent c62c3fd8d4
commit ea6b6dc09f
3 changed files with 74 additions and 60 deletions

View File

@ -503,7 +503,6 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const
const char tipomov = movana.get_char(MOVANA_TIPOMOV); const char tipomov = movana.get_char(MOVANA_TIPOMOV);
if (tipomov <= ' ' || tipomov == 'T') if (tipomov <= ' ' || tipomov == 'T')
{ {
//serve un documento da cui ricavare i parametri di stampa //serve un documento da cui ricavare i parametri di stampa
TDocumento* newdoc = (TDocumento*)doc; TDocumento* newdoc = (TDocumento*)doc;
bool should_delete = false; bool should_delete = false;
@ -513,8 +512,8 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(const TRectype& rmovana, const
newdoc = new TDocumento('D', movana.get_int(MOVANA_DANNO), dacodnum, movana.get_long(MOVANA_DNDOC)); newdoc = new TDocumento('D', movana.get_int(MOVANA_DANNO), dacodnum, movana.get_long(MOVANA_DNDOC));
should_delete = true; //settato true per cancellare il doc al termine del metodo(sennò addio memoria!) should_delete = true; //settato true per cancellare il doc al termine del metodo(sennò addio memoria!)
} }
const bool dadoc = newdoc != NULL;
const bool dadoc = newdoc != NULL;
//i movimenti possono essere normali o generati da documento... //i movimenti possono essere normali o generati da documento...
if (dadoc) //movimento generato da documento if (dadoc) //movimento generato da documento
{ {
@ -681,7 +680,6 @@ F=IMF*/
//scanning delle righe dei movimenti di analitica //scanning delle righe dei movimenti di analitica
void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana() void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana()
{ {
TRelation rel_rmovana(LF_RMOVANA); TRelation rel_rmovana(LF_RMOVANA);
rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr
@ -728,19 +726,20 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana()
} }
TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana);
const long rmovana_items = cur_rmovana.items(); const TRecnotype rmovana_items = cur_rmovana.items();
cur_rmovana.freeze();
//scorre le righe movimenti di analitica che soddisfano il filtro //scorre le righe movimenti di analitica che soddisfano il filtro
//il join a movana serve nel caso necessitino dati di testata per la riga in questione //il join a movana serve nel caso necessitino dati di testata per la riga in questione
if (rmovana_items > 0) if (rmovana_items > 0)
{ {
cur_rmovana.freeze();
const TRectype& rmovana = cur_rmovana.curr(); const TRectype& rmovana = cur_rmovana.curr();
const TRectype& movana = rel_rmovana.curr(LF_MOVANA); const TRectype& movana = rel_rmovana.curr(LF_MOVANA);
TProgind pi(rmovana_items, "Scansione righe movimenti..."); TProgind pi(rmovana_items, "Scansione righe movimenti...", true, true);
for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana)
{ {
pi.addstatus(1); pi.addstatus(1);
if (pi.iscancelled())
break;
scrive_riga(rmovana, movana, NULL); scrive_riga(rmovana, movana, NULL);
} }
} }
@ -840,15 +839,13 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(const TPrint_rendiconto_
//il filtro è completo;può eseguire la scansione //il filtro è completo;può eseguire la scansione
TCursor cur_rdoc(&rel_rdoc, "", 3, &dardoc, &ardoc); TCursor cur_rdoc(&rel_rdoc, "", 3, &dardoc, &ardoc);
cur_rdoc.setfilter(filtro, update); cur_rdoc.setfilter(filtro, update);
const long rdoc_items = cur_rdoc.items(); const TRecnotype rdoc_items = cur_rdoc.items();
cur_rdoc.freeze();
if (rdoc_items > 0) if (rdoc_items > 0)
{ {
TProgind pi(rdoc_items, "Scansione righe documenti..."); cur_rdoc.freeze();
TProgind pi(rdoc_items, "Scansione righe documenti...", true, true);
//memorizza l'ultimo doc per evitare doppioni in caso di doc con più righe (rielaborerebbe.. //memorizza l'ultimo doc per evitare doppioni in caso di doc con più righe (rielaborerebbe..
//..lo stesso documento tante volte quante sono le sue righe!) //..lo stesso documento tante volte quante sono le sue righe!)
@ -858,6 +855,9 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(const TPrint_rendiconto_
for (cur_rdoc = 0; cur_rdoc.pos() < rdoc_items; ++cur_rdoc) for (cur_rdoc = 0; cur_rdoc.pos() < rdoc_items; ++cur_rdoc)
{ {
pi.addstatus(1); pi.addstatus(1);
if (pi.iscancelled())
break;
const TRectype& curr_doc = cur_rdoc.curr(LF_DOC); const TRectype& curr_doc = cur_rdoc.curr(LF_DOC);
//controlla se il documento cui appartiene la rigadoc e' stato contabilizzato; //controlla se il documento cui appartiene la rigadoc e' stato contabilizzato;
//se e' stato contabilizzato lo salta in quanto la riga documento apparira' attraverso le righe //se e' stato contabilizzato lo salta in quanto la riga documento apparira' attraverso le righe
@ -1094,7 +1094,7 @@ void TPrint_rendiconto_ca::main_loop()
FOR_EACH_SHEET_ROW(sheet, r, row) //per ogni cdc/cms che appare nello sheet di pag.1 della msk.. FOR_EACH_SHEET_ROW(sheet, r, row) //per ogni cdc/cms che appare nello sheet di pag.1 della msk..
{ {
rep.set_filter(*_mask, r); //..chiama il metodone globale che crea e compila il file.. rep.set_filter(*_mask, r); //..chiama il metodone globale che crea e compila il file..
//..temporaneo i cui dati riempiranno il report //..temporaneo i cui dati riempiranno il report
book.add(rep); //aggiunge il report relativo alla cdc/cms corrente al book book.add(rep); //aggiunge il report relativo alla cdc/cms corrente al book
} }

View File

@ -338,9 +338,9 @@ size_t TAnal_report::get_usr_words(TString_array& words) const
void TAnal_report::msg_format(int logicnum, TVariant_stack& stack) void TAnal_report::msg_format(int logicnum, TVariant_stack& stack)
{ {
const TString& str_in = curr_field()->get().as_string(); const TString& str_in = curr_field()->get().as_string();
if (str_in.not_empty()) if (!str_in.blank())
{ {
TString80 separator = " "; TString8 separator = " ";
if (stack.items() > 0) if (stack.items() > 0)
separator = stack.pop().as_string(); separator = stack.pop().as_string();
if (separator.not_empty()) if (separator.not_empty())
@ -354,20 +354,20 @@ void TAnal_report::msg_format(int logicnum, TVariant_stack& stack)
} }
} }
void TAnal_report::msg_format_costo (TVariant_stack& stack) void TAnal_report::msg_format_costo(TVariant_stack& stack)
{ msg_format(LF_CDC, stack); } { msg_format(LF_CDC, stack); }
void TAnal_report::msg_format_commessa(TVariant_stack& stack) void TAnal_report::msg_format_commessa(TVariant_stack& stack)
{ msg_format(LF_COMMESSE, stack); } { msg_format(LF_COMMESSE, stack); }
void TAnal_report::msg_format_fase (TVariant_stack& stack) void TAnal_report::msg_format_fase(TVariant_stack& stack)
{ msg_format(LF_FASI, stack); } { msg_format(LF_FASI, stack); }
void TAnal_report::msg_format_conto (TVariant_stack& stack) void TAnal_report::msg_format_conto(TVariant_stack& stack)
{ {
// Cerca di determinare se si usa il piano contabile o analitico // Cerca di determinare se si usa il piano contabile o analitico
const TString& conto = curr_field()->get().as_string(); const TString& conto = curr_field()->get().as_string();
if (conto.len() == 12) if (conto.len() == 12 && real::is_natural(conto))
msg_format(LF_PCON, stack); msg_format(LF_PCON, stack);
else else
msg_format(LF_PCONANA, stack); msg_format(LF_PCONANA, stack);
@ -375,8 +375,10 @@ void TAnal_report::msg_format_conto (TVariant_stack& stack)
void TAnal_report::msg_format_commessa_costo(TVariant_stack& stack) void TAnal_report::msg_format_commessa_costo(TVariant_stack& stack)
{ {
const TMultilevel_code_info& main_info = ca_multilevel_code_info(LF_FASI); const TMultilevel_code_info& fas_info = ca_multilevel_code_info(LF_FASI);
msg_format(main_info.parent(), stack); const int pa = fas_info.parent();
if (pa > 0)
msg_format(pa, stack);
} }
bool TAnal_report::execute_usr_word(unsigned int opcode, TVariant_stack& stack) bool TAnal_report::execute_usr_word(unsigned int opcode, TVariant_stack& stack)
@ -631,8 +633,6 @@ public:
bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_anno, word tipo, bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_anno, word tipo,
TImporto& dare, TImporto& avere) const TImporto& dare, TImporto& avere) const
{ {
CHECKD(ad_anno > 0, "Anno saldo finale errato: ", ad_anno);
bool movim = false; bool movim = false;
TString query, select; TString query, select;
@ -648,28 +648,32 @@ bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_an
if (select.not_empty()) select << "&&"; if (select.not_empty()) select << "&&";
select << "(FASE=='" << b.fase() << "')"; select << "(FASE=='" << b.fase() << "')";
} }
if (b.conto().not_empty())
{
if (select.not_empty()) select << "&&";
select << "(CONTO[1," << b.conto().len() << "]=='" << b.conto() << "')";
}
query << "USE SALDANA";
if (select.not_empty())
query << " SELECT " << select;
if (da_anno > 0) if (da_anno > 0)
{ {
query << "\nFROM ANNO=" << da_anno; if (select.not_empty()) select << "&&";
if (b.conto().not_empty()) select << "(ANNO>=" << da_anno << ")";
query << " CONTO=" << b.conto(); }
query << '\n'; if (ad_anno > 0)
{
if (select.not_empty()) select << "&&";
select << "(ANNO<=" << ad_anno << ")";
} }
query << "\nTO ANNO=" << ad_anno; query << "USE SALDANA KEY 2";
if (b.conto().not_empty()) if (select.not_empty())
query << " CONTO=" << b.conto(); query << " SELECT " << select;
query << '\n';
if (b.conto().not_empty())
{
query << "\nFROM CONTO=" << b.conto();
if (da_anno > 0)
query << " ANNO=" << da_anno;
query << "\nTO CONTO=" << b.conto();
if (ad_anno > 0)
query << " ANNO=" << ad_anno;
query << '\n';
}
TISAM_recordset saldini(query); TISAM_recordset saldini(query);
for (TRecnotype i = 0; saldini.move_to(i); i++) for (TRecnotype i = 0; saldini.move_to(i); i++)
@ -708,7 +712,7 @@ bool TSaldi_cache::saldo_annuale(const TAnal_bill& b, int da_anno, int ad_anno,
TImporto& dare, TImporto& avere) TImporto& dare, TImporto& avere)
{ {
bool movim = false; bool movim = false;
if (ad_anno > 0) if (ad_anno >= 0)
{ {
if (tipo & _saldanal_riclassify) if (tipo & _saldanal_riclassify)
{ {
@ -849,29 +853,38 @@ bool TSaldi_cache::saldi(const TAnal_bill& bill,
const TDate& dal, const TDate& al, word tipo, const TDate& dal, const TDate& al, word tipo,
TSaldanal& s) TSaldanal& s)
{ {
// Calcolo i saldi fino all'anno scorso. if (dal.ok() || al.ok())
// In assemza di data iniziale mi torna 0
const int anno_prec = _esc.date2prevesc(dal);
if (anno_prec > 0)
{ {
TImporto dare, avere; // Calcolo i saldi fino all'anno scorso.
saldo_annuale(bill, 0, anno_prec, tipo, dare, avere); // In assemza di data iniziale mi torna 0
s._ini = dare; const int anno_prec = _esc.date2prevesc(dal);
s._ini += avere; if (anno_prec > 0)
} {
TImporto dare, avere;
saldo_annuale(bill, 0, anno_prec, tipo, dare, avere);
s._ini = dare;
s._ini += avere;
}
if (tipo & _saldanal_ultima_imm) if ((tipo & _saldanal_ultima_imm)!=0)
{ {
// Calcolo i saldi di quest'anno // Calcolo i saldi di quest'anno
// In assemza di data iniziale somma tutti gli anni (fino al 9999) // In assemza di data iniziale somma tutti gli anni (fino al 9999)
const int anno_ini = _esc.date2esc(dal); const int anno_ini = _esc.date2esc(dal);
const int anno_fin = anno_ini > 0 ? anno_ini : 9999; const int anno_fin = anno_ini > 0 ? anno_ini : 0;
s._movimentato = saldo_annuale(bill, anno_ini, anno_fin, tipo, s._dare, s._avere); s._movimentato = saldo_annuale(bill, anno_ini, anno_fin, tipo, s._dare, s._avere);
}
else
{
saldo_movimenti(bill, dal, al, tipo, s);
}
} }
else else
{ {
saldo_movimenti(bill, dal, al, tipo, s); // Se non viene specificata nessuna data voglio il saldo all'ultima immissione
s._movimentato = saldo_annuale(bill, 0, 0, tipo, s._dare, s._avere);
} }
s._ini.normalize(); s._ini.normalize();
s._fin = s._ini; s._fin = s._ini;
s._fin += s._dare; s._fin += s._dare;

View File

@ -11,5 +11,6 @@ SEZIONEP|7|1|0|Sezione (Preventivo)
SALDOP|4|18|3|Saldo (Preventivo) SALDOP|4|18|3|Saldo (Preventivo)
SEZIONEV|7|1|0|Sezione (Variazione preventivo) SEZIONEV|7|1|0|Sezione (Variazione preventivo)
SALDOV|4|18|3|Saldo (Variazione preventivo) SALDOV|4|18|3|Saldo (Variazione preventivo)
1 2
ANNO+CONTO+COSTO+COMMESSA+FASE| ANNO+CONTO+COSTO+COMMESSA+FASE|
CONTO+ANNO+COSTO+COMMESSA+FASE|