Định mức nguyên vật liệu

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Code này tính luôn ra Material request.
LIệt kê mặt hàng cần sản xuất và số lượng (Manufacturing order), nhấn nút chạy ra chi tiết tất cả thành phần, sau đó dùng Pivot table tổng hợp lại thành material request.
Code này cải tiến từ ý tưởng nối item của Dic từ đại ca @HieuCD
Mã:
Public Material(), SQty(), SProduct(), Result(), IsBOM()
Public m As Long, ManufactQty As Long, LastRw As Long
Public Dict1, NewPrqty As Double, InitialProduct As String
Sub Run()
Dim MOrder(), LRw As Long, ikey As String
ReDim Result(1 To 50000, 1 To 8)
LRw = Sheet2.[A10000].End(xlUp).Row
MOrder = Sheet2.Range("A4:C" & LRw).Value
Sheet2.Range("F4:L300000").ClearContents
Application.ScreenUpdating = False
With Sheets("BOM")
    .AutoFilterMode = 0
    LastRw = .Cells(100000, 1).End(xlUp).Row
    SProduct = .Range("A2:A" & LastRw).Value
    Material = .Range("D2:F" & LastRw).Value
    SQty = .Range("G2:G" & LastRw).Value
End With
t = Timer
Set Dict1 = CreateObject("scripting.dictionary")
    For i = 1 To UBound(SProduct, 1)
            ikey = SProduct(i, 1)
            Dict1.Item(ikey) = Dict1.Item(ikey) & "|" & i
    Next

For i = 1 To UBound(MOrder, 1)
    InitialProduct = MOrder(i, 1)
    ManufactQty = MOrder(i, 3)
    CalculateBOM InitialProduct, ManufactQty
Next
If m > 0 Then
    ActiveSheet.[F4].Resize(m, 8) = Result
End If
Erase Material, SQty, SProduct, Result
Set Dict1 = Nothing
InitialProduct = "": ManufactQty = 0: m = 0
Application.ScreenUpdating = True
MsgBox Timer - t & " seconds", , "Ptm0412"
End Sub
'______________________________'
Sub CalculateBOM(ByVal Product As String, ByVal PrQty As Double)
    Dim S As Variant
  
    S = Split(Dict1.Item(Product), "|")
    For i = 1 To UBound(S)
        j = Val(S(i))
            If Not Dict1.exists(CStr(Material(j, 1))) Then
                m = m + 1
                Result(m, 1) = InitialProduct
                Result(m, 2) = ManufactQty
                Result(m, 3) = Material(j, 1)
                Result(m, 4) = Material(j, 2)
                Result(m, 5) = Material(j, 3)
                Result(m, 7) = SQty(j, 1) * PrQty
                Result(m, 6) = Result(m, 7) / ManufactQty
                Result(m, 8) = Product
            Else
                NewPrqty = SQty(j, 1)
                CalculateBOM Material(j, 1), NewPrqty * PrQty
            End If
    Next i
End Sub

File tính mẫu 13 mặt hàng trong đó 3 dòng đầu có BTP

View attachment 305867

Kết quả 476 chi tiết, Tổng hợp 129 loại nguyên liệu cần dùng


View attachment 305868
Cảm ơn Bro đã hỗ trợ tận khuya. Tí nữa đến cty mình sẽ test code. Mình sẽ phản hồi lại kết quả cho các bro. Hy vọng nó sẽ chạy smooth
 
Kiểm tra lại . . .
Mã:
Option Explicit

