以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  运算速度问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=186444)

--  作者:朱女士
--  发布时间: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("实时工序计算表")

--  作者:有点蓝
--  发布时间:2023/5/4 8:53:00
--  
考虑用sql处理,使用的什么数据库,可以做个例子发上来看看
--  作者:朱女士
--  发布时间:2023/5/4 9:42:00
--  
用的是access.我的数据表如下截图:我是用清单条码编码和工序名称相同的总实际耗时,用每一行的实际耗时占总耗时的比重分劈每一行的重量或件数。也是我第一个问题的表,从这个表中看出,我的第一个问题代码,有的就是没算出来。



--  作者:朱女士
--  发布时间:2023/5/4 9:43:00
--  

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

--  作者:有点蓝
--  发布时间:2023/5/4 10:02:00
--  
请上传实例测试
--  作者:朱女士
--  发布时间: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





--  作者:朱女士
--  发布时间: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("计算完毕!", "提示!")

谢谢老师!

--  作者:有点蓝
--  发布时间:2023/5/4 11:02:00
--  
要测试的。光看代码看不出什么
--  作者:朱女士
--  发布时间:2023/5/4 11:05:00
--  
可以将两个计算放在一个模块中,我为了调试分开计算的。
--  作者:程兴刚
--  发布时间:2023/5/4 11:15:00
--  
代码首尾加入暂停和重启事件的代码,效率瞬间翻倍。