Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@20366 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			768 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			768 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | ||
| #include <automask.h>
 | ||
| #include <progind.h>
 | ||
| 
 | ||
| #include "pd0001.h"
 | ||
| #include "pd0001100a.h"
 | ||
| 
 | ||
| #include <doc.h>
 | ||
| #include <rdoc.h>
 | ||
| #include <mov.h>
 | ||
| #include <rmov.h>
 | ||
| #include <partite.h>
 | ||
| #include "rmoviva.h"
 | ||
| #include "../ve/velib.h"
 | ||
| 
 | ||
| //=====MASCHERA============================================================//
 | ||
| class TToas400_mask : public TAutomask
 | ||
| {
 | ||
| 
 | ||
| protected:
 | ||
|   bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | ||
| public:
 | ||
|   TToas400_mask();  
 | ||
|   virtual ~TToas400_mask() {};
 | ||
| };
 | ||
| 
 | ||
| TToas400_mask::TToas400_mask() :TAutomask ("pd0001100a") {}
 | ||
| 
 | ||
| bool TToas400_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | ||
| {
 | ||
|   switch (o.dlg())
 | ||
|   {
 | ||
|   case F_BOLLE :
 | ||
|   case F_FATTURE :
 | ||
|   case F_MOVCONT :
 | ||
|     if (e == fe_close)
 | ||
|     {
 | ||
|       if (!get_bool(F_BOLLE) && !get_bool(F_FATTURE) && !get_bool(F_MOVCONT))     //deve essere selezionata almeno 1 situaz.
 | ||
|         return error_box("Selezionare almeno uno dei tipi documento da esportare");     
 | ||
|     }
 | ||
|     break;
 | ||
|   case F_DATA_TRASF :
 | ||
|     if (e == fe_close)
 | ||
|     {
 | ||
|       if ((get_date(F_DATA_TRASF) < get_date(F_DATA_ULT_TRASF_B))&&(get_bool(F_BOLLE)))
 | ||
|         return error_box("La data di trasferimento bolle non e' congruente");
 | ||
|       if ((get_date(F_DATA_TRASF) < get_date(F_DATA_ULT_TRASF_F))&&(get_bool(F_FATTURE)))
 | ||
|         return error_box("La data di trasferimento fatture non e' congruente");
 | ||
|       if ((get_date(F_DATA_TRASF) < get_date(F_DATA_ULT_TRASF_M))&&(get_bool(F_MOVCONT)))
 | ||
|         return error_box("La data di trasferimento movimenti contabili non e' congruente");
 | ||
|     }
 | ||
|     break;
 | ||
|   default: break;
 | ||
|   }
 | ||
|   return TRUE;
 | ||
| }
 | ||
| 
 | ||
| //=====APPLICAZIONE====================================================//
 | ||
| class TToas400 : public TSkeleton_application
 | ||
| {
 | ||
|   TToas400_mask* _mask;
 | ||
|   TDate _dataultb, _dataultf, _dataultm, _datacurr;
 | ||
|   TString _trrpath;
 | ||
| 
 | ||
| protected:
 | ||
|   virtual const char * extra_modules() const {return "ve";}
 | ||
| 
 | ||
|   void copia_rigadoc(TRectype& recdest, const TRectype& recsource, const TRectype& rectestata) const;
 | ||
|   bool genera_righedoc(const TString& path, char tipo);
 | ||
| 
 | ||
|   void copia_documento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga) const;
 | ||
|   bool genera_documenti(const TString& path, char tipo);
 | ||
| 
 | ||
|   void copia_rigamov(TRectype& recdest, const TRectype& recsource) const;
 | ||
|   bool genera_righemov(const TString& path);
 | ||
| 
 | ||
|   void copia_rigaiva(TRectype& recdest, const TRectype& recsource) const;
 | ||
|   bool genera_righeiva(const TString& path);
 | ||
| 
 | ||
|   void copia_movimento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga, const TRectype& recpartita) const;
 | ||
|   bool genera_movimenti(const TString& path);
 | ||
| 
 | ||
|   bool genera_bolle(const TString& path);
 | ||
|   bool genera_fatture(const TString& path);
 | ||
|   bool genera_movcont(const TString& path);
 | ||
| 
 | ||
|   void azzera_campi(TRectype& rectozero) const;
 | ||
|   int separa_sconti(const TString& sconto, TToken_string& sconti4) const;
 | ||
|   void ini2mask();
 | ||
| 
 | ||
| public:
 | ||
|   virtual bool create();
 | ||
|   virtual bool destroy();
 | ||
|   virtual void main_loop();
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| bool TToas400::create()
 | ||
| {
 | ||
|   open_files(LF_DOC, 0);
 | ||
|   _mask = new TToas400_mask;
 | ||
|   
 | ||
|   return TSkeleton_application::create();
 | ||
| }
 | ||
| 
 | ||
| bool TToas400::destroy()
 | ||
| {
 | ||
|   delete _mask;
 | ||
|   return TSkeleton_application::destroy();
 | ||
| }
 | ||
| 
 | ||
| void TToas400::ini2mask()
 | ||
