SQL自定义函数实现多阶BOM表格查询
本文档主要探讨了如何在SQL中使用自定义函数(dbo.FN_GetBomtreeForWorkCenter)来处理多阶BOM(Bill of Materials)数据,特别是在不同版本的情况下进行展开。BOM是一种产品制造过程中所需原材料或组件清单,用于跟踪和管理生产过程中的层级关系。函数的输入参数包括发票号(@INVNO)、工程号(@INV_ENGNO)等,根据不同的标志(@INVFLAG)区分实体信息(当@INVFLAG = 1时)和非实体信息(@INVFLAG = 0时)。函数返回一个表值结果集(table-valued function),包含BOM树的多个字段,如物料代码(bod_fxdm)、物料组别(bod_fxgx)、层次级(ilevel)、工作中心代码(wc_cs_code)等。 函数的核心部分通过递归实现多阶BOM的展开。首先,根据输入的发票号或工程号(如果适用)设置基础物料代码变量@fxdm。然后,初始化两个计数器变量,@level 用于记录当前层级,@Max_level 用于存储最大层级。接下来,开始查询BOMMC表,获取基础信息并将其插入到结果集`@treeinfo`中。 在查询中,如果输入的是实体信息,会使用@INVNO,否则使用MB001字段。对于每个查询结果,函数会更新层级(@level),并将当前层级物料的上一级物料信息(MF004字段)作为组别显示。如果MF004为空,则使用默认值'zzzz'。同时,还包含了其他字段如物料编码、物料组别、工作中心属性( InvPropert)等。 值得注意的是,该函数还包含了额外的参数如@ilevel_list 和 @ilevel_desc,它们可能是用来存储和展示层级信息的详细描述。另外,函数还包括了对工作中心代码(wc_cs_code)和某些特定标记(如@bhzc 和 @ck)的处理,以及可能用于版本控制的PURMA002字段。 这个函数适用于任何支持SQL的数据库系统,特别是那些允许创建和使用表值函数的系统,如SQL Server。它能够帮助用户高效地处理复杂的BOM数据结构,无论版本号如何变化,都能灵活地进行多阶展开和查询。这对于生产制造、库存管理和供应链管理等领域具有重要的实际应用价值。
CREATE FUNCTION dbo.FN_GetBomtreeForWorkCenter
--SELECT * FROM dbo.FN_GetBomtreeForWorkCenter('1001420','','1')
(
@INVNO as varchar(20), ----输入品号信息
@INV_ENGNO as varchar(30),----输入工程号
@INVFLAG bit =1 --输入条件识别1为品号0为工程号
)
RETURNS @treeinfo table
(
[bod_fxdm] [varchar] (20) NULL, [bod_fxgx] [varchar] (6) NULL, [bod_zxdm] [varchar] (20) NULL, [bod_zxgx] [varchar] (6) NULL, [bod_dwyl] [numeric](19, 5) NULL, [bod_wldw] [varchar] (6) NULL, [bod_dwbs] [numeric](9, 0) NULL, [bod_shjs] [numeric](6, 2) NULL, [bod_shl] [numeric](8, 5) NULL, [bod_ksrq] [datetime]NULL, [bod_sxrq][datetime] NULL,[bod_xsbz] [char] (1) NULL, [bod_bz] [varchar] (255) NULL, [ilevel] [int], [ilevel_list] [int],[InvPropert] [char](1), [ilevel_desc] [varchar](20),[wc_cs_code] [varchar](10) null,[bhzc] [char](1) null,[ck] [char](6) null,[PURMA002] [VarChar](250) NULL
)
AS
BEGIN DECLARE @level AS int ,@Max_level int
declare @fxdm AS varchar(20)
if @INVFLAG=1
set @fxdm=rtrim(ltrim(@INVNO))
else
select @fxdm=MB001 from INVMB where MB110=@INV_ENGNO
SELECT @level = 1
--select *from BOMMC
INSERT INTO @treeinfo SELECT MB001,isnull(c.MF004,'zzzz'),MB001,isnull(c.MF004,''),1,MB004,1,0,0,null ,null,'','',0,0,'','','','','',''
FROM (select * from INVMB where MB109='Y') as INVMB_effv --核准交易的
left outer join
(SELECT MF001, MAX(MF004) AS MF004 --BOMMF_gxdb
FROM dbo.BOMMF
GROUP BY MF001) c on c.MF001=MB001
WHERE MB001=@fxdm
INSERT INTO @treeinfo
剩余6页未读,继续阅读
- 粉丝: 4
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构