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); | ||||
| 	if (tipomov <= ' ' || tipomov == 'T') | ||||
| 	{ | ||||
| 
 | ||||
| 		//serve un documento da cui ricavare i parametri di stampa
 | ||||
| 		TDocumento* newdoc = (TDocumento*)doc; | ||||
| 		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)); | ||||
| 			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...
 | ||||
| 		if (dadoc)	//movimento generato da documento
 | ||||
| 		{ | ||||
| @ -681,7 +680,6 @@ F=IMF*/ | ||||
| //scanning delle righe dei movimenti di analitica
 | ||||
| void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana() | ||||
| { | ||||
| 
 | ||||
| 	TRelation rel_rmovana(LF_RMOVANA); | ||||
| 	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); | ||||
| 	const long rmovana_items = cur_rmovana.items(); | ||||
| 	cur_rmovana.freeze(); | ||||
| 
 | ||||
| 	const TRecnotype rmovana_items = cur_rmovana.items(); | ||||
| 	//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
 | ||||
| 	if (rmovana_items > 0) | ||||
| 	{ | ||||
|   	cur_rmovana.freeze(); | ||||
| 		const TRectype& rmovana = cur_rmovana.curr(); | ||||
| 		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) | ||||
| 		{ | ||||
| 			pi.addstatus(1); | ||||
|       if (pi.iscancelled()) | ||||
|         break; | ||||
| 			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
 | ||||
| 	TCursor cur_rdoc(&rel_rdoc, "", 3, &dardoc, &ardoc); | ||||
| 	 | ||||
| 	cur_rdoc.setfilter(filtro, update); | ||||
| 	 | ||||
| 	const long rdoc_items = cur_rdoc.items(); | ||||
| 	cur_rdoc.freeze(); | ||||
| 
 | ||||
| 	const TRecnotype rdoc_items = cur_rdoc.items(); | ||||
| 	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..
 | ||||
| 		//..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) | ||||
| 		{ | ||||
| 			pi.addstatus(1); | ||||
|       if (pi.iscancelled()) | ||||
|         break; | ||||
| 
 | ||||
|       const TRectype& curr_doc = cur_rdoc.curr(LF_DOC); | ||||
| 			//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
 | ||||
| @ -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..
 | ||||
| 		{ | ||||
| 			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
 | ||||
| 		} | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										103
									
								
								ca/calib02.cpp
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								ca/calib02.cpp
									
									
									
									
									
								
							| @ -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) | ||||
| { | ||||
|   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) | ||||
|       separator = stack.pop().as_string(); | ||||
|     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); } | ||||
| 
 | ||||
| void TAnal_report::msg_format_commessa(TVariant_stack& 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); } | ||||
| 
 | ||||
| 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
 | ||||
|   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);  | ||||
|   else | ||||
|     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) | ||||
| { | ||||
|   const TMultilevel_code_info& main_info = ca_multilevel_code_info(LF_FASI); | ||||
| 	msg_format(main_info.parent(), stack); | ||||
|   const TMultilevel_code_info& fas_info = ca_multilevel_code_info(LF_FASI); | ||||
|   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) | ||||
| @ -631,8 +633,6 @@ public: | ||||
| bool TSaldi_cache::int_saldo_annuale(const TAnal_bill& b, int da_anno, int ad_anno, word tipo,  | ||||
|                                      TImporto& dare, TImporto& avere) const | ||||
| { | ||||
|   CHECKD(ad_anno > 0, "Anno saldo finale errato: ", ad_anno); | ||||
|    | ||||
|   bool movim = false; | ||||
|   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 << "&&"; | ||||
|     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) | ||||
|   { | ||||
|     query << "\nFROM ANNO=" << da_anno; | ||||
|     if (b.conto().not_empty()) | ||||
|       query << " CONTO=" << b.conto(); | ||||
|     query << '\n'; | ||||
|     if (select.not_empty()) select << "&&"; | ||||
|     select << "(ANNO>=" << da_anno << ")"; | ||||
|   } | ||||
|   if (ad_anno > 0) | ||||
|   { | ||||
|     if (select.not_empty()) select << "&&"; | ||||
|     select << "(ANNO<=" << ad_anno << ")"; | ||||
|   } | ||||
| 
 | ||||
