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


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

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

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/4 10:05:00 [显示全部帖子]

代码是在哪个表的?

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

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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更新,代码不会涉及具体的计算,所以代码是通用的,基本上不会因为计算要求的变动,而去修改更新代码。


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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/4 15:22:00 [显示全部帖子]

so_shp_qty是表达式列?

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/4 15:50:00 [显示全部帖子]

表达式列都无法触发事件,和父表还是子表没有什么关系:http://www.foxtable.com/webhelp/topics/2381.htm

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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


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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/5 9:42:00 [显示全部帖子]

DataRowDeleting事件
e.DataRow("dnd_qty") = 0
    Dim pr As DataRow = e.DataRow.GetParentRow("so_det") '找出对应的父行
    If pr IsNot Nothing Then
        DataTables("so_det").DataCols("so_oder_qty").RaiseDataColChanged(pr) '通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/5 11:32:00 [显示全部帖子]

请上传实例说明

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/5 14:00:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.zip


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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/5 14:34:00 [显示全部帖子]

        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
改为
        If e.DataRow.IsNull("so_oder_qty") OrElse e.DataRow.IsNull("so_shp_qty") OrElse e.DataRow("so_shp_qty") = 0 Then
            If e.DataRow.IsNull("so_shp_qty") OrElse e.DataRow("so_shp_qty") = 0 Then
                e.DataRow("so_stutas") = "未执行"
                e.DataRow.Locked = False
            End If

 回到顶部