以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 录入数据的时候,能实现同一行引用别的表数据列吗? (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=133015) |
||
-- 作者:xxfoxtable -- 发布时间:2019/4/3 22:53:00 -- 录入数据的时候,能实现同一行引用别的表数据列吗? 录入数据的时候,能实现同一行引用别的表数据列吗? |
||
-- 作者:peipei -- 发布时间:2019/4/3 23:03:00 -- 可以啊 你的意思是一行记录里的多个字段引用别的表的字段值?帮助文件是宝藏: 跨表引用 假定产品表和订单表已经通过品名建立了关联,关联的名称为“产品_订单”。 产品表和订单表都有单价列,其中订单表中的单价数据来自于产品表。 通常我们会在订单表新建一个名为“单价”的表达式列,将其表达式设为: Parent(产品_订单).单价。 这样在订单表输入品名后,单价列就会自动引用产品表中对应产品的单价。 但是采用表达式列会有以下棘手的问题: 1、如果产品表没有某产品的资料,需要在订单表中手工输入单价的时候,你会发现你是没有办法在订单表的单价列输入数据的。 上述问题不是表达式列所能解决的,更甚的是,我们可能因为某些特殊原因,并没有在产品表和订单表之间建立关联,此时采用表达式列来引用产品单价根本就无从谈起。
为便于讲述,我给上面的代码加上了行号,代码的原理为: 注意第7行代码,其Find方法的条件表达式是动态合成的: dr = DataTables("产品").Find("[品名] = \'" & e.NewValue & "\'") 条件表达式分为三部分,用运算符&连接起来;如果输入的品名为"PD01",那么三部分组合起来的结果是: [品名] = \'PD01\' 也就说第7行代码等效于: dr = DataTables("产品").Find("[品名] = \'PD01\'") 这是我们第二次介绍动态合成表达式,这是基本功,后面还会有专门的一节进行介绍,不掌握是不行的。 上述代码实现了: 1、在订单表中的某行,首次输入品名,或者输入一个不同的品名,那么会自动从产品表找出对应产品的单价,填入单价列中; 如果产品表和订单表是通过品名、型号、规格这三列联系起来的(不管是否建立了关联),在订单表输入品名、型号、规格后,再从产品表找出对应产品的单价,填入单价列中,那么订单表的DataColChanged事件可如下设置代码: Select
Case e.DataCol.Name 如果订单表有多列数据来自于产品表,一样可以采用类似的设计。 If e.DataCol.Name =
"产品编号"
Then 如果有十几列甚至更多列的数据需要继承,上面代码可能会显得过于繁琐,为此我们可以考虑将代码改写为: If e.DataCol.Name
= "产品编号" Then 这样不管有多少列,我们都只需修改下面这样代码,增加和删除列名即可: Dim nms() As String = {"品名","型号","规格","单价"} 这种编码方式在处理大量重复任务的时候很实用,应该仔细体会掌握。 |
||
-- 作者:xxfoxtable -- 发布时间:2019/4/4 9:50:00 -- 非常感谢二楼的详细解答,但总感觉数据库冗余,所以问问有没有更好的办法 |
||
-- 作者:有点甜 -- 发布时间:2019/4/4 11:16:00 -- 那你就用关联,引用父表数据,如
http://www.foxtable.com/webhelp/scr/0106.htm
|
||
-- 作者:xxfoxtable -- 发布时间:2019/4/10 7:28:00 -- 关联用不好啊,总是报错 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。 |
||
-- 作者:有点甜 -- 发布时间:2019/4/10 9:28:00 -- 以下是引用xxfoxtable在2019/4/10 7:28:00的发言:
关联用不好啊,总是报错 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
提示这个,那就删除关联,重新设置一次即可。
只要关联和读取数据过来两种方法。 |