以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  这样子刷新,每次都会等待很长一段时间,求帮助?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=146767)

--  作者:fengwenliuyan
--  发布时间: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()

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

--  作者:有点蓝
--  发布时间: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
--  发布时间:2020/3/2 10:45:00
--  回复:(有点蓝)RaiseDataColChanged会每一行都触发一...
那么,有什么办法处理呢?


--  作者:有点蓝
--  发布时间: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
--  发布时间:2020/3/2 15:01:00
--  回复:(有点蓝)加个全局变量控制一下,RaiseDataColC...
试了一下您的办法,但是还是很慢,主要是刷新后的第一次换行,会迟缓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编辑过]

--  作者:有点蓝
--  发布时间:2020/3/2 15:36:00
--  
http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=146710