| {
 | ||
| //carica i parametri di trasferimento dal ditta.ini
 | ||
|   TConfig fileini(CONFIG_DITTA, "pd0001");
 | ||
|   _trrpath = fileini.get("PATH");
 | ||
|   _dataultb = fileini.get("DATAULTB");
 | ||
|   _dataultf = fileini.get("DATAULTF");
 | ||
|   _dataultm = fileini.get("DATAULTM");
 | ||
| 
 | ||
|   _mask->set(F_PATH, _trrpath);
 | ||
| 
 | ||
|   TToken_string ultimo;
 | ||
| 
 | ||
|   _mask->set(F_DATA_ULT_TRASF_B, _dataultb);
 | ||
|   ultimo = fileini.get("bolle", NULL, -1, "2008|B01");
 | ||
|   _mask->set(F_NUM_B, ultimo.get(1));
 | ||
|   
 | ||
|   _mask->set(F_DATA_ULT_TRASF_F, _dataultf);
 | ||
|   ultimo = fileini.get("fatt", NULL, -1, "2008|FAA");
 | ||
|   _mask->set(F_NUM_F, ultimo.get(1));
 | ||
|   
 | ||
|   _mask->set(F_DATA_ULT_TRASF_M, _dataultm);
 | ||
| }
 | ||
| 
 | ||
| //_________________________________________________________________________________________________________________________
 | ||
| //DOCUMENTI DI VENDITA
 | ||
| 
 | ||
| //metodo per la copia delle righe documenti (bolle/fatture) sul file .dbf di destinazione
 | ||
| void TToas400::copia_rigadoc(TRectype& recdest, const TRectype& recsource, const TRectype& rectestata) const
 | ||
| {
 | ||
|   azzera_campi(recdest);  //mette 0 in tutti i campi numerici (compresi quelli che non saranno riempiti)
 | ||
|   
 | ||
|   TString4 coddep = recsource.get(RDOC_CODMAG).left(3);
 | ||
|   recdest.put("I6CDEP", coddep);                              //cod.deposito
 | ||
|   
 | ||
|   recdest.put("I6CCLI",rectestata.get(DOC_CODCF));             //cod.cliente (da testata)
 | ||
|   recdest.put("I6TDO1",rectestata.get(DOC_TIPODOC));           //tipodoc (da testata)
 | ||
|   recdest.put("I6CNMV",rectestata.get(DOC_CODNUM));            //cod.num.doc (da testata)
 | ||
|   recdest.put("I6NDOC",recsource.get(RDOC_NDOC));             //num.doc (=testata)
 | ||
|   recdest.put("I6NRIG",recsource.get(RDOC_NRIGA));            //num.riga
 | ||
|   recdest.put("I6TRIG", "1");                                 //tiporiga 1 (sono solo riga merce)
 | ||
|   recdest.put("I6CART",recsource.get(RDOC_CODARTMAG));        //cod.art
 | ||
|   recdest.put("I6CLIN",recsource.get(RDOC_LINEA));            //cod.linea (x MRP?)
 | ||
|   recdest.put("I6DCO1",recsource.get(RDOC_DESCR).left(35));   //descriz.1
 | ||
|   recdest.put("I6DCO2",recsource.get(RDOC_DESCR).mid(35));    //descriz.2 
 | ||
|   recdest.put("I6CUMI",recsource.get(RDOC_UMQTA));            //unit<69> di misura
 | ||
|   recdest.put("I6CIVA",recsource.get(RDOC_CODIVA));           //cod.iva
 | ||
|   
 | ||
|   real qta = recsource.get(RDOC_QTA);
 | ||
|   if (qta.is_zero())
 | ||
|     qta = 9999999999999.0;
 | ||
|   recdest.put("I6QARM",qta);                                  //quantit<69> (9999999999999 se 0; mah?)
 | ||
|   
 | ||
|   real prezzoven = recsource.get(RDOC_PREZZO);                
 | ||
|   if (prezzoven.is_zero())
 | ||
|     prezzoven = 9999999999999.0;
 | ||
|   recdest.put("I6LUNI",prezzoven);                            //prezzo vendita unitario lordo(9999999999999 se 0; mah?)
 | ||
|   
 | ||
|   const TString& sconto = recsource.get(RDOC_SCONTO);
 | ||
|   if (sconto.not_empty())   //%sconto   (achtung! x as400 <20> % x eurocampo una espressione)
 | ||
|   {
 | ||
|     TToken_string sconti4;
 | ||
|     int s = separa_sconti(sconto, sconti4);   //metodo che separa l'espressione di sconto
 | ||
|     char campo[7] = "I6PSR1";  
 | ||
|     for (int i = 0; i < s; i++)
 | ||
|     {
 | ||
|       campo[5] = '1'+i;
 | ||
|       recdest.put(campo, sconti4.get(i));    //mette nei campi i valori degli sconti
 | ||
|     }                                    
 | ||
|   }
 | ||
|   
 | ||
|   recdest.put("I6PPR1",recsource.get(RDOC_PERCPROV));         //%provvigione 1
 | ||
|   
 | ||
|   TString area;
 | ||
|   area << "   " << "000000000000000000";
 | ||
|   const TRectype& tiporiga = cache().get("%TRI", recsource.get(RDOC_TIPORIGA));
 | ||
|   TString8 codriga;
 | ||
|   switch (tiporiga.get_char("S7"))
 | ||
|   {
 | ||
|     case 'C': codriga = "SM"; break;
 | ||
|     case 'O': codriga = "OG"; break;
 | ||
|     default: codriga = "  "; break;
 | ||
|   }
 | ||
|   area << codriga;  
 | ||
|   recdest.put("I6AREA", area);      //campo personalizzabile: ci va una strana stringa...mah?
 | ||
|   
 | ||
| }
 | ||
