Foxtable(狐表)用户栏目专家坐堂 → 运算速度问题


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

主题:运算速度问题

美女呀,离线,留言给我吧!
朱女士
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:4073 威望:0 精华:0 注册:2020/2/8 11:14:00
运算速度问题  发帖心情 Post By:2023/5/4 8:35:00 [只看该作者]

老师您好!
 我有一个计算模块,运算速度成了一个难题,我的数据表里只有不到6万条数据,但是计算需要30多分钟。我想请教的问题是:还有没有比我的代码运算速度更快的方法。谢谢指教!
我的代码:
DataTables("实时工序计算表").LoadFilter = ""
DataTables("实时工序计算表").load()

Dim zl As Double
Dim js As Integer
Dim tms As New List(Of String)
Dim gxs As New List(Of String)
'数据升序排序
Tables("ddqdb").Sort = "清单条码编码"
Tables("实时工序计算表").Sort = "清单条码编码"

Dim er As DataRow
er = DataTables("实时工序计算表").DataRows(0)
Dim qm As String
qm = er("清单条码编码")
'筛选ddqdb
DataTables("ddqdb").LoadFilter = "[清单条码编码]>= '" & qm & "'"
DataTables("ddqdb").load()
Dim Arys As List(Of String()) 
Arys = DataTables("实时工序计算表").GetValues("清单条码编码|工序名称") 
For Each Ary As String() In Arys
    Dim pr As DataRow = DataTables("ddqdb").find("清单条码编码='" & Ary(0) & "'")
    'MessageBox.Show(ary(0), ary(1))
    If pr IsNot Nothing Then
        zl = pr("重量")
        js = pr("件每台") * pr("台数") 
        Dim gxhs As Double = DataTables("实时工序计算表").Compute("Sum(实际耗时)", "清单条码编码= '" & Ary(0) & "' and 工序名称='" & Ary(1) & "'")
        
        '查询符合条件的多条记录
        For Each dts As DataRow In DataTables("实时工序计算表").Select("清单条码编码= '" & Ary(0) & "' and 工序名称='" & Ary(1) & "'")
            If dts IsNot Nothing Then 
                dts("已分劈") = "f"
                Dim dhs As Double = dts("实际耗时")
                dts("重量") = Round2(dhs / gxhs * zl, 2)
                dts("件数") = Round2(dhs / gxhs * js, 2)
            Else
            MessageBox.Show("查无数据")
            End if
        Next
    End If 
Next


MessageBox.show("计算完毕!", "提示!")

e.Form.Close
MainTable = Tables("实时工序计算表")

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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/4 8:53:00 [只看该作者]

考虑用sql处理,使用的什么数据库,可以做个例子发上来看看

 回到顶部
美女呀,离线,留言给我吧!
朱女士
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:4073 威望:0 精华:0 注册:2020/2/8 11:14:00
  发帖心情 Post By:2023/5/4 9:42:00 [只看该作者]

用的是access.我的数据表如下截图:我是用清单条码编码和工序名称相同的总实际耗时,用每一行的实际耗时占总耗时的比重分劈每一行的重量或件数。也是我第一个问题的表,从这个表中看出,我的第一个问题代码,有的就是没算出来。



 回到顶部
美女呀,离线,留言给我吧!
朱女士
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:4073 威望:0 精华:0 注册:2020/2/8 11:14:00
  发帖心情 Post By:2023/5/4 9:43:00 [只看该作者]


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

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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/4 10:02:00 [只看该作者]

请上传实例测试

 回到顶部
美女呀,离线,留言给我吧!
朱女士
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:4073 威望:0 精华:0 注册:2020/2/8 11:14:00
  发帖心情 Post By:2023/5/4 11:01:00 [只看该作者]

