用友U8開發-兩種方式實現BOM全階展開查詢


  1. 第一種是跟蹤物料清單資料查詢執行過程,獲取到的查詢對應的存儲過程
    1.1 這是母件信息查詢
    1 EXEC sp_executesql N'exec Usp_BO_Bo02020_Root @v_where,@v_CreateUser1,@v_CreateUser2',
    2     N'@v_where nvarchar(100),@v_CreateUser1 nvarchar(4000),@v_CreateUser2 nvarchar(4000)',
    3     @v_where = N' and  1=1   And ((c.InvCode >= N''999-PCBA'') And (c.InvCode <= N''999-PCBA'')) And (a.Status IN (N''3''))',
    4     @v_CreateUser1 = N'', @v_CreateUser2 = N'';

    1.2 這是子件信息查詢

    1 EXEC sp_executesql N'exec Usp_BO_Bo02020_detail @v_BomID,@v_PartID,@v_QueryType,@v_showTDL,@v_llc,@v_effdate,@v_status1,@v_status3,@v_status4,@v_CreateUser,@v_CreateUser1',
    2     N'@v_BomID int,@v_PartID int,@v_QueryType int,@v_showTDL int,@v_llc int,@v_effdate datetime,@v_status1 int,@v_status3 int,@v_status4 int,@v_CreateUser nvarchar(4000),@v_CreateUser1 nvarchar(4000)',
    3     @v_BomID = 1000008582, @v_PartID = 41498, @v_QueryType = 3, @v_showTDL = 1,
    4     @v_llc = 0, @v_effdate = '2015-01-01 00:00:00', @v_status1 = 0,
    5     @v_status3 = 3, @v_status4 = 0, @v_CreateUser = N'', @v_CreateUser1 = N'';

    其中@v_QueryType 1全階 2僅顯示下一層 3僅顯示最底層,@v_where的條件按照示例的格式自己仿照就行了,子件的查詢需要傳入BomID和PratID,因為系統標准的存儲過程查詢是考慮自由項的,其他參數說明和具體的執行過程可以直接到數據庫中找到對應存儲過程查看

  2. 第二種是網上看到的,自己改了一下
     1 DECLARE @partid INT;
     2 SELECT  @partid = 169;
     3 WITH    parts ( pbom, pid, cbom, cbid, cid, baseqtyn, baseqtyd, qty, lvl, cdepcode, cwhcode, seq )
     4           AS ( SELECT   NULL ,p.ParentId ,p.BomId ,p.BomId ,p.ParentId ,0 ,0 ,0 ,0 ,NULL ,NULL ,0 
     5                FROM     dbo.bom_parent AS p WITH ( NOLOCK )
     6                         LEFT JOIN bom_bom AS b WITH ( NOLOCK ) ON b.BomId = p.BomId
     7                WHERE    b.VersionEffDate <= GETDATE()
     8                         AND b.VersionEndDate > GETDATE()
     9                         AND b.BomType = 1
    10                UNION ALL
    11                SELECT   p.BomId ,
    12 p.ParentId ,cb.BomId ,c.OpComponentId ,c.ComponentId ,c.BaseQtyN ,c.BaseQtyD ,
    13 qty = ( c.BaseQtyN / c.BaseQtyD ) / ( 1- ISNULL(cb.ParentScrap,0) / 100 ) * ( 1+ ISNULL(c.CompScrap,0) / 100 ) ,--使用數量考慮損耗率
    14 0 AS lvl ,bo.DrawDeptCode ,bo.Whcode ,
    15                         CAST(ROW_NUMBER() OVER ( PARTITION BY c.BomId ORDER BY c.SortSeq ) AS INT) AS seq 
    16                FROM     dbo.bom_parent AS p WITH ( NOLOCK )
    17                         JOIN dbo.bom_bom AS b WITH ( NOLOCK ) ON b.BomId = p.BomId
    18                         JOIN dbo.bom_opcomponent AS c WITH ( NOLOCK ) ON c.BomId = p.BomId
    19                         LEFT JOIN dbo.bom_parent AS cb WITH ( NOLOCK ) ON c.ComponentId = cb.ParentId --關聯虛擬件
    20                         LEFT JOIN dbo.bom_bom AS bc WITH ( NOLOCK ) ON bc.BomId = cb.BomId
    21                         LEFT JOIN dbo.bom_opcomponentopt bo WITH ( NOLOCK ) ON c.OptionsId = bo.OptionsId  --關聯子件選項資料
    22                WHERE    b.VersionEffDate <= GETDATE()
    23                         AND b.VersionEndDate > GETDATE()
    24                         AND ( ( bc.VersionEffDate <= GETDATE()
    25                                 AND bc.VersionEndDate > GETDATE() AND bc.BomType = 1)OR bc.BomId IS NULL)),
    26         bom
    27           AS ( SELECT   parts.pid AS ancestor ,
    28 parts.pbom ,parts.pid ,parts.cbid ,parts.cbom ,parts.cid ,parts.baseqtyn ,
    29 parts.baseqtyd ,parts.qty ,parts.lvl ,parts.cdepcode ,parts.cwhcode ,CAST('01' AS NVARCHAR(50)) AS pseq
    30                FROM     parts
    31                WHERE    parts.pbom IS NULL
    32                         AND parts.pid = @partid--'999-PCBA'
    33                UNION ALL
    34                SELECT   p.ancestor ,c.pbom ,c.pid ,c.cbid ,c.cbom ,c.cid ,c.baseqtyn ,c.baseqtyd ,c.qty ,p.lvl + 1 ,c.cdepcode ,c.cwhcode ,
    35                         CAST(p.pseq + '.' + RIGHT('00'+ CAST(c.seq AS NVARCHAR(50)),2) AS NVARCHAR(50))
    36                FROM     parts AS c
    37                         JOIN bom AS p ON p.cbom = c.pbom
    38              )
    39     SELECT  i1.cInvCode 母件編碼,i1.cInvName 母件名稱,b.cbid ,i2.cinvcode 子件編碼,i2.cinvname 子件名稱,com.cComUnitName 單位,
    40             convert(decimal(18,2),b.baseqtyn) 基本用量,convert(decimal(18,2),b.baseqtyd) 基礎用量,
    41             convert(decimal(18,2),b.qty) 使用數量,b.lvl 級次,b.cdepcode 部門編碼,d.cdepname 部門名稱,b.cwhcode 倉庫編碼,w.cwhname 倉庫名稱,b.pseq
    42     FROM    bom AS b
    43     LEFT JOIN dbo.bas_part b1 WITH (NOLOCK) ON b.pid=b1.PartId
    44     LEFT JOIN dbo.bas_part b2 WITH (NOLOCK) ON b.cid=b2.PartId
    45     LEFT JOIN dbo.Inventory i1 WITH (NOLOCK) ON i1.cinvcode=b1.InvCode
    46     LEFT JOIN inventory i2 WITH (NOLOCK) ON i2.cInvCode=b2.InvCode
    47     LEFT JOIN dbo.ComputationUnit com WITH (NOLOCK) ON com.cComunitCode = i2.cComUnitCode
    48     LEFT JOIN dbo.Department d WITH (NOLOCK) ON d.cdepcode=b.cdepcode
    49     LEFT JOIN dbo.Warehouse w WITH (NOLOCK) ON w.cWhCode=b.cwhcode
    50     ORDER BY b.pseq
    51     OPTION  ( MAXRECURSION 10 );  

    同樣是傳入partid去查詢的,需要考慮自由項,如果沒有自由項可以改成只傳存貨編碼也可以,這個也可以改良下做成計算BOM成本的銷售報價單


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM