Files correlati : ef0 Ricompilazione Demo : [ ] Commento : Migliorato caricamento distinte incomplete git-svn-id: svn://10.65.10.50/branches/R_10_00@22572 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			162 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "ef0301.h"    
 | 
						|
 | 
						|
#include <recset.h>
 | 
						|
#include <relation.h>
 | 
						|
 | 
						|
///////////////////////////////////////////////////
 | 
						|
// Definizione dei metodi della classe TDistinta // 
 | 
						|
///////////////////////////////////////////////////
 | 
						|
 | 
						|
// costruttore distinta utilizzando il record passato
 | 
						|
TDistinta::TDistinta(const TRectype& rec, word lockop)
 | 
						|
{      
 | 
						|
  read(rec,lockop);                           
 | 
						|
}
 | 
						|
 | 
						|
// costruisce la distinta del tipo e numero passati
 | 
						|
TDistinta::TDistinta(const char tipo, const long numero, word lockop)
 | 
						|
{      
 | 
						|
  read(tipo,numero,lockop);                           
 | 
						|
}
 | 
						|
 | 
						|
TDistinta::~TDistinta()
 | 
						|
{
 | 
						|
  if (_righe_dist.items() > 0) // Se ha letto elementi sblocca eventualmente la prima riga
 | 
						|
  {
 | 
						|
    TLocalisamfile f(LF_EFFETTI);
 | 
						|
    f.read(eff(0), _isequal,_unlock);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const TString& TDistinta::query(const char tipo, const long numero, const int riga) const
 | 
						|
{
 | 
						|
  TString& q = get_tmp_string();
 | 
						|
  q << "USE EFFETTI KEY 4"
 | 
						|
    << "\nFROM TIPODIST=" << tipo << " NDIST=" << numero;
 | 
						|
  if (riga > 1)
 | 
						|
    q << " NRIGADIST=" << riga;
 | 
						|
  q << "\nTO TIPODIST=" << tipo << " NDIST=" << numero;
 | 
						|
  return q;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// permette di leggere la distinta del tipo e numero passati 
 | 
						|
int TDistinta::read(const char tipo, const long numero, word lockop)
 | 
						|
{ 
 | 
						|
  int err = _iskeynotfound;
 | 
						|
  if (_righe_dist.items()) // Se ha letto una distinta precedente, sblocca la prima riga
 | 
						|
  {
 | 
						|
    TLocalisamfile f(LF_EFFETTI); f.setkey(4);
 | 
						|
    f.read(eff(0),_isequal,_unlock);
 | 
						|
    _righe_dist.destroy(); // Rimuove tutte le righe precedenti
 | 
						|
  }
 | 
						|
  if (tipo >= ' ' && numero > 0)
 | 
						|
  {
 | 
						|
    TISAM_recordset reff(query(tipo, numero));
 | 
						|
    TLocalisamfile& f = reff.cursor()->file();
 | 
						|
    int i = 0;
 | 
						|
    for (bool ok = reff.move_first(); ok; ok = reff.move_next())
 | 
						|
    {
 | 
						|
      const word lock = (i == 0 && lockop == _lock) ? _lock : _nolock; // Lock solo sulla prima riga
 | 
						|
      const int n = reff.get(EFF_NRIGADIST).as_int();
 | 
						|
      TEffetto* effetto = new TEffetto; 
 | 
						|
      err = effetto->read(f, tipo, numero, n, lock);//legge un effetto per chiave 4
 | 
						|
      if (err == NOERR)
 | 
						|
      {
 | 
						|
        i = _righe_dist.add(effetto) + 1;
 | 
						|
        effetto->put(EFF_NRIGADIST, i);
 | 
						|
      }
 | 
						|
      else
 | 
						|
        delete effetto;  
 | 
						|
    }
 | 
						|
  }  
 | 
						|
  // se ho letto degli effetti della distinta ed ho 
 | 
						|
  // trovato la fine file elimino l'errore 
 | 
						|
  if ((_righe_dist.items()>0)||(err == _iseof) )
 | 
						|
    err = NOERR;                                
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 
 | 
						|
// permette di leggere la distinta dal record passato    
 | 
						|
int TDistinta::read(const TRectype& rec, word lockop)
 | 
						|
{ 
 | 
						|
  CHECK(rec.num() == LF_EFFETTI,"Can't read distinta from a different record type");
 | 
						|
  const char tipo = rec.get_char(EFF_TIPODIST);
 | 
						|
  const long numero = rec.get_long(EFF_NDIST);
 | 
						|
  return read(tipo,numero,lockop);//legge la distinta
 | 
						|
} 
 | 
						|
 | 
						|
// scrive la distinta
 | 
						|
int TDistinta::write(bool force, TToken_string* dati_dist)
 | 
						|
{ 
 | 
						|
  int err = NOERR;
 | 
						|
  //quanti effetti sono nella distinta (nell'array in memoria)
 | 
						|
  TLocalisamfile f(LF_EFFETTI); f.setkey(4);
 | 
						|
  int nriga = 0;
 | 
						|
  FOR_EACH_ARRAY_ITEM(_righe_dist, i, obj)
 | 
						|
  {
 | 
						|
    TEffetto& effetto = *(TEffetto*)obj;
 | 
						|
    // token string che contiene i dati da registrare sull'effetto 
 | 
						|
    if (dati_dist)
 | 
						|
    {
 | 
						|
      dati_dist->restart();
 | 
						|
      effetto.put(EFF_TIPODIST, dati_dist->get());
 | 
						|
      effetto.put(EFF_NDIST,    dati_dist->get());   
 | 
						|
      effetto.put(EFF_DATADIST, dati_dist->get()); 
 | 
						|
      effetto.put(EFF_CODABIP,  dati_dist->get());
 | 
						|
      effetto.put(EFF_CODCABP,  dati_dist->get());  
 | 
						|
      effetto.put(EFF_PROGBNP,  dati_dist->get());    
 | 
						|
      effetto.put(EFF_NRIGADIST, ++nriga);
 | 
						|
    }
 | 
						|
    else
 | 
						|
      nriga = effetto.get_int(EFF_NRIGADIST);
 | 
						|
    //riscrivo l'effetto con i dati della distinta a cui appartiene
 | 
						|
    err = effetto.rewrite_write(f);
 | 
						|
    if (err != NOERR)
 | 
						|
      break;
 | 
						|
  }    
 | 
						|
 | 
						|
  if (dati_dist)
 | 
						|
  {
 | 
						|
    const char td = dati_dist->get_char(0);
 | 
						|
    const long nd = dati_dist->get_long();
 | 
						|
    remove(td, nd, nriga+1);
 | 
						|
  }
 | 
						|
  
 | 
						|
  return err;  
 | 
						|
}
 | 
						|
 | 
						|
// rimuove la distinta (non si effettua la rimozione del record su file ma si 
 | 
						|
// elimina dal file il collegamento tra gli effetti e la distinta)
 | 
						|
int TDistinta::remove(char tipodist, long ndist, int nriga)
 | 
						|
{
 | 
						|
  int err = NOERR;
 | 
						|
 | 
						|
  TISAM_recordset eff(query(tipodist, ndist, nriga));
 | 
						|
  TLocalisamfile& file = eff.cursor()->file();
 | 
						|
  for (bool ok = eff.move_first(); ok && err == NOERR; ok = eff.move_next())
 | 
						|
  { 
 | 
						|
    const int i = file.get_int(EFF_NRIGADIST);
 | 
						|
    TEffetto effetto;
 | 
						|
    err = effetto.read(file, tipodist,ndist,i);
 | 
						|
    if (err == NOERR)
 | 
						|
    {
 | 
						|
      effetto.zero(EFF_TIPODIST);
 | 
						|
      effetto.zero(EFF_NDIST);
 | 
						|
      effetto.zero(EFF_DATADIST);
 | 
						|
      effetto.zero(EFF_NRIGADIST);
 | 
						|
      effetto.zero(EFF_CODABIP);
 | 
						|
      effetto.zero(EFF_CODCABP);
 | 
						|
      effetto.zero(EFF_PROGBNP);  
 | 
						|
      err = effetto.rewrite(file);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  reset();//elimino gli effetti dalla memoria resettando l'array
 | 
						|
  return err;  
 | 
						|
}                        
 | 
						|
 | 
						|
bool TDistinta::contabilizzata() const
 | 
						|
{   
 | 
						|
  return  _righe_dist.items() && eff(0).get_bool(EFF_EFFCONT);
 | 
						|
}
 |