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:
		
							parent
							
								
									c62c3fd8d4
								
							
						
					
					
						commit
						ea6b6dc09f
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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())
 | 
				
			||||||
@ -367,7 +367,7 @@ 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,27 +648,31 @@ 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 (select.not_empty())
 | 
				
			||||||
 | 
					    query << " SELECT " << select;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (b.conto().not_empty())
 | 
					  if (b.conto().not_empty())
 | 
				
			||||||
    query << " CONTO=" << b.conto();
 | 
					  {
 | 
				
			||||||
 | 
					    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';
 | 
					    query << '\n';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  TISAM_recordset saldini(query);
 | 
					  TISAM_recordset saldini(query);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -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)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -848,6 +852,8 @@ bool TSaldi_cache::saldo_movimenti(const TAnal_bill& b,
 | 
				
			|||||||
bool TSaldi_cache::saldi(const TAnal_bill& bill, 
 | 
					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)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  if (dal.ok() || al.ok())
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    // Calcolo i saldi fino all'anno scorso.
 | 
					    // Calcolo i saldi fino all'anno scorso.
 | 
				
			||||||
    // In assemza di data iniziale mi torna 0
 | 
					    // In assemza di data iniziale mi torna 0
 | 
				
			||||||
@ -860,18 +866,25 @@ bool TSaldi_cache::saldi(const TAnal_bill& bill,
 | 
				
			|||||||
      s._ini += avere;
 | 
					      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
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      saldo_movimenti(bill, dal, al, tipo, s);
 | 
					      saldo_movimenti(bill, dal, al, tipo, s);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    // 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; 
 | 
				
			||||||
 | 
				
			|||||||
@ -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| 
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user