[易飞]批量导出易飞ERP系统目前所有BOM(含本币未税单位成本)
2013-05-14 13:03
555 查看
摘要:导出ERP系统中所有成品对应的BOM列表含材料成本(本币)
思路:
1.查询已核准的成品品号
2.撰写当期汇率函数
3.撰写材料最新核价函数
4.BOM的元件材料的单位是库存单位,核价单单价是以采购单价为基础利用系统提供的转换函数
5.展BOM程序
6.创建临时表,循环遍历需要展算的成品,展算的BOM存储到临时表。
1.当前汇率: GetCurrExchangeRate
[/code]3.展BOM程序
4.单位转换函数:DFC_UnitConvert
总结:执行了一下需要4分半左右的时间,基本可以接受。
问题:1.展BOM程序是采用游标处理,且没有考虑分量损耗的因素。2.最新核单也未考虑分量核价因素,且写法不够简洁
希望抛砖引玉,谢谢!
转载请注明地址。
思路:
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 end2.最新核价: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) END4. 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; END5.执行结果 :EXEC [UP_ExportBomList]
总结:执行了一下需要4分半左右的时间,基本可以接受。
问题:1.展BOM程序是采用游标处理,且没有考虑分量损耗的因素。2.最新核单也未考虑分量核价因素,且写法不够简洁
希望抛砖引玉,谢谢!
转载请注明地址。
相关文章推荐
- [易飞]易飞ERP系统中,最低补量、补货位量、最小用量、领用倍量、批量之间分别代表什么意思,其中的公式计算逻辑是什么?
- ERP系统之BOM完全解析
- Dede织梦系统的一键清空回收站以及批量删除所有文章方法
- 3.19 外协加工(通过BOM体现加工物料总成本,非系统标准工序外协功能)
- ERP系统里的BOM展开函数
- ERP系统BOM详细解析(一)
- Notes文档中附件批量导出到本地系统
- 分享一个批量导出当前实例下的所有linkedserver脚本
- 针对目前windows系统的所有勒索病毒补丁和安全工具
- 取得鼎新Workflow ERP系统产品结构BOM明细的SQL语句
- ASP.NET综合管理ERP系统100%源代码+所有开发文档
- PXE项目实战,通过编写脚本自动安装系统时批量部署服务器所需要的所有服务
- [易飞]单位成本异常处理
- ERP系统BOM详细解析(一)
- 第三节:TIPTOP ERP系统成本问题集
- ERP系统BOM详细解析
- MAC系统 批量删除一个项目中的所有.svn
- TIPTOP ERP系统成本问题集
- [易飞]单位成本异常处理