diff --git a/ef/ef0301.cpp b/ef/ef0301.cpp index 4551cf3c5..6a55f6260 100755 --- a/ef/ef0301.cpp +++ b/ef/ef0301.cpp @@ -5,27 +5,40 @@ /////////////////////////////////////////////////// // costruttore distinta utilizzando il record passato -TDistinta::TDistinta(const TRectype& rec) +TDistinta::TDistinta(const TRectype& rec, word lockop) { - read(rec); + read(rec,lockop); } // costruisce la distinta del tipo e numero passati -TDistinta::TDistinta(const char tipo, const long numero) +TDistinta::TDistinta(const char tipo, const long numero, word lockop) { - read(tipo,numero); + read(tipo,numero,lockop); +} + +TDistinta::~TDistinta() +{ + TLocalisamfile f(LF_EFFETTI); + if (_righe_dist.items() > 0) // Se ha letto elementi sblocca eventualmente la prima riga + f.read((TRectype&)_righe_dist[0], _isequal,_unlock); } // permette di leggere la distinta del tipo e numero passati -int TDistinta::read(const char tipo, const long numero) +int TDistinta::read(const char tipo, const long numero, word lockop) { int err = NOERR; CHECK(tipo!='\0' && numero > 0,"Can't read distinta from NULL elements"); TLocalisamfile f(LF_EFFETTI); + if (_righe_dist.items() > 0) // Se ha letto una distinta precedente, sblocca la prima riga + { + f.read((TRectype&)_righe_dist[0],_isequal,_unlock); + _righe_dist.destroy(); // Rimuove tutte le righe precedenti + } for (int i=0; err == NOERR ; i++) { TEffetto* effetto = new TEffetto; - err = effetto->read(f, tipo, numero, i+1);//legge un effetto per chiave 4 + word lock = (i == 0 && lockop == _lock) ? _lock : _nolock; // Lock solo sulla prima riga + err = effetto->read(f, tipo, numero, i+1, lock);//legge un effetto per chiave 4 if (err == NOERR) _righe_dist.add(effetto); } @@ -37,12 +50,12 @@ int TDistinta::read(const char tipo, const long numero) } // permette di leggere la distinta dal record passato -int TDistinta::read(const TRectype& rec) +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);//legge la distinta + return read(tipo,numero,lockop);//legge la distinta } // scrive la distinta @@ -56,13 +69,16 @@ int TDistinta::write(bool force, TToken_string* dati_dist) { TEffetto& effetto = (TEffetto&)_righe_dist[i]; // token string che contiene i dati da registrare sull'effetto - dati_dist->restart(); - effetto.put(EFF_TIPODIST, dati_dist->get()); - effetto.put(EFF_NDIST, dati_dist->get_long()); - effetto.put(EFF_DATADIST, dati_dist->get()); - effetto.put(EFF_CODABIP, dati_dist->get_long()); - effetto.put(EFF_CODCABP, dati_dist->get_long()); - effetto.put(EFF_NRIGADIST, i+1); + if (dati_dist) + { + dati_dist->restart(); + effetto.put(EFF_TIPODIST, dati_dist->get()); + effetto.put(EFF_NDIST, dati_dist->get_long()); + effetto.put(EFF_DATADIST, dati_dist->get()); + effetto.put(EFF_CODABIP, dati_dist->get_long()); + effetto.put(EFF_CODCABP, dati_dist->get_long()); + effetto.put(EFF_NRIGADIST, i+1); + } //riscrivo l'effetto con i dati della distinta a cui appartiene err = effetto.rewrite(f); } diff --git a/ef/ef0301.h b/ef/ef0301.h index 2fcae4409..a301bb60a 100755 --- a/ef/ef0301.h +++ b/ef/ef0301.h @@ -21,13 +21,13 @@ public: //elimina tutti gli effetti nella distinta (appartenti all'array) int reset(){ return _righe_dist.destroy() == NOERR; } //legge la distinta del tipo e numero passati - int read(const char tipo, const long numero); + int read(const char tipo, const long numero, word lock_op = _nolock); //legge il record passato - int read(const TRectype& rec); + int read(const TRectype& rec, word lock_op = _nolock); //scrive la distinta utilizzando la rewrite degli effetti int write(bool force = FALSE, TToken_string* dati_dist = NULL); //riscrive la distinta - int rewrite(TToken_string* dati_dist){ return write(TRUE, dati_dist); } + int rewrite(TToken_string* dati_dist = NULL){ return write(TRUE, dati_dist); } //rimuove la distinta del tipo e numero passati int remove(char tipodist, long ndist); //restituisce il tipo di distinta @@ -37,11 +37,11 @@ public: //restituisce il codice valuta della distinta const TString& codval() const { return ((TRectype&)_righe_dist[0]).get(EFF_CODVAL); } //restituisce la data distinta della distinta - const TDate& data_dist() const { return ((TRectype&)_righe_dist[0]).get_date(EFF_DATADIST); } + TDate data_dist() const { return ((TRectype&)_righe_dist[0]).get_date(EFF_DATADIST); } //restituisce la data cambio della distinta - const TDate& data_cam() const { return ((TRectype&)_righe_dist[0]).get_date(EFF_DATACAMBIO); } + TDate data_cam() const { return ((TRectype&)_righe_dist[0]).get_date(EFF_DATACAMBIO); } //restituisce il cambio delle distinta - const real& cambio() const { return ((TRectype&)_righe_dist[0]).get_real(EFF_CAMBIO); } + real cambio() const { return ((TRectype&)_righe_dist[0]).get_real(EFF_CAMBIO); } //restituisce il codice abi di presentazione effetti const TString& abip()const { return ((TRectype&)_righe_dist[0]).get(EFF_CODABIP); } //restituisce il codice cab di presentazione effetti @@ -51,11 +51,11 @@ public: //costruttore di default TDistinta() {}; //costruttore distinta del tipo e numero passato - TDistinta(const char tipo, const long numero); + TDistinta(const char tipo, const long numero, word lockop = _nolock); //costruttore distinta utilizzando il record passato - TDistinta(const TRectype& rec); + TDistinta(const TRectype& rec, word lockop = _nolock); //distruttore di default - virtual ~TDistinta() {} + virtual ~TDistinta(); }; #endif//__EF0301_H \ No newline at end of file