Files correlati : Ricompilazione Demo : [ ] Commento :correzioni pro compilazione nuova 2.2 git-svn-id: svn://10.65.10.50/trunk@13393 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			379 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | |
| #include <filetext.h>
 | |
| #include <form.h>                          
 | |
| 
 | |
| #include <mask.h>
 | |
| #include <relation.h>
 | |
| #include <tabutil.h>
 | |
| #include <printer.h>
 | |
| #include <progind.h>
 | |
| #include <utility.h>         
 | |
| #include <lffiles.h>         
 | |
| 
 | |
| #include <sheet.h>         
 | |
| 
 | |
| #include "..\ve\velib.h"
 | |
| #include "..\ve\velib04.h"
 | |
| #include "si0400a.h"
 | |
| 
 | |
| class TScarico_file;
 | |
| class TScaricoAS400: public TSkeleton_application
 | |
| {
 | |
|   TString16      _provenienza;  // provenienza
 | |
|   TDate          _data_ini;     // data di inizio intervallo
 | |
|   TDate          _data_fine;    // data di fine intervallo
 | |
|   TMask*				 _msk;        	// maschera di selezione dati
 | |
|   TString_array	 _elaborazioni; // array delle elaborazioni selezionate
 | |
|   TString_array  _tipidoc;      // Array di stringhe contenente i tipi documenti da elaborare
 | |
|   TScarico_file* _trasfile;			// file di scarico dati
 | |
| 	TAssoc_array   _tracciati;
 | |
| 	
 | |
|  protected: // TApplication
 | |
|   // Le 4 seguenti non hanno bisogno di commenti
 | |
|   virtual void main_loop();
 | |
|   virtual bool create();
 | |
|   virtual bool destroy();
 | |
|   // Coontrolla se lo stato ed il tipo del documento sono validi e rispettano la selezione
 | |
|   bool doc_tipo_stato_ok(const TDocumento* doc);
 | |
|   // Handler dell'intervallo di date
 | |
|   static bool handle_data_range(TMask_field& f, KEY k);
 | |
|   void transfer();         
 | |
|   // costruisce l'array delle elaborazioni scelte
 | |
|   void build_elaborazioni();                         
 | |
|   // costruisce l'array dei tipi doc e relativi stati per una elaborazione
 | |
|   void build_tipidoc(const TContabilizzazione& cont);
 | |
| 	void scrivi_righe(TAssoc_array& arr_imponibile, TAssoc_array& arr_imposta);
 | |
|   void record(THash_object& lavoro, TDate& datadoc, TString& codartmag, real& valimponibile, real& valimposta);
 | |
| 	virtual const char * extra_modules() const { return "BA"; }
 | |
| public:
 | |
| 	TString16& provenienza() {return _provenienza;};
 | |
|   TScaricoAS400() {_msk = NULL;}; 
 | |
|   virtual ~TScaricoAS400() { }
 | |
| };
 | |
| 
 | |
| inline TScaricoAS400& app() { return (TScaricoAS400&) main_app(); }
 | |
| 
 | |
| /////////////////////////////////////////////////////
 | |
| // Classe TScarico_file customizzata dalla TFile_text //
 | |
| /////////////////////////////////////////////////////
 | |
| class TScarico_file: public TFile_text
 | |
| { 
 | |
| 	
 | |
| protected:
 | |
|   virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
 | |
| 
 | |
| public:                                         
 | |
| 	void forza_validate(TRecord_text& rec, TTracciato_record& tr );
 | |
|   TScarico_file(const TString& file_name, const TString& config_name);
 | |
|   virtual ~TScarico_file() { }
 | |
| };
 | |
| 
 | |
| // gestione dei messaggi estesi nei campi
 | |
| void TScarico_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
 | |
| {
 | |
|   const TString code(s.get(0));
 | |
|   TString valore;
 | |
|   if (code == "_PROVENIENZA")
 | |
|   	valore = app().provenienza();
 | |
|   else if (code == "_DATADOC") 
 | |
|   {          
 | |
|   	TDate tmp(str);
 | |
|   	valore = tmp.string(brief,'\0');
 | |
|   }	
 | |
|   else if (code == "_CURRENCY")
 | |
|   { 
 | |
|   	valore = str;            
 | |
|   	int len = atoi(s.get());
 | |
|   	if (len > 0)
 | |
|   	valore.lpad(len);
 | |
|   }	
 | |
|   else NFCHECK("Macro non definita: %s", (const char *)code);
 | |
|  	str = valore; 
 | |
| }
 | |
| 
 | |
| TScarico_file::TScarico_file(const TString& file_name, const TString& config_name)
 | |
