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

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

其各表的关键字如下图:

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

SpecNum -- 生产规格

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

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

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

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

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

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

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

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

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

下面是关键的代码。

 private void btnSearch_Click(object sender, 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 = ;
node.SelectedImageIndex = ; C_BomOP.CreateTreeViewRecursive(treeView1.Nodes[].Nodes, datasource.Tables[], "Root", "Root", -);//第一个节点下 //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,int level)
{
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 in drArr)
{
node = new TreeNode();
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);
}
}
ALTER PROCEDURE [dbo].[frmBomMap_List]
@sknum1 VARCHAR(50),
@sknum2 VARCHAR(50) AS
CREATE TABLE #TEMP
(TOPLEVEL VARCHAR(50) COLLATE Chinese_PRC_BIN,
Ancestor VARCHAR(50) COLLATE Chinese_PRC_BIN,
ProNum VARCHAR(50) COLLATE Chinese_PRC_BIN,
[SETS] INT,
QTY FLOAT,
BOMLEVEL INT) SELECT TOPLEVEL=Ancestor,Ancestor='Root',ProNum=Ancestor,Ver INTO #t1 FROM dbo.Bom
WHERE 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 #t1 declare @ancestor varchar(50),@version VARCHAR(5)
while (select count(*) from #t1)>0
BEGIN
select TOP 1 @ancestor=TOPLEVEL,@version=Ver FROM #t1
delete #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
FROM dbo.BomDTL2
WHERE Ancestor=@ancestor AND Ver=@version
UNION ALL
SELECT TOPLEVEL, B2.Ancestor, B2.ProNum, B2.Sets,B2.Qty AS QTY,BOMLEVEL + 1
FROM BomDTL2 B2, BOMList BB
WHERE B2.Ancestor=BB.ProNum
)
INSERT #TEMP
SELECT TOPLEVEL, Ancestor, ProNum,[SETS],QTY,BOMLEVEL
FROM BOMList
END --delete #TEMP where ProNum in (select Ancestor from #TEMP) SELECT DISTINCT #TEMP.*,p.ProType FROM #TEMP,dbo.Product p
WHERE #TEMP.ProNum = p.ProNum
UNION ALL SELECT TOPLEVEL,Ancestor,ProNum,1,1,-1,'' FROM #t2 -- 02是成品 ORDER BY TOPLEVEL ASC,BOMLEVEL ASC,ProType DESC,ProNum ASC DROP TABLE #t1,#t2,#TEMP

按树型显示BOM的结构的更多相关文章

  1. WPF 4 目录树型显示

    原文:WPF 4 目录树型显示      本篇将通过WPF4 制作简单的目录树型结构显示实例,完成本篇内容我们将作出下图所示的应用程序.      从图中我们可以看到程序主要分为两部分:左边显示本地驱 ...

  2. java实现第八届蓝桥杯树型显示

    树型显示 题目描述 对于分类结构可以用树形来形象地表示.比如:文件系统就是典型的例子. 树中的结点具有父子关系.我们在显示的时候,把子项向右缩进(用空格,不是tab),并添加必要的连接线,以使其层次关 ...

  3. dzzoffice的树型结构用户管理设计

    在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...

  4. JSP中的一个树型结构

    看方力勋的javaWeb,采用左右值来表示树型结构(就是俺门的多级分类)表结构 页面代码 <%@ page language="java" import="java ...

  5. java树型结构的数据展现设计

    在做一个需求管理的页面时,需求的展现是不限层级树型结构,需求下还可以分拆任务,页面要展现的字段有20多个,而且需求采用通用表单设计,db采用大宽表存储,有一百多个字段.目前数据量不大,第一版采用普通的 ...

  6. 20-Ubuntu-文件和目录命令-查看目录树型结构-tree

    tree 以树状图列出当前目录下的文件目录结构 选项 含义 -d 只显示当前目录的子目录树型结构   显示当前目录的子目录和文件树型结构 例: 1.查看文档目录下的子目录和文件树型结构 2.查看文档目 ...

  7. 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。

    设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件. 我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录 ...

  8. Rafy 领域实体框架 - 树型实体功能(自关联表)

      在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...

  9. VC中实现带有背景位图的树型控件

    当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C++编程爱好者来说,使用Visual C++MFC提供的树型控件(CTreeCtrl)本身就是一个难点, ...

随机推荐

  1. 【bzoj3786】星系探索

    ETT模版题. 真正的Eular-Tour-Tree维护的是树的欧拉序. 由于各种原因,没人知道怎么维护欧拉序,所以我写的是个假的,维护dfs序的. 本质还是用Splay维护序列. 然后因为我常数太差 ...

  2. 部署HBase系统(分布式部署)

    1.简介 HBase系统主要依赖于zookeeper和hdfs系统,所以部署HBase需要先去部署zookeeper和hadoop 2.部署开始 IP或者HOSTNAME需要根据自身主机信息设定. 部 ...

  3. Tomcat手动指定jdk路径

    Windows系统: 修改bin下的setclasspath.bat,在开头处添加: rem set specific jdkset JAVA_HOME=%CATALINA_HOME%\jdk1.8. ...

  4. P1474 货币系统 Money Systems(完全背包求填充方案数)

    题目链接:https://www.luogu.org/problemnew/show/1474 题目大意:有V种货币,求用V种货币凑出面值N有多少种方案. 解题思路:就是完全背包问题,只是将求最大价值 ...

  5. HDFS初识

    参看原文 [Hadoop]HDFS的运行原理 参看原文 还不懂HDFS的工作原理?快来扫扫盲 简介 HDFS(Hadoop Distributed File System) Hadoop分布式文件系统 ...

  6. [转]6个HelloWorld

    原文地址:点击打开链接 转这个帖子,是因为看了这个帖子使我明白了一个道理:一旦你发散自己的思维,激发自己的创意,就会发现原来编程是这么的好玩. 原文标题为<6个变态的C语言Hello World ...

  7. 《深入浅出MyBatis技术原理与实战》——3. 配置

    要注意的是上面那些层次是不能够颠倒顺序的,否则MyBatis在解析文件的时候就会出现异常. 3.1 properties元素 properties是一个属性配置元素,让我们能在配置文件的上下文中使用它 ...

  8. 【转载】Web开发技术发展历史-版本2

    原文在这里. Web开发的发展史 导读:Arunr 把过去 15 年以来,Web开发从最初的纯 HTML 到 CGI.PHP\JSP\ASP.Ajax.Rails.NodeJS 这个过程简要地进行了介 ...

  9. 限制输入字符个数的jq插件

    (function($) { $.fn.extend( { limiter: function(limit, elem) { $(this).on("keyup focus", f ...

  10. 微软企业库5.0 学习之路——第二步、使用VS2010+Data Access模块建立多数据库项目

    现在我就开始进入学习之路的第二步——Data Access模块,这个模块是企业库中被使用频率最高的模块,它很好的封装了数据库操作应用,为我们进行多数据库系统开发提供了便利,只需更改配置文件就 可以很快 ...