From a57c5678f11ac04d1b672b36ae45dde5d191ad15 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 6 Jun 1997 10:32:05 +0000 Subject: [PATCH] MOdifiche alla set_body_key git-svn-id: svn://10.65.10.50/trunk@4540 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/multirec.cpp | 36 +++++++++++++++++++++++++++++++----- include/multirec.h | 4 ++-- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/include/multirec.cpp b/include/multirec.cpp index b59bbb202..0e5bb00f0 100755 --- a/include/multirec.cpp +++ b/include/multirec.cpp @@ -1,5 +1,20 @@ #include +void TMultiple_rectype::set_body_key(TRectype & rowrec) +{ + const RecDes* recd = rowrec.rec_des(); // Descrizione del record della testata + const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1 + + // Copia tutti i campi chiave, tranne l'ultimo, in tutti i records + for (int i = kd.NkFields-2; i >= 0; i--) + { + const int nf = kd.FieldSeq[i] % MaxFields; + const RecFieldDes& rf = recd->Fd[nf]; + const TString& val = get(rf.Name); + rowrec.renum_key(rf.Name, val); + } +} + void TMultiple_rectype::load_rows_file(int logicnum) { const int index = log2ind(logicnum); @@ -72,7 +87,9 @@ int TMultiple_rectype::write_rewrite(TBaseisamfile & f, bool re) const do { err = TRectype::write(f); - } while (err == _isreinsert && ((TMultiple_rectype *)this)->renum()); + if (err == _isreinsert && ((TMultiple_rectype *)this)->renum()) + ((TMultiple_rectype *)this)->renum_key(); + } while (err == _isreinsert); ((TMultiple_rectype *)this)->_nuovo = (err != NOERR); } else @@ -119,11 +136,20 @@ TRecord_array & TMultiple_rectype::body(int logicnum) const return (TRecord_array &) _files[index]; } -void TMultiple_rectype::renum_key(const char * kfield,const char * val) +void TMultiple_rectype::renum_key() { - TRectype::renum_key(kfield, val); // Aggiorna testata - for (int i = _nfiles - 1; i >= 0 ; i--) - body(_logicnums[i]).renum_key(kfield, val); // Aggiorna righe + for (int i = _nfiles - 1; i >= 0 ; i--) + { + const int logicnum = _logicnums[i]; + TRecord_array * b = (TRecord_array *) _files.objptr(i); + if (b) + { + TRectype * rec = new TRectype(b->key()); + + set_body_key(*rec); + b->set_key(rec); // Aggiorna righe + } + } } diff --git a/include/multirec.h b/include/multirec.h index 8a484d584..8c87fba3e 100755 --- a/include/multirec.h +++ b/include/multirec.h @@ -36,7 +36,7 @@ class TMultiple_rectype : public TAuto_variable_rectype protected: const TArray & files() const { return _files;} // @ cmember funzione per costruire la chiave delle righe - virtual void set_body_key(TRectype & rowrec) pure; + virtual void set_body_key(TRectype & rowrec); // @ cmember renumber la chiave del corpo virtual bool renum() { return FALSE; } virtual TRectype & get_body_record(int logicnum = 0) { return *(new TRectype(logicnum ? logicnum : _logicnums[0])); } @@ -75,7 +75,7 @@ public: virtual void set_fields(TAuto_variable_rectype & rec) {} virtual void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); } - virtual void renum_key(const char * kfield,const char * val); + virtual void renum_key(); virtual TRectype & operator =(const TRectype & r); virtual TRectype & operator =(const char * r); virtual void zero(char c = '\0');