ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 850|回复: 4

[求助] BOM递归过程中扣除库存数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-11-13 20:07 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
递归代码是COPY论坛 里面,做了些调整而已因数据是直连SQL数据库导出来的
要做MRP
现在得把订单跑到最后一阶BOM,然后再把库存跑遍最后一阶BOM,来计算生产订单的线上在制库存
  1. Sub 月物料需求()
  2. Application.ScreenUpdating = False '//关闭屏幕刷新
  3.     Application.DisplayAlerts = False '//关闭系统提示
  4.     Application.EnableEvents = False  '//禁止触发其他事件
  5. 'On Error Resume Next
  6. Set d = CreateObject("scripting.dictionary")
  7. Set dic = CreateObject("scripting.dictionary")
  8. Set d1 = CreateObject("scripting.dictionary")
  9. Set d2 = CreateObject("scripting.dictionary")
  10. Dim t!
  11. t = Timer
  12. Call OpenErp
  13. SQL = "select pk_material,code,name from bd_material"
  14. DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
  15. Arr = DBRst.GetRows
  16. For i = 0 To UBound(Arr, 2)
  17. d(Arr(0, i)) = Arr(1, i) & "|" & Arr(2, i)
  18. dic(CStr(Arr(1, i))) = Arr(0, i)
  19. Next
  20. 'Sheet2.Cells(1, 1).Resize(UBound(arr) + 1, UBound(arr, 2) + 1) = arr
  21. Call CloseErp
  22. Call CloseErp
  23. Call OpenErp
  24. SQL = "select cmaterialoid,sum(nonhandnum) from StockOnHand t1 left join bd_stordoc t2 on t1.cwarehouseid=t2.pk_stordoc where stockdate=(select MAX(stockdate) from StockOnHand) and t2.name like '%线上仓%' group by cmaterialoid"
  25. DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
  26. Arr = DBRst.GetRows
  27. Call CloseErp
  28. For i = 0 To UBound(Arr)
  29. d1(Arr(0, i)) = Arr(1, i)
  30. Next
  31. Call OpenErp
  32. SQL = "select 物料编码,bom版本,sum(数量) from (select x2.name as 类型,cmaterialvid as 物料编码,cbomversionid  as bom版本,x1.nplanputnum-isnull(x1.nwrnum,0) as 数量 from (select t1.vbillcode,t2.cmaterialvid,cdeptvid,cbomversionid,t2.nplanputnum,t2.nwrnum from (select distinct cpmohid,dbilldate,vbillcode from mm_pmo  where  dbilldate  >= '2019-11-01 00:00:00'  and dr = 0  AND fbillstatus=1 AND ctrantypeid='0001A910000000002F40') t1 " & _
  33. "Left Join (SELECT cpmohid,cmaterialvid,cdeptvid,nplanputnum,nwrnum,cbomversionid from mm_mo where   mm_mo.dr = 0 and fitemstatus!=3 and  fitemstatus!=2) t2 " & _
  34. "on t1.cpmohid=t2.cpmohid where t2.cmaterialvid is not null) x1 left join org_dept_v x2 on x1.cdeptvid=x2.pk_vid  union all select '外加工' as 类型,t2.pk_material  as 物料编码,t2.vbomversion as bom版本,t2.nnum-ISNULL(naccumstorenum,0) as 数量  from sc_order t1 left join sc_order_b t2 on t1.pk_order=t2.pk_order where dbilldate>'2019-11-01 00:00:00' and t1.dr=0 and t2.dr=0 and t1.fstatusflag=3 and t2.nnum-ISNULL(naccumstorenum,0)>0) m1 group by 物料编码,bom版本"
  35. DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
  36. Arr = DBRst.GetRows
  37. For i = 0 To UBound(Arr, 2)
  38. If Len(Arr(1, i)) > 10 Then
  39. m2 = m2 & ",'" & Arr(1, i) & "'"
  40. m1 = m1 & ",'" & Arr(0, i) & "'"
  41. End If
  42. Next
  43. 'Sheet5.[a1].Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1) = Arr
  44. Call OpenErp
  45. SQL = "select t1.hcmaterialid,t2.cmaterialid,nitemnum,ndissipationum,t1.cbomid  from bd_bom t1 left join   bd_bom_b t2 on t1.cbomid=t2.cbomid where t2.dr<>1 and  t1.cbomid in  (" & Mid(m2, 2) & ") union all " & _
  46. "select t1.hcmaterialid,t2.cmaterialid,nitemnum,ndissipationum,t1.hversion  from (select cbomid,hversion,hvnote,hcmaterialid from (select no =row_number() over (partition by hcmaterialid order by ts desc), * from bd_bom) t where no=1) t1 left join   bd_bom_b t2 on t1.cbomid=t2.cbomid where t2.dr<>1 and  hcmaterialid not in  (" & Mid(m1, 2) & ")"
  47. DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
  48. arx = DBRst.GetRows
  49. Call CloseErp
  50. ReDim brr(1 To 20000, 1 To 5)
  51.   ReDim brr1(1 To 20000, 1 To 5)
  52. For i = 0 To UBound(Arr, 2)
  53.   ID_cp = Arr(0, i)
  54.    bbh = Arr(1, i)
  55.     kk = 0
  56.     cp = Arr(0, i)
  57.     ReDim BRX(1 To 3, 1 To 1)
  58.       ReDim krx(1 To 3, 1 To 1)
  59.     Call KCBOM(ID_cp, Arr(2, i))
  60.     crx = Application.Transpose(Application.Transpose(BRX))
  61.     crx1 = Application.Transpose(Application.Transpose(krx))
  62.     For b = 1 To UBound(crx, 2)
  63.     m = m + 1
  64. If d.exists(crx(1, b)) Then
  65. brr(m, 1) = "'" & Split(d(crx(1, b)), "|")(0)
  66. brr(m, 2) = Split(d(crx(1, b)), "|")(1)
  67. Else
  68. s1 = s1 & "," & "'" & Arr(0, i)
  69. End If
  70. If d.exists(crx(2, b)) Then
  71. brr(m, 3) = "'" & Split(d(crx(2, b)), "|")(0)
  72. brr(m, 4) = Split(d(crx(2, b)), "|")(1)
  73. End If
  74. brr(m, 5) = crx(3, b)
  75. Next
  76. For b = 1 To UBound(crx1, 2)
  77. If Len(crx1(1, b)) > 10 Then
  78.     mm = mm + 1
  79. d2(d(crx1(2, b))) = d2(d(crx1(2, b))) + crx1(3, b)
  80. End If
  81. Next
  82. Next
  83. Sheet3.Range("a1").Resize(m, 5) = brr
  84. Sheet4.Range("a1").Resize(1, d2.Count) = d2.keys
  85. Sheet4.Range("a2").Resize(1, d2.Count) = d2.items
  86. MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒" '//提示所用时间

  87. Application.EnableEvents = True  '//禁止触发其他事件
  88.     Application.DisplayAlerts = True '//关闭系统提示
  89. Application.ScreenUpdating = True '//关闭屏幕刷新

  90. End Sub
复制代码
想在订单拆解BOM过程中,直接扣除d1(Arr(0, i)) 这个的库存数据

递归过程减库存数据.rar

35.87 KB, 下载次数: 14

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-13 20:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
月 周计划,导入数据库,运行月周计划时,扣除已入库量,计算净生产需求的物料需求量,再计算在制订单的线上结余数据, 库存的物料结余,得出物料净需求,再去匹配订单信息,计算下单需求

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-14 06:03 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-11-14 07:47 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
表格没有数据,建议模拟一下结果,方便大家一起研究。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-14 13:21 | 显示全部楼层
zpy2 发表于 2019-11-14 07:47
表格没有数据,建议模拟一下结果,方便大家一起研究。

连接SQL数据库的,没数据,,,只有拆解到最后一阶BOM的需求量,,不知道中间过程如何来扣,换字典代替递归的方法,运行太慢了,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 00:33 , Processed in 0.040443 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表