REPORT ZPPBMR001 LINE-SIZE 180
                 LINE-COUNT 65
                 NO STANDARD PAGE HEADING
                 MESSAGE-ID MG.
*----------------------------------------------------------------------*
* Program     :  ZPPBMR001                                             *
* Author      :  Patrick,Song                                          *
* Date        :  Aug 20, 2008                                          *
* Code type   :  conversion                                            *
* Version     :  new creation                                          *
* (interface/conversion/on-line transaction/report)                    *
*                                                                      *
*----------------------------------------------------------------------*
* Error handling :                                                     *
*----------------------------------------------------------------------*
* 1.                                                                   *
*                                                                      *
*----------------------------------------------------------------------*
* Change log :                                                         *
*----------------------------------------------------------------------*
* CR#       :                                                          *
* Corr. no. :                                                          *
* Date      :                                                          *
* Author    :                                                          *
* Change    :                                                          *
*                                                                      *
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* Table declaration
*&---------------------------------------------------------------------*
TABLES: AUSP,             " Characteristic Values
        ADRC,             " Addresses (Business Address Services)
        CABN,             " Characteristic
        CSCMAT,           " BOM Explosion: Materials
        EINA,             " Purchasing Info Record: General Data
        EINE,             " Purchasing Info Rec:Purchasing Org.Data
        EORD,             " Purchasing Source List
        KNA1,             " Customer Master
        KNMT,             " Customer Material Table
        MAKT,             " Material Description
        MARA,             " General Material Data
        MARC,             " Plant Data for Material
        MARM,             " Units of Measure for Material
        MAST,             " Material to BOM Link
        QINF,             " QM-info record for material and vendor
        STKO,             " BOM Header
        STPO,             " BOM item
        STXH,             " STXD SAPscript text file header
        STZU,             " Permanent BOM data
        T134,             " Material Types
        T001W.            " Plants/Branches

*&---------------------------------------------------------------------*
* Subrouting declaration
*&---------------------------------------------------------------------*
INCLUDE   : <ICON>.
TYPE-POOLS: SLIS.
INCLUDE   : ABAPRETN.
INCLUDE   : ZBCDWI000.

*&---------------------------------------------------------------------*
* Declaration Constant Data
*&---------------------------------------------------------------------*
CONSTANTS : ST_FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME
                                   VALUE 'TOP_OF_PAGE-ALV'.


*&---------------------------------------------------------------------*
* selection screen define
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK A1 WITH FRAME TITLE TEXT-SC1 .
PARAMETERS: P_MATNR  LIKE MAST-MATNR  MEMORY ID MAT   OBLIGATORY.
PARAMETERS: P_WERKS  LIKE T001W-WERKS DEFAULT '2001'  OBLIGATORY .
PARAMETERS: P_STLAN  LIKE MAST-STLAN  DEFAULT '1'     OBLIGATORY .
PARAMETERS: P_CAPID  LIKE RC29L-CAPID DEFAULT 'PP01'  OBLIGATORY .
PARAMETERS: P_STLAL  LIKE RC29L-STLAL DEFAULT '1'     OBLIGATORY .
PARAMETERS: P_EMENG  LIKE RC29N-EMENG DEFAULT '10000' OBLIGATORY .
PARAMETERS: P_DATUM  LIKE RC29N-DATUV DEFAULT SY-DATUM .
SELECTION-SCREEN SKIP .
PARAMETERS: P_INFO   AS CHECKBOX DEFAULT SPACE .
PARAMETERS: P_OUTST  AS CHECKBOX DEFAULT SPACE.

SELECTION-SCREEN END OF BLOCK A1 .
PARAMETERS: P_FILE   LIKE RLGRAP-FILENAME DEFAULT 'd:\bom_dl\'.
PARAMETERS: P_SINGLE AS CHECKBOX DEFAULT SPACE.


*&---------------------------------------------------------------------*
* globe parameters declaration
*&---------------------------------------------------------------------*
* define interal table to store BOM details
DATABEGIN OF ITAB OCCURS 0 .
DATA: POSNR LIKE STPO-POSNR .  "Item No
DATA: IDNRK LIKE STPOX-IDNRK.  "Component No
DATA: STUFE(002) .             "Level
DATA: MTART LIKE MARA-MTART .
DATA: MAKTX TYPE STRING     .  "Component Description
DATA: MEINS LIKE STPOX-MEINS.  "BUnit
DATA: MENGE(010) .             "Component Quantity
DATA: MNGLG(010).
DATA: FMENG LIKE STPO-FMENG.   "Fixed Quantity
DATA: AUSCH(005).              "Scrap Rate
DATA: ALPGR LIKE STPOX-ALPGR.  "Alternative item: group
DATA: ALPRF LIKE STPOX-ALPRF.  "Alternative item: ranking order
DATA: POTXT(080).              "Item Text
DATA: POTX1(100).              "Item Text (Line 1)
DATA: POTX2(100).              "Item Text (Line 2)
DATA: GREENPRD(003).           "Green Material Indicator
DATA: SECURITY(003).           "Security Material Indicator
DATA: LIFNR LIKE LFA1-LIFNR .
DATA: STLNR(008) .             "BOM Number
DATA: SELK(001).
DATA: LGORT LIKE STPOX-LGORT.
DATA: INFOCHK(003).            "Pur.Info Record Check
DATA: INFNR  LIKE EINE-INFNR .
DATA: EKORG  LIKE EINE-EKORG .
DATA: WERKS  LIKE EINE-WERKS .
DATA: LIFNR1 LIKE LFA1-LIFNR .
DATA: STR_CHAR TYPE STRING .
DATACHECK(003).
DATAEND   OF ITAB .

*>define internal table to store these download data
DATABEGIN OF DL_TAB OCCURS 0 .
DATA: MATNR(018)."  LIKE MARA-MATNR .
DATA: XTEXT(040)."  LIKE MAKT-MAKTX .
DATA: EMENG(018)."  LIKE RC29N-EMENG .
DATA: WERKS(004)."  LIKE MARC-WERKS .
DATA: STLAN(001)."  LIKE MAST-STLAN .
DATA: HTEXT(255).
DATA: IDNRK(018)."  LIKE STPOX-IDNRK.  "Component No
DATA: MAKTX(040)."  TYPE STRING     .  "Component Description
DATA: MENGE(013)."  Component Quantity
DATA: AUSCH(005)."  Scrap Rate
DATA: LGORT(004)."  LIKE STPOX-LGORT.
DATA: ALPGR(002)."  LIKE STPOX-ALPGR.  "Alternative item: group
DATA: ALPRF(002)."  LIKE STPOX-ALPRF.  "Alternative item: ranking order
DATA: POTX1(040)." LIKE STPOX-POTX1 . "Item Text (Line 1)
DATA: POTX2(040)." LIKE STPOX-POTX1 . "Item Text (Line 2)
DATA: FMENG(005)."  LIKE STPO-FMENG.   "Fixed Quantity
DATA: MEINS(005)."  LIKE STPOX-MEINS . "BUnit
DATA: STKTX(040)."  LIKE BICSP-STKTX.  "29# Alternative BOM text
DATA: GEWEI(003)."  Weight Unit
DATA: NTGEW(017)."  New Weight
DATA: BRGEW(017)."  Gross Weight
DATA: BOX01(006)."  Quantity per Carton
DATA: BOX02(006)."  Quantity per PAL
DATA: POTXT(080)."  Item Text
DATAEND   OF DL_TAB .

*>define internal table to store these HALB Materials
DATABEGIN OF I_HALB OCCURS 0 .
DATA: IDNRK LIKE STPOX-IDNRK .
DATA: WERKS LIKE STPOX-WERKS .
DATA: STLAN LIKE STPOX-STLAN .
DATA: MAKTX LIKE MAKT-MAKTX  .
DATAEND   OF I_HALB .

*> BOM Header Data
DATA: BMHDS LIKE ZPP_BMHD OCCURS 0 WITH HEADER LINE.
DATA: BMITS LIKE ZPP_BMIT OCCURS 0 WITH HEADER LINE .

*> bom explosion data store
DATA: I_BOM    LIKE STPOX  OCCURS 0 WITH HEADER LINE.
DATA: I_MATCAT LIKE CSCMAT OCCURS 0 WITH HEADER LINE.

DATA: L_ADRNR  LIKE KNA1-ADRNR .

* define data for text reading
DATA: STR_TDNAME LIKE STXH-TDNAME .
DATA: STR_TDID   LIKE STXH-TDID .
DATA: STR_OBJECT LIKE THEAD-TDOBJECT .
DATA: STR_LINES  LIKE TLINE OCCURS 0 WITH HEADER LINE .

DATA: S_REPID LIKE SY-REPID,
      ST_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER."page header
DATA: ST_FIELDCAT    TYPE SLIS_T_FIELDCAT_ALV,   "table col name
      ST_LAYOUT      TYPE SLIS_LAYOUT_ALV,       "layoutsetting
      ST_SP_GROUP    TYPE SLIS_T_SP_GROUP_ALV,
      ST_EVENTS      TYPE SLIS_T_EVENT,          "event header
*     s_default(001) type c,
*     s_exit(001)    type c,
*     st_variant     like disvariant,
      CODE           LIKE DISVARIANT-HANDLE,
      S_VARIANT      LIKE DISVARIANT,
      S_STATUS       TYPE SLIS_FORMNAME VALUE 'STANDARD_ST01',
      S_USER_COMMAND TYPE SLIS_FORMNAME VALUE 'USER_COMMAND-ALV'.
