lookup字段存在的问题可能是一个delphi的bug(200分)

  • 主题发起人 主题发起人 kkufo
  • 开始时间 开始时间
K

kkufo

Unregistered / Unconfirmed
GUEST, unregistred user!
建立一个简单的应用,用到其中的三个表,分别如下:
block(知识快):block_id(知识快代码),block_name
point(知识点):block_id,point_id(知识点代码),point_name
control(出题控制参数):block_id,point_id,difficult_factor(难度系数),amount(出题数量)

现使用一个dbgrid显示和编辑control,增加Tcontrol的两个lookup字段如下:
lk_block(用于显示和编辑知识快名称而不是代码):其属性设置完全正确
lk_point( 用于显示和编辑知识点名称而不是代码):其关键属性设置如下
fieldkind:lookup keyfield:block_id;point_id
lookupfields:block_id;point_id lookupresultfield:point_name

在设计阶段可以正常浏览,但当运行后你双击dbgrid中知识点名称想编辑时,会出现异常:
Tgen_control:fields “block_id,point_id” not found

在设计阶段也无法将lookup字段lk_point的lookupcache属性设为true,并会出现这样的错误
invalid variant operation

这个问题已经困了我好久


 
大写字段名
 
你不应该用两个字段 block_id;point_id 来标识 Point 记录,为你的 Point 表建立主键
或者唯一索引,KeyField 和 LookupField 设置为这个主键或唯一字段就不会有问题了。
至于与 Block 的关联,用一个 Master/Detail 关系就可以表达。

btw: To jqw ,能不能说一下为什么要大写字段名?
 
bakubaku: 谢谢你的回答,我觉得数据库得设计并没有问题,每一知识点的唯一标识需要
所在的知识快(如:dos或者windows)和知识点,如dos可分为基本知识(0)、文件操作(2)等
知识块代码和知识点代码作为一个主键唯一代表某个确定的知识点
to jqw:我试过,大写字段名不行,不知道我是否理解您的意思,还有,这样做的道理何在?
 
根据第三范式的定义,一条记录只应该唯一依赖一个主键,你的逻辑思路是对的,一个知识点
的确需要两个信息来表示,但是为了数据库的设计要求,还是应该指定一个 Primary Key,
尽管它可能没有实际的意义,知识块代码和知识点代码作为外键指向主键表。
事实上你这样做的弊病已经体现出来了,fields “block_id,point_id” not found,表明
系统把 “block_id,point_id” 当成了一个主键字段去寻找 Key ,所以会出错。
 
是‘block_id;point_id’,delphi 的帮助使我知道有这种使用方法。
你的做法没什么问题,但那样做将使增加知识点时有点儿别扭,不过也可以通过给出
知识点的编码方法来解决,如point_id=block_id+id

问题是,我正在使用的某家公司的产品(网上考试系统),就是采用这样的库设计
不同的是,他们采用pb作为开发工具,后台数据库都是sql server
我采用ado访问数据库方式,bde也试过,都没用
 
to bakubaku:经过测试表明,采用你说的那种库设计也不行
为block_id设计的lookup字段可以用,但为point_id设计的lookup字段虽然弹出下拉列表
但选择后无效,不会显示在dbgrid中(注:Master/Detail 关系已经建立)
 
Point_ID 有唯一约束吗?
你把你的做法再仔细描述一下看看!
 
to bakubaku:
为Point_ID建立主键,肯定有唯一约束.
如果你能试一下就好了,不管你采用bde, ado, table(include ADO), query(the same),
还是 adorecordset
也不管你采用怎样的数据库 sql oracle paradox access, and so on

刚才我去了一趟DSP(波兰大学),说有可以实现这些功能的组件,免费就一切都好!
 
我的意思是,只用主键去 LookUp ,如果这样还不行就奇怪了。
lk_point( 用于显示和编辑知识点名称而不是代码):其关键属性设置如下
fieldkind:lookup keyfield:point_id
lookupfields:point_id lookupresultfield:point_name
 
不行的,可能是因为M/D关系存在的缘故
 
to bakubaku:
按照你的想法又折腾了一阵子,终于通过。难道delphi不能进行实现多字段LOOKUP,pb可是
行得通的。
谁有这种功能的组件,可以设置lookupkeyfields和keyfields为多个字段
 
接受答案了.
 
后退
顶部