ERP 高手请进,关于 BOM 最终级表维护的一个问题。(难!)

rongrong 2002-01-03 09:09:53
加精
product_no , part_no , qty
100 200 xx
100 300 xx
200 201 xx
201 2011 xx

各位的BOM格式,应该和以上类似吧。

在计算"物料需求时" , 为了得到该BOM的最终项,我不得不在需求计

算需求前 , 把 "当前 BOM" 全部展开一次。(找产品的"根节点") 这样做

没什么问题,只是增加了计算时间。想问的是 , 怎样实现有一张永远都

是已展开 BOM 的TABLE。

比如: 改动任何一种产品的 BOM (包括增加、删除) , 他能自动将所

有曾经调用过他的父 BOM 全部更新(一级一级往上推)。注:用量可以不用维护 !

我是这样想的,现各种程序设计语言,大都支持继承。 那我要实现的东西

就和“继承” 所做的事情差不多。

请问 , 你们的程序里有这种功能吗 ? 麻烦给个思路 , 谢谢 !
...全文
490 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
freeya 2002-01-15
  • 打赏
  • 举报
回复
Dsoul 2002-01-10
  • 打赏
  • 举报
回复
不过我感觉,你为何不像计算机网络那样建立一个全路径映射表?
当然会很庞大,但检索到最终父节点会很快啊.
Dsoul 2002-01-10
  • 打赏
  • 举报
回复
哇,实用,加入书签!
raymen 2002-01-09
  • 打赏
  • 举报
回复
继续学习,难得一见的好东西,请继续说下去啊
pbdesigner 2002-01-09
  • 打赏
  • 举报
回复
对BOM的操作,在每次新增/修改物料编号时都应进行死循环的检测,即物料的祖先(直接或间接)不可出现该物料,方法跟上展类似,只是如果发现出现在#temp_product的product_no列表中则强行退出,另外就是将临时表该为临时表(在触发器中调用不可出现create table语句).
举例:(一次性将A改为B时)
update bom
set part_no = 'a'
where part_no = 'b'
exec usp_bom_valid 'a',@is_valid output
if @is_valid = -1
begin
update bom
set part_no = 'b'
where part_no = 'a'
end
pbdesigner 2002-01-08
  • 打赏
  • 举报
回复
你的问题是否如何进行物料上展(又称零件上展报表),如果是的话常用递归的方法(要加一个固定表),也可以不用递归,但有局限性,不过很实用,源代码如下:
create procedure usp_bom_upexpand3(@part_no varchar(20),@expand_level int = 20) as
declare @loop_level int,
@part_no varchar(20)
set nocount on
create table #temp_product(product_no varchar(20))
select @expand_level = 10000
select @loop_level = 1
select @part_no ='2'
while @loop_level <= @expand_level
begin
if @loop_level = 1
begin
insert into #temp_product
select product_no from bom
where part_no=@part_no
end
else
begin
insert into #temp_product
select product_no
from bom
where part_no in (select product_no from #temp_product) and
product_no not in (select product_no from #temp_product)
end
select @loop_level = @loop_level + 1
end
select * from #temp_product order by product_no
drop table #temp_product
set nocount off

调用时只需传物料编号或再加上展级数,对于一般的企业,20级已经足够,你也可以指定级数,我测试了一下,指定10000级也只需27秒,速度还可以。
当你更新其中一个物料时,无需往上更新,只需简单的update。
zeng_zhh 2002-01-08
  • 打赏
  • 举报
回复
哈哈,這樣工程太大啦.
lsw_likai 2002-01-08
  • 打赏
  • 举报
回复

那这样一级级的往上推的话,我的问题就出来了。

A—A1—A2—A3( A 包含 A1 ... )

A3 有改动 A—A1—A2 三个产品都得改。

B—A (B 包含 A )

C—B (C 包含 B )

所以 B 、C 也都得改 , HE HE ~~~ 问题来了!!!

其实发该问题时,我就没准备要得到最终答案。 只是希望在和各位交流里找到点头绪 !

各位帮忙说两句,好吗 ? 谢谢 !
ALLTEC 2002-01-08
  • 打赏
  • 举报
回复

"pbdesigner(MIS/ERP开发)" 合格的 MIS/ERP 开发人 ! 风起云涌派的思人 ! 奋斗目标 !

zeng_zhh 2002-01-08
  • 打赏
  • 举报
回复
受教!
zls0303 2002-01-08
  • 打赏
  • 举报
回复
pbdesigner又出手了
pbdesigner 2002-01-08
  • 打赏
  • 举报
回复
将下列语句删除,用于调试用的
select @expand_level = 10000
select @part_no ='2'
zeng_zhh 2002-01-07
  • 打赏
  • 举报
回复
如果当前改的是半成品,所有调用过该半成品的 BOM 當然都要跟着改。這一步就在修改BOM時做了.
這樣,如果妳想省時間,就可以直接讀最終极表數据,或者也可以更新這個表(就是在妳用耗時的展開法得到的數据替換原來的)
但妳所要的這個表數据量會很大的.
lsw_likai 2002-01-07
  • 打赏
  • 举报
回复

对呀最终级是另一个表 。

如果当前改的是半成品,那是不是曾经调用过该半成品的 BOM 也都要跟着改。

就如以上如果 A 的 BOM 改了 。 那 X 的最终级 BOM 是不是要改。

做这个功能主要是方便,算需求时找根节点。我原来是在算需求是再展开的。
但这样做耗时间, 既然别人已经做到了,那自己当然要试试了。
zeng_zhh 2002-01-07
  • 打赏
  • 举报
回复
我想可以這樣解決.
在修改BOM時,保存多一個表,就是妳所想要的最終极表.
zeng_zhh 2002-01-07
  • 打赏
  • 举报
回复
有點明白妳想要什么了.

不過細細想一下.真的挺難實現的.
lsw_likai 2002-01-07
  • 打赏
  • 举报
回复
TO:LIULEE

我要问的也并不是 BOM 展开问题 ,反而是我不想做展开BOM这个操作。主要是想减少计算MRP的时间 !

想通过前台对 BOM 维护。如增加、删除、修改 等。自动维护出一份已经展开到最终级的表。( 我看过 ORACLE 的 ERP 产品,他有做到这个。 其它不少 ERP 产品也有这样做 )

以上所有回答,应该都没有完全看明白我意思。 SORRY 表达能力差 !!!
lsw_likai 2002-01-07
  • 打赏
  • 举报
回复
比如一个吧:
product_no , part_no , qty
X A 1
X B 1
A B 1
A C 1

我要的是.
注明:用量可以不用计算 , 当然计算过来也行。

product_no , part_no , qty
X A 1
X B 2(这里有汇总,但可以不要)
X C 1(这就是从A里展开出来的,这就是最终级 !)
A B 1
A C 1

另: LIULEE 所说的"底层码" 没看懂. 因为一个物料,它在某一个成品里可以是最终级,但在另一个成品里却不一定是最终级。(不知是否理解有误 ! )

HE HE ~~~~ 又一个风起云涌帐号 !


raymen 2002-01-07
  • 打赏
  • 举报
回复
这么好的话题,继续推啊
juwuyi 2002-01-06
  • 打赏
  • 举报
回复
留意!

我每次按我敢兴趣按钮后,好像都没用,所以不得不留言一下,放在我的参与里面,以后就好找多了!
加载更多回复(27)

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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