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
此主题相关图片如下: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