DATABEGIN OF EXTAB OCCURS 0,
      FCODE LIKE RSMPE-FUNC.
DATAEND OF EXTAB.

DATA: TAB TYPE SLIS_T_EXTAB.

DATA: L_ATINN LIKE CABN-ATINN .

*>User For Smartforms
DATA:  FM_NAME      TYPE  RS38L_FNAM,
       WA_SSFCOMPOP TYPE  SSFCOMPOP,
       WA_SSFCTRLOP TYPE  SSFCTRLOP.
DATA: C_STLAL LIKE MAST-STLAL.

DATA: GET_BAPI1003    LIKE BAPI1003_ALLOC_VALUES_NUM  OCCURS 0 WITH HEADER LINE,
      GET_VALUES_CHAR LIKE BAPI1003_ALLOC_VALUES_CHAR OCCURS 0 WITH HEADER LINE,
      GET_VALUES_CURR LIKE BAPI1003_ALLOC_VALUES_CURR OCCURS 0 WITH HEADER LINE,
      GET_VALUES_LIST LIKE BAPI1003_ALLOC_LIST        OCCURS 0 WITH HEADER LINE,
      GET_BAPIRET2    LIKE BAPIRET2                   OCCURS 0 WITH HEADER LINE,
      LS_BAPIRET2     TYPE BAPIRET2.

DATABEGIN OF GET_VALUES OCCURS 0.
        INCLUDE STRUCTURE GET_VALUES_CHAR.
DATA: INT TYPE I.
DATAEND OF GET_VALUES .

DATA: STR_A001 TYPE STRING.
DATA: STR_A002 TYPE STRING.

DATA: L_OBJECT(050) .
*----------------------------------------------------------------------*
* Global program variables                                             *
*----------------------------------------------------------------------*

*** for user downloading operation
DATA: L_FILE  LIKE RLGRAP-FILENAME.   " filename for data downloading

DATABEGIN OF FIELDNAMES OCCURS 0,
      NAME(030),
      END OF FIELDNAMES.

*&---------------------------------------------------------------------*
* initialization.
*&---------------------------------------------------------------------*
INITIALIZATION.
  REFRESH: ITAB, I_BOM, I_MATCAT .
  CLEAR  : ITAB, I_BOM, I_MATCAT .

  S_REPID = SY-REPID.
* assign the subroutine to the ALV tool
  PERFORM EVENTTAB_BUILD USING ST_EVENTS[].

  PERFORM VARIANT_INIT.

*&---------------------------------------------------------------------*
* at selection-screen
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN .
  IF NOT P_OUTST IS INITIAL .
    P_INFO = 'X' .
  ENDIF.
  PERFORM MATERIAL_CHECK USING P_MATNR P_WERKS P_STLAN.


*&---------------------------------------------------------------------*
* start-of-selection.
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  CLEAR: C_STLAL.
  C_STLAL = P_STLAL.
  PERFORM FORMAT_ALPHA_OUTPUT CHANGING C_STLAL.

  PERFORM GET_HEADER_DATA .

  CLEAR: L_ATINN .
  SELECT SINGLE ATINN INTO L_ATINN FROM CABN CLIENT SPECIFIED
                     WHERE MANDT EQ SY-MANDT
                       AND ATNAM EQ 'A002' .

* perform get_start_time .

  PERFORM BOM_EXPLOSION USING P_MATNR P_WERKS P_STLAN P_CAPID P_EMENG .
  PERFORM COMMENT_BUILD.           "page header
  PERFORM FIELDCAT_INIT.           "table col name
  PERFORM ALV_LAYOUT_BUILD.        "layout setting
  PERFORM REUSE_ALV_LIST_DISPLAY.  "display



*&---------------------------------------------------------------------*
* end-of-selection.
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*&---------------------------------------------------------------------*
* at user-command .
*&---------------------------------------------------------------------*
AT USER-COMMAND .
*&---------------------------------------------------------------------*
*&      Form  MATERIAL_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_MATNR  text
*----------------------------------------------------------------------*
FORM MATERIAL_CHECK  USING  MATNR WERKS STLAN.

  DATA: STR_ERROR TYPE STRING .

* material check
  CLEAR: MARA, MAST .
  CLEAR: STR_ERROR .
  SELECT SINGLE * FROM MARA CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                                               AND MATNR = MATNR .
  IF SY-SUBRC <> 0 .
    CONCATENATE TEXT-E01 MATNR TEXT-E02 INTO STR_ERROR SEPARATED BY SPACE .
  ENDIF .

  IF NOT STR_ERROR IS INITIAL .
    MESSAGE STR_ERROR TYPE 'E' .
  ENDIF .

* plant code check
  CLEAR: STR_ERROR .
  SELECT SINGLE * FROM T001W CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                                               AND WERKS = WERKS .
  IF SY-SUBRC <> 0 .
    CONCATENATE TEXT-E03 WERKS TEXT-E02 INTO STR_ERROR SEPARATED BY SPACE .
  ENDIF .

  IF NOT STR_ERROR IS INITIAL .
    MESSAGE STR_ERROR TYPE 'E' .
  ENDIF .

* plant data check
  CLEAR: STR_ERROR .
  SELECT SINGLE * FROM MARC CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                                              AND MATNR = MATNR
                                              AND WERKS = WERKS .
  IF SY-SUBRC <> 0 .
    CONCATENATE TEXT-E04 MATNR WERKS TEXT-E02 INTO STR_ERROR SEPARATED BY SPACE .
  ENDIF .

  IF NOT STR_ERROR IS INITIAL .
    MESSAGE STR_ERROR TYPE 'E' .
  ENDIF .

* Material BOM check
  CLEAR: STR_ERROR .
  SELECT SINGLE * FROM MAST CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                                             AND MATNR = MATNR
                                             AND WERKS = WERKS
                                             AND STLAN = STLAN.
  IF SY-SUBRC <> 0 .
    CONCATENATE TEXT-M14 MATNR WERKS STLAN TEXT-E02
           INTO STR_ERROR SEPARATED BY SPACE .
  ENDIF .

  IF NOT STR_ERROR IS INITIAL .
    MESSAGE STR_ERROR TYPE 'E' .
  ENDIF .

