Access的BOM开发(3)BOM展开

发布时间:2023-05-06 09:52:08

  hi,大家好,亲爱的手机,你还好吗!

  今天,让我们来谈谈BOM。经过几周的等待,我们终于迎来了今天的大结局。今天,让我们解释一下BOM的最后一个功能。

  首先,让我们解释什么是BOM(请注意,我不是官方解释或权威解释,所以请纠正错误)。BOM的扩展是从一个层次逐一扩展所有子项,如我们BOM示例中使用的计算机数据,我们计算机的主机箱是机箱、主板、硬盘、图形卡、网卡、电源、内存,同时扩展主板的子项,还有CPU、北桥、南桥、CMOS电池等,一直延伸到装配电脑使用的螺丝。

  从上面的例子中,我们可以知道BOM中子项的所有子项都应该扩展到最小项,这实际上是使用递归(我们非常期待的递归)。最后,BOM扩展后,我们将数据挂在树上呈现。然后我们将分几步来操作它。

  ×01、建窗体

  如下图所示,我们需要在窗体上建立一个新的窗体并放置一个文本框(txtProductCode),一个按钮(btnOK),一个树控件(Bom_Tree),标签控件(Label_Path),子窗体控件(frmChild)

Access的BOM开发(3)BOM展开_vba

  子窗体为数据表窗体,窗体的数据源为(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() GetTreeEnd SubPrivate Sub Form_Load() Me.Bom_Tree.Nodes.Clear Me.frmChild.Form.RecordSource = "select * from qryBOM where 1=2" Me.Label_Path.Caption = ""End SubPrivate 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 SubErrorHandler: MsgBox Err.Description, vbCritical Resume ExitHereEnd SubPrivate 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!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.CloseExitHere:Set rst = Nothing Exit SubErrorHandler: MsgBox Err.Description, vbCritical Resume ExitHereEnd SubPrivate Sub Bom_Tree_LostFocus() Set Me.Bom_Tree.DropHighlight = Me.Bom_Tree.SelectedItemEnd SubPrivate Sub Bom_Tree_GotFocus() Set Me.Bom_Tree.DropHighlight = NothingEnd SubPrivate 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 = strSQLEnd Sub

  我们自己写了一个函数,在这里我们使用递归,我们在后面的视频中解释

Access的BOM开发(3)BOM展开_vba_02

  ×03、运行测试

  最后一步是操作测试。

Access的BOM开发(3)BOM展开_access_03

  注意,扩展需要输入完整的产品代码,不能模糊查询。

  我们本次分享的内容主要用于学习树控件,我们只是整个简单的BOM系统 ,假如需要作为一个系统使用,还需要完善当前的功能,那么这个任务就交给大家吧。

上一篇 oracle PL/SQL的基本构成,结构控制语句,分支结构,选择结构,loop循环结构,
下一篇 【VBA树控件学习三】新增树TreeView节点

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题