Foxtable(狐表)用户栏目专家坐堂 → datacolchanged代码运行慢问题


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

主题:datacolchanged代码运行慢问题

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


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

这个建议从业务逻辑的层面优化。具体问题可以上传实例看看

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


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

datacolchanged完整代码放到txt文件发上来看看

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


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

很多问题:
1、值判断应该放到列名判断之后,

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:2.jpg
图片点击可在新窗口打开查看

2、同一个条件的查询没有必要调用多次,并且没有判断查询结果是否为空,后面还有大量这种用法

图片点击可在新窗口打开查看此主题相关图片如下:3.png
图片点击可在新窗口打开查看
可以改为:
dim filter as string = "[设备] = '数控等离子切割机'"
            If e.DataRow("物料信息_厚") >= 6 Then filter  = "[设备] = '数控气割'"
dim dr33 as datarow = DataTables("表E").Find(filter  )
if dr33 isnot nothing then
                e.DataRow("下料_动力费") = dr33("电费")*(e.DataRow("下料_周长")/qg/60+e.DataRow("下料_穿孔数")*ck/60)
                e.DataRow("下料_工时费") =  (dr33("人工费")+3/6*22.21*1.17)*(e.DataRow("下料_周长")/qg/60+e.DataRow("下料_穿孔数")*ck/60)
                e.DataRow("下料_折旧费") =  dr33("设备折旧费")*(e.DataRow("下料_周长")/qg/60+e.DataRow("下料_穿孔数")*ck/60)
            If e.DataRow("物料信息_厚") >= 6 Then 
                e.DataRow("下料_辅助材料费")=(e.DataRow("下料_周长")*e.DataRow("物料信息_厚")+1.414*e.DataRow("下料_坡高")*e.DataRow("下料_坡长"))*(8.91* dr33("氧气")+0.78* DataTables("表E").Find("[设备] = '数控气割'")("切割气"))*0.000001
            Else
                e.DataRow("下料_辅助材料费") =  dr33("辅助材料")*(e.DataRow("下料_周长")/qg/60+e.DataRow("下料_穿孔数")*ck/60)
            End If
End If
3、没有判断列名:http://www.foxtable.com/webhelp/topics/1522.htm,任何列数据改动都会执行这个代码,1楼全部代码都有这个问题

图片点击可在新窗口打开查看此主题相关图片如下:4.png
图片点击可在新窗口打开查看
4、这种代码没有必要放到表事件处理,放到项目afteropenproject即可

图片点击可在新窗口打开查看此主题相关图片如下:5.png
图片点击可在新窗口打开查看
5、优化1

图片点击可在新窗口打开查看此主题相关图片如下:6.png
图片点击可在新窗口打开查看
这种代码应该改为
Dim sumgs,sumzj,sumdl,sumfz As Double
If e.DataCol.name Like "*工时费"
    For Each dc As DataCol In DataTables("表A").datacols
        If dc.name Like "*工时费"   Then
            sumgs=e.DataRow(dc.name)+sumgs
        End If
    Next
    e.DataRow("sys_工时费小计")= sumgs
ElseIf e.DataCol.name Like "*折旧费"
    For Each dc As DataCol In DataTables("表A").datacols
        If dc.name Like "*折旧费"   Then
            sumzj=e.DataRow(dc.name)+sumzj
        End If
    Next
    e.DataRow("sys_折旧费小计")= sumzj
ElseIf e.DataCol.name Like "*动力费"
    ……自己补充完整
6、下面这种代码感觉没有必要遍历所有行处理,但是不明白具体的业务,无法提供什么帮助。另外没有判断列名,任何一个单元格的数据变化都会导致这个代码计算一遍,以上面的第2条问题为例,给e.DataRow("下料_动力费")赋值会导致调用下面代码计算一遍,给e.DataRow("下料_工时费")赋值又会导致调用下面代码计算一遍,而datacolchanged事件有很多的代码都会给本表的各种单元格赋值,不管给哪个单元格赋值,下面代码都会调用一次

图片点击可在新窗口打开查看此主题相关图片如下:7.png
图片点击可在新窗口打开查看

7、优化2

图片点击可在新窗口打开查看此主题相关图片如下:8.png
图片点击可在新窗口打开查看
可以优化为:
Dim srr() As String = {"钻孔","攻丝","镗",...自己补充完整...}
If array.indexof(srr,e.DataCol.name) > -1
    Dim ayc As String = e.DataRow("物料信息_层级")
    Dim byc As String
    If ayc.contains(".") Then   ' 如果 第二列包含" ."
        byc = left(ayc,ayc.IndexOf("."))    '取第一个" ." 左侧的字符
    Else byc = ayc
    End If
    
    If DataTables("表A").Compute("count(物料信息_层级)","物料信息_层级 like '" & byc & "%' and " & e.DataCol.name & "=true") > 0  AndAlso e.DataRow("物料信息_级别") = 1   Then
        e.DataRow("sys_" & e.DataCol.name) = DataTables("表A").Compute("SUM(sys_" & e.DataCol.name & "辅助)","物料信息_层级 like '" & byc & "%' and " & e.DataCol.name & "=true")
    End If
End If
If e.DataCol.name = "物料信息_层级" OrElse e.DataCol.name = "物料信息_级别" Then
    Dim ayc As String = e.DataRow("物料信息_层级")
    Dim byc As String
    If ayc.contains(".") Then   ' 如果 第二列包含" ."
        byc = left(ayc,ayc.IndexOf("."))    '取第一个" ." 左侧的字符
    Else byc = ayc
    End If
    If DataTables("表A").Compute("count(物料信息_层级)","物料信息_层级 like '" & byc & "%' and 钻孔=true") > 0  AndAlso e.DataRow("物料信息_级别") = 1   Then
        e.DataRow("sys_钻孔") = DataTables("表A").Compute("SUM(sys_钻孔辅助)","物料信息_层级 like '" & byc & "%' and 钻孔=true")
    End If
    
    If DataTables("表A").Compute("count(物料信息_层级)","物料信息_层级 like '" & byc & "%' and 攻丝=true") > 0  AndAlso e.DataRow("物料信息_级别") = 1   Then
        e.DataRow("sys_攻丝") = DataTables("表A").Compute("SUM(sys_攻丝辅助)","物料信息_层级 like '" & byc & "%' and 攻丝=true")
    End If
    ……其它自己补充完整
End If


[此贴子已经被作者于2021/5/19 9:38:04编辑过]

 回到顶部