Foxtable(狐表)用户栏目专家坐堂 → [求助]刷新不实时


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

主题:[求助]刷新不实时

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
[求助]刷新不实时  发帖心情 Post By: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

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By:2023/1/4 10:07:00 [显示全部帖子]

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

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By: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也跟着变化,但是没有触发父表其他列也跟着变。
看了帮助,还是有疑问,帮助的例子中,统计表的产品是不重复唯一的,而我的子表中的产品在父表中存在多行。希望老师指点一二

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By: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


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


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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By:2023/1/4 16:33:00 [显示全部帖子]

现在是用最笨的办法解决,就是选中父表中的so_shp_qty列,选择“重置列”。试了几个代码都不行,求老师给自动触发的代码吧。

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By:2023/1/5 9:33:00 [显示全部帖子]

昨天参照了这个代码,编写了:
Select Case e.DataCol.Name
    Case "so_oder_qty"

End
 Select
收到部分效果。就是我把子表整行删除后,相当于so_shp_qty=0时,状态不会改变。然后我在子表中DataRowDeleting事件中添加:e.DataRow("dnd_qty") = 0,还是不能正常触发父表中的其他行改变。

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By:2023/1/5 11:28:00 [显示全部帖子]

测试了,效果一样,删除子表行的时候,有触发效果,但是返回值不对,返回的是执行未完结,按理来说是返回未执行。在子表不删除行的情况下,数量直接删除,则能返回正确的结果。
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") and Then
e.DataRow("so_stutas") = "执行未完结"
e.DataRow.Locked = False 
Else 
e.DataRow("so_stutas") = "执行完毕"
e.DataRow.Locked = True
    End If
End Select


感觉是0和空值引起的,修改了代码,效果还是一样。
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("so_shp_qty") = 0 Then
e.DataRow("so_stutas") = "未执行"
e.DataRow.Locked = False
End If
Else If e.DataRow("so_oder_qty") > e.DataRow("so_shp_qty") AndAlso e.DataRow("so_shp_qty") <> 0 Then
e.DataRow("so_stutas") = "执行未完结"
e.DataRow.Locked = False 
Else If e.DataRow("so_oder_qty") <= e.DataRow("so_shp_qty")
e.DataRow("so_stutas") = "执行完毕"
e.DataRow.Locked = True
    End If
End Select

烦请老师再指点一二
图片点击可在新窗口打开查看此主题相关图片如下:结果.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By:2023/1/5 13:46:00 [显示全部帖子]

看下删除子表所有数据的时候,为什么触发的结果不对。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.foxdb


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


加好友 发短信
等级:幼狐 帖子:88 积分:697 威望:0 精华:0 注册:2022/10/10 15:34:00
  发帖心情 Post By:2023/1/5 14:25:00 [显示全部帖子]

删除子表整行数据后,返回结果还是执行未完结,应该是未执行才对啊。

 回到顶部