[易飞]展BOM数据结构之函数版本

原创 2017年10月23日 11:36:39

在几年前写过存储过程展BOM的存储过程并发布到博客上分享给大家。近期很多用户反馈需要函数版本,因有些连接工具并不支持存储过程。正如大家所知道的存储过程非常灵活,几乎没有任何限制。函数则有些限制比如不允许采用临时表。之前易飞展BOM存储过程采用过临时表,那就改用表变量去处理吧。午饭前改好,还有20分钟动手吧!
考虑到之前版本未考虑替代料问题,函数版也一起解决吧。

单位成本暂未考虑,单位成本各用户自己根据公司规则去获取吧。


-- =============================================      
-- Author: <David Gong>      
-- Create date: <2017-10-23>      
-- Description: <展BOM>      
-- =============================================
ALTER  Function [dbo].[GetBomCost] (@ITEMNO VARCHAR(80))
returns  @Jason table
(
阶层 VARCHAR(80),
主件品号 VARCHAR(80), 
元件品号  VARCHAR(80) DEFAULT '', 
品号属性  CHAR(12),
品名 CHAR(200) DEFAULT '',
规格 CHAR(200) DEFAULT '', 
单位 CHAR(10),
组成用量 NUMERIC(18,6) DEFAULT 0, 
底数 NUMERIC(18,6) DEFAULT 0, 
损耗率 NUMERIC(18,6) DEFAULT 0, 
累计组成用量 NUMERIC(18,6) DEFAULT 0,
纳入标准成本 VARCHAR(80) DEFAULT '',
取替代顺序 NCHAR(100) DEFAULT ''
)

BEGIN

--BOM展阶 
--@ITEMNO:查询品号
--返回:元件品号V1001,主件品号V1002,阶码V1004,阶层次V1005,尾阶标志V1006,展开标志V1007,组成用量V1011,底数V1012,损耗率%V1013,纳入标准成本 V1014,取替代顺序 V1015 
DECLARE @ITEM_CHILD VARCHAR(200), @ITEM_EXPAND VARCHAR(200), @ITEM_LEVELNO INT, @COUNT INT
DECLARE @BATCH_NUMBER NUMERIC(18,6)
DECLARE @ITEM_PARENT VARCHAR(200)
DECLARE @V1011 NUMERIC(18,6) ,@V1012 NUMERIC(18,6),@V1013 NUMERIC(18,6),@V1014 VARCHAR(200)

DECLARE  @VIEW1 TABLE
(V1001 VARCHAR(200),
V1002 VARCHAR(200), 
V1004 VARCHAR(200) DEFAULT '', 
V1005 INT DEFAULT 0,
V1006 CHAR(1) DEFAULT '0',
V1007 CHAR(1) DEFAULT '0', 
V1011 NUMERIC(18,6) DEFAULT 0, 
V1012 NUMERIC(18,6) DEFAULT 0, 
V1013 NUMERIC(18,6) DEFAULT 0,
V1014 VARCHAR(200) DEFAULT '',
V1015 CHAR(1) DEFAULT ''
)




SELECT @ITEM_LEVELNO = 1

INSERT INTO @VIEW1 (V1001, V1002, V1004, V1005, V1011, V1012, V1013,V1014)
SELECT MD003, @ITEMNO, MD002, 1, MD006 , MD007*MC004, MD008,MD014 FROM BOMMC, BOMMD 
WHERE BOMMC.MC001 = BOMMD.MD001 AND MC001 = @ITEMNO

DECLARE BOMEXPAND CURSOR FOR SELECT V1001, V1004, V1005, V1011/V1012,V1014,V1002 FROM @VIEW1 WHERE V1007 = '0' FOR UPDATE

OPEN BOMEXPAND  /* 打开游标 */ 
FETCH NEXT FROM BOMEXPAND INTO @ITEM_CHILD, @ITEM_EXPAND, @ITEM_LEVELNO, @BATCH_NUMBER,@V1014,@ITEM_PARENT
WHILE @@FETCH_STATUS = 0   /* 用WHILE循环控制游标活动*/ 
BEGIN
--SELECT @ITEM_LEVELNO, @ITEM_CHILD
UPDATE @VIEW1 SET V1007 = '1' WHERE CURRENT OF BOMEXPAND
SELECT @COUNT = COUNT(*) FROM BOMMC, BOMMD WHERE BOMMC.MC001 = BOMMD.MD001 AND MC001 = @ITEM_CHILD
IF @COUNT = 0 
    UPDATE @VIEW1 SET V1006 = '1' WHERE CURRENT OF BOMEXPAND