| 
 | ||
| //metodo che "fraziona" la formula di sconto riga nei suoi componenti; se ci sono 4 o + numeri -> mette nel quarto numero
 | ||
| //lo sconto complessivo di quelli dal quarto in avanti
 | ||
| int TToas400::separa_sconti(const TString& sconto, TToken_string& sconti4) const
 | ||
| {
 | ||
|     sconti4.cut(0);  
 | ||
| // Elimina gli spazi molesti sulla stringa dello sconto (ovviamente copiata, X' l'originale non si tocca)
 | ||
|     TString sconto_orig = sconto;
 | ||
|     sconto_orig.strip_spaces( );
 | ||
| //aggiunge un segno iniziale + qualora non esistesse alcun segno
 | ||
|     if (sconto_orig[0] != '+' &&  sconto_orig[0] != '-')
 | ||
|       sconto_orig.insert("+");
 | ||
| //assegna agli elementi della token_string i valori numerici ed i segni    
 | ||
|     int numsconti = 0;
 | ||
| 		int i;
 | ||
| 
 | ||
|     for (i=0; sconto_orig[i]; i++)
 | ||
|     { 
 | ||
| 
 | ||
| //se il carattere <20> un segno -> devo cambiare elemento della token string (mettendo '|' ma non nel caso del primo segno)
 | ||
|       if (sconto_orig[i] == '+' || sconto_orig[i] == '-')
 | ||
|       { 
 | ||
|         if (numsconti++ > 0)    //incrementa numsconti di 1 
 | ||
|           sconti4 << '|';
 | ||
|         if (numsconti > 3)  
 | ||
|           break;
 | ||
|       }
 | ||
|       
 | ||
| //se numero -> scrive il carattere sulla token_string..     
 | ||
|       sconti4 << sconto_orig[i];
 | ||
|     }
 | ||
|     
 | ||
| //adesso piazza nel quarto elemento i valori degli elementi dal quarto in avanti
 | ||
|     const TString oltre = sconto_orig.mid(i);
 | ||
|     if (oltre.not_empty())
 | ||
|     {
 | ||
|       TString pipo;
 | ||
|       real psconto;    
 | ||
|       scontoexpr2perc(oltre, 0, pipo, psconto);
 | ||
|       psconto = 100 - 100*psconto;                 //lo mette in percentuale
 | ||
|       psconto.round(2);                            //arrotonda al secondo decimale    
 | ||
|       sconti4.add(psconto.string(),3);             //aggiunge psconto alla posizione 4
 | ||
|     }
 | ||
|     return sconti4.items();
 | ||
| }
 | ||
| 
 | ||
| // tipo -> B=bolle, F=fatture                                                                     
 | ||
| bool TToas400::genera_righedoc(const TString& path, char t)
 | ||
| { 
 | ||
| //Crea il file vuoto delle righe documenti
 | ||
|   const char* tipor = t == 'B' ? "pd0001rb" : "pd0001rf";
 | ||
|   TFilename trrrig = path; trrrig.add(tipor); trrrig.ext("trr");
 | ||
|   TFilename siriorig = path; siriorig.add(tipor); siriorig.ext("dbf");
 | ||
| 
 | ||
|   TExternisamfile righe(siriorig, trrrig);
 | ||
|   righe.zap();
 | ||
| 
 | ||
| //lettura da prassid.ini dell'ultima bolla/fattura trasferita
 | ||
| //ATTENZIONE!La numerazione documenti <20> unica per bolle e fatture rispettivamente! Ovvero non <20> possibile trasferire 2 tipi
 | ||
| //di fatture con codice diverso (o 2 tipi di bolle con codice diverso)  
 | ||
|   TConfig fileini(CONFIG_DITTA, "pd0001");
 | ||
|   TToken_string ultimo = fileini.get(tipor+1, NULL, -1, t == 'B' ? "2008|B01" : "2008|FAA");
 | ||
|   
 | ||
| //scandisce il file doc.dbf alla ricerca dei documenti non ancora esportati...
 | ||
|   TRelation rel(LF_RIGHEDOC);
 | ||
|   TString expr;
 | ||
|   expr << "CODNUM==CODNUM|ANNO==ANNO|NDOC==NDOC|PROVV==PROVV" ;
 | ||
|   rel.add(LF_DOC, expr);    //aggiunge alla relazione (in origine sulle righe) il file delle testate x' necessita di alcuni campi di questo file
 | ||
| 
 | ||
| //..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
 | ||
|   TRectype& recsource = rel.curr();
 | ||
|   recsource.put(RDOC_PROVV, "D");
 | ||
|   recsource.put(RDOC_ANNO, ultimo.get(0));
 | ||
|   recsource.put(RDOC_CODNUM, ultimo.get(1));
 | ||
|   recsource.put(RDOC_NDOC, ultimo.get_long(2)+1);
 | ||
| 
 | ||
| //..quindi si crea il filtro ed il cursore per scandire il file delle righe documento..  
 | ||
|   TString filtro;
 | ||
|   filtro << "(CODNUM==\"" << ultimo.get(1) << "\")";
 | ||
|   _datacurr = _mask->get_date(F_DATA_TRASF);
 | ||
|   filtro << "&&(ANSI(33->DATADOC)<=" << _datacurr.date2ansi() << ")";
 | ||
|   TCursor cur(&rel, "", 1, &recsource);
 | ||
|   cur.setfilter(filtro, true);
 | ||
|   const long items = cur.items();
 | ||
|   cur.freeze();
 | ||
|   
 | ||
|   TString caption; caption << "Elaborazione " << tipor << "...";
 | ||
|   TProgind pi(items, caption, TRUE, TRUE);
 | ||
| 
 | ||
| //..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo  
 | ||
|   TRectype& recdest = righe.curr();     
 | ||
|   const TRectype& testata = rel.curr(LF_DOC);
 | ||
|   int nriga = 1;
 | ||
|   long ultimodoc = 0;
 | ||
|   
 | ||
|   for (cur = 0L; cur.pos() < items; ++cur)
 | ||
|   {
 | ||
|     pi.addstatus(1);
 | ||
|     if (pi.iscancelled())
 | ||
|       break;
 | ||
|     
 | ||
|     long currdoc = recsource.get_long(RDOC_NDOC);
 | ||
|     if (currdoc != ultimodoc)
 | ||
|     {
 | ||
|       ultimodoc = currdoc;
 | ||
|       nriga = 1;
 | ||
|     }
 | ||
|     const TString& codartmag = recsource.get(RDOC_CODARTMAG);
 | ||
|     if (codartmag.not_empty())   //vogliamo solo righe merce!
 | ||
|     { 
 | ||
|       recsource.put(RDOC_NRIGA, nriga++); //incrementa il numero riga se rigamerce
 | ||
|       copia_rigadoc(recdest, recsource, testata); 
 | ||
|       const int err = righe.write();
 | ||
|       if (err != NOERR)
 | ||
|         return error_box("Errore %d di registrazione %s", err, tipor); 
 | ||
|     }
 | ||
| 
 | ||
|   }
 | ||
|   
 | ||
|   return !pi.iscancelled();
 | ||
| }
 | ||
