以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [原创]子表的删除行DataRowDeleted事件不能触发父表的DataColChanged事件的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=130148)

--  作者:子剑
--  发布时间:2019/1/14 16:48:00
--  [原创]子表的删除行DataRowDeleted事件不能触发父表的DataColChanged事件的问题
 

子表的删除行有两个事件:DataRowDeleting 和DataRowDeleted,在跟踪调试子表:订单明细表orderline删除行事件的过程中,发现DataRowDeleted事件中的代码不能触发父表:订单表orderlist的DataColChanged事件。但是,我把相同的事件代码放到子表的DataRowDeleting事件实验中,则可以触发父表的DataColChanged事件。请问这是什么原因? 是个系统BUG吗?

固然使用订单明细表的DataRowDeleting事件可以触发订单表的DataColChanged, 但是父表订单表中的总金额是个表达式,来自于订单明细表的金额求和。DataRowDeleting事件订单明细表一行之后,父表的总金额引用之后没有改变,没有扣除删掉的一行子表的金额数值。这就是使用DataRowDeleting事件的困难所在。

希望的效果是:订单明细子表的DataRowDeleted可以触发订单父表的DataColChanged事件,在DateColChanged事件中用MessageBox.Show跟踪调试的总金额数值是最新的(扣除掉删除 一行的子表的金额数值)。


--  作者:子剑
--  发布时间:2019/1/14 16:50:00
--  

子表订单明细表:orderline的删除行事件代码如下: 

父表时:订单表orderlist

 

    Dim pr As DataRow = e.DataRow.GetParentRow("orderlist")

    If pr IsNot Nothing Then

       DataTables("orderlist").DataCols("需求总金额").RaiseDataColChanged(pr)

    End If

 


--  作者:子剑
--  发布时间:2019/1/14 16:56:00
--  

这是父表订单表: orderlist的DataColChanged代码。

用MessageBox.Show跟踪显示:需求总金额,

在订单明细表删除一行之后,需求总金额没有改变,没有扣除掉删掉的那一行的子表的金额。

 

If e.DataCol.Name = "PO总金额" Or e.DataCol.Name = "需求总金额"  Then
   
    Dim dr As DataRow = e.DataRow
    MessageBox.Show("orderlist需求总金额  " & dr("需求总金额"))
   
    Dim amount As Double = 0
    Dim xj,xc As Double
    Dim drs As List(of DataRow)
    drs = DataTables("orderline").Select("PO = \'" & e.DataRow("PO") & "\'" )
        For Each r As DataRow In drs
            amount = amount + Math.Round(r("PO单价") * r("PO数量"),3)
        Next
        Dim xqzje As Double = Math.Round(amount,3)
    MessageBox.Show("amount" & amount)

        xj = Math.Abs(xqzje-dr("PO总金额"))
        xc = xj / dr("PO总金额")
       
        If  xj <=0.1 OrElse xc <0.001 OrElse xj = 0 Then
            dr("总金额核对") = "核对正常"
        Else
            dr("总金额核对") = "核对异常"
        End If
    

End If


--  作者:子剑
--  发布时间:2019/1/14 16:57:00
--  
请版主和高手分析一下。
--  作者:有点甜
--  发布时间:2019/1/14 17:00:00
--  

代码改成

 

 

DataTables("orderlist").DataCols("需求总金额").RaiseDataColChanged("关联列 = \'" & e.datarow("关联列") & "\'")


--  作者:子剑
--  发布时间:2019/1/14 17:49:00
--  
已经改了,加入到子表的DataRowDeleted事件中,现在DataRowDeleted可以触发父表DataColChanged了,父母的总金额数据也是扣掉删除行的最新值,谢谢版主!
--  作者:子剑
--  发布时间:2019/1/15 17:13:00
--  
以下是引用有点甜在2019/1/14 17:00:00的发言:

代码改成

 

 

DataTables("orderlist").DataCols("需求总金额").RaiseDataColChanged("关联列 = \'" & e.datarow("关联列") & "\'")

 

子表:订单明细表删除行的问题解决了,但是,我接下来把这段代码放到子表:订单明细表 增加行 DataRowAdded 事件中,又发生问题,就是父表:订单表,的总需求金额不是最新的数值,不能加入子表新增行的PO单价*PO数量的那一行值,缺少一行的金额值。请问,这又是什么问题啊?

 

 

DataTables("orderlist").DataCols("需求总金额").RaiseDataColChanged("PO = \'" & e.DataRow("PO") & "\'")


--  作者:子剑
--  发布时间:2019/1/15 17:18:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:三个金额.png
图片点击可在新窗口打开查看

--  作者:子剑
--  发布时间:2019/1/15 17:19:00
--  
对了,我在子表中订单明细表新增行是采用导入的方式导进一行的。平时订单录入员也是这样工作的。
--  作者:有点甜
--  发布时间:2019/1/15 17:20:00
--  

你子表的datacolchanged事件,没有重置列?

 

DataTables("orderlist").DataCols("需求总金额").RaiseDataColChanged("PO = \'" & e.DataRow("PO") & "\'")