Foxtable(狐表)用户栏目专家坐堂 → 求助:此表点击打开特别慢,请帮忙分析下原因


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

主题:求助:此表点击打开特别慢,请帮忙分析下原因

美女呀,离线,留言给我吧!
18310172639
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:162 积分:1216 威望:0 精华:0 注册:2019/9/9 20:58:00
求助:此表点击打开特别慢,请帮忙分析下原因  发帖心情 Post By:2021/3/21 17:04:00 [只看该作者]

老师:以下是工单执行反馈表的所有事件代码,切换到此表时,打开特别慢,大概30至60秒的样子,请老师帮我分析下,以下代码如何简化或放在别的位置?

工单执行反馈_ValidateEdit

 

If e.Col.DroppedDown Then '如果下拉窗口已经打开

    e.Col.CloseDropDown() '则关闭下拉窗口

End If

 

工单执行反馈_ChangeEdit

 

If e.Col.Name = "需求号" Then '如果编辑的是客户ID列

    If e.Col.DroppedDown Then '如果下拉窗口已经打开

        Dim tbl As Table = Tables("查找需求任务_任务执行进度")

        If e.Text = "" Then '如果内容为空

            tbl.Filter = "" '显示所有客户

        Else '否则根据输入内容进行模糊筛选

            Dim txt As String = "'%" & e.Text & "%'"

            tbl.Filter = "需求号 Like " & txt & " Or 站点名称 Like " & txt & " Or 站号 Like " & txt

        End If

    End If

End If

 

工单执行反馈_KeyPressEdit

 

If e.Col.Name = "需求号" Then '如果编辑的是客户ID列

    If e.Col.DroppedDown = False '且下拉窗口没有打开

        e.Col.OpenDropDown() '打开下拉窗口

    End If

End If

 

工单执行反馈_KeyDownEdit

 

If e.Col.Name = "需求号" Then '如果编辑的是客户 ID列

    If e.Col.DroppedDown Then '如果下拉窗口已经打开

        Dim tbl As Table = Tables("查找需求任务_任务执行进度")

        If e.KeyCode = Keys.Up Then '如果按下的是上箭头按键

            tbl.Position = tbl.Position - 1 '向上移动一行

            e.Cancel = True

        ElseIf e.KeyCode = Keys.Down Then '如果按下的是下箭头按键

            tbl.Position = tbl.Position + 1 '向下移动一行

            e.Cancel = True

        End If

    End If

End If

 

工单执行反馈_DataColChanged

 

'跨表引用

If e.DataCol.Name = "需求号" Then

    Dim nms() As String = {"站点名称","项目类型"}

    If e.NewValue Is Nothing Then

        For Each nm As String In nms

            e.DataRow(nm) = Nothing

        Next

    Else

        Dim dr As DataRow

        dr = DataTables("任务执行进度").Find("[需求号] = '" & e.NewValue & "'")

        If dr IsNot Nothing

            For Each nm As String In nms

                e.DataRow(nm) = dr(nm)

            Next

        End If

    End If

End If

 

'自动编号

Select e.DataCol.Name

    Case  "工单日期","项目类型"

        If e.DataRow.IsNull("工单日期") OrElse e.DataRow.IsNull("项目类型") Then

            e.DataRow("工单编号") = Nothing

        Else

            Dim  d As Date = e.DataRow("工单日期")

            Dim y As Integer = d.Year

            Dim m As Integer = d.Month

            Dim  Days As  Integer = Date.DaysInMonth(y,m)

            Dim fd As Date = New Date(y,m,1)  '获得该月的第一天

            Dim ld As Date = New Date(y,m,Days)  '获得该月的最后一天

            Dim bh As String = e.DataRow("项目类型") & "-" & Format(d,"yyyyMM") & "-"  '生成编号的前缀

            If e.DataRow("工单编号").StartsWith(bh) = False  '如果单据编号前缀不符

                Dim  max As String

                Dim idx As Integer

                Dim flt As String

                flt =  "项目类型 = '"& e.DataRow("项目类型") &  "'  And 工单日期 >= #" & fd &  "# And   工单日期 <= #" & ld & "# And [_Identify] <> " & e.DataRow("_Identify")

                max =  e.DataTable.Compute("Max(工单编号)",flt)  '取得该月的相同工程代码的最大单据编号

                If max > "" Then  '如果存在最大单据编号

                    idx = CInt(max.SubString(12,3)) + 1  '获得最大单据编号的后3位顺序号,并加1

                Else

                    idx = 1  '否则顺序号等于1

                End If

                e.DataRow("工单编号") = bh & Format(idx,"000")

            End If

        End  If

