以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- datacolchanged代码运行慢问题 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=166092) |
-- 作者:wangglby -- 发布时间:2021/5/18 9:28:00 -- datacolchanged代码运行慢问题 datacolchanged代码比较多,大约有18000个字符,反应时间得有4秒钟,请教下怎么优化,有什么思路?
|
-- 作者:有点蓝 -- 发布时间:2021/5/18 9:48:00 -- 这个建议从业务逻辑的层面优化。具体问题可以上传实例看看 |
-- 作者:wangglby -- 发布时间:2021/5/18 15:23:00 --
[此贴子已经被作者于2021/5/19 9:21:37编辑过]
|
-- 作者:有点蓝 -- 发布时间:2021/5/18 16:32:00 -- datacolchanged完整代码放到txt文件发上来看看 |
-- 作者:wangglby -- 发布时间:2021/5/18 23:44:00 --
[此贴子已经被作者于2021/5/19 9:21:10编辑过]
|
-- 作者:有点蓝 -- 发布时间:2021/5/19 9:04:00 -- 很多问题: 1、值判断应该放到列名判断之后, 2、同一个条件的查询没有必要调用多次,并且没有判断查询结果是否为空,后面还有大量这种用法 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、这种代码没有必要放到表事件处理,放到项目afteropenproject即可 5、优化1 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、优化2 可以优化为: 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编辑过]
|
-- 作者:wangglby -- 发布时间:2021/5/19 9:19:00 -- 辛苦,谢谢 |