以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  下面这段代码处理少的数据还比较快,数据量多了就卡死,可以怎么改善  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=135537)

--  作者:yetle
--  发布时间:2019/5/29 10:52:00
--  下面这段代码处理少的数据还比较快,数据量多了就卡死,可以怎么改善
Tables("分派工序_table8").save()
For Each dr As Row In Tables("分派工序_table8").rows
    For Each br As Row In Tables("分派工序_table5").rows
Dim hpr = DataTables("派发工序表").Find("[订单号] = \'" & br("订单号")  & "\' and [制单号] = \'" & br("制单号")  & "\'and [箱号] = \'" & br("箱号")  & "\' and [工序号] = \'" & dr("工序号")  & "\'")
    If hpr IsNot Nothing Then
       If dr("生产员工") <> hpr("生产员工") Or dr("生产员工工号") <> hpr("生产员工工号")  Then
        hpr("生产员工") = dr("生产员工")
        hpr("生产员工工号") = dr("生产员工工号")
       End If
       If dr("生产员工1") <> hpr("生产员工1") Or dr("生产员工1工号") <> hpr("生产员工1工号")  Then
        hpr("生产员工1") = dr("生产员工1")
        hpr("生产员工1工号") = dr("生产员工1工号")
       End If
       If dr("生产员工2") <> hpr("生产员工2") Or dr("生产员工2工号") <> hpr("生产员工2工号")  Then
        hpr("生产员工2") = dr("生产员工2")
        hpr("生产员工2工号") = dr("生产员工2工号")
       End If
       If dr("生产员工3") <> hpr("生产员工3") Or dr("生产员工3工号") <> hpr("生产员工3工号")  Then
        hpr("生产员工3") = dr("生产员工3")
        hpr("生产员工3工号") = dr("生产员工3工号")
       End If
       If dr("生产员工4") <> hpr("生产员工4") Or dr("生产员工4工号") <> hpr("生产员工4工号")  Then
        hpr("生产员工4") = dr("生产员工4")
        hpr("生产员工4工号") = dr("生产员工4工号")
       End If
       If dr("生产员工5") <> hpr("生产员工5") Or dr("生产员工5工号") <> hpr("生产员工5工号")  Then
        hpr("生产员工5") = dr("生产员工5")
        hpr("生产员工5工号") = dr("生产员工5工号")
       End If
       If dr("工序号") <> hpr("工序号") Then
        hpr("工序号")  = dr("工序号") 
       End If
       If dr("工序名") <> hpr("工序名") Then
        hpr("工序名")  = dr("工序名") 
       End If
       If dr("车种") <> hpr("车种") Then
        hpr("车种")  = dr("车种")
       End If
       If dr("部门") <> hpr("部门") Then
        hpr("部门")  = dr("部门") 
       End If
       If dr("工价") <> hpr("工价") Then
        hpr("工价")  = dr("工价")
       End If
       If dr("基本工价") <> hpr("基本工价") Then
        hpr("基本工价")  = dr("基本工价")
       End If
       If dr("工价系数") <> hpr("工价系数") Then
        hpr("工价系数")  = dr("工价系数")
       End If
       If dr("标准工时") <> hpr("标准工时") Then
        hpr("标准工时")  = dr("标准工时")
       End If

Else
        Dim pr As DataRow = DataTables("派发工序表").addnew
        pr("订单号") = br("订单号")
        pr("制单号") = br("制单号")
        pr("客款号") = br("客款号")
        pr("货品名") = br("货品名")
        pr("物供号") = br("物供号")
        pr("部门") = br("部门")
        pr("组别") = br("班组")
        pr("款号") = br("款号")
        pr("颜色") = br("颜色")
        pr("尺码") = br("尺码")
        pr("件数") = br("件数")
        pr("箱号") = br("箱号")
        pr("工段") = br("工段")
        pr("鼎邦制单数ID") = br("鼎邦制单数ID")
        pr("工序号") = dr("工序号")
        pr("工序名") = dr("工序名")
        pr("标准工时") = dr("标准工时")
        pr("车种") = dr("车种")
        pr("部门") = dr("部门")
        pr("工价") = dr("工价")
        pr("基本工价") = dr("基本工价")
        pr("工价系数") = dr("工价系数")
        pr("生产员工") = dr("生产员工")
        pr("生产员工1") = dr("生产员工1")
        pr("生产员工2") = dr("生产员工2")
        pr("生产员工3") = dr("生产员工3")
        pr("生产员工4") = dr("生产员工4")
        pr("生产员工5") = dr("生产员工5")
        pr("生产员工工号") = dr("生产员工工号")
        pr("生产员工1工号") = dr("生产员工1工号")
        pr("生产员工2工号") = dr("生产员工2工号")
        pr("生产员工3工号") = dr("生产员工3工号")
        pr("生产员工4工号") = dr("生产员工4工号")
        pr("生产员工5工号") = dr("生产员工5工号")

        pr("条码") = br("订单号") & br("制单号") & br("款号") & br("箱号")