Sub xyz()
  Dim arr(), bom2(), bom3(), aTD(), a
  Dim dSP As Object, d As Object, d2 As Object, b2 As Object, b3 As Object
  Dim sR&, sC&, i&, r2&, r3&, k&, c&, j&, vt$

  Set d = CreateObject("scripting.dictionary")
  Set d2 = CreateObject("scripting.dictionary")
  Set dSP = CreateObject("scripting.dictionary")
  Set b2 = CreateObject("scripting.dictionary")
  Set b3 = CreateObject("scripting.dictionary")
 
  aTD = Sheets("BOM2").Range("A2:C3").Value 'Mang dong tieu de
  sC = UBound(aTD, 2) 'So cot tieu de thong tin vat tu
  With Sheets("BOM1")
    arr = .Range("A2", .Range("G" & Rows.Count).End(xlUp)).Value
  End With
  sR = UBound(arr)
 
  For i = 1 To sR
    d(arr(i, 1)) = d(arr(i, 1)) & "," & i
    d2(arr(i, 4)) = ""
  Next i
  For i = 1 To sR 'Loc San Pham
    If d2.exists(arr(i, 1)) = False Then
      If dSP.exists(arr(i, 1)) = False Then
        sC = sC + 1
        dSP(arr(i, 1)) = sC
        ReDim Preserve aTD(1 To 2, 1 To sC)
        aTD(1, sC) = arr(i, 2)
        aTD(2, sC) = arr(i, 1)
      End If
    End If
  Next
  ReDim bom2(1 To sR, 1 To sC)
  ReDim bom3(1 To sR, 1 To sC)
 
  For c = 4 To sC
    a = Split(d(aTD(2, c)), ",")
    For j = 1 To UBound(a)
      i = CLng(a(j))
      vt = arr(i, 4)
      If b2.exists(vt) = False Then
        r2 = r2 + 1
        b2(vt) = r2
      End If
      k = b2(vt)
      bom2(k, 1) = arr(i, 4):      bom2(k, 2) = arr(i, 5)
      bom2(k, 3) = arr(i, 6):      bom2(k, c) = bom2(k, c) + arr(i, 7)

      If b3.exists(vt) = False Then
        r3 = r3 + 1
        b3(vt) = r3
      End If
      k = b3(vt)
      bom3(k, 1) = arr(i, 4):      bom3(k, 2) = arr(i, 5)
      bom3(k, 3) = arr(i, 6):      bom3(k, c) = bom3(k, c) + arr(i, 7)
      If d.exists(vt) Then
        Call DeQui(arr, bom2, bom3, d, b2, b3, r2, r3, c, Split(d(vt), ","), arr(i, 7))
      End If
    Next j
  Next c
  Sheets("BOM2").Range("A2").Resize(2, sC) = aTD
  Sheets("BOM2").Range("A4").Resize(r2, sC) = bom2
  Sheets("BOM3").Range("A2").Resize(2, sC) = aTD
  Sheets("BOM3").Range("A4").Resize(r3, sC) = bom3
End Sub

