campo-sirio/ef/ef0101.cpp
alex ddb6256d91 Corretto numero riga distinta
git-svn-id: svn://10.65.10.50/trunk@4482 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-02 09:16:17 +00:00

237 lines
6.1 KiB
C++
Executable File
Raw Blame History

#include "ef0101.h"
//////////////////////////////////////////////////
// Definizione dei metodi della classe TEffetto //
//////////////////////////////////////////////////
// costruttore di default
TEffetto::TEffetto()
: TRectype(LF_EFFETTI), _righe(LF_REFFETTI, REFF_NRIGATR), _cess(LF_CESS, CES_NRIGA)
{
}
// costuisce l'effetto con il record passato
TEffetto::TEffetto(TRectype& rec)
: TRectype(LF_EFFETTI), _righe(LF_REFFETTI, REFF_NRIGATR), _cess(LF_CESS, CES_NRIGA)
{
TLocalisamfile f(LF_EFFETTI);
read(f,rec);
}
TEffetto::TEffetto(const TEffetto& eff)
: TRectype(eff), _righe(eff._righe), _cess(eff._cess)
{
}
TObject* TEffetto::dup() const
{
TEffetto* e = new TEffetto((const TEffetto&)*this);
return e;
}
// setta i campi per la prima chiave (nprogtr)
void TEffetto::put_key(TRectype& rec, long numeff) const
{
CHECKD(numeff >= 0, "Numero effetto non valido ", numeff);
rec.put(EFF_NPROGTR, numeff);
}
// setta i campi per la quarta chiave (tipodist+ndist+nrigadist)
void TEffetto::put_key(TRectype& rec,char tipodist, long ndist, int nrigadist)
{
CHECK(tipodist == 'I' || tipodist == 'S' || tipodist == 'B' || tipodist == 0, "Tipo distinta");
CHECKD(ndist >= 0, "Numero distinta non valido ", ndist);
CHECKD(nrigadist >= 0, "Numero riga distinta non valido ", nrigadist);
rec.put(EFF_TIPODIST, tipodist);
rec.put(EFF_NDIST, ndist);
rec.put(EFF_NRIGADIST, nrigadist);
}
// ritorna la prossima chiave utilizzabile
long TEffetto::get_next_key(const long codcf) const
{
static long n = 0;
if (n == 0)
{
TLocalisamfile eff(LF_EFFETTI);
TRectype& curr = eff.curr();
put_key(curr, 9999999L);
const int err = eff.read(_isgreat);
if (err != _isemptyfile)
{
if (err == NOERR)
eff.prev();
if (curr.get_long(EFF_CODCF) == codcf)
n = curr.get_long(EFF_NPROGTR);
}
}
n++;
return n;
}
// rinumera la chiave 1 (nprogtr)
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(EFF_NPROGTR, num); // aggiorna testata
_righe.renum_key(EFF_NPROGTR, num); // aggiorna righe ok
_cess.renum_key(EFF_NPROGTR, num); // aggiorna cessionari ok
return numeff;
}
// restituisce il prossimo effetto
int TEffetto::next(TBaseisamfile& f)
{
const int err = f.next();
*this = f.curr();
return err;
}
// permette di leggere il record passato nel file passato, comune alla
// lettura per chiave 1 e per chiave 4
int TEffetto::leggi(TLocalisamfile &f, const TRectype& r, word lockop)
{
//int err = TRectype::read(f);
int err = f.read(*this, _isequal, lockop);
const long nu = numero();
// necessari per poter andare a leggere i due record array
// cessionari e righe effetto
TRectype *k_reff = new TRectype(LF_REFFETTI),
*k_cess = new TRectype(LF_CESS);
// setto la chiave per poter leggere dai due record array
put_key(*k_reff, nu);
put_key(*k_cess, nu);
if (err == NOERR)
{ // leggo dai record array
_righe.read(k_reff);
_cess.read(k_cess);
}
else // se ho trovato un errore
{
head() = r;
const long nu = numero();
put_key(*k_reff, nu);
put_key(*k_cess, nu);
if (nu !=0)
{
destroy_rows_r();
destroy_rows_c();
_cess.set_key(k_cess);
_righe.set_key(k_reff);
}
}
return err;
}
// legge il record passato, con chiave 1
int TEffetto::read(TLocalisamfile& f, const TRectype& rec, word lockop)
{
head() = rec;
return leggi(f, rec, lockop);
}
// legge l'effetto usando la chiave 4
int TEffetto::read(TLocalisamfile& f, char tipodist, long ndist, int nrigadist)
{
f.setkey(4);
TRectype rec(LF_EFFETTI);
put_key(rec, tipodist, ndist, nrigadist);
head() = rec;
return leggi(f, rec, lockop);
}
// scrive l'effetto, usando la chiave 1
int TEffetto::write(TLocalisamfile& f, bool force)
{
const bool nuovo = numero() <= 0; // E' nuovo!
if (nuovo && force) // quindi ...
force = FALSE; // ... non fare la rewrite
f.setkey(1);
int err = NOERR;
if (force)
{
if ((err=_righe.write(force)) == NOERR) err= _cess.write(force);
if (err == NOERR)
{
err = TRectype::rewrite(f);
if (err != NOERR)
err = TRectype::write(f);
}
}
else
{
if (nuovo)
{
TEffetto& myself = *(TEffetto*)this;
if (numero() <= 0)
myself.renum();
do
{
err = TRectype::write(f);
if (err == _isreinsert)
myself.renum();
} while (err == _isreinsert);
}
else
{
err = TRectype::write(f);
if (err != NOERR)
err = TRectype::rewrite(f);
}
if (err == NOERR)
if ((err=_righe.write(force)) == NOERR) err= _cess.write(force);
}
return err;
}
// rimuove l'effetto
int TEffetto::remove(TLocalisamfile& f)const
{
int err;
if ((err=_righe.remove()) == NOERR) err= _cess.remove();
if (err == NOERR)
err = TRectype::remove(f);
return err;
}
// restituisce true se l'effetto si riferisce ad una sola fattura
// ovvero se l'effetto non <20> raggruppato
bool TEffetto::fatt(long num)
{
TLocalisamfile righe_eff(LF_REFFETTI);
righe_eff.put(REFF_NPROGTR, num);
righe_eff.read();
// prende il numero delle righe dell'effetto
// ovvero di fatture a cui fa riferimento
int items = rows_r();
bool condition = (items == 1);
return condition;
}
// restituisce i dati relativi alle fatture a cui si riferisce l'effetto
// costruendo una TToken_string del tipo
// "num_fatt0|data_fatt0|imp_fatt0|num_fatt1|data_fatt1|imp_fatt1|..."
TToken_string* TEffetto::dati_fatt(long num)
{
TToken_string* dati= new TToken_string;
dati->cut(0);
TLocalisamfile righe_eff(LF_REFFETTI);
righe_eff.put(REFF_NPROGTR, num);
righe_eff.read();
int items = rows_r(); // prende il numero delle righe dell'effetto
for (int i = 1; i <= items; i++)// le legge tutte
{
dati->add(righe_eff.get(REFF_NFATT));//prende il numero
dati->add(righe_eff.get(REFF_DATAFATT));//prende la data
dati->add(righe_eff.get(REFF_IMPFATT));//prende l' importo
righe_eff.next();// passa alla riga successiva
}
return dati;
}