Refine project overview to include specific business context (Blaidy Company) and the main workbook file. Restructure the architecture section into a layered object-oriented design (Data, Processing, Application layers) and define the responsibilities of core VBA classes. Add new technical documentation sections covering: - Model number format parsing structure - Condition expression language syntax - Category hierarchy logic and picking strategies - Material matching pipeline flow Include VBA code examples for key methods such as CollectAllMaterials and GetMaterialsByCategoryAndModel to illustrate recursive traversal and material retrieval logic. Clarify the structure of key Excel configuration sheets.
180 lines
5.5 KiB
QBasic
180 lines
5.5 KiB
QBasic
' ========================================
|
|
' 模块: modBOMTest
|
|
' 用途: 测试和使用BOM数据结构
|
|
' ========================================
|
|
Option Explicit
|
|
|
|
Sub TestBOMStructure()
|
|
' 初始化BOM管理器
|
|
Dim bomMgr As New clsBOMManager
|
|
|
|
' 加载数据(假设工作表名称)
|
|
Dim wsConfig As Worksheet
|
|
Dim wsPlatform As Worksheet
|
|
|
|
Set wsConfig = ThisWorkbook.Worksheets("领料配置")
|
|
Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单")
|
|
|
|
' 加载数据
|
|
bomMgr.LoadData wsConfig, wsPlatform
|
|
|
|
' 打印类别树结构到新工作表
|
|
Dim wsOutput As Worksheet
|
|
On Error Resume Next
|
|
Application.DisplayAlerts = False
|
|
ThisWorkbook.Worksheets("BOM结构").Delete
|
|
Application.DisplayAlerts = True
|
|
On Error GoTo 0
|
|
|
|
Set wsOutput = ThisWorkbook.Worksheets.Add
|
|
wsOutput.Name = "BOM结构"
|
|
|
|
'bomMgr.PrintCategoryTree wsOutput
|
|
|
|
Dim cats As collection
|
|
Dim i As Integer
|
|
Set cats = bomMgr.GetRootCategories()
|
|
For i = 1 To cats.Count
|
|
Debug.Print cats(i).categoryName
|
|
Next i
|
|
|
|
|
|
|
|
MsgBox "BOM数据结构加载完成!" & vbCrLf & _
|
|
"请查看 'BOM结构' 工作表", vbInformation
|
|
End Sub
|
|
|
|
' 示例: 获取特定类别的物料
|
|
Sub GetCategoryMaterials()
|
|
Dim bomMgr As New clsBOMManager
|
|
Dim wsConfig As Worksheet, wsPlatform As Worksheet
|
|
|
|
Set wsConfig = ThisWorkbook.Worksheets("领料配置")
|
|
Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单")
|
|
|
|
bomMgr.LoadData wsConfig, wsPlatform
|
|
|
|
' 获取"部件"类别的物料(使用父类别)
|
|
Dim materials As collection
|
|
Set materials = bomMgr.GetMaterialsForPicking("部件", True)
|
|
|
|
Debug.Print "部件类别物料数量(父类别): " & materials.Count
|
|
|
|
' 获取"部件"类别的物料(使用子类别)
|
|
Set materials = bomMgr.GetMaterialsForPicking("部件", False)
|
|
|
|
Debug.Print "部件类别物料数量(子类别展开): " & materials.Count
|
|
|
|
' 遍历物料
|
|
Dim mat As clsMaterialItem
|
|
For Each mat In materials
|
|
Debug.Print mat.code & " - " & mat.Name & _
|
|
" | 数量:" & mat.Quantity & _
|
|
" | 条件:" & mat.Condition
|
|
Next mat
|
|
End Sub
|
|
|
|
' 示例: 根据产品型号生成领料清单
|
|
Sub GeneratePickingList()
|
|
Dim bomMgr As New clsBOMManager
|
|
Dim wsConfig As Worksheet, wsPlatform As Worksheet
|
|
|
|
Set wsConfig = ThisWorkbook.Worksheets("领料配置")
|
|
Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单")
|
|
|
|
bomMgr.LoadData wsConfig, wsPlatform
|
|
|
|
' 创建领料清单工作表
|
|
Dim wsPickList As Worksheet
|
|
On Error Resume Next
|
|
Application.DisplayAlerts = False
|
|
ThisWorkbook.Worksheets("领料清单").Delete
|
|
Application.DisplayAlerts = True
|
|
On Error GoTo 0
|
|
|
|
Set wsPickList = ThisWorkbook.Worksheets.Add
|
|
wsPickList.Name = "领料清单"
|
|
|
|
' 写入表头
|
|
Dim row As Long
|
|
row = 1
|
|
wsPickList.Cells(row, 1).value = "代号"
|
|
wsPickList.Cells(row, 2).value = "名称"
|
|
wsPickList.Cells(row, 3).value = "类别"
|
|
wsPickList.Cells(row, 4).value = "数量"
|
|
wsPickList.Cells(row, 5).value = "选择条件"
|
|
wsPickList.Cells(row, 6).value = "领料方式"
|
|
row = row + 1
|
|
|
|
' 遍历所有根类别
|
|
Dim rootCats As collection
|
|
Set rootCats = bomMgr.GetRootCategories
|
|
|
|
Dim cat As clsCategory
|
|
Dim materials As collection
|
|
Dim mat As clsMaterialItem
|
|
Dim i As Long, j As Long
|
|
|
|
For i = 1 To rootCats.Count
|
|
Set cat = rootCats(i)
|
|
' 默认使用父类别物料
|
|
Set materials = bomMgr.GetMaterialsForPicking(cat.categoryName, True)
|
|
|
|
For j = 1 To materials.Count
|
|
Set mat = materials(j)
|
|
wsPickList.Cells(row, 1).value = mat.code
|
|
wsPickList.Cells(row, 2).value = mat.Name
|
|
wsPickList.Cells(row, 3).value = mat.Category
|
|
wsPickList.Cells(row, 4).value = mat.Quantity
|
|
wsPickList.Cells(row, 5).value = mat.Condition
|
|
wsPickList.Cells(row, 6).value = "父类别"
|
|
row = row + 1
|
|
Next j
|
|
Next i
|
|
|
|
' 格式化表格
|
|
wsPickList.Range("A1:F1").Font.Bold = True
|
|
wsPickList.Columns("A:F").AutoFit
|
|
|
|
MsgBox "领料清单生成完成!", vbInformation
|
|
End Sub
|
|
|
|
' 示例: 查询特定物料信息
|
|
Sub QueryMaterialInfo()
|
|
Dim bomMgr As New clsBOMManager
|
|
Dim wsConfig As Worksheet, wsPlatform As Worksheet
|
|
|
|
Set wsConfig = ThisWorkbook.Worksheets("领料配置")
|
|
Set wsPlatform = ThisWorkbook.Worksheets("平台配置清单")
|
|
|
|
bomMgr.LoadData wsConfig, wsPlatform
|
|
|
|
' 查询特定类别
|
|
Dim cat As clsCategory
|
|
Set cat = bomMgr.GetCategory("部件")
|
|
|
|
If Not cat Is Nothing Then
|
|
Debug.Print "类别: " & cat.categoryName
|
|
Debug.Print "父类别: " & cat.ParentCategoryName
|
|
Debug.Print "物料数: " & cat.materials.Count
|
|
Debug.Print "子类别数: " & cat.SubCategories.Count
|
|
Debug.Print "是否叶子类别: " & cat.IsLeafCategory
|
|
|
|
' 列出所有物料
|
|
Dim mat As clsMaterialItem
|
|
Dim i As Long
|
|
For i = 1 To cat.materials.Count
|
|
Set mat = cat.materials(i)
|
|
Debug.Print " - " & mat.code & ": " & mat.Name
|
|
Next i
|
|
|
|
' 列出所有子类别
|
|
Dim subCat As clsCategory
|
|
Dim j As Long
|
|
For j = 1 To cat.SubCategories.Count
|
|
Set subCat = cat.SubCategories(j)
|
|
Debug.Print " 子类别: " & subCat.categoryName & _
|
|
" (物料数:" & subCat.materials.Count & ")"
|
|
Next j
|
|
End If
|
|
End Sub |