主从表的BOM如何用递归实现? ( 积分: 100 )

  • 主题发起人 主题发起人 Evan5188
  • 开始时间 开始时间
E

Evan5188

Unregistered / Unconfirmed
GUEST, unregistred user!
我公司ERP(外购)的BOM用一个主从表实现,结构如下:
表名:bom03(主表)
主件:bom0101 varchar
表名:bom04(从表)
主件:bom0101 varchar(20)
子件:bom0401 varchar(20)
用量:bom0403 dec(16,3)
主从表通过bom0101关联,其中BOM0401可以有下一阶,现在我想把这个BOM列印出来,请问要怎么用递归实现(最多只有四层,用循环也可以,DFW们,帮帮小弟,我是新手!!
 
我公司ERP(外购)的BOM用一个主从表实现,结构如下:
表名:bom03(主表)
主件:bom0101 varchar
表名:bom04(从表)
主件:bom0101 varchar(20)
子件:bom0401 varchar(20)
用量:bom0403 dec(16,3)
主从表通过bom0101关联,其中BOM0401可以有下一阶,现在我想把这个BOM列印出来,请问要怎么用递归实现(最多只有四层,用循环也可以,DFW们,帮帮小弟,我是新手!!
 
你用的是什麼數據庫?
 
有关系吗?我用的是MS SQL2000
 
我靠,高手都是“隐”而不发?
 
当然,如果是ORACLE,它自己就支持递归的SQL。如果是MS SQL, 你需要写涵数来支持。
 
如果你是用递归实现BOM的话,有必要用那么多表吗?
你可以下载织造程序看一下,里面的BOM写得不错,还有有源码.
 
是啊,可以不理会BOM03,只对BOM04操作就可以了.对了,哪有BOM的源码下载?
 
织造程序,是哪个
 
這個BOM設計是對的, bom03 其實應稱為BOM代碼表, 只是字段不是他所描述的這樣簡單.
 
据说sql server 2005 支持递归查询了。
 
把你的Email告訴我.個例子給你.
 
chester2005@163.com
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3007407

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2951556
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2696253

自己去参考一下,我采用的是多次循环的方式来扩展Bom表。
 
谢谢这么多人帮助我!
KEEPYEA说得没错,BOM03有些字段我没有列出;
LEADLY我的邮箱是:zhangyongyue@163.com;
QuickSilver待我试试先;
 
To:Leadyli,谢谢你的代码,但很遗憾我的表中并没有定义物料是成本、半成品、原材料,所以好像不行。
CREATE FUNCTION getbom (@cocode varchar(20))--主件編號
RETURNS @tbom table(mecode varchar(20),mename varchar(30),usenum numeric(18,6),delnum numeric(18,6)) --分別為子件編號,子件名稱,使用量,損耗量
AS
begin
declare @mecode varchar(20),@mename varchar(30),@usenum numeric(18,6),@delnum numeric(18,6),@codetype varchar(1)--codetype為1是原料,3是半成品,4是成品
declare my_cursor cursor for
select mecode,mename,usequ,delqu,codetype from base05_d1 where cocode=@cocode
open my_cursor
fetch next from my_cursor into @mecode,@mename,@usenum,@delnum,@codetype
while @@fetch_status=0
begin
insert into @tbom select @mecode,@mename,@usenum,@delnum
if @codetype='3'--半成品
insert into @tbom select *from dbo.getbom(@mecode)
fetch next from my_cursor into @mecode,@mename,@usenum,@delnum,@codetype
end

return
end
 
沒有的話if @codetype='3'--半成品這個條件去掉就行.
自己動動手吧.這樣才學得快:)
 
参照QuickSilver的方法,我用循环可以了,但用递归还是不行,老是只能列出第一层,下面是我的代码,大家帮看一下,完了就散分!
CREATE PROCEDURE bomlist02 @bom0101 varchar(20)
AS
declare @parent varchar(20),@child varchar(20),@qty decimal(16,3),@lev int
begin
set @lev=1
select bom0101,bom0401,bom0403,@lev as lev into #tmp from bom04 where bom0101=@bom0101
declare my_cursor cursor for
select bom0101,bom0401,bom0403 from bom04 where bom0101=@bom0101
open my_cursor
fetch next from my_cursor into @parent,@child,@qty
while (@@fetch_status=0)
begin
if exists(select * from bom04 where @bom0101=@child)
exec bomlist @child
else
fetch next from my_cursor into @parent,@child,@qty
end
close my_cursor
deallocate my_cursor
select * from #tmp
end
GO
 
[:(]人都到哪去了?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
646
import
I
后退
顶部