以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  SQLCompute效率  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=130582)

--  作者:cd_tdh
--  发布时间:2019/1/25 20:39:00
--  SQLCompute效率
有谁测试过直接用 SQLCompute 和用SQLCommand 生成临时表后用Compute那个效率高啊?
--  作者:有点蓝
--  发布时间:2019/1/25 21:44:00
--  
直接比较没有意义,看使用场景。具体问题具体分析。
--  作者:cd_tdh
--  发布时间:2019/1/25 21:59:00
--  
  比如这段代码,感觉很费时,到没测试过时间到底费时到那一部分代码,这种有没优化方法呢?

Dim dr As DataRow = Tables("工程款管理").current.DataRow
If dr("审批状态") = "已审批完成" Then
    MessageBox.Show("已审批完成的项目不能再进行计算!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    e.Cancel = True
    Return
End If

Dim filter As String = "合同编码=\'" & dr("合同编码") & "\'and 计量期数=\'" & dr("计量期数") & "\'"
If dr("新老项目") = "新项目" Then \'为空
    Dim Filter1 As String= "合同编码=\'" & dr("合同编码") & "\'"
    With e.Form.Controls("开票日期")
        If .Value IsNot Nothing Then
            Dim d As Date = .value
            Dim d2 As Date = new Date(d.year, d.Month, 15)
            d2 = d2.AddMonths(1)
            Filter1 &= " and 寄达日期 <= \'" & d2 & "\'"
        End If
    End With
    Dim sum1 As Double = DataTables("进项票审核").sqlCompute("sum(税额)", filter1 & " and 审核状态=\'已审核\' and 类别=\'专票\'")
    Dim sum2 As Double = 0
    For i As Integer = 1 To dr("计量期数")-1
        sum2 += val(dr.DataTable.datarows(i-1)("本期统计增值税"))
    Next
    \'dr("本期统计增值税")= sum1-sum2
    dr("本期统计增值税") = DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'专票\'")
    dr("本期统计成本发票") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')") + DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'普票\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')")
    dr("本期统计人工工资") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\'  and 工料机类别=\'人工\'") + DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'普票\' and 工料机类别=\'人工\'")
Else
    dr("本期统计增值税") = DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'专票\'")  \'不分时段计算
    dr("本期统计成本发票") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')") + DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'普票\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')")
    dr("本期统计人工工资") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\' and 工料机类别=\'人工\'")
End If

\'成本发票及人工工资
If dr("应缴增值税基数") =Nothing Then \'为空
    dr("成本基数") = Nothing
ElseIf dr("应缴增值税基数") ="合同金额" Then
    dr("成本基数") = dr("合同金额")
Else If dr("应缴增值税基数") ="发票金额" Then
    dr("成本基数") = dr("发票金额")
Else If dr("应缴增值税基数") ="计量金额" Then
    dr("成本基数") = dr("计量金额")
Else If dr("应缴增值税基数") ="申请金额" Then
    dr("成本基数") = dr("申请金额")
End If

\'退成本
If dr("是否是退扣款") = True Then \'为空
    If dr("本期统计成本发票") > dr("本期需要成本发票") Then
        dr("本期需要成本发票") = dr ("")
    Else
        dr("本期需要成本发票") = dr ("本期统计成本发票")
    End If
Else
    If dr("应缴增值税基数") = Nothing Then \'为空
        dr("本期需要成本发票") = Nothing
        dr("本期需要人工工资") = Nothing
    ElseIf dr("是否扣税") = True AndAlso dr("应缴增值税基数") ="合同金额" Then
        dr("本期需要成本发票") = dr("合同金额") / 1.1 * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("合同金额") / 1.1 * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = True AndAlso dr("应缴增值税基数") ="发票金额" Then
        dr("本期需要成本发票") = dr("发票金额") / 1.1 * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("发票金额") / 1.1 * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = True AndAlso dr("应缴增值税基数") ="计量金额" Then
        dr("本期需要成本发票") = dr("计量金额") / 1.1 * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("计量金额") / 1.1 * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = True AndAlso dr("应缴增值税基数") ="申请金额" Then
        dr("本期需要成本发票") = dr("申请金额") / 1.1 * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("申请金额") / 1.1 * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = False AndAlso dr("应缴增值税基数") ="合同金额" Then
        dr("本期需要成本发票") = dr("合同金额") * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("合同金额") * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = False AndAlso dr("应缴增值税基数") ="发票金额" Then
        dr("本期需要成本发票") = dr("发票金额") * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("发票金额") * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = False AndAlso dr("应缴增值税基数") ="计量金额" Then
        dr("本期需要成本发票") = dr("计量金额") * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("计量金额") * (dr("人工比例") / 100)
    ElseIf dr("是否扣税") = False AndAlso dr("应缴增值税基数") ="申请金额" Then
        dr("本期需要成本发票") = dr("申请金额") * (dr("材机比例") / 100)
        dr("本期需要人工工资") = dr("申请金额") * (dr("人工比例") / 100)
    End If
End If
\'本期需要增值税计算
If dr.IsNull("应缴增值税基数") OrElse dr.IsNull("增值税征收方式")  Then \'为空
    dr("本期需要增值税") = Nothing
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "标准征收" Then
    dr("本期需要增值税") = dr("合同金额") / 1.1 * 0.07
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("本期需要增值税") = dr("合同金额") / 1.03 * 0.03
ElseIf dr("应缴增值税基数") ="发票金额"  AndAlso dr("增值税征收方式") = "标准征收" Then
    dr("本期需要增值税") = dr("发票金额") / 1.1 * 0.07
ElseIf dr("应缴增值税基数") ="发票金额"  AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("本期需要增值税") = dr("发票金额") / 1.03 * 0.03
ElseIf dr("应缴增值税基数") ="申请金额"  AndAlso dr("增值税征收方式") = "标准征收" Then
    dr("本期需要增值税") = dr("申请金额") / 1.1 * 0.07
ElseIf dr("应缴增值税基数") ="申请金额"  AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("本期需要增值税") = dr("申请金额") / 1.03 * 0.03
End If
\'应缴增值税及成本差额计算
If dr.IsNull("应缴增值税基数") OrElse dr.IsNull("增值税征收方式") Then \'为空
    dr("应缴增值税") = Nothing
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False  AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("合同金额") / 1.1 * 0.1
    dr("成本差额") = dr("合同金额")*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True  AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("合同金额") / 1.1 * 0.1
    dr("成本差额") = dr("合同金额")/1.1*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False  AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("合同金额") / 1.1 * 0.1
    dr("成本差额") = dr("合同金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True  AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("合同金额") / 1.1 * 0.1
    dr("成本差额") = dr("合同金额")/1.1 - dr("本期使用成本发票") - dr("本期使用人工工资")

ElseIf dr("应缴增值税基数") ="发票金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("发票金额") / 1.1 * 0.1
    dr("成本差额") = dr("发票金额")*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="发票金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("发票金额") / 1.1 * 0.1
    dr("成本差额") = dr("发票金额")/1.1*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="发票金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("发票金额") / 1.1 * 0.1
    dr("成本差额") = dr("发票金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="发票金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("发票金额") / 1.1 * 0.1
    dr("成本差额") = dr("发票金额")/1.1 - dr("本期使用成本发票") - dr("本期使用人工工资")

ElseIf dr("应缴增值税基数") ="申请金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("申请金额") / 1.1 * 0.1
    dr("成本差额") = dr("申请金额")*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="申请金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("申请金额") / 1.1 * 0.1
    dr("成本差额") = dr("申请金额")/1.1*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="申请金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("申请金额") / 1.1 * 0.1
    dr("成本差额") = dr("申请金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="申请金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("申请金额") / 1.1 * 0.1
    dr("成本差额") = dr("申请金额")/1.1 - dr("本期使用成本发票") - dr("本期使用人工工资")

ElseIf dr("应缴增值税基数") ="计量金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("计量金额") / 1.1 * 0.1
    dr("成本差额") = dr("计量金额")*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="计量金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True AndAlso dr("成本比例") = False Then
    dr("应缴增值税") = dr("计量金额") / 1.1 * 0.1
    dr("成本差额") = dr("计量金额")/1.1*0.92 - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="计量金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = False AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("计量金额") / 1.1 * 0.1
    dr("成本差额") = dr("计量金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
ElseIf dr("应缴增值税基数") ="计量金额" AndAlso dr("增值税征收方式") = "标准征收" AndAlso dr("是否扣税") = True AndAlso dr("成本比例") = True Then
    dr("应缴增值税") = dr("计量金额") / 1.1 * 0.1
    dr("成本差额") = dr("计量金额")/1.1 - dr("本期使用成本发票") - dr("本期使用人工工资")
    
    
ElseIf dr("应缴增值税基数") ="合同金额" AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("应缴增值税") = dr("合同金额") / 1.03 * 0.03
    dr("成本差额") = dr("合同金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
    
ElseIf dr("应缴增值税基数") ="发票金额"  AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("应缴增值税") = dr("发票金额") / 1.03 * 0.03
    dr("成本差额") = dr("发票金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
    
ElseIf dr("应缴增值税基数") ="申请金额"  AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("应缴增值税") = dr("申请金额") / 1.03 * 0.03
    dr("成本差额") = dr("申请金额") - dr("本期使用成本发票") - dr("本期使用人工工资")

ElseIf dr("应缴增值税基数") ="计量金额"  AndAlso dr("增值税征收方式") = "简易征收" Then
    dr("应缴增值税") = dr("计量金额") / 1.03 * 0.03
    dr("成本差额") = dr("计量金额") - dr("本期使用成本发票") - dr("本期使用人工工资")
End If

\'成本差额税
Dim cc As String = e.Form.Controls("成本差额").value   \'定义开票日期输入框为d
Dim cs As String = e.Form.Controls("成本差额税率").value   \'定义开票日期输入框为d
If cc = 0 Then
    dr("成本差额税率") = Nothing
    dr("成本差额税") = Nothing
Else
    \'dr("成本差额税率") = 25
    dr("成本差额税") = dr("成本差额") * dr("成本差额税率") / 100
End If
\'企业所得税\\个人所得税\\管理费计算
If dr.IsNull("企业所得税基数") OrElse dr.IsNull("企业所得税率")Then \'为空
    dr("企业所得税") = Nothing
ElseIf dr("企业所得税基数") ="合同金额"  Then
    dr("企业所得税") = dr("合同金额") * dr("企业所得税率") / 100
ElseIf dr("企业所得税基数") ="发票金额"  Then
    dr("企业所得税") = dr("发票金额") * dr("企业所得税率") / 100
ElseIf dr("企业所得税基数") ="申请金额"  Then
    dr("企业所得税") = dr("申请金额") * dr("企业所得税率") / 100
ElseIf dr("企业所得税基数") ="计量金额"  Then
    dr("企业所得税") = dr("计量金额") * dr("企业所得税率") / 100
End If

If dr.IsNull("个人所得税基数") OrElse dr.IsNull("个人所得税率")  Then \'为空
    dr("个人所得税") = Nothing
ElseIf dr("个人所得税基数") ="合同金额"  Then
    dr("个人所得税") = dr("合同金额") * dr("个人所得税率") / 100
ElseIf dr("个人所得税基数") ="发票金额"  Then
    dr("个人所得税") = dr("发票金额") * dr("个人所得税率") / 100
ElseIf dr("个人所得税基数") ="申请金额"  Then
    dr("个人所得税") = dr("申请金额") * dr("个人所得税率") / 100
ElseIf dr("个人所得税基数") ="计量金额"  Then
    dr("个人所得税") = dr("计量金额") * dr("个人所得税率") / 100
End If

If dr.IsNull("计费基数") OrElse dr.IsNull("管理费费率")Then \'为空
    dr("管理费") = Nothing
ElseIf dr("计费基数") ="合同金额"  Then
    dr("管理费") = dr("合同金额") * dr("管理费费率") / 100
ElseIf dr("计费基数") ="发票金额"  Then
    dr("管理费") = dr("发票金额") * dr("管理费费率") / 100
ElseIf dr("计费基数") ="申请金额"  Then
    dr("管理费") = dr("申请金额") * dr("管理费费率") / 100
ElseIf dr("计费基数") ="计量金额"  Then
    dr("管理费") = dr("计量金额") * dr("管理费费率") / 100
End If
[此贴子已经被作者于2019/1/25 22:06:54编辑过]

--  作者:有点蓝
--  发布时间:2019/1/25 22:22:00
--  
这种情况,表的数据越多,sqlCompute的效率就越高,反之加载后再Compute的效率就高。给后台表加上必要的索引。

可以自己测试是哪段代码费时:
Dim dr As DataRow = Tables("工程款管理").current.DataRow
If dr("审批状态") = "已审批完成" Then
    MessageBox.Show("已审批完成的项目不能再进行计算!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    e.Cancel = True
    Return
End If
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
Dim filter As String = "合同编码=\'" & dr("合同编码") & "\'and 计量期数=\'" & dr("计量期数") & "\'"
Output.Show(dr("新老项目"))
If dr("新老项目") = "新项目" Then \'为空
    Dim Filter1 As String= "合同编码=\'" & dr("合同编码") & "\'"
    With e.Form.Controls("开票日期")
        If .Value IsNot Nothing Then
            Dim d As Date = .value
            Dim d2 As Date = new Date(d.year, d.Month, 15)
            d2 = d2.AddMonths(1)
            Filter1 &= " and 寄达日期 <= \'" & d2 & "\'"
        End If
    End With
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
    Dim sum1 As Double = DataTables("进项票审核").sqlCompute("sum(税额)", filter1 & " and 审核状态=\'已审核\' and 类别=\'专票\'")
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
    Dim sum2 As Double = 0
    For i As Integer = 1 To dr("计量期数")-1
        sum2 += val(dr.DataTable.datarows(i-1)("本期统计增值税"))
    Next
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
    \'dr("本期统计增值税")= sum1-sum2
    dr("本期统计增值税") = DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'专票\'")
    dr("本期统计成本发票") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')") + DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'普票\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')")
    dr("本期统计人工工资") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\'  and 工料机类别=\'人工\'") + DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'普票\' and 工料机类别=\'人工\'")
Else
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
    dr("本期统计增值税") = DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'专票\'")  \'不分时段计算
    dr("本期统计成本发票") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')") + DataTables("进项票审核").sqlCompute("sum(税额)", filter & " And 审核状态=\'已审核\' and 类别=\'普票\' and 工料机类别 in (\'材料\',\'机械\',\'管理\')")
    dr("本期统计人工工资") = DataTables("进项票审核").sqlCompute("sum(税后金额)", filter & " And 审核状态=\'已审核\' and 工料机类别=\'人工\'")
End If
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
\'成本发票及人工工资
If dr("应缴增值税基数") =Nothing Then \'为空
    dr("成本基数") = Nothing
ElseIf dr("应缴增值税基数") ="合同金额" Then
    dr("成本基数") = dr("合同金额")
Else If dr("应缴增值税基数") ="发票金额" Then
    dr("成本基数") = dr("发票金额")
Else If dr("应缴增值税基数") ="计量金额" Then
    dr("成本基数") = dr("计量金额")
Else If dr("应缴增值税基数") ="申请金额" Then
    dr("成本基数") = dr("申请金额")
End If
Output.Show(Format(Date.Now,"HH:mm:ss.ffff"))
……