以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]刷新不实时  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=184800)

--  作者:mengxxaa
--  发布时间:2023/1/4 10:03:00
--  [求助]刷新不实时
1.在前端对数据或者删除一些行之后,前端没有看到实时更新的结果,要重新登录系统才能看到。
2.在子表上删除一些数据后,父表有些行没有相应的变动。

代码1:
图片点击可在新窗口打开查看此主题相关图片如下:子表改动后父表无完全变化.png
图片点击可在新窗口打开查看
Select Case e.DataCol.Name
    Case "so_oder_qty", "so_shp_qty"
        If e.DataRow.IsNull("so_oder_qty") OrElse e.DataRow.IsNull("so_shp_qty") Then
If e.DataRow.IsNull("so_shp_qty") Then
e.DataRow("so_stutas") = "未执行"
e.DataRow.Locked = False
End If
Else If e.DataRow("so_oder_qty") > e.DataRow("so_shp_qty") Then
e.DataRow("so_stutas") = "执行未完结"
e.DataRow.Locked = False 
Else 
e.DataRow("so_stutas") = "执行完毕"
e.DataRow.Locked = True
    End If
End Select

--  作者:有点蓝
--  发布时间:2023/1/4 10:05:00
--  
代码是在哪个表的?

[此贴子已经被作者于2023/1/4 10:05:31编辑过]

--  作者:mengxxaa
--  发布时间:2023/1/4 10:07:00
--  
代码是在父表上。
“在前端对数据或者删除一些行之后,前端没有看到实时更新的结果,要重新登录系统才能看到”,这个问题也是看你发出来的帮助链接吗?

--  作者:有点蓝
--  发布时间:2023/1/4 10:10:00
--  
仔细看帮助,还要在子表写代码通知父表数据有更新了:

所以有必要考虑用另一重算方法,将订单表的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

代码的原理是,当订单表中数量、单价、折扣三列中任何一列的内容发生变化,就从统计表中找出对应产品所在的行,然后“欺骗性”地通知系统该行的产品列内容发生了变化,于是触发统计表的DataColChanged事件,重算 此行的数量和金额。

这种更新方式是很常用的,即使处理的不是表达式列,我们多数时候也会采用这种更新方式。
因为使用RaiseDataColChanged更新,代码不会涉及具体的计算,所以代码是通用的,基本上不会因为计算要求的变动,而去修改更新代码。


--  作者:mengxxaa
--  发布时间:2023/1/4 15:14:00
--  
已经在子表中写了通知父表有更新的代码:
If e.DataCol.name = "dnd_qty" Then
    Dim pr As DataRow = e.DataRow.GetParentRow("so_det") \'找出对应的父行
    If pr IsNot Nothing Then
        DataTables("so_det").DataCols("so_shp_qty").RaiseDataColChanged(pr) \'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If
有了这个代码,只要子表中的dnd_qty发生了变化,父表中对应行的so_shp_qty也跟着变化,但是没有触发父表其他列也跟着变。
看了帮助,还是有疑问,帮助的例子中,统计表的产品是不重复唯一的,而我的子表中的产品在父表中存在多行。希望老师指点一二

--  作者:有点蓝
--  发布时间:2023/1/4 15:22:00
--  
so_shp_qty是表达式列?
--  作者:mengxxaa
--  发布时间:2023/1/4 15:34:00
--  
so_shp_qty在父表中是表达式,看了帮助中:

首先将统计表的DataColChanged事件代码设置为:

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


我的理解,帮助中的例子,统计表是父表,订单表是子表。只有子表中存在表达式列,才需要以上代码。父表中表达式列也不会触发吗?该怎么处理呢?


--  作者:有点蓝
--  发布时间:2023/1/4 15:50:00
--  
表达式列都无法触发事件,和父表还是子表没有什么关系:http://www.foxtable.com/webhelp/topics/2381.htm
--  作者:mengxxaa
--  发布时间:2023/1/4 16:33:00
--  
现在是用最笨的办法解决,就是选中父表中的so_shp_qty列,选择“重置列”。试了几个代码都不行,求老师给自动触发的代码吧。
--  作者:有点蓝
--  发布时间:2023/1/4 16:38:00
--  
帮助已经说得很明白了

但是上述代码是无效的,因为作为表达式列,C列发生变化的时候,并不会触发DataColChanged事件。

我们可以换个思路,既然C列是有A列和B列计算得出,那么C列发生变化,肯定是因为A列或B列发生变化引起的。
所以正确的代码是:

Select Case e.DataCol.Name
    Case "A" ,"B"
          
\'计算D列的代码
End
 Select