• 多阶BOM展开


    Function: CS_BOM_EXPL_MAT_V2
      功能:BOM展开
      参数:
        Import:
          CAPID:application id
         DATUV:有效开始日
         EMENG:数量
         MTNRV:物料
         MEHRS:多阶层bom展开
         WERKS:工厂
         STLAN:bom用途
        Tables:
          STB:展开明细


      说明:一般定义上面几个参数就可以了,鉴于该函数参数太多,就不一一说明了.

    STB內表的componet quality (count), 有mnglg和mngko, 一般取後者,更準確些.
    還要注意 CALL FUNCTION 'UNIT_CONVERSION_SIMPLE' 參數四舍五入不選上.

     原代码:

    *&---------------------------------------------------------------------*
    *& Report  Z_PP_FIND_MULTBOM_MAT
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*


    *-----------------------------------------------------------------------
    * Identification
    *   Modul-Name     : ZPPPR005
    *   Author         : Samuel Liu Atos Origin    Modified by:wiele
    *   Creation date  : 11.09.2006                Modified on: 01.2005
    *   Owner          : PP module
    *   Dev. under SAP : ECC6.0
    *   Description    : MRP物料清单
    *-----------------------------------------------------------------------
    REPORT Z_PP_FIND_MULTBOM_MAT   NO STANDARD PAGE HEADING
                      MESSAGE-ID ymm
                      LINE-COUNT 81
                      LINE-SIZE 650.  "207
    ************************************************************************
    *INCLUDE
    ************************************************************************
    INCLUDE <LINE>.
    ************************************************************************
    *DDIC
    ************************************************************************
    TABLES:MARA,MARC,BKPF,MARD,MAST.
    ************************************************************************
    *ALV层级关系定义
    ************************************************************************
    TYPE-POOLS: SLIS.
    DATA: WT_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV,
          WT_LAYOUT    TYPE SLIS_LAYOUT_ALV,
          WT_EVENTS    TYPE SLIS_T_EVENT.
    DATA: WS_EVENTS LIKE LINE OF WT_EVENTS.
    ************************************************************************
    *DATA
    ************************************************************************
    DATABEGIN OF WT_ITAB OCCURS 10,
          MATNR    LIKE MARA-MATNR, "父件物料编码
          IDNRK    LIKE MARA-MATNR, "子件物料编码
          OJTXP    LIKE MAKT-MAKTX, "子件物料描述
          MEINS    LIKE MARA-MEINS, "子件计量单位
          MNGLG    LIKE STPOX-MNGLG,"子件用量
          LABST    LIKE MARD-LABST, "子件库存量
          LABST_01 LIKE MARD-LABST, "附加工厂一库存量
          LABST_02 LIKE MARD-LABST. "附加工厂二库存量
    DATAEND OF WT_ITAB.



    SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
    PARAMETERS:     P_WERKS LIKE MAST-WERKS OBLIGATORY  DEFAULT 'FZ01'.
    SELECT-OPTIONS: P_MATNR FOR MAST-MATNR. "物料号
    PARAMETERS:     P_STLAN LIKE MAST-STLAN DEFAULT '1',"BOM 用途
                    P_BMENG LIKE STKO-BMENG,"需求数量
                    x_werks LIKE marc-werks OBLIGATORY DEFAULT 'G001',
                    z_werks LIKE marc-werks OBLIGATORY DEFAULT 'G001'.
    SELECTION-SCREEN END OF BLOCK B1.

    SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
    PARAMETERS:   P_SING RADIOBUTTON GROUP RAD1 DEFAULT 'X'.
    PARAMETERS:   P_MULT RADIOBUTTON GROUP RAD1.
    SELECTION-SCREEN END OF BLOCK b2.

    INITIALIZATION.

    START-OF-SELECTION.
    *得到物料的子项目
      PERFORM GET_DATA.
    *打印该BOM的数据
      PERFORM PRINT_ALV_DATA.

    END-OF-SELECTION.
    *&---------------------------------------------------------------------*
    *&      Form  GET_DATA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM GET_DATA .

    *数据定义
      DATABEGIN OF WTL_MATNR OCCURS 0,
              WERKS LIKE MARC-WERKS,
              MATNR LIKE MARA-MATNR.
      DATAEND OF WTL_MATNR.

    *展开BOM的字阶
      DATA: WTL_STB LIKE STPOX OCCURS 10 WITH HEADER LINE.

      SELECT WERKS MATNR
      APPENDING CORRESPONDING FIELDS OF TABLE WTL_MATNR
      FROM MAST
      WHERE MATNR IN P_MATNR
      AND WERKS EQ P_WERKS.



    *根据选项产生不同BOM的结构
    *展多层BOM
      IF P_MULT EQ 'X'.

        LOOP AT WTL_MATNR.


          REFRESH WTL_STB.
          CLEAR WTL_STB.

          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
                EXPORTING
                  CAPID                 = 'PP02'   "BOM Application
                  DATUV                 = SY-DATUM
                  EMENG                 = P_BMENG  "BASE QUANTITY
                  MTNRV                 = WTL_MATNR-MATNR   "MATERAIL NUMBER
                  STLAN                 = P_STLAN
    *              STLAL                 = P_STLAL
    *              CUOBJ                 = CUOBJ
                  MKTLS                 = 'X'
                  MEHRS                 = 'X'
                  WERKS                 = WTL_MATNR-WERKS    "'PDGM'
                TABLES
                  STB                   = WTL_STB
                EXCEPTIONS
                  ALT_NOT_FOUND         = 1
                  CALL_INVALID          = 2
                  MATERIAL_NOT_FOUND    = 3
                  MISSING_AUTHORIZATION = 4
                  NO_BOM_FOUND          = 5
                  NO_PLANT_DATA         = 6
                  NO_SUITABLE_BOM_FOUND = 7
                  OTHERS                = 8.

          IF SY-SUBRC EQ 0.

            LOOP AT WTL_STB.

              WT_ITAB-MATNR = WTL_MATNR-MATNR.
              WT_ITAB-OJTXP = WTL_STB-OJTXP.
              WT_ITAB-IDNRK = WTL_STB-IDNRK.
              WT_ITAB-MEINS = WTL_STB-MEINS.
              WT_ITAB-MNGLG = WTL_STB-MNGLG.
    *         P_ITAB_ITEM-STLAL = -STLAL.
    *         P_ITAB_ITEM-STUFE  = STB-STUFE.
    *查找物料的库存
              PERFORM  GET_KCDATA USING   WT_ITAB-IDNRK
                                  CHANGING WT_ITAB-LABST
                                           WT_ITAB-LABST_01
                                           WT_ITAB-LABST_02.
              APPEND  WT_ITAB.
              CLEAR WT_ITAB.

            ENDLOOP.

          ENDIF.

        ENDLOOP.
      ENDIF.

    *展单层BOM

      IF P_SING EQ 'X'.
        LOOP AT WTL_MATNR.

          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
                EXPORTING
                  CAPID                 = 'PP02'   "BOM Application
                  DATUV                 = SY-DATUM
                  EMENG                 = P_BMENG  "BASE QUANTITY
                  MTNRV                 = WTL_MATNR-MATNR   "MATERAIL NUMBER
                  STLAN                 = P_STLAN
    *              STLAL                  = P_STLAL
    *           CUOBJ                 = CUOBJ
    *            MKTLS                 = 'X'
    *            MEHRS                 = 'X'
                  WERKS                 = WTL_MATNR-WERKS    "'PDGM'
                TABLES
                  STB                   = WTL_STB
                EXCEPTIONS
                  ALT_NOT_FOUND         = 1
                  CALL_INVALID          = 2
                  MATERIAL_NOT_FOUND    = 3
                  MISSING_AUTHORIZATION = 4
                  NO_BOM_FOUND          = 5
                  NO_PLANT_DATA         = 6
                  NO_SUITABLE_BOM_FOUND = 7
                  OTHERS                = 8.

          IF SY-SUBRC EQ 0.
            LOOP AT WTL_STB.

              WT_ITAB-MATNR = WTL_MATNR-MATNR.
              WT_ITAB-OJTXP = WTL_STB-OJTXP.
              WT_ITAB-IDNRK = WTL_STB-IDNRK.
              WT_ITAB-MEINS = WTL_STB-MEINS.
              WT_ITAB-MNGLG = WTL_STB-MNGLG.
    *          P_ITAB_ITEM-STLAL = -STLAL.
    *          P_ITAB_ITEM-STUFE  = STB-STUFE.

              PERFORM  GET_KCDATA USING   WT_ITAB-IDNRK
                                  CHANGING WT_ITAB-LABST
                                           WT_ITAB-LABST_01
                                           WT_ITAB-LABST_02.

              APPEND  WT_ITAB.
              CLEAR WT_ITAB.

            ENDLOOP.
          ENDIF.

        ENDLOOP.
      ENDIF.
    ENDFORM.                    " GET_DATA
    *&---------------------------------------------------------------------*
    *&      Form  PRINT_ALV_DATA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM PRINT_ALV_DATA .

      DATA:  WLT_FIELDCAT LIKE LINE OF WT_FIELDCAT.

    *  PERFORM FILL_EVENTCAT_ALV.

      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'MATNR'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '父件物料编码'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.


      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'IDNRK'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '子件物料编码'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.

      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'OJTXP'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '子件物料描述'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.

      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'MEINS'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '单位'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.

      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'MNGLG'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '子件用量'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.


      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = ' LABST'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '子件库存量'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.

      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'LABST_01'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '附加工厂一库存量'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.

      CLEAR WLT_FIELDCAT.
      WLT_FIELDCAT-FIELDNAME    = 'LABST_02'.
      WLT_FIELDCAT-TABNAME      = 'WT_ITAB'.
      WLT_FIELDCAT-NO_OUT       = ' '.
      WLT_FIELDCAT-SELTEXT_L    = '附加工厂二库存量'.
      APPEND WLT_FIELDCAT TO WT_FIELDCAT.

      WT_LAYOUT-ZEBRA = 'X'.
      WT_LAYOUT-F2CODE = '&ETA'.
      WT_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
          EXPORTING
            I_CALLBACK_PROGRAM          = SY-CPROG
            IS_LAYOUT                   = WT_LAYOUT
            I_CALLBACK_HTML_TOP_OF_PAGE = 'ALV_TOP_OF_PAGE'
    *      I_callback_pf_status_set    = 'STANDARD1'
            I_DEFAULT                   = 'X'
            I_SAVE                      = 'X'
    *      I_CALLBACK_USER_COMMAND     = 'PROCESS_USER_COMMAND'
            IT_FIELDCAT                 = WT_FIELDCAT[]
            IT_EVENTS                   = WT_EVENTS
          TABLES
            T_OUTTAB                    = WT_ITAB.

    ENDFORM.                    " PRINT_ALV_DATA

    *---------------------------------------------------------------------*
    *       FORM ALV_TOP_OF_PAGE                                          *
    *---------------------------------------------------------------------*
    *       ........                                                      *
    *---------------------------------------------------------------------*
    *  -->  R_DYDO                                                        *
    *  -->  TO                                                            *
    *  -->  CL_DD_DOCUMENT                                                *
    *---------------------------------------------------------------------*
    FORM ALV_TOP_OF_PAGE USING CL_DD TYPE REF TO CL_DD_DOCUMENT.
    *  SET PF-STATUS 'STANDARD1'.

      DATA: M_P TYPE I.
      DATA: M_BUFF TYPE STRING.


    *表头其实完全可以是一个html文件,自己使用html语言进行格式控制
      M_BUFF = '<html>'.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.


    *  CONCATENATE '<body bgcolor="#008000">'   INTO M_BUFF.
    *
    **    M_BUFF = '<body background="BACKGROUND.GIF">'.
    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.


      M_BUFF = '<center><font size="5">库存配套分析表</font></center>'.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.

    **  CONCATENATE '客户名称:' KNA1-NAME1 KNA1-NAME2 '<BR>' INTO M_BUFF.
    *
    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.
    *


    **  CONCATENATE 'SAP报价单号:' WT_VBAP_01-VBELN '<BR>' INTO M_BUFF.
    *
    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.


    *  CONCATENATE '字段说明:1)交货已完成:X代表已经全部服务确认'  '<BR>'
    *INTO M_BUFF.

    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.
    **文字移动
    *  CONCATENATE '<marquee
    *behavior=alternate>啦啦啦,我来回走耶!</marquee>  '  '<BR>' INTO
    *M_BUFF.
    *
    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.




    *  CONCATENATE '选择参数:为1 删除交货已完成 为2 删除相等无误的 为3
    *删除完成以及无误的'  '<BR>' INTO M_BUFF.
    *
    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.

    *  SELECT SINGLE * FROM T001
    *         WHERE BUKRS = WS_VBELN
    *         AND SPRAS = '1'.
    *

      CONCATENATE '报表日期 :' SY-DATUM '<BR>' INTO M_BUFF.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.

    DATA: WTL_NAME1 LIKE T001W-NAME1.
    CLEAR WTL_NAME1.
    SELECT SINGLE NAME1
    INTO WTL_NAME1
    FROM T001W
    WHERE WERKS EQ P_WERKS.

    CONCATENATE '工     厂:' P_WERKS WTL_NAME1 '<BR>' INTO M_BUFF.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.

    DATA: WTL_NAME2 LIKE T001W-NAME1.
    CLEAR WTL_NAME2.
    SELECT SINGLE NAME1
    INTO WTL_NAME2
    FROM T001W
    WHERE WERKS EQ X_WERKS.

    CONCATENATE '附加工厂1:' X_WERKS WTL_NAME2 '<BR>' INTO M_BUFF.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.

    DATA: WTL_NAME3 LIKE T001W-NAME1.
    CLEAR WTL_NAME3.
    SELECT SINGLE NAME1
    INTO WTL_NAME3
    FROM T001W
    WHERE WERKS EQ Z_WERKS.

    CONCATENATE '附加工厂2:'  Z_WERKS WTL_NAME3 '<BR>' INTO M_BUFF.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.


    *  M_BUFF = '</body>'.
    *  CALL METHOD CL_DD->HTML_INSERT
    *    EXPORTING
    *      CONTENTS = M_BUFF
    *    CHANGING
    *      POSITION = M_P.
    *

      M_BUFF = '</html>'.
      CALL METHOD CL_DD->HTML_INSERT
        EXPORTING
          CONTENTS = M_BUFF
        CHANGING
          POSITION = M_P.
    ENDFORM.                    "ALV_TOP_OF_PAGE

    *&---------------------------------------------------------------------*
    *&      Form  GET_KCDATA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_WT_ITAB_IDNRK  text
    *      <--P_WT_ITAB_LABST  text
    *      <--P_WT_ITAB_LABST_01  text
    *      <--P_WT_ITAB_LABST_02  text
    *----------------------------------------------------------------------*
    FORM GET_KCDATA  USING    P_WT_ITAB_IDNRK
                     CHANGING P_WT_ITAB_LABST
                              P_WT_ITAB_LABST_01
                              P_WT_ITAB_LABST_02.
     DATA: WTL_RESULT TYPE C.
     CLEAR WTL_RESULT.

    DATABEGIN OF WTL_ITAB_101 OCCURS 0,
            MANDT LIKE MARD-MANDT,
            MATNR LIKE MARD-MATNR,
            WERKS LIKE MARD-WERKS,
            LGORT LIKE MARD-LGORT,
            LABST LIKE MARD-LABST,
            INSME LIKE MARD-INSME,
            DISKZ LIKE MARD-DISKZ,
            KLABS LIKE MARD-KLABS.
    DATAEND OF WTL_ITAB_101.


      SELECT  MANDT   MATNR  WERKS LGORT  INSME    LABST  DISKZ  klabs
        FROM    MARD
        INTO CORRESPONDING FIELDS OF TABLE WTL_ITAB_101
        WHERE WERKS EQ p_werks
             AND  MATNR = P_WT_ITAB_IDNRK
             AND  DISKZ  <> '1'
             ORDER BY MATNR .

        P_WT_ITAB_LABST = 0.
    *    KSTOR = 0.

        IF  WTL_ITAB_101[] IS INITIAL.
          P_WT_ITAB_LABST = 0.
    *      KSTOR = 0.
        ENDIF.

        LOOP  AT  WTL_ITAB_101 .
          P_WT_ITAB_LABST = P_WT_ITAB_LABST + WTL_ITAB_101-LABST +
    WTL_ITAB_101-klabs.
    *      KSTOR = KSTOR + ITAB_101-LABST + ITAB_101-klabs.
        ENDLOOP.

    *检查物料的工厂是否存在
      PERFORM CHECK_MAT USING P_WT_ITAB_IDNRK
                              X_WERKS
                        CHANGING WTL_RESULT.

    *检查参考工厂1的库存

      IF WTL_RESULT NE 'X'.
        SELECT  MANDT   MATNR  WERKS LGORT  INSME    LABST  DISKZ  klabs
        FROM    MARD
        INTO CORRESPONDING FIELDS OF TABLE WTL_ITAB_101
        WHERE WERKS EQ X_werks
             AND  MATNR = P_WT_ITAB_IDNRK
             AND  DISKZ  <> '1'
             ORDER BY MATNR .


        IF  WTL_ITAB_101[] IS INITIAL.
         P_WT_ITAB_LABST_01 = 0.
    *      KSTOR = 0.
        ENDIF.

        LOOP  AT  WTL_ITAB_101.
          P_WT_ITAB_LABST_01 = P_WT_ITAB_LABST_01 +  WTL_ITAB_101-LABST +
    WTL_ITAB_101-klabs.
    *      KSTOR = KSTOR + ITAB_101-LABST + ITAB_101-klabs.
        ENDLOOP.
      ENDIF.

    *检查参考工厂2
      PERFORM CHECK_MAT USING P_WT_ITAB_IDNRK
                              Z_WERKS
                        CHANGING WTL_RESULT.
    *从参考工厂2中取数据

      IF WTL_RESULT NE 'X'.

      SELECT  MANDT   MATNR  WERKS LGORT  INSME    LABST  DISKZ  klabs
      FROM    MARD
      INTO CORRESPONDING FIELDS OF TABLE WTL_ITAB_101
      WHERE WERKS EQ Z_werks
           AND  MATNR = P_WT_ITAB_IDNRK
           AND  DISKZ  <> '1'
           ORDER BY MATNR .


      IF  WTL_ITAB_101[] IS INITIAL.
         P_WT_ITAB_LABST_02 = 0.
    *    KSTOR = 0.
      ENDIF.

      LOOP  AT  WTL_ITAB_101.
        P_WT_ITAB_LABST_02 = P_WT_ITAB_LABST_02 +  WTL_ITAB_101-LABST +
    WTL_ITAB_101-klabs.
    *    KSTOR = KSTOR + ITAB_101-LABST + ITAB_101-klabs.
      ENDLOOP.
      ENDIF.



    ENDFORM.                    " GET_KCDATA

    *&---------------------------------------------------------------------*
    *&      Form  CHECK_MAT
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_CH_ITEM  text
    *      -->P_X_WERKS  text
    *      <--P_WTL_RESULT  text
    *----------------------------------------------------------------------*
    FORM CHECK_MAT  USING    P_CH_ITEM
                             P_X_WERKS
                    CHANGING P_WTL_RESULT.

      IF P_X_WERKS NE P_WERKS.

        SELECT SINGLE *
        FROM MARC
        WHERE MATNR EQ P_CH_ITEM
        AND WERKS EQ P_X_WERKS.

        IF SY-SUBRC NE SPACE.
          P_WTL_RESULT = 'X'.
        ENDIF.

      ELSE.

        P_WTL_RESULT = 'X'.

      ENDIF.

    ENDFORM.                    " CHECK_MAT

    ----------------------------------------------------------

    关键代码如下: 

    *& Report  YYTEST

    REPORT  yytest NO STANDARD PAGE HEADING
                   LINE-SIZE 400 LINE-COUNT 400.
    SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
    PARAMETERS    p_werks LIKE mast-werks OBLIGATORY  DEFAULT '3000'.
    SELECT-OPTIONS: p_matnr FOR mast-matnr. "物料号
    PARAMETERS    p_stlan LIKE mast-stlan DEFAULT '1',"BOM 用途
                    p_bmeng LIKE stko-bmeng,"需求数量
                    x_werks LIKE marc-werks OBLIGATORY DEFAULT '3000',
                    z_werks LIKE marc-werks OBLIGATORY DEFAULT '3000'.
    SELECTION-SCREEN END OF BLOCK b1.
    SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
    PARAMETERS  p_sing RADIOBUTTON GROUP rad1 DEFAULT 'X'.
    PARAMETERS  p_mult RADIOBUTTON GROUP rad1.
    SELECTION-SCREEN END OF BLOCK b2.

    INITIALIZATION.

    START-OF-SELECTION.
    *得到物料的子项目
      PERFORM get_data.
    *打印该BOM的数据
      PERFORM print_alv_data.

    END-OF-SELECTION.
    *&---------------------------------------------------------------------*
    *&      Form  GET_DATA
    *----------------------------------------------------------------------*
    FORM get_data .
    *数据定义
      DATABEGIN OF wtl_matnr OCCURS 0,
              werks LIKE marc-werks,
              matnr LIKE mara-matnr.
      DATAEND OF wtl_matnr.
    *展开BOM的字阶
      DATAwtl_stb LIKE stpox OCCURS 10 WITH HEADER LINE.
      SELECT werks matnr
      APPENDING CORRESPONDING FIELDS OF TABLE wtl_matnr
      FROM mast
      WHERE matnr IN p_matnr
      AND werks EQ p_werks.
    *根据选项产生不同BOM的结构
    *展多层BOM
      IF p_mult EQ 'X'.
        LOOP AT wtl_matnr.
          REFRESH wtl_stb.
          CLEAR wtl_stb.
          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
            EXPORTING
              capid                 'PP02'   "BOM Application
              datuv                 sy-datum
              emeng                 p_bmeng  "BASE QUANTITY
              mtnrv                 wtl_matnr-matnr   "MATERAIL NUMBER
              stlan                 p_stlan
              mktls                 'X'
              mehrs                 'X'
              werks                 wtl_matnr-werks    "'PDGM'
            TABLES
              stb                   wtl_stb
            EXCEPTIONS
              alt_not_found         1
              call_invalid          2
              material_not_found    3
              missing_authorization 4
              no_bom_found          5
              no_plant_data         6
              no_suitable_bom_found 7
              OTHERS                8.
          IF sy-subrc EQ 0.
            LOOP AT wtl_stb.
              wt_itab-matnr wtl_matnr-matnr.
              wt_itab-ojtxp wtl_stb-ojtxp.
              wt_itab-idnrk wtl_stb-idnrk.
              wt_itab-meins wtl_stb-meins.
              wt_itab-mnglg wtl_stb-mnglg.
    *查找物料的库存
              PERFORM  get_kcdata USING   wt_itab-idnrk
                                  CHANGING wt_itab-labst
                                           wt_itab-labst_01
                                           wt_itab-labst_02.
              APPEND  wt_itab.
              CLEAR wt_itab.
            ENDLOOP.
          ENDIF.
        ENDLOOP.
      ENDIF.
    *展单层BOM
      IF p_sing EQ 'X'.
        LOOP AT wtl_matnr.
          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
            EXPORTING
              capid                 'PP02'   "BOM Application
              datuv                 sy-datum
              emeng                 p_bmeng  "BASE QUANTITY
              mtnrv                 wtl_matnr-matnr   "MATERAIL NUMBER
              stlan                 p_stlan
              werks                 wtl_matnr-werks    "'PDGM'
            TABLES
              stb                   wtl_stb
            EXCEPTIONS
              alt_not_found         1
              call_invalid          2
              material_not_found    3
              missing_authorization 4
              no_bom_found          5
              no_plant_data         6
              no_suitable_bom_found 7
              OTHERS                8.
          IF sy-subrc EQ 0.
            LOOP AT wtl_stb.
              wt_itab-matnr wtl_matnr-matnr.
              wt_itab-ojtxp wtl_stb-ojtxp.
              wt_itab-idnrk wtl_stb-idnrk.
              wt_itab-meins wtl_stb-meins.
              wt_itab-mnglg wtl_stb-mnglg.
              PERFORM  get_kcdata USING   wt_itab-idnrk
                                  CHANGING wt_itab-labst
                                           wt_itab-labst_01
                                           wt_itab-labst_02.
              APPEND  wt_itab.
              CLEAR wt_itab.
            ENDLOOP.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDFORM                   GET_DATA
    *&---------------------------------------------------------------------*
    *&      Form  PRINT_ALV_DATA
    *----------------------------------------------------------------------*
    FORM print_alv_data .
      DATA wlt_fieldcat LIKE LINE OF wt_fieldcat.
      CLEAR wlt_fieldcat.
      wlt_fieldcat-fieldname    'MATNR'.
      wlt_fieldcat-tabname      'WT_ITAB'.
      wlt_fieldcat-no_out       '.
      wlt_fieldcat-seltext_l    '父件物料编码'.
      APPEND wlt_fieldcat TO wt_fieldcat.
      wt_layout-zebra 'X'.
      wt_layout-f2code '&ETA'.
      wt_layout-colwidth_optimize 'X'.
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          i_callback_program          sy-cprog             "決定抬頭是否顯示
          is_layout                   wt_layout
          i_callback_html_top_of_page 'ALV_TOP_OF_PAGE'   "調用抬頭subroutine
          i_default                   'X'
          i_save                      'X'
          it_fieldcat                 wt_fieldcat[]
          it_events                   wt_events
        TABLES
          t_outtab                    wt_itab.
    ENDFORM                   "print_alv_data
    *---------------------------------------------------------------------*
          FORM ALV_TOP_OF_PAGE                                          *
    *---------------------------------------------------------------------*
    FORM alv_top_of_page USING cl_dd TYPE REF TO cl_dd_document.
      DATAm_p TYPE i.
      DATAm_buff TYPE string.
    *表头其实完全可以是一个html文件,自己使用html语言进行格式控制
      m_buff ''.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
      m_buff ''.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
      CONCATENATE '报表日期 :' sy-datum '' INTO m_buff.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
      DATAwtl_name1 LIKE t001w-name1.
      CLEAR wtl_name1.
      SELECT SINGLE name1
      INTO wtl_name1
      FROM t001w
      WHERE werks EQ p_werks.
      CONCATENATE '工     厂:' p_werks wtl_name1 '' INTO m_buff.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
      DATAwtl_name2 LIKE t001w-name1.
      CLEAR wtl_name2.
      SELECT SINGLE name1
      INTO wtl_name2
      FROM t001w
      WHERE werks EQ x_werks.
      CONCATENATE '附加工厂1:' x_werks wtl_name2 '' INTO m_buff.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
      DATAwtl_name3 LIKE t001w-name1.
      CLEAR wtl_name3.
      SELECT SINGLE name1
      INTO wtl_name3
      FROM t001w
      WHERE werks EQ z_werks.
      CONCATENATE '附加工厂2:'  z_werks wtl_name3 '' INTO m_buff.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
      m_buff ''.
      CALL METHOD cl_dd->html_insert
        EXPORTING
          contents m_buff
        CHANGING
          position m_p.
    ENDFORM                   "ALV_TOP_OF_PAGE

  • 相关阅读:
    SpringCloud微服务Zuul跨域问题
    com.netflix.zuul.exception.ZuulException: Hystrix Readed time out
    Java实现遍历N级树形目录结构
    ubuntu安装Nginx
    redis报错:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)
    Java设置接口跨域
    SpringBoot使用qq邮箱发送邮件
    linux使用Nginx搭建静态资源服务器
    Spring Boot 正常启动后访问Controller提示404
    分享2019年陆陆续续读过的书-附书单
  • 原文地址:https://www.cnblogs.com/elegantok/p/1331446.html
Copyright © 2020-2023  润新知