以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 父表数据如何被子表引用 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=94463) |
|
-- 作者:yeshuping5045 -- 发布时间:2016/12/24 10:17:00 -- 父表数据如何被子表引用 父表(结算明细)有字符型列[明细品名型号和规格],子表(收发货)有字符型列[收发品名型号和规格],两者关联(ID号),子表取值父表的值,并随父表的值变化。子表刚开始用的表达式列,但是表达式列不触发DataColChanged事件,一旦父表改变,子表的流水账设计结果没有变,我需要怎么改呢? Select Case e.DataCol.Name
Case "收发品名型号和规格","收发数量","库存金额变化","无税成本变化额" Dim drs As List(of DataRow) Dim Filter As String Filter = "[_SortKey] >= " & e.DataRow("_SortKey") & " And [收发品名型号和规格] = \'" & e.DataRow("收发品名型号和规格") & "\'" drs = e.DataTable.Select(Filter) For Each dr As DataRow In drs Filter = "[_SortKey] <= " & dr("_SortKey") & " And [收发品名型号和规格] = \'" & dr("收发品名型号和规格") & "\'" Dim Val1 As Double = e.DataTable.Compute("Sum(收发数量)",Filter) Dim Val2 As Double = e.DataTable.Compute("Sum(库存金额变化)",Filter) Dim Val3 As Double = e.DataTable.Compute("Sum(无税成本变化额)",Filter) dr("库存结余数量") = Val1 dr("库存结余金额") = Val2 dr("库存结余成本金额") = Val3 Next If e.DataCol.Name = "收发品名型号和规格" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then Filter = "[_SortKey] > " & e.DataRow("_SortKey") & " And [收发品名型号和规格] = \'" & e.OldValue & "\'" drs = e.DataTable.Select(Filter) For Each dr As DataRow In drs Filter = "[_SortKey] <= " & dr("_SortKey") & " And [收发品名型号和规格] = \'" & dr("收发品名型号和规格") & "\'" Dim Val1 As Double = e.DataTable.Compute("Sum(收发数量)",Filter) Dim Val2 As Double = e.DataTable.Compute("Sum(库存金额变化)",Filter) Dim Val3 As Double = e.DataTable.Compute("Sum(无税成本变化额)",Filter) dr("库存结余数量") = Val1 dr("库存结余金额") = Val2 dr("库存结余成本金额") = Val3 Next End If End Select |
|
-- 作者:狐狸爸爸 -- 发布时间:2016/12/24 10:20:00 -- 如何让表达式列触发事件,如何通过子表触发父表事件,参考: |
|
-- 作者:yeshuping5045 -- 发布时间:2016/12/24 10:36:00 -- 【求助】谢谢您的关注,参考事件是子表触发父表,我现在是父表触发子表事件,和参考事件不一样,我是不是主表依旧用表达式列,并应该在主表的DataColChanged事件加上代码: If e.DataCol.name = "结算明细" Then Dim pr As DataRow = e.DataRow.GetParentchildRow("明细品名型号和规格") \'找出对应的父行 If pr IsNot Nothing Then DataTables("结算明细").DataCols("数量").RaiseDataColChanged(pr) \'通知系统此父行的数量列发生了改变,触发DataColChanged事件 End If End If 还有主表明细的列[明细品名型号和规格]虽然不是表达式列,但是被关联到产品的[产品品名型号和规格],产品列数据如果改变,主表明细列数据也会改变,会不会触发收发货的列数据的改变? 谢谢您的答复
|
|
-- 作者:yeshuping5045 -- 发布时间:2016/12/24 10:55:00 -- 【再求助】父表触发子表问题?
[此贴子已经被作者于2016/12/24 10:57:12编辑过]
|
|
-- 作者:狐狸爸爸 -- 发布时间:2016/12/24 11:07:00 -- 方法可行,父表的DataColChanged事件: If e.DataCol.name = "父表中的列" Then Dim pr As DataRow = e.DataRow.GetParentRow("关联列") \'找出对应的子行 If pr IsNot Nothing Then DataTables("子表").DataCols("子表列").RaiseDataColChanged(pr) \'通知系统此子行的列发生了改变,触发DataColChanged事件 End If End If |
|
-- 作者:yeshuping5045 -- 发布时间:2016/12/24 11:58:00 -- 谢谢专家 |
|
-- 作者:yeshuping5045 -- 发布时间:2016/12/24 20:38:00 -- 可是还没有成功,报错,不明白错在哪里? .NET Framework 版本:2.0.50727.5485 Foxtable 版本:2016.7.29.1 错误所在事件:表,结算明细,DataColChanged 详细错误信息: 调用的目标发生了异常。 未将对象引用设置到对象的实例。 If e.DataCol.name = "明细品名型号和规格" Then \'父表中的列 Dim pr1 As DataRow = e.DataRow.GetParentRow("明细id") \'找出对应的子行的关联列 If pr1 IsNot Nothing Then DataTables("收发货").DataCols("收发品名型号和规格").RaiseDataColChanged(pr1) \'通知系统此父行的列发生了改变,触发DataColChanged事件 End If End If |
|
-- 作者:狐狸爸爸 -- 发布时间:2016/12/25 7:50:00 -- 上面的代码,不会有这样的错误,你用这个方法,找出出错的代码吧: http://www.foxtable.com/webhelp/scr/1485.htm |
|
-- 作者:有点色 -- 发布时间:2016/12/25 10:01:00 -- 红色的地方,你要写成父表名,你明显没写对
Dim pr1 As DataRow = e.DataRow.GetParentRow("明细id") \'找出对应的子行的关联列 |
|
-- 作者:yeshuping5045 -- 发布时间:2016/12/25 13:02:00 --
狐狸爸爸,谢谢指点,我改了一下,插入一行如下,错误类型:DataRow的值无法转换为string,我明明全部都是字符型的呀? If e.DataCol.name = "明细品名型号和规格" Then \'父表中的列(列改动触发子表) Dim pr1 As DataRow = e.DataRow.GetParentRow("明细id") \'父表中找出子行对应的关联列 MessageBox.Show(pr1) If pr1 IsNot Nothing Then DataTables("收发货").DataCols("收发品名型号和规格").RaiseDataColChanged(pr1) \'通知子表,此父行的列发生了改变,触发子表DataColChanged事件 End If End If |