Hình như lúc ấy tự ái dâng cao quá nên cứ cho câu hỏi ở bài #17 là "phê bình" mình. Không muốn khai rõ là do "kéo ẩu".Bạn không hiểu người khác nói gì à?
...
Hình như lúc ấy tự ái dâng cao quá nên cứ cho câu hỏi ở bài #17 là "phê bình" mình. Không muốn khai rõ là do "kéo ẩu".Bạn không hiểu người khác nói gì à?
...
Không thuyết phục. Cứ cho là lúc ấy (bài 17 - Thứ sáu lúc 05:30) tự ái dâng cao quá, nhưng bây giờ (bài 35 - Hôm nay (thứ Ba) lúc 14:33) vẫn "lờ" đi là sao. Chả nhẽ "dâng cao" từ thứ Sáu tới thứ Ba?Hình như lúc ấy tự ái dâng cao quá nên cứ cho câu hỏi ở bài #17 là "phê bình" mình. Không muốn khai rõ là do "kéo ẩu".
Chỗ đó em viết sai nhé bác. file gốc đính kèm. bác xem giúp em với ạTại sao có 5 dòng giống nhau:
80SAQ511 34.ASAQB.006
cảm ơn bạn nhé@Chủ bài đăng: Đến đây & tìm cách xem được các hình trong nớ, có thể có ích cho bạn:
Kế toán sản xuất – chế biến Bán thành phẩm – Hướng dẫn từ iPOS
huongdan.ipos.vn
Không biết bài toán của bạn có giống hình bên dưới không nhỉ ?Dữ liệu chuẩn đây nhé bác. vì nó quá khó giải thích nên em mới phải làm ví dụ như vậy.
ví dụ dòng 16 mã bôi màu tím là bán thành phẩm của MO 55. nhưng chính nó cũng có các vật liệu tạo thành. em cần thay mã 60 màu tím đó thành các vật liệu tạo ra nó
Bài đã được tự động gộp:
Em nói rồi mà, em vừa vào là viết bài nhờ cậy mọi người luôn. có gì không đúng, không phải thì mong bác và mọi người bỏ qua và không chấp những thứ nhỏ nhặt. cảm ơn bác nhiều.
Bài của mình đúng như bạn mô tả và đúng là nó sẽ còn xuất hiện ở sản phẩm Y. Bạn xem giúp mình với nhé. Mình cũng k cần quá nhanh đâu. miễn là nó có thể tự động được.Không biết bài toán của bạn có giống hình bên dưới không nhỉ ?
Trong file BOM có nhiều sp để đơn giản giả xử có SPX SPY
trong sơ đồ SPX là gốc A1 , A2...là các cái ngọn
Lần này bạn muốn loại bỏ hết những cái trung gian như A , B , B2 chỉ còn để lại gốc và ngọn phải không nhỉ?
Nếu vậy 1 vấn đề là những cái trung gian A B B2 ... có xuất hiện ở các sp khác không. vd trong SPY sẽ có A và do đó cái ngọn của nó sẽ có A1 A2
Nếu không xuất hiện ở SPY bài toán rất đơn giản ... chương trình chạy nhanh
Nếu có xuất hiện ở SPY bài toán rất phức tạp hơn 1 chút ... và chương trình sẽ hơi chậm vì lượng dữ liệu hơi lớn 12k dòng
Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếuDữ liệu chuẩn đây nhé bác. vì nó quá khó giải thích nên em mới phải làm ví dụ như vậy.
ví dụ dòng 16 mã bôi màu tím là bán thành phẩm của MO 55. nhưng chính nó cũng có các vật liệu tạo thành. em cần thay mã 60 màu tím đó thành các vật liệu tạo ra nó
Bài đã được tự động gộp:
Em nói rồi mà, em vừa vào là viết bài nhờ cậy mọi người luôn. có gì không đúng, không phải thì mong bác và mọi người bỏ qua và không chấp những thứ nhỏ nhặt. cảm ơn bác nhiều.
Option Explicit
Dim res(), sArr(), dic As Object, k&
Sub XYZ()
Dim d As Object, sRow&, i&, iKey
Const TP$ = "5,8,9" 'Tham Pham xet theo ký tu dau
Application.ScreenUpdating = False
Set dic = CreateObject("scripting.dictionary")
Set d = CreateObject("scripting.dictionary")
With Sheets("Sheet1")
sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value
End With
sRow = UBound(sArr)
ReDim res(1 To 100000, 1 To 3) 'Ket qua 100.000 dòng
For i = 1 To sRow
iKey = sArr(i, 1)
dic.Item(iKey) = dic.Item(iKey) & "|" & i
If InStr(1, TP, Mid(iKey, 1, 1)) > 0 Then d.Item(iKey) = ""
sArr(i, 3) = -sArr(i, 3)
Next
k = 0
For Each iKey In d.keys
Call TaoDinhMuc(iKey, iKey, 1)
Next iKey
With Sheets("Sheet1")
i = .Range("G" & Rows.Count).End(xlUp).Row
If i > 1 Then .Range("G2:I" & i).ClearContents
If k > 0 Then .Range("G2").Resize(k, 3) = res
End With
Application.ScreenUpdating = True
Set dic = Nothing: Set d = Nothing
Erase sArr, res
End Sub
Private Sub TaoDinhMuc(ByVal sp$, ByVal tmp$, ByVal sl As Double)
Dim S, iKey$, i&, j&, ik&
S = Split(dic.Item(tmp), "|")
For i = 1 To UBound(S)
j = Val(S(i))
If Not dic.exists(sArr(j, 2)) Then
iKey = sp & "|" & sArr(j, 2)
ik = dic.Item(iKey)
If ik = 0 Then
k = k + 1
ik = k
dic.Item(iKey) = k
End If
res(ik, 1) = sp
res(ik, 2) = sArr(j, 2)
res(ik, 3) = res(ik, 3) + sl * sArr(j, 3)
Else
If sArr(j, 2) = sp Then MsgBox ("San Pham " & sp & " va " & tmp & " bi tinh vong!"): Exit Sub
Call TaoDinhMuc(sp, sArr(j, 2), sl * sArr(j, 3))
End If
Next i
End Sub
Tôi không làm chuyên môn này nên có thắc mắc.Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Thành phẩm và bán thành phẩm chỉ là khái niệm tương đối, chỉ có doanh nghiệp mới xác định chuẩn, ví dụ doanh nghiệp giấy, dùng một ít thành phẩm giấy làm bao bì, là nguyên liệu của sản phẩm khác, nhưng giấy vẫn gọi là thành phẩm vì mục đích sản xuất là bán ra ngoài, nếu chủ yếu dùng sản xuất nội bộ và bán ra ngoài là thứ yếu thì gọi là bán thành phẩmTôi không làm chuyên môn này nên có thắc mắc.
Sau khi chạy code cho tập tin ở bài #44 thì có kết quả như hình dưới, tức 55.LVD12.MGA là sản phẩm hoàn chỉnh.
View attachment 272194
Nhưng theo như dòng 9216 ở hình tiếp theo
View attachment 272195
thì 55.LVD12.MGA là bán thành phẩm của sản phẩm 57.LVD12.G03 chứ không thể là sản phẩm hoàn chỉnh.
Đó là cách hiểu của người ngoại đạo như tôi. Vậy chuyên môn về BOM là như thế nào, và lý thuyết có thể đọc ở đâu?
For i = 1 To sRow
iKey = sArr(i, 1)
dic.Item(iKey) = dic.Item(iKey) & "|" & i
d.Item(iKey) = ""
sArr(i, 3) = -sArr(i, 3)
Next
For i = 1 To sRow
If d.exists(sArr(i, 2)) Then
d.Remove (sArr(i, 2))
End If
Next
k = 0
For Each iKey In d.keys
q = 0
Call TaoDinhMuc(iKey, iKey, 1)
Next iKey
Vì thế tôi cho là chủ thớt phải mô tả thật kỹ càng. Họ có thể có khái niệm riêng của họ mà theo đấy 55.LVD12.MGA KHÔNG là sản phẩm hoàn chỉnh (hình như trong tập tin chủ thớt tô mầu chữ để nhấn mạnh đó là Bán thành phẩm). Tôi muốn biết rõ trước khi viết code: sản phẩm hoàn chỉnh là gì, cách phát hiện, bán thành phẩm là gì và cách phát hiện. Vì với một người ngoại đạo như tôi mà không giải thích thì tôi chỉ còn cách đoán mò, tự hiểu. Mà ở thời điểm này tôi hiểu thế này - theo lôgíc của tôi thôi:Thành phẩm và bán thành phẩm chỉ là khái niệm tương đối, chỉ có doanh nghiệp mới xác định chuẩn, ví dụ doanh nghiệp giấy, dùng một ít thành phẩm giấy làm bao bì, là nguyên liệu của sản phẩm khác, nhưng giấy vẫn gọi là thành phẩm vì mục đích sản xuất là bán ra ngoài, nếu chủ yếu dùng sản xuất nội bộ và bán ra ngoài là thứ yếu thì gọi là bán thành phẩm
Trong file bạn gửi mình có thử viết qua code nhưng do chương trình chạy chậm quá nên mình moi xử lý sp đầu tiên.Bài của mình đúng như bạn mô tả và đúng là nó sẽ còn xuất hiện ở sản phẩm Y. Bạn xem giúp mình với nhé. Mình cũng k cần quá nhanh đâu. miễn là nó có thể tự động được.
Em cảm ơn bác nhiều ạ.Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Mã:Option Explicit Dim res(), sArr(), dic As Object, k& Sub XYZ() Dim d As Object, sRow&, i&, iKey Const TP$ = "5,8,9" 'Tham Pham xet theo ký tu dau Application.ScreenUpdating = False Set dic = CreateObject("scripting.dictionary") Set d = CreateObject("scripting.dictionary") With Sheets("Sheet1") sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value End With sRow = UBound(sArr) ReDim res(1 To 100000, 1 To 3) 'Ket qua 100.000 dòng For i = 1 To sRow iKey = sArr(i, 1) dic.Item(iKey) = dic.Item(iKey) & "|" & i If InStr(1, TP, Mid(iKey, 1, 1)) > 0 Then d.Item(iKey) = "" sArr(i, 3) = -sArr(i, 3) Next k = 0 For Each iKey In d.keys Call TaoDinhMuc(iKey, iKey, 1) Next iKey With Sheets("Sheet1") i = .Range("G" & Rows.Count).End(xlUp).Row If i > 1 Then .Range("G2:I" & i).ClearContents If k > 0 Then .Range("G2").Resize(k, 3) = res End With Application.ScreenUpdating = True Set dic = Nothing: Set d = Nothing Erase sArr, res End Sub Private Sub TaoDinhMuc(ByVal sp$, ByVal tmp$, ByVal sl As Double) Dim S, iKey$, i&, j&, ik& S = Split(dic.Item(tmp), "|") For i = 1 To UBound(S) j = Val(S(i)) If Not dic.exists(sArr(j, 2)) Then iKey = sp & "|" & sArr(j, 2) ik = dic.Item(iKey) If ik = 0 Then k = k + 1 ik = k dic.Item(iKey) = k End If res(ik, 1) = sp res(ik, 2) = sArr(j, 2) res(ik, 3) = res(ik, 3) + sl * sArr(j, 3) Else If sArr(j, 2) = sp Then MsgBox ("San Pham " & sp & " va " & tmp & " bi tinh vong!"): Exit Sub Call TaoDinhMuc(sp, sArr(j, 2), sl * sArr(j, 3)) End If Next i End Sub
Cảm ơn bác, Đúng như bác HieuCD giải thích. TP và Bán Thành Phẩm chỉ là khái niệm tương đối thôi ạ. Khi nó được tạo ra và bán cho công ty khác thì nó là thành phẩm, nhưng khi nó lại đem vào làm một bộ phận cho một sản phẩm khác thì nó lại được coi là bán thành phẩm.Tôi không làm chuyên môn này nên có thắc mắc.
Sau khi chạy code cho tập tin ở bài #44 thì có kết quả như hình dưới, tức 55.LVD12.MGA là sản phẩm hoàn chỉnh.
View attachment 272194
Nhưng theo như dòng 9216 ở hình tiếp theo
View attachment 272195
thì 55.LVD12.MGA là bán thành phẩm của sản phẩm 57.LVD12.G03 chứ không thể là sản phẩm hoàn chỉnh.
Đó là cách hiểu của người ngoại đạo như tôi. Vậy chuyên môn về BOM là như thế nào, và lý thuyết có thể đọc ở đâu?
Cảm ơn bạn nhiều nhé, mình sẽ kiểm tra kết quảTrong file bạn gửi mình có thử viết qua code nhưng do chương trình chạy chậm quá nên mình moi xử lý sp đầu tiên.
bạn check xem có đúng ý bạn không nhé !
Code của bác đúng cái mà em cần rồi ạ. Cảm ơn bác rất nhiều!Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Mã:Option Explicit Dim res(), sArr(), dic As Object, k& Sub XYZ() Dim d As Object, sRow&, i&, iKey Const TP$ = "5,8,9" 'Tham Pham xet theo ký tu dau Application.ScreenUpdating = False Set dic = CreateObject("scripting.dictionary") Set d = CreateObject("scripting.dictionary") With Sheets("Sheet1") sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value End With sRow = UBound(sArr) ReDim res(1 To 100000, 1 To 3) 'Ket qua 100.000 dòng For i = 1 To sRow iKey = sArr(i, 1) dic.Item(iKey) = dic.Item(iKey) & "|" & i If InStr(1, TP, Mid(iKey, 1, 1)) > 0 Then d.Item(iKey) = "" sArr(i, 3) = -sArr(i, 3) Next k = 0 For Each iKey In d.keys Call TaoDinhMuc(iKey, iKey, 1) Next iKey With Sheets("Sheet1") i = .Range("G" & Rows.Count).End(xlUp).Row If i > 1 Then .Range("G2:I" & i).ClearContents If k > 0 Then .Range("G2").Resize(k, 3) = res End With Application.ScreenUpdating = True Set dic = Nothing: Set d = Nothing Erase sArr, res End Sub Private Sub TaoDinhMuc(ByVal sp$, ByVal tmp$, ByVal sl As Double) Dim S, iKey$, i&, j&, ik& S = Split(dic.Item(tmp), "|") For i = 1 To UBound(S) j = Val(S(i)) If Not dic.exists(sArr(j, 2)) Then iKey = sp & "|" & sArr(j, 2) ik = dic.Item(iKey) If ik = 0 Then k = k + 1 ik = k dic.Item(iKey) = k End If res(ik, 1) = sp res(ik, 2) = sArr(j, 2) res(ik, 3) = res(ik, 3) + sl * sArr(j, 3) Else If sArr(j, 2) = sp Then MsgBox ("San Pham " & sp & " va " & tmp & " bi tinh vong!"): Exit Sub Call TaoDinhMuc(sp, sArr(j, 2), sl * sArr(j, 3)) End If Next i End Sub
Code của bạn đang chưa đúng cái mình muốn. ví dụ như mã 55.LVX61.DG2, trong mã đó còn có mã 60.LVX61.F01 mã đó cũng là thành phẩm/bán thành phẩm, nên lại phải thay toàn bộ nguyên liệu trong mã 60 đó vào trong mã 55.LVX61.DG2 nữa cơ bạn ạ.Trong file bạn gửi mình có thử viết qua code nhưng do chương trình chạy chậm quá nên mình moi xử lý sp đầu tiên.
bạn check xem có đúng ý bạn không nhé !
Bác rất cẩn thận, em chưa biết đọc nhiều ngôn ngữ VBA, bác có ghi thêm phần ghi chú nên em cần thêm mã đầu 60 vào thành phẩm/bán thành phẩm thì cũng có thể tự thêm vào được. Cảm ơn bác nhiều ạThành phẩm và bán thành phẩm chỉ là khái niệm tương đối, chỉ có doanh nghiệp mới xác định chuẩn, ví dụ doanh nghiệp giấy, dùng một ít thành phẩm giấy làm bao bì, là nguyên liệu của sản phẩm khác, nhưng giấy vẫn gọi là thành phẩm vì mục đích sản xuất là bán ra ngoài, nếu chủ yếu dùng sản xuất nội bộ và bán ra ngoài là thứ yếu thì gọi là bán thành phẩm
Lúc đầu mình dùng các lệnh sau để xác định thành phẩm, như thấy không ổn nên mới chỉnh lại như code trên
Mã:For i = 1 To sRow iKey = sArr(i, 1) dic.Item(iKey) = dic.Item(iKey) & "|" & i d.Item(iKey) = "" sArr(i, 3) = -sArr(i, 3) Next For i = 1 To sRow If d.exists(sArr(i, 2)) Then d.Remove (sArr(i, 2)) End If Next k = 0 For Each iKey In d.keys q = 0 Call TaoDinhMuc(iKey, iKey, 1) Next iKey
trong sheet ket qua minh thay mã 60.LVX61.F01 thanh ma 72.50048.001 la nguyên liệu cua no vao trong 55.LVX61.DG2 roi nhi ?Code của bác đúng cái mà em cần rồi ạ. Cảm ơn bác rất nhiều!
Bài đã được tự động gộp:
Code của bạn đang chưa đúng cái mình muốn. ví dụ như mã 55.LVX61.DG2, trong mã đó còn có mã 60.LVX61.F01 mã đó cũng là thành phẩm/bán thành phẩm, nên lại phải thay toàn bộ nguyên liệu trong mã 60 đó vào trong mã 55.LVX61.DG2 nữa cơ bạn ạ.
Bài đã được tự động gộp:
Bác rất cẩn thận, em chưa biết đọc nhiều ngôn ngữ VBA, bác có ghi thêm phần ghi chú nên em cần thêm mã đầu 60 vào thành phẩm/bán thành phẩm thì cũng có thể tự thêm vào được. Cảm ơn bác nhiều ạ
Thông thường doanh nghiệp cần định mức của tất cả sản phẩm bao gồm thành phẩm và bán thành phẩm, sau đó cần cụ thể sản phẩm gì sẽ bóc tách ra sau, lúc đó không cần phân loại thành phẩm và bán thành phẩmTôi chạy code cho hình
View attachment 272196
thì không có kết quả. Dù là thế nào cũng phải có kết quả chứ nhỉ. Ít ra là San pham 1 và San pham 2 là sản phẩm hoàn chỉnh, nếu doanh nghiệp không cho là Vat lieu 1 và Vat lieu 2 cũng là sản phẩm. Nhưng đây là không có kết quả gì.
Tôi không hiểu rõ lắm Const TP$ = "5,8,9" 'Tham Pham xet theo kư tu dau
Nếu phải liệt kê gì đó mà với dữ liệu của tác giả hàng chục nghìn dòng thì rất có thể phải liệt kê rất rất nhiều. Nhưng như tôi đã viết, tôi không tìm hiểu xem TP nó là gì vì thực ra tôi cũng không quan tâm.
Vì thế tôi cho là chủ thớt phải mô tả thật kỹ càng. Họ có thể có khái niệm riêng của họ mà theo đấy 55.LVD12.MGA KHÔNG là sản phẩm hoàn chỉnh (hình như trong tập tin chủ thớt tô mầu chữ để nhấn mạnh đó là Bán thành phẩm). Tôi muốn biết rõ trước khi viết code: sản phẩm hoàn chỉnh là gì, cách phát hiện, bán thành phẩm là gì và cách phát hiện. Vì với một người ngoại đạo như tôi mà không giải thích thì tôi chỉ còn cách đoán mò, tự hiểu. Mà ở thời điểm này tôi hiểu thế này - theo lôgíc của tôi thôi:
- Những mã ở cột A mà không có ở cột B thì là Sản phẩm. Và chỉ chúng mới là Sản phẩm.
- Những mã có ở cột A và cả ở cột B thì là Bán thành phẩm.
- Những mã chỉ có ở cột B thì là nguyên liệu.
Cho tới khi chủ thớt không mô tả, không định nghĩa gì cả thì mọi code chưa chắc đúng ý. Chủ thớt có thể có định nghĩa Sản phẩm, Bán thành phẩm và Nguyên liệu của RIÊNG MÌNH (với tư cách là doanh nghiệp anh ta xác định chuẩn như thế), không cần giống ai. Nhưng lúc đó phải định nghĩa rõ ràng, và chỉ ra cách xác định mã thế nào là Sản phẩm, Bán thành phẩm và Nguyên liệu.
Có những nhà máy dùng một số bán thành phẩm của họ như thành phẩm.Thông thường doanh nghiệp cần định mức của tất cả sản phẩm bao gồm thành phẩm và bán thành phẩm, sau đó cần cụ thể sản phẩm gì sẽ bóc tách ra sau, lúc đó không cần phân loại thành phẩm và bán thành phẩm
Code xét: Const TP$ = "5,8,9" 'Tham Pham xet theo kư tu dau
Chỉ phán đoán dựa vào đặc điểm bộ mã thực tế, nếu dữ liệu khác cần cách nhận diện khác
À, đúng rồi bạn ạ. vậy phần code đã chạy đúng rồi bạn nhé. Mình cần thêm 1 đoạn nữa chạy cho số lượng. ví dụ như là trong mã 55.LVX61.DG2 dùng 3 mã 60.LVX61.F01 thì toàn bộ số lượng nguyên liệu của mã 60.LVX61.F01 sẽ nhân với 3. bạn nghĩ thêm giúp mình với nhétrong sheet ket qua minh thay mã 60.LVX61.F01 thanh ma 72.50048.001 la nguyên liệu cua no vao trong 55.LVX61.DG2 roi nhi ?![]()