Foxtable(狐表)用户栏目专家坐堂 → [原创]子表的删除行DataRowDeleted事件不能触发父表的DataColChanged事件的问题


  共有5247人关注过本帖树形打印复制链接

主题:[原创]子表的删除行DataRowDeleted事件不能触发父表的DataColChanged事件的问题

帅哥哟,离线,有人找我吗?
子剑
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
[原创]子表的删除行DataRowDeleted事件不能触发父表的DataColChanged事件的问题  发帖心情 Post By:2019/1/14 16:48:00 [显示全部帖子]

 

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

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

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


 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By: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

 


 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By:2019/1/14 16:57:00 [显示全部帖子]

请版主和高手分析一下。

 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By:2019/1/14 17:49:00 [显示全部帖子]

已经改了,加入到子表的DataRowDeleted事件中,现在DataRowDeleted可以触发父表DataColChanged了,父母的总金额数据也是扣掉删除行的最新值,谢谢版主!

 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By: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") & "'")


 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By:2019/1/15 17:18:00 [显示全部帖子]


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

 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By:2019/1/15 17:19:00 [显示全部帖子]

对了,我在子表中订单明细表新增行是采用导入的方式导进一行的。平时订单录入员也是这样工作的。

 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By:2019/1/15 17:32:00 [显示全部帖子]

子表的datacolchanged事件有重置列,子表的datacolchanged代码是这样的,

 

 

If (e.DataCol.Name = "PO单价" AndAlso Not(e.DataRow.IsNull("PO数量"))) OrElse (e.DataCol.Name = "PO数量"  AndAlso Not(e.DataRow.IsNull("PO单价"))) Then

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


End If


If e.DataCol.Name = "PO总价"  Then

    Dim dr2 As DataRow = e.DataRow
   
  If Not(dr2.IsNull("PO总价"))  Then

    Dim amount,xj,xc As Double
   
    amount = Math.Round(dr2("PO单价") * dr2("PO数量"),3)
    xj = Math.Abs(amount-dr2("PO总价"))
    xc = xj / dr2("PO总价")
   
   
    If  xj < 0.1 OrElse  xc <0.001  Then
            dr2("价格核对") = "核对正常"
    Else
            dr2("价格核对") = "核对异常"
    End If
  End If

End If


If e.DataCol.Name = "生产单号"  AndAlso Not(e.DataRow.IsNull("生产单号")) Then


e.DataRow("生产安排时间") = Date.Now()

End If


 回到顶部
帅哥哟,离线,有人找我吗?
子剑
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:47 积分:441 威望:0 精华:0 注册:2018/10/6 18:05:00
  发帖心情 Post By:2019/1/15 17:36:00 [显示全部帖子]

以下是引用有点甜在2019/1/15 17:20:00的发言:

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

 

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

子表明细的金额列也是个表达式,我不能直接引用,是用PO单价和PO数量计算的。

按照普通的新增一行,然后在PO单价和PO数量同时不为空的情况下,可以触发父表的需求总金额列。得到最新的总金额。

 

但是,如果提取事先用EXCEL表格里面输入PO单价和PO数量,然后合并导入的方式,得到父表的总金额就不是最新的。没有子表新增导入一行的金额数值。


 回到顶部
总数 20 1 2 下一页