ERP对BOM展开SQL代码示例

基础工作

这是一个基础资料框图在这里插入图片描述创建表

--创建主表M1
CREATE TABLE [dbo].[M1](
 [id] [int] NOT NULL,
 [NO] [varchar](50) NOT NULL,
 [NAME] [nvarchar](50) NULL,
 [GG] [nvarchar](50) NULL
) ON [PRIMARY]

--创建子表M2
CREATE TABLE [dbo].[M2](
 [ID] [int] NOT NULL,
 [M_NO] [varchar](50) NOT NULL,
 [Z_NO] [varchar](50) NOT NULL,
 [NAME] [nvarchar](50) NOT NULL,
 [GG] [nvarchar](50) NOT NULL,
 [NUM] [numeric](18, 0) NOT NULL
) ON [PRIMARY]

--主表插入数据
INSERT [dbo].[M1] ([id], [NO], [NAME], [GG]) VALUES (1, N'TT1', N'成品1', N'成品1规格')
INSERT [dbo].[M1] ([id], [NO], [NAME], [GG]) VALUES (2, N'BP1', N'半成品1', N'半成品1规格')
INSERT [dbo].[M1] ([id], [NO], [NAME], [GG]) VALUES (3, N'BP2', N'半成品2', N'半成品2规格')
INSERT [dbo].[M1] ([id], [NO], [NAME], [GG]) VALUES (4, N'BP3', N'半成品3', N'半成品3规格')
INSERT [dbo].[M1] ([id], [NO], [NAME], [GG]) VALUES (5, N'BP4', N'半成品4', N'半成品4规格')
INSERT [dbo].[M1] ([id], [NO], [NAME], [GG]) VALUES (6, N'BP5', N'半成品5', N'半成品5规格')
--子表插入数据
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (1, N'1', N'BP1', N'半成品1', N'半成品1规格', CAST(2 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (2, N'1', N'BP2', N'半成品2', N'半成品2规格', CAST(2 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (3, N'1', N'YL1', N'原料1', N'原料1规格', CAST(5 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (4, N'1', N'YL2', N'原料2', N'原料2规格', CAST(4 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (5, N'1', N'YL3', N'原料3', N'原料3规格', CAST(3 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (6, N'2', N'YL4', N'原料4', N'原料4规格', CAST(1 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (7, N'2', N'YL3', N'原料3', N'原料3规格', CAST(2 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (8, N'2', N'BP3', N'半成品3', N'半成品3规格', CAST(3 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (9, N'2', N'BP4', N'半成品4', N'半成品4规格', CAST(2 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (10, N'3', N'YL5', N'原料5', N'原料5规格', CAST(2 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (11, N'3', N'YL6', N'原料6', N'原料6规格', CAST(3 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (12, N'4', N'YL1', N'原料1', N'原料1规格', CAST(2 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (13, N'4', N'YL2', N'原料2', N'原料2规格', CAST(3 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (14, N'5', N'BP5', N'半成品5', N'半成品5规格', CAST(5 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (15, N'6', N'YL4', N'原料4', N'原料4规格', CAST(4 AS Numeric(18, 0)))
INSERT [dbo].[M2] ([ID], [M_NO], [Z_NO], [NAME], [GG], [NUM]) VALUES (16, N'6', N'YL1', N'原料1', N'原料1规格', CAST(2 AS Numeric(18, 0)))

核心代码:存储过程

--创建存储过程
 CREATE PROCEDURE [dbo].[BOM_Analysis](                    
  @NO    varchar(20)
 )                   
 AS   
BEGIN  
  SET NOCOUNT ON   
  --创建临时表
  CREATE table #TEMP  
 (  
 [M_NO]   INT  not null,  
 [Z_NO]   varchar(50)  not null, 
 [NAME]   Nvarchar(50),
 [GG]     Nvarchar(50),
 [NUM]    INT NOT NULL,
 [ID]   int IDENTITY(1,1) NOT NULL
 )
 insert  #TEMP
  SELECT M_NO,Z_NO,NAME,GG,NUM FROM [dbo].[M2] WHERE M_NO=(SELECT ID 	  FROM [dbo].[M1] WHERE NO=@NO)
  declare @M_NO INT
  declare @Z_NO varchar(45)
  declare @NUM INT
  declare @min INT
set @min=1
while @min<=(select max(id) from #TEMP)
begin
--判断是不是半成品
--是的情况下,展开子件加入临时表,删除半成品记录
 IF exists(select 1 from [dbo].[M1] where NO=(select Z_NO FROM #TEMP WHERE ID=@min))
 BEGIN
    SELECT @M_NO=ID,@Z_NO=NO FROM [dbo].[M1] WHERE NO= (select Z_NO FROM #TEMP WHERE ID=@min)
 SELECT @NUM=NUM FROM #TEMP WHERE ID=@min
 insert  #TEMP
 SELECT M_NO,Z_NO,NAME,GG,NUM*@NUM FROM [dbo].[M2] WHERE M_NO=@M_NO
    DELETE FROM #TEMP WHERE ID=@min
 END   
--不是的情况下进行下一条
 set @min=@min+1
 end 
  select ID '序号', M_NO 'BOM_id',Z_NO '编码',NAME '名称',GG '规格',NUM    '数量' from #TEMP order by id
  drop table #TEMP
  SET NOCOUNT OFF       
END 

--执行一下
 --exec  [dbo].[BOM_Analysis] 'TT1'

结果预览

在这里插入图片描述
以上只是一个简单的示例,仅供参考,如有不对,敬请指教。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惰小懒

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值