End If
     Next
Next

Tables("派发工序表").save()

--  作者:有点甜
--  发布时间:2019/5/29 10:54:00
--  

1、如果把这段去掉

 

Dim hpr = DataTables("派发工序表").Find("[订单号] = \'" & br("订单号")  & "\' and [制单号] = \'" & br("制单号")  & "\'and [箱号] = \'" & br("箱号")  & "\' and [工序号] = \'" & dr("工序号")  & "\'")

 

改成

 

Dim hpr = Nothing

 

测试一下速度

 

2、看看你 【派发工序表】 datacolchanged等事件,是否写有耗时代码。

 

 


--  作者:yetle
--  发布时间:2019/5/29 12:03:00
--  

 【派发工序表】所有事件都没有写代码

 

卡死是假死现象,等待时间长还是可以处理成功的,只是等待时间会比较长
[此贴子已经被作者于2019/5/29 12:04:10编辑过]

--  作者:有点甜
--  发布时间:2019/5/29 12:45:00
--  
如果把这段去掉

 

Dim hpr = DataTables("派发工序表").Find("[订单号] = \'" & br("订单号")  & "\' and [制单号] = \'" & br("制单号")  & "\'and [箱号] = \'" & br("箱号")  & "\' and [工序号] = \'" & dr("工序号")  & "\'")

 

改成

 

Dim hpr = Nothing

 

测试一下速度。上传具体实例测试。


--  作者:yetle
--  发布时间:2019/5/30 19:34:00
--  
老师,测试了,这个条件不要也差不多时间,更何况这个条件是必须加的,一次性要生产十万甚至几十万行数据,有没有办法做一个后台数据处理,这样就不至于卡在那动不了
[此贴子已经被作者于2019/5/30 19:57:34编辑过]

--  作者:有点甜
--  发布时间:2019/5/30 19:57:00
--  
以下是引用yetle在2019/5/30 19:34:00的发言:
老师,测试了,这个条件不要也差不多时间,更何况这个条件是必须加的,有没有办法做一个后台数据处理,这样就不至于卡在那动不了

 

1、加上 http://www.foxtable.com/webhelp/scr/0401.htm

 

2、加上 http://www.foxtable.com/webhelp/scr/2218.htm

 

3、可以写成一个函数,然后异步调用这个函数,就可以不影响你当前操作,慢慢让其运行了。

[此贴子已经被作者于2019/5/30 19:56:54编辑过]

--  作者:yetle
--  发布时间:2019/5/30 20:50:00
--  
参照帮助的代码
With DataTables("订单")
    .StopRedraw
    
For As Integer 1 To 500
        .AddNew()
    
Next
    .ResumeRedraw

End
 
With

我将下面代码增加了.ResumeRedraw和.StopRedraw,是不是这么加的,加了之后就会快?



Tables("分派工序_table8").save()
.StopRedraw
For Each dr As Row In Tables("分派工序_table8").rows
    For Each br As Row In Tables("分派工序_table5").rows
