Patch level : nopatch

Files correlati     :
Commento        :

Agguinti metodi per la creazione di tracciati record temporanei
This commit is contained in:
Alessandro Bonazzi 2021-12-13 12:44:56 +01:00
parent 438a204712
commit 207991605e
2 changed files with 136 additions and 4 deletions

View File

@ -646,6 +646,8 @@ bool TDir::is_active () const
return main_app().has_module(module, CHK_DONGLE);
}
// riimplementare nella 13
void TTrec::update_fielddef (int nfld, TToken_string& s)
{
RecFieldDes& rfd = _rec.Fd[nfld];
@ -655,6 +657,59 @@ void TTrec::update_fielddef (int nfld, TToken_string& s)
rfd.Dec = s.get_int ();
}
void TTrec::update_fielddef(int nfld, const char * name, int type, int len, int dec)
{
if (nfld < 0)
nfld = _rec.NFields++;
RecFieldDes& rfd = _rec.Fd[nfld];
strcpy(rfd.Name, name);
rfd.TypeF = type;
if (len <= 0)
{
switch (rfd.TypeF)
{
case _datefld:
rfd.Len = 8;
rfd.Dec = 0;
break;
case _charfld:
case _boolfld:
rfd.Len = 1;
rfd.Dec = 0;
break;
case _memofld:
rfd.Len = 10;
rfd.Dec = 0;
break;
default:
message_box("Lunghezza errata");
break;
}
}
else
{
rfd.Len = len;
rfd.Dec = dec;
}
}
void TTrec::update_fielddef(int nfld, const RecDes & rd, const char * name)
{
int i = -1;
for (i = 0; i < rd.NFields; i++)
if (strcmp(rd.Fd[i].Name, name) == 0)
break;
if (i >= 0)
update_fielddef(nfld, rd.Fd[i].Name, rd.Fd[i].TypeF, rd.Fd[i].Len, rd.Fd[i].Dec);
}
// riimplementare nella 13
void TTrec::update_keydef (int key, TToken_string& s)
{
TExpression expr ("", _strexpr);
@ -704,6 +759,56 @@ void TTrec::update_keydef (int key, TToken_string& s)
}
}
void TTrec::update_keydef(int key, const char * e, const bool dup)
{
TExpression expr ("", _strexpr);
TString ke (e);
if (key < 0)
key = _rec.NKeys++;
if (expr.set(ke, _strexpr))
{
_rec.Ky[key].DupKeys = dup;
TCodearray & c = expr.code ();
c.begin ();
int n = 0;
while (!c.end ())
{
TCode & inst = c.step ();
TCodesym sym = inst.getsym ();
if (sym == _variable)
{
const char *s = inst.string ();
int i;
for (i = 0; i < _rec.NFields; i++)
if (strcmp (_rec.Fd[i].Name, s) == 0)
break;
_rec.Ky[key].FieldSeq[n] = i;
_rec.Ky[key].FromCh[n] = INVFLD;
_rec.Ky[key].ToCh[n] = INVFLD;
inst = c.step ();
sym = inst.getsym ();
if (sym == _upper)
_rec.Ky[key].FieldSeq[n] += MaxFields;
else if (sym == _number)
{
_rec.Ky[key].FromCh[n] = (int)inst.number().integer() - 1;
inst = c.step ();
_rec.Ky[key].ToCh[n] = _rec.Ky[key].FromCh[n] + (int)inst.number ().integer () - 1;
inst = c.step ();
}
else
c.backtrace ();
n++;
}
}
_rec.Ky[key].NkFields = n;
}
}
void TTrec::print_on(ostream & out) const
{
const int n = num();
@ -779,5 +884,14 @@ void TTrec::read_from(istream & in)
_des = NULL;
_tab = "";
}
void TTrec::set_name(const char * name, int nfld)
{
if (nfld < 0)
nfld = _rec.NFields - 1;
RecFieldDes& rfd = _rec.Fd[nfld];
strcpy(rfd.Name, name);
}
#endif // FOXPRO

View File

@ -230,15 +230,33 @@ public:
int len() const;
#ifndef FOXPRO
// @cmember Aggiorna la chiave. <p desc> e' una token string
void update_keydef(int key, TToken_string& desc);
// @cmember Aggiorna il campo. <p desc> e' una token string
void update_fielddef(int nfld, TToken_string& desc);
// @cmember Aggiorna la chiave. <p desc> e' una token string
void update_keydef(int key, const char * e, const bool dup);
// @cmember Aggiorna la chiave. <p desc> e' una token string
void update_keydef(int key, TToken_string& desc);
// @cmember Aggiunge una chiave. <p desc> e' una token string
void add_keydef(TToken_string& desc) { update_keydef(-1, desc); }
// @cmember Aggiunge una chiave. <p desc> e' una token string
void add_keydef(const char * e, const bool dup) { update_keydef(-1, e, dup); }
// @cmember Aggiorna il campo.
void update_fielddef(int nfld, const char * name, int type, int len = 0, int dec = 0);
// @cmember Aggiorna il campo. <p desc> e' una token string
void update_fielddef(int nfld, TToken_string& desc);
// @cmember Aggiorna il campo.
void update_fielddef(int nfld, const RecDes & rd, const char * name);
// @cmember Aggiunge un campo. <p desc> e' una token string
void add_fielddef(TToken_string& desc) { update_fielddef(-1, desc); }
// @cmember Aggiunge un campo.
void add_fielddef(const char * name, int type, int len = 0, int dec = 0) { update_fielddef(-1, name, type, len, dec); }
// @cmember Aggiunge un campo.
void add_fielddef(const RecDes & rd, const char * name) { update_fielddef(-1, rd, name); }
// @cmember Stampa il tracciato record sull'output selezionato
virtual void print_on(ostream& out) const;
// @cmember Legge il tracciato record da input selezionato
virtual void read_from(istream& in);
void set_des(TConfig* c = NULL, const char* tab = "") { _des = c; _tab = tab;}
void set_name(const char * name, int pos = -1);
#endif
// @cmember Duplica il descrittore di file
virtual TObject* dup() const { return new TTrec(*this);}