Sub DeQui(arr, bom2, bom3, d, b2, b3, r2, r3, c, ByVal a, ByVal sl#)
  Dim vt$, j&, i&, k&
    For j = 1 To UBound(a)
      i = CLng(a(j))
      vt = arr(i, 4)
      If b2.exists(vt) = False Then
        r2 = r2 + 1
        b2(vt) = r2
      End If
      k = b2(vt)
      bom2(k, 1) = arr(i, 4):      bom2(k, 2) = arr(i, 5)
      bom2(k, 3) = arr(i, 6):      bom2(k, c) = bom2(k, c) + arr(i, 7) * sl

      If d.exists(vt) Then
        Call DeQui(arr, bom2, bom3, d, b2, b3, r2, r3, c, Split(d(vt), ","), arr(i, 7) * sl)
      Else
        If b3.exists(vt) = False Then
          r3 = r3 + 1
          b3(vt) = r3
        End If
        k = b3(vt)
        bom3(k, 1) = arr(i, 4):      bom3(k, 2) = arr(i, 5)
        bom3(k, 3) = arr(i, 6):      bom3(k, c) = bom3(k, c) + arr(i, 7) * sl
      End If
    Next j
End Sub
Em cảm ơn bác ạ. Code ra đúng kết quả em mong muốn rồi ạ.
Tuy nhiên khi em thay dữ liệu thật vào thì báo lỗi Out of stack space ạ.
Có thể là do dữ liệu của em bị quá lớn, số lượng TP khoảng hơn 300 mã ạ.
 
Code này tính luôn ra Material request.
LIệt kê mặt hàng cần sản xuất và số lượng (Manufacturing order), nhấn nút chạy ra chi tiết tất cả thành phần, sau đó dùng Pivot table tổng hợp lại thành material request.
Code này cải tiến từ ý tưởng nối item của Dic từ đại ca @HieuCD
Mã:
Public Material(), SQty(), SProduct(), Result(), IsBOM()
Public m As Long, ManufactQty As Long, LastRw As Long
Public Dict1, NewPrqty As Double, InitialProduct As String
Sub Run()
Dim MOrder(), LRw As Long, ikey As String
ReDim Result(1 To 50000, 1 To 8)
LRw = Sheet2.[A10000].End(xlUp).Row
MOrder = Sheet2.Range("A4:C" & LRw).Value
Sheet2.Range("F4:L300000").ClearContents
Application.ScreenUpdating = False
With Sheets("BOM")
    .AutoFilterMode = 0
    LastRw = .Cells(100000, 1).End(xlUp).Row
    SProduct = .Range("A2:A" & LastRw).Value
    Material = .Range("D2:F" & LastRw).Value
    SQty = .Range("G2:G" & LastRw).Value
End With
t = Timer
Set Dict1 = CreateObject("scripting.dictionary")
    For i = 1 To UBound(SProduct, 1)
            ikey = SProduct(i, 1)
            Dict1.Item(ikey) = Dict1.Item(ikey) & "|" & i
    Next

For i = 1 To UBound(MOrder, 1)
    InitialProduct = MOrder(i, 1)
    ManufactQty = MOrder(i, 3)
    CalculateBOM InitialProduct, ManufactQty
Next
If m > 0 Then
    ActiveSheet.[F4].Resize(m, 8) = Result
End If
Erase Material, SQty, SProduct, Result
Set Dict1 = Nothing
InitialProduct = "": ManufactQty = 0: m = 0
Application.ScreenUpdating = True
MsgBox Timer - t & " seconds", , "Ptm0412"
End Sub
'______________________________'
Sub CalculateBOM(ByVal Product As String, ByVal PrQty As Double)
    Dim S As Variant
  
    S = Split(Dict1.Item(Product), "|")
    For i = 1 To UBound(S)
        j = Val(S(i))
            If Not Dict1.exists(CStr(Material(j, 1))) Then
                m = m + 1
                Result(m, 1) = InitialProduct
                Result(m, 2) = ManufactQty
                Result(m, 3) = Material(j, 1)
                Result(m, 4) = Material(j, 2)
                Result(m, 5) = Material(j, 3)
                Result(m, 7) = SQty(j, 1) * PrQty
                Result(m, 6) = Result(m, 7) / ManufactQty
                Result(m, 8) = Product
            Else
                NewPrqty = SQty(j, 1)
                CalculateBOM Material(j, 1), NewPrqty * PrQty
            End If
    Next i
End Sub

File tính mẫu 13 mặt hàng trong đó 3 dòng đầu có BTP

View attachment 305867

Kết quả 476 chi tiết, Tổng hợp 129 loại nguyên liệu cần dùng


View attachment 305868
Code này tính luôn ra Material request.
LIệt kê mặt hàng cần sản xuất và số lượng (Manufacturing order), nhấn nút chạy ra chi tiết tất cả thành phần, sau đó dùng Pivot table tổng hợp lại thành material request.
Code này cải tiến từ ý tưởng nối item của Dic từ đại ca @HieuCD
Mã:
Public Material(), SQty(), SProduct(), Result(), IsBOM()
Public m As Long, ManufactQty As Long, LastRw As Long
Public Dict1, NewPrqty As Double, InitialProduct As String
Sub Run()
Dim MOrder(), LRw As Long, ikey As String
ReDim Result(1 To 50000, 1 To 8)
LRw = Sheet2.[A10000].End(xlUp).Row
MOrder = Sheet2.Range("A4:C" & LRw).Value
Sheet2.Range("F4:L300000").ClearContents
Application.ScreenUpdating = False
With Sheets("BOM")
    .AutoFilterMode = 0
    LastRw = .Cells(100000, 1).End(xlUp).Row
    SProduct = .Range("A2:A" & LastRw).Value
    Material = .Range("D2:F" & LastRw).Value
    SQty = .Range("G2:G" & LastRw).Value
End With
t = Timer
Set Dict1 = CreateObject("scripting.dictionary")
    For i = 1 To UBound(SProduct, 1)
            ikey = SProduct(i, 1)
            Dict1.Item(ikey) = Dict1.Item(ikey) & "|" & i
    Next

For i = 1 To UBound(MOrder, 1)
    InitialProduct = MOrder(i, 1)
    ManufactQty = MOrder(i, 3)
    CalculateBOM InitialProduct, ManufactQty
Next
If m > 0 Then
    ActiveSheet.[F4].Resize(m, 8) = Result
End If
Erase Material, SQty, SProduct, Result
Set Dict1 = Nothing
InitialProduct = "": ManufactQty = 0: m = 0
Application.ScreenUpdating = True
MsgBox Timer - t & " seconds", , "Ptm0412"
End Sub
'______________________________'
Sub CalculateBOM(ByVal Product As String, ByVal PrQty As Double)
    Dim S As Variant
  
    S = Split(Dict1.Item(Product), "|")
    For i = 1 To UBound(S)
        j = Val(S(i))
            If Not Dict1.exists(CStr(Material(j, 1))) Then
                m = m + 1
                Result(m, 1) = InitialProduct
                Result(m, 2) = ManufactQty
                Result(m, 3) = Material(j, 1)
                Result(m, 4) = Material(j, 2)
                Result(m, 5) = Material(j, 3)
                Result(m, 7) = SQty(j, 1) * PrQty
                Result(m, 6) = Result(m, 7) / ManufactQty
                Result(m, 8) = Product
            Else
                NewPrqty = SQty(j, 1)
                CalculateBOM Material(j, 1), NewPrqty * PrQty
            End If
    Next i
End Sub

File tính mẫu 13 mặt hàng trong đó 3 dòng đầu có BTP

View attachment 305867

Kết quả 476 chi tiết, Tổng hợp 129 loại nguyên liệu cần dùng


View attachment 305868
Thanks Bro, Mình chạy code này trong Excel thì Office chặn luôn rồi. Nhờ Bro thông não giúp case này với1732589999531.png
 
Thanks Bro, Mình chạy code này trong Excel thì Office chặn luôn rồi. Nhờ Bro thông não giúp case này với
Muốn được giúp đỡ thì bạn không nên viết Tiếng Việt lẫn lộn tiếng Tây thế này, người đọc rất khó chịu, Tây thì Tây hẳn luôn đi.
 
Cũng liên quan đến vấn đề tương tự như thế này, nhờ các cao nhân chỉ giúp file này với ạ.
Sheet DATA của bên em cũng có khoảng hơn 30k dòng. Cột A là mã thành phẩm hoặc bán thành phẩm. Cột D là mã vật tư hoặc mã bán thành phẩm.
Cột G là số lượng Bán thành phẩm hoặc linh kiện ở cột D dùng để cấu thành lên thành phẩm hoặc bán thành phẩm ở Cột A.
Có mốt số mã có cả ở cột A và cột D vì nó là bán thành phẩm: ở cột G thì đóng vai trò là NVL của thành phẩm cột A. Ở cột A thì đóng vai trò là thành phẩm mẹ của các loại NVL riêng ở cột D.
File 2024.11.25 BOM Copy là data gốc.

Giờ em muốn tạo Code VBA để tạo ra 1 BOM của tất cả các loại thành phẩm và bán thành phẩm, trong đó BOM thành phẩm chỉ thể hiện những loại NVL cuối cùng ở Level thấp nhất. nghĩa là sẽ tự Breakdown BOM BTP ra thành các NVL nhỏ hơn, sau đó tổng hợp lại từng loại NVL nhỏ trong BOM thành phẩm.


Mục đích là để mình dùng để tạo file Order NVL cho SX.

Mình xin gửi file ở đây nhờ các cao nhân xử lý giúp nhé.
Mình gửi kèm 2 file. 1 file là file Demo cho data nhỏ, 1 file là hiện trạng của mình. Các cao nhân nào giúp được thì chia sẻ/inbox mình nhé. Cảm ơn cả nhà.
Bài này hôm qua em cũng thử mò, mà thấy BOM BTP (bán thành phẩm) có tận 4 lớp (sâu dữ)=>Không biết em hiểu có chính xác không nữa, vì dữ liệu hơi nhiều, nên vẫn đang loay hoay, không biết có cách phân tích hay xử lý bằng hàm excel365 hoặc power query không, mà lúc sau đau đầu quá, nên từ bỏ :D
1732572947287.png
 
Muốn được giúp đỡ thì bạn không nên viết Tiếng Việt lẫn lộn tiếng Tây thế này, người đọc rất khó chịu, Tây thì Tây hẳn luôn đi.
Cảm ơn góp ý của bạn. Mình sẽ lưu ý
Bài đã được tự động gộp:

Vâng, đúng là BOM của nó có nhiều lớp. Nhưng mình chỉ cần tính đến NVL đầu vào thôi, các lớp trung gian bỏ qua cho đỡ rối mắt
 
Cảm ơn góp ý của bạn. Mình sẽ lưu ý
Bài đã được tự động gộp:

Vâng, đúng là BOM của nó có nhiều lớp. Nhưng mình chỉ cần tính đến NVL đầu vào thôi, các lớp trung gian bỏ qua cho đỡ rối mắt
Tư duy của em chưa được tốt nhưng theo ý hiểu của em thì phải bóc tách ra thì mới tính được tới NVL đầu vào chứ nhỉ??? Rất mong các anh/chị và mọi người có kiến thức về BOM_nói chung, hướng dẫn thêm về logic BOM với ạ, vì em cũng muốn tìm hiểu về vấn đề này
1732579937298.png
 
Lần chỉnh sửa cuối:
Tư duy của em chưa được tốt nhưng theo ý hiểu của em thì phải bóc tách ra thì mới tính được tới NVL đầu vào chứ nhỉ??? Rất mong các anh/chị hướng dẫn thêm về logic BOM với ạ, vì em cũng muốn tìm hiểu về vấn đề này
View attachment 305884
Bạn xem lại bài 4 của mình nhé nhé. Bình thường thì hệ thống nào cũng sẽ có trường quy định loại của linh kiện, vật tư là Thành phẩm, Bán thành phẩm hay NVL...Nhưng nếu không đưa dữ liệu đầy đủ lên thì có thể dựa theo logic như sau:
Trong bảng BOM sẽ bao gồm mã cha (TP - BTP) và mã con (BTP - NVL). Nếu mã nào nó vừa có trong cột mã cha, vừa có trong cột mã con thì nó là BTP, nếu mã nào chỉ có trong cột mã cha thì nó là TP, chỉ có trong cột mã con thì nó là NVL. Mình nghĩ lập luận như trên thì mới đúng. Nhưng nếu nói về cấu hình trên hệ thống thì nhiều khi nó cũng không đúng lắm vì ví dụ 1 linh kiện cơ khí nếu đi mua thì nó là NVL, nhưng nếu tự sản xuất thì nó lại là BTP (làm từ bao nhiêu kg sắt thép chẳng hạn). Hoặc một số Thành phẩm dù không làm gì nữa, Không có mã cha nhưng bên kế toán nhà mình cứ bắt phải để là BTP để còn tính giá cho chuẩn (chỗ này mình nghe họ nói vậy chứ cũng không hiểu)
 
Cảm ơn Bro, mình đã thử đoạn code của bạn với file BOM demo thì chạy OK, tuy nhiên, khi thử với file 2024.11.25 thì lại đang báo lỗi đoạn Code này: Call DeQui(arr, res, d, d2, k, Split(d(arr(i, 4)), ","), arr(i, 7) * sl, sp)
Bro có thể hỗ trợ thêm giúp mình không
Do dòng dữ liệu 3529 sai, xóa hoặc chỉnh lại code sẽ chạy ngon
Em cảm ơn bác ạ. Code ra đúng kết quả em mong muốn rồi ạ.
Tuy nhiên khi em thay dữ liệu thật vào thì báo lỗi Out of stack space ạ.
Có thể là do dữ liệu của em bị quá lớn, số lượng TP khoảng hơn 300 mã ạ.
Có thể dữ liệu sai giống như file của bạn trên
 
Cảm ơn chuyên gia, mình xoá dòng code đó đi thì vận hành OK rồi. Tuy nhiên, nếu sửa dòng code đó thì sẽ có thêm lợi ích là gì nhỉ
Bài đã được tự động gộp:

Tư duy của em chưa được tốt nhưng theo ý hiểu của em thì phải bóc tách ra thì mới tính được tới NVL đầu vào chứ nhỉ??? Rất mong các anh/chị và mọi người có kiến thức về BOM_nói chung, hướng dẫn thêm về logic BOM với ạ, vì em cũng muốn tìm hiểu về vấn đề này
View attachment 305884
Có lẽ bạn chưa hiểu ý diễn giải của mình:
Trong cột A có các mã Mẹ, Bà, Cụ, Kỵ, Tổ Tiên.. Trong cột D có mã Con, Cháu, Chắt, Chút, Chít. Các mã trong cột A sẽ có con trực hệ ở cột D. Các mã trong cột D có thể là linh kiện hoặc là Bán thành phẩm. Nêud là linh kiện thì nó chỉ xuất hiện ở cột D thôi. Nếu là BTP thì chắc chắn nó sẽ được xuất hiện ở côt A với tư cách là mã mẹ, và song song với nó ở cột D sẽ có các mã con trực tiếp. Cứ như thế dần dần sẽ phân chia đến các lớp BTP nhỏ nhất
 
Lần chỉnh sửa cuối:
Thanks Bro, Mình chạy code này trong Excel thì Office chặn luôn rồi. Nhờ Bro thông não giúp case này với
Tôi không phải bro, vì chẳng có rồ chút nào. File bị chặn vì untrusted, vậy thì tìm chỗ thiết lập để trust nó.
Bài này hôm qua em cũng thử mò, mà thấy BOM BTP (bán thành phẩm) có tận 4 lớp (sâu dữ)=>Không biết em hiểu có chính xác không nữa, vì dữ liệu hơi nhiều, nên vẫn đang loay hoay, không biết có cách phân tích hay xử lý bằng hàm excel365 hoặc power query không, mà lúc sau đau đầu quá, nên từ bỏ :D
Hàm và công thức thì khó dù là hàm 365. Vì phải đệ quy. Power query cũng có đệ quy nhưng cũng khó trầy trật.
Giải thích BOM nhiều lớp như sau:

SPA là level 1
SPA có các thành phần A1, A2, A3, A4 trong đó giả sử A2 là bán thành phẩm.
Để sản xuất 1 SPA cần
A1 = 1
A2 = 2
A3 = 2
A4 = 2

Để sản xuất 1 đơn vị BTP A2 (level 2) cần
A4 = 1
A5 = 5
A6 = 3

Giả sử A5 lại là bán thành phẩm (level 3)
Để SX 1 đơn vị A5 cần
A7 = 4
A8 = 5

Minh họa như sau, và xem file đính kèm. Lệnh sản xuất ghi 100 SP A thì nhân lên 100

1732637524129.png
 

File đính kèm

  • MinhHoaBOMNhieulop.xlsx
    15.6 KB · Đọc: 8
Áp dụng cho bài 1. Ra thẳng thống kê vật tư. Còn 2 sheet BOM2 và BOM3 liệt kê theo cột thì tôi không thích lắm nên không làm. Làm cho 3 loại tủ xong khi áp cho dữ liệu thực 20 loại là vất code hết.
Ghi chú:
Dòng 26 file gốc sheet BOM sai (SPW4400100901), đúng ra là SPW4400101000
 

File đính kèm

  • CalculateOrderTu.xlsm
    32.9 KB · Đọc: 17
Áp dụng cho bài 1. Ra thẳng thống kê vật tư. Còn 2 sheet BOM2 và BOM3 liệt kê theo cột thì tôi không thích lắm nên không làm. Làm cho 3 loại tủ xong khi áp cho dữ liệu thực 20 loại là vất code hết.
Ghi chú:
Dòng 26 file gốc sheet BOM sai (SPW4400100901), đúng ra là SPW4400101000
Em xem qua thấy chịu không nổi.
 
Áp dụng cho bài 1. Ra thẳng thống kê vật tư. Còn 2 sheet BOM2 và BOM3 liệt kê theo cột thì tôi không thích lắm nên không làm. Làm cho 3 loại tủ xong khi áp cho dữ liệu thực 20 loại là vất code hết.
Ghi chú:
Dòng 26 file gốc sheet BOM sai (SPW4400100901), đúng ra là SPW4400101000
Em cảm ơn bác, em test code của bác từ bài trên vào bài của em được rồi ạ. Em với bạn Trannamhai là cùng công ty, nếu chạy một phần dữ liệu thì code chạy rất nhanh, nhưng khi chạy đầy đủ dữ liệu thì báo lỗi Out of stack space (code của bác HiếuCD cũng báo vậy ạ)
Bài đã được tự động gộp:

BOM2 của mình chỉ cần hiện nên chiều dọc là danh sách NVL còn chiều ngang là danh sách thành phẩm mà thôi.
Mục đích chủ yếu của mình nhờ giúp đỡ cũng chủ yếu là làm như thế nào để có thể bóc tách thành phẩm đến NVL cuối cùng, như bài của các bác @HieuCD @ptm0412 đã giúp, còn cái BOM2, BOM3 khi đã bóc tách được thì dùng pivot table là ra được kết quả thôi.
Cảm ơn bạn và các bác trên diễn đàn đã đọc và hỗ trợ mình.
 
Lần chỉnh sửa cuối:
Em cảm ơn bác, em test code của bác từ bài trên vào bài của em được rồi ạ. Em với bạn Trannamhai là cùng công ty, nếu chạy một phần dữ liệu thì code chạy rất nhanh, nhưng khi chạy đầy đủ dữ liệu thì báo lỗi Out of stack space (code của bác HiếuCD cũng báo vậy ạ)
Một phần dữ liệu là bao nhiêu? Tôi đã chạy hết bảng BOM 32600 dòng. Còn lệnh sản xuất test 13 mặt hàng chỉ 0.08 giây. Chạy lệnh SX 200 mặt hàng mất 0.17 giây, 300 mặt hàng 0.19 giây. Chỉ đến khi chạy 500 mặt hàng mới lỗi tràn bộ nhớ chứ không phải lỗi code.
Kiểm tra lại thì dòng 5329 sản phẩm có nguyên liệu là chính nó.

1732804054345.png

Cái này sinh ra vòng lặp vô tận, đệ quy cả đời không hết. May là nó không treo liệt cả máy.

Sửa dòng này thì chạy hết cả 1700 mặt hàng (lọc duy nhất ra) chỉ 0.95 giây.

1732804325093.png
 
Lần chỉnh sửa cuối:
Một phần dữ liệu là bao nhiêu? Tôi đã chạy hết bảng BOM 32600 dòng. Còn lệnh sản xuất test 13 mặt hàng chỉ 0.08 giây. Chạy lệnh SX 200 mặt hàng mất 0.17 giây, 300 mặt hàng 0.19 giây. Chỉ đến khi chạy 500 mặt hàng mới lỗi tràn bộ nhớ chứ không phải lỗi code.
Kiểm tra lại thì dòng 5259 sản phẩm có nguyên liệu là chính nó.

View attachment 305965

Cái này sinh ra vòng lặp vô tận, đệ quy cả đời không hết. May là nó không treo liệt cả máy.

Sửa dòng này thì chạy hết cả 1700 mặt hàng (lọc duy nhất ra) chỉ 0.95 giây.

View attachment 305966
Vâng ạ. Em đã sửa lại và code chạy OK rồi ạ, cảm ơn bác cùng bác @HieuCD đã giúp đỡ ạ
 
Em cảm ơn bác, em test code của bác từ bài trên vào bài của em được rồi ạ. Em với bạn Trannamhai là cùng công ty, nếu chạy một phần dữ liệu thì code chạy rất nhanh, nhưng khi chạy đầy đủ dữ liệu thì báo lỗi Out of stack space (code của bác HiếuCD cũng báo vậy ạ)
Bài đã được tự động gộp:


BOM2 của mình chỉ cần hiện nên chiều dọc là danh sách NVL còn chiều ngang là danh sách thành phẩm mà thôi.
Mục đích chủ yếu của mình nhờ giúp đỡ cũng chủ yếu là làm như thế nào để có thể bóc tách thành phẩm đến NVL cuối cùng, như bài của các bác @HieuCD @ptm0412 đã giúp, còn cái BOM2, BOM3 khi đã bóc tách được thì dùng pivot table là ra được kết quả thôi.
Cảm ơn bạn và các bác trên diễn đàn đã đọc và hỗ trợ mình.
Như vậy code đã chạy ra đúng yêu cầu của Bạn
 
Em với bạn Trannamhai là cùng công ty,
Thế hai bạn có học cùng trường cùng lớp không?
Cả 2 đều có dữ liệu sai mà không biết. Một người thì BTP không có BOM con vì BOM con sai mã, một người thì nguyên vật liệu SX ra BTP lại là chính nó.
 
Thế hai bạn có học cùng trường cùng lớp không?
Cả 2 đều có dữ liệu sai mà không biết. Một người thì BTP không có BOM con vì BOM con sai mã, một người thì nguyên vật liệu SX ra BTP lại là chính nó.
Cảm ơn chuyên gia đã hỗ trợ và đã tìm ra những điểm lỗi trong file bên mình.
 
Web KT

Bài viết mới nhất

Back
Top Bottom