ABAP Bom按层展开的几种实现方法

*递归的方式实现
FUNCTION zbomexplode .
*"--------------------------------------------------------- *"
*"Local Interface:
*"IMPORTING
*"REFERENCE(MATNR) TYPE MATNR
*"REFERENCE(WERKS) TYPE WERKS_D
*"TABLES
*"PARENT STRUCTURE SBOM
*"CHILDREN STRUCTURE SBOM
*"EXCEPTIONS
*" NO_BOM_FOUND *"----------------------------------------------------------
   DATA it_a  TYPE  TABLE  OF sbom .
   DATA it_b  TYPE  TABLE  OF sbom .
   IF parent[]  IS  INITIAL .
* first time that call to the FM
     SELECT stpo ~idnrk  INTO  TABLE it_a
     FROM mast INNER  JOIN stpo
     ON mast ~stlnr  stpo ~stlnr
     WHERE mast ~matnr  matnr
     AND mast ~werks  werks .
     IF it_a[]  IS  INITIAL .
       RAISE no_bom_found .
     ENDIF .
   ELSE .
     SELECT stpo ~idnrk  INTO  TABLE it_a
     FROM mast
    INNER  JOIN stpo  ON mast ~stlnr  stpo ~stlnr
     FOR  ALL ENTRIES  IN parent
     WHERE mast ~matnr  parent -matnr
     AND mast ~werks  werks .
* if there is no any sub item, then stop the recursion IF it_a[] IS INITIAL.
     EXIT .
   ENDIF .
ENDIF .
APPEND  LINES  OF it_a  TO children .
* get sub items recursively
CALL  FUNCTION  'Z_BOM_EXPLODE'
   EXPORTING
    matnr     ''
    werks     werks
   TABLES
    parent    it_a
    children  it_b .
APPEND  LINES  OF it_b  TO children .
* delete duplicate sub items at the end
IF parent[]  IS  INITIAL .
   SORT children  BY matnr .
   DELETE  ADJACENT  DUPLICATES  FROM children .
ENDIF .
ENDFUNCTION .
*使用循环代替递归的一种做法1,更便于做异常处理,程序运行时系统也不要维护递归堆栈。这个程序不好的地方在于要用两个itab频繁copy数据。
FUNCTION zbomexplode1 .
*"--------------------------------------------------------- *"
*"Local Interface:
*" IMPORTING
*" VALUE(MATNR) TYPE MATNR
*" VALUE(WERKS) TYPE WERKS_D *" TABLES
*" CHILDREN STRUCTURE SBOM *" EXCEPTIONS
*" NO_BOM_FOUND *"---------------------------------------------------------
DATA it_a  TYPE  TABLE  OF sbom ,
it_b  TYPE  TABLE  OF sbom ,
it_result  TYPE  TABLE  OF sbom .
SELECT stpo ~idnrk
INTO  TABLE it_a
FROM mast
INNER  JOIN stpo  ON mast ~stlnr  stpo ~stlnr
WHERE mast ~matnr  matnr
AND mast ~werks  werks .
   APPEND  LINES  OF it_a  TO it_result .
   WHILE  NOT it_a[]  IS  INITIAL .
     SELECT stpo ~idnrk
     INTO  TABLE it_b
     FROM mast INNER  JOIN stpo
     ON mast ~stlnr  stpo ~stlnr
     FOR  ALL ENTRIES  IN it_a
     WHERE mast ~matnr  it_a -matnr
     AND mast ~werks  werks .
       APPEND  LINES  OF it_b  TO it_result .
      it_a[]  it_b[] .
     ENDWHILE .
* delete duplicate sub items
     SORT it_result  BY matnr .
     DELETE  ADJACENT  DUPLICATES  FROM it_result .
    children[]  it_result[] .
   ENDFUNCTION .
   FUNCTION zbomexplode2 .
*"---------------------------------------------------------- *"
*"Local Interface: *" IMPORTING
*" VALUE(MATNR) TYPE MATNR
*" VALUE(WERKS) TYPE WERKS_D
*" TABLES
*" CHILDREN STRUCTURE SBOM
*" EXCEPTIONS *" NO_BOM_FOUND
*"----------------------------------------------------------
     DATA it_result  TYPE  TABLE  OF sbom ,
    wa_bom  TYPE sbom .
     SELECT stpo ~idnrk
     INTO  TABLE it_result
     FROM mast INNER  JOIN stpo
     ON mast ~stlnr  stpo ~stlnr
     WHERE mast ~matnr  matnr
     AND mast ~werks  werks .
       LOOP  AT it_result  INTO wa_bom .
         SELECT stpo ~idnrk
         APPENDING  TABLE it_result
         FROM mast INNER  JOIN stpo
         ON mast ~stlnr  stpo ~stlnr
         WHERE mast ~matnr  wa_bom -matnr
         AND mast ~werks  werks .
         ENDLOOP .
* delete duplicate sub items
        sort it_result by matnr .
        delete adjacent duplicates from it_result .
        children[] = it_result[] .
       ENDFUNCTION .
*调用BAPI实现
       FUNCTION zbomexplode .
*"--------------------------------------------------------- *"
*"Local Interface: *" IMPORTING
*" VALUE(MATNR) LIKE MARA-MATNR
*" VALUE(WERKS) LIKE MARC-WERKS OPTIONAL
*" VALUE(CAPID) LIKE TC04-CAPID DEFAULT 'PP01'
*" TABLES
*" STB STRUCTURE STPOX
*" RETURN STRUCTURE BAPIRET2
*"---------------------------------------------------------
         IF werks  IS  INITIAL . "Added in case external call does not know
          werks  '1000' .
         ENDIF .
         IF capid  IS  INITIAL .
          capid  'PP01' .
         ENDIF .
         CALL  FUNCTION  'CS_BOM_EXPL_MAT_V2'
           EXPORTING
            capid         capid
            datuv         sy -datum
            mehrs         'X'
            mtnrv         matnr
            werks         werks
           TABLES
            stb           stb
           EXCEPTIONS
            no_bom_found  1 .
         IF sy -subrc <>  0 .
          msg_typ  'E' .
          msg_id  'Z_EF' .
          msg_no  '002' .
          msg_v1  matnr .
           IF  NOT msg_typ  IS  INITIAL .
* append error to table RETURN
             CALL  FUNCTION  'BALW_BAPIRETURN_GET2'
               EXPORTING
                 type       msg_typ
                cl         msg_id
                 number     msg_no
                par1       msg_v1
                par2       msg_v2
                par3       msg_v3
                par4       msg_v4
                 parameter  space
                row        space
                 field      space
               IMPORTING
                 return     wa_return_tmp .
             APPEND wa_return_tmp  TO  return .
           ENDIF .
         ENDIF .
       ENDFUNCTION
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值