SAP BOM 相关Function

展开BOM:

可以多层展开:

CS_BOM_EXPL_MAT_V2()

对于capid参数,一般情况下,我们所取的都生产用BOM,所以必须指定为"PP01" 。如果是其它类型的BOM应用,则可以按需要选择:
PP01------ Production - general 
BEST------ Inventory management
INST ------ Plant maintenance
PC01 ------ Costing
PI01 ------ Process manufacturing
SD01------ Sales and distribution

不可多层:

CSAP_MAT_BOM_READ(可RFC调用)

CABM_READ_BOM (不可RFC)

 

创建BOM:

BAPI_MATERIAL_BOM_GROUP_CREATE(可以创建BOM组)

CSAP_MAT_BOM_CREATE
CSAP_MAT_BOM_MAINTAIN(创建可选的BOM有问题)

 

反查BOM:

CS_WHERE_USED_MAT

 

其他:

CSAP_MAT_BOM_ALLOC_CREATE
CSAP_MAT_BOM_ALLOC_DELETE
CSAP_MAT_BOM_CLOSE
CSAP_MAT_BOM_DELETE
CSAP_MAT_BOM_ITEM_SELECT
CSAP_MAT_BOM_OPEN
CSAP_MAT_BOM_READ
CSAP_MAT_BOM_SELECT

bom展开 CS_BOM_EXPL_MAT_V2

FUNCTION ZRFC_BOM_EXPL.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(I_WERKS) TYPE  WERKS_D OPTIONAL
*"     VALUE(I_MATNR) TYPE  MATNR OPTIONAL
*"     VALUE(I_DATUM) TYPE  DATUM DEFAULT SY-DATUM
*"  TABLES
*"      OUTPUT STRUCTURE  ZRFC_BOM_EXPL OPTIONAL
*"----------------------------------------------------------------------


DATA: GIT_STPOX LIKE STPOX OCCURS WITH HEADER LINE.
DATA: GIT_CSCMAT LIKE CSCMAT OCCURS WITH HEADER LINE.

CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
       EXPORTING
            CAPID                 = 'PP01'                   "BOM类型,比如生产BOM,研发BOM,销售BOM等等
            DATUV                 = SY-DATUM                           "填入日期,函数据此日期筛选出有效的组件
            EHNDL                 = '1'
            EMENG                 = 1000                   "设定的用量单位
*            MEHRS                 = 'X'                        "有值表示多层展开,类似事物码CS12
            MTNRV                 =  I_MATNR                          "BOM料号
            STLAN                 = '1'                        "类似参数CAPID,限定被展开BOM的性质
            WERKS                 = I_WERKS          "
       TABLES
            STB                   = GIT_STPOX           "
            MATCAT                = GIT_CSCMAT.  "


LOOP AT GIT_STPOX.
      OUTPUT-MATKL = GIT_STPOX-MATKL.
      OUTPUT-IDNRK = GIT_STPOX-IDNRK.
      IF GIT_STPOX-IDNRK <> ''.
           OUTPUT-DOBJT = GIT_STPOX-IDNRK.
      ELSE.
           OUTPUT-DOBJT = GIT_STPOX-POTX1.
      ENDIF.
      OUTPUT-OJTXP = GIT_STPOX-OJTXP.
      OUTPUT-MNGKO = GIT_STPOX-MENGE.
      OUTPUT-MEINS = GIT_STPOX-MEINS.
      APPEND OUTPUT.
      CLEAR OUTPUT.
ENDLOOP.

ENDFUNCTION.

 

顺查BOM(展开BOM清单、CS12)与逆查BOM(查上层物料、CS15)

1.顺查BOM

CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' 
    EXPORTING 
       capid = pm_capid “应用程序一般为PP01 
       datuv = pm_datuv “通常为系统的当前日期 
       mtnrv = pm_mtnrv “要展开BOM的物料 
       mehrs = 'X' “ x表示多层展开﹐space表示只展开第一层 
       werks = pm_werks “通常为1000 
    IMPORTING 
       topmat = selpool 
       dstst = dstst_flg 
    TABLES 
       stb = stb “展开的BOM存放在该内表 
       matcat = matcat “下面含有元件的物料存放在该内表

2.逆查BOM

DATA: IT_WULTB LIKE STPOV OCCURS 0 WITH HEADER LINE,
        IT_EQUICAT LIKE CSCEQUI OCCURS 0 WITH HEADER LINE,
        IT_KNDCAT LIKE CSCKND OCCURS 0 WITH HEADER LINE,
        IT_MATCAT LIKE CSCMAT OCCURS 0 WITH HEADER LINE,
        IT_STDCAT LIKE CSCSTD OCCURS 0 WITH HEADER LINE,
        IT_TPLCAT LIKE CSCTPL OCCURS 0 WITH HEADER LINE,
        IT_PRJCAT LIKE CSCPRJ OCCURS 0 WITH HEADER LINE.

  CLEAR:IT_WULTB,IT_WULTB[].
  CALL  FUNCTION  'CS_WHERE_USED_MAT'
     EXPORTING
      DATUB              = SY-DATUM
      DATUV              = SY-DATUM
      MATNR              = P_C_MATNR
