以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助重新的生成  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=108566)

--  作者:blsu33
--  发布时间:2017/10/25 10:53:00
--  [求助重新的生成

老师,

  根据精华的帖子,这边需要些更改但是,有些不是很明白,希望老师给改下,通过改过的,学习下这部分代码的使用,劳烦您了。

 


 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:bom - 副本.zip

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:bom展开 - 副本.table

[此贴子已经被作者于2017/10/25 12:20:02编辑过]

--  作者:blsu33
--  发布时间:2017/10/25 10:58:00
--  

原贴是有BOM 表的ID整数列 物料表的ID列,都被删除了;希望通过编号列进行处理


--  作者:有点甜
--  发布时间:2017/10/25 12:00:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:bom展开.table


--  作者: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
--  
结果不对 ,劳烦您再给看下。