Foxtable(狐表)用户栏目专家坐堂 → if 分支多了增加行很慢


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

主题:if 分支多了增加行很慢

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


加好友 发短信
等级:九尾狐 帖子:2472 积分:22812 威望:0 精华:0 注册:2011/3/29 17:14:00
if 分支多了增加行很慢  发帖心情 Post By:2022/4/22 18:53:00 [只看该作者]

下面的代码增加行很慢  是代码问题吗  怎么优化 


For Each Name As String In Names
                Dim wr As Row = Tables("订单_产品主表").Current
                Dim nr As Row = Tables("订单_产品清单").AddNew
                nr("报价分类") = wr("报价分类")
                nr("订单类别") = wr("订单类别")
                nr("订单信息") = wr("订单信息")
                nr("客户信息") = wr("客户信息")
                nr("订单ID") = wr("订单ID")
                nr("报价ID") = wr("报价ID")
                nr("客户信息") = wr("客户信息")
                nr("区域楼层") = wr("区域楼层")
                nr("区域名称") = wr("区域名称")
                nr("产品订购ID") = wr("产品订购ID")
                nr("产品_构件名称") = Name
                nr("产品模块") = "木作报价"
                nr("产品分类") = wr("产品分类")
                nr("客户信息") = wr("客户信息")
                nr("日期") = Date.Today
                
                If nr("产品_构件名称").Contains("柜体") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = wr("厚")
                    nr("数量") = 1
                    nr("计价单位") = "投影面积"
                ElseIf nr("产品_构件名称").Contains("柜门") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = 22
                    nr("数量") = 1
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("见光") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("厚") + 100
                    nr("厚") = 18
                    nr("数量") = 1
                    nr("计价单位") = "平方米"                    
                ElseIf nr("产品_构件名称").Contains("台面") Then
                    nr("长") = wr("长")
                    nr("数量") = 1
                    nr("计价单位") = "延米"                    
                ElseIf nr("产品_构件名称").Contains("灯光") Then
                    nr("长") = wr("长")
                    nr("数量") = 3
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("变压") Then
                    nr("数量") = 1
                    nr("计价单位") = "套"
                ElseIf nr("产品_构件名称").Contains("衣杆") Then
                    nr("数量") = wr("长") * 2.5
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("门铰") Then
                    nr("数量") = (wr("长") * wr("宽")*0.0001) / 15
                    Round2(nr("数量"),1)
                    nr("计价单位") = "个"
                ElseIf nr("产品_构件名称").Contains("抽") Then
                    nr("数量") = (wr("长") * wr("宽")*0.000001) / 3.5
                    nr("计价单位") = "件"
                ElseIf nr("产品_构件名称").Contains("墙板") Then
                    nr("数量") = (wr("长") * wr("宽")*0.000001) * 1.05
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("线") Then
                    nr("数量") = wr("长") + 200
                    nr("计价单位") = "延米"
                Else
                End If
            Next
        Else
            Forms("产品清单").Open
        End If


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7249 积分:40704 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2022/4/22 19:03:00 [只看该作者]

