Patch level : 4.0 914

Files correlati     : ba7.exe
Ricompilazione Demo : [ ]
Commento           :

Aggiunto il file relations.ini da piazzare in recdesc che contiene le relazioni tr i file.
Uyilizzato nel postino.


git-svn-id: svn://10.65.10.50/trunk@16362 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2008-03-21 16:39:47 +00:00
parent abfd8beb37
commit a916acb2f1
5 changed files with 109 additions and 3 deletions

View File

@ -51,13 +51,37 @@ void TRecipient::add_expr(char op, const TString& expr)
bool TRecipient::can_receive(const TRectype& rec) const
{
TExpression e(_expr, _strexpr, TRUE);
TString val;
for (int v = 0; v < e.numvar(); v++)
{
const char* name = e.varname(v);
const TFixed_string name(e.varname(v));
val.cut(0);
if (rec.exist(name))
e.setvar(name, rec.get(name));
val = rec.get(name);
else
e.setvar(name, "");
{
const TFieldref f(name, 0);
const int logicnum = table2logic(f.id());
if (logicnum > 0 && logicnum != rec.num())
{
TToken_string & rel = prefix().get_relation(rec.num(), logicnum);
if (rel.full())
{
TToken_string key;
FOR_EACH_TOKEN(rel, tok)
key.add(rec.get(tok));
const TRectype & joined_rec = cache().get(logicnum, key);
val = f.read(joined_rec);
}
}
else
val = f.read(rec);
}
e.setvar(name, val);
}
bool yes = e.as_bool();
return yes;

View File

@ -74,6 +74,8 @@ class TRecord_info : public TObject
RecDes _recdes;
TDirtype _dirtype;
int _len;
TString_array _relations;
int _logicnum;
protected:
void translate_key(TToken_string& t) const;
@ -91,6 +93,7 @@ public:
TDirtype dir_type() const { return _dirtype; }
bool mutable_dir() const { return _dirtype <= _studir; }
bool fixed_dir() const { return _dirtype > _studir; }
TToken_string & relation(int logicnum);
TRecord_info(int logicnum);
TRecord_info(const char* name);
@ -170,8 +173,69 @@ void TRecord_info::compute_len()
_len++;
}
TToken_string & TRecord_info::relation(int logicnum)
{
if (_relations.empty())
{
const TFilename rels("recdesc/relations.ini");
if (rels.exist())
{
TString key; key.format("%d", _logicnum);
TConfig c(rels, key);
TString_array vars;
c.list_variables(vars, true);
FOR_EACH_ARRAY_ROW(vars, r, row)
{
const int num = row->get_int();
_relations.add(row->get(), num);
}
}
}
TToken_string * rel = _relations.rowptr(logicnum);
if (rel == NULL)
{
const RecDes & fd = prefix().get_recdes(_logicnum);
const RecDes & rd = prefix().get_recdes(logicnum);
const KeyDes& kd = rd.Ky[0]; // Tracciato della chiave primaria
rel = new TToken_string(EMPTY_STRING);
for (int i = 0; i < kd.NkFields; i++) // Riempio tutta la chiave primaria
{
const int nPos = kd.FieldSeq[i] % MaxFields; // Posizione del campo i della chiave
const RecFieldDes& dfield = rd.Fd[nPos]; // Nome del campo i della chiave
int nBest = -1;
double dBest = 0.0;
for (int j = 0; i < fd.NFields; j++)
{
const RecFieldDes& field = fd.Fd[j];
if (field.TypeF == dfield.TypeF && field.Len == dfield.Len)
{
const double fuzzy = xvt_str_fuzzy_compare(field.Name, dfield.Name);
if (fuzzy > dBest)
{
nBest = j;
dBest = fuzzy;
if (dBest == 1.0)
break;
}
}
}
rel->add(nBest >= 0 ? fd.Fd[nBest].Name : "");
}
_relations.add(rel, logicnum);
}
return *((TToken_string *) rel);
}
TRecord_info::TRecord_info(int logicnum)
{
_logicnum = logicnum;
memset(&_recdes, 0, sizeof(_recdes));
FileDes fd; memset(&fd, 0, sizeof(fd));
@ -187,6 +251,7 @@ TRecord_info::TRecord_info(int logicnum)
bool TRecord_info::create(TTrec& rec, TToken_string& keys)
{
_logicnum = rec.num();
rec.rehash();
const int num_keys = rec.keys();
@ -697,6 +762,12 @@ const RecDes& TFile_manager::get_recdes(int logicnum) const
const TRecord_info& i = recinfo(logicnum);
return i;
}
TToken_string& TFile_manager::get_relation(int fromlogic, int tologic) const
{
TRecord_info& i = recinfo(fromlogic);
return i.relation(tologic);
}
const RecDes& TFile_manager::update_recdes(int logicnum)
{

View File

@ -40,6 +40,7 @@ public:
const TFilename& get_filename(TIsam_handle num) const;
const FileDes& get_filedes(TIsam_handle num) const;
TToken_string & get_relation(int fromlogic, int tologic) const;
const RecDes& get_recdes(int logicnum) const;
TIsam_handle get_handle(TFilename& name);
const RecDes& update_recdes(int logicnum);
@ -190,6 +191,9 @@ public:
const RecDes& get_recdes(int logicnum) const
{ return _manager.get_recdes(logicnum); }
TToken_string & get_relation(int fromlogic, int tologic) const
{ return _manager.get_relation(fromlogic, tologic); }
bool add_recdes(int logicnum, TTrec& rec, TToken_string& keys)
{ return _manager.add_recdes(logicnum, rec, keys); }

View File

@ -1368,7 +1368,12 @@ void TRelation_application::main_loop()
query_mode();
}
else
{
const TMask_field & f = _mask->focus_field();
_mask->first_focus(-f.dlg());
modify_mode();
}
}
}
break;

2
include/relations.ini Executable file
View File

@ -0,0 +1,2 @@
[23]
26=CODCAUS