|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
递归代码是COPY论坛 里面,做了些调整而已因数据是直连SQL数据库导出来的
要做MRP
现在得把订单跑到最后一阶BOM,然后再把库存跑遍最后一阶BOM,来计算生产订单的线上在制库存
- Sub 月物料需求()
- Application.ScreenUpdating = False '//关闭屏幕刷新
- Application.DisplayAlerts = False '//关闭系统提示
- Application.EnableEvents = False '//禁止触发其他事件
- 'On Error Resume Next
- Set d = CreateObject("scripting.dictionary")
- Set dic = CreateObject("scripting.dictionary")
- Set d1 = CreateObject("scripting.dictionary")
- Set d2 = CreateObject("scripting.dictionary")
- Dim t!
- t = Timer
- Call OpenErp
- SQL = "select pk_material,code,name from bd_material"
- DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
- Arr = DBRst.GetRows
- For i = 0 To UBound(Arr, 2)
- d(Arr(0, i)) = Arr(1, i) & "|" & Arr(2, i)
- dic(CStr(Arr(1, i))) = Arr(0, i)
- Next
- 'Sheet2.Cells(1, 1).Resize(UBound(arr) + 1, UBound(arr, 2) + 1) = arr
- Call CloseErp
- Call CloseErp
- Call OpenErp
- 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"
- DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
- Arr = DBRst.GetRows
- Call CloseErp
- For i = 0 To UBound(Arr)
- d1(Arr(0, i)) = Arr(1, i)
- Next
- Call OpenErp
- 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 " & _
- "Left Join (SELECT cpmohid,cmaterialvid,cdeptvid,nplanputnum,nwrnum,cbomversionid from mm_mo where mm_mo.dr = 0 and fitemstatus!=3 and fitemstatus!=2) t2 " & _
- "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版本"
- DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
- Arr = DBRst.GetRows
- For i = 0 To UBound(Arr, 2)
- If Len(Arr(1, i)) > 10 Then
- m2 = m2 & ",'" & Arr(1, i) & "'"
- m1 = m1 & ",'" & Arr(0, i) & "'"
- End If
- Next
- 'Sheet5.[a1].Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1) = Arr
- Call OpenErp
- 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 " & _
- "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) & ")"
- DBRst.Open SQL, ConnDB, adOpenKeyset, adLockOptimistic
- arx = DBRst.GetRows
- Call CloseErp
- ReDim brr(1 To 20000, 1 To 5)
- ReDim brr1(1 To 20000, 1 To 5)
- For i = 0 To UBound(Arr, 2)
- ID_cp = Arr(0, i)
- bbh = Arr(1, i)
- kk = 0
- cp = Arr(0, i)
- ReDim BRX(1 To 3, 1 To 1)
- ReDim krx(1 To 3, 1 To 1)
- Call KCBOM(ID_cp, Arr(2, i))
- crx = Application.Transpose(Application.Transpose(BRX))
- crx1 = Application.Transpose(Application.Transpose(krx))
- For b = 1 To UBound(crx, 2)
- m = m + 1
- If d.exists(crx(1, b)) Then
- brr(m, 1) = "'" & Split(d(crx(1, b)), "|")(0)
- brr(m, 2) = Split(d(crx(1, b)), "|")(1)
- Else
- s1 = s1 & "," & "'" & Arr(0, i)
- End If
- If d.exists(crx(2, b)) Then
- brr(m, 3) = "'" & Split(d(crx(2, b)), "|")(0)
- brr(m, 4) = Split(d(crx(2, b)), "|")(1)
- End If
- brr(m, 5) = crx(3, b)
- Next
- For b = 1 To UBound(crx1, 2)
- If Len(crx1(1, b)) > 10 Then
- mm = mm + 1
- d2(d(crx1(2, b))) = d2(d(crx1(2, b))) + crx1(3, b)
- End If
- Next
- Next
- Sheet3.Range("a1").Resize(m, 5) = brr
- Sheet4.Range("a1").Resize(1, d2.Count) = d2.keys
- Sheet4.Range("a2").Resize(1, d2.Count) = d2.items
- MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒" '//提示所用时间
- Application.EnableEvents = True '//禁止触发其他事件
- Application.DisplayAlerts = True '//关闭系统提示
- Application.ScreenUpdating = True '//关闭屏幕刷新
- End Sub
复制代码 想在订单拆解BOM过程中,直接扣除d1(Arr(0, i)) 这个的库存数据
|
|