Access的BOM开发(3)BOM展开
hi,大家好呀,手机边亲爱的你还好吗!
今天我们接着来讲一下BOM。我们在经历了几周的等待后,今天终于要迎来大结局了。今天我们就来把BOM最后一个功能来讲解一下。
首先,我们先来讲解一下什么是BOM展开(注意我这里并不是官方解释,也不是权威解释,所以有讲的不正确的地方请指正),BOM的展开是从一个层级开始将所有的子项一一展开,比如我们BOM示例中用到的电脑的数据,我们电脑的主机箱展开就是,机箱、主板、硬盘、显卡、网卡、电源、内存,同时还要将主板的子项展开,那就是还有CPU、北桥、南桥、CMOS电池等等,一直要展开到组装电脑用到的螺丝。
从以上的举例我们可以知道,就是要把BOM中子项的子项全展开,展开到最小项为止,那这样其实就是用到了递归(大家非常期待的递归),最终BOM展开后我们将数据挂到树上呈现出来。那我们分几步来操作一下。
×
01、建窗体
如下图,我们需要新建一个窗体,在窗体上放一个文本框(txtProductCode),一个按钮(btnOK),一个树控件(Bom_Tree),一个标签控件(Label_Path),一个子窗体控件(frmChild)
子窗体为数据表窗体,窗体的数据源为(qryBOM):
SELECT tblBOM.ID, tblBOM.ProductID, tblBOM.ProductParentID, tblBOM.Qty, tblBOM.Unit,
tblBOM.IsEnabled, tblBOM.Remark, tblProduct.ProductCode AS 子物料代码, tblProduct.ProductName AS
子物料名称, tblProduct_1.ProductName AS 父物料名称, tblProduct_1.ProductCode AS 父物料代码
FROM (tblBOM LEFT JOIN tblProduct ON tblBOM.ProductID = tblProduct.ID) LEFT JOIN tblProduct AS
tblProduct_1 ON tblBOM.ProductParentID = tblProduct_1.ID;
×
02、添加代码
Private Sub btnOK_Click()
GetTree
End Sub
Private Sub Form_Load()
Me.Bom_Tree.Nodes.Clear
Me.frmChild.Form.RecordSource = "select * from qryBOM where 1=2"
Me.Label_Path.Caption = ""
End Sub
Private Sub GetTree()
On Error GoTo ErrorHandler
Dim objNode As Object ' MSComctlLib.Node
Me.Bom_Tree.Nodes.Clear
Dim strID As Long
Dim strName As String
strID = Nz(DLookup("ID", "tblProduct", "ProductCode='" & Me.txtProductCode & "'"), 0)
strName = Nz(DLookup("ProductName", "tblProduct", "ProductCode='" & Me.txtProductCode & "'"), 0)
Set objNode = Me.Bom_Tree.Nodes.Add(, , "K", strName) '添加树控件底层节点
Call ShowBOM(strID)
objNode.Expanded = True '
ExitHere:
Exit Sub
ErrorHandler:
MsgBox Err.Description, vbCritical
Resume ExitHere
End Sub
Private Sub ShowBOM(strID As Long)
On Error GoTo ErrorHandler
Dim rst As Object
Dim strSQL As String
Dim strP As String
strSQL = "select * from qryBOM where ProductParentID=" & Nz(strID, 0)
Set rst = CurrentDb.OpenRecordset(strSQL)
Do Until rst.EOF
If DCount("*", "qryBOM", "ProductID=" & Nz(strID, 0)) = 0 Or Nz(DLookup("ID", "tblProduct", "ProductCode='" & Me.txtProductCode & "'"), 0) = strID Then
strP = "K"
Else
strP = "K" & rst!ProductParentID
End If
Me.Bom_Tree.Nodes.Add strP, tvwChild, "K" & rst!ProductID, rst!子物料名称 '添加树控件节点
If DCount("*", "qryBOM", "ProductParentID=" & Nz(rst!ProductID, 0)) > 0 Then
Call ShowBOM(rst!ProductID)
End If
rst.MoveNext
Loop
rst.Close
ExitHere:
Set rst = Nothing
Exit Sub
ErrorHandler:
MsgBox Err.Description, vbCritical
Resume ExitHere
End Sub
Private Sub Bom_Tree_LostFocus()
Set Me.Bom_Tree.DropHighlight = Me.Bom_Tree.SelectedItem
End Sub
Private Sub Bom_Tree_GotFocus()
Set Me.Bom_Tree.DropHighlight = Nothing
End Sub
Private Sub Bom_Tree_NodeClick(ByVal Node As Object)
Dim strSQL As String
Me.Label_Path.Caption = Node.FullPath
Me.Bom_Tree.SetFocus
Dim objNode As Node
Set objNode = Me.Bom_Tree.SelectedItem
If objNode.Key <> "K" Then
If DCount("*", "qryBOM", "ProductParentID=" & CLng(Mid(objNode.Key, 2))) > 1 Then
strSQL = "select * from qryBOM where ProductParentID=" & CLng(Mid(objNode.Key, 2))
Else
strSQL = "select * from qryBOM where ProductID=" & CLng(Mid(objNode.Key, 2))
End If
Else
strSQL = "select * from qryBOM where 父物料名称='" & objNode.Text & "'"
End If
Me.frmChild.Form.RecordSource = strSQL
End Sub
我们自己写了一个函数,在这里我们用到了递归,具体的我们在后面的视频中说明
×
03、运行测试
最后一步就是运行测试了
注意,展开需要输入完整的产品代码,不能用模糊查询。
我们这次分享的内容主要是用于学习树控件,我们只是整了一个简单的BOM系统 ,如果需要当作一个系统来使用的话,还需要把目前的功能完善,那这个任务就交给大家吧。
从事access开发多年,喜欢access做一些小东西,分享一些小经验
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义