以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  更新问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=190698)

--  作者:lin98
--  发布时间:2024/2/28 22:45:00
--  更新问题

方法一

If e.DataCol.Name = "产品" Then
    e.DataRow("数量") = DataTables("订单").Compute("Sum(数量)","[产品] = \'" & e.NewValue & "\'")
End
 
If

请在统计表设置好上述代码后,重置一次该表的产品列。

现在要求在订单表输入或修改某订单的数量后,能够即时更新统计表对应产品的数量统计值。

为此可将订单表的DataColChanged事件代码设置为:

If e.DataCol.Name = "数量" Then
    Dim pr As DataRow
    pr = 
DataTables("统计").Find("产品 = \'" & e.DataRow("产品") & "\'")
    If
 pr IsNot Nothing 
Then
        pr(
"数量")= pr("数量") + e.NewValue - e.OldValue
    End
 
If
End
 If



方法二


If e.DataCol.Name = "产品" Then
    Dim
 Filter As String = "[产品] = \'" & e.NewValue & "\'"
    e.
DataRow("数量") = DataTables("订单").Compute("Sum(数量)", Filter)
    e.
DataRow("金额") = DataTables("订单").Compute("Sum(金额)", Filter)
End
 If

同样在统计表设置好上述代码后,请重置一次该表的产品列。

订单表的金额列是一个表达式列,其表达式为:[数量] * [单价] * (1 - [折扣])
我们知道表达式列有一个特性,就是其值发生变化后,并不会触发DataColChanged事件,此特性导致我们无法简单地用前面介绍的方法来自动更新统计表中的销售金额。
所以有必要考虑用另一重算方法,将订单表的DataColChanged事件代码设置为:

Select Case e.DataCol.Name
    Case
 "数量","单价","折扣"
        
Dim pr As DataRow
        pr = 
DataTables("统计").Find("产品 = \'" & e.DataRow("产品") & "\'")
        If
 pr IsNot Nothing Then
            DataTables
("统计").DataCols("产品").RaiseDataColChanged(pr)
        End
 If
End
 Select



方法三


If e.DataCol.Name = "产品" Then
    e.DataRow("数量") = DataTables("订单").Compute("Sum(数量)","[产品] = \'" & e.NewValue & "\'")

    e.DataRow("金额") = DataTables("订单").Compute("Sum(金额)","[产品] = \'" & e.NewValue & "\'")


End
 
If



注:金额不是表达式字段


Select Case e.DataCol.Name
    Case
 "数量","单价","折扣"
        
Dim pr As DataRow
        pr = 
DataTables("统计").Find("产品 = \'" & e.DataRow("产品") & "\'")
        If
 pr IsNot Nothing Then
            DataTables
("统计").DataCols("产品").RaiseDataColChanged(pr)
        End
 If
End
 Select




问题:方法一和方法二是帮助实例,方法三是自己做,也能用,以方法一、方法二相比,好象不规范,会不会有潜在问题?








--  作者:有点蓝
--  发布时间:2024/2/29 8:44:00
--  
方法二和方法三基本没有什么区别,不存在什么规范问题。如果一定要区分,方法三效率稍微低一点