|           : TFile_text(file_name, config_name)
 | |
| {
 | |
| }
 | |
| 
 | |
| void TScarico_file::forza_validate(TRecord_text& rec, TTracciato_record& tr )
 | |
| {                             
 | |
|   TString campo; 
 | |
|   TCursor cur(tr.relation());
 | |
|   TRelation& rel = *cur.relation();
 | |
|   TArray& a_tc = tr.tracciati_campo();
 | |
|   int items =  a_tc.items();
 | |
|   for (int i = 0; i < items; i++)
 | |
|   {
 | |
|     TTracciato_campo& tc = tr.get(i);
 | |
|     const TString& message = tc.message(); 
 | |
|     if (!message.empty())
 | |
|     {
 | |
|     	campo = rec.get(i);
 | |
|       TToken_string msg (message, ',');                               
 | |
|       if (!msg.blank())
 | |
|       {
 | |
|         validate(cur, rec, msg, campo); 
 | |
|     		rec.add(campo, i);       
 | |
|     	}	
 | |
|     }   
 | |
|   }
 | |
| }
 | |
| 
 | |
| // costruisce l'assoc array delle elaborazioni scelte
 | |
| void TScaricoAS400::build_elaborazioni()
 | |
| {
 | |
|   _elaborazioni.destroy();
 | |
|   TString16 str;
 | |
| 	str = _msk->get(F_CODICE_ELAB1);
 | |
|   if (str.not_empty())                 
 | |
| 		_elaborazioni.add(str);
 | |
| 	str = _msk->get(F_CODICE_ELAB2);
 | |
|   if (str.not_empty())                 
 | |
| 		_elaborazioni.add(str);
 | |
| 	str = _msk->get(F_CODICE_ELAB3);
 | |
|   if (str.not_empty())                 
 | |
| 		_elaborazioni.add(str);
 | |
| 	str = _msk->get(F_CODICE_ELAB4);
 | |
|   if (str.not_empty())                 
 | |
| 		_elaborazioni.add(str);
 | |
| 	str = _msk->get(F_CODICE_ELAB5);
 | |
|   if (str.not_empty())                 
 | |
| 		_elaborazioni.add(str);
 | |
| }
 | |
| 
 | |
| bool TScaricoAS400::handle_data_range(TMask_field& f, KEY k)
 | |