ELSE
BEGIN
    INSERT INTO @VIEW1 (V1001, V1002, V1004, V1005, V1011, V1012, V1013,V1014)
    SELECT MD003, @ITEM_CHILD, @ITEM_EXPAND + '.' + MD002, @ITEM_LEVELNO + 1, MD006 * @BATCH_NUMBER, MD007*MC004, MD008,
    MD014=(case when @V1014='N' then 'N' else MD014 end)
    FROM BOMMC, BOMMD WHERE BOMMC.MC001 = BOMMD.MD001 AND MC001 = @ITEM_CHILD

END




FETCH NEXT FROM BOMEXPAND INTO @ITEM_CHILD, @ITEM_EXPAND, @ITEM_LEVELNO, @BATCH_NUMBER,@V1014,@ITEM_PARENT /* 在循环体内将读取其余行数据 */
END
CLOSE BOMEXPAND   /* 关闭游标 */ 
DEALLOCATE BOMEXPAND   /* 删除游标 */ 
----声明表变量------

declare 
@阶层 VARCHAR(80),
@主件品号 VARCHAR(80), 
@元件品号  VARCHAR(80),  
@品号属性  CHAR(12),
@品名 CHAR(200) ,
@规格 CHAR(200) , 
@单位 CHAR(10),
@组成用量 NUMERIC(18,6) , 
@底数 NUMERIC(18,6) , 
@损耗率 NUMERIC(18,6) , 
@累计组成用量 NUMERIC(18,6) ,
@纳入标准成本 CHAR(1) ,
@取替代顺序 NCHAR(1) 




---------遍历BOM,增加替代料,写入表变量-------- 


DECLARE BOMEXPAND_1 CURSOR FOR  SELECT space(V1005*1)+'.'+cast(V1005  as varchar)  as 阶层,V1002 as 主件品号,V1001 as 元件品号,case when MB025='P' THEN '采购件' 
                                                               when MB025='M' THEN '自制件'
                                                               when MB025='S' THEN '委外加工件'
                                                               when MB025='Y' THEN '虚设件'
                                                               else '配置件'END AS  品号属性,
         MB002 品名,MB003 规格,MB004 as 单位,V1011 as 组成用量,V1012 as 底数,V1013 as 损耗率,V1011/V1012*(1+V1013) as 累计组成用量,V1014 AS 纳入标准成本,V1015 AS 取替代顺序  FROM @VIEW1 INNER JOIN  INVMB ON V1001=MB001

OPEN BOMEXPAND_1  /* 打开游标 */ 
FETCH NEXT FROM BOMEXPAND_1 INTO 
                @阶层 ,
                @主件品号 , 
                @元件品号 ,  
                @品号属性 ,
                @品名 ,
                @规格 , 
                @单位 ,
                @组成用量  , 
                @底数 , 
                @损耗率  , 
                @累计组成用量 ,
                @纳入标准成本  ,
                @取替代顺序
WHILE @@FETCH_STATUS = 0   /* 用WHILE循环控制游标活动*/ 
BEGIN

INSERT INTO @Jason(阶层,主件品号,元件品号,品号属性,品名,规格,单位,组成用量,底数,损耗率,累计组成用量,纳入标准成本 ,取替代顺序)
            values(@阶层,@主件品号,@元件品号,@品号属性,@品名,@规格,@单位,@组成用量,@底数,@损耗率,@累计组成用量,@纳入标准成本,@取替代顺序)

    --增加替代料
    IF exists(SELECT * FROM BOMMA LEFT JOIN BOMMB ON MA001=MB001 AND MA002=MB002 WHERE MA001=@元件品号  AND MA002=@主件品号)
    BEGIN
        INSERT INTO @Jason(阶层,主件品号,元件品号,品号属性,品名,规格,单位,组成用量,底数,损耗率,累计组成用量,纳入标准成本 ,取替代顺序)
    SELECT @阶层,@主件品号,BOMMB.MB004,case when INVMB.MB025='P' THEN '采购件' 
                                  when INVMB.MB025='M' THEN '自制件'
                                  when INVMB.MB025='S' THEN '委外加工件'
                                  when INVMB.MB025='Y' THEN '虚设件'
       else '配置件' END ,INVMB.MB002,INVMB.MB003,INVMB.MB004,@组成用量,@底数,@损耗率,@累计组成用量 ,@纳入标准成本,BOMMB.MB009
    from BOMMA LEFT JOIN BOMMB ON MA001=BOMMB.MB001 AND MA002=BOMMB.MB002
               inner JOIN INVMB ON BOMMB.MB004=INVMB.MB001
    WHERE MA001=@元件品号  AND MA002=@主件品号

    END