| 
 | ||
| void TToas400::copia_documento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga) const
 | ||
| {
 | ||
|   
 | ||
|   azzera_campi (recdest); //mette 0 in tutti i campi numerici (compresi quelli che non saranno riempiti)
 | ||
|   
 | ||
|   TString4 coddep = recriga.get(RDOC_CODMAG).left(3);  
 | ||
|   recdest.put("I5CDEP", coddep);                      //cod. deposito (viene preso = a quello della prima riga! mah!?)
 | ||
|   
 | ||
|   recdest.put("I5CCLI", recsource.get(DOC_CODCF));    //cod.cliente
 | ||
|   recdest.put("I5TDO1", recsource.get(DOC_TIPODOC));  //tipo doc. appl.esterno         
 | ||
|   recdest.put("I5CNMV", recsource.get(DOC_CODNUM));   //cod.num.appl.esterno
 | ||
|   recdest.put("I5UDOC", recsource.get_date(DOC_DATADOC).string(ANSI));  //data doc.appl.esterno
 | ||
|   recdest.put("I5NDOC", recsource.get(DOC_NDOC));     //num.doc.appl.esterno
 | ||
|   recdest.put("I5CPAG", recsource.get(DOC_CODPAG));   //cod.condizione pagamento
 | ||
|   
 | ||
|   TString16 codabicab = recsource.get(DOC_CODABIA);
 | ||
|   codabicab << recsource.get(DOC_CODCABA);
 | ||
|   recdest.put("I5CABI", codabicab);                 //codice banca abi cab
 | ||
|   
 | ||
|   recdest.put("I5CLIG", recsource.get(DOC_CODLIN));   //cod.lingua
 | ||
|   recdest.put("I5CPOR", recsource.get(DOC_CODPORTO)); //cod.porto
 | ||
|   recdest.put("I5CMEZ", recsource.get(DOC_CODSPMEZZO));  //cod.mezzo
 | ||
|   recdest.put("I5CVE1", recsource.get(DOC_CODVETT1));   //cod.vett.1
 | ||
|   recdest.put("I5CVE2", recsource.get(DOC_CODVETT2));   //cod.vett.2
 | ||
|   recdest.put("I5CVE3", recsource.get(DOC_CODVETT3));   //cod.vett.3
 | ||
|   recdest.put("I5CZON", recsource.get(DOC_ZONA));       //cod.zona
 | ||
|   
 | ||
|   const TRectype& tpdoc = cache().get("%TIP", recsource.get(DOC_TIPODOC));
 | ||
|   recdest.put("I5CCVE", tpdoc.get("S6"));            //cod.causale di vendita
 | ||
|   recdest.put("I5CCMO", tpdoc.get("S9"));     //cod.caus.magazzino su tabella tipodocumenti batbtip 
 | ||
|   
 | ||
|   recdest.put("I5CVAL", recsource.get(DOC_CODVAL));      //cod.valuta
 | ||
|   
 | ||
|   const bool is_controeuro = recsource.get_bool(DOC_CONTROEURO); //valore cambio
 | ||
|   real cambio = recsource.get_real(DOC_CAMBIO);
 | ||
|   if (!is_controeuro && cambio > ZERO)
 | ||
|     cambio = 1936.27/cambio;
 | ||
|   recdest.put("I5ICAM", cambio); 
 | ||
| 
 | ||
|   recdest.put("I5CAG1", recsource.get(DOC_CODAG));       //cod.agente
 | ||
|   recdest.put("I5CASP", recsource.get(DOC_ASPBENI1));     //cod. aspetto beni
 | ||
|   recdest.put("I5PSCA", recsource.get(DOC_SCONTOPERC));   //sconto testata documento
 | ||
|   recdest.put("I5NCLP", recsource.get(DOC_NCOLLI));      //num.colli
 | ||
|   
 | ||
|   real pnetto = recsource.get_real(DOC_PNETTO);
 | ||
|   recdest.put("I5QPNE", pnetto);      //peso netto merce
 | ||
|   real plordo  = pnetto;
 | ||
|   
 | ||
|   const TString4 umpnetto = recsource.get(DOC_UMPNETTO);    //peso lordo (se non ha un'unica unit<69> di misura tra pnetto e tara
 | ||
|   const TString4 umtara = recsource.get(DOC_UMTARA);        //fa plordo = pnetto
 | ||
|   if (umpnetto == umtara)
 | ||
|     plordo += recsource.get_real(DOC_TARA);
 | ||
|   recdest.put("I5QPLO", plordo);
 | ||
|   
 | ||
| }
 | ||
