以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 求助:此表点击打开特别慢,请帮忙分析下原因 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=161536) |
-- 作者:18310172639 -- 发布时间: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 -- 发布时间:2021/3/21 17:06:00 -- 补充:这张表目前也就录入了一千行 补充:这张表目前也就录入了一千行左右,总表完成大概需要几万行。 |
-- 作者:chnfo -- 发布时间: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、自己可以测试,将整个表事件先全部注释掉,然后再逐一取消注释,检查问题 |
-- 作者:有点蓝 -- 发布时间:2021/3/21 22:22:00 -- 切换表这些事件都不会触发的,看看项目事件比如MainTableChanged有没有代码? |
-- 作者:18310172639 -- 发布时间:2021/3/21 23:12:00 -- 回复蓝老师:项目事件MINTABLECHANGED 老师:以下代码是所有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 -- 发布时间:2021/3/21 23:13:00 -- 感谢回复 感谢三楼的回复,我感觉应该是跨表有条件的引用代码导致切表此表较慢,已进行了测试,的确如此 [此贴子已经被作者于2021/3/21 23:15:49编辑过]
|
-- 作者:18310172639 -- 发布时间: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 \' |
-- 作者:有点蓝 -- 发布时间: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影响的行数,这么多次数..... 至于怎么改要您自己理清业务逻辑了
|