bluebunny72 icon

Recursive Bill of Materials

bluebunny72 | PRO | 08/29/19 04:36:31 PM UTC | 0 ⭐ | 7134 👁️ | Never ⏰ | []
SQL |

4.44 KB

|

None

|

0 👍

/

0 👎

   ;WITH 
   BOM (
         job_a
        ,suffix_a
        ,job_c
        ,suffix_c
        ,opernum
        ,[SEQUENCE]
        ,anchoritem
        ,item
        ,component      
        ,[level]
        ,SortPath
        ,total_matl_qty
        ,total_matl_qty_conv
        ,matl_qty
        ,u_m
        ,units --U = per unit L = per lot (Basically if U then you need that matl_qty for every 1 unit you make.  If L then it doesn't matter how many you make it will always cost the same on time qty of matl_qty)
        ,item_path
  )
  AS (
        SELECT 
             j.job      AS job_a--job
            ,j.suffix   AS suffix_a --suffix
            ,j.job AS job_c--job
            ,j.suffix AS suffix_c--suffix
            ,jr.oper_num--opernum
            ,jm.[SEQUENCE]--sequence
            ,j.item--anchoritem
            ,j.item--item
            ,jm.item--component     
            ,0 AS [level]--level
            ,CAST('\' + RIGHT('000'+CONVERT(VARCHAR(3),jm.[sequence]),3) AS NVARCHAR(254)) --sortpath
            ,jm.matl_qty as total_matl_qty
            ,jm.matl_qty_conv as total_matl_qty_conv
            ,jm.matl_qty
            ,jm.u_m
            ,jm.units
            ,cast(j.item as varchar) as item_path
        FROM dbo.job j
        JOIN dbo.jobmatl jm ON jm.job = j.job
            AND jm.suffix = j.suffix
        JOIN dbo.jobroute jr ON jr.job = j.job
            AND jr.suffix = j.suffix
            AND jr.oper_num = jm.oper_num
 
        WHERE j.stat = 'R'
 
        UNION ALL
    
        SELECT 
             b.job_a
            ,b.suffix_a
            ,jm.job    as job_c--job
            ,jm.suffix as suffix_c  --suffix
            ,jr.oper_num--opernum
            ,jm.[Sequence]--sequence
            ,b.anchoritem--anchoritem
            ,i.item--item
            ,jm.item--component
            ,(b.[level] + 1) AS [level]--level
            ,CAST(b.SortPath + '\' + RIGHT('000'+CONVERT(VARCHAR(3),jm.[sequence]),3) AS NVARCHAR(254))--sortpath
            ,CAST((b.total_matl_qty * jm.matl_qty) as decimal(18,8)) as total_matl_qty
            ,CAST((b.total_matl_qty_conv * jm.matl_qty) as decimal(18,8)) as total_matl_qty_conv
            ,jm.matl_qty
            ,jm.u_m
            ,jm.units
            ,Cast((ISNULL(b.item_path,'') + '>' + i.item) as varchar) as item_path
        FROM BOM b
        JOIN dbo.item i ON i.item = b.component
        JOIN dbo.jobmatl jm ON jm.job = i.job
            AND jm.suffix = i.suffix
        JOIN dbo.jobroute jr ON jr.job = jm.job
            AND jr.suffix = jm.suffix
            AND jr.oper_num = jm.oper_num
        
    )
    SELECT
         b.job_a AS job
        ,b.suffix_a AS suffix
        ,b.anchoritem as top_level_item
        ,b.item 
        ,b.[level]
        ,b.item_path
    FROM 
        BOM b
    left join
        job j
    on  
        b.job_a = j.job
    and
        b.suffix_a = j.suffix
    where
        b.anchoritem = b.component and (j.rework = 1 and level > 0 or j.rework = 0)
 
 
   ;WITH 
   BOM (
         job_c
        ,suffix_c
        ,opernum
        ,[sequence]
        ,anchoritem
        ,item
        ,component      
        ,[level]
        ,total_matl_qty
        ,total_matl_qty_conv
        ,matl_qty
        ,u_m
        ,units --U = per unit L = per lot (Basically if U then you need that matl_qty for every 1 unit you make.  If L then it doesn't matter how many you make it will always cost the same ON TIME qty OF matl_qty)
        ,item_path
  )
  AS (
        SELECT 
             i.job AS job_c--job
            ,i.suffix AS suffix_c--suffix
            ,jr.oper_num--opernum
            ,jm.[SEQUENCE]--sequence
            ,i.item--anchoritem
            ,i.item--item
            ,jm.item--component     
            ,0 AS [level]--level
            ,jm.matl_qty AS total_matl_qty
            ,jm.matl_qty_conv AS total_matl_qty_conv
            ,jm.matl_qty
            ,jm.u_m
            ,jm.units
            ,CAST(i.item AS VARCHAR) AS item_path
        FROM dbo.item i
        JOIN dbo.jobmatl jm ON jm.job = i.job
            AND jm.suffix = i.suffix
        JOIN dbo.jobroute jr ON jr.job = i.job
            AND jr.suffix = i.suffix
            AND jr.oper_num = jm.oper_num
 
        WHERE i.stat IN ('A','S')
 
        UNION ALL
    
        SELECT 
             jm.job    AS job_c--job
            ,jm.suffix AS suffix_c  --suffix
            ,jr.oper_num--opernum
            ,jm.[SEQUENCE]--sequence
            ,b.anchoritem--anchoritem
            ,i.item--item
            ,jm.item--component
            ,(b.[level] + 1) AS [level]--level
            ,CAST((b.total_matl_qty * jm.matl_qty) AS DECIMAL(18,8)) AS total_matl_qty
            ,CAST((b.total_matl_qty_conv * jm.matl_qty) AS DECIMAL(18,8)) AS total_matl_qty_conv
            ,jm.matl_qty
            ,jm.u_m
            ,jm.units
            ,CAST((ISNULL(b.item_path,'') + '>' + i.item) AS VARCHAR) AS item_path
        FROM BOM b
        JOIN dbo.item i ON i.item = b.component
        JOIN dbo.jobmatl jm ON jm.job = i.job
            AND jm.suffix = i.suffix
        JOIN dbo.jobroute jr ON jr.job = jm.job
            AND jr.suffix = jm.suffix
            AND jr.oper_num = jm.oper_num
        
    )
    SELECT
         b.anchoritem AS top_level_item
        ,b.item 
        ,b.[level]
        ,b.item_path
    FROM 
        BOM b
    WHERE
        b.anchoritem = b.component

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