📄 bomsinglemform2.frm
字号:
Private Sub ReadChildrenNodes(bomId As String, parentNode As Node)
Dim ret As Boolean
Dim rec As ADODB.Recordset ' 数据操作数据集对象
Dim skey As String
Dim text As String
Dim iIndex As Integer
Dim oNodex As Node
Set rec = New ADODB.Recordset
ret = m_bomDAO.FindDetailBom(rec, bomId) ' 到数据库查找其所有子BOM列表
If ret Then ' 如果找到明细则增加到树中
With rec
Do While Not .EOF
'[>>自定义填充内容
' 把本行数据加入树中
iIndex = parentNode.Index
skey = GetNextKey()
text = Trim(.Fields("name")) + "(" + Trim(.Fields("quantity")) + ")"
Set oNodex = TV_bomManage.Nodes.Add(iIndex, tvwChild, skey, text, 1, 2)
oNodex.EnsureVisible
oNodex.Tag = Trim(.Fields("bomId"))
ReadChildrenNodes oNodex.Tag, oNodex
'<<]
'动态集指针加1,同时将计数器加1(Fixed)
.MoveNext
Loop
End With
End If
rec.Close
' Unload rec
End Sub
'**************************************
'* 功 能 描 述 :计算BOM表中各BOM及子BOM的成本,并修改其成本
'* 输 入 参 数 :bomId - 要计算成本的BOM的ID
'* 输 出 能 数 :无
'**************************************
Private Sub CalBomCost(bomId As String)
Dim ret As Boolean
Dim rec As ADODB.Recordset ' 数据操作数据集对象
Dim cost As Double
Dim detailNum As Integer ' 一个明细的数量
Dim detailCost As Double ' 一个明细的成本
Dim detailFee As Double ' 一个明细的加工费
Set rec = New ADODB.Recordset
ret = m_bomDAO.FindDetailBom(rec, bomId) ' 到数据库查找其所有子BOM列表
If ret Then ' 如果找到明细则增加到树中
cost = 0 ' 成本设置成 0
With rec
Do While Not .EOF
'[>>自定义填充内容
' 把本行数据加入树中
CalBomCost Trim(.Fields("bomId"))
detailNum = CInt(.Fields("quantity"))
detailCost = CDbl(.Fields("bomCost"))
detailFee = CDbl(.Fields("fee"))
cost = cost + detailNum * (detailCost + detailFee)
'<<]
'动态集指针加1,同时将计数器加1(Fixed)
.MoveNext
Loop
End With
' 修改本条BOM表的成本
m_bomDAO.ModifyBomCost m_recordset, cost, bomId
End If
rec.Close
' Unload rec
End Sub
'**************************************
'* 功 能 描 述 :清除当前选中节点的所有子节点
'* 输 入 参 数 :无
'* 输 出 能 数 :无
'**************************************
Private Sub ClearSubTree()
Dim s As String
Dim hasChild As Boolean
Dim iIndex As Integer
If m_currentLevel = 0 Then ' 当前编辑根结点,清除树中所有的节点
TV_bomManage.Nodes.clear
Else ' 非根结点,清除当前选中节点的所有子节点
' s = TV_bomManage.SelectedItem.Child.FirstSibling.Key
hasChild = True
On Error GoTo EXITSUB
Do While hasChild
iIndex = TV_bomManage.SelectedItem.Child.Index
TV_bomManage.Nodes.Remove iIndex
Loop
End If
Exit Sub
EXITSUB:
hasChild = False
Exit Sub
End Sub
'**************************************
'* 功 能 描 述 :清除当前子BOM列表中的所有行
'* 输 入 参 数 :无
'* 输 出 能 数 :无
'**************************************
Private Sub ClearAllLine()
HFG_detail.clear
RefreshListTitle
End Sub
'**************************************
'* 功 能 描 述 :清除当前所有文本框
'* 输 入 参 数 :无
'* 输 出 能 数 :无
'**************************************
Private Sub ClearAllText()
T_name.text = ""
T_ProcessName.text = ""
T_fee.text = ""
T_bomCost.text = ""
T_number.text = ""
T_memo.text = ""
End Sub
'**************************************
'* 功 能 描 述 :在Bom树中新增根结点
'* 输 入 参 数 :无
'* 输 出 能 数 :无
'**************************************
Private Sub CreateLastNode()
Dim skey As String
skey = GetNextKey()
TV_bomManage.Nodes.Add , tvwLast, skey, "Last " & skey, 1, 2
Exit Sub
End Sub
'**************************************
'* 功 能 描 述 :检验数据的合法情
'* 输 入 参 数 :checkType - 0 对根结点进行测试
'* - 1 对列表进行测试
'* line - n 对列表中的第N行进行测试
'* 输 出 能 数 :无
'**************************************
Private Function Check(checkType As Integer, line As Integer) As Boolean
Check = True
If checkType = 0 Then ' 对根结点进行测试
If Trim(HFG_detail.TextMatrix(line, 2)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 3)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 4)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 10)) = "" Then
Check = False
End If
Else ' 对列表进行测试
If Trim(HFG_detail.TextMatrix(line, 2)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 3)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 4)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 10)) = "" Then
Check = False
End If
If Trim(HFG_detail.TextMatrix(line, 5)) = "" Then
Check = False
End If
End If
End Function
Private Function GetNextKey() As String
'Returns a new key value for each Node being added to the TreeView
'This algorithm is very simple and will limit you to adding a total of 999 nodes
'Each node needs a unique key. If you allow users to remove Nodes you can't use
'the Nodes count +1 as the key for a new node.
Dim sNewKey As String
Dim iHold As Integer
Dim i As Integer
On Error GoTo myerr
'The next line will return error #35600 if there are no Nodes in the TreeView
iHold = Val(TV_bomManage.Nodes(1).Key)
For i = 1 To TV_bomManage.Nodes.Count
If Val(TV_bomManage.Nodes(i).Key) > iHold Then
iHold = Val(TV_bomManage.Nodes(i).Key)
End If
Next
iHold = iHold + 1
sNewKey = CStr(iHold) & "_"
GetNextKey = sNewKey 'Return a unique key
Exit Function
myerr:
'Because the TreeView is empty return a 1 for the key of the first Node
GetNextKey = "1_"
Exit Function
End Function
'**************************************
'* 功 能 描 述 :用户选中一个节点后的处理
'* 输 入 参 数 :
'* 输 出 能 数 :无
'**************************************
Private Sub TV_bomManage_NodeClick(ByVal Node As MSComctlLib.Node)
Dim ret As Boolean
Dim currentrow As Integer
m_currentLevel = JudgeLevel()
' 读出选中的结点信息,并把其信息存放入m_parentBom中
ret = m_bomDAO.FindById(m_recordset, Trim(Node.Tag))
If ret Then
With m_recordset
'[>>自定义填充内容
' 把找到的BOM存入当前列表的父节点中
m_parentBom.bomCost = Trim(.Fields("bomCost"))
m_parentBom.bomId = Trim(.Fields("bomId"))
m_parentBom.description = Trim(.Fields("description"))
m_parentBom.fee = Trim(.Fields("fee"))
m_parentBom.materialId = Trim(.Fields("materialId"))
m_parentBom.materialType = Trim(.Fields("materialType"))
m_parentBom.name = Trim(.Fields("name"))
m_parentBom.processName = Trim(.Fields("processName"))
'<<]
End With
m_recordset.Close
End If
' 读出选中节点的所有子节点,并显示在列表中
ret = m_bomDAO.FindDetailBom(m_recordset, Trim(Node.Tag))
HFG_detail.clear
HFG_detail.Rows = 2
RefreshListTitle
If ret Then
With m_recordset
' HFG_detail.Rows = m_recordset.RecordCount
currentrow = 1
Do While Not .EOF
If currentrow > HFG_detail.Rows - 1 Then
HFG_detail.AddItem ""
End If
'[>>自定义填充内容
HFG_detail.TextMatrix(currentrow, 0) = "Y"
HFG_detail.TextMatrix(currentrow, 1) = Trim(.Fields("name"))
HFG_detail.TextMatrix(currentrow, 2) = Trim(.Fields("processName"))
HFG_detail.TextMatrix(currentrow, 3) = Trim(.Fields("fee"))
HFG_detail.TextMatrix(currentrow, 4) = Trim(.Fields("bomCost"))
HFG_detail.TextMatrix(currentrow, 5) = Trim(.Fields("quantity")) ' 明细的数量
HFG_detail.TextMatrix(currentrow, 6) = Trim(.Fields("description"))
HFG_detail.TextMatrix(currentrow, 7) = Trim(.Fields("bomId")) ' 当为空时为新增BOM表,不空为修改
HFG_detail.TextMatrix(currentrow, 8) = Trim(.Fields("bomDetailId")) ' 当为空时 - 新增明细(非根结点情况) 当不空时 - 修改明细(数量)
HFG_detail.TextMatrix(currentrow, 9) = Trim(.Fields("materialType")) ' 0-原料 1-零件 2-产品
HFG_detail.TextMatrix(currentrow, 10) = Trim(.Fields("materialId"))
'<<]
'设置数据行高度(Fixed)
HFG_detail.RowHeight(currentrow) = 200
'动态集指针加1,同时将计数器加1(Fixed)
.MoveNext
currentrow = currentrow + 1
Loop
End With
ListToTextbox
End If
ListToTextbox
m_recordset.Close
End Sub
'**************************************
'* 功 能 描 述 :判断当前选中的节点是第几层
'* 输 入 参 数 :无
'* 输 出 能 数 :无
'**************************************
Private Function JudgeLevel() As Integer
Dim level As Integer
Dim temp As Node
level = 1
Set temp = TV_bomManage.SelectedItem
Do While temp <> TV_bomManage.SelectedItem.Root
Set temp = temp.Parent
level = level + 1
Loop
JudgeLevel = level
End Function
'**************************************
'* 功 能 描 述 :复制一个BOM资料并反回新BOM 的ID
'* 输 入 参 数 :无
'* 输 出 能 数 :无
'**************************************
Private Function BomCopy(Source As String) As String
Dim ret As Boolean
Dim id As String ' 新生成的BOM记录的ID
id = m_bomDAO.NewBom(m_recordset, _
Trim(HFG_detail.TextMatrix(1, 1)), _
Trim(HFG_detail.TextMatrix(1, 6)), _
CDbl(HFG_detail.TextMatrix(1, 3)), _
Trim(HFG_detail.TextMatrix(1, 2)), _
CDbl(HFG_detail.TextMatrix(1, 4)), _
Trim(HFG_detail.TextMatrix(1, 10)), _
Trim(HFG_detail.TextMatrix(1, 9)))
HFG_detail.TextMatrix(HFG_detail.row, 7) = id
' 找到源BOM的所有子BOM
ret = m_bomDAO.FindDetailBom(m_recordset, Source)
If ret Then
With m_recordset
Do While Not .EOF
'[>>自定义填充内容
m_bomDAO.NewBomDetail m_recordset, _
id, _
Trim(.Fields("bomId")), _
CInt(Trim(.Fields("quantity")))
'<<]
'动态集指针加1,同时将计数器加1(Fixed)
.MoveNext
Loop
End With
End If
m_recordset.Close
BomCopy = id
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -