bom树形结构 表设计_按树型显示BOM的结构

在制造企业中,生产的每一个产品都由一道或多道工序组成,在组成成品之前,每一道工序经由物料--物料组成半成品,或物料--半成品组成新的半成品,亦或由半成品--半成品组成新的半成品。复杂的成品经由多道工序最终形成。在这一过程中,某一物料或半成品可能出现在多道工序这中。而每一道工序又涉及损耗(包括调机损耗和加工损耗等)等一系列问题都是需要在实际的生产系统中考虑到。在从事ERP与MES开发多年,目前系统设计的结构已满足了这些方方面的要求。今天,趁着闲暇的时候记录一下,一来是自己对整个结构做一个回顾,另一方面也希望给新人一丁点启发。

首先,我们的BOM结构主要分为三层。其基本表是 Bom, BomDTL, BomDTL2

其各表的关键字如下图:

bc1642e6e51d871c1dabfaf5f5b8833c.png

Ancestor --产品型号(当前工序完成后的型号),Ver--版本

SpecNum -- 生产规格

ProVer   -- 当前工序所需的型号(物料或半成品), ProVer 版本

其对应在画面中的体现,如下图。

29552709fad1f187ac250b195bd50d01.png

而又把其中的半成品,第三层中的BA***, 放到产品型号中去查询。得出下图

b5f690bf37b56a8316f104b33c1112d1.png

如此往复,直到达到最初的一道工序为止。

而做为技术或生产来说,做录入完资料之后,其是非常需要一个报表或者图形来直观反映所输的内容是否正确。

打印以上设计卡,得出相应的报表结构。

04c1bc48d7911e0b735054d645c10ce2.png

b94b4c001d95ad221754236ecd0cd34b.png

看最后的两道工序,与之前画面中的匹配。

现在我们要实现以上层层嵌套的的树状结构。贴出效果图和关键代码。

下图中红色的方框的数据是在实际的生产过程中,同一个型号有可能多个颜色。而这个颜色的这部分BOM是可由系统自动产生。

400c71d9dff825cc6c5534b26fc9d3f6.png

下面是关键的代码。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

private void btnSearch_Click(objectsender, EventArgs e)

{if (txtDrawFrom.Text == "" && txtDrawTo.Text == "")

{

MessageBox.Show("请输入设计卡查询条件", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return;

}string strSQL = String.Format("exec frmBomMap_List '{0}','{1}'", txtDrawFrom.Text, txtDrawTo.Text);this.treeView1.Nodes.Clear();//先清空

this.listView1.Items.Clear();//先清空

try{

datasource= W1.DS(strSQL, "Sys");

TreeNode node= new TreeNode() { Text = "Root", ToolTipText = "Root"};this.treeView1.Nodes.Add(node);

node.ImageIndex= 2;

node.SelectedImageIndex= 2;

C_BomOP.CreateTreeViewRecursive(treeView1.Nodes[0].Nodes, datasource.Tables[0], "Root", "Root", -1);//第一个节点下//treeView1不展开,listView清空数据

this.treeView1.ExpandAll();this.listView1.Items.Clear();

}catch(Exception ex)

{//throw new Exception(ex.Message);//MessageBox.Show( ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}public void CreateTreeViewRecursive(TreeNodeCollection nodes, DataTable dataSourse, string parentId, string topAncestor,intlevel)

{string topmodel = "";string filter = string.Format("Ancestor='{0}'and ( Ancestor='Root' or TOPLEVEL='{1}') and BOMLEVEL = {2}", parentId, topAncestor, level); //AND ( ProType='03' or ProType='02')//查询子节点

DataRow[] drArr =dataSourse.Select(filter);

level++; //需放到外层来。不然并行的一道工序就会导致相加了。以致结果不正确,这里要特别留意一下

TreeNode node;foreach (DataRow dr indrArr)

{

node= newTreeNode();

nodes.Add(node);

node.Text= (string)dr["ProNum"];

node.ToolTipText= String.Format("{0}\n{1}", (string)dr["TOPLEVEL"], level);

topmodel= (string)dr["TOPLEVEL"];//递归创建子节点

CreateTreeViewRecursive(node.Nodes, dataSourse, dr["ProNum"].ToString(),topmodel,level);

}

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

ALTER PROCEDURE [dbo].[frmBomMap_List]

@sknum1 VARCHAR(50),@sknum2 VARCHAR(50)AS

CREATE TABLE #TEMP(TOPLEVELVARCHAR(50) COLLATE Chinese_PRC_BIN,

AncestorVARCHAR(50) COLLATE Chinese_PRC_BIN,

ProNumVARCHAR(50) COLLATE Chinese_PRC_BIN,[SETS] INT,

QTYFLOAT,

BOMLEVELINT)SELECT TOPLEVEL=Ancestor,Ancestor='Root',ProNum=Ancestor,Ver INTO #t1 FROMdbo.BomWHERE DrawNum between @sknum1 AND @sknum2

AND IsEffect=1 --AND IsOrigin=1 -- 非原型也要取

IF (SELECT COUNT(1) FROM #t1) >200

BEGIN

RAISERROR('数据过多,请缩小设计卡的范围',11,-1)RETURN

END

SELECT * INTO #t2 FROM#t1declare @ancestor varchar(50),@version VARCHAR(5)while (select count(*) from #t1)>0

BEGIN

select TOP 1 @ancestor=TOPLEVEL,@version=Ver FROM#t1delete #t1 where TOPLEVEL=@ancestor AND Ver=@version;WITH BOMList(TOPLEVEL, Ancestor, ProNum,[SETS], QTY,BOMLEVEL) AS(SELECT TOPLEVEL=Ancestor, Ancestor,ProNum,Sets, Qty AS QTY, 0 AS BOMLEVEL --Sets*Qty AS QTY

FROMdbo.BomDTL2WHERE Ancestor=@ancestor AND Ver=@version

UNION ALL

SELECT TOPLEVEL, B2.Ancestor, B2.ProNum, B2.Sets,B2.Qty AS QTY,BOMLEVEL + 1

FROMBomDTL2 B2, BOMList BBWHERE B2.Ancestor=BB.ProNum

)INSERT #TEMP

SELECT TOPLEVEL, Ancestor, ProNum,[SETS],QTY,BOMLEVELFROMBOMListEND

--delete #TEMP where ProNum in (select Ancestor from #TEMP)

SELECT DISTINCT #TEMP.*,p.ProType FROM #TEMP,dbo.Product pWHERE #TEMP.ProNum =p.ProNumUNION ALL SELECT TOPLEVEL,Ancestor,ProNum,1,1,-1,'02' FROM #t2 --02是成品

ORDER BY TOPLEVEL ASC,BOMLEVEL ASC,ProType DESC,ProNum ASC

DROP TABLE #t1,#t2,#TEMP

View Code

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

康雨豪

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值