ENDFORM.                    " MATERIAL_CHECK
*&---------------------------------------------------------------------*
*&      Form  BOM_EXPLOSION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BOM_EXPLOSION USING MATNR WERKS STLAN CAPID EMENG .

  DATA   : L_INFO(001TYPE C .
  DATA   : L_CNT TYPE I.
  REFRESH: ITAB, I_BOM, I_MATCAT .
  CLEAR  : ITAB, I_BOM, I_MATCAT .

  CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
      CAPID                 = CAPID
      DATUV                 = P_DATUM "SY-DATUM
      EHNDL                 = '1'
      EMENG                 = EMENG    " Base Qty
      MEHRS                 = 'X'
      MMORY                 = '1'
      MTNRV                 = MATNR    " Parent Material
      WERKS                 = WERKS    " Plant
*      stpst                 = 1        " Level = 1
      STLAN                 = STLAN
      STLAL                 = C_STLAL
    TABLES
      STB                   = I_BOM
      MATCAT                = I_MATCAT
    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
      CONVERSION_ERROR      = 8
      OTHERS                = 9.
  IF P_SINGLE IS INITIAL.
    LOOP AT I_BOM .
      MOVE-CORRESPONDING I_BOM TO ITAB .
      CLEAR: ITAB-POTX1.
      CONCATENATE I_BOM-POTX1 I_BOM-POTX2 INTO ITAB-POTX1 SEPARATED BY SPACE.
      SELECT SINGLE MAKTX INTO ITAB-MAKTX FROM MAKT CLIENT SPECIFIED
*      where mandt = sy-mandt and matnr = itab-idnrk and spras = 'E' .
        WHERE MANDT = SY-MANDT AND MATNR = ITAB-IDNRK .
      CLEAR: EORD.
      IF ITAB-MTART NE 'HALB'.
        CLEAR: ITAB-SECURITY .
        CLEAR: EORD .
        SELECT SINGLE * FROM EORD CLIENT SPECIFIED
                         WHERE MANDT = SY-MANDT
                           AND MATNR = ITAB-IDNRK
                           AND WERKS = P_WERKS.
        IF SY-SUBRC = 0 .
          MOVE 'YES' TO ITAB-SECURITY .
        ELSE.
          MOVE 'NO' TO ITAB-SECURITY .
        ENDIF .

        CLEAR: ITAB-GREENPRD .
        CLEAR: QINF .
        SELECT SINGLE *  FROM QINF CLIENT SPECIFIED
                         WHERE MANDT    EQ SY-MANDT
                           AND MATNR    EQ ITAB-IDNRK
                           AND WERK     EQ P_WERKS
                           AND FREI_DAT GE SY-DATUM .
        IF SY-SUBRC = 0 .
          MOVE 'YES' TO ITAB-GREENPRD .
          MOVE QINF-LIEFERANT TO ITAB-LIFNR .
        ELSE.
          MOVE 'NO'  TO ITAB-GREENPRD .
        ENDIF.
      ELSE .
        CLEAR: ITAB-SECURITY .
        CLEAR: MARA .
        SELECT SINGLE * FROM MARA CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                     AND MATNR EQ ITAB-IDNRK
                                                     AND MSTAE EQ SPACE .
        IF SY-SUBRC = 0 .
          MOVE 'YES' TO ITAB-SECURITY .
        ELSE.
          MOVE 'NO' TO ITAB-SECURITY .
        ENDIF .
      ENDIF .

      IF P_INFO EQ 'X' .
        CLEAR: EINA .
        CLEAR: L_INFO, ITAB-INFOCHK.
        IF ITAB-MTART NE 'HALB'.
          SELECT * FROM EINA CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                AND MATNR EQ ITAB-IDNRK
                                                AND LOEKZ EQ SPACE .
            CHECK L_INFO IS INITIAL .
            SELECT SINGLE * FROM EINE CLIENT SPECIFIED
                           WHERE MANDT EQ SY-MANDT
                             AND INFNR EQ EINA-INFNR
                             AND NETPR GT 0
                             AND PRDAT GE SY-DATUM .
            IF SY-SUBRC = 0 .
              L_INFO = 'Y'.
              ITAB-INFOCHK = 'YES'.
              ITAB-INFNR   = EINE-INFNR .
              ITAB-WERKS   = EINE-WERKS .
              ITAB-EKORG   = EINE-EKORG .
              ITAB-LIFNR1  = EINA-LIFNR .
            ENDIF .
          ENDSELECT .
          IF L_INFO IS INITIAL .
            MOVE 'NO'  TO ITAB-INFOCHK .
          ENDIF .
        ENDIF .
      ENDIF .

      REFRESH: GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
      CLEAR  : GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
      CLEAR  : L_OBJECT .

      L_OBJECT = ITAB-IDNRK .

      CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
        EXPORTING
          OBJECTKEY_IMP   = L_OBJECT
          OBJECTTABLE_IMP = 'MARA'
          CLASSTYPE_IMP   = '001'
          READ_VALUATIONS = 'X'
        TABLES
          ALLOCLIST       = GET_VALUES_LIST
          ALLOCVALUESCHAR = GET_VALUES_CHAR
          ALLOCVALUESCURR = GET_VALUES_CURR
          ALLOCVALUESNUM  = GET_BAPI1003
          RETURN          = GET_BAPIRET2.

      REFRESH: GET_VALUES. CLEAR: GET_VALUES .
      LOOP AT GET_VALUES_CHAR .
        MOVE-CORRESPONDING GET_VALUES_CHAR TO GET_VALUES.
        GET_VALUES-INT = STRLEN( GET_VALUES-VALUE_CHAR ) .
        APPEND GET_VALUES.
        CLEAR  GET_VALUES.
      ENDLOOP .

      SORT GET_VALUES BY CHARACT ASCENDING INT DESCENDING .

      CLEAR: ITAB-MAKTX .

      CLEAR: STR_A001,STR_A002.

      LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
        CONCATENATE STR_A001 GET_VALUES-VALUE_CHAR INTO STR_A001.
      ENDLOOP .
      LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
        CONCATENATE STR_A002 GET_VALUES-VALUE_CHAR INTO STR_A002.
      ENDLOOP .

      CONCATENATE STR_A001 STR_A002 INTO ITAB-MAKTX SEPARATED BY SPACE .

      CONCATENATE ITAB-POTX1 ITAB-POTX2 INTO ITAB-POTXT.

      IF NOT P_OUTST IS INITIAL .
        IF ITAB-INFOCHK = 'NO' OR ITAB-GREENPRD = 'NO' OR ITAB-SECURITY = 'NO'.
          APPEND ITAB .
          CLEAR  ITAB .
        ENDIF .
      ELSE .
        APPEND ITAB .
        CLEAR  ITAB .
      ENDIF .

      BMHDS-DATUB = I_BOM-DATUB .
      BMHDS-DATUV = I_BOM-DATUV .
    ENDLOOP .
  ELSE.
    LOOP AT I_BOM WHERE STUFE = '1'.
      MOVE-CORRESPONDING I_BOM TO ITAB .
      CONCATENATE I_BOM-POTX1 I_BOM-POTX2 INTO ITAB-POTX1 SEPARATED BY SPACE.
      SELECT SINGLE MAKTX INTO ITAB-MAKTX FROM MAKT CLIENT SPECIFIED
        WHERE MANDT = SY-MANDT AND MATNR = ITAB-IDNRK .
      CLEAR: EORD.
      IF ITAB-MTART NE 'HALB'.
        CLEAR: ITAB-SECURITY .
        CLEAR: EORD .
        SELECT SINGLE * FROM EORD CLIENT SPECIFIED
                         WHERE MANDT = SY-MANDT
                           AND MATNR = ITAB-IDNRK
                           AND WERKS = P_WERKS.
        IF SY-SUBRC = 0 .
          MOVE 'YES' TO ITAB-SECURITY .
        ELSE.
          MOVE 'NO' TO ITAB-SECURITY .
        ENDIF .
        CLEAR: QINF, ITAB-GREENPRD.
        SELECT SINGLE *  FROM QINF CLIENT SPECIFIED
                         WHERE MANDT    EQ SY-MANDT
                           AND MATNR    EQ ITAB-IDNRK
                           AND WERK     EQ P_WERKS
                           AND FREI_DAT GE SY-DATUM .
        IF SY-SUBRC = 0 .
          MOVE 'YES' TO ITAB-GREENPRD .
          MOVE QINF-LIEFERANT TO ITAB-LIFNR .
        ELSE.
          MOVE 'NO'  TO ITAB-GREENPRD .
        ENDIF .
      ELSE.
        CLEAR: ITAB-SECURITY .
        CLEAR: MARA .
        SELECT SINGLE * FROM MARA CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                     AND MATNR EQ ITAB-IDNRK
                                                     AND MSTAE EQ SPACE .
        IF SY-SUBRC = 0 .
          MOVE 'YES' TO ITAB-SECURITY .
        ELSE.
          MOVE 'NO' TO ITAB-SECURITY .
        ENDIF .
      ENDIF .
      IF P_INFO EQ 'X' .
        CLEAR: EINA .
        CLEAR: L_INFO, ITAB-INFOCHK.
        IF ITAB-MTART NE 'HALB'.
          SELECT * FROM EINA CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                AND MATNR EQ ITAB-IDNRK
                                                AND LOEKZ EQ SPACE .
            CHECK L_INFO IS INITIAL .
            SELECT SINGLE * FROM EINE CLIENT SPECIFIED
                           WHERE MANDT EQ SY-MANDT
                             AND INFNR EQ EINA-INFNR
                             AND NETPR GT 0
                             AND PRDAT GE SY-DATUM .
            IF SY-SUBRC = 0 .
              L_INFO = 'Y'.
              ITAB-INFOCHK = 'YES'.
              ITAB-INFNR   = EINE-INFNR .
              ITAB-WERKS   = EINE-WERKS .
              ITAB-EKORG   = EINE-EKORG .
              ITAB-LIFNR1  = EINA-LIFNR .
            ENDIF .
          ENDSELECT .
          IF L_INFO IS INITIAL .
            MOVE 'NO'  TO ITAB-INFOCHK .
          ENDIF .
        ENDIF .
      ENDIF .


      REFRESH: GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
      CLEAR  : GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
      CLEAR  : L_OBJECT .

      L_OBJECT = ITAB-IDNRK .

      CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
        EXPORTING
          OBJECTKEY_IMP   = L_OBJECT
          OBJECTTABLE_IMP = 'MARA'
          CLASSTYPE_IMP   = '001'
          READ_VALUATIONS = 'X'
        TABLES
          ALLOCLIST       = GET_VALUES_LIST
          ALLOCVALUESCHAR = GET_VALUES_CHAR
          ALLOCVALUESCURR = GET_VALUES_CURR
          ALLOCVALUESNUM  = GET_BAPI1003
          RETURN          = GET_BAPIRET2.

      REFRESH: GET_VALUES. CLEAR: GET_VALUES .
      LOOP AT GET_VALUES_CHAR .
        MOVE-CORRESPONDING GET_VALUES_CHAR TO GET_VALUES.
        GET_VALUES-INT = STRLEN( GET_VALUES-VALUE_CHAR ) .
        APPEND GET_VALUES.
        CLEAR  GET_VALUES.
      ENDLOOP .

      SORT GET_VALUES BY CHARACT ASCENDING INT DESCENDING .

      CLEAR: ITAB-MAKTX .

*      LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
*        CONCATENATE ITAB-MAKTX GET_VALUES-VALUE_CHAR INTO ITAB-MAKTX.
*      ENDLOOP .
*      LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
*        CONCATENATE ITAB-MAKTX GET_VALUES-VALUE_CHAR INTO ITAB-MAKTX.
*      ENDLOOP .

      CLEAR: STR_A001,STR_A002.

      LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
        CONCATENATE STR_A001 GET_VALUES-VALUE_CHAR INTO STR_A001.
      ENDLOOP .
      LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
        CONCATENATE STR_A002 GET_VALUES-VALUE_CHAR INTO STR_A002.
      ENDLOOP .

      CONCATENATE STR_A001 STR_A002 INTO ITAB-MAKTX SEPARATED BY SPACE .

      CONCATENATE ITAB-POTX1 ITAB-POTX2 INTO ITAB-POTXT.

      IF NOT P_OUTST IS INITIAL .
        IF ITAB-INFOCHK = 'NO' OR ITAB-GREENPRD = 'NO' OR ITAB-SECURITY = 'NO'.
          APPEND ITAB .
          CLEAR  ITAB .
        ENDIF .
      ELSE .
        APPEND ITAB .
        CLEAR  ITAB .
      ENDIF .
      BMHDS-DATUB = I_BOM-DATUB .
      BMHDS-DATUV = I_BOM-DATUV .
    ENDLOOP .
  ENDIF.
ENDFORM.                    " BOM_EXPLOSION

*&---------------------------------------------------------------------*
*&      Form  GET_HEADER_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_HEADER_DATA .

  DATA: L_INDEX TYPE I .
  DATA: L_SIZE(009) .

  DATA: L_NTGEW(010).
  DATA: L_BRGEW(010).

  BMHDS-STLAN = P_STLAN .
  BMHDS-MATNR = P_MATNR .
  BMHDS-EMENG = P_EMENG .
  BMHDS-WERKS = P_WERKS .
  BMHDS-STLAL = P_STLAL .
  BMHDS-T0001 = TEXT-T01 .
  BMHDS-T0002 = TEXT-T02 .
  BMHDS-T0003 = TEXT-T03 .
  BMHDS-T0004 = TEXT-T04 .
  BMHDS-T0005 = TEXT-T05 .
  BMHDS-T0006 = TEXT-T06 .
  BMHDS-T0007 = TEXT-T07 .
  BMHDS-T0008 = TEXT-T08 .
  BMHDS-T0009 = TEXT-T09 .
  BMHDS-T0010 = TEXT-T10 .
  BMHDS-T0011 = TEXT-T11 .
  BMHDS-T0012 = TEXT-T12 .
  BMHDS-T0013 = TEXT-T13 .
  BMHDS-T0014 = TEXT-T14 .
  BMHDS-T0015 = TEXT-T15 .
  BMHDS-T0016 = TEXT-T16 .
  BMHDS-T0017 = TEXT-T17 .
  BMHDS-T0018 = TEXT-T18 .
  BMHDS-T0019 = TEXT-T19 .
  BMHDS-T0020 = TEXT-T20 .
  BMHDS-T0021 = TEXT-T21 .
  BMHDS-T0022 = TEXT-T22 .
  BMHDS-T0023 = TEXT-T23 .
  BMHDS-T0024 = TEXT-T24 .
  BMHDS-T0025 = TEXT-T25 .
  BMHDS-T0026 = TEXT-T26 .
  BMHDS-T0027 = TEXT-T27 .
  BMHDS-T0028 = TEXT-T28 .
  BMHDS-T0029 = TEXT-T29 .
  BMHDS-T0030 = TEXT-T30 .
  BMHDS-T0031 = TEXT-T31 .
  BMHDS-T0032 = TEXT-T32 .
  BMHDS-T0033 = TEXT-T33 .
  BMHDS-T0034 = TEXT-T34 .
  BMHDS-T0035 = TEXT-T35 .
  BMHDS-T0036 = TEXT-T36 .
  BMHDS-T0037 = TEXT-T37 .
  BMHDS-T0038 = TEXT-T38 .
  BMHDS-T0039 = TEXT-T39 .
  BMHDS-T0040 = TEXT-T40 .
  BMHDS-T0042 = TEXT-T42 .
  BMHDS-IOHDR = TEXT-T43 .
  BMHDS-TXTEXP = TEXT-T44.
  BMHDS-T0045 = TEXT-T45.
  BMHDS-T0046 = TEXT-T46.


  CLEAR: MARA, L_NTGEW, L_BRGEW .
  SELECT SINGLE * FROM MARA CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                                               AND MATNR = P_MATNR .
  IF SY-SUBRC = 0 .
    L_NTGEW = MARA-NTGEW .
    L_BRGEW = MARA-BRGEW .
    SHIFT L_NTGEW LEFT DELETING LEADING SPACE.
    SHIFT L_BRGEW LEFT DELETING LEADING SPACE.
    BMHDS-MEINS = MARA-MEINS .
    BMHDS-NTGEW = MARA-NTGEW .
    CONCATENATE L_NTGEW MARA-GEWEI SPACE '/' SPACE  L_BRGEW MARA-GEWEI
           INTO BMHDS-T0047 .
    BMHDS-MATKL = MARA-MATKL .
  ENDIF .

  CLEAR: MARM, L_SIZE .
  SELECT SINGLE * FROM MARM CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT AND MATNR EQ P_MATNR AND MEINH = 'KAR' .
  IF SY-SUBRC EQ 0.
    L_SIZE = MARM-UMREZ.
    SHIFT L_SIZE LEFT DELETING LEADING SPACE.
    CONCATENATE TEXT-T00 L_SIZE BMHDS-MEINS INTO BMHDS-TXTPG SEPARATED BY SPACE.
  ENDIF .

  CLEAR: MARM, L_SIZE .
  SELECT SINGLE * FROM MARM CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT AND MATNR EQ P_MATNR AND MEINH = 'PAL' .
  IF SY-SUBRC EQ 0.
    L_SIZE = MARM-UMREZ.
    SHIFT L_SIZE LEFT DELETING LEADING SPACE.
    IF BMHDS-TXTPG IS INITIAL .
      CONCATENATE TEXT-A04 SPACE L_SIZE SPACE BMHDS-MEINS INTO BMHDS-TXTPG.
    ELSE.
      CONCATENATE BMHDS-TXTPG ' / ' TEXT-A04 SPACE L_SIZE SPACE BMHDS-MEINS INTO BMHDS-TXTPG.
    ENDIF .
  ENDIF .

*  CLEAR: MAKT .
*  SELECT SINGLE MAKTX INTO BMHDS-MAKTX FROM MAKT CLIENT SPECIFIED
*                     WHERE MANDT = SY-MANDT
*                       AND MATNR = P_MATNR .

  CLEAR: KNMT .
  SELECT SINGLE KUNNR KDMAT INTO (BMHDS-KUNNR, BMHDS-KDMAT ) FROM KNMT
                     WHERE MATNR EQ P_MATNR .
*                       AND KDMAT NE SPACE .

  IF NOT BMHDS-KUNNR IS INITIAL .
    CLEAR: KNA1 .
    SELECT SINGLE * FROM KNA1 WHERE KUNNR = BMHDS-KUNNR .
    IF SY-SUBRC = 0.
      CLEAR: ADRC.
      SELECT SINGLE * FROM ADRC CLIENT SPECIFIED WHERE CLIENT EQ SY-MANDT AND ADDRNUMBER EQ KNA1-ADRNR.
      CLEAR: BMHDS-T0041 .
      CONCATENATE KNA1-NAME1 '[' ADRC-SORT1 ADRC-SORT2 ']'  INTO BMHDS-T0041 SEPARATED BY SPACE .
    ENDIF .
  ENDIF .
  CLEAR: BMHDS-SERIE, BMHDS-PDUCT.

  REFRESH: GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
  CLEAR  : GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
  CLEAR  : L_OBJECT .
  L_OBJECT = P_MATNR .

  CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
    EXPORTING
      OBJECTKEY_IMP   = L_OBJECT
      OBJECTTABLE_IMP = 'MARA'
      CLASSTYPE_IMP   = '001'
      READ_VALUATIONS = 'X'
    TABLES
      ALLOCLIST       = GET_VALUES_LIST
      ALLOCVALUESCHAR = GET_VALUES_CHAR
      ALLOCVALUESCURR = GET_VALUES_CURR
      ALLOCVALUESNUM  = GET_BAPI1003
      RETURN          = GET_BAPIRET2.

  REFRESH: GET_VALUES. CLEAR: GET_VALUES .
  LOOP AT GET_VALUES_CHAR .
    MOVE-CORRESPONDING GET_VALUES_CHAR TO GET_VALUES.
    GET_VALUES-INT = STRLEN( GET_VALUES-VALUE_CHAR ) .
    APPEND GET_VALUES.
    CLEAR  GET_VALUES.
  ENDLOOP .
  SORT GET_VALUES BY CHARACT ASCENDING INT DESCENDING .
  CLEAR: BMHDS-PDUCT .
  LOOP AT GET_VALUES WHERE CHARACT = 'A004'.
    CONCATENATE BMHDS-PDUCT GET_VALUES-VALUE_CHAR INTO BMHDS-PDUCT .
  ENDLOOP .

  CLEAR: BMHDS-MAKTX .
*  LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
*    CONCATENATE BMHDS-MAKTX GET_VALUES-VALUE_CHAR INTO BMHDS-MAKTX.
*  ENDLOOP .
*  LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
*    CONCATENATE BMHDS-MAKTX GET_VALUES-VALUE_CHAR INTO BMHDS-MAKTX.
*  ENDLOOP .

  CLEAR: STR_A001,STR_A002.

  LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
    CONCATENATE STR_A001 GET_VALUES-VALUE_CHAR INTO STR_A001.
  ENDLOOP .
  LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
    CONCATENATE STR_A002 GET_VALUES-VALUE_CHAR INTO STR_A002.
  ENDLOOP .

  CONCATENATE STR_A001 STR_A002 INTO BMHDS-MAKTX SEPARATED BY SPACE .

  CLEAR: BMHDS-SERIE.
  LOOP AT GET_VALUES WHERE CHARACT = 'A005'.
    CONCATENATE BMHDS-SERIE GET_VALUES-VALUE_CHAR INTO BMHDS-SERIE .
  ENDLOOP .

  CLEAR: MAST .
  SELECT SINGLE * FROM MAST CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                        AND MATNR = P_MATNR
                        AND WERKS = P_WERKS
                        AND STLAN = P_STLAN
                        AND STLAL = C_STLAL.
  IF SY-SUBRC = 0 .
    REFRESH: STR_LINES .
    CLEAR  : STR_LINES, STR_TDID,  STR_TDNAME, STR_OBJECT, BMHDS-IOTXT .
    CONCATENATE SY-MANDT 'M' MAST-STLNR INTO STR_TDNAME .
    SELECT SINGLE * FROM STXH WHERE TDNAME = STR_TDNAME.
    IF SY-SUBRC = 0 .
      STR_TDNAME = STXH-TDNAME .
      STR_TDID   = STXH-TDID   .
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          ID       = STR_TDID
          LANGUAGE = SY-LANGU
          NAME     = STR_TDNAME
          OBJECT   = 'BOM'
        TABLES
          LINES    = STR_LINES.
      IF SY-SUBRC <> 0.
*    message id sy-msgid type sy-msgty number sy-msgno
*      with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF .
      IF NOT STR_LINES[] IS INITIAL .
        CLEAR: BMHDS-TEXT0 .
        LOOP AT STR_LINES .
          CONCATENATE BMHDS-TEXT0 STR_LINES-TDLINE
                 INTO BMHDS-TEXT0 .
        ENDLOOP .
      ENDIF .
    ELSE.
      CLEAR: BMHDS-TEXT0 .
      CLEAR: STZU .
      SELECT SINGLE ZTEXT INTO BMHDS-TEXT0 FROM STZU CLIENT SPECIFIED
                         WHERE MANDT EQ SY-MANDT
                           AND STLTY EQ 'M'
                           AND STLNR EQ MAST-STLNR.
    ENDIF .
  ENDIF .

  CLEAR: STKO .
  SELECT SINGLE STKTX INTO BMHDS-IOTXT FROM STKO CLIENT SPECIFIED
                     WHERE MANDT EQ SY-MANDT
                       AND STLNR EQ MAST-STLNR
                       AND STLAL EQ C_STLAL.


  BMHDS-EXPDAT = P_DATUM .
  SHIFT BMHDS-STLAL LEFT DELETING LEADING '0'.
  CONCATENATE BMHDS-STLAN BMHDS-STLAL INTO BMHDS-TXTUSG SEPARATED BY '/'.
*  CLEAR: STR_TDNAME .
*  MOVE P_MATNR TO STR_TDNAME .
*  SELECT SINGLE * FROM STXH WHERE TDNAME = STR_TDNAME.
*  IF SY-SUBRC = 0 .
*    REFRESH: STR_LINES .
*    CALL FUNCTION 'READ_TEXT'
*      EXPORTING
*        ID       = 'GRUN'
*        LANGUAGE = '1'
*        NAME     = STR_TDNAME
*        OBJECT   = 'MATERIAL'
*      TABLES
*        LINES    = STR_LINES.
*    IF NOT STR_LINES[] IS INITIAL .
*      LOOP AT STR_LINES .
*        CONCATENATE BMHDS-IOTXT STR_LINES-TDLINE
*               INTO BMHDS-IOTXT .
*      ENDLOOP .
*    ENDIF .
*  ENDIF .
ENDFORM.                    " GET_HEADER_DATA
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_RESULT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWNLOAD_RESULT .

  LOOP AT DL_TAB.
    CLEAR: DL_TAB-MAKTX .
    REFRESH: GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
    CLEAR  : GET_BAPI1003, GET_VALUES_CHAR, GET_VALUES_CURR, GET_BAPIRET2.
    CLEAR  : L_OBJECT .

    L_OBJECT = DL_TAB-IDNRK .

    CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
      EXPORTING
        OBJECTKEY_IMP   = L_OBJECT
        OBJECTTABLE_IMP = 'MARA'
        CLASSTYPE_IMP   = '001'
        READ_VALUATIONS = 'X'
      TABLES
        ALLOCLIST       = GET_VALUES_LIST
        ALLOCVALUESCHAR = GET_VALUES_CHAR
        ALLOCVALUESCURR = GET_VALUES_CURR
        ALLOCVALUESNUM  = GET_BAPI1003
        RETURN          = GET_BAPIRET2.

    REFRESH: GET_VALUES. CLEAR: GET_VALUES .
    LOOP AT GET_VALUES_CHAR .
      MOVE-CORRESPONDING GET_VALUES_CHAR TO GET_VALUES.
      GET_VALUES-INT = STRLEN( GET_VALUES-VALUE_CHAR ) .
      APPEND GET_VALUES.
      CLEAR  GET_VALUES.
    ENDLOOP .

    SORT GET_VALUES BY CHARACT ASCENDING INT DESCENDING .

    CLEAR: DL_TAB-MAKTX .

*    LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
*      CONCATENATE DL_TAB-MAKTX GET_VALUES-VALUE_CHAR INTO DL_TAB-MAKTX.
*    ENDLOOP .
*    LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
*      CONCATENATE DL_TAB-MAKTX GET_VALUES-VALUE_CHAR INTO DL_TAB-MAKTX.
*    ENDLOOP .

    CLEAR: STR_A001,STR_A002.

    LOOP AT GET_VALUES WHERE CHARACT = 'A001'.
      CONCATENATE STR_A001 GET_VALUES-VALUE_CHAR INTO STR_A001.
    ENDLOOP .
    LOOP AT GET_VALUES WHERE CHARACT = 'A002'.
      CONCATENATE STR_A002 GET_VALUES-VALUE_CHAR INTO STR_A002.
    ENDLOOP .

    CONCATENATE STR_A001 STR_A002 INTO DL_TAB-MAKTX SEPARATED BY SPACE .

    MODIFY DL_TAB .
  ENDLOOP .

  DATA: STR_STRING TYPE STRING .
  DATA: C_FILENAME(255) .
  CLEAR: L_FILE.
  CONCATENATE P_FILE 'BOM_' P_MATNR '_' SY-DATUM SY-UZEIT
         INTO L_FILE.

  CONCATENATE L_FILE '.TXT' INTO L_FILE.

  CALL FUNCTION 'WS_DOWNLOAD'
     EXPORTING
          FILENAME                =  L_FILE
          FILETYPE                = 'DAT'
*         CODEPAGE                = '8450'
*    IMPORTING
*         FILELENGTH              = P_ITAB_DOCIDTAB
     TABLES
          DATA_TAB                = DL_TAB
          FIELDNAMES              = FIELDNAMES
     EXCEPTIONS
          OTHERS                  = 1.

  IF SY-SUBRC = 0.
    MESSAGE ID 'MG' TYPE 'S' NUMBER '899'
    WITH 'Data file exported to file' STR_STRING
    'successfully'.
  ELSE.
    MESSAGE ID 'MG' TYPE 'I' NUMBER '899'
    WITH 'Fail to open file' STR_STRING .
  ENDIF.

ENDFORM.                    " DOWNLOAD_RESULT
*&---------------------------------------------------------------------*
*&      Form  GET_FIELDNAMES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_FIELDNAMES .

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X01.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X08.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X05.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X02.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X03.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X11.
  APPEND FIELDNAMES.

*  CLEAR: FIELDNAMES .
*  FIELDNAMES-NAME = TEXT-X04.
*  APPEND FIELDNAMES.

*  CLEAR: FIELDNAMES .
*  FIELDNAMES-NAME = TEXT-X06.
*  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P01.
  APPEND FIELDNAMES.

*  CLEAR: FIELDNAMES .
*  FIELDNAMES-NAME = TEXT-X07.
*  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P03.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P05.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X09.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-X10.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P07.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P08.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P06.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P06.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P11.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-P04.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-T43.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-T04.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-T03.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-T48.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-T49.
  APPEND FIELDNAMES.

  CLEAR: FIELDNAMES .
  FIELDNAMES-NAME = TEXT-T50.
  APPEND FIELDNAMES.

ENDFORM.                    " GET_FIELDNAMES


*&---------------------------------------------------------------------*
*&      Form  eventtab_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ST_EVENTS  text
*----------------------------------------------------------------------*
FORM EVENTTAB_BUILD USING P_ST_EVENTS TYPE SLIS_T_EVENT.

  DATA: LS_EVENT TYPE SLIS_ALV_EVENT.

* read event control table
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      I_LIST_TYPE = 0
    IMPORTING
      ET_EVENTS   = P_ST_EVENTS.

* assign the control form to 'top of page' from slis
  READ TABLE P_ST_EVENTS WITH KEY
                  NAME = SLIS_EV_TOP_OF_PAGE INTO LS_EVENT.
  IF SY-SUBRC = 0.
    MOVE ST_FORMNAME_TOP_OF_PAGE TO LS_EVENT-FORM.
    APPEND LS_EVENT TO P_ST_EVENTS.
  ENDIF.

* assign the control form to 'user command' from slis
  READ TABLE P_ST_EVENTS WITH
                  KEY NAME = SLIS_EV_USER_COMMAND INTO LS_EVENT.
  IF SY-SUBRC = 0.
    MOVE S_USER_COMMAND TO LS_EVENT-FORM.
    APPEND LS_EVENT TO P_ST_EVENTS.
  ENDIF.

* assign the control form to 'PF_STATUS_SET' from slis
  READ TABLE P_ST_EVENTS WITH
              KEY NAME = SLIS_EV_PF_STATUS_SET INTO LS_EVENT.
  IF SY-SUBRC = 0.
    MOVE S_STATUS TO LS_EVENT-FORM.
    APPEND LS_EVENT TO P_ST_EVENTS.
  ENDIF.

ENDFORM.                    " eventtab_build

*&---------------------------------------------------------------------*
*&      Form  PRINT_BOM_DETAILS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PRINT_BOM_DETAILS .

  REFRESH: BMITS .
  CLEAR  : BMITS , FM_NAME .

  LOOP AT ITAB .
    MOVE-CORRESPONDING ITAB TO BMITS .
    APPEND BMITS.
    CLEAR  BMITS.
  ENDLOOP .

  IF NOT BMITS[] IS INITIAL .

    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        FORMNAME           = 'ZPPBMR001F'
*       FORMNAME           = 'ZPPBMF001A'
        DIRECT_CALL        = 'X'
      IMPORTING
        FM_NAME            = FM_NAME
      EXCEPTIONS
        NO_FORM            = 1
        NO_FUNCTION_MODULE = 2
        OTHERS             = 3.
*    WA_SSFCOMPOP-NO_DIALOG = 'X'.
    WA_SSFCTRLOP-PREVIEW = 'X'.
*    WA_SSFCTRLOP-DEVICE = 'PRINTER'.
*    WA_SSFCOMPOP-TDPRINTER = ''.
*    WA_SSFCOMPOP-TDPAGESLCT = ''.

    CALL FUNCTION FM_NAME
      EXPORTING
        CONTROL_PARAMETERS = WA_SSFCTRLOP
        OUTPUT_OPTIONS     = WA_SSFCOMPOP
      TABLES
        BMHDS              = BMHDS
        BMITS              = BMITS
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 4
        OTHERS             = 5.
    IF SY-SUBRC <>    0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

  ENDIF .

ENDFORM.                    " PRINT_BOM_DETAILS


*&------------------------------------------------------------------
*&      Form  VARIANT_INIT
*&------------------------------------------------------------------
FORM VARIANT_INIT.

*  code = '0001'.
*  clear s_variant.
*  s_variant-report = s_repid.
*  s_variant-handle = code.

ENDFORM.                               " VARIANT_INIT


*&---------------------------------------------------------------------*
*&      Form  comment_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM COMMENT_BUILD.
  DATA: STR_LINE01 TYPE STRING .
  DATA: STR_LINE02 TYPE STRING .
  DATA: STR_LINE03 TYPE STRING .
  DATA: L_BASEQTY(009) .

  CLEAR: MAKT .
  SELECT SINGLE * FROM MAKT CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                       AND MATNR EQ P_MATNR
                       AND SPRAS EQ '1'.

  CONCATENATE BMHDS-MATNR MAKT-MAKTX INTO STR_LINE01 SEPARATED BY SPACE .
  IF BMHDS-STLAN = '1'.
    CONCATENATE BMHDS-STLAN TEXT-H01 INTO STR_LINE02 SEPARATED BY SPACE .
  ENDIF .
  IF BMHDS-STLAN = '2'.
    CONCATENATE BMHDS-STLAN TEXT-H02 INTO STR_LINE02 SEPARATED BY SPACE .
  ENDIF .
  L_BASEQTY = BMHDS-EMENG .
  CONCATENATE L_BASEQTY BMHDS-MEINS  INTO STR_LINE03 SEPARATED BY SPACE .

* type: H header size, S normal and highlight size, A small size
* type, key, info.
  PERFORM ALV_ASSIGN_PAGE_HEADER USING 'S' 'Material'      STR_LINE01.
  PERFORM ALV_ASSIGN_PAGE_HEADER USING 'S' 'Plant'         BMHDS-WERKS.
  PERFORM ALV_ASSIGN_PAGE_HEADER USING 'S' 'Usage'         STR_LINE02.
  PERFORM ALV_ASSIGN_PAGE_HEADER USING 'S' 'Alternative'   P_STLAL.
  PERFORM ALV_ASSIGN_PAGE_HEADER USING 'S' 'Application'   P_CAPID.
  PERFORM ALV_ASSIGN_PAGE_HEADER USING 'S' 'Base Quantity' STR_LINE03.

ENDFORM.                               " COMMENT_BUILD

*&---------------------------------------------------------------------*
*&      Form  layout_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ALV_LAYOUT_BUILD.

* layout pre-define
  ST_LAYOUT-COLWIDTH_OPTIMIZE    = 'X'.    "TEXT FIT IN TABLE PERFECTLY
  ST_LAYOUT-BOX_FIELDNAME        = 'SELK'"checkbox NAME Itab-SELK
  ST_LAYOUT-GET_SELINFOS         = 'X'.    "read selection screen
*  st_layout-confirmation_prompt = 'X'.    "confirm. prompt whenleaving
  ST_LAYOUT-DETAIL_INITIAL_LINES = 'X'.   "allow don't displayinitial
  ST_LAYOUT-INFO_FIELDNAME       = 'COL'.  " field for color of row
  ST_LAYOUT-ZEBRA                = 'X'.    "stripped pattern

ENDFORM.                               " LAYOUT_BUILD

*&---------------------------------------------------------------------*
*&      Form  alv_assign_page_header
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TYPE     text
*      -->P_KEY      text
*      -->P_INFO     text
*----------------------------------------------------------------------*
FORM ALV_ASSIGN_PAGE_HEADER USING P_TYPE P_KEY P_INFO.

  DATA: LS_LINE TYPE SLIS_LISTHEADER.

  CLEAR LS_LINE.
  LS_LINE-TYP    = P_TYPE.
  LS_LINE-KEY    = P_KEY.
  LS_LINE-INFO   = P_INFO.
  APPEND LS_LINE TO ST_LIST_TOP_OF_PAGE.

ENDFORM.                    " alv_assign_page_header

*&------------------------------------------------------------------
*&      Form  FIELDCAT_INIT
*&------------------------------------------------------------------
FORM FIELDCAT_INIT.

  DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.

* table col name
* display description from itab
  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'POSNR'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'POSNR'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'IDNRK'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'IDNRK'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'STUFE'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'POSNR'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'MTART'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'MARA'.
  LS_FIELDCAT-REF_FIELDNAME   = 'MTART'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME   = 'CHECK'.
  LS_FIELDCAT-DATATYPE    = 'CHAR'.
  LS_FIELDCAT-REPTEXT_DDIC = TEXT-L04.
  LS_FIELDCAT-DDICTXT     = 'S'.
  LS_FIELDCAT-DO_SUM      = 'X'.      " DISPLAY TOTAL
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'MAKTX'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'MAKT'.
  LS_FIELDCAT-REF_FIELDNAME   = 'MAKTX'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'MEINS'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'MEINS'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'MNGLG'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'MNGLG'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'FMENG'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'FMENG'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'AUSCH'" internal table fieldname
  LS_FIELDCAT-DATATYPE        = 'CHAR'.
  LS_FIELDCAT-REPTEXT_DDIC    = TEXT-L00.
  LS_FIELDCAT-DDICTXT         = 'S'.
  LS_FIELDCAT-DO_SUM          = 'X'.      " DISPLAY TOTAL
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'ALPGR'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'ALPGR'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'ALPRF'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'ALPRF'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME   = 'SECURITY'.
  LS_FIELDCAT-DATATYPE    = 'CHAR'.
  LS_FIELDCAT-REPTEXT_DDIC = TEXT-L01.
  LS_FIELDCAT-DDICTXT     = 'S'.
  LS_FIELDCAT-DO_SUM      = 'X'.      " DISPLAY TOTAL
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME   = 'GREENPRD'.
  LS_FIELDCAT-DATATYPE    = 'CHAR'.
  LS_FIELDCAT-REPTEXT_DDIC = TEXT-L02.
  LS_FIELDCAT-DDICTXT     = 'S'.
  LS_FIELDCAT-DO_SUM      = 'X'.      " DISPLAY TOTAL
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

  IF NOT P_INFO IS INITIAL .
    CLEAR LS_FIELDCAT.
    LS_FIELDCAT-FIELDNAME   = 'INFOCHK'.
    LS_FIELDCAT-DATATYPE    = 'CHAR'.
    LS_FIELDCAT-REPTEXT_DDIC = TEXT-L03.
    LS_FIELDCAT-DDICTXT     = 'S'.
    LS_FIELDCAT-DO_SUM      = 'X'.      " DISPLAY TOTAL
    APPEND LS_FIELDCAT TO ST_FIELDCAT.
  ENDIF .

  CLEAR LS_FIELDCAT.
  LS_FIELDCAT-FIELDNAME       = 'POTX1'" internal table fieldname
  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
  LS_FIELDCAT-REF_FIELDNAME   = 'POTX1'.
  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
  LS_FIELDCAT-FIX_COLUMN      = 'X'.
  APPEND LS_FIELDCAT TO ST_FIELDCAT.

*  CLEAR LS_FIELDCAT.
*  LS_FIELDCAT-FIELDNAME       = 'STLNR'. " internal table fieldname
*  LS_FIELDCAT-REF_TABNAME     = 'STPOX'.
*  LS_FIELDCAT-REF_FIELDNAME   = 'STLNR'.
*  LS_FIELDCAT-DDICTXT         = 'S'.     "dictionary (S,M,L) fieldsize
*  LS_FIELDCAT-FIX_COLUMN      = 'X'.
*  APPEND LS_FIELDCAT TO ST_FIELDCAT.
ENDFORM.                               " FIELDCAT_INIT

*&---------------------------------------------------------------------*
*&      Form  reuse_alv_list_display
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM REUSE_ALV_LIST_DISPLAY.
  LOOP AT ITAB WHERE MTART EQ 'HALB'.
    CLEAR: MAST.
    CLEAR: ITAB-CHECK.
    SELECT SINGLE * FROM MAST CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                 AND MATNR EQ ITAB-IDNRK
                                                 AND WERKS EQ P_WERKS
                                                 AND STLAN EQ '1'.
    IF SY-SUBRC EQ 0.
      MOVE 'YES' TO ITAB-CHECK.
    ELSE.
      SELECT SINGLE * FROM MAST CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                 AND MATNR EQ ITAB-IDNRK
                                                 AND WERKS EQ P_WERKS
                                                 AND STLAN EQ '2'.
      IF SY-SUBRC EQ 0.
        MOVE 'YES' TO ITAB-CHECK.
      ELSE.
        MOVE 'NO' TO ITAB-CHECK.
      ENDIF.
    ENDIF.
    MODIFY ITAB.
  ENDLOOP .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
         I_BACKGROUND_ID          = 'ALV_BACKGROUND'  "wall paper
         I_CALLBACK_PROGRAM       = S_REPID   "must not use sy-repid
         I_CALLBACK_PF_STATUS_SET = S_STATUS "self-define userstatus
         I_CALLBACK_USER_COMMAND  = S_USER_COMMAND "user command sub
             IS_LAYOUT            = ST_LAYOUT   "layout setting
             IT_FIELDCAT          = ST_FIELDCAT "field setting
             IT_EXCLUDING         = TAB  "not work
             I_DEFAULT            = 'X'
             I_SAVE               = 'A'          " allow to save
             IS_VARIANT           = S_VARIANT
             IT_EVENTS            = ST_EVENTS
*     IMPORTING
*           E_EXIT_CAUSED_BY_CALLER   =
*           ES_EXIT_CAUSED_BY_USER    =
       TABLES
            T_OUTTAB              =  ITAB[].

ENDFORM.                               " REUSE_ALV_LIST_DISPLAY

*-------------------------------------------------------------------
*    FORM PF_STATUS_SET
*-------------------------------------------------------------------
FORM STANDARD_ST01 USING EXTAB TYPE SLIS_T_EXTAB.
************ contain all fcode from ALV ******************
  DELETE EXTAB WHERE FCODE = '&RNT_PREV'.
  DELETE EXTAB WHERE FCODE = '&LFO'.
  DELETE EXTAB WHERE FCODE = '&NFO'.
  DELETE EXTAB WHERE FCODE = '&RNT'.
  SET PF-STATUS 'ST01'.
*  set titlebar  'ALVST'.

ENDFORM.                    "standard_st01

*-------------------------------------------------------------------
*       FORM TOP_OF_PAGE-ALV.
*-------------------------------------------------------------------
FORM TOP_OF_PAGE-ALV.
*
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = ST_LIST_TOP_OF_PAGE
      I_LOGO             = 'TPLOGO'.
*            I_END_OF_LIST_GRID       =

ENDFORM.                    "top_of_page-alv

*-------------------------------------------------------------------
*       FORM USER_COMMAND-ALV
*-------------------------------------------------------------------
FORM USER_COMMAND-ALV USING R_UCOMM LIKE SY-UCOMM
                  RS_SELFIELD TYPE SLIS_SELFIELD.

  DATA: FELD(10TYPE C.
* table rs_selfield store the information of cursor and table index.
  RS_SELFIELD-REFRESH = 'X'.

  CASE R_UCOMM.
    WHEN '&IC1'.
      READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
      IF SY-SUBRC = 0.
        CASE RS_SELFIELD-FIELDNAME.
          WHEN 'IDNRK' OR 'ALPRF' OR 'FMENG' OR 'AUSCH'
                       OR 'ALPGR' OR 'STUFE'.
            IF ITAB-IDNRK IS INITIAL.
              CLEAR R_UCOMM.
              EXIT.
            ENDIF.
            SELECT SINGLE * FROM MAST WHERE MATNR = ITAB-IDNRK
                                        AND WERKS = P_WERKS
                                        AND STLAN = P_STLAN.
            IF SY-SUBRC = 0 .
              SET PARAMETER ID 'MAT' FIELD ITAB-IDNRK.
              SET PARAMETER ID 'WRK' FIELD P_WERKS.
              SET PARAMETER ID 'CSV' FIELD P_STLAN.
              CALL TRANSACTION 'CS03' AND SKIP FIRST SCREEN.
            ELSE.
              MESSAGE TEXT-S01 TYPE 'S'.
            ENDIF .
          WHEN 'SECURITY'.
            SET PARAMETER ID 'MAT' FIELD ITAB-IDNRK.
            SET PARAMETER ID 'WRK' FIELD P_WERKS.
            CALL TRANSACTION 'ME03' AND SKIP FIRST SCREEN.
          WHEN 'GREENPRD'.
            SET PARAMETER ID 'MAT' FIELD ITAB-IDNRK.
            SET PARAMETER ID 'WRK' FIELD P_WERKS.
            SET PARAMETER ID 'LIF' FIELD ITAB-LIFNR.
            CALL TRANSACTION 'QI03' AND SKIP FIRST SCREEN.
          WHEN 'INFOCHK'.
            IF ITAB-MTART NE 'HALB'.
              SET PARAMETER ID 'MAT' FIELD ITAB-IDNRK.
              SET PARAMETER ID 'LIF' FIELD ITAB-LIFNR1.
              SET PARAMETER ID 'EKO' FIELD ITAB-EKORG.
              SET PARAMETER ID 'WRK' FIELD ITAB-WERKS.
              SET PARAMETER ID 'INF' FIELD ITAB-INFNR.
              CALL TRANSACTION 'ME13' AND SKIP FIRST SCREEN.
            ENDIF .
        ENDCASE .
      ENDIF .
    WHEN 'BOMPRT'.
      PERFORM PRINT_BOM_DETAILS.
    WHEN 'BMDL'.
      PERFORM GET_FIELDNAMES  .
      PERFORM SINGLE_LEVEL_BOM .
      PERFORM DOWNLOAD_RESULT .
    WHEN 'BMPRT1'.
      PERFORM MFG_PRINT_BOM.
  ENDCASE .
  CLEAR R_UCOMM.
ENDFORM.                    "user_command-alv

*&---------------------------------------------------------------------*
*&      Form  SINGLE_LEVEL_BOM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SINGLE_LEVEL_BOM .

  DATA: L_MATNR_NEW LIKE MARA-MATNR.
  DATA: L_MATNR_OLD LIKE MARA-MATNR.
  DATA: L_NTGEW     LIKE MARA-NTGEW.
  DATA: L_BRGEW     LIKE MARA-NTGEW.
  DATA: L_GEWEI     LIKE MARA-GEWEI.
  DATA: L_UMREZ_CAR LIKE MARM-UMREN.
  DATA: L_UMREZ_PAL LIKE MARM-UMREN.
  DATA: L_STKTX     LIKE STKO-STKTX.
  REFRESH: DL_TAB. CLEAR: DL_TAB .
  LOOP AT ITAB .
    IF P_SINGLE IS INITIAL .
      IF NOT ITAB-MTART = 'HALB'.
      ELSE.
        MOVE ITAB-IDNRK  TO I_HALB-IDNRK .
        MOVE P_WERKS     TO I_HALB-WERKS .
        MOVE P_STLAN     TO I_HALB-STLAN .
        COLLECT I_HALB .
        CLEAR   I_HALB .
      ENDIF .
    ENDIF .

    IF ITAB-STUFE = 1 .
      CLEAR: DL_TAB .
      MOVE ITAB-AUSCH  TO DL_TAB-AUSCH.
      MOVE P_WERKS     TO DL_TAB-WERKS .
      MOVE ITAB-FMENG  TO DL_TAB-FMENG .
      MOVE ITAB-ALPGR  TO DL_TAB-ALPGR .
      MOVE ITAB-ALPRF  TO DL_TAB-ALPRF .
      MOVE ITAB-POTXT  TO DL_TAB-POTXT .
      MOVE ITAB-POTX1  TO DL_TAB-POTX1 .
      MOVE ITAB-POTX2  TO DL_TAB-POTX2 .
      MOVE ITAB-MENGE  TO DL_TAB-MENGE .
      MOVE ITAB-IDNRK  TO DL_TAB-IDNRK .
      MOVE ITAB-LGORT  TO DL_TAB-LGORT .
      MOVE ITAB-MEINS  TO DL_TAB-MEINS .
      MOVE BMHDS-TEXT0 TO DL_TAB-HTEXT .
      MOVE P_EMENG     TO DL_TAB-EMENG .
      MOVE P_MATNR     TO DL_TAB-MATNR .
      MOVE P_WERKS     TO DL_TAB-WERKS .
      MOVE P_STLAN     TO DL_TAB-STLAN .
      APPEND DL_TAB .
      CLEAR  DL_TAB .
    ENDIF .
  ENDLOOP .
  IF P_SINGLE IS INITIAL .
    LOOP AT I_HALB .
      PERFORM EXPLOSION_HALB USING I_HALB-IDNRK I_HALB-WERKS
                                   I_HALB-STLAN I_HALB-MAKTX.
    ENDLOOP .
  ENDIF .

  SORT DL_TAB BY MATNR WERKS .
  CLEAR: L_MATNR_NEW, L_MATNR_OLD .
  LOOP AT DL_TAB .
    MOVE DL_TAB-MATNR TO L_MATNR_NEW .
    IF L_MATNR_NEW NE L_MATNR_OLD.
      CLEAR: MARA, MARM, L_UMREZ_CAR, L_UMREZ_PAL, L_GEWEI, L_NTGEW, L_BRGEW, L_STKTX .
      SELECT SINGLE * FROM MARA CLIENT SPECIFIED WHERE MANDT EQ SY-MANDT
                                                   AND MATNR EQ DL_TAB-MATNR.
      MOVE MARA-NTGEW TO L_NTGEW.
      MOVE MARA-BRGEW TO L_BRGEW.
      MOVE MARA-GEWEI TO L_GEWEI.

      CLEAR: MARM.
      SELECT SINGLE UMREZ INTO L_UMREZ_CAR FROM MARM CLIENT SPECIFIED
                         WHERE MANDT EQ SY-MANDT
                           AND MATNR EQ L_MATNR_NEW
                           AND MEINH EQ 'KAR'.
      CLEAR: MARM.
      SELECT SINGLE UMREZ INTO L_UMREZ_PAL FROM MARM CLIENT SPECIFIED
                         WHERE MANDT EQ SY-MANDT
                           AND MATNR EQ L_MATNR_NEW
                           AND MEINH EQ 'PAL'.
      CLEAR: MAST .
      SELECT SINGLE * FROM MAST CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                            AND MATNR = L_MATNR_NEW
                            AND WERKS = P_WERKS
                            AND STLAN = P_STLAN
                            AND STLAL = C_STLAL.
      CLEAR: STKO .
      SELECT SINGLE STKTX INTO L_STKTX FROM STKO CLIENT SPECIFIED
                         WHERE MANDT EQ SY-MANDT
                           AND STLNR EQ MAST-STLNR
                           AND STLAL EQ C_STLAL.
      DL_TAB-GEWEI = L_GEWEI .
      DL_TAB-NTGEW = L_NTGEW .
      DL_TAB-BRGEW = L_BRGEW .
      DL_TAB-BOX01 = L_UMREZ_CAR .
      DL_TAB-BOX02 = L_UMREZ_PAL .
      DL_TAB-STKTX = L_STKTX  .
      L_MATNR_OLD  = L_MATNR_NEW .
    ELSE.
      DL_TAB-GEWEI = L_GEWEI .
      DL_TAB-NTGEW = L_NTGEW .
      DL_TAB-BRGEW = L_BRGEW .
      DL_TAB-BOX01 = L_UMREZ_CAR .
      DL_TAB-BOX02 = L_UMREZ_PAL .
      DL_TAB-STKTX = L_STKTX  .
    ENDIF .

    MODIFY DL_TAB .

  ENDLOOP .

ENDFORM.                    " SINGLE_LEVEL_BOM
*&---------------------------------------------------------------------*
*&      Form  EXPLOSION_HALB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_I_HALB_MATNR  text
*      -->P_I_HALB_WERKS  text
*      -->P_I_HALB_STLAN  text
*----------------------------------------------------------------------*
FORM EXPLOSION_HALB  USING  MATNR WERKS STLAN MAKTX.
  DATA: L_INDEX TYPE P .
  REFRESH: I_BOM, I_MATCAT .
  CLEAR  : I_BOM, I_MATCAT .

  CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
      CAPID                 = 'PP01'
      DATUV                 =  P_DATUM " SY-DATUM
      EHNDL                 = '1'
      EMENG                 =  P_EMENG    " Base Qty
      MEHRS                 = 'X'
      MMORY                 = '1'
      MTNRV                 = MATNR    " Parent Material
      WERKS                 = WERKS    " Plant
*      stpst                 = 1        " Level = 1
      STLAN                 = STLAN
    TABLES
      STB                   = I_BOM
      MATCAT                = I_MATCAT
    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
      CONVERSION_ERROR      = 8
      OTHERS                = 9.
  LOOP AT I_BOM WHERE STUFE = 1.
    MOVE I_BOM-AUSCH TO DL_TAB-AUSCH.
    MOVE I_BOM-WERKS TO DL_TAB-WERKS .
    MOVE I_BOM-FMENG TO DL_TAB-FMENG .
    MOVE I_BOM-ALPGR TO DL_TAB-ALPGR .
    MOVE I_BOM-ALPRF TO DL_TAB-ALPRF .
    CONCATENATE I_BOM-POTX1 I_BOM-POTX2 INTO DL_TAB-POTXT.
    MOVE I_BOM-POTX1 TO DL_TAB-POTX1 .
    MOVE I_BOM-POTX2 TO DL_TAB-POTX2 .
    MOVE I_BOM-MENGE TO DL_TAB-MENGE .
    MOVE I_BOM-IDNRK TO DL_TAB-IDNRK .
    MOVE I_BOM-LGORT TO DL_TAB-LGORT .
*   MOVE I_BOM-POSNR TO DL_TAB-POSNR .
    MOVE I_BOM-MEINS TO DL_TAB-MEINS .
    CLEAR: MAST .
    SELECT SINGLE * FROM MAST CLIENT SPECIFIED WHERE MANDT = SY-MANDT
                          AND MATNR = MATNR
                          AND WERKS = WERKS
                          AND STLAN = STLAN.
    IF SY-SUBRC = 0 .
      REFRESH: STR_LINES .
      CLEAR  : STR_LINES, STR_TDID,  STR_TDNAME, STR_OBJECT .
      CONCATENATE SY-MANDT 'M' MAST-STLNR INTO STR_TDNAME .
      SELECT SINGLE * FROM STXH WHERE TDNAME = STR_TDNAME.
      IF SY-SUBRC = 0 .
        STR_TDNAME = STXH-TDNAME .
        STR_TDID   = STXH-TDID   .
        CALL FUNCTION 'READ_TEXT'
          EXPORTING
            ID       = STR_TDID
            LANGUAGE = SY-LANGU
            NAME     = STR_TDNAME
            OBJECT   = 'BOM'
          TABLES
            LINES    = STR_LINES.
        IF SY-SUBRC <> 0.
*    message id sy-msgid type sy-msgty number sy-msgno
*      with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF .
      ENDIF .
    ENDIF .
    CLEAR: DL_TAB-HTEXT .
    IF NOT STR_LINES[] IS INITIAL .
      CLEAR: L_INDEX, BMHDS-TEXT1, BMHDS-TEXT2, BMHDS-TEXT3,
                      BMHDS-TEXT4 ,BMHDS-TEXT5, BMHDS-TEXT6 .
      LOOP AT STR_LINES .
        L_INDEX = L_INDEX + 1 .
        IF L_INDEX = 1 .
          BMHDS-TEXT1 = STR_LINES-TDLINE.
        ENDIF .

        IF L_INDEX = 2 .
          BMHDS-TEXT2 = STR_LINES-TDLINE.
        ENDIF .

        IF L_INDEX = 3 .
          BMHDS-TEXT3 = STR_LINES-TDLINE.
        ENDIF .

        IF L_INDEX = 4 .
          BMHDS-TEXT4 = STR_LINES-TDLINE.
        ENDIF .

        IF L_INDEX = 5 .
          BMHDS-TEXT5 = STR_LINES-TDLINE.
        ENDIF .
        IF L_INDEX = 6 .
          BMHDS-TEXT6 = STR_LINES-TDLINE.
          EXIT.
        ENDIF .
      ENDLOOP .
      CLEAR: DL_TAB-HTEXT .
      CONCATENATE BMHDS-TEXT1 BMHDS-TEXT2 BMHDS-TEXT3
                  BMHDS-TEXT4 BMHDS-TEXT5 BMHDS-TEXT6
             INTO DL_TAB-HTEXT .
    ENDIF .

    MOVE MATNR   TO DL_TAB-MATNR .
    MOVE WERKS   TO DL_TAB-WERKS .
    MOVE STLAN   TO DL_TAB-STLAN .
    MOVE P_EMENG TO DL_TAB-EMENG .

    APPEND DL_TAB .
    CLEAR  DL_TAB .
  ENDLOOP .

ENDFORM.                    " EXPLOSION_HALB

*&---------------------------------------------------------------------*
*&      Form  MFG_PRINT_BOM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MFG_PRINT_BOM .

  REFRESH: BMITS .
  CLEAR  : BMITS , FM_NAME .

  LOOP AT ITAB .
    MOVE-CORRESPONDING ITAB TO BMITS .
    APPEND BMITS.
    CLEAR  BMITS.
  ENDLOOP .

  IF NOT BMITS[] IS INITIAL .

    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      EXPORTING
        FORMNAME           = 'ZPPBMR001FA'
        DIRECT_CALL        = 'X'
      IMPORTING
        FM_NAME            = FM_NAME
      EXCEPTIONS
        NO_FORM            = 1
        NO_FUNCTION_MODULE = 2
        OTHERS             = 3.
*    WA_SSFCOMPOP-NO_DIALOG = 'X'.
    WA_SSFCTRLOP-PREVIEW = 'X'.
*    WA_SSFCTRLOP-DEVICE = 'PRINTER'.
*    WA_SSFCOMPOP-TDPRINTER = ''.
*    WA_SSFCOMPOP-TDPAGESLCT = ''.

    CALL FUNCTION FM_NAME
      EXPORTING
        CONTROL_PARAMETERS = WA_SSFCTRLOP
        OUTPUT_OPTIONS     = WA_SSFCOMPOP
      TABLES
        BMHDS              = BMHDS
        BMITS              = BMITS
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 4
        OTHERS             = 5.
    IF SY-SUBRC <>    0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
  ENDIF .

ENDFORM.                    " MFG_PRINT_BOM