Patch level : 10.0
Files correlati : pd6342 Ricompilazione Demo : [ ] Commento : Reasa più veloce elaborazione file LF_*ANA git-svn-id: svn://10.65.10.50/branches/R_10_00@21736 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									ad13d4030c
								
							
						
					
					
						commit
						d4f93fc8cb
					
				
							
								
								
									
										127
									
								
								ps/pd6342300.cpp
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								ps/pd6342300.cpp
									
									
									
									
									
								
							| @ -4,7 +4,6 @@ | ||||
| #include <defmask.h> | ||||
| #include <progind.h> | ||||
| #include <recarray.h> | ||||
| #include <relation.h> | ||||
| #include <textset.h> | ||||
| 
 | ||||
| #include "../cg/cglib01.h" | ||||
| @ -129,18 +128,23 @@ class TRib_movanal_app : public TSkeleton_application | ||||
|   TCache_ripartizioni _cache_rip; | ||||
|   bool _definitivo; | ||||
| 	TAssoc_array _calc; | ||||
|   TArray _excl; | ||||
| 
 | ||||
| protected: | ||||
|   virtual const char * extra_modules() const {return "ca";} | ||||
|   virtual const char* extra_modules() const { return "ca"; } | ||||
|   virtual void main_loop(); | ||||
|   virtual bool create(); | ||||
|   virtual bool destroy(); | ||||
| 
 | ||||
|   bool elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows); | ||||
|   bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path_item, TRecord_array& output_rows, TArray & output_paths); | ||||
|   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); | ||||
|   bool ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path_item,  | ||||
|                     TRecord_array& output_rows, TArray & output_paths); | ||||
|   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: | ||||
|   bool elabora_movimento(TAnal_mov& anal_mov, const bool esplodi); | ||||
| 	TRib_movanal_app(){} | ||||
|   TSystemisamfile& movana() { return *(TSystemisamfile*)_excl.objptr(LF_MOVANA); } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| @ -177,7 +181,9 @@ bool TRib_movanal_app::pareggio(TAnal_mov& anal_mov, const TAnal_ripartizioni_ba | ||||
|   return ho_pareggiato; | ||||
| } | ||||
| 
 | ||||
| bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec, const TToken_string& path_item, TRecord_array& output_rows, TArray & output_paths) | ||||
| bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const TRectype& rec,  | ||||
|                                     const TToken_string& path_item, TRecord_array& output_rows,  | ||||
|                                     TArray& output_paths) | ||||
| { | ||||
|   bool ho_ripartito = false; | ||||
|   // Importo totale da distribuire arrotondato ai decimali della valuta di conto
 | ||||
| @ -191,12 +197,12 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const | ||||
| 	rowkey.add(rec.get(RMOVANA_CODFASE)); | ||||
| 	TToken_string browkey = rowkey; | ||||
| 
 | ||||
| 	TAssoc_array * row = (TAssoc_array *)_calc.objptr(rowkey); | ||||
| 	TAssoc_array* row = (TAssoc_array*)_calc.objptr(rowkey); | ||||
| 
 | ||||
| 	if (row == NULL) | ||||
| 		_calc.add(rowkey, row = new TAssoc_array); | ||||
| 
 | ||||
| 	real * value = (real *) row->objptr(browkey); | ||||
| 	real* value = (real*)row->objptr(browkey); | ||||
| 
 | ||||
| 	if (value == NULL) | ||||
| 		row->add(rowkey, value = new real); | ||||
| @ -204,7 +210,7 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const | ||||
| 	*value = *value + (sez == 'D' ? importo : -importo); | ||||
| 
 | ||||
| 	browkey.add("+"); | ||||
| 	row = (TAssoc_array *)_calc.objptr(browkey); | ||||
| 	row = (TAssoc_array*)_calc.objptr(browkey); | ||||
| 
 | ||||
| 	if (row == NULL) | ||||
| 		_calc.add(browkey, row = new TAssoc_array); | ||||
| @ -216,62 +222,64 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const | ||||
| 	 | ||||
| 	*value = *value + (sez == 'D' ? -importo : importo); | ||||
|   // Calcolo tutte le percentuali da ripartire
 | ||||
|   int i; | ||||
| 
 | ||||
|   const int righe_ripartizione = rrip.rows(); | ||||
|   for (i = 1; i <= rrip.rows(); i++) | ||||
|   for (int i = 1; i <= righe_ripartizione; i++) | ||||
|   { | ||||
|     const real importanza_riga = rrip[i].get_real(RRIP_RIPARTO); | ||||
|     distrib.add(importanza_riga); | ||||
|   } | ||||
| 
 | ||||
|   for (i = 1; i <= righe_ripartizione; i++) | ||||
|   for (int i = 1; i <= righe_ripartizione; i++) | ||||
|   { | ||||
|     const real imp = distrib.get(); // Legge la quota da distribuire
 | ||||
| 
 | ||||
| 	  if (imp != ZERO) | ||||
| 	  if (!imp.is_zero()) | ||||
| 	  { | ||||
| 		  TRectype* newrec = new TRectype(rec); | ||||
| 		  TRectype nuorec(rec); | ||||
| 
 | ||||
| 		  //poi copia i valori dei campi cdc,cms,fsc,in quelli di tipo ori (nello stesso record)
 | ||||
| 			if (rec.get(RMOVANA_CODCCORI).blank() && rec.get(RMOVANA_CODCMSORI).blank() && | ||||
| 					rec.get(RMOVANA_CODFASEORI).blank()) //  RMOVANA_CODCONTORI è vuoto nel caso di pareggio
 | ||||
| 			{ | ||||
| 				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); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCCOSTO, nuorec, RMOVANA_CODCCORI); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCMS,    nuorec, RMOVANA_CODCMSORI); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODFASE,   nuorec, RMOVANA_CODFASEORI); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCONTO,  nuorec, 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); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODCCORI); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODCMSORI); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODFASEORI); | ||||
| 				ca_copia_campo(rec, RMOVANA_CODCCORI, nuorec, RMOVANA_CODCONTORI); | ||||
| 			} | ||||
| 		  //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_CODCMS,   *newrec, RMOVANA_CODCMS); | ||||
| 		  ca_copia_campo(rrip[i], RRIP_CODFASE,  *newrec, RMOVANA_CODFASE); | ||||
| 		  ca_copia_campo(rrip[i], RRIP_CODCONTO, *newrec, RMOVANA_CODCONTO); | ||||
| 			ca_copia_campo(rrip[i], RRIP_CODCOSTO, nuorec, RMOVANA_CODCCOSTO); | ||||
| 		  ca_copia_campo(rrip[i], RRIP_CODCMS,   nuorec, RMOVANA_CODCMS); | ||||
| 		  ca_copia_campo(rrip[i], RRIP_CODFASE,  nuorec, RMOVANA_CODFASE); | ||||
| 		  ca_copia_campo(rrip[i], RRIP_CODCONTO, nuorec, RMOVANA_CODCONTO); | ||||
| 			TToken_string ripkey("", ','); | ||||
| 
 | ||||
| 			ripkey.add(newrec->get(RMOVANA_CODCCOSTO)); | ||||
| 			ripkey.add(newrec->get(RMOVANA_CODCMS)); | ||||
| 			ripkey.add(newrec->get(RMOVANA_CODFASE)); | ||||
| //			ripkey.add(newrec->get(RMOVANA_CODCONTO));
 | ||||
| 			ripkey.add(nuorec.get(RMOVANA_CODCCOSTO)); | ||||
| 			ripkey.add(nuorec.get(RMOVANA_CODCMS)); | ||||
| 			ripkey.add(nuorec.get(RMOVANA_CODFASE)); | ||||
| //			ripkey.add(nuorec.get(RMOVANA_CODCONTO));
 | ||||
| 
 | ||||
| 			const int rows = output_rows.rows(); | ||||
| 			int r =  -1; | ||||
| 			int r = -1; | ||||
| 			for (int j = 1; r < 0 && j <= rows; j++) | ||||
| 				if (ca_can_pack_rows(*newrec, output_rows[j])) | ||||
|       { | ||||
| 				if (ca_can_pack_rows(nuorec, output_rows[j])) | ||||
| 					r = j;				 | ||||
|       } | ||||
| 			if (r < 0) | ||||
| 			{ | ||||
| 				newrec->put(RMOVANA_NUMRIG, rows + 1); | ||||
| 				newrec->put(RMOVANA_IMPORTO, imp);  //e la mette nella nuova riga
 | ||||
| 				output_rows.add_row(newrec); | ||||
| 				TToken_string * rowpath = (TToken_string *) output_paths.objptr(r); | ||||
| 				nuorec.put(RMOVANA_NUMRIG, rows + 1); | ||||
| 				nuorec.put(RMOVANA_IMPORTO, imp);  //e la mette nella nuova riga
 | ||||
| 				output_rows.add_row(nuorec); | ||||
| 				TToken_string * rowpath = (TToken_string*) output_paths.objptr(r); | ||||
| 
 | ||||
| 				if (rowpath == NULL) | ||||
| 					output_paths.add(rowpath = new TToken_string, r); | ||||
| @ -282,8 +290,7 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const | ||||
| 				output_rows[r].add(RMOVANA_IMPORTO, imp); | ||||
| 			} | ||||
| 
 | ||||
| 			real * value = (real *) row->objptr(ripkey); | ||||
| 
 | ||||