老师您好!
  我的数据表共有三个:1、一个是员工实时扫码表,清单条码编码,员工姓名和工序实时扫码基础数据,2、qqddb ,是客户产品信息数据表。3、实时工序表是计算表,这个表的数据都是来源于前两个表。重量和件数都是来源于ddqdb。员工姓名、用时、工序名称等都来源于扫码表,“清单条码编码”是三个表的共同标识。我的问题涉及了“实时计算表”的两个分劈计算,1、是实际耗时的计算。就是同一个人同时开工扫码多个清单条码,要根据开工时间和bs将工序耗时,按照重量、件数比例等进行工序耗时分劈成实际耗时。2、同一清单,同一工序的工作,只有一个重量和件数,如果多人做同一工序,或一个人多次扫同一个工序同一条码,要按照实际耗时比重再分劈每个工序的“数量和件数”。老师麻烦您给我解决上述两个计算的两个问题:1、是计算速度问题,2 是第一个计算有的实际耗时不计算,内容为空。
我的第一个计算的代码为:
Dim Result As DialogResult
Result = MessageBox.Show("您是从头计算所有数据(y),还是接着上次计算(n)?","提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

If Result = DialogResult.Yes Then
    DataTables("车间扫码表").LoadFilter = ""
    DataTables("车间扫码表").Load
    For Each dr As DataRow In DataTables("车间扫码表").DataRows
        If dr("jsf") IsNot Nothing Then
            dr("jsf") = Nothing
        End If
    Next
'    MessageBox.Show("从头算大约需要12分钟...")
    '如果从头计算还要清空表
    DataTables("实时工序计算表").deletefor("")
    DataTables("实时工序明细表").deletefor("")
End If


''1、加载表
DataTables("车间扫码表").LoadFilter = ""
DataTables("车间扫码表").Load
Tables("ddqdb").Sort = "清单条码编码"

Dim fr As DataRow
fr = DataTables("车间扫码表").DataRows(0)
DataTables("ddqdb").LoadFilter = "[清单条码编码]>='" & fr("清单条码编码") & "'"
DataTables("ddqdb").Load

DataTables("车间扫码表").LoadFilter = "[jsf] is null"
DataTables("车间扫码表").Load


'2、将车间扫描表逐行镜像写入实时工序计算表

Dim Cols1() As String = {"日期", "清单条码编码", "ygdm", "员工姓名", "gxdm", "工序名称", "开工时间", "结束时间", "工序耗时", "jsbm1", "bs" }
Dim Cols2() As String = {"日期", "清单条码编码", "ygdm", "员工姓名", "gxdm", "工序名称", "开工时间", "结束时间", "工序耗时", "jsbm1", "bs" }

For Each dr1 As DataRow In DataTables("车间扫码表").DataRows
    dr1("jsf") = "√"

    Dim dr2 As DataRow = DataTables("实时工序计算表").AddNew()
    For i As Integer = 0 To Cols1.Length - 1
        dr2(Cols2(i)) = dr1(Cols1(i)) 
    Next
Next


''3、工序填入顺序号
For Each er As DataRow In DataTables("实时工序计算表").DataRows
    Dim gm As String = er("gxdm")
    Dim tm As String = er("清单条码编码")

    Dim br As DataRow = DataTables("gxdmb").find("gxdm='" & gm & "'")
    If br IsNot Nothing Then
        er("顺序号") = br("顺序号")
    End If
    Dim ur As DataRow = DataTables("ddqdb").find("清单条码编码='" & tm & "'")
    If ur IsNot Nothing Then
        If ur("结算单位") = "重量" Then
            er("重量") = ur("重量") '填入重量
        Else If ur("结算单位") = "数量" Then
            er("件数") = ur("件每台") * ur("台数")
        End If
    End If 
Next



''以下是’bs'数组
''依据bs长度的计算实际耗时方法:长度l=18时,为一个人同时扫多个条码,这样工序耗时按重量劈开就是实际耗时。
Dim drs As List(Of DataRow)
Dim Nas As New List(Of String) 'bs长度18
Dim Nbs As New List(Of String) 'bs长度6
Dim Ncs As New List(Of String) 'bs长度12
Dim l As Integer

Dim Arys As List(Of String()) 
Arys = DataTables("实时工序计算表").GetValues("bs|开工时间") 
For Each Ary As String() In Arys

    Dim zzl As Double = DataTables("实时工序计算表").sqlCompute("sum(重量)", "bs='" & Ary(0) & "'and  开工时间 = #" & Ary(1) & "#")
    drs = DataTables("实时工序计算表").Select("[bs]='" & Ary(0) & "'and 开工时间 = #" & Ary(1) & "#")
    
    For Each dr As DataRow In drs
        If dr IsNot Nothing Then
            
            Dim gxhs As Double = dr("工序耗时")
            Dim dzl As Double = dr("重量")
            Dim sjhs As Double = Round2((dzl * gxhs / zzl), 2)
            
            If sjhs <> 0 Then
             MessageBox.Show(dzl & "/" & sjhs & "/" & dr("bs"))
             
                dr("实际耗时") = Round2((dzl * gxhs / zzl), 2)
            Else
                MessageBox.Show(ary(1))
            end if
        End if
    Next 
    
Next

MainTable = Tables("实时工序计算表")

Forms("实时工序优速计算").close





 回到顶部
美女呀,离线,留言给我吧!
朱女士
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:4073 威望:0 精华:0 注册:2020/2/8 11:14:00
  发帖心情 Post By:2023/5/4 11:02:00 [只看该作者]

第二个计算的代码:
ataTables("实时工序计算表").LoadFilter = ""
DataTables("实时工序计算表").load()

Dim zl As Double
Dim js As Integer
Dim tms As New List(Of String)
Dim gxs As New List(Of String)
'数据升序排序
Tables("ddqdb").Sort = "清单条码编码"
Tables("实时工序计算表").Sort = "清单条码编码"

Dim er As DataRow
er = DataTables("实时工序计算表").DataRows(0)
Dim qm As String
qm = er("清单条码编码")
'筛选ddqdb
DataTables("ddqdb").LoadFilter = "[清单条码编码]>= '" & qm & "'"
DataTables("ddqdb").load()
Dim Arys As List(Of String()) 
Arys = DataTables("实时工序计算表").GetValues("清单条码编码|工序名称") 
For Each Ary As String() In Arys
    Dim pr As DataRow = DataTables("ddqdb").find("清单条码编码='" & Ary(0) & "'")
    'MessageBox.Show(ary(0), ary(1))
    If pr IsNot Nothing Then
        zl = pr("重量")
        js = pr("件每台") * pr("台数") 
        Dim gxhs As Double = DataTables("实时工序计算表").Compute("Sum(实际耗时)", "清单条码编码= '" & Ary(0) & "' and 工序名称='" & Ary(1) & "'")
        
        '查询符合条件的多条记录
        For Each dts As DataRow In DataTables("实时工序计算表").Select("清单条码编码= '" & Ary(0) & "' and 工序名称='" & Ary(1) & "'")
            If dts IsNot Nothing Then 
                dts("已分劈") = "f"
                Dim dhs As Double = dts("实际耗时")
                dts("重量") = Round2(dhs / gxhs * zl, 2)
                dts("件数") = Round2(dhs / gxhs * js, 2)
            Else
            MessageBox.Show("查无数据")
            End if
        Next
    End If 
Next


MessageBox.show("计算完毕!", "提示!")

谢谢老师!

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


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/4 11:02:00 [只看该作者]

要测试的。光看代码看不出什么

 回到顶部
美女呀,离线,留言给我吧!
朱女士
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:4073 威望:0 精华:0 注册:2020/2/8 11:14:00
  发帖心情 Post By:2023/5/4 11:05:00 [只看该作者]

可以将两个计算放在一个模块中,我为了调试分开计算的。

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


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

代码首尾加入暂停和重启事件的代码,效率瞬间翻倍。

 回到顶部
总数 16 1 2 下一页