CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

存储过程的多重循环欠套,很难

楼主ppdty()2005-08-03 09:43:20 在 MS-SQL Server / 基础类 提问

成品由半成品和原料构成,半成品由半成品和原料构成,现在要把所有的成品展开成原料(有半成品的把半成品展开成原料)。查找的大致方向是:成品-->拆成半成品和原料到一临表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

相关问题

  • 存储过程中使用多重游标,形成死循环,急求!!!
  • 在存储过程怎样用循环。
  • 存储过程中的循环
  • 怎样循环执行存储过程
  • 每分钟循环调用存储过程,SqlServer 内存一直上涨,是我的存储过程的错?
  • 在存储过程中有几种循环结构?
  • 在存储过程中能用循环吗?
  • 在存储过程和sql中有没有for循环?
  • 存储过程中使用循环的问题?
  • 求一个关于循环插入记录的存储过程~!!!

关键词

  • invtid
  • bomid
  • qtyreq
  • 半成品
  • ambommatl
  • 原料
  • ambomitem
  • 需要量
  • 成品
  • soshipheader

得分解答快速导航

  • 帖主:ppdty

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo