Foxtable(狐表)用户栏目专家坐堂 → [求助]老师帮忙改下代码让执行效率高点


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

主题:[求助]老师帮忙改下代码让执行效率高点

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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
[求助]老师帮忙改下代码让执行效率高点  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By: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

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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/1/8 21:41:00 [显示全部帖子]

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

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

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

 

 

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


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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/1/8 22:01:00 [显示全部帖子]

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


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


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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/1/8 22:23:00 [显示全部帖子]

执行结果正确了,但效率还是不理想,工序表中目前有18000条数据,我选了一组只有10条记录的卷,执行时间用了8秒。
代码执行中,好像是用了整张表的卷号去比对。
[此贴子已经被作者于2015-1-8 22:27:55编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1105 积分:8967 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2015/1/9 8:10:00 [显示全部帖子]

太好了,这段代码执行效率太快了,我把第一行代码改了一下就能全表计算了:Dim drs As List(Of DataRow) = DataTables("工序合并表").Select("", "卷号,起始时间")
这段代码比最早有点甜老师写给我的高了好多,看来编程效率的提高是个大学问啊!

 回到顶部