| 
 | ||
| // tipo -> B=bolle, F=fatture                                                                     
 | ||
| bool TToas400::genera_documenti(const TString& path, char t)
 | ||
| {                                                          
 | ||
|   const char* tipo = t == 'B' ? "pd0001b" : "pd0001f";
 | ||
|  
 | ||
| //crea il file delle testate delle bolle utilizzando bolle.trr come tracciato record
 | ||
|   TFilename siriodoc = path; siriodoc.add(tipo); siriodoc.ext("dbf");
 | ||
|   TFilename trrdoc = path; trrdoc.add(tipo); trrdoc.ext("trr");
 | ||
| 
 | ||
|   TExternisamfile documenti(siriodoc, trrdoc);
 | ||
|   documenti.zap();
 | ||
| 
 | ||
| //lettura da prassid.ini dell'ultima bolla/fattura trasferita (se non la trova, di default mette B01|2002|D|0)  
 | ||
|   TConfig fileini(CONFIG_DITTA, "pd0001");
 | ||
|   TToken_string ultimo = fileini.get(tipo, NULL, -1, t == 'B' ? "2008|B01" : "2008|FAA");
 | ||
|   
 | ||
| //scandisce il file doc.dbf alla ricerca dei documenti non ancora esportati...
 | ||
|   TRelation rel(LF_DOC);
 | ||
|   TString expr;
 | ||
|   expr << "PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC";
 | ||
|   rel.add(LF_RIGHEDOC, expr);    //aggiunge alla relazione (in origine sulle testate) il file delle righe x' necessita di alcuni campi di questo file
 | ||
| 
 | ||
| //..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
 | ||
|   TRectype& recsource = rel.curr();
 | ||
|   recsource.put(DOC_PROVV, "D");
 | ||
|   recsource.put(DOC_ANNO, ultimo.get(0));
 | ||
|   recsource.put(DOC_CODNUM, ultimo.get(1));
 | ||
|   recsource.put(DOC_NDOC, ultimo.get_long(2)+1);
 | ||
| //..quindi si crea il filtro ed il cursore per scandire il file delle testate documento..  
 | ||
|   TString filtro;
 | ||
|   filtro << "CODNUM==\"" << ultimo.get(1) << "\"";
 | ||
|   _datacurr = _mask->get_date(F_DATA_TRASF);
 | ||
|   filtro << "&&(ANSI(DATADOC)<=" << _datacurr.date2ansi() << ")";
 | ||
|   TCursor cur(&rel, filtro, 1, &recsource);
 | ||
|   const long items = cur.items();
 | ||
|   cur.freeze();
 | ||
|   
 | ||
|   TString caption; caption << "Elaborazione " << tipo << "...";
 | ||
|   TProgind pi(items, caption, TRUE, TRUE);
 | ||
| 
 | ||
| //..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo  
 | ||
|   TRectype& recdest = documenti.curr();
 | ||
|   const TRectype& righe = rel.curr(LF_RIGHEDOC);
 | ||
|   for (cur = 0; cur.pos() < items; ++cur)
 | ||
|   {
 | ||
|     pi.addstatus(1);
 | ||
|     if (pi.iscancelled())
 | ||
|       break;
 | ||
|       
 | ||
|     copia_documento(recdest, recsource, righe);  //copia i files delle testate  
 | ||
|     
 | ||
|     const int err = documenti.write();
 | ||
|     if (err != NOERR)
 | ||
|       return error_box("Errore %d di registrazione %s", err, tipo);
 | ||
|     
 | ||
|     // Calcola identificatore ultimo record trasferito
 | ||
|     ultimo = recsource.get(DOC_ANNO);
 | ||
|     ultimo.add(recsource.get(DOC_CODNUM));
 | ||
|     ultimo.add(recsource.get(DOC_NDOC));
 | ||
|   } 
 | ||
| 
 | ||
|   const bool ok = !pi.iscancelled();
 | ||
|   if (ok)
 | ||
|   {
 | ||
|     fileini.set(tipo, ultimo);
 | ||
|     TString16 tipodata; tipodata << "DATAULT" << t;
 | ||
|     fileini.set(tipodata, _datacurr);
 | ||
|   }
 | ||
| 
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| //___________________________________________________________________________________________________________________________
 | ||
| //MOVIMENTI CONTABILI
 | ||
| 
 | ||
| bool TToas400::genera_righemov(const TString& path)
 | ||
| {                                                          
 | ||
| //crea il file vuoto delle righe movimenti utilizzando rmovc.trr come tracciato record
 | ||
|   TFilename siriomov = path; siriomov.add("pd0001rm"); siriomov.ext("dbf");
 | ||
|   TFilename trrmov = path; trrmov.add("pd0001rm"); trrmov.ext("trr");
 | ||
| 
 | ||
|   TExternisamfile righe(siriomov, trrmov);
 | ||
|   righe.zap();
 | ||
| //lettura da prassid.ini dell'ultimo movimento trasferito  
 | ||
|   TConfig fileini(CONFIG_DITTA, "Sirio");
 | ||
|   TToken_string ultimo = fileini.get("Movimenti");
 | ||
|   
 | ||
| //scandisce il file rmov.dbf alla ricerca delle righe movimento non ancora esportate...
 | ||
|   TRelation rel(LF_RMOV);
 | ||
| 
 | ||
| //..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
 | ||
|   TRectype& recsource = rel.curr();
 | ||
|   recsource.put(RMV_NUMREG, ultimo.get_long(0));
 | ||
|   recsource.put(RMV_NUMRIG, ultimo.get(1));
 | ||
| 
 | ||
| //..quindi si crea il filtro ed il cursore per scandire il file delle righe documento..
 | ||
|   TString filtro;
 | ||
|   filtro << "NUMREG==\"" << ultimo.get(0) << "\"";
 | ||
|   TCursor cur(&rel, "", 1, &recsource);
 | ||
|   const long items = cur.items();
 | ||
|   cur.freeze();
 | ||
|   
 | ||
|   TString caption; caption << "Elaborazione righe movimenti...";
 | ||
|   TProgind pi(items, caption, TRUE, TRUE);
 | ||
| 
 | ||
| //..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo  
 | ||
|   TRectype& recdest = righe.curr();
 | ||
|   const TRectype& testata = rel.curr(LF_MOV);
 | ||
|   int nriga = 1;
 | ||
|   long ultimomov = 0;
 | ||
|   
 | ||
|   for (cur = 0L; cur.pos() < items; ++cur)
 | ||
|   {
 | ||
|     pi.addstatus(1);
 | ||
|     if (pi.iscancelled())
 | ||
|       break;
 | ||
|     
 | ||
|     long currmov = recsource.get_long(RMV_NUMREG);
 | ||
|     if (currmov != ultimomov)
 | ||
|     {
 | ||
|       ultimomov = currmov;
 | ||
|       nriga = 1;
 | ||
|     }
 | ||
| //    const TString& tipocausale = recsource.get(RMOV_);
 | ||
| //    if (tipocausale == )     //vogliamo solo righe pagamento!
 | ||
|     { 
 | ||
|       recsource.put(RMV_NUMRIG, nriga++); //incrementa il numero riga se rigapagamento 
 | ||
|       copia_rigamov(recdest, recsource);      
 | ||
|       const int err = righe.write();
 | ||
|       if (err != NOERR)
 | ||
|         return error_box("Errore %d di registrazione righe movimenti", err);
 | ||
|     }
 | ||
|   } 
 | ||
| 
 | ||
|   const bool ok = !pi.iscancelled();
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| void TToas400::copia_rigamov(TRectype& recdest, const TRectype& recsource) const
 | ||
| {
 | ||
|   recdest.zero();
 | ||
| }
 | ||
| 
 | ||
| /* Molto probabilmente inutile
 | ||
| void TToas400::copia_rigaiva(TRectype& recdest, const TRectype& recsource) const
 | ||
| {
 | ||
|   recdest.zero();
 | ||
| }
 | ||
| 
 | ||
| bool TToas400::genera_righeiva(const TString& path)
 | ||
| {                                                          
 | ||
| //crea il file delle testate delle bolle utilizzando bolle.trr come tracciato record
 | ||
|   TFilename siriomov = path; siriomov.add("rmoviva"); siriomov.ext("dbf");
 | ||
|   TFilename trrmov = path; trrmov.add("rmoviva"); trrmov.ext("trr");
 | ||
| 
 | ||
|   TExternisamfile movimenti(siriomov, trrmov);
 | ||
|   movimenti.zap();
 | ||
| //lettura da prassid.ini dell'ultima bolla trasferita (se non la trova, di default mette B01|2002|D|0)  
 | ||
|   TConfig fileini(CONFIG_DITTA, "Sirio");
 | ||
|   TToken_string ultimo = fileini.get("Movimenti");
 | ||
|   
 | ||
| //scandisce il file doc.dbf alla ricerca dei documenti non ancora esportati...
 | ||
|   TRelation rel(LF_RMOVIVA);
 | ||
| 
 | ||
| //..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
 | ||
|   TRectype& recsource = rel.curr();
 | ||
|   recsource.put(MOV_NUMREG, ultimo.get(0));
 | ||
| 
 | ||
|   TCursor cur(&rel, "", 1, &recsource);
 | ||
|   const long items = cur.items();
 | ||
|   cur.freeze();
 | ||
|   
 | ||
|   TString caption; caption << "Elaborazione righe IVA...";
 | ||
|   TProgind pi(items, caption, TRUE, TRUE);
 | ||
| 
 | ||
| //..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo  
 | ||
|   TRectype& recdest = movimenti.curr();
 | ||
|   for (cur = 0; cur.pos() < items; ++cur)
 | ||
|   {
 | ||
|     pi.addstatus(1);
 | ||
|     if (pi.iscancelled())
 | ||
|       break;
 | ||
|       
 | ||
|     copia_rigaiva(recdest, recsource);  
 | ||
|     
 | ||
|     const int err = movimenti.write();
 | ||
|     if (err != NOERR)
 | ||
|       return error_box("Errore %d di registrazione righe iva", err);
 | ||
|   } 
 | ||
| 
 | ||
|   const bool ok = !pi.iscancelled();
 | ||
|   return ok;
 | ||
| }
 | ||
| */
 | ||
| 
 | ||
| bool TToas400::genera_movimenti(const TString& path)
 | ||
| {                                                          
 | ||
| //crea il file delle testate dei movimenti contabili di pagamento utilizzando movc.trr come tracciato record
 | ||
|   TFilename siriomov = path; siriomov.add("pd0001m"); siriomov.ext("dbf");
 | ||
|   TFilename trrmov = path; trrmov.add("pd0001m"); trrmov.ext("trr");
 | ||
| 
 | ||
|   TExternisamfile movimenti(siriomov, trrmov);
 | ||
|   movimenti.zap();
 | ||
| //lettura da prassid.ini dell'ultimo movimento trasferito (se non lo trova, di default mette 1|MOV 
 | ||
|   TConfig fileini(CONFIG_DITTA, "pd0001");
 | ||
|   TToken_string ultimo = fileini.get("Movimenti", NULL, -1, "0");
 | ||
|   
 | ||
| //scandisce il file mov.dbf alla ricerca dei movimenti non ancora esportati...
 | ||
|   TRelation rel(LF_MOV);
 | ||
| //aggiunge alla relazione il file delle righemov e quello delle partite (gli servono per alcuni campi)
 | ||
|   rel.add(LF_RMOV, "NUMREG==NUMREG");
 | ||
|   rel.add(LF_PARTITE, "NUMREG==NUMREG", 2);
 | ||
| 
 | ||
| //..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
 | ||
|   TRectype& recsource = rel.curr();
 | ||
|   recsource.put(MOV_NUMREG, ultimo.get_long(0));
 | ||
| 
 | ||
| //..quindi si crea il filtro ed il cursore per scandire il file delle testate movimenti..  
 | ||
|   TString filtro;
 | ||
|   filtro << "NUMREG==\"" << ultimo.get(0) << "\"";  
 | ||
|   TCursor cur(&rel, filtro, 1, &recsource);
 | ||
|   const long items = cur.items();
 | ||
|   cur.freeze();
 | ||
|   
 | ||
|   TString caption; caption << "Elaborazione movimenti...";
 | ||
|   TProgind pi(items, caption, TRUE, TRUE);
 | ||
| 
 | ||
| //..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo  
 | ||
|   TRectype& recdest = movimenti.curr();
 | ||
|   const TRectype& righe = rel.curr(LF_RMOV);
 | ||
|   const TRectype& partite = rel.curr(LF_PARTITE);
 | ||
|   for (cur = 0; cur.pos() < items; ++cur)
 | ||
|   {
 | ||
|     pi.addstatus(1);
 | ||
|     if (pi.iscancelled())
 | ||
|       break;
 | ||
|       
 | ||
|     copia_movimento(recdest, recsource, righe, partite);  
 | ||
|     
 | ||
|     const int err = movimenti.write();
 | ||
|     if (err != NOERR)
 | ||
|       return error_box("Errore %d di registrazione movimenti", err);
 | ||
|     
 | ||
|     // Calcola identificatore ultimo record trasferito
 | ||
|     ultimo = recsource.get(MOV_NUMREG);
 | ||
|   } 
 | ||
| 
 | ||
|   const bool ok = !pi.iscancelled();
 | ||
|   if (ok)
 | ||
|   {
 | ||
|     fileini.set("Movimenti", ultimo);
 | ||
|     fileini.set("DATAULTM", _datacurr);
 | ||
|   }
 | ||
| 
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void TToas400::copia_movimento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga, const TRectype& recpartita) const
 | ||
| {
 | ||
|   azzera_campi (recdest);  //mette 0 in tutti i campi numerici (compresi quelli che non saranno riempiti)
 | ||
|   
 | ||
|   recdest.put("CMTMCO", "Z"); //misterioso campo in cui va scritta Z; <20> il campo Zorro?
 | ||
|   recdest.put("CMUREG", recsource.get_date(MOV_DATAREG).string(ANSI));   //data registraz. contabile (data competenza) (in formato string)
 | ||
|   recdest.put("CMNPRO", recsource.get(MOV_NUMREG));     //numero registraz. contabile (numero operazione)
 | ||
|   recdest.put("CMUDOC", recsource.get_date(MOV_DATADOC).string(ANSI));    //data documento
 | ||
|   recdest.put("CMNDCM", recsource.get(MOV_NUMDOC));     //numero documento
 | ||
|   recdest.put("CMFADA", recsource.get(RMV_SEZIONE));    //flag mov dare avere (preso dalla prima rigamov)
 | ||
|   recdest.put("CMITOD", recsource.get(MOV_TOTDOC));     //importo in valuta di bilancio (totale documento)
 | ||
|   
 | ||
|   TString16 codcli;
 | ||
|   codcli << "C   " << recsource.get(MOV_CODCF);
 | ||
|   recdest.put("CMCPIA", codcli);    //codice cliente
 | ||
|   
 | ||
|   TDate data = recsource.get_date(MOV_DATADOC);
 | ||
|   TString8 dataok = data.string(ANSI);
 | ||
|   dataok.cut(6);
 | ||
|   recdest.put("CMUAMR", dataok);                   //data documento in formato YYYYMM per pareggio con fattura
 | ||
|   
 | ||
|   recdest.put("CMNRIP", recsource.get(MOV_NUMDOC));      //num.doc. fattura per pareggio con fattura (=CMNDCM)
 | ||
| 
 | ||
|   recdest.put("CMTCAU", "P");                     //tipo causale movimento:solo Pagamenti (filtro in genera movimenti)
 | ||
|   
 | ||
| //  recdest.put("CMTEFF", recsource.get(MOV_));     //tipo del pagamento
 | ||
|   
 | ||
| //  recdest.put("CMUSCA", recsource.get(MOV_));       //data scadenza
 | ||
| 
 | ||
|   recdest.put("CMCVAL", recsource.get(MOV_CODVAL));  //codice valuta estera
 | ||
|   recdest.put("CMICAM", recsource.get(MOV_CAMBIO));  //cambio
 | ||
|   recdest.put("CMITOV", recsource.get(MOV_TOTDOCVAL)); //totale doc in valuta
 | ||
|   
 | ||
|   recdest.put("CMDMO1", recsource.get(MOV_DESCR).left(25)); //prima descrizione
 | ||
|   recdest.put("CMDMO2", recsource.get(MOV_DESCR).mid(25));  //seconda descrizione
 | ||
|   
 | ||
|   recdest.put("CMUREB", recsource.get_date(MOV_DATACOMP).string(ANSI)); //data di registrazione
 | ||
| }
 | ||
| 
 | ||
| //___________________________________________________________________________________________________________________________
 | ||
| //GENERALE
 | ||
| 
 | ||
| void TToas400::azzera_campi(TRectype& rectozero) const
 | ||
| { 
 | ||
|   rectozero.zero();  //svuota i campi
 | ||
|   int numfields = rectozero.items();
 | ||
|   for (int i = 0 ; i < numfields; i++)
 | ||
|   { 
 | ||
|     const char* fieldname = rectozero.fieldname(i);
 | ||
|     switch (rectozero.type(fieldname))
 | ||
|     {
 | ||
|       case _intfld:
 | ||
|       case _longfld:
 | ||
|       case _realfld:
 | ||
|       case _datefld:
 | ||
|       case _intzerofld:
 | ||
|       case _longzerofld:
 | ||
|         rectozero.put(fieldname, "0");
 | ||
|         break;
 | ||
|         
 | ||
|       default: break;      
 | ||
|     }    
 | ||
|   }    
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| bool TToas400::genera_bolle(const TString& path)
 | ||
| {                     
 | ||
|   bool ok = genera_righedoc(path, 'B');
 | ||
|   if (ok)
 | ||
|     ok = genera_documenti(path, 'B');
 | ||
|   return ok;
 | ||
| }
 | ||
| 
 | ||
| bool TToas400::genera_fatture(const TString& path)
 | ||
| {                     
 | ||
|   bool ok = genera_righedoc(path, 'F');
 | ||
|   if (ok)
 | ||
|     ok = genera_documenti(path, 'F');
 | ||
|   return ok;  
 | ||
| }
 | ||
| 
 | ||
| bool TToas400::genera_movcont(const TString& path)
 | ||
| {
 | ||
|   bool ok = genera_righemov(path);
 | ||
| /*  Molto probabilmente inutile
 | ||
|   if (ok)
 | ||
|     ok = genera_righeiva(path);
 | ||
| */    
 | ||
|   if (ok)
 | ||
|     ok = genera_movimenti(path);
 | ||
|   return ok;  
 | ||
| }
 | ||
| 
 | ||
| void TToas400::main_loop()
 | ||
| {   
 | ||
|   // Prececchiamo tutto
 | ||
|   _mask->set(F_BOLLE,"X");
 | ||
|   _mask->set(F_FATTURE,"X");
 | ||
| //  _mask->set(F_MOVCONT,"X");  da accendere quando ci sara' il tracciato dei movimenti
 | ||
| 
 | ||
|   while (true)
 | ||
|   { 
 | ||
|     ini2mask(); //inizializza la maschera con i parametri di configurazione
 | ||
|     if (_mask->run() != K_ENTER)
 | ||
|       break;
 | ||
| 
 | ||
|     const TString& path = _mask->get(F_PATH);  
 | ||
|     bool ok = true;
 | ||
| 
 | ||
|     if (ok && _mask->get_bool(F_BOLLE))
 | ||
|       ok = genera_bolle(path);
 | ||
|     if (ok && _mask->get_bool(F_FATTURE))
 | ||
|       ok = genera_fatture(path);
 | ||
|     if (ok && _mask->get_bool(F_MOVCONT))
 | ||
|       ok = genera_movcont(path);
 | ||
| 
 | ||
|     if (ok) //se almeno uno dei trasferimenti e' andato a buon fine, registra il PATH sul ditta.ini
 | ||
|     {
 | ||
|       _trrpath = _mask->get(F_PATH);
 | ||
|       TConfig fileini(CONFIG_DITTA, "Sirio");
 | ||
|       fileini.set("PATH", _trrpath);
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| //===================================================================//
 | ||
| int pd0001100(int argc, char* argv[])
 | ||
| { 
 | ||
|   TToas400 a;
 | ||
|   a.run(argc,argv,TR("Esportazione documenti ad AS400"));
 | ||
|   return 0;
 | ||
| }
 |