您的位置:首页 > 其它

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

2013-05-14 13:03 555 查看
摘要:导出ERP系统中所有成品对应的BOM列表含材料成本(本币)

思路:

1.查询已核准的成品品号

2.撰写当期汇率函数

3.撰写材料最新核价函数

4.BOM的元件材料的单位是库存单位,核价单单价是以采购单价为基础利用系统提供的转换函数

5.展BOM程序

6.创建临时表,循环遍历需要展算的成品,展算的BOM存储到临时表。

1.当前汇率: GetCurrExchangeRate

--==================================
--作者:龚德辉
--用途:取得当前汇率
--日期:2010-04-16
--==================================
ALTER function [dbo].[GetCurrExchangeRate](
@currency AS NCHAR(3)
)returns decimal(15,7)
as
begin
declare @price decimal(15,7)
IF(@currency<>'RMB')
begin
SELECT @price=MG003 from  CMSMG where MG002=(select MAX(MG002) from CMSMG WHERE MG001=@currency) and  MG001=@currency
end
else
begin
set @price=1.0000000
end
return @price
end
2.最新核价:PriceNoTaxRMB(此函数请各位优化一下)

--==================================
--作者:龚德辉
--用途:取最新不含税单价
--日期 :2011-05-28
--==================================
ALTER function [dbo].[PriceNoTaxRMBBOM](
@Item AS NCHAR(20)
)returns decimal(15,6)
as
begin
declare @PriceNoTaxRMB decimal(15,6)
select @PriceNoTaxRMB=CASE WHEN TL008='Y' THEN convert(decimal(18,8),TM010*ChgRate/TaxRate)*
dbo.DFC_UnitConvert(MB001,1,MB004,TM009)
else convert(decimal(18,8),TM010*ChgRate)*
dbo.DFC_UnitConvert(MB001,1,MB004,TM009) End  from(
select
TOP 1 TL005,
TL004,
TL008,
TM010,
TM014,
dbo.GetCurrExchangeRate(TL005) AS ChgRate,
[dbo].[GetVendorTaxRate](TL004)+1 as TaxRate,
TM009,
MB004,
MB001
from PURTL INNER JOIN PURTM ON TL001=TM001 AND TL002=TM002
INNER JOIN  INVMB ON TM004=MB001
where TM004=@Item AND TM011='Y'
ORDER BY TM014 desc
) a

return isnull(@PriceNoTaxRMB,0)
end


[/code]3.展BOM程序

-- =============================================
-- Author: <David Gong>
-- Create date: <2011-07-01>
-- Description: <展BOM>
-- =============================================
ALTER PROCEDURE [dbo].[UP_Bom_StandardCheck] (@ITEMNO VARCHAR(80))
AS
BEGIN
--BOM展阶
--@ITEMNO:查询品号
--返回:元件品号V1001,主件品号V1002,阶码V1004,阶层次V1005,尾阶标志V1006,展开标志V1007,组成用量V1011,底数V1012,损耗率%V1013
DECLARE @ITEM_CHILD VARCHAR(80), @ITEM_EXPAND VARCHAR(80), @ITEM_LEVELNO INT, @COUNT INT
DECLARE @BATCH_NUMBER NUMERIC(18,6)
CREATE TABLE  #VIEW1 (V1001 VARCHAR(80), V1002 VARCHAR(80), V1004 VARCHAR(80) 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)

SELECT @ITEM_LEVELNO = 1

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

DECLARE BOMEXPAND CURSOR FOR SELECT V1001, V1004, V1005, V1011/V1012 FROM #VIEW1 WHERE V1007 = '0' FOR UPDATE
OPEN BOMEXPAND  /* 打开游标 */
FETCH NEXT FROM BOMEXPAND INTO @ITEM_CHILD, @ITEM_EXPAND, @ITEM_LEVELNO, @BATCH_NUMBER
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)
SELECT MD003, @ITEM_CHILD, @ITEM_EXPAND + '.' + MD002, @ITEM_LEVELNO + 1, MD006 * @BATCH_NUMBER, MD007*MC004, MD008 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 /* 在循环体内将读取其余行数据 */
END
CLOSE BOMEXPAND   /* 关闭游标 */
DEALLOCATE BOMEXPAND   /* 删除游标 */
/*
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 累计组成用量  FROM #VIEW1 INNER JOIN  INVMB ON V1001=MB001
ORDER BY V1004
*/
--背光成品只算半成品

SELECT V1002 as Pitem, V1001 as Item,MB025 as Property, MB002 as [Description], MB003 AS Spec, convert(decimal(15,5),V1011/V1012)  as Usage ,MB004 as Unit, ZE.[dbo].[PriceNoTaxRMBBOM](V1001) AS UnitCost
FROM #VIEW1 INNER JOIN  INVMB ON V1001=MB001
--where  (MB025='P' AND left(V1002,3)<>'203') or (MB025='M' AND LEFT(V1001,3)='203')
ORDER BY V1004

END


4.单位转换函数:DFC_UnitConvert

ALTER FUNCTION [dbo].[DFC_UnitConvert]
(
@ProductID char(20),
@OldNum Numeric(16,6),
@OldUnit char(4),
@NewUnit char(4)=''
)
RETURNS Numeric(16,6)
AS
BEGIN
DECLARE @mReturnNum Numeric(16,6),@mReturnUnit char(4)
DECLARE @mMA024 char(1),@mMA068 int,@mOldRate Numeric(10,6),@NewRate Numeric(10,6)
DECLARE @mMB004 char(4)

select @mReturnNum=@OldNum,@mReturnUnit=@OldUnit

--数量表达方式(1.单一单位 2.双单位 3.制造双单位), 小数保留位数
SELECT top 1 @mMA024=MA024,@mMA068=MA068 FROM CMSMA with (nolock)

if ((@mMA024 IS NULL) OR (@mMA024='2'))
RETURN round(@mReturnNum,@mMA068)
if (@mMA068 IS NULL)
select @mMA068=3

--Check 品号是否存在于INVMB
SELECT @mMB004=MB004 FROM INVMB WHERE MB001=@ProductID
if @mMB004 is null
RETURN round(@mReturnNum,@mMA068)

--单位(换算后)未传值则默认为库存单位(MB004)
if (@NewUnit='')
select @NewUnit=@mMB004
--如果单位(换算前)=单位(换算后),RETURN
if @NewUnit=@OldUnit
RETURN round(@mReturnNum,@mMA068)

--计算单位(换算前)的比率
SELECT @mOldRate=ISNULL(MD004,0)/CASE WHEN ISNULL(MD003,0)=0 THEN 1 ELSE MD003 end
FROM INVMD WHERE MD001=@ProductID AND MD002=@OldUnit
if @OldUnit=@mMB004
select @mOldRate=1
if @mOldRate is null
RETURN round(@mReturnNum,@mMA068)

--RETURN round(@mReturnNum,@mMA068)
--计算单位(换算后)的比率
SELECT @NewRate=ISNULL(MD003,0)/CASE WHEN ISNULL(MD004,0)=0 THEN 1 ELSE MD004 end
FROM INVMD WHERE MD001=@ProductID AND MD002=@NewUnit
if @NewUnit=@mMB004
select @NewRate=1
if @NewRate is null
RETURN round(@mReturnNum,@mMA068)

--换算后的数量=数量*A*B
RETURN round(@OldNum*@mOldRate*@NewRate,@mMA068)
END
4. T-SQL(可以封装成存储过程,提供给各程序调用)
-- =============================================
-- Author: <David Gong>
-- Create date: <2015-03-15>
-- Description: <导出所有BOM>
-- =============================================
ALTER PROCEDURE [dbo].[UP_ExportBomList]
AS
BEGIN

--创建临时表
create table #AllBomList
(
Pitem  nchar(80) NOT NULL,
Layer  nchar(10) null,
Item   nchar(30)  NULL,
Property  nchar(1) NULL,
[Description]  nchar(256) NULL,
Spec  nchar(256) NULL,
Usage  decimal(18,6) NULL,
Unit  char(4) NULL,
UnitCost  decimal(18,6) NULL
)
Declare @item as nchar(80), @Spec as nchar(256), @Description as nchar(256)

Declare ItemCusror CURSOR
local static FOR Select  MB001,MB002,MB003 from INVMB WHERE  MB109='Y' AND MB025='M'
Open ItemCusror
Fetch next From ItemCusror
Into @item,
@Description,
@Spec
While(@@Fetch_Status = 0)
Begin

Begin
insert into #AllBomList(Pitem,[Description],Spec)values(@item,@Description,@Spec)--单独区分成品
insert into #AllBomList  exec [UP_Bom_StandardCheck] @item --展BOM结果存储到临时表
End

Fetch next From ItemCusror
Into @item,
@Description,
@Spec
End
Close ItemCusror
Deallocate ItemCusror

select * from #AllBomList; --查询结果
drop table #AllBomList;

END
5.执行结果 :EXEC [UP_ExportBomList]

总结:执行了一下需要4分半左右的时间,基本可以接受。

问题:1.展BOM程序是采用游标处理,且没有考虑分量损耗的因素。2.最新核单也未考虑分量核价因素,且写法不够简洁

希望抛砖引玉,谢谢!

转载请注明地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: