Foxtable(狐表)用户栏目专家坐堂 → 这样子刷新,每次都会等待很长一段时间,求帮助?


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

主题:这样子刷新,每次都会等待很长一段时间,求帮助?

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


加好友 发短信
等级:四尾狐 帖子:902 积分:8258 威望:0 精华:0 注册:2012/10/19 13:55:00
这样子刷新,每次都会等待很长一段时间,求帮助?  发帖心情 Post By:2020/3/2 10:19:00 [只看该作者]

已知:“入库表”与“客户表”,关于“客户”列建立了关联,现在“客户表”的DataColChanged事件中写入以下代码:

If e.DataCol.name = "用户名" Or e.DataCol.name = "编辑者" Then
    Return
Else
    '表中任意一列的行数据发生改变,则执行.
    e.DataRow("用户名") = user.name
End If

'表中指定列的行数据发生改变,则执行.
Select Case e.DataCol.Name
    Case "客户"
        e.DataRow("日志时间") = Date.Now
End Select

Dim d As Date = Date.Now
DataTables("客户表").ReplaceFor("日志", True, "日志时间 <= #" & d.AddMinutes(-2) & "#")
DataTables("客户表").ReplaceFor("日志", False, "日志时间 > #" & d.AddMinutes(-2) & "#")

'没做天数:
If e.DataCol.name = "客户" Then
    If e.DataRow.IsNull("客户")  Then
        e.DataRow("没做天数") = Nothing
    Else
        Dim fdr = DataTables("入库表").find("客户='" & e.DataRow("客户") & "' and 入库日期 <= #" & Date.now & "#", "入库日期 desc")
        If fdr Is Nothing Then
            e.DataRow("没做天数") = -1
        Else
            Dim sp As TimeSpan = Date.now - cdate(fdr("入库日期"))
            e.DataRow("没做天数") = sp.TotalDays
        End If
    End If
End If

需求:
刷新每个客户最新一笔入库日期,至今的日期差,即“没做天数”。

本人现在的做法:
新建一个控件按钮,代码如下:
'没做天数:
    DataTables("客户表").datacols("客户").RaiseDataColChanged()

问题:
这样子刷新,每次都会等待很长一段时间,求帮助?

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110813 积分:564003 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/2 10:39:00 [只看该作者]

RaiseDataColChanged会每一行都触发一次,其它代码应该没有问题,然后下面代码也会每一行都执行一次,假设有100行,就会执行200次更新整个表数据的操作,当然就慢了。

Dim d As Date = Date.Now
DataTables("客户表").ReplaceFor("日志", True, "日志时间 <= #" & d.AddMinutes(-2) & "#")
DataTables("客户表").ReplaceFor("日志", False, "日志时间 > #" & d.AddMinutes(-2) & "#")

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


加好友 发短信
等级:四尾狐 帖子:902 积分:8258 威望:0 精华:0 注册:2012/10/19 13:55:00
回复:(有点蓝)RaiseDataColChanged会每一行都触发一...  发帖心情 Post By:2020/3/2 10:45:00 [只看该作者]

那么,有什么办法处理呢?


 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110813 积分:564003 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/2 10:55:00 [只看该作者]

加个全局变量控制一下,RaiseDataColChanged时候不执行

……
if vars("a") = true
Dim d As Date = Date.Now
DataTables("客户表").ReplaceFor("日志", True, "日志时间 <= #" & d.AddMinutes(-2) & "#")
DataTables("客户表").ReplaceFor("日志", False, "日志时间 > #" & d.AddMinutes(-2) & "#")
end if
……


新建一个控件按钮,代码如下:
'没做天数:
vars("a") = false
    DataTables("客户表").datacols("客户").RaiseDataColChanged()
vars("a") = true

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


加好友 发短信
等级:四尾狐 帖子:902 积分:8258 威望:0 精华:0 注册:2012/10/19 13:55:00
回复:(有点蓝)加个全局变量控制一下,RaiseDataColC...  发帖心情 Post By:2020/3/2 15:01:00 [只看该作者]

试了一下您的办法,但是还是很慢,主要是刷新后的第一次换行,会迟缓6/7秒时间,这还是数据不多的时候?
请问,这换行的触发条件,应该如何优化?

在“入库表”的CurrentChanged事件中写了新增同步代码:
Dim cr As Row = e.Table.Current
If cr IsNot Nothing Then
    Dim idx As Integer = Tables("产品表").FindRow("客户 = '" & cr("客户") & "'")
    If idx >= 0 Then
        Tables("产品表").Position = idx
    End If
End If

,且窗口表的CurrentChanged事件也写了:
'SystemReady = False
If e.Table.current Is Nothing Then Return
systemready = False

'换行时,同客户列同步:
DataTables("产品表").Load
Tables("产品表").filter = ""
Dim i = Tables("产品表").FindRow("客户 = '" & e.Table.current("客户") & "'")
If i>=0 Then
    Tables("产品表").position = i
Else
    Tables("产品表").filter = "1=2"
End If

systemready = True
[此贴子已经被作者于2020/3/2 15:04:38编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110813 积分:564003 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/2 15:36:00 [只看该作者]

http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=146710

 回到顶部