SQL BOM多阶展开表值函数.txt
根据提供的文件信息,本文将对“SQL BOM多阶展开表值函数”进行详细解析,主要涉及的内容包括:创建一个多阶物料清单(Bill of Materials, BOM)展开的表值函数,该函数不限制SQL版本号,适用于多种SQL环境。 ### 一、函数概述 #### 函数名称: `dbo.FN_GetBomtreeForWorkCenter` #### 参数说明: - `@INVNO`: 物料编码,类型为`varchar(20)`。 - `@INV_ENGNO`: (可选参数) 工程编号,类型为`varchar(30)`。 - `@INVFLAG`: (可选参数) 标志位,默认值为`1`。当其值为`1`时,表示查询物料编码;为`0`时,则查询工程编号。 #### 返回值: 一个名为`@treeinfo`的表类型结果集,包含了多个字段用于描述BOM树结构中的每一项物料信息。 ### 二、函数实现逻辑详解 #### 数据结构定义 - `@treeinfo`: 定义了一个包含19个字段的表变量,用于存储BOM树结构中的每一项物料信息。这些字段分别代表了物料编码、物料类型、上层物料编码、上层物料类型、单位用量、用量单位等详细信息。 #### 函数主体逻辑 1. **初始化层级**: - 首先声明并初始化层级变量`@level`为`1`,同时定义了最大层级变量`@Max_level`和父项物料编码变量`@fxdm`。 - 如果`@INVFLAG`为`1`,则直接设置`@fxdm`为`@INVNO`;否则,通过查询`INVMB`表中的`MB110`字段获取物料编码。 2. **初始化BOM树**: - 将输入的物料编码作为起始节点插入到`@treeinfo`表中,初始化物料的父级物料编码、类型、单位用量等信息。 - 这一步是构建BOM树的基础,确保了函数能够正确地展开从输入物料开始的所有子物料。 3. **递归展开BOM**: - 使用`WHILE @@ROWCOUNT > 0`循环,不断递归查找下一层的物料信息。 - 在每次循环中,都会将找到的物料信息添加到`@treeinfo`表中,并更新层级变量`@level`。 - 循环条件基于`@@ROWCOUNT`,即只有在每次插入新记录后存在数据时才会继续执行,保证了递归的正确性。 ### 三、关键代码段解析 #### 初始层级物料信息插入 ```sql 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 FROM dbo.BOMMFGROUP BY MF001) c ON c.MF001 = MB001 WHERE MB001 = @fxdm ``` - 此段代码通过左外连接`INVMB_effv`表和`(SELECT MF001, MAX(MF004) AS MF004 FROM dbo.BOMMFGROUP BY MF001)`视图,获取初始层级物料的基本信息,并将其插入到`@treeinfo`表中。 #### 多阶展开逻辑 ```sql WHILE @@ROWCOUNT > 0 BEGIN SET @level = @level + 1 INSERT INTO @treeinfo SELECT a.MD001, isnull(c.MF004, 'zzzz'), a.MD003, isnull(b.MF004, ''), MD006, MD004, MD007 * x.MC004, 0 as bod_shjs, MD008 as bod_shl, MD011 as bod_ksrq, MD012 as bod_sxrq, 'N' AS bod_xsbz, convert(varchar(255), a.MD016), @level FROM BOMMD a JOIN BOMMC x ON x.MC001 = a.MD001 LEFT OUTER JOIN (SELECT MF001, MAX(MF004) AS MF004 FROM dbo.BOMMFGROUP BY MF001) b ON b.MF001 = a.MD003 LEFT OUTER JOIN (SELECT MF001, MAX(MF004) AS MF004 FROM dbo.BOMMFGROUP BY MF001) c ON c.MF001 = a.MD001 JOIN INVMB it ON it.MB001 = a.MD003 WHERE MD001 = @fxdm END ``` - 这段代码通过递归查询的方式实现了BOM的多阶展开。在每次循环中,都会将当前层级的物料信息插入到`@treeinfo`表中,并更新层级变量`@level`。 ### 四、总结 通过上述分析可以看出,`dbo.FN_GetBomtreeForWorkCenter`函数能够高效地实现BOM的多阶展开,不仅支持不同层级物料信息的递归查询,还能够适应不同的SQL版本。这种实现方式对于管理复杂的物料关系结构非常有用,可以有效地提高物料管理的效率和准确性。
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页未读,继续阅读
- 色空空色2023-07-26文件中的示例代码很实际,并且给出了详细的注释,方便读者理解和运用。
- 申增浩2023-07-26对于初学者来说,这个文件提供了很好的指导,可以帮助他们快速上手并应用到实际项目中。
- 艾苛尔2023-07-26文档内容经过精心编排,结构清晰,易于阅读和理解。
- 坐在地心看宇宙2023-07-26这个文件详细介绍了SQL BOM多阶展开表值函数,对于需要深入了解该功能的人来说非常实用。
- 思想假2023-07-26文档中对SQL BOM多阶展开表值函数的优点和应用场景进行了简要介绍,让读者对其价值有了清晰的认识。
- 粉丝: 4
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助