| {
 | |
|   if (k==K_ENTER && f.dirty())
 | |
|   {
 | |
|     TMask& m = f.mask();
 | |
|     TDate da(m.get_date(F_DATAINI));
 | |
|     TDate a(m.get_date(F_DATAFIN));
 | |
|     if (a < da) 
 | |
|     {
 | |
|       f.error_box("La data di inizio deve essere minore della data di fine.");
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| void TScaricoAS400::build_tipidoc(const TContabilizzazione& cont)
 | |
| {
 | |
|   _tipidoc.destroy();
 | |
|   TToken_string t;
 | |
|   TString16 tipo;
 | |
|   for (int i=0;i<TElaborazione::_max_tipi_doc_elab;i++)
 | |
|   {
 | |
|   	tipo = cont.tipo_iniziale(i);
 | |
|     if (tipo.not_empty())
 | |
|     { 
 | |
|       t = tipo;
 | |
|       t.add(cont.stato_iniziale(i));  // Stato iniziale
 | |
|       _tipidoc.add(t);    // Aggiunge questo tipo documento alla lista con il suo stato iniziale
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TScaricoAS400::doc_tipo_stato_ok(const TDocumento* doc)
 | |
| // Verifica che il tipo documento corrente esista tra i tipi previsti dalla elaborazione
 | |
| // differita selezionata
 | |
| {
 | |
|   bool found = FALSE;
 | |
|   const TString16 tipo = doc->get(DOC_TIPODOC);
 | |
|   const char stato = doc->get_char(DOC_STATO);
 | |
|   const int items = _tipidoc.items();
 | |
|   for (int i=0;i<items && !found;i++)
 | |
|   {
 | |
|     TToken_string& t = _tipidoc.row(i);
 | |
|     const TString16 tipox(t.get(0));
 | |
|     const char statox = t.get(1)[0];
 | |
|     if (tipo == tipox && stato == statox)
 | |
|       found = TRUE;
 | |
|   }
 | |
|   return found;
 | |
| }
 | |
| 
 | |
| //emetto un record
 | |
| void TScaricoAS400::record(THash_object& lavoro, TDate& datadoc, TString& codartmag, real& valimponibile, real& valimposta)
 | |
| {
 | |
|   TTracciato_record&  oggetto = (TTracciato_record&)lavoro.obj();
 | |
|   const TString& tipo = oggetto.type();
 | |
|   TRecord_text rec(tipo);
 | |
|   //carico il record da emettere
 | |
|   _trasfile->autoload(rec, LF_RIGHEDOC);
 | |
|   _trasfile->add_field(rec, "DATADOC", (const char*) datadoc);
 | |
|   _trasfile->add_field(rec, "CODARTMAG", (const char*) codartmag);
 | |
|  	TCurrency c(valimponibile);
 | |
| 	TString80 str = c.string();
 | |
| 	str.strip(",");
 | |
|   _trasfile->add_field(rec, "IMPONIBILE", (const char*) str);
 | |
| 	c = TCurrency(valimposta);
 | |
| 	str = c.string();
 | |
| 	str.strip(",");
 | |
|   _trasfile->add_field(rec, "IMPOSTA", (const char*) str);  
 | |
|   _trasfile->forza_validate(rec,oggetto);
 | |
|   _trasfile->write(rec);//emetto i dati su file
 | |
| }
 | |
| 
 | |
| // creazione dell'applicazione
 | |
| bool TScaricoAS400::create()
 | |
| {                         
 | |
|   open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, LF_CAUSALI, 0);
 | |
|   _msk = new TMask("si0400a");
 | |
|   _msk->set_handler(F_DATAINI,handle_data_range);
 | |
|   _msk->set_handler(F_DATAFIN,handle_data_range);
 | |
|   _trasfile = NULL;
 | |
|   return TSkeleton_application::create();
 | |
| }
 | |
| 
 | |
| bool TScaricoAS400::destroy()
 | |
| {
 | |
|   if (_msk) delete _msk;
 | |
|   if (_trasfile) delete _trasfile;
 | |
|   return TSkeleton_application::destroy();
 | |
| }
 | |
| 
 | |
| void TScaricoAS400::main_loop()
 | |
| {
 | |
|   TConfig c(CONFIG_STUDIO, "sipag");
 | |
|   _msk->set(F_FILESEQ, c.get("FileSeqE"));
 | |
|   _msk->set(F_FILEMOV, c.get("FileMov"));
 | |
|   _msk->set(F_CODICE_ELAB1, c.get("CodElab1"));
 | |
|   _msk->set(F_CODICE_ELAB2, c.get("CodElab2"));
 | |
|   _msk->set(F_CODICE_ELAB3, c.get("CodElab3"));
 | |
|   _msk->set(F_CODICE_ELAB4, c.get("CodElab4"));
 | |
|   _msk->set(F_CODICE_ELAB5, c.get("CodElab5"));
 | |
|   _msk->set(F_PROVENIENZA, c.get("CodProv"));
 | |
|   while (_msk->run() == K_ENTER)
 | |
|   {
 | |
| 	   c.set("FileSeqE", _msk->get(F_FILESEQ));
 | |
|   	 c.set("FileMov", _msk->get(F_FILEMOV));
 | |
|   	 c.set("CodElab1", _msk->get(F_CODICE_ELAB1));
 | |
|   	 c.set("CodElab2", _msk->get(F_CODICE_ELAB2));
 | |
|   	 c.set("CodElab3", _msk->get(F_CODICE_ELAB3));
 | |
|   	 c.set("CodElab4", _msk->get(F_CODICE_ELAB4));
 | |
|   	 c.set("CodElab5", _msk->get(F_CODICE_ELAB5));
 | |
|   	 c.set("CodProv", _msk->get(F_PROVENIENZA));
 | |
|     _data_ini = _msk->get_date(F_DATAINI);
 | |
|     _data_fine = _msk->get_date(F_DATAFIN);
 | |
|     _provenienza = _msk->get(F_PROVENIENZA);
 | |
|     
 | |
|     TFilename n(_msk->get(F_FILEMOV));
 | |
|     if (fexist(n))
 | |
|     	remove(n);
 | |
|   	_trasfile = new TScarico_file(_msk->get(F_FILEMOV), "si0400a.ini");
 | |
| 	  _trasfile->open(_msk->get(F_FILEMOV),'w');
 | |
|     build_elaborazioni();
 | |
|     transfer();
 | |
|     delete _trasfile;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void TScaricoAS400::transfer()
 | |
| {             
 | |
|   _tracciati = _trasfile->tracciati();
 | |
|   TRelation doc_rel(LF_DOC);
 | |
|   TRectype da(LF_DOC);
 | |
|   TRectype a(LF_DOC);
 | |
|   const int items = _elaborazioni.items();
 | |
|   long tot = 0L;
 | |
|   int year_from = _data_ini.year();
 | |
|   int year_to = _data_fine.year();
 | |
|   //TString16 codnum;
 | |
|   TString msg,filt_expr;
 | |
|   TDate data;
 | |
|   da.put("DATADOC",_data_ini);
 | |
|   da.put("PROVV","D");
 | |
|   da.put("ANNO",year_from);
 | |
|   a.put("DATADOC",_data_fine);
 | |
|   a.put("PROVV","D");
 | |
|   a.put("ANNO",year_to);
 | |
|   for (int i=0; i<items;i++)  // Scorre per tutte le elaborazioni
 | |
|   {         
 | |
|     const TString16 codelab = (const char*) _elaborazioni.row(i);
 | |
| 	  TContabilizzazione cont(codelab);
 | |
|   	if (!cont.empty()) 
 | |
|   	{                                             
 | |
|   		build_tipidoc(cont);
 | |
|   		
 | |
|   		filt_expr = "";
 | |
|       //codnum = cont.codice_numerazione_iniziale();
 | |
|       //filt_expr = "CODNUM=\"";
 | |
|       //filt_expr << codnum << "\"";
 | |
|       
 | |
|       TCursor doc_cur(&doc_rel,filt_expr,3,&da,&a);
 | |
|       const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
 | |
|       if (cur_items == 0) 
 | |
|         continue;
 | |
|       msg = "Selezione documenti ";
 | |
|       
 | |
|       //msg << codnum << " dal ";
 | |
|       msg << " dal ";
 | |
|       
 | |
|       msg << _data_ini.string() << " al ";
 | |
|       msg << _data_fine.string();
 | |
| #ifdef DBG      
 | |
|       TProgind p(cur_items,msg,TRUE,TRUE,1);
 | |
| #else
 | |
|       TProgind p(cur_items,msg,FALSE,TRUE,1);
 | |
| #endif           
 | |
|       long j = 0;
 | |
|       // Comportamento:
 | |
|       // - scorre i documenti della numerazione corrente.
 | |
| #ifdef DBG      
 | |
|       for (;j<cur_items && !p.iscancelled();j++)
 | |
| #else      
 | |
|       for (;j<cur_items;j++)
 | |
| #endif      
 | |
|       { 
 | |
|         p.setstatus(j+1);
 | |
|         doc_cur = j;
 | |
|         TDocumento* doc = new TDocumento;
 | |
|         if (doc->read(doc_cur.curr()) == NOERR && // legge il documento
 | |
|             //codnum == doc->get(DOC_CODNUM) && // patch del cazzo (non l'ho scritto io!!!!)
 | |
|             doc_tipo_stato_ok(doc))    // controlla che il tipo documento e lo stato siano coerenti con la ELD selezionata
 | |
|         { 
 | |
|         	TDate datadoc = doc->data();
 | |
| 				  TString80 codartmag;
 | |
| 				  real valimponibile, valimposta;
 | |
| 				  const int items = doc->physical_rows();
 | |
| 				  int numrig = 1;
 | |
| 				  for (int i=1; i<=items; i++)
 | |
| 				  {
 | |
| 				    const TRiga_documento& rr = (*doc)[i];
 | |
| 				    if (rr.is_articolo())
 | |
| 				    {     
 | |
| 				    	codartmag = rr.get(RDOC_CODARTMAG);              
 | |
| 				    	valimponibile = rr.imponibile();
 | |
| 				    	valimposta = rr.imposta();
 | |
| 							THash_object* lavoro =  _tracciati.get_hashobj();
 | |
| 							//scandisco tutti i record  di un effetto
 | |
| 							for (int i = 0; lavoro != NULL; i++)
 | |
| 							{
 | |
| 							  record(*lavoro, datadoc, codartmag, valimponibile, valimposta); //emetto il record
 | |
| 							  lavoro =  _tracciati.get_hashobj();
 | |
| 							}
 | |
|         		}	
 | |
|         	} 
 | |
|         	cont.change_doc_status(*doc);
 | |
|         	delete doc;
 | |
|         }
 | |
|         else
 | |
|           delete doc;
 | |
|       }
 | |
| #ifdef DBG      
 | |
|       if (p.iscancelled()) break;
 | |
| #endif
 | |
|     }
 | |
|   }
 | |
|   xvtil_statbar_set("");  
 | |
| }
 | |
| 
 | |
| int si0400(int argc, char* argv[])
 | |
| {
 | |
|   TScaricoAS400 a;
 | |
|   a.run(argc, argv, "Scarico dati per AS/400");
 | |
|   return 0;
 | |
| }
 |