*     POSTP               = ' '
*     RETCODE_ONLY        = ' '
*     STLAN               = ' '
      MCLMT              = '00000000'
      WERKS              = S2_WERKS
*    IMPORTING
*    TOPMAT              =
     TABLES
          WULTB           = IT_WULTB
          EQUICAT         = IT_EQUICAT
          KNDCAT          = IT_KNDCAT
          MATCAT          = IT_MATCAT
          STDCAT          = IT_STDCAT
          TPLCAT          = IT_TPLCAT
     EXCEPTIONS
          CALL_INVALID        = 1
          MATERIAL_NOT_FOUND          = 2
          NO_WHERE_USED_REC_FOUND     = 3
          NO_WHERE_USED_REC_SELECTED = 4
          NO_WHERE_USED_REC_VALID     = 5
          OTHERS              = 6.

 

 

 

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

  1. *递归的方式实现  
  2. FUNCTION zbomexplode.  
  3. *"--------------------------------------------------------- *"  
  4. *"Local Interface:  
  5. *"IMPORTING  
  6. *"REFERENCE(MATNR) TYPE  MATNR  
  7. *"REFERENCE(WERKS) TYPE  WERKS_D  
  8. *"TABLES  
  9. *"PARENT STRUCTURE  SBOM  
  10. *"CHILDREN STRUCTURE  SBOM  
  11. *"EXCEPTIONS  
  12. *"      NO_BOM_FOUND  *"----------------------------------------------------------  
  13.   DATA: it_a TYPE TABLE OF sbom.  
  14.   DATA: it_b TYPE TABLE OF sbom.  
  15.   IF parent[] IS INITIAL.  
  16. * first time that call to the FM  
  17.     SELECT stpo~idnrk INTO TABLE it_a  
  18.       FROM mast INNER JOIN stpo  
  19.       ON mast~stlnr = stpo~stlnr  
  20.       WHERE mast~matnr = matnr  
  21.         AND mast~werks = werks.  
  22.     IF it_a[] IS INITIAL.  
  23.       RAISE no_bom_found.  
  24.     ENDIF.  
  25.   ELSE.  
  26.     SELECT stpo~idnrk  INTO TABLE it_a  
  27.       FROM mast  
  28.       INNER JOIN stpo  ON mast~stlnr = stpo~stlnr  
  29.       FOR ALL ENTRIES IN parent  
  30.       WHERE mast~matnr = parent-matnr  
  31.        AND mast~werks = werks.  
  32. * if there is no any sub item, then stop the recursion     IF it_a[] IS INITIAL.  
  33.     EXIT.  
  34.   ENDIF.  
  35. ENDIF.  
  36. APPEND LINES OF it_a TO children.  
  37. * get sub items recursively  
  38. CALL FUNCTION 'Z_BOM_EXPLODE'  
  39.   EXPORTING  
  40.     matnr    = ''  
  41.     werks    = werks  
  42.   TABLES  
  43.     parent   = it_a  
  44.     children = it_b.  
  45. APPEND LINES OF it_b TO children.  
  46. * delete duplicate sub items at the end  
  47. IF parent[] IS INITIAL.  
  48.   SORT children BY matnr.  
  49.   DELETE ADJACENT DUPLICATES FROM children.  
  50. ENDIF.  
  51. ENDFUNCTION.  
  52.   
  53.   
  54. *使用循环代替递归的一种做法1,更便于做异常处理,程序运行时系统也不要维护递归堆栈。这个程序不好的地方在于要用两个itab频繁copy数据。  
  55. FUNCTION zbomexplode1.  
  56. *"--------------------------------------------------------- *"  
  57. *"Local Interface:  
  58. *"  IMPORTING  
  59. *"     VALUE(MATNR) TYPE  MATNR  
  60. *"     VALUE(WERKS) TYPE  WERKS_D *"  TABLES  
  61. *"      CHILDREN STRUCTURE  SBOM *"  EXCEPTIONS  
  62. *"      NO_BOM_FOUND  *"---------------------------------------------------------  
  63. DATA: it_a      TYPE TABLE OF sbom,  
  64.       it_b      TYPE TABLE OF sbom,  
  65.       it_result TYPE TABLE OF sbom.  
  66. SELECT stpo~idnrk  
  67. INTO TABLE it_a  
  68. FROM mast  
  69.   INNER JOIN stpo ON mast~stlnr = stpo~stlnr  
  70.        WHERE mast~matnr = matnr  
  71.         AND mast~werks = werks.  
  72.   
  73.   APPEND LINES OF it_a TO it_result.  
  74.   WHILE NOT it_a[] IS INITIAL.  
  75.     SELECT stpo~idnrk  
  76.              INTO TABLE it_b  
  77.               FROM mast INNER JOIN stpo  
  78.                ON mast~stlnr = stpo~stlnr  
  79.              FOR ALL ENTRIES IN it_a  
  80.               WHERE mast~matnr = it_a-matnr  
  81.                AND mast~werks = werks.  
  82.       APPEND LINES OF it_b TO it_result.  
  83.       it_a[] = it_b[].  
  84.     ENDWHILE.  
  85. * delete duplicate sub items  
  86.     SORT it_result BY matnr.  
  87.     DELETE ADJACENT DUPLICATES FROM it_result.  
  88.     children[] = it_result[].  
  89.   ENDFUNCTION.  
  90.   
  91.   FUNCTION zbomexplode2.  
  92. *"---------------------------------------------------------- *"  
  93. *"Local Interface: *"  IMPORTING  
  94. *"     VALUE(MATNR) TYPE  MATNR  
  95. *"     VALUE(WERKS) TYPE  WERKS_D  
  96. *"  TABLES  
  97. *"      CHILDREN STRUCTURE  SBOM  
  98. *"  EXCEPTIONS  *"      NO_BOM_FOUND  
  99. *"----------------------------------------------------------  
  100.     DATA: it_result TYPE TABLE OF sbom,  
  101.           wa_bom    TYPE sbom.  
  102.     SELECT stpo~idnrk  
  103.        INTO TABLE it_result  
  104.        FROM mast INNER JOIN stpo  
  105.         ON mast~stlnr = stpo~stlnr  
  106.       WHERE mast~matnr = matnr  
  107.         AND mast~werks = werks.  
  108.       LOOP AT it_result INTO wa_bom.  
  109.         SELECT stpo~idnrk  
  110.            APPENDING TABLE it_result  
  111.           FROM mast INNER JOIN stpo  
  112.             ON mast~stlnr = stpo~stlnr  
  113.           WHERE mast~matnr = wa_bom-matnr  
  114.             AND mast~werks = werks.  
  115.         ENDLOOP.  
  116. * delete duplicate sub items  
  117.         sort it_result by matnr.  
  118.         delete adjacent duplicates from it_result.  
  119.         children[] = it_result[].  
  120.       ENDFUNCTION.  
  121.   
  122. *调用BAPI实现  
  123.  FUNCTION zbomexplode.  
  124. *"--------------------------------------------------------- *"  
  125. *"Local Interface: *"  IMPORTING  
  126. *"     VALUE(MATNR) LIKE  MARA-MATNR  
  127. *"     VALUE(WERKS) LIKE  MARC-WERKS OPTIONAL  
  128. *"     VALUE(CAPID) LIKE  TC04-CAPID DEFAULT 'PP01'  
  129. *"  TABLES  
  130. *"      STB STRUCTURE  STPOX  
  131. *"      RETURN STRUCTURE  BAPIRET2  
  132. *"---------------------------------------------------------  
  133.         IF werks IS INITIAL."Added in case external call does not know  
  134.           werks = '1000'.  
  135.         ENDIF.  
  136.         IF capid IS INITIAL.  
  137.           capid = 'PP01'.  
  138.         ENDIF.  
  139.         CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'  
  140.           EXPORTING  
  141.             capid        = capid  
  142.             datuv        = sy-datum  
  143.             mehrs        = 'X'  
  144.             mtnrv        = matnr  
  145.             werks        = werks  
  146.           TABLES  
  147.             stb          = stb  
  148.           EXCEPTIONS  
  149.             no_bom_found = 1.  
  150.         IF sy-subrc <> 0.  
  151.           msg_typ = 'E'.  
  152.           msg_id  = 'Z_EF'.  
  153.           msg_no  = '002'.  
  154.           msg_v1  = matnr.  
  155.           IF NOT msg_typ IS INITIAL.  
  156. * append error to table  RETURN  
  157.             CALL FUNCTION 'BALW_BAPIRETURN_GET2'  
  158.               EXPORTING  
  159.                 type      = msg_typ  
  160.                 cl        = msg_id  
  161.                 number    = msg_no  
  162.                 par1      = msg_v1  
  163.                 par2      = msg_v2  
  164.                 par3      = msg_v3  
  165.                 par4      = msg_v4  
  166.                 parameter = space  
  167.                 row       = space  
  168.                 field     = space  
  169.               IMPORTING  
  170.                 return    = wa_return_tmp.  
  171.             APPEND wa_return_tmp TO return.  
  172.           ENDIF.  
  173.         ENDIF.  
  174.       ENDFUNCTION  
posted @ 2018-04-23 11:01  以成Ronny  阅读(2421)  评论(0)    收藏  举报