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;
 | 
						||
}
 |