|   query << "\nTO ANNO=" << ad_anno; | ||||
|   if (b.conto().not_empty()) | ||||
|     query << " CONTO=" << b.conto(); | ||||
|   query << '\n'; | ||||
|   query << "USE SALDANA KEY 2"; | ||||
|   if (select.not_empty()) | ||||
|     query << " SELECT " << select; | ||||
| 
 | ||||
|   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); | ||||
| 
 | ||||
|   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) | ||||
| { | ||||
|   bool movim = false; | ||||
|   if (ad_anno > 0) | ||||
|   if (ad_anno >= 0) | ||||
|   { | ||||
|     if (tipo & _saldanal_riclassify) | ||||
|     { | ||||
| @ -849,29 +853,38 @@ bool TSaldi_cache::saldi(const TAnal_bill& bill, | ||||
|                          const TDate& dal, const TDate& al, word tipo,  | ||||
|                          TSaldanal& s) | ||||
| { | ||||
|   // Calcolo i saldi fino all'anno scorso.
 | ||||
|   // In assemza di data iniziale mi torna 0
 | ||||
|   const int anno_prec = _esc.date2prevesc(dal); | ||||
|   if (anno_prec > 0) | ||||
|   if (dal.ok() || al.ok()) | ||||
|   { | ||||
|     TImporto dare, avere; | ||||
|     saldo_annuale(bill, 0, anno_prec, tipo, dare, avere); | ||||
|     s._ini = dare; | ||||
|     s._ini += avere; | ||||
|   } | ||||
|     // Calcolo i saldi fino all'anno scorso.
 | ||||
|     // In assemza di data iniziale mi torna 0
 | ||||
|     const int anno_prec = _esc.date2prevesc(dal); | ||||
|     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) | ||||
|   { | ||||
|     // Calcolo i saldi di quest'anno
 | ||||
|     // In assemza di data iniziale somma tutti gli anni (fino al 9999)
 | ||||
|     const int anno_ini = _esc.date2esc(dal); | ||||
|     const int anno_fin = anno_ini > 0 ? anno_ini : 9999; | ||||
|     s._movimentato = saldo_annuale(bill, anno_ini, anno_fin, tipo, s._dare, s._avere); | ||||
|     if ((tipo & _saldanal_ultima_imm)!=0) | ||||
|     { | ||||
|       // Calcolo i saldi di quest'anno
 | ||||
|       // In assemza di data iniziale somma tutti gli anni (fino al 9999)
 | ||||
|       const int anno_ini = _esc.date2esc(dal); | ||||
|       const int anno_fin = anno_ini > 0 ? anno_ini : 0; | ||||
|       s._movimentato = saldo_annuale(bill, anno_ini, anno_fin, tipo, s._dare, s._avere); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       saldo_movimenti(bill, dal, al, tipo, s); | ||||
|     } | ||||
|   } | ||||
|   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._fin = s._ini;  | ||||
|   s._fin += s._dare;  | ||||
|  | ||||
| @ -11,5 +11,6 @@ SEZIONEP|7|1|0|Sezione (Preventivo) | ||||
| SALDOP|4|18|3|Saldo (Preventivo) | ||||
| SEZIONEV|7|1|0|Sezione (Variazione preventivo) | ||||
| SALDOV|4|18|3|Saldo (Variazione preventivo) | ||||
| 1 | ||||
| ANNO+CONTO+COSTO+COMMESSA+FASE|  | ||||
| 2 | ||||
| ANNO+CONTO+COSTO+COMMESSA+FASE| | ||||
| CONTO+ANNO+COSTO+COMMESSA+FASE|  | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user