如何从Lookup Table中取值(应用TDBLookupComboBox)(200分)

  • 主题发起人 主题发起人 坏蟑螂
  • 开始时间 开始时间

坏蟑螂

Unregistered / Unconfirmed
GUEST, unregistred user!

我们经常将某些字段所有可能的取值全放入另一个表中,
制作成Lookup字段,而主表中字段的值实际上是该值的ID,

比如:
表Person.db有如下字段
ID + Primary Key
Name A8 姓名
TeachLevel I 文化程度(从表DataDict.db中取值)
HealthState I 健康状况(从表DataDict.db中取值)
Nationality I 民族 (从表DataDict.db中取值)
PoliDegree I 政治面貌(从表DataDict.db中取值)

表DataDict.db有如下字段
ID + Primary Key
ControlField A16 所约束的字段
FieldValue A32 该字段可取的一个值

在我们的程序中只要建一个TTable,指向DataDict.db,
再将TDBLookupComboBox的相应属性设置好,
就可以在DBLookupComboBox中选择需要的值了。

但是,该DBLookupComboBox将列出所有DataDict.db中的记录,
比如TeachLevel所对应的DBLookupComboBox除了列出了文化程度所有可能的取值之外,
也列出了健康状况、民族、政治面目等可以取的值。(不爽)

只好针对每个这种类型的字段,建一个Table或Query,
设置不同的Filter(对应于Table)或SQL语句的条件(对于Query),
因此,我的DataModule中存在密密麻麻的Query。(更不爽)

本来通过自己写代码,比如:在每个DBLookupComboBox的OnEnter和OnExit事件中
设置相应的Filter或解除相应的Filter,可以解决,但我认为这些代码是冗余的,
应该有更好的办法,比如一个新控件。

我想大家都曾遇到此问题吧?都是怎么解决的呢?

请不吝赐教,各抒己见。
 
难道没有人想过此类问题吗?

 
我现在用的就是密密麻麻的Query,大家有其它的办法吗?

关注....
 
表A, 表B
ID <------ID
Name ControlField
.
.
.
with DBLockupComboBox do
begin
DataField:=ID
DataSource:=TableBSource;
ListSource:=TableASource;
ListField:='Name';//列出姓名
KeyField:='ID';
end;
这样仅列出一个字段(Name)



 
看看这种方法可以吗?
DataDict.db建立时建成这样:
ID + Primary Key
TeachLevel A 文化程度
HealthState A 健康状况
...
填写此数据库时写成这样:
ID TeachLevel HealthState
1 本 优
2 硕 良
3 博 可
4 差
这样在设置TDBLookupComboBox后就不会出现你所说的问题了
 
to yaoyao :
可是以后Person表有可能增加字段哪,
比如再增加一个“老婆漂亮程度-WifeNice”,
你岂不是又要给DataDict.db也增加此字段?
而且这样有点儿浪费存储空间,
就如你的举例中,Health有4个取值,
而TeachLevel只有3个,TeachLevel从第4个开始就是无意义的,纯属浪费空间,
如果这种差距很大,比如一些取值有1万个,另一些只有1、2个,那。。。。。。?

to Hexi:
不知是你未明白我的意思,还是我未明白你的意思,
Person.ID 与 DataDict.ID 无任何联系,
它们分别是各自表中的“主关键字”。
我们就用yaoyao的例子吧,
比如Person中有如下记录:
ID Name TeachLevel HealthState .......
1 坏蟑螂 1 1 ......
就表示:
坏蟑螂的编号是1,文化程度引用了表DataDict的编号,所以是“本”,
同理,健康状况是“优”。
我的DBComboBox的DataSource肯定关联的是Person,ListSource才关联DataDict。

谢谢各位,请继续。

 
200分都无人理?
 
可不能白要。
为了大富翁的健康发展,请大家别乱送分了吧。
谁能解决此问题,200大元就是他(她)的了!!!
 
等你等到我心痛
 
小生认为可加个TYPE字段,

填写此数据库时写成这样:

ID TYPE FieldValue
1 1 本 // TYPE 1: TeachLevel
2 1 硕
3 1 博

4 2 优 // TYPE 2: HealthState
5 2 良
6 2 可
7 2 差

然后,来一个Filer,就可以用LookupComboBox

OK?
 
还是老老实实用TQuery吧.
 
>>本来通过自己写代码,比如:在每个DBLookupComboBox的OnEnter和OnExit事件
>>中设置相应的Filter或解除相应的Filter,可以解决,但我认为这些代码是冗余
>>的,应该有更好的办法,比如一个新控件。

只用一个Query,将所有DBLookupComboBox的OnEnter事件均指向如下过程:
procedure SetFilter(Sender: TObject);
begin
Query1.Filtered:=False;
Query1.Filter:='ControlField='''+TDBLookupComboBox(Sender).DataField+'''';
Query1.Filtered:=True;
end;
 
实际上我就是这么做了
我真正觉得不爽的是:FORM上每一次变换焦点,都会引起SETFILTER代码的执行,
做了许多无用工。
我向要个组件,又懒得自己写。
大家还有好办法吗?没有我就发分了。

 
多人接受答案了。
 
后退
顶部