Dim wr As Row = Tables("订单_产品主表").Current
Dim nr As Row
For Each Name As String In Names
                nr = Tables("订单_产品清单").AddNew
                nr("报价分类") = wr("报价分类")
                nr("订单类别") = wr("订单类别")
                nr("订单信息") = wr("订单信息")
                nr("客户信息") = wr("客户信息")
                nr("订单ID") = wr("订单ID")
                nr("报价ID") = wr("报价ID")
                nr("客户信息") = wr("客户信息")
                nr("区域楼层") = wr("区域楼层")
                nr("区域名称") = wr("区域名称")
                nr("产品订购ID") = wr("产品订购ID")
                nr("产品_构件名称") = Name
                nr("产品模块") = "木作报价"
                nr("产品分类") = wr("产品分类")
                nr("客户信息") = wr("客户信息")
                nr("日期") = Date.Today
                
                If nr("产品_构件名称").Contains("柜体") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = wr("厚")
                    nr("数量") = 1
                    nr("计价单位") = "投影面积"
                ElseIf nr("产品_构件名称").Contains("柜门") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = 22
                    nr("数量") = 1
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("见光") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("厚") + 100
                    nr("厚") = 18
                    nr("数量") = 1
                    nr("计价单位") = "平方米"                    
                ElseIf nr("产品_构件名称").Contains("台面") Then
                    nr("长") = wr("长")
                    nr("数量") = 1
                    nr("计价单位") = "延米"                    
                ElseIf nr("产品_构件名称").Contains("灯光") Then
                    nr("长") = wr("长")
                    nr("数量") = 3
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("变压") Then
                    nr("数量") = 1
                    nr("计价单位") = "套"
                ElseIf nr("产品_构件名称").Contains("衣杆") Then
                    nr("数量") = wr("长") * 2.5
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("门铰") Then
                    nr("数量") = (wr("长") * wr("宽")*0.0001) / 15
                    Round2(nr("数量"),1)
                    nr("计价单位") = "个"
                ElseIf nr("产品_构件名称").Contains("抽") Then
                    nr("数量") = (wr("长") * wr("宽")*0.000001) / 3.5
                    nr("计价单位") = "件"
                ElseIf nr("产品_构件名称").Contains("墙板") Then
                    nr("数量") = (wr("长") * wr("宽")*0.000001) * 1.05
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("线") Then
                    nr("数量") = wr("长") + 200
                    nr("计价单位") = "延米"
                Else
                End If
            Next
        Else
            Forms("产品清单").Open
        End If



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


加好友 发短信 一级勋章
等级:超级版主 帖子:7249 积分:40704 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2022/4/22 19:04:00 [只看该作者]

代码不全,最前面少了if判断

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


加好友 发短信
等级:九尾狐 帖子:2472 积分:22812 威望:0 精华:0 注册:2011/3/29 17:14:00
  发帖心情 Post By:2022/4/22 19:41:00 [只看该作者]

 完整代码 老师看看

Case "新增明细"
        pause = True
        If Tables("订单_产品主表").Current Is Nothing Then '如果Current为Nothing
            MessageBox.Show("没有报价资源",Vars("昵称"))
            Return "" '则返回
        End If
        If DataTables.Contains("订单_产品清单") = False Then '如果表C没有加载
            DataTables.Load("订单_产品清单") '加载表C
        End If
               
            Dim r As Row = Tables("订单_产品主表").Current
            If r IsNot Nothing
                Dim Cols1() As String = {"区域名称","区域楼层","产品名称","长","宽","厚","订单ID"}
                For Each c As String In Cols1
                    If r.IsNull(c) Then
                        r.DataRow.SetError(c, "不能为空")
                        MessageBox.Show(c &"不能为空",Vars("昵称"))
                        Return ""
                    End If
                Next
            End If
            
            Dim cmd As New SQLC ommand
            cmd.ConnectionNa me = "2022"
            cmd.CommandT ext = "Sel ect * From {系统_数据模块}"
            wdt = cmd.Execute Reader()
            Dim dr As Data Row
            '否则在产品表查找同名的产品行,将找到的行赋值给变量dr
            dr = wdt.SQLFind("[模块类别]  ='木作报价模块'and [模块名称] = '"& Tables("订单_产品主表").Current("产品分类") & "'" )
            Dim Value As String = dr("参数_A")
            Dim sps() As Char = {"|"}
            Dim Names() As String  = Value.Split(sps)
            'If e.Form.Controls("同空间").Checked = True Then
            For Each Name As String In Names
                Dim wr As Row = Tables("订单_产品主表").Current
                Dim nr As Row = Tables("订单_产品清单").AddNew
                nr("报价分类") = wr("报价分类")
                nr("订单类别") = wr("订单类别")
                nr("订单信息") = wr("订单信息")
                nr("客户信息") = wr("客户信息")
                nr("订单ID") = wr("订单ID")
                nr("报价ID") = wr("报价ID")
                nr("客户信息") = wr("客户信息")
                nr("区域楼层") = wr("区域楼层")
                nr("区域名称") = wr("区域名称")
                nr("产品订购ID") = wr("产品订购ID")
                nr("产品_构件名称") = Name
                nr("产品模块") = "木作报价"
                nr("产品分类") = wr("产品分类")
                nr("客户信息") = wr("客户信息")
                nr("日期") = Date.Today
                
                If nr("产品_构件名称").Contains("柜体") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = wr("厚")
                    nr("数量") = 1
                    nr("计价单位") = "投影面积"
                ElseIf nr("产品_构件名称").Contains("柜门") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = 22
                    nr("数量") = 1
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("见光") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("厚") + 100
                    nr("厚") = 18
                    nr("数量") = 1
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("台面") Then
                    nr("长") = wr("长")
                    nr("数量") = 1
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("灯光") Then
                    nr("长") = wr("长")
                    nr("数量") = 3
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("变压") Then
                    nr("数量") = 1
                    nr("计价单位") = "套"
                ElseIf nr("产品_构件名称").Contains("衣杆") Then
                    nr("数量") = wr("长") * 2.5
                    nr("计价单位") = "延米"
                ElseIf nr("产品_构件名称").Contains("门铰") Then
                    nr("数量") = (wr("长") * wr("宽")*0.0001) / 15
                    Round2(nr("数量"),1)
                    nr("计价单位") = "个"
                ElseIf nr("产品_构件名称").Contains("抽") Then
                    nr("数量") = (wr("长") * wr("宽")*0.000001) / 3.5
                    nr("计价单位") = "件"
                ElseIf nr("产品_构件名称").Contains("墙板") Then
                    nr("长") = wr("长")
                    nr("宽") = wr("宽")
                    nr("厚") = wr("厚")
                    nr("数量") = 1
                    nr("计价单位") = "平方米"
                ElseIf nr("产品_构件名称").Contains("线") Then
                    nr("数量") = wr("长") + 200
                    nr("计价单位") = "延米"
                Else
                End If
            Next
       