FETCH NEXT FROM BOMEXPAND_1 INTO 
                @阶层 ,
                @主件品号 , 
                @元件品号 ,  
                @品号属性 ,
                @品名 ,
                @规格 , 
                @单位 ,
                @组成用量  , 
                @底数 , 
                @损耗率  , 
                @累计组成用量 ,
                @纳入标准成本  ,
                @取替代顺序
 /* 在循环体内将读取其余行数据 */
END
CLOSE BOMEXPAND_1   /* 关闭游标 */ 
DEALLOCATE BOMEXPAND_1   /* 删除游标 */ 


--select  阶层 ,@ITEMNO as 主件品号,主件品号 as 上阶品号 , 元件品号  , dbo.GetItemCost(元件品号) as 单位成本, 品名 ,规格 , 单位 ,组成用量 , 底数 , 损耗率 , 累计组成用量 ,纳入标准成本 ,取替代顺序 from @Jason where 品号属性='采购件'
delete @Jason
where 品号属性<>'采购件'

return 

END

测试下:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

[易飞]批量导出易飞ERP系统目前所有BOM(含本币未税单位成本)

摘要:导出ERP系统中所有成品对应的BOM列表含材料成本(本币) 思路:          1.查询已核准的成品品号          2.撰写当期汇率函数          3.撰写材料最新核价函数...
  • david_520042
  • david_520042
  • 2013年05月14日 13:03
  • 5510

[易飞]易飞ERP展BOM带成本+替代料

-- ============================================= -- Author: -- Create date: -- D...
  • david_520042
  • david_520042
  • 2015年05月11日 08:51
  • 2541

SQL 与 orcale 数据库对BOM多级展开的实现方法

一、Oracle数据库 展开全部   文本: Oracle数据库 OracleERP  Oracle层次树查询 Oracle层次树是通过Connect by[条件] Start with [条...
  • mobiyue
  • mobiyue
  • 2014年05月07日 15:09
  • 3030

SQL存储过程展易飞BOM

create TABLE ZBOMCB1 ( --BOM展开表算表 CB001 CHAR(20) NOT NULL, CB005 CHAR(20) NOT NULL, CB008 numer...
  • u013002790
  • u013002790
  • 2016年03月23日 14:49
  • 283

ABAP Bom按层展开的几种实现方法

*递归的方式实现 FUNCTION zbomexplode. *"--------------------------------------------------------- *" *"Loca...
  • hugh_Lee
  • hugh_Lee
  • 2017年01月16日 08:14
  • 1617

SAP PP 展开BOM(多层)程序代码

*&---------------------------------------------------------------------* *& Report  ZTESTIAN2 *& ...
  • yuqinying112
  • yuqinying112
  • 2013年01月21日 10:29
  • 6052

[易飞]设置导入导出规则-小BUG

易飞系统在系统设置中-有设置导入导出规则,进行数据导入导出。 测试一:导入录入交易对象。从A账套导出到B账套,OK没有问题。 测试二:设置采购单单据性质。 导出结果: 怎么回事?把所有单据性质都导...
  • david_520042
  • david_520042
  • 2014年01月08日 12:03
  • 2069

[易飞]录入信息传递设置信息

通常我们在查询相关单据单身中会有附带上一个单别的关联单据,比如采购发票单身有进货单单别、单号。系统默认做了超连接。可有些时候我想查看这个品号信息的参数呢?是否可以自定义呢?       今天是礼拜一,...
  • david_520042
  • david_520042
  • 2015年03月23日 09:51
  • 1405

[易飞]自定义开窗

我们有这样一个需求:质量部需要评估售后周期 售后周期的起点:开立销退单据 开立之后进入售后状态,OK之后调拨到合格品仓开立调拨单 开立调拨单作为售后的结束点。 1. 首先,要自己写的两个表是...
  • david_520042
  • david_520042
  • 2016年06月16日 12:29
  • 5737

[易飞]批次需求计划-致命缺陷

我们先来了解一个案例:(以下是我模拟的测试的案例)模拟条件:主件品号:10101008010001          品名  : ACM0801B-FL-GBH     固定前置天数8天 变动前置天数...
  • david_520042
  • david_520042
  • 2014年08月29日 08:44
  • 3651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[易飞]展BOM数据结构之函数版本
举报原因:
原因补充:

(最多只允许输入30个字)