Dim hpr = DataTables("派发工序表").Find("[订单号] = \'" & br("订单号")  & "\' and [制单号] = \'" & br("制单号")  & "\'and [箱号] = \'" & br("箱号")  & "\' and [工序号] = \'" & dr("工序号")  & "\'")
    If hpr IsNot Nothing Then
       If dr("生产员工") <> hpr("生产员工") Or dr("生产员工工号") <> hpr("生产员工工号")  Then
        hpr("生产员工") = dr("生产员工")
        hpr("生产员工工号") = dr("生产员工工号")
       End If
       If dr("生产员工1") <> hpr("生产员工1") Or dr("生产员工1工号") <> hpr("生产员工1工号")  Then
        hpr("生产员工1") = dr("生产员工1")
        hpr("生产员工1工号") = dr("生产员工1工号")
       End If
       If dr("生产员工2") <> hpr("生产员工2") Or dr("生产员工2工号") <> hpr("生产员工2工号")  Then
        hpr("生产员工2") = dr("生产员工2")
        hpr("生产员工2工号") = dr("生产员工2工号")
       End If
       If dr("生产员工3") <> hpr("生产员工3") Or dr("生产员工3工号") <> hpr("生产员工3工号")  Then
        hpr("生产员工3") = dr("生产员工3")
        hpr("生产员工3工号") = dr("生产员工3工号")
       End If
       If dr("生产员工4") <> hpr("生产员工4") Or dr("生产员工4工号") <> hpr("生产员工4工号")  Then
        hpr("生产员工4") = dr("生产员工4")
        hpr("生产员工4工号") = dr("生产员工4工号")
       End If
       If dr("生产员工5") <> hpr("生产员工5") Or dr("生产员工5工号") <> hpr("生产员工5工号")  Then
        hpr("生产员工5") = dr("生产员工5")
        hpr("生产员工5工号") = dr("生产员工5工号")
       End If
       If dr("工序号") <> hpr("工序号") Then
        hpr("工序号")  = dr("工序号") 
       End If
       If dr("工序名") <> hpr("工序名") Then
        hpr("工序名")  = dr("工序名") 
       End If
       If dr("车种") <> hpr("车种") Then
        hpr("车种")  = dr("车种")
       End If
       If dr("部门") <> hpr("部门") Then
        hpr("部门")  = dr("部门") 
       End If
       If dr("工价") <> hpr("工价") Then
        hpr("工价")  = dr("工价")
       End If
       If dr("基本工价") <> hpr("基本工价") Then
        hpr("基本工价")  = dr("基本工价")
       End If
       If dr("工价系数") <> hpr("工价系数") Then
        hpr("工价系数")  = dr("工价系数")
       End If
       If dr("标准工时") <> hpr("标准工时") Then
        hpr("标准工时")  = dr("标准工时")
       End If

Else
        Dim pr As DataRow = DataTables("派发工序表").addnew
        pr("订单号") = br("订单号")
        pr("制单号") = br("制单号")
        pr("客款号") = br("客款号")
        pr("货品名") = br("货品名")
        pr("物供号") = br("物供号")
        pr("部门") = br("部门")
        pr("组别") = br("班组")
        pr("款号") = br("款号")
        pr("颜色") = br("颜色")
        pr("尺码") = br("尺码")
        pr("件数") = br("件数")
        pr("箱号") = br("箱号")
        pr("工段") = br("工段")
        pr("鼎邦制单数ID") = br("鼎邦制单数ID")
        pr("工序号") = dr("工序号")
        pr("工序名") = dr("工序名")
        pr("标准工时") = dr("标准工时")
        pr("车种") = dr("车种")
        pr("部门") = dr("部门")
        pr("工价") = dr("工价")
        pr("基本工价") = dr("基本工价")
        pr("工价系数") = dr("工价系数")
        pr("生产员工") = dr("生产员工")
        pr("生产员工1") = dr("生产员工1")
        pr("生产员工2") = dr("生产员工2")
        pr("生产员工3") = dr("生产员工3")
        pr("生产员工4") = dr("生产员工4")
        pr("生产员工5") = dr("生产员工5")
        pr("生产员工工号") = dr("生产员工工号")
        pr("生产员工1工号") = dr("生产员工1工号")
        pr("生产员工2工号") = dr("生产员工2工号")
        pr("生产员工3工号") = dr("生产员工3工号")
        pr("生产员工4工号") = dr("生产员工4工号")
        pr("生产员工5工号") = dr("生产员工5工号")

        pr("条码") = br("订单号") & br("制单号") & br("款号") & br("箱号")
End If
     Next
Next
.ResumeRedraw
Tables("派发工序表").save()

--  作者:有点甜
--  发布时间:2019/5/30 21:16:00
--  

DataTables("派发工序表").StopRedraw

 

DataTables("派发工序表").ResumeRedraw


--  作者:yetle
--  发布时间:2019/5/30 22:47:00
--  
老师,处理几千行数据还挺快,一次性处理上十万条数据必须卡死。这个怎么解决?
--  作者:有点甜
--  发布时间:2019/5/30 23:35:00
--  
以下是引用yetle在2019/5/30 22:47:00的发言:
老师,处理几千行数据还挺快,一次性处理上十万条数据必须卡死。这个怎么解决?

 

这个无解。10万行,是两个表的乘积(一个表1000行,一个表100行),还是说每个表都10万行?

 

具体问题,做一个实例发上来测试。