#include "ef0301.h" #include #include /////////////////////////////////////////////////// // 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); }