存储过程的多重循环欠套,很难
成品由半成品和原料构成,半成品由半成品和原料构成,现在要把所有的成品展开成原料(有半成品的把半成品展开成原料)。查找的大致方向是:成品-->拆成半成品和原料到一临表A(通过bomid在AMBommatl表里找)-->在表inventory和临表A之间匹配找出半成品-->在AMBomItem表里找出半成品的bomid-->根据boimid在AMBommatl找出组成他的原料(或半成品),以次循环,直到全部展开为原料。同时需要计算需要量,最后的原料的需要量,如果成品直接对应原料,那列出每个成品对应原料需要量、成品需要量;如果成品对应半成品...再对应原料,需要每个半成品对应的原料需要量*每个成品对应半成品需要量.....,成品需要量
最后得到的结果和临表A的结构一样(原料、原料需要量、产品、产品需要量、bomid)
表结构如下:
AMBommatl表(原料、半成品表):有字段invtid (原料、半成品ID)、qtyreq (原料需要量)、bomid(原料的bomid和成品的bomid对应)
AMBomItem表 (成品、半成品表):有字段invtid (成品ID)、qtyreq (原料需要量)、bomid(原料的bomid和成品的bomid对应)
inventory(库存表):invtid (半成品、成品)、classid (类型,当classid = 'c04' or classid = 'c05'时是半成品)
SOShipHeader、和soshipline是出货单表。和剩下的过程无关
我现在通过这个语句得到原料、原料需要量、产品、产品需要量、bomid,并放在临时表shippertemp中
select AMBommatl.invtid as partno,AMBommatl.bomid,AMBommatl.qtyreq as partQty,tempa.invtid as modelNo,tempa.Qty as modelQty into shippertemp from AMBommatl inner join (select bomid,AMBomItem.invtid,Qty from AMBomItem inner join (select distinct invtid,sum(qtyship) as Qty from soshipline left join SOShipHeader on SOShipHeader.sotypeid='so' and SOShipHeader.Status = 'c' and soshipline.Status = 'c' and soshipline.shipperid = SOShipHeader.shipperid group by invtid) as tempa on tempa.invtid = AMBomItem.invtid) as tempa on tempa.bomid = AMBommatl.bomid
--这句话可以查出半成品
select count(*) from inventory inner join shippertemp on shippertemp.partno = inventory.invtid and (classid = 'c04' or classid = 'c05')
怎么才能得到我要的结果
很有难度
问题点数:100、回复次数:5Top
1 楼ghostzxp(幽灵)回复于 2005-08-03 09:59:14 得分 0
看着头晕晕.
不过.如果数据量不大的话,通过建多个临时表,处理中间数据, 然后再通过中间数据得到要返回的结果集.这样每步都很清晰,也不难吧.
需要循环的话.
下面是大致处理模式
declare @i int
declare @Count int
set @count = count(1) from 你要处理的原始表及其连接
set @i =1
WHile (@i<=@count)
Begin
在这里处理数据将结果放到中间表中
set @i=@i+1
End
最后在这里 通过union 或 join 等方式 取得最后的结果集.
能用临时表的话,就能把数据分级处理,这样很方便.
Top
2 楼ppdty()回复于 2005-08-03 10:07:07 得分 0
ghostzxp(幽灵)
set @count = count(1) from 你要处理的原始表及其连接
是我开始临表里的半成品数吗?好像还是有点不对啊,你说的中间表是不是同时也有半成品和原料的啊?那我不是还要再在这张中间表中查找啊?
谢谢各位,再帮我看看
解决马上结帖
Top
3 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-08-03 10:15:36 得分 0
以下存储过程输出为:原料、原料需要量、bomid
---------------------------------------------------------
create procedure sp_getqty(@invtid varchar(20)) --成品ID
as
begin
declare @i int
set @i = 1
select
b.invtid,b.qtyreq,b.bomid,@i as level
into #t
from
AMBomItem a,
AMBommatl b
where
a.bomid = b.bomid
while @@rowcount<>0
begin
set @i = @i + 1
insert into #t
select
b.invtid,a.qtyreq*c.qtyreq/b.qtyreq,b.bomid,@i
from
#t a,
AMBomItem b,
AMBommatl c
where
a.invtid = b.invtid
and
b.bomid = c.bomid
delete #t where level = @i-1 and exists(select 1 from AMBomItem where invtid = #t.invtid)
end
select invtid,qtyreq=sum(qtyreq),bomid from #t group by invtid,bomid
end
goTop
4 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-08-03 10:16:08 得分 0
以下存储过程输出为:原料、原料需要量、bomid
---------------------------------------------------------
create procedure sp_getqty(@invtid varchar(20)) --成品ID
as
begin
declare @i int
set @i = 1
select
b.invtid,b.qtyreq,b.bomid,@i as level
into #t
from
AMBomItem a,
AMBommatl b
where
a.bomid = b.bomid
while @@rowcount<>0
begin
set @i = @i + 1
insert into #t
select
b.invtid,a.qtyreq*c.qtyreq/b.qtyreq,b.bomid,@i
from
#t a,
AMBomItem b,
AMBommatl c
where
a.invtid = b.invtid
and
b.bomid = c.bomid
delete #t where level = @i-1 and exists(select 1 from AMBomItem where invtid = #t.invtid)
end
select invtid,qtyreq=sum(qtyreq),bomid from #t group by invtid,bomid
end
goTop
5 楼ghostzxp(幽灵)回复于 2005-08-03 10:24:44 得分 0
烤.楼上好耐心.
如果需要的话,可以建成两个临时表.分别存放 成品及半成品. 看你的思路了,我说的可能只是个思路,
详细步骤看子陌的吧.子陌.....
Top




