'用于展开BOM
Dim BomID As List(Of String) = Args(0) '要展开的BOM的ID集合
Dim BOMdt As DataTable = Args(1) '存放数据的表
Dim level As Integer = Args(2) 'BOM的级次
Dim flex As C1FlexGrid.C1FlexGrid = Args(3)
Dim i As Integer = 1 '存放序号
If BomID.Count = 0 Then Return Nothing '检查参数
Dim Filler As String
For Each str As String In BomID
Filler = Filler & "'" & str & "',"
Next
Filler = Filler.Trim(",")
Filler = "父键 IN(" & Filler & ")"
''获取BOM 数据
Dim dt As DataTable '存放BOM的表
Dim cmd As New SQLCommand
cmd.C
'cmd.CommandText = " Select '1' AS 序号,ID,'' as 编号, '' as 名称, '' as 规格, '' as 材料, '' as 备注, 父键, 子键, " _
'& "数量 As 标准用量,0 As 数量, 次序,0 As BOM级次 FR OM BOM WHERE " & Filler
cmd.CommandText = " Select '1' AS 序号,'' as 编号, '' as 名称, '' as 规格, '' as 材料, '' as 备注, 父键, 子键,数量 As 标准用量,0 As 数量, 次序,0 As BOM级次 FR OM BOM WHERE " & Filler
MessageBox.Show(cmd.CommandText)
'output.show(cmd.CommandText)
dt = cmd.ExecuteReader
If dt.DataRows.Count = 0 Then Return Nothing '没有返回值就返回
Dim j As Integer = 1
Dim Node As C1FlexGrid.Node
If flex.Rows.count = 1 Then '是第一层,就直接添加
For Each dr As DataRow In dt.DataRows
Node = flex.Rows.InsertNode(flex.Rows.Count, level)
For Each c As DataCol In dt.DataCols
Node.Row(c.name) = dr(c.name)
Next
Node.Row("序号") = j
Node.Row("排序列") = dr("次序")
Node.Row("次序") =1
Node.Row("数量") = dr("标准用量")
Node.Row("BOM级次") = level
j += 1
Next
Else '不是第一层,就执行下列语句
'放入字典,数据量大的时候会快一点,将数据按父键整理
Dim iid As String
Dim dic As new Dictionary(of String,List(of DataRow))
For Each dr As DataRow In dt.Select("","父键,次序")
iid = dr("父键")
If dic.ContainsKey(iid) Then
dic(iid).add(dr)
Else
Dim lisa As new List(of DataRow)
lisa.Add(dr)
dic.Add(dr("父键"),lisa)
End If
Next
'遍历填充
Dim lis As List(of DataRow)
Dim I数量 As Integer
Dim str序号 As String
Dim dr1 As C1FlexGrid.Row
Do While i < flex.Rows.count
dr1 = flex.Rows(i)
dr1("排序列") = i
i += 1
If dr1("BOM级次") = level - 1 Then
iid = dr1("子键")
I数量 = dr1("数量")
str序号 = dr1("序号")
If iid <> Nothing AndAlso dic.ContainsKey(iid) Then
lis = dic(iid)
For Each dr2 As DataRow In lis
Node = flex.Rows.InsertNode(i,level)
For Each dc As DataCol In dr2.DataTable.DataCols
Node.Row(dc.name) = dr2(dc.name)
Next
Node.Row("数量") = dr2("标准用量") * I数量
Node.Row("排序列") = i
Node.Row("BOM级次") = level
Node.Row("次序") = level
Node.Row("序号") = str序号 & "." & dr2("次序")
i += 1
Next
End If
End If
Loop
End If
Dim BID As List(Of String) = dt.GetValues("子键",filler,"")
Functions.Execute("BOMExplosion",BID,BOMdt,level + 1 ,flex)