表1:库存表
---------------------------------
料号         库存数量
----------------------------------
AAA1           10000
AAA2           20000
AAA3           10000
BBB1           50000
表2:
--------------------------------------------------------
料号        替代料            需求量         最终申购量
--------------------------------------------------------
AAA1                        100000             ?
           AAA2
           AAA3
                    
BBB1                        200000             ?
           AAA2             ---------------------------------------------------------
计算需求数:根据BOM生成物料需求,但现在有一批呆料从需要中扣除,生成最终的申购量
另外,BOM里面会有替代料的问题,可以不能的料也有不同的替代料,不知道有没有好的方法实现?

解决方案 »

  1.   

    你的业务都没有描述清楚 如果是BOM递归参考create table #EnterPrise
    (
      Department nvarchar(50),--部门名称
      ParentDept nvarchar(50),--上级部门
      DepartManage nvarchar(30)--部门经理
    )
    insert into #EnterPrise select '技术部','总经办','Tom'
    insert into #EnterPrise select '商务部','总经办','Jeffry'
    insert into #EnterPrise select '商务一部','商务部','ViVi'
    insert into #EnterPrise select '商务二部','商务部','Peter'
    insert into #EnterPrise select '程序组','技术部','GiGi'
    insert into #EnterPrise select '设计组','技术部','yoyo'
    insert into #EnterPrise select '专项组','程序组','Yue'
    insert into #EnterPrise select '总经办','','Boss'
    --查询部门经理是Tom的下面的部门名称
    ;with hgo as
    (
       select *,0 as rank from #EnterPrise where DepartManage='Tom'
       union all
       select h.*,h1.rank+1 from #EnterPrise h join hgo h1 on h.ParentDept=h1.Department
    )
    select * from hgo
    /*
    Department           ParentDept                DepartManage      rank
    --------------- -------------------- ----------------------- -----------
    技术部               总经办                    Tom               0
    程序组               技术部                    GiGi              1
    设计组               技术部                    yoyo              1
    专项组               程序组                    Yue               2
    */
    --查询部门经理是GiGi的上级部门名称
    ;with hgo as
    (
       select *,0 as rank from #EnterPrise where DepartManage='GiGi'
       union all
       select h.*,h1.rank+1 from #EnterPrise h join hgo h1 on h.Department=h1.ParentDept
    )
    select * from hgo
    /*
    Department               ParentDept          DepartManage    rank
    -------------------- ----------------------  -----------  -----------
    程序组                   技术部                 GiGi           0
    技术部                   总经办                 Tom            1
    总经办                                          Boss           2
    */
      

  2.   

    BOM结构(已生成,这里是替代部分)
     料号 是否替代料 原料号 用量
     A 否 1
     A1 是 A
     A2 是 A
     ......
     B 否 1
     B1 是 B
     AA 否 1
     A1 是 AA
     ......
     
     呆料表
     料号 呆料数量
     A 100
     A1 5000
     A2 3000
     B1 2000
     
     现要求生产T6500套,求物料申购数
     (申购数是需求数减去可以替代的数量)
     料号 需求数 申购数
     A 6500 0 (6500-A_100-A1_5000-A2_1400-->A2余1600)
     B 6500 4500 (6500-B1_2000)
     AA 6500 4900 (6500-A2余_1600)
     
    不好意思,题目没有讲明白,重新把需求说了一下,不知道各位明白了没有
      

  3.   

    你这个还有问题吧 A1 怎么既在A下面 又在AA下面呢
      

  4.   

    我把测试数据做了调整 你看一下 我写的有问题没你可以看着改一下   
       --> 测试数据:[ta]
    IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
    GO 
    CREATE TABLE [ta]([料号] VARCHAR(10),[是否替代料] VARCHAR(10),[原料号] VARCHAR(10))
    INSERT [ta]
    SELECT 'A','否','1' UNION ALL
    SELECT 'A1','是','A' UNION ALL
    SELECT 'A2','是','A' UNION ALL
    SELECT 'B','否','1' UNION ALL
    SELECT 'B1','是','B' UNION ALL
    SELECT 'AA','否','1' UNION ALL
    SELECT 'AA1','是','AA'
    --> 测试数据:[呆料表]
    IF OBJECT_ID('[呆料表]') IS NOT NULL DROP TABLE [呆料表]
    GO 
    CREATE TABLE [呆料表]([料号] VARCHAR(10),[呆料数量] INT)
    INSERT [呆料表]
    SELECT 'A',100 UNION ALL
    SELECT 'A1',5000 UNION ALL
    SELECT 'A2',3000 UNION ALL
    SELECT 'AA1',200 UNION ALL
    SELECT 'B1',2000--> 测试数据:[tb]
    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO 
    CREATE TABLE [tb]([料号] VARCHAR(10),[需求数] INT)
    INSERT [tb]
    SELECT 'A',6500 UNION ALL
    SELECT 'B',6500 UNION ALL
    SELECT 'AA',6500
    ;WITH  cte AS 
    (
    SELECT a.[料号],a.[是否替代料],a.[料号] AS [原料号],[呆料数量]=ISNULL(b.[呆料数量],0) FROM [ta]  AS a LEFT JOIN [呆料表] b ON a.[料号]=b.[料号]
    WHERE a.[原料号]='1'
    UNION ALL 
    SELECT a.[料号],a.[是否替代料],a.[原料号],[呆料数量]=ISNULL(b.[呆料数量],0) FROM [ta]  AS a 
    INNER JOIN [呆料表] b ON a.[料号]=b.[料号] 
    INNER JOIN cte AS t ON t.[料号]=a.[原料号]
    )
    SELECT [料号],[需求数],[申购数]=CASE WHEN [呆料数量]>=[需求数] THEN 0 ELSE [需求数]-[呆料数量] END 
    FROM [tb] AS a,
    (
    SELECT [原料号],SUM([呆料数量]) AS [呆料数量] FROM cte GROUP BY [原料号]
    ) AS b  
    WHERE a.[料号]=b.[原料号]
      

  5.   


    大哥,没有错,A1就是在AA下面,这个可以替代A或者AA,问题就是在这里。
      

  6.   

    设计问题啊,那A1 是先分给A 呢还是先分给AA呢?
      

  7.   

    首先,你要知道BOM是什么,在SQL表中是如何组织的,又是通过什么手段取出来的(递归)
    其次,你要知道怎么处理你那个常规的需求、库存业务
    最后,再处理那些特殊的需求,比如排除呆滞库存等不要上来就只看见一堆问题,要善于分割,我就不信,分割出来的问题点,你一个也解决不了呢?是不呀