| 			real* value = (real*)row->objptr(ripkey); | ||||
| 			if (value == NULL) | ||||
| 				row->add(ripkey, value = new real); | ||||
| 			*value = *value + (sez == 'D' ? imp : -imp); | ||||
| @ -295,7 +302,6 @@ bool TRib_movanal_app::ripartizione(const TAnal_ripartizioni_batch& rrip, const | ||||
|   return ho_ripartito; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_rows) | ||||
| { | ||||
|   bool ho_cambiato_qualchecosa = false; | ||||
| @ -305,9 +311,8 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r | ||||
| 	TRecord_array output_rows = input_rows; output_rows.destroy_rows(); | ||||
| 	TArray input_paths; | ||||
| 	TArray output_paths; | ||||
| 	int loop = 0; | ||||
| 
 | ||||
| 	while (loop++ < 20) | ||||
| 	for (int loop = 1; loop <= 20; loop++) | ||||
| 	{ | ||||
| 		bool modified = false; | ||||
| 		const int nrows = input_rows.rows(); | ||||
| @ -379,7 +384,6 @@ bool TRib_movanal_app::elabora_righe(TAnal_mov& anal_mov, TRecord_array& input_r | ||||
|   return ho_cambiato_qualchecosa; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| bool TRib_movanal_app::elabora_movimento(TAnal_mov& anal_mov, const bool esplodi) | ||||
| { | ||||
|   TRecord_array& input_rows = anal_mov.body();  //record_array con le righe del mov_anal (INPUT)
 | ||||
| @ -435,7 +439,7 @@ static bool ripartisci_callback(const TRelation& rel, void* pJolly) | ||||
|   //se va tutto bene riscrive l'intero movimento analitico con conseguente ricalcolo saldi
 | ||||
|   app.elabora_movimento(anal_mov, false); | ||||
|   if (app.elabora_movimento(anal_mov, true)) | ||||
| 	  anal_mov.rewrite(rel.lfile()); | ||||
|     anal_mov.rewrite(app.movana()); | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| @ -447,7 +451,7 @@ static bool compatta_callback(const TRelation& rel, void* pJolly) | ||||
|   TAnal_mov anal_mov(numreg); | ||||
|   //se va tutto bene riscrive l'intero movimento analitico con conseguente ricalcolo saldi
 | ||||
|   if (app.elabora_movimento(anal_mov, false)) | ||||
|     anal_mov.rewrite(rel.lfile()); | ||||
|     anal_mov.rewrite(app.movana()); | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| @ -460,22 +464,24 @@ void TRib_movanal_app::main_loop() | ||||
|     //deve scandire il file MOVANA con chiave 2 (per data e numero di registrazione)
 | ||||
|     TRelation rel_movana(LF_MOVANA); | ||||
|     TRectype darec(LF_MOVANA), arec(LF_MOVANA); | ||||
|     const TDate & dal = mask.get_date(F_DATAINI); | ||||
|     const TDate dal = mask.get_date(F_DATAINI); | ||||
|     darec.put(MOVANA_DATACOMP, dal); | ||||
| 		const TDate & al = mask.get_date(F_DATAFIN); | ||||
| 		const TDate al = mask.get_date(F_DATAFIN); | ||||
|     arec.put(MOVANA_DATACOMP, al); | ||||
| 		_cache_rip.set_esercizio(mask.get_int(F_ANNO)); | ||||
| 
 | ||||
| 		const TString & tipo = mask.get(F_CLASSEMOV); | ||||
| 		const TString& tipo = mask.get(F_CLASSEMOV); | ||||
| 		TString filter; | ||||
| 
 | ||||
| 		if (tipo.blank()) | ||||
| 			filter = "BLOCCATO!=\"X\""; | ||||
| 		else | ||||
|     { | ||||
| 			if (tipo == "N") | ||||
| 				filter = "(BLOCCATO!=\"X\")&&(TIPOMOV==\"\")"; | ||||
| 			else | ||||
| 				filter = "(BLOCCATO!=\"X\")&&(TIPOMOV!=\"\")"; | ||||
|     } | ||||
|     TCursor cur_movana(&rel_movana, filter, 2, &darec, &arec); | ||||
|     const long items = cur_movana.items(); | ||||
|     if (items > 0) | ||||
| @ -500,13 +506,12 @@ void TRib_movanal_app::main_loop() | ||||
|           cur_movana.scan(compatta_callback, this, TR("Compattamento movimenti...")); | ||||
|         else | ||||
|           cur_movana.scan(ripartisci_callback, this, TR("Ripartizione movimenti...")); | ||||
| 				TFilename fname(mask.get(F_PATH)); | ||||
| 		 | ||||
| 
 | ||||
|         TFilename fname(mask.get(F_PATH)); | ||||
| 				fname.add(mask.get(F_NAME)); | ||||
| 				if (fname.full()) | ||||
| 				{ | ||||
| 					TCSV_recset recset(_calc); | ||||
| 
 | ||||
| 					recset.save_as(fname, fmt_unknown); | ||||
| 				} | ||||
|       } //if(run)...
 | ||||
| @ -516,6 +521,28 @@ void TRib_movanal_app::main_loop() | ||||
|   }  | ||||
| } | ||||
| 
 | ||||
| bool TRib_movanal_app::create() | ||||
| { | ||||
|   int lognum[] = { LF_MOVANA, LF_RMOVANA, LF_PCONANA, LF_SALDANA, 0 }; | ||||
| 
 | ||||
|   for (int i = 0; lognum[i]; i++) | ||||
|   { | ||||
|     const int num = lognum[i]; | ||||
|     TSystemisamfile* sif =  new TSystemisamfile(num); | ||||
|     _excl.add(sif, num); | ||||
|     if (sif->open(_excllock) != NOERR) | ||||
|       return error_box(TR("Il file dei movimenti analitici è gia' in uso")); | ||||
|   } | ||||
|   return TSkeleton_application::create(); | ||||
| } | ||||
| 
 | ||||
|   bool TRib_movanal_app::destroy() | ||||
|   { | ||||
|     _excl.destroy(); | ||||
|     return TSkeleton_application::destroy(); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| int pd6342300(int argc, char* argv[]) | ||||
| { | ||||
|   TRib_movanal_app app; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user