BOM带库存算法

icesuger 2008-03-05 01:35:03

向你请教一种算法
现在我有一张表bom mid表示物品编码 ,Cid表示所组成的物品编码,num表示 所需要 Cid物品个数
(举例现有一支笔A,笔由笔帽,笔心,外壳组成,笔心由,油墨,笔心壳组成)这种组合会随不同物品而变化,产生不同的层级)
Mid Cid num
A A1 2
A A2 3
A A3 3
A2 A3 3
A2 A4 3
A2 A5 3
A4 A5 3
A4 A6 3
.........
表 store 仓库,mid即物品编码 SL表示数量
Mid SL
A 2
A1 5
A2 3
A4 1
A5 2
A6 3

现在要求领10个A,程序大致要这样执行,先去store看A的个数,成品有2个,接下来8个要用子原料来生产,A2=3*8 A3=3*8,然后再看A2 A3各自库存数……这样,可以通过哪种算法去实现?
...全文
292 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hery2002 2008-04-04
  • 打赏
  • 举报
回复
Mark!
youcaicai 2008-04-04
  • 打赏
  • 举报
回复
从书上抄的,希望对大家有用

--------mrp计算存储过程
CREATE PROCEDURE sf_mrp计算 ( @考虑库存等 bit=1,
@考虑提前期 bit=1, @考虑损耗 bit=1)
AS
begin tran
--清除
delete from mrp物料需求计算
-- 更新物料清单底层码,计算时使用
update 物料清单 set 低层码 = 0 where 父项编号 = 0
-- 循环10次,根据情况,这里默认bom物料的层级不超过10级
declare @i int
select @i = 1
while (@i<=10)
begin
update 物料清单 set 低层码 = b.低层码+1 from 物料清单 as a,
(select * from 物料清单) as b
where a.父项编号 = b.物料编号
select @i = @i + 1
end
--重新生成物料需求计算表,并计算毛需求
-- 低层码代表物料的层级,使用他来循环
insert into mrp物料需求计算(物料编号,年份,计划期,毛需求)
select 物料编号,年份,计划期,sum(MPS数量)
FROM 主生产计划 group by 物料编号,年份,计划期
select @i = 1
while (@i<=10)
begin
-- 没有的先查入记录,因为一个物料可以对应多个父项
insert into mrp物料需求计算(物料编号,年份,计划期,毛需求)
select distinct b.物料编号,年份,计划期,0
FROM mrp物料需求计算 as a, 物料清单 as b
where rtrim(b.物料编号)+convert(char(4),年份)+
convert(char(2),计划期) not in(select rtrim(物料编号)+
convert(char(4),年份)+convert(char(2),计划期)
from mrp物料需求计算)
and b.父项编号=a.物料编号 and b.低层码=@i
-- 计算毛需求
-- 注意考虑损耗的情况
update mrp物料需求计算 set 毛需求 = c.毛需求 + d.需求
from mrp物料需求计算 as c,
(select b.物料编号,年份,计划期,
sum((a.毛需求*b.需要数量)/(1-(case when @考虑损耗=1 then
isnull(损耗率,0) else 0 end))) as 需求
FROM mrp物料需求计算 as a, 物料清单 as b
where b.父项编号=a.物料编号 and b.低层码=@i
group by b.物料编号,a.年份,a.计划期
) as d
where c.物料编号=d.物料编号 and c.年份=d.年份 and c.计划期=d.计划期

select @i = @i + 1
end
--------------- 不考虑提前期的毛需求计算完成
-- 考虑提前期,计算提前期
--if (@考虑提前期=1)
--begin
-- 这里不在计算,具体计算方法为将当前计划期的数量移到提前期
-- 注意跨年度计划期的
--end

if (@考虑库存等=1)
begin
-- 第一次计算,设置期初库存
-- 这里统一设置起初库存为100
-- 实际系统应该和库存库及上期情况结合
update mrp物料需求计算 set 期初库存=100

update mrp物料需求计算 set 预计入库 = isnull(预计入库,0) +
数量 from mrp物料需求计算 as a, (select sum(剩余数量) as 数量,
物料编号,年份,计划期 from 采购订单
group by 物料编号,年份,计划期) as b, 物料主文件 as c
where a.物料编号=b.物料编号 and a.年份=b.年份
and a.计划期=b.计划期 and a.物料编号 = c.物料编号
and c.计划类别='wg' -- 外购产品

update mrp物料需求计算 set 预计入库 = isnull(预计入库,0) +
数量 from mrp物料需求计算 as a, (select sum(剩余数量) as 数量,
物料编号,年份,计划期 from 生产订单
group by 物料编号,年份,计划期) as b, 物料主文件 as c
where a.物料编号=b.物料编号 and a.年份=b.年份
and a.计划期=b.计划期 and a.物料编号 = c.物料编号
and c.计划类别='bcp' -- 半成品

-- 这里计算预计出库的情况
update mrp物料需求计算 set 预计出库 = isnull(预计出库,0)
end

-- 按照计划期循环计算各个计划期的物料需求
declare @年份 int, @计划期 int
declare mycur cursor for select 年份,计划期 from mrp物料需求计算
order by 年份,计划期
open mycur
fetch next from mycur into @年份, @计划期
WHILE (@@FETCH_STATUS = 0 )
BEGIN
-- 如果不是最小的计划期, 计算期初库存
-- 注意跨年度的计算,这里先不考虑
update mrp物料需求计算 set 期初库存=b.预计库存 from
mrp物料需求计算 as a, (select * from mrp物料需求计算)
as b where a.年份=@年份 and a.计划期=@计划期
and a.年份=b.年份 and a.计划期=b.计划期+1

-- 计算净需求
update mrp物料需求计算 set 预计库存 = isnull(期初库存,0) -
isnull(毛需求,0) + isnull(预计入库,0) - isnull(预计出库,0)
where 年份=@年份 and 计划期=@计划期
update mrp物料需求计算 set 净需求=0 where 年份=@年份 and 计划期=@计划期
-- 预期(期末库存)小于0的存在净需求
update mrp物料需求计算 set 净需求=-预计库存, 预计库存=0
where 年份=@年份 and 计划期=@计划期 and 预计库存<0
fetch next from mycur into @年份, @计划期
END
close mycur
deallocate mycur
commit

GO
youcaicai 2008-04-04
  • 打赏
  • 举报
回复
以下这些代码是从书上抄的,希望对大家有用

--------mrp计算存储过程
CREATE PROCEDURE sf_mrp计算 ( @考虑库存等 bit=1,
@考虑提前期 bit=1, @考虑损耗 bit=1)
AS
begin tran
--清除
delete from mrp物料需求计算
-- 更新物料清单底层码,计算时使用
update 物料清单 set 低层码 = 0 where 父项编号 = 0
-- 循环10次,根据情况,这里默认bom物料的层级不超过10级
declare @i int
select @i = 1
while (@i<=10)
begin
update 物料清单 set 低层码 = b.低层码+1 from 物料清单 as a,
(select * from 物料清单) as b
where a.父项编号 = b.物料编号
select @i = @i + 1
end
--重新生成物料需求计算表,并计算毛需求
-- 低层码代表物料的层级,使用他来循环
insert into mrp物料需求计算(物料编号,年份,计划期,毛需求)
select 物料编号,年份,计划期,sum(MPS数量)
FROM 主生产计划 group by 物料编号,年份,计划期
select @i = 1
while (@i<=10)
begin
-- 没有的先查入记录,因为一个物料可以对应多个父项
insert into mrp物料需求计算(物料编号,年份,计划期,毛需求)
select distinct b.物料编号,年份,计划期,0
FROM mrp物料需求计算 as a, 物料清单 as b
where rtrim(b.物料编号)+convert(char(4),年份)+
convert(char(2),计划期) not in(select rtrim(物料编号)+
convert(char(4),年份)+convert(char(2),计划期)
from mrp物料需求计算)
and b.父项编号=a.物料编号 and b.低层码=@i
-- 计算毛需求
-- 注意考虑损耗的情况
update mrp物料需求计算 set 毛需求 = c.毛需求 + d.需求
from mrp物料需求计算 as c,
(select b.物料编号,年份,计划期,
sum((a.毛需求*b.需要数量)/(1-(case when @考虑损耗=1 then
isnull(损耗率,0) else 0 end))) as 需求
FROM mrp物料需求计算 as a, 物料清单 as b
where b.父项编号=a.物料编号 and b.低层码=@i
group by b.物料编号,a.年份,a.计划期
) as d
where c.物料编号=d.物料编号 and c.年份=d.年份 and c.计划期=d.计划期

