187 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "effetti.h"         
 | 
						|
#include "reffetti.h"
 | 
						|
#include "cession.h"
 | 
						|
#include "ef0101.h"
 | 
						|
 | 
						|
/////////////////////////////////////////////////////////////
 | 
						|
//////// Riga Effetto
 | 
						|
/////////////////////////////////////////////////////////////
 | 
						|
TRiga_effetto::TRiga_effetto(TEffetto* eff)
 | 
						|
               : TRectype(LF_REFFETTI), _eff(eff)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
TRiga_effetto::TRiga_effetto(const TRiga_effetto& rec, TEffetto* eff)
 | 
						|
               : TRectype(rec), _eff(eff)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
/////////////////////////////////////////////////////////////
 | 
						|
////////// Effetto
 | 
						|
/////////////////////////////////////////////////////////////
 | 
						|
TEffetto::TEffetto()
 | 
						|
          : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, "NRIGATR"), _cess(LF_CESS, "NRIGA")
 | 
						|
{                                 
 | 
						|
}
 | 
						|
 | 
						|
TEffetto::TEffetto(TRectype& rec)
 | 
						|
          : TRectype(LF_EFFETTI), _righe(LF_REFFETTI, "NRIGATR"), _cess(LF_CESS, "NRIGA")
 | 
						|
{      
 | 
						|
   read(rec);                           
 | 
						|
}
 | 
						|
 | 
						|
void TEffetto::set_key(TRectype& rec, long numeff) const
 | 
						|
{
 | 
						|
  CHECKD(numeff >= 0, "Numero effetto non valido ", numeff);
 | 
						|
  rec.put("NPROGTR",numeff);
 | 
						|
}
 | 
						|
 | 
						|
void TEffetto::set_key4(TRectype& rec,char tipodist, long ndist, long nrigadist)
 | 
						|
{
 | 
						|
  CHECK(tipodist == 'I' || tipodist == 'S' || tipodist == 'B', "Tipo distinta");
 | 
						|
  CHECKD(ndist >= 0, "Numero distinta non valido ", ndist);
 | 
						|
  CHECKD(nrigadist >= 0, "Numero riga distinta non valido ", nrigadist);
 | 
						|
  
 | 
						|
  rec.put("TIPODIST", tipodist); 
 | 
						|
  rec.put("NDIST", ndist);
 | 
						|
  rec.put("NRIGADIST", nrigadist);
 | 
						|
}
 | 
						|
 | 
						|
long TEffetto::get_next_key(const long codcf) const
 | 
						|
{               
 | 
						|
  static long n = 0;
 | 
						|
  if (n == 0)
 | 
						|
  {
 | 
						|
    TLocalisamfile eff(LF_EFFETTI);
 | 
						|
    TRectype& curr = eff.curr();
 | 
						|
    set_key(curr, 9999999L);
 | 
						|
  
 | 
						|
    const int err = eff.read(_isgreat);
 | 
						|
                
 | 
						|
    if (err != _isemptyfile)
 | 
						|
    {
 | 
						|
      if (err == NOERR)
 | 
						|
        eff.prev();
 | 
						|
      if (curr.get_long("CODCF")==codcf)
 | 
						|
        n = curr.get_long("NPROGTR");
 | 
						|
    }     
 | 
						|
  }      
 | 
						|
  n++;
 | 
						|
  return n;   
 | 
						|
}
 | 
						|
 | 
						|
long TEffetto::renum(long numeff)
 | 
						|
{
 | 
						|
  if (numeff <= 0)
 | 
						|
  {                             
 | 
						|
    long codcf = codicec();
 | 
						|
    numeff  = get_next_key(codcf);
 | 
						|
  }   
 | 
						|
  char num[7]; sprintf(num, "%ld", numeff);
 | 
						|
  renum_key("NPROGTR", num);       // aggiorna testata
 | 
						|
  _righe.renum_key("NPROGTR", num); // aggiorna righe ok
 | 
						|
  _cess.renum_key("NPROGTR", num); // aggiorna cessionari ok
 | 
						|
  return numeff;
 | 
						|
}
 | 
						|
 | 
						|
int TEffetto::read(const TRectype& rec)
 | 
						|
{                
 | 
						|
  head() = rec;  
 | 
						|
  TRectype *k_reff = new TRectype(LF_REFFETTI), *k_cess= new TRectype(LF_CESS); 
 | 
						|
  const long nu = numero();
 | 
						|
  CHECK(nu > 0, "Numero effetto nullo.");
 | 
						|
  set_key(*k_reff, nu);
 | 
						|
  set_key(*k_cess, nu);
 | 
						|
  
 | 
						|
  TLocalisamfile eff(LF_EFFETTI);        
 | 
						|
  int err = TRectype::read(eff);
 | 
						|
  if (err == NOERR)
 | 
						|
  {
 | 
						|
    _righe.read(k_reff); 
 | 
						|
    _cess.read(k_cess);
 | 
						|
  }  
 | 
						|
  else
 | 
						|
  {
 | 
						|
    head() = rec;
 | 
						|
    destroy_rows_r();
 | 
						|
    destroy_rows_c();
 | 
						|
    _cess.set_key(k_cess);
 | 
						|
    _righe.set_key(k_reff);
 | 
						|
  }
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
int TEffetto::read(char tipodist, long ndist, long nrigadist)
 | 
						|
{                           
 | 
						|
  TRectype rec(LF_EFFETTI);
 | 
						|
  set_key4(rec, tipodist,ndist, nrigadist);
 | 
						|
  return read(rec);
 | 
						|
}
 | 
						|
 | 
						|
int TEffetto::write(bool force)
 | 
						|
{ 
 | 
						|
  const bool nuovo = numero() <= 0;            // E' nuovo di zecca!
 | 
						|
  if (nuovo && force)                          // quindi ...
 | 
						|
    force = FALSE;                             // ... non fare la rewrite
 | 
						|
 | 
						|
  TLocalisamfile eff(LF_EFFETTI);
 | 
						|
  int err = NOERR;
 | 
						|
  if (force)
 | 
						|
  {
 | 
						|
    if ((err=_righe.write(force)) == NOERR) err = _cess.write(force);
 | 
						|
    if (err == NOERR)
 | 
						|
    {
 | 
						|
      err = TRectype::rewrite(eff);
 | 
						|
      if (err != NOERR)
 | 
						|
        err = TRectype::write(eff);
 | 
						|
    }
 | 
						|
   }     
 | 
						|
   else
 | 
						|
  {             
 | 
						|
    if (nuovo)
 | 
						|
    {         
 | 
						|
      TEffetto& myself = *(TEffetto*)this;
 | 
						|
      if (numero() <= 0)
 | 
						|
        myself.renum();
 | 
						|
      do
 | 
						|
      {
 | 
						|
        err = TRectype::write(eff);
 | 
						|
        if (err == _isreinsert)
 | 
						|
          myself.renum();
 | 
						|
      } while (err == _isreinsert);
 | 
						|
     }
 | 
						|
    else 
 | 
						|
    {
 | 
						|
      err = TRectype::write(eff);
 | 
						|
      if (err != NOERR)
 | 
						|
        err = TRectype::rewrite(eff);
 | 
						|
    }    
 | 
						|
    if (err == NOERR)
 | 
						|
      if ((err=_righe.write(force)) == NOERR) err= _cess.write(force); 
 | 
						|
  }
 | 
						|
  return err;  
 | 
						|
}
 | 
						|
 | 
						|
int TEffetto::remove()const
 | 
						|
{     
 | 
						|
  TLocalisamfile eff(LF_EFFETTI);
 | 
						|
  int err;
 | 
						|
  if ((err=_righe.remove()) == NOERR) err= _cess.remove(); 
 | 
						|
  if (err == NOERR)
 | 
						|
    err = TRectype::remove(eff);
 | 
						|
  return err;  
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
              
 | 
						|
 | 
						|
 | 
						|
 
 | 
						|
 |