以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]老师帮忙改下代码让执行效率高点  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=62817)

--  作者:huangfanzi
--  发布时间:2015/1/8 15:13:00
--  [求助]老师帮忙改下代码让执行效率高点
工序合并表数据样式如下:
工序            卷号                        母卷号           库存标记  重量
原料入库     CS150001               CS150001         F          1000
材料分切     CS150001A             CS150001        T          500
材料分切     CS150001B             CS150001        F          500
材料分切     CS150001BA           CS150001        T          250
材料分切     CS150001BA           CS150001        T          250

原料入库     CS150002               CS150002         F          1000
材料分切     CS150002A             CS150002        T          500
材料分切     CS150002B             CS150002        T          500

......


目前代码如下:
Dim i As Integer=0
Do While i < Tables("工序合并表").Rows.Count
Dim r As Row = Tables("工序合并表").Rows(i)
If Tables("工序合并表").Find( r("卷号"),i+1,"卷号",False, False, False)>-1 Then
r("库存标记")=False
Else r("库存标记")=True
End If
i=i+1
Loop

代码功能:
根据卷号来判断哪一步为此卷的最后一步工序,也就是此步的重量才是真正的库存重量,此时库存标记的值变为TRUE

目前问题:
当工序发生变化后必须执行上述代码以达到标识出库存的目的,但目前的代码很没效率,目前工序表中有18000条记录,执行上面的代码用了近30秒,实际使用时,并不用全部重算,只要重算某个指定母卷号所对应的相关的记录就行了,例如上面代码如何改,能达到计算得到母卷号为CS150001的相关记录的库存标记,其他的母卷号不计算。
谢谢老师!
[此贴子已经被作者于2015-1-8 15:13:52编辑过]

--  作者:Bin
--  发布时间:2015/1/8 15:23:00
--  
SQLcommand 执行SQL语句查询

"select top 1 * fr om {工序合并表} where 卷号= \'" & r("卷号") & "\' order by _SortKey"

--  作者:huangfanzi
--  发布时间:2015/1/8 15:36:00
--  
BIN老师,你的代码不会用啊,
.NET Framework 版本:2.0.50727.6421
Foxtable 版本:2014.10.23.1
错误所在事件:
详细错误信息:
语法错误 在查询表达式 \'_SortKey\' 中。
[此贴子已经被作者于2015-1-8 15:39:43编辑过]

--  作者:有点甜
--  发布时间:2015/1/8 15:41:00
--  
For Each dr As DataRow In DataTables("工序合并表").Select("母卷号 = \'CS150001\'", "卷号")
    If DataTables("工序合并表").Find("卷号 like \'" & dr("卷号") & "%\'") IsNot Nothing  Then
        dr("库存标记")=False
    Else
        dr("库存标记")=True
    End If
Next

--  作者:Bin
--  发布时间:2015/1/8 15:45:00
--  
[_SortKey] 加上括号
--  作者:huangfanzi
--  发布时间:2015/1/8 15:59:00
--  
有点甜老师,这段代码的思路看懂了,但有点问题,是我举的例子不够完整,我把例子写完整点。

工序            卷号                        母卷号           库存标记  重量
原料入库     CS150001               CS150001         F          1000
材料分切     CS150001A             CS150001        T          500
材料分切     CS150001B             CS150001        F          500
材料分切     CS150001BA           CS150001        T          250
材料分切     CS150001BA           CS150001        F          250
打包入库     CS150001BA           CS150001        T          250

另外,用老师写的代码,我去运行了下,发现指定的母卷的库存标记全部清空了,也就是全变成了FALSE

--  作者:有点甜
--  发布时间:2015/1/8 16:24:00
--  
For Each dr As DataRow In DataTables("工序合并表").Select("母卷号 = \'CS150001\'", "卷号")
    If DataTables("工序合并表").Find("卷号 like \'" & dr("卷号") & "%\' and _Identify <> " & dr("_Identify")) IsNot Nothing  Then
        dr("库存标记")=False
    Else
        dr("库存标记")=True
    End If
Next

--  作者:huangfanzi
--  发布时间:2015/1/8 21:41:00
--  

有点甜老师,你的代码执行结果不对,我上传了附件,项目打开后就会有个下停靠窗口,窗口中有二个按钮,

左边哪个就是目前我用了,其实也是之前有点甜老师帮我写的,这段代码能正确执行,但效率太差,

右边哪个是按钮放着上面有点甜老师的代码,执行结果不正确。

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:库存标记的有效率执行.rar


--  作者:有点甜
--  发布时间:2015/1/8 21:47:00
--  

 这个意思?

 

For Each dr As DataRow In DataTables("工序表").Select("母卷号 = \'CS141001\'", "开始时间")
    If DataTables("工序表").Find("卷号 = \'" & dr("卷号") & "\' and 开始时间 > #" & dr("开始时间") & "#") IsNot Nothing  Then
        dr("库存标记")=False
    Else
        dr("库存标记")=True
    End If
Next


--  作者:huangfanzi
--  发布时间:2015/1/8 22:01:00
--  

还是不对,我把例子改了下,注意表中第一条记录,不应该打上库存标记,因为一个卷在加工中由于断裂变成了二个卷,这时原来哪个卷实际已经不存在了,断后的二个卷分别在原来卷号后面加上A与B


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:库存标记的有效率执行new.rar