select @i = @i + 1
end
--------------- 不考虑提前期的毛需求计算完成
-- 考虑提前期,计算提前期
--if (@考虑提前期=1)
--begin
-- 这里不在计算,具体计算方法为将当前计划期的数量移到提前期
-- 注意跨年度计划期的
--end

if (@考虑库存等=1)
begin
-- 第一次计算,设置期初库存
-- 这里统一设置起初库存为100
-- 实际系统应该和库存库及上期情况结合
update mrp物料需求计算 set 期初库存=100

update mrp物料需求计算 set 预计入库 = isnull(预计入库,0) +
数量 from mrp物料需求计算 as a, (select sum(剩余数量) as 数量,
物料编号,年份,计划期 from 采购订单
group by 物料编号,年份,计划期) as b, 物料主文件 as c
where a.物料编号=b.物料编号 and a.年份=b.年份
and a.计划期=b.计划期 and a.物料编号 = c.物料编号
and c.计划类别='wg' -- 外购产品

update mrp物料需求计算 set 预计入库 = isnull(预计入库,0) +
数量 from mrp物料需求计算 as a, (select sum(剩余数量) as 数量,
物料编号,年份,计划期 from 生产订单
group by 物料编号,年份,计划期) as b, 物料主文件 as c
where a.物料编号=b.物料编号 and a.年份=b.年份
and a.计划期=b.计划期 and a.物料编号 = c.物料编号
and c.计划类别='bcp' -- 半成品

-- 这里计算预计出库的情况
update mrp物料需求计算 set 预计出库 = isnull(预计出库,0)
end

-- 按照计划期循环计算各个计划期的物料需求
declare @年份 int, @计划期 int
declare mycur cursor for select 年份,计划期 from mrp物料需求计算
order by 年份,计划期
open mycur
fetch next from mycur into @年份, @计划期
WHILE (@@FETCH_STATUS = 0 )
BEGIN
-- 如果不是最小的计划期, 计算期初库存
-- 注意跨年度的计算,这里先不考虑
update mrp物料需求计算 set 期初库存=b.预计库存 from
mrp物料需求计算 as a, (select * from mrp物料需求计算)
as b where a.年份=@年份 and a.计划期=@计划期
and a.年份=b.年份 and a.计划期=b.计划期+1

-- 计算净需求
update mrp物料需求计算 set 预计库存 = isnull(期初库存,0) -
isnull(毛需求,0) + isnull(预计入库,0) - isnull(预计出库,0)
where 年份=@年份 and 计划期=@计划期
update mrp物料需求计算 set 净需求=0 where 年份=@年份 and 计划期=@计划期
-- 预期(期末库存)小于0的存在净需求
update mrp物料需求计算 set 净需求=-预计库存, 预计库存=0
where 年份=@年份 and 计划期=@计划期 and 预计库存<0
fetch next from mycur into @年份, @计划期
END
close mycur
deallocate mycur
commit

GO
youcaicai 2008-04-04
  • 打赏
  • 举报
回复
我认为在数据库中尽量不要用游标,这样对性能影响很大,一般情况,用存储过程就够了
chenminghong 2008-03-14
  • 打赏
  • 举报
回复
是如何解决的,能不能一起分享一下
icesuger 2008-03-08
  • 打赏
  • 举报
回复
恩是的
物料需求分析
这个问题已经解决了
呵呵~~
各位同行,有空一起交流。。我的QQ290169710
hazehua29 2008-03-08
  • 打赏
  • 举报