[此贴子已经被作者于2022/4/22 23:41:52编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7249 积分:40704 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2022/4/23 0:27:00 [只看该作者]

也只能这样了,快不到哪里去,区区几个判断并不影响速度,检查前面的代码:

Case "新增明细"
    pause = True
    If Tables("订单_产品主表").Current Is Nothing Then '如果Current为Nothing
    MessageBox.Show("没有报价资源", Vars("昵称"))
    Return "" '则返回
    End If
    If DataTables.Contains("订单_产品清单") = False Then '如果表C没有加载
    DataTables.Load("订单_产品清单") '加载表C
    End If

    Dim r As Row = Tables("订单_产品主表").Current
    If r IsNot Nothing Then
    Dim Cols1() As String = {"区域名称", "区域楼层", "产品名称", "长", "宽", "厚", "订单ID" }
    For Each c As String In Cols1
        If r.IsNull(c) Then
        r.DataRow.SetError(c, "不能为空")
        MessageBox.Show(c & "不能为空", Vars("昵称"))
        Return ""
        End If
    Next
    End If

    Dim cmd As New SQLC ommand
    cmd.ConnectionNa Me = "2022"
    cmd.CommandT ext = "Sel ect * From {系统_数据模块}"
    wdt = cmd.Execute Reader()
    Dim dr As Data Row
    '否则在产品表查找同名的产品行,将找到的行赋值给变量dr
    dr = wdt.SQLFind("[模块类别]  ='木作报价模块'and [模块名称] = '" & Tables("订单_产品主表").Current("产品分类") & "'")
    Dim Value As String = dr("参数_A")
    Dim Names(), Values() As String
    Names = Value.Split("|")
    'If e.Form.Controls("同空间").Checked = True Then
    Dim wr As Row = Tables("订单_产品主表").Current
    Dim s As String = "报价分类|订单类别|订单信息|客户信息|订单ID|报价ID|客户信息|区域楼层|区域名称|产品订购ID|产品分类|客户信息"
     Values = S.Split("|")
    For Each Name As String In Names
        Dim nr As Row = Tables("订单_产品清单").AddNew
        For Index As Integer = 0 To Values.Length - 1 '优点:以后不管增减多少父子表相同字段,只需改变变量S的值即可
            nr(Values(Index)) = (Values(Index))
        Next
        nr("产品_构件名称") = Name
        nr("产品模块") = "木作报价"
        nr("日期") = Date.Today
        If nr("产品_构件名称").Contains("柜体") Then
        nr("长") = wr("长")
        nr("宽") = wr("宽")
        nr("厚") = wr("厚")
        nr("数量") = 1
        nr("计价单位") = "投影面积"
        ElseIf nr("产品_构件名称").Contains("柜门") Then
            nr("长") = wr("长")
            nr("宽") = wr("宽")
            nr("厚") = 22
            nr("数量") = 1
            nr("计价单位") = "平方米"
        ElseIf nr("产品_构件名称").Contains("见光") Then
            nr("长") = wr("长")
            nr("宽") = wr("厚") + 100
            nr("厚") = 18
            nr("数量") = 1
            nr("计价单位") = "平方米"
        ElseIf nr("产品_构件名称").Contains("台面") Then
            nr("长") = wr("长")
            nr("数量") = 1
            nr("计价单位") = "延米"
        ElseIf nr("产品_构件名称").Contains("灯光") Then
            nr("长") = wr("长")
            nr("数量") = 3
            nr("计价单位") = "延米"
        ElseIf nr("产品_构件名称").Contains("变压") Then
            nr("数量") = 1
            nr("计价单位") = "套"
        ElseIf nr("产品_构件名称").Contains("衣杆") Then
            nr("数量") = wr("长") * 2.5
            nr("计价单位") = "延米"
        ElseIf nr("产品_构件名称").Contains("门铰") Then
            nr("数量") = (wr("长") * wr("宽") * 0.0001) / 15
            Round2(nr("数量"), 1)
            nr("计价单位") = "个"
        ElseIf nr("产品_构件名称").Contains("抽") Then
            nr("数量") = (wr("长") * wr("宽") * 0.000001) / 3.5
            nr("计价单位") = "件"
        ElseIf nr("产品_构件名称").Contains("墙板") Then
            nr("长") = wr("长")
            nr("宽") = wr("宽")
            nr("厚") = wr("厚")
            nr("数量") = 1
            nr("计价单位") = "平方米"
        ElseIf nr("产品_构件名称").Contains("线") Then
            nr("数量") = wr("长") + 200
            nr("计价单位") = "延米"
        Else
        End If
    Next

您的代码依然不全!

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109504 积分:557188 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/4/23 9:46:00 [只看该作者]

换种方式替代if判断,比如增加一个公式表,类似下面

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

然后if分支可以改为查表处理
Dim dr As DataRow = DataTables("表C").Find("构件名称='" & nr("产品_构件名称") & "'")
If dr IsNot Nothing Then
    If dr.IsNull("长") = False Then
        nr("长") = Eval(dr("长").replace("[长]", wr("长")).replace("[宽]", wr("宽")).replace("[厚]", wr("厚")))
    End If
    If dr.IsNull("宽") = False Then
        nr("宽") = Eval(dr("宽").replace("[长]", wr("长")).replace("[宽]", wr("宽")).replace("[厚]", wr("厚")))
    End If
    If dr.IsNull("厚") = False Then
        nr("厚") = Eval(dr("厚").replace("[长]", wr("长")).replace("[宽]", wr("宽")).replace("[厚]", wr("厚")))
    End If
    If dr.IsNull("数量") = False Then
        nr("数量") = Eval(dr("数量").replace("[长]", wr("长")).replace("[宽]", wr("宽")).replace("[厚]", wr("厚")))
    End If
    nr("计价单位") = dr("计价单位")
End If


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


加好友 发短信
等级:九尾狐 帖子:2472 积分:22812 威望:0 精华:0 注册:2011/3/29 17:14:00
  发帖心情 Post By:2022/4/24 20:50:00 [只看该作者]

查出来了 收了外部其他判断代码的影响 去除后正常了

 回到顶部