以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助重新的生成 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=108566) |
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 10:53:00 -- [求助重新的生成 老师, 根据精华的帖子,这边需要些更改但是,有些不是很明白,希望老师给改下,通过改过的,学习下这部分代码的使用,劳烦您了。
[此贴子已经被作者于2017/10/25 12:20:02编辑过]
|
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 10:58:00 -- 原贴是有BOM 表的ID整数列 物料表的ID列,都被删除了;希望通过编号列进行处理 |
||||||||
-- 作者:有点甜 -- 发布时间:2017/10/25 12:00:00 --
|
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 12:08:00 -- 多谢老师,还没吃午饭呢吧。
看了下已经实现,追问: 1、bom 表的次序列是需要经常维护的对吗,而不能生成的?
|
||||||||
-- 作者:有点甜 -- 发布时间:2017/10/25 12:19:00 -- 你可以根据递归自动生成层级次序,你也可以手动维护。 |
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 12:26:00 -- 老师, 能在给改下吗,自动生成层级次序。 |
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 12:45:00 -- 老师我先自己试试 您先忙 |
||||||||
-- 作者:有点甜 -- 发布时间:2017/10/25 12:50:00 -- 以下是引用blsu33在2017/10/25 12:26:00的发言:
老师, 能在给改下吗,自动生成层级次序。
参考 http://www.foxtable.com/webhelp/scr/2416.htm
|
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 16:15:00 -- 老师, 这个次序什么规则,没看明白,没看出原来精华帖的次序是什么意思;不知道这样改对不对,是正确答案吗? \'用于展开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) [此贴子已经被作者于2017/10/25 16:17:09编辑过]
|
||||||||
-- 作者:blsu33 -- 发布时间:2017/10/25 16:19:00 -- 结果不对 ,劳烦您再给看下。 |