#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; }