以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  父表数据如何被子表引用  (http://foxtable.net/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
--  【再求助】父表触发子表问题?
父表(结算明细)有字符型列[明细品名型号和规格],子表(收发货)有字符型列[收发品名型号和规格],两者关联(ID号),子表取值父表的值,并随父表的值变化。子表刚开始用的表达式列,但是表达式列不触发DataColChanged事件,一旦父表改变,子表的流水账设计结果没有变,我需要怎么改呢?
参考事件是子表触发父表,我现在是父表触发子表事件,和参考事件不一样,我是不是主表依旧用表达式列,并应该在主表的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

还有主表明细的列[明细品名型号和规格]虽然不是表达式列,但是被关联到产品的[产品品名型号和规格],产品列数据如果改变,主表明细列数据也会改变,会不会触发收发货的表达式列数据的改变?
 

谢谢答复
[此贴子已经被作者于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