在制造企业中,生产的每一个产品都由一道或多道工序组成,在组成成品之前,每一道工序经由物料--物料组成半成品,或物料--半成品组成新的半成品,亦或由半成品--半成品组成新的半成品。复杂的成品经由多道工序最终形成。在这一过程中,某一物料或半成品可能出现在多道工序这中。而每一道工序又涉及损耗(包括调机损耗和加工损耗等)等一系列问题都是需要在实际的生产系统中考虑到。在从事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 = 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,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);}}

View Code

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
BEGINRAISERROR('数据过多,请缩小设计卡的范围',11,-1)    RETURN
ENDSELECT * 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,'02' FROM #t2  -- 02是成品    ORDER BY  TOPLEVEL ASC,BOMLEVEL ASC,ProType DESC,ProNum ASC    DROP TABLE #t1,#t2,#TEMP  

View Code

转载于:https://www.cnblogs.com/Geton/p/5442979.html

按树型显示BOM的结构相关推荐

  1. Vue实战篇十七:用树型组件实现一个文档目录结构

    系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...

  2. bom树形结构 表设计_K/3管理视角:树形结构下的BOM管理方式!

    原标题:K/3管理视角:树形结构下的BOM管理方式! BOM(物料清单),也就是以数据格式来描述产品结构的文件,是ERP使用过程中的重要组成部分.通过BOM我们能够清晰的了解产品的结构以及所需要的物料 ...

  3. dtree和jquery构建树型结构

    对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...

  4. axure树形表格_Axure教程:可增删改的树型结构

    原标题:Axure教程:可增删改的树型结构 今天,教大家如何做一个树型结构,以及节点与节点之间相互交互的内容. 演示地址:http://b0bgsg.axshare.cn/#g=1&p=树 一 ...

  5. 无限极分类php简单,创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...

  6. Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)

    1. 背景 Linux 操作系统中的流量控制器 TC (Traffic Control) 用于Linux内核的流量控制,它规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控 ...

  7. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

    小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...

  8. EF架构~单表一对多集合的插入(树型结构)

    单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...

  9. C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    为什么80%的码农都做不了架构师?>>>    应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...

最新文章

  1. System.Windows.Forms.Timer在线程中的注意事项
  2. 零基础学Python(第十四章 字典)
  3. ubuntu 16.04 安装ftp服务
  4. JDK 的 ORACLE 官网下载步骤
  5. mega linux教程,MegaRAID Storage Manager (MSM)安装使用教程
  6. 致远SPM之金蝶K3集成解决方案
  7. oracle获取字符串长度函数length()和hengthb()
  8. 如何批量下载央视CNTV的节目视频
  9. shader篇-阴影
  10. u盘变o字节怎么修复_U盘变成0字节了数据怎么恢复
  11. 【Python】8.有益的探索
  12. python 循环写入excel sheet_python 使用xlsxwriter循环向excel中插入数据和图片的操作...
  13. python pip安装包导入导出及下载包(只下载不安装)
  14. 学渣的刷题之旅 leetcode刷题 67.二进制求和
  15. linux视频拼接工具,linux中使用ffmpeg 无损剪切/拼接视频程序
  16. SDL的教学(如何用sdl图形化以及sdl的使用思路)
  17. 【小白搞机入门】名词集-BootLoader锁(BL锁)
  18. iOS开发常用第三方开源框架
  19. 静态网页制作教程 (转载)
  20. oracle 优化逻辑读过高,SQL逻辑读高的优化

热门文章

  1. Linux Socket编程(不限Linux)
  2. 尤金 卡巴斯基:网络安全已陷“黑暗时代”,我们该如何应对?
  3. RPC简介,及与web service的对比
  4. stitching detail输出的dot图含义
  5. IOS 学习---触摸事件与手势
  6. WinDbg用法详解
  7. 微服务之配置中心ConfigKeeper
  8. 《高阶Perl》——导读
  9. LSASRV事件ID:40960
  10. 关于程序猿的几个阶段!