git-svn-id: svn://10.65.10.50/branches/R_10_00@22655 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			248 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "cg0201.h"
 | 
						|
 | 
						|
#include <recset.h>
 | 
						|
 | 
						|
#include <clifo.h>
 | 
						|
#include <modaut.h>
 | 
						|
#include <indsp.h>
 | 
						|
 | 
						|
// Definizione dei metodi relativi alla classe TClifoVI
 | 
						|
 | 
						|
TClifoVI::TClifoVI() : TRelation(LF_CLIFO), _oldindirizzi(0), _gesven(FALSE)
 | 
						|
{
 | 
						|
  add(LF_CFVEN,"TIPOCF==TIPOCF|CODCF==CODCF");
 | 
						|
  add(LF_INDSP,"TIPOCF==TIPOCF|CODCF==CODCF");
 | 
						|
}
 | 
						|
 | 
						|
void TClifoVI::destroy_rows()
 | 
						|
{
 | 
						|
  _indirizzi.destroy();
 | 
						|
  _contatti.destroy();
 | 
						|
}
 | 
						|
 | 
						|
TRectype& TClifoVI::indirizzo(int i)
 | 
						|
{
 | 
						|
  TRectype *r=(TRectype*)_indirizzi.objptr(i);
 | 
						|
 | 
						|
  if (r == NULL)
 | 
						|
  {
 | 
						|
    r = new TRectype(LF_INDSP);
 | 
						|
    _indirizzi.add(r,i);
 | 
						|
  }
 | 
						|
  return *r;
 | 
						|
}
 | 
						|
 | 
						|
TRectype& TClifoVI::contatto(int i)
 | 
						|
{
 | 
						|
  TRectype* r= (TRectype*)_contatti.objptr(i);
 | 
						|
  if (r == NULL)
 | 
						|
  {
 | 
						|
    r = new TRectype(LF_MULTIREL);
 | 
						|
    _contatti.add(r,i);
 | 
						|
  }
 | 
						|
  return *r;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int TClifoVI::read_indirizzi()
 | 
						|
{
 | 
						|
  destroy_rows();
 | 
						|
 | 
						|
  if (_gesven)
 | 
						|
  {
 | 
						|
    const TRectype& rind = curr(LF_INDSP);
 | 
						|
    for (bool ok=is_first_match(LF_INDSP); ok; ok=next_match(LF_INDSP))
 | 
						|
    {
 | 
						|
      const int nriga = rind.get_int(IND_CODIND) -1;
 | 
						|
      indirizzo(nriga) = rind;
 | 
						|
    }
 | 
						|
    _oldindirizzi = indirizzi();
 | 
						|
    
 | 
						|
    // Read contatti
 | 
						|
    TLocalisamfile cont(LF_MULTIREL);
 | 
						|
    const char tipocf = curr().get_char(CLI_TIPOCF);
 | 
						|
    const long codcf = curr().get_long(CLI_CODCF);
 | 
						|
    TString8 first; first.format("%C%06ld", tipocf, codcf);
 | 
						|
    cont.put("COD", "BACON");
 | 
						|
    cont.put("FIRST", first);
 | 
						|
    for (int err = cont.read(_isgteq); 
 | 
						|
        err == NOERR && cont.get("COD") == "BACON" && cont.get("FIRST") == first; 
 | 
						|
        err = cont.next())
 | 
						|
      _contatti.add(cont.curr());
 | 
						|
  }
 | 
						|
  
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::write_contatti()
 | 
						|
{
 | 
						|
  TAssoc_array old_ones;
 | 
						|
  TLocalisamfile cont(LF_MULTIREL);
 | 
						|
  const char tipocf = curr().get_char(CLI_TIPOCF);
 | 
						|
  const long codcf = curr().get_long(CLI_CODCF);
 | 
						|
  TString8 first; first.format("%C%06ld", tipocf, codcf);
 | 
						|
  cont.put("COD", "BACON");
 | 
						|
  cont.put("FIRST", first);
 | 
						|
  for (int err = cont.read(_isgteq); 
 | 
						|
       err == NOERR && cont.get("COD") == "BACON" && cont.get("FIRST") == first; 
 | 
						|
       err = cont.next())
 | 
						|
    old_ones.add(cont.curr().get("SECOND"));
 | 
						|
 | 
						|
  FOR_EACH_ASSOC_OBJECT(old_ones, h, k, r)
 | 
						|
  {
 | 
						|
    bool trovato = false;
 | 
						|
    for (int i = _contatti.last(); i >= 0 && !trovato; i--)
 | 
						|
    {
 | 
						|
      const TRectype& c = (const TRectype&)_contatti[i];
 | 
						|
      trovato = c.get_long("SECOND") == atol(k);
 | 
						|
    }
 | 
						|
    if (!trovato)
 | 
						|
    {
 | 
						|
      cont.zero();
 | 
						|
      cont.put("COD", "BACON");
 | 
						|
      cont.put("FIRST", first);
 | 
						|
      cont.put("SECOND", k);
 | 
						|
      cont.remove();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  FOR_EACH_ARRAY_ITEM(_contatti, i, obj)
 | 
						|
  {
 | 
						|
    TRectype& rec = *(TRectype*)obj;
 | 
						|
    if (rec.get("DATA").full())
 | 
						|
    {
 | 
						|
      TString8 second;
 | 
						|
      second.format("%06ld", rec.get_long("SECOND"));
 | 
						|
      rec.put("COD", "BACON");
 | 
						|
      rec.put("FIRST", first);
 | 
						|
      rec.put("SECOND", second);
 | 
						|
      rec.write_rewrite(cont);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::read(TIsamop op, TReclock lockop)
 | 
						|
{
 | 
						|
  const int err = file().read(op,lockop);
 | 
						|
  position_rels();
 | 
						|
 | 
						|
  if (err == NOERR) 
 | 
						|
    read_indirizzi();
 | 
						|
  
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::write_rec(bool re, const TRectype& rec, TLocalisamfile& f)
 | 
						|
{
 | 
						|
  if (re)
 | 
						|
  {
 | 
						|
    const bool scrivi= f.rewrite(rec)!=NOERR;
 | 
						|
    if (scrivi) f.write(rec);
 | 
						|
  } 
 | 
						|
  else
 | 
						|
    f.write(rec);
 | 
						|
  return f.status();
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::cancella(TLocalisamfile& f, int da, int a)
 | 
						|
{
 | 
						|
  const char tipocf=lfile().get(IND_TIPOCF)[0];
 | 
						|
  const long codcf=lfile().get_long(IND_CODCF);
 | 
						|
 | 
						|
  for (int i=da; i<=a;i++)
 | 
						|
  {
 | 
						|
    f.zero();
 | 
						|
    f.put(IND_TIPOCF,tipocf);
 | 
						|
    f.put(IND_CODCF,codcf);
 | 
						|
    f.put(IND_CODIND,i);
 | 
						|
    if (f.read(_isequal,_lock)==NOERR)
 | 
						|
      f.remove();
 | 
						|
  }
 | 
						|
  return f.status();
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::registra(bool re, bool force)
 | 
						|
{
 | 
						|
  TLocalisamfile& c=lfile(LF_CLIFO);
 | 
						|
  int err=write_rec(re,c.curr(),c);
 | 
						|
  if (err!=NOERR) return err;
 | 
						|
 | 
						|
  TLocalisamfile& v = lfile(LF_CFVEN);
 | 
						|
  err = write_rec(TRUE,v.curr(),v);
 | 
						|
  if (err!=NOERR) return err;
 | 
						|
 | 
						|
  // Put here gest_vend() discrimination
 | 
						|
  if (_gesven)
 | 
						|
  {
 | 
						|
    TLocalisamfile& rind=lfile(LF_INDSP);
 | 
						|
    const char tipocf=c.get(CLI_TIPOCF)[0];
 | 
						|
    const long codcf=c.get_long(CLI_CODCF);
 | 
						|
    int i;
 | 
						|
 | 
						|
    for (i=0; i<indirizzi(); i++)
 | 
						|
    {
 | 
						|
      if (!re)
 | 
						|
      {
 | 
						|
        indirizzo(i).put(IND_TIPOCF,tipocf);
 | 
						|
        indirizzo(i).put(IND_CODCF,codcf);
 | 
						|
      }
 | 
						|
      err=write_rec(TRUE,indirizzo(i),rind);
 | 
						|
    }
 | 
						|
    if (i<_oldindirizzi)
 | 
						|
      cancella(rind,i+1,_oldindirizzi);
 | 
						|
    _oldindirizzi=indirizzi();
 | 
						|
 | 
						|
    write_contatti();
 | 
						|
  }
 | 
						|
 | 
						|
  if (_geslv)
 | 
						|
  {
 | 
						|
    TLocalisamfile& lv = lfile(-LVAUT);
 | 
						|
 | 
						|
    const char tipocf=c.get(CLI_TIPOCF)[0];
 | 
						|
    const long codcf=c.get_long(CLI_CODCF);
 | 
						|
    TString8 codtab; codtab << tipocf << codcf;
 | 
						|
 | 
						|
    TRectype& rec = lv.curr();
 | 
						|
    rec.put("CODTAB", codtab);
 | 
						|
    err = write_rec(TRUE, rec, lv);
 | 
						|
    if (err!=NOERR) return err;
 | 
						|
  }
 | 
						|
 | 
						|
  //  END of gest_vend() discrimination
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::write(bool force)
 | 
						|
{
 | 
						|
  _oldindirizzi=0;
 | 
						|
  return registra(FALSE,force);
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::rewrite(bool force)
 | 
						|
{
 | 
						|
  return registra(TRUE,force);
 | 
						|
}
 | 
						|
 | 
						|
int TClifoVI::remove()
 | 
						|
{
 | 
						|
  const int err = lfile(LF_CLIFO).remove();
 | 
						|
 | 
						|
  // Put here gest_vend() discrimination
 | 
						|
  if (_gesven)
 | 
						|
  {
 | 
						|
    lfile(LF_CFVEN).remove();
 | 
						|
 | 
						|
    TLocalisamfile& rind = lfile(LF_INDSP);
 | 
						|
    cancella(rind, 1, _oldindirizzi);
 | 
						|
 | 
						|
    _contatti.destroy();
 | 
						|
    write_contatti();   
 | 
						|
  }
 | 
						|
  _oldindirizzi=0;
 | 
						|
 | 
						|
  return err;
 | 
						|
}
 |