回复
典型MRP需求算法
icesuger 2008-03-07
  • 打赏
  • 举报
回复
这个问题,我发了好多天了
呵呵~~
现在还是自己解决了..
各位,还有什么执行效率高一点的没?
点拨一下~~
yingchun888 2008-03-07
  • 打赏
  • 举报
回复
直接用游标写入临时表就对了啥..
概括介绍】 实际成本算法的ERP软件。 【基本介绍】 1>.进销存+BOM+生产+MRP+质检(IQC/FQC/PQC)+车间日报/排产+应收应付+固定资产+实际成本算法+自动财务 2>.(地点+仓库)模式,实际成本算法: 成本细分为10种要素: 材料,运费,外协,税务,关税,模具, 人工,管理,机器,杂费 后四种为月结摊算, 月中,后四种成本从标准成本中读取成本值,卷入库存成本运算中, 月底,从工人工资,管理人员工资,杂物领用,固定资产折旧中,读取实际成本值,并按一定比率分配在各个部分,并自动计算生产约当量. 然后,按时间顺序重算系统中所有成本运算,纠正系统中的成本值,并产生相应的差异凭证 此种方法,可以保证月中能看到接近的成本,月底能得到真实成本. 3>.MRP采用LLC方法,层层计算下来,可自动产生PR,PO,WO,并对现有的PR,PO,WO提出变更建议. 4>.提供预留功能软件, 物料可以从PR预留--->(自动转化为)-->PO预留---->库存预留, 也支持WO产出预留. 同时,反方向操作时,也会自动复活预留. 比如: 采购退货时,自动将减少的库存预留转化为PO预留, PO更改时,自动退回给PR预留. 5>.提供变更记录功能的企业管理ERP软件: 对PR,PO,WO,WO工艺,BOM,(SO)BOM都采用"审核"后变更模式,可记录操作者的变更历史. 6>.支持总厂/分厂同步基本资料(TCP/IP通讯打包解压...)的ERP企业管理软件 7>.程序采用"C/S"和"三层"模式(同一代码),这样,既可以满足局域网内的高速,也能实现远程访问. 8>.系统内置简单的文件管理系统.各种基本资料,单据,均可上传下载对应的文档(保存在中间层服务器上,支持回收站防误删) 比如,将PO打印出来,给采购经理签字后,可用数码相机拍下后,上传到对应PO号码的文件夹中.方便后续追究责任.(也方便下载预览) 9>.所有单据,审核前,有三个签名功能. 审核后,有三个"事后备注"选项. 10>.提供自动凭证的ERP企业管理软件:单据自动产生会计凭证(可选), 接口在"会计科目"的属性中有设置. 11>.物料可按种类设定一个16X16的图标,在表格中,将会出这个图标,以方便用户一眼看出这是什么物料. 12>.所有表格,可设置显示列数,列宽,奇偶行色彩...(为了减少用户视觉疲劳,几乎每个表格,都有隐藏一半的列....) 另外,表格可以设定多种列组合显示方式,并且非常方便切换(在表格中点右键就可切换) 比如: 库存-->库存现状查询模块中,大约有80列显示信息,但系统默认只显示20多列数据....) 13>.提供自定义报表的企业管理ERP软件:自定义报表(FS报表)-->您可以在:"工程"-->"BOM查询子料"中,有环葑远ㄒ灞ū?可把物料图标打印上去) 14>.支持条码输入模式.(在所有输入性质的表格,你可以点右键-->设置条码输入解析规则(可分解,可合并,可默认,一行可多次扫条码...), 基本上,可以适应您的大部分条码输入要求. 15>.其它功能: 自定义导航界面(不喜欢自的导航,就自已定义;导航界面可上传下载),权限树形细分,用户可自定义界面风格,..... 16>.提供企业先下载,试用后,一定能很好满足企业管理需求的软件. 【更新日志】 企业管理ERP系统 V1.15.03 改进简要清单如下: 1.BOM输入方便化,允许鼠标拖拉,复制,剪切,极为方便!!! 2.BOM增加20个备用字段! 3.报表原先保存在客户端,现改为保存在数据库中.方便同步数据. 4.产品入库,可直接指定入库后的产品转到下一工序的工单. 5.产品返退,可以指定返到另一个工单上. 6.增加生产单挪料(原料从一个工单,挪到另一个工单)
第一课 制造业管理概述 7 第一节: 制造行业的生产类型分类 8 第二节: 生产与库存策略 8 第三节: 生产组织架构 9 第四节: 生产企业的常见管理问题 10 第二课 ERP管理模式 12 第一节 ERP管理模式的特点 13 第二节: ERP管理为企业来的效益 14 第三节:MRP基本处理逻辑 14 第三课 系统实施方法 16 第一节: 实施方案与计划 17 第二节: 生产管理实施策略 19 第四课 业务管理规程 23 第一节 业务规程的编制方法 24 第二节 业务流程图 25 第三节 业务流程描述 25 第五课 企业基本资源 27 第一节: 企业基本资源的概述 28 第二节: 仓库资料设置 28 第三节: 计量单位设置 28 第四节: 会计科目引入 29 第五节: 物料资料设置 29 第六节: 部门设置 31 第七节: 职员资料设置 31 第八节: 客户资料设置 32 第九节: 供应商资料设置 32 第十节: 工作中心 33 第十一节: 工艺路线 33 第六课 基本资源的信息化管理 35 第一节: 基础资料的编码原则 36 第二节: 基础资料引入引出 37 第三节: 自定义基础资料 39 第七课 计划参数 40 第一节: 物料属性 41 第二节: 计划策略 41 第三节: 订货策略 41 第四节: 安全库存 42 第五节: 最小(大)订货量 42 第六节: 订货批量(批量增量) 43 第七节: 提前期 43 第八节: 订货间隔期 44 第八课 产品结构设计 45 第一节: 产品结构关系维护 46 第二节: BOM的修改 47 第三节: BOM的查询 47 第九课 产品结构的应用 49 第一节: 产品结构关系参数及应用 50 第二节: 客户化产品配置 51 第三节:典型BOM结构图 51 第十课 产品需求管理 53 第一节: 经营规划与生产预测 54 第二节: 销售合同 55 第十一课 主生产计划编制 56 第一节: 计划方案设置 57 第二节: 计划的编制算法 58 第三节: MPS运算 61 第四节: MPS维护与投放 63 第十二课 物料需求计划编制 65 第一节: 库存可用量 66 第二节: MRP运算 66 第三节: MRP计划维护与投放 68 第四节: 采购计划的申请与执行 69 第十三课 生产能力平衡 72 第一节: 资源能力清单 73 第二节: 粗能力计算与能力平衡 73 第三节: 细能力计算与能力平衡 76 第十四课 生产任务编制 77 第一节: 生产任务单录入 78 第二节: 生产任务单的下达 80 第十五课 生产任务类型(一) 82 第一节:基本的生产业务类型 83 第二节: 返工生产业务类型 83 第三节: 委外加工业务类型 83 第十六课 生产任务类型(二) 85 第四节: 重复生产业务类型 86 第五节: 工序跟踪生产业务流程 86 第十七课 生产领料管理 87 第一节: 生产投料单的维护 88 第二节: 生产领料 89 第三节: 生产报废处理 91 第十八课 在制品管理 93 第一节: 车间在制品 94 第二节: 在制品的退料业务流程 95 第十九课 工序管理 98 第一节: 工票 99 第二节: 工序汇报 99 第二十课 产品完工管理 101 第一节: 生产任务单汇报 102 第二节: 产品完工入库 102 第三节: 生产任务执行情况跟踪 104 第四节: 生产任务结案 105 第二十一课 重复生产环境下的倒冲领料管理 106 第一节 倒冲领料概述 107 第二节 仓存物料的调拨 107 第三节 审核产品入库单 109 第四节 生成倒冲领料单 110 第五节 倒冲领料单的保存与审核 110

241

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 其他
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