#include "effetti.h" #include "reffetti.h" #include "cession.h" #include "ef0101.h" 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::put_key(TRectype& rec, long numeff) const { CHECKD(numeff >= 0, "Numero effetto non valido ", numeff); rec.put("NPROGTR",numeff); } void TEffetto::put_key(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(); put_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(TLocalisamfile &f, const TRectype& r) { int err = TRectype::read(f); const long nu = numero(); TRectype *k_reff = new TRectype(LF_REFFETTI), *k_cess = new TRectype(LF_CESS); put_key(*k_reff, nu); put_key(*k_cess, nu); if (err == NOERR) { _righe.read(k_reff); _cess.read(k_cess); } else { 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; } int TEffetto::read(const TRectype& rec) { TLocalisamfile eff(LF_EFFETTI); head() = rec; return read(eff, rec); } int TEffetto::read(char tipodist, long ndist, long nrigadist) { TLocalisamfile eff(LF_EFFETTI); eff.setkey(4); TRectype rec(LF_EFFETTI); put_key(rec, tipodist,ndist, nrigadist); head() = rec; int err = read(eff, rec); return err; } int TEffetto::write(bool force) { const bool nuovo = numero() <= 0; // E' nuovo! if (nuovo && force) // quindi ... force = FALSE; // ... non fare la rewrite TLocalisamfile eff(LF_EFFETTI); eff.setkey(1); 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; }