End Select

 

'进度根据条件判断

Select e.DataCol.Name

    Case  "执行日期","执行信息","照片文件","需求号"

        If e.DataRow.Isnull ("需求号") = False

            If e.DataRow.IsNull("执行日期") OrElse e.DataRow.IsNull("执行信息") OrElse e.DataRow.IsNull("照片文件")  Then

                e.DataRow("工单状态") = "未完成"

            Else

                e.DataRow("工单状态") = "已完成,待审核"

            End If

        End If

End Select

 

 

If e.DataRow("审核") = "审核通过" Then

    e.DataRow("工单状态")="已完成"

Else If e.DataRow("审核")="审核未通过" Then

    e.DataRow("工单状态")="请重新反馈"

End If

 

'自动写入当前日期

Select Case e.DataCol.name

    Case "审核人"

        If e.DataRow.IsNull("审核人") Then

            e.DataRow("审核日期") = Nothing

        Else

            e.DataRow("审核日期") = Date.Today

        End  If

    End  Select

  

'根据条件跨表判断进度

    Select Case e.DataCol.Name

        Case "需求号","站点名称","工单类型","工单状态","审核"

            If e.DataRow.IsNull("需求号")=False AndAlso e.DataRow.IsNull("站点名称")=False  AndAlso e.DataRow.IsNull("工单类型")=False

                Dim s As String = Nothing

                If e.DataRow("工单状态")="已完成" AndAlso e.DataRow("审核")="审核通过"  Then

                    s = "已完成"

                Else

                    s = "未完成"

                End If

                DataTables("任务执行进度").ReplaceFor(e.DataRow("工单类型"), s ,"需求号='" & e.DataRow("需求号") & "' and 站点名称='" & e.DataRow("站点名称") & "'")

            End If

    End Select        '

   


 回到顶部
美女呀,离线,留言给我吧!
18310172639
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:162 积分:1216 威望:0 精华:0 注册:2019/9/9 20:58:00
补充:这张表目前也就录入了一千行  发帖心情 Post By:2021/3/21 17:06:00 [只看该作者]

补充:这张表目前也就录入了一千行左右,总表完成大概需要几万行。

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18064 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/3/21 20:35:00 [只看该作者]

1、如果只是切换到这个表速度慢,看看切换表事件有没有什么特殊代码
2、仅从表面来看,表事件不会导致加载速度慢。先试一下这里

工单执行反馈_ValidateEdit

if e.col.name = "会触发下拉窗口的列" then  ''这一段在帮助里的“记录窗口与表事件”,如果不加,会导致任何一列的操作都会打开下拉窗口

If e.Col.DroppedDown Then '如果下拉窗口已经打开

    e.Col.CloseDropDown() '则关闭下拉窗口

End If

end if 


3、然后这里

select case e.datacol.name

case "审核"

If e.DataRow("审核") = "审核通过" Then

    e.DataRow("工单状态")="已完成"

Else If e.DataRow("审核")="审核未通过" Then

    e.DataRow("工单状态")="请重新反馈"

End If

end select


4、自己可以测试,将整个表事件先全部注释掉,然后再逐一取消注释,检查问题



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


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

切换表这些事件都不会触发的,看看项目事件比如MainTableChanged有没有代码?

 回到顶部
美女呀,离线,留言给我吧!
18310172639
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:162 积分:1216 威望:0 精华:0 注册:2019/9/9 20:58:00
回复蓝老师:项目事件MINTABLECHANGED  发帖心情 Post By:2021/3/21 23:12:00 [只看该作者]

老师:以下代码是所有mintablechanged事件的代码,切换任务执行进度度及订单执行状态表时都不慢,唯有切换工单执行反馈时慢
If MainTable.Name = "任务执行进度" Then
    DataTables("任务执行进度").DataCols("勘察").RaiseDataColChanged()
    DataTables("任务执行进度").DataCols("安装").RaiseDataColChanged()
    DataTables("任务执行进度").DataCols("开通").RaiseDataColChanged()
    DataTables("任务执行进度").DataCols("单验").RaiseDataColChanged()
    DataTables("任务执行进度").DataCols("交资").RaiseDataColChanged()
    DataTables("任务执行进度").DataCols("交维").RaiseDataColChanged()
    DataTables("任务执行进度").DataCols("MIS号").RaiseDataColChanged()
End If

If MainTable.Name = "订单执行状态" Then
    DataTables("订单执行状态").DataCols("预付款状态").RaiseDataColChanged()
    DataTables("订单执行状态").DataCols("进度款状态").RaiseDataColChanged()
    DataTables("订单执行状态").DataCols("尾款状态").RaiseDataColChanged()
    DataTables("订单执行状态").DataCols("MIS号").RaiseDataColChanged()
End If

If MainTable.Name = "工单执行反馈" Then
    DataTables("工单执行反馈").DataCols("工单状态").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("审核").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("站点名称").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("项目类型").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("工单编号").RaiseDataColChanged()
End If

 回到顶部
美女呀,离线,留言给我吧!
18310172639
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:162 积分:1216 威望:0 精华:0 注册:2019/9/9 20:58:00
感谢回复  发帖心情 Post By:2021/3/21 23:13:00 [只看该作者]

感谢三楼的回复,我感觉应该是跨表有条件的引用代码导致切表此表较慢,已进行了测试,的确如此
[此贴子已经被作者于2021/3/21 23:15:49编辑过]

 回到顶部
美女呀,离线,留言给我吧!
18310172639
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:162 积分:1216 威望:0 精华:0 注册:2019/9/9 20:58:00
求助:以下代码导致表格打开较慢  发帖心情 Post By:2021/3/21 23:18:00 [只看该作者]

老师:我已经进行了测试,把下面这段代码注释掉,切换到此表很快,那么这段代码放到哪个位置较为合适?

根据条件跨表判断进度

    Select Case e.DataCol.Name

        Case "需求号","站点名称","工单类型","工单状态","审核"

            If e.DataRow.IsNull("需求号")=False AndAlso e.DataRow.IsNull("站点名称")=False  AndAlso e.DataRow.IsNull("工单类型")=False

                Dim s As String = Nothing

                If e.DataRow("工单状态")="已完成" AndAlso e.DataRow("审核")="审核通过"  Then

                    s = "已完成"

                Else

                    s = "未完成"

                End If

                DataTables("任务执行进度").ReplaceFor(e.DataRow("工单类型"), s ,"需求号='" & e.DataRow("需求号") & "' and 站点名称='" & e.DataRow("站点名称") & "'")

            End If

    End Select        '


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


加好友 发短信
等级:超级版主 帖子:106298 积分:540619 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/3/21 23:40:00 [只看该作者]

If MainTable.Name = "工单执行反馈" Then
    DataTables("工单执行反馈").DataCols("工单状态").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("审核").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("站点名称").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("项目类型").RaiseDataColChanged()
    DataTables("工单执行反馈").DataCols("工单编号").RaiseDataColChanged()
End If

mintablechanged事件会导致7楼的代码被重复执行了3次,而且是所有行都至少执行了3次,如果有1000行,那么这段代码至少会被执行3000次,如果"任务执行进度”表更改数据后又会触发datacolchanged事件的代码执行,那么"任务执行进度”表的datacolchanged事件又会被执行3000 × ReplaceFor影响的行数,这么多次数.....

至于怎么改要您自己理清业务逻辑了

 回到顶部