用友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