Tuesday, 18 February 2020

Create and Change BOM-COM Master

Sample Code Using BDC :



Complete Code :

Report Z_SD_CRT_COM .

TABLES: MARA,ZTB_BOM_UPL_LOG.

TYPE-POOLS : slis,icon,vimty,abap,truxs.

INCLUDE <icon>.
INCLUDE <symbol>.

*----------------------------------------------------------------------*
*   data definition
*----------------------------------------------------------------------*
*       Batchinputdata of single transaction
DATA:   BDCDATA LIKE BDCDATA    OCCURS 0 WITH HEADER LINE.
*       messages of call transaction
DATA:   MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
*       error session opened (' ' or 'X')

DATA:  BEGIN OF IT_MESSTAB OCCURS 0 .
        INCLUDE STRUCTURE BDCMSGCOLL.
DATA:  L_MSTRING(480) TYPE C.
DATA:  END OF IT_MESSTAB.

DATA:   E_GROUP_OPENED.
*       message texts
TABLES: T100.

TYPES : BEGIN OF TY_MM01,
          MATNR(018),
          IDNRK(018),
          MENGE(015),
          DATUVC(012),
          ALTBOM TYPE CSAP_MBOM-STLAL, "(20),
*          ALTEBOM(2),
          DATUV TYPE SY-DATUM,
          MAKTX(45),
          POSNR(6),
          MEINS(7),
          STLNR TYPE MAST-STLNR,
          WERKS TYPE WERKS,
          STLAN TYPE STLAN,
          STLAL TYPE STLAL,
          GRP(1) TYPE N,
          MSGV1(15),
          ERROR(100),
          MSGE(480),
          TRF_LIGHT(1),
          EXIST(1),
          STATUS(60),
        END OF TY_MM01.

TYPES : BEGIN OF TY_MAT,
          MATNR TYPE  MAST-MATNR,
          WERKS TYPE  MAST-WERKS,
          STLAN TYPE  MAST-STLAN,
          STLNR TYPE  MAST-STLNR,
          STLAL TYPE  MAST-STLAL,
          ANDAT TYPE  MAST-ANDAT,
          STLKN TYPE  STPO-STLKN,
          DATUV TYPE  STPO-DATUV,
          IDNRK TYPE  STPO-IDNRK,
          POSNR TYPE  STPO-POSNR,
          MEINS TYPE  STPO-MEINS,
          MENGE(2) TYPE P DECIMALS 0, " TYPE  STPO-MENGE,
          AENNR TYPE AENR-AENNR,
          MAKTX TYPE MAKT-MAKTX,
          DATUVC(012),
        END OF TY_MAT.

TYPES : BEGIN OF TY_BOM,
        STLNR TYPE STKO-STLNR,
        STLAL TYPE STKO-STLAL,
        MATNR TYPE MAST-MATNR,
        DATUV TYPE STPO-DATUV,
        END OF TY_BOM.

DATA: BEGIN OF T_STPO OCCURS 0,
        MATNR LIKE MAST-MATNR,
        WERKS LIKE MAST-WERKS,
        STLAN LIKE MAST-STLAN,
        STLNR LIKE STPO-STLNR,
        IDNRK LIKE STPO-IDNRK,
        POSNR LIKE STPO-POSNR,
        AENNR LIKE STPO-AENNR,
        BULK(1) TYPE C,
        MMBULK LIKE MARC-SCHGT,
        VALID_FROM LIKE STKO_API02-VALID_FROM,
        ERROR(220) TYPE C,
      END OF T_STPO.


DATA : IT_MM01 TYPE TABLE OF TY_MM01,
       WA_MM01 TYPE TY_MM01,

       IT_MMS1 TYPE TABLE OF TY_MM01,
       WA_MMS1 TYPE TY_MM01,

       IT_MMX1 TYPE TABLE OF TY_MM01,
       WA_MMX1 TYPE TY_MM01,

       IT_MMX2 TYPE TABLE OF TY_MM01,
       WA_MMX2 TYPE TY_MM01.

DATA : IT_MM11 TYPE TABLE OF TY_MM01,
       WA_MM11 TYPE TY_MM01.

DATA : IT_MMC1 TYPE TABLE OF TY_MM01,
       WA_MMC1 TYPE TY_MM01.

DATA : IT_MMC2 TYPE TABLE OF TY_MM01,
       WA_MMC2 TYPE TY_MM01.

DATA : IT_MM02 TYPE TABLE OF TY_MM01,
       WA_MM02 TYPE TY_MM01.

DATA : IT_MM03 TYPE TABLE OF TY_MM01,
       WA_MM03 TYPE TY_MM01.

DATA : IT_MM04 TYPE TABLE OF TY_MM01,
       WA_MM04 TYPE TY_MM01.

DATA : IT_MMC4 TYPE TABLE OF TY_MM01,
       WA_MMC4 TYPE TY_MM01.

DATA : IT_MMXX TYPE TABLE OF TY_MM01,
       WA_MMXX TYPE TY_MM01.

DATA :IT_MAT TYPE TABLE OF TY_MAT,
      WA_MAT TYPE TY_MAT.

DATA :IT_BOM TYPE TABLE OF TY_BOM,
      WA_BOM TYPE TY_BOM.

DATA : LV_FNAME TYPE STRING,
       TABLE_N TYPE I.

DATA: t_fldcat     TYPE slis_t_fieldcat_alv,
      s_fldcat     TYPE slis_fieldcat_alv,
      t_sort       TYPE slis_t_sortinfo_alv," WITH HEADER LINE,
      t_fldcat2     TYPE slis_t_fieldcat_alv,
      s_fldcat2     TYPE slis_fieldcat_alv,
      t_sort2       TYPE slis_t_sortinfo_alv," WITH HEADER LINE,
      wa_sortinfo TYPE slis_sortinfo_alv,
      x_layout     TYPE slis_layout_alv,
      y_layout     TYPE slis_layout_alv,
      gd_layout    TYPE lvc_s_layo,
      x_print      TYPE slis_print_alv,
      x_variant    TYPE disvariant,
      d_repid      TYPE sy-repid,
      ct_type(2) ,
      f_fldcat2 type slis_t_fieldcat_alv with header line,
      g_layout type slis_layout_alv,
      gs_fieldcatalog TYPE lvc_s_fcat OCCURS 0,
      gv_fcat LIKE LINE OF gs_fieldcatalog,
      gus_fieldcatalog TYPE lvc_s_fcat OCCURS 0.

DATA:
       t_stpo_read like STPO_API02 occurs 0 with header line,
       t_stpo_data like STPO_API02 occurs 0 with header line,
       t_stpo_update like STPO_API03 occurs 0 with header line,
       i_stko LIKE stko_api01," OCCURS 0 WITH HEADER LINE,
       T_STKO LIKE STKO_API02 OCCURS 0 WITH HEADER LINE,
       wrk_date like CSAP_MBOM-DATUV.

DATA: IDX(2),
      FNAM(20).

DATA : rs_selfield TYPE slis_selfield.

DATA: OK_CODE LIKE sy-ucomm,
      save_ok like sy-ucomm,
      g_container TYPE scrfname VALUE 'ZCTRUSER',
      grid1  TYPE REF TO cl_gui_alv_grid,
      g_custom_container TYPE REF TO cl_gui_custom_container,
      gs_layout TYPE lvc_s_layo,
      g_max type i value 100.

DATA: it_folder   LIKE STANDARD TABLE OF sdokpath,
      it_file     LIKE STANDARD TABLE OF sdokpath,
      it_fol_fil  LIKE STANDARD TABLE OF sdokpath,
      wa_fol_fil  LIKE sdokpath,
      file_count  TYPE i,
      dir_count   TYPE i.

DATA : CNTR_NO(4) TYPE N,
       LINE_NO(4) TYPE N.

DATA : vf_start_col TYPE i,   "start column
       vf_start_row TYPE i,   "start row
       vf_end_col   TYPE i,   "maximum column
       vf_end_row   TYPE i,   "maximum row
       p_text(20).

DATA: itabb TYPE STANDARD TABLE OF kcde_cells WITH HEADER LINE,
      vf_index TYPE i.

DATA: tab type table of itab,
      wa_tab like itab.

*  Check In Uplad File Have Same Component dan Date
DATA : DG_MATNR TYPE MATNR,
       DG_DATUV TYPE DATUV,
       DG_IDNRK TYPE IDNRK.

FIELD-SYMBOLS: <fs>.

DATA: DG_DATUVF TYPE SY-DATUM,
      DG_DATUVL TYPE SY-DATUM.

SELECTION-SCREEN BEGIN OF BLOCK SEL1 WITH FRAME TITLE TEXT-003.
PARAMETERS : RB_UP RADIOBUTTON GROUP RB_1 DEFAULT 'X' USER-COMMAND ucom.
PARAMETERS : P_FNAME TYPE IBIPPARMS-PATH .
SELECTION-SCREEN SKIP 1.
PARAMETERS : RB_TMP RADIOBUTTON GROUP RB_1.
PARAMETER  : pdirp   TYPE pfeflnamel DEFAULT 'D:\',
             p_psavep  TYPE string DEFAULT 'Material Template.XLS'.
SELECTION-SCREEN SKIP 1.
PARAMETERS : RB_DWN RADIOBUTTON GROUP RB_1.

SELECTION-SCREEN END OF BLOCK SEL1.

AT SELECTION-SCREEN OUTPUT.
  PERFORM MODIFY_SCREEN.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME.
  DATA: PATH LIKE RLGRAP-FILENAME.
  PATH = 'D:\'.
  CALL FUNCTION 'WS_FILENAME_GET'
  EXPORTING
    DEF_FILENAME     = SPACE
    DEF_PATH         = PATH
*    MASK             = ',.xls , .xlsx.'
*      MASK             = ', .txt , .txt.'
    MODE             = 'O'
    TITLE            = 'PC-File-Selection'
  IMPORTING
    FILENAME         = p_fname
  EXCEPTIONS
    INV_WINSYS       = 1
    NO_BATCH         = 2
    SELECTION_CANCEL = 3
    SELECTION_ERROR  = 4
    OTHERS           = 5.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pdirp.
  DATA: fname TYPE string.

  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Select Directory'
    CHANGING
      selected_folder      = fname
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  pdirp = fname.

INITIALIZATION.
  PERFORM BINT.

START-OF-SELECTION.

  IF RB_TMP = 'X'.
    SUBMIT Z_DID_SD_COM_TMP WITH p_pdirp EQ pdirp
                            WITH psavep EQ p_psavep
      AND RETURN.
    STOP.
  ENDIF.

  IF RB_DWN = 'X'.
    SUBMIT Z_DID_SD_DWN_COM WITH p_pdirp EQ pdirp
                            WITH psavep = 'BOM Master.XLS' via SELECTION-SCREEN
      AND RETURN.
    STOP.
  ENDIF.

*  SPLIT data Form Excel
  vf_start_col = '1'.
  vf_start_row = '2'.
  vf_end_col = '60'.
  vf_end_row = '10000'.

  CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT' " Function to download data
                                               " from excel
        EXPORTING
          filename                = p_fname
          i_begin_col             = vf_start_col
          i_begin_row             = vf_start_row
          i_end_col               = vf_end_col
          i_end_row               = vf_end_row
        TABLES
          intern                  = itabb "B09
        EXCEPTIONS
          inconsistent_parameters = 1
          upload_ole              = 2
          OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE i454(0) WITH 'File not found'.
  ENDIF.

  CLEAR: itabb .
  SORT itabb BY row col.
  LOOP AT itabb.
    MOVE : itabb-col TO vf_index.
    ASSIGN COMPONENT vf_index OF STRUCTURE WA_MM01 TO <fs>.
    MOVE : itabb-value TO <fs>.
    AT END OF row.
      APPEND WA_MM01 to IT_MM01.
      CLEAR WA_MM01.
    ENDAT.
  ENDLOOP.

  table_n = 0.
  DESCRIBE TABLE IT_MM01 LINES table_n.
  IF table_n EQ 0.
    MESSAGE I208(00) WITH 'Different File Type'.
    STOP.
  ENDIF.

  LOOP AT IT_MM01 INTO WA_MM01.

    TRANSLATE WA_MM01-MATNR TO UPPER CASE.
    TRANSLATE WA_MM01-IDNRK TO UPPER CASE.

    SELECT SINGLE STLNR FROM MAST INTO WA_MM01-STLNR
                       WHERE MATNR EQ WA_MM01-MATNR.

    IF SY-SUBRC EQ 0.
       IF WA_MM01-ALTBOM IS INITIAL.
        WA_MM01-EXIST = 'N'.
        WA_MM01-STATUS = 'New BOM-Component Material'.
        WA_MM01-TRF_LIGHT =  '2'.
       ENDIF.
    ELSE. "IF SY-SUBRC NE 0.
      WA_MM01-EXIST = 'N'.
      WA_MM01-STATUS = 'New BOM-Component Material'.
      WA_MM01-TRF_LIGHT =  '2'.
    ENDIF.

    SELECT SINGLE MATNR FROM MARA INTO MARA-MATNR
          WHERE MATNR EQ WA_MM01-MATNR
            AND MTART EQ 'ZBOM'
            AND MEINS EQ 'SET'.

    IF SY-SUBRC NE 0.
      WA_MM01-EXIST = 'F'.
      WA_MM01-STATUS = 'Not BOM Material'.
    ENDIF.

    CLEAR MARA.
    SELECT SINGLE MAKTX FROM MAKT INTO WA_MM01-MAKTX
                WHERE MATNR EQ WA_MM01-IDNRK.

    SELECT SINGLE MEINS FROM MARA INTO WA_MM01-MEINS
           WHERE MATNR EQ WA_MM01-IDNRK.

    IF SY-SUBRC NE 0.

      IF WA_MM01-EXIST IS NOT INITIAL.
        WA_MM01-EXIST = 'F'.
        WA_MM01-STATUS = 'Bom or Material Does not Exist'.
      ELSE.
        WA_MM01-EXIST = 'F'.
        WA_MM01-STATUS = 'Material Does not Exist'.
      ENDIF.
    ENDIF.


    REPLACE ALL OCCURRENCES OF '.' IN WA_MM01-DATUVC WITH SPACE.
    CONCATENATE  WA_MM01-DATUVC+4(4) WA_MM01-DATUVC+2(2) WA_MM01-DATUVC(2) INTO WA_MM01-DATUV.


    IF WA_MM01-DATUV LT SY-DATUM.
      IF WA_MM01-EXIST IS NOT INITIAL.
        WA_MM01-EXIST = 'F'.
        CONCATENATE WA_MM01-STATUS 'Valid From Can not Back Date' INTO WA_MM01-STATUS SEPARATED BY ','.
      ELSE.
        WA_MM01-EXIST = 'F'.
        WA_MM01-STATUS = 'Valid From Can not Back Date'.
      ENDIF.
    ENDIF.

    CONCATENATE '0' WA_MM01-ALTBOM INTO WA_MM01-ALTBOM.

    MODIFY IT_MM01 FROM WA_MM01.
  ENDLOOP.

  DATA: ALTEBOOM(2).

*    Compare BOM have Component or Not .
  SORT IT_MAT BY MATNR.
  SORT IT_MM01 BY MATNR. .
  LOOP AT IT_MM01 INTO WA_MM01 WHERE EXIST EQ SPACE.

    CLEAR ALTEBOOM.

    AT NEW MATNR.
      READ TABLE IT_MM01 INTO WA_MM01 INDEX SY-TABIX.

      WA_MM01-WERKS = '1000'.
      WA_MM01-STLAN = '5'.
      ALTEBOOM = WA_MM01-ALTBOM.

      CALL FUNCTION 'CSAP_MAT_BOM_READ'
        EXPORTING
          MATERIAL    = WA_MM01-MATNR
          PLANT       = WA_MM01-WERKS
          BOM_USAGE   = WA_MM01-STLAN
          ALTERNATIVE = ALTEBOOM
          VALID_TO    = '31.12.9999'
        TABLES
          T_STPO      = T_STPO_READ
          T_STKO      = T_STKO
        EXCEPTIONS
          ERROR       = 1
          OTHERS      = 2.


      IF T_STPO_READ[] IS NOT INITIAL.
        LOOP AT T_STPO_READ.
          MOVE-CORRESPONDING T_STPO_READ TO T_STPO_DATA.
          APPEND T_STPO_DATA.
          CLEAR: T_STPO_DATA,T_STPO_READ.
        ENDLOOP.
      ENDIF.
    ENDAT.
    MODIFY IT_MM01 FROM WA_MM01.
  ENDLOOP.

  SELECT * FROM STKO INTO CORRESPONDING FIELDS OF TABLE IT_BOM
   FOR ALL ENTRIES IN T_STPO_DATA
   WHERE STLNR EQ T_STPO_DATA-BOM_NO.

  SORT IT_BOM BY STLNR STLAL DESCENDING.
  DELETE ADJACENT DUPLICATES FROM IT_BOM COMPARING STLNR.

  IF T_STPO_DATA[] IS NOT INITIAL.
    CLEAR T_STPO_DATA.
    SORT IT_MM01 BY STLNR MATNR IDNRK.
    SORT T_STPO_DATA BY BOM_NO COMPONENT.
    LOOP AT IT_MM01 INTO WA_MM01 WHERE EXIST EQ SPACE.
      READ TABLE T_STPO_DATA WITH KEY BOM_NO = WA_MM01-STLNR
                                   COMPONENT = WA_MM01-IDNRK BINARY SEARCH.
      IF SY-SUBRC EQ 0.
        IF WA_MM01-IDNRK = T_STPO_DATA-COMPONENT.
          WA_MM01-EXIST = 'D'.
          WA_MM01-STATUS = 'Already Exist, Will be deleted'.
          WA_MM01-TRF_LIGHT =  '2'.
          MOVE-CORRESPONDING WA_MM01 TO WA_MM04.
          APPEND WA_MM04 TO IT_MM04.
        ENDIF.
      ELSE.
        IF WA_MM01-DATUV LT SY-DATUM.
          WA_MM01-EXIST = 'F'.
          WA_MM01-STATUS = 'Valid From Cannot Back Date'.
          WA_MM01-MSGE = 'Fail To Process'.
          WA_MM01-TRF_LIGHT = '1'.
        ELSE.
          WA_MM01-STATUS = 'Add BOM-Component Material'.
          WA_MM01-EXIST  = 'C'.  "Change to Add
          WA_MM01-TRF_LIGHT = '2'.
          MOVE-CORRESPONDING WA_MM01 TO WA_MM02.
          APPEND WA_MM02 TO IT_MM02.
        ENDIF.
      ENDIF.
      MODIFY IT_MM01 FROM WA_MM01.
    ENDLOOP.
  ENDIF.


* Collect For Status Fail
  SORT IT_MM01 BY  STATUS MATNR IDNRK.
  LOOP AT  IT_MM01 INTO WA_MM01 WHERE EXIST = 'F'.
    WA_MM01-MSGE = 'Fail To Process'.
    WA_MM01-TRF_LIGHT = '1'.
    WA_MM01-STATUS = 'Can Not Process'.
    MOVE-CORRESPONDING WA_MM01 TO WA_MMXX.
    APPEND WA_MMXX TO IT_MMXX.
  ENDLOOP.

***************
  SORT IT_MM01 BY MATNR POSNR EXIST IDNRK.
*Processing data
  PERFORM FIRST_VIEW_DATA.
*----------------------------------------------------------------------*
*        Start new transaction according to parameters                 *
*----------------------------------------------------------------------*
FORM BDC_TRANSACTION USING TCODE.
  DATA: L_MSTRING(480).
  DATA: L_SUBRC LIKE SY-SUBRC.
  REFRESH MESSTAB.
  CALL TRANSACTION TCODE USING BDCDATA
                   MODE  'N' " 'N' "'A' "CTUMODE
                   UPDATE 'L' "'L' "'S' "CUPDATE
                   MESSAGES INTO MESSTAB.

  LOOP AT MESSTAB.
    MESSAGE ID     MESSTAB-MSGID
            TYPE   MESSTAB-MSGTYP
            NUMBER MESSTAB-MSGNR
            INTO L_MSTRING
            WITH MESSTAB-MSGV1
                 MESSTAB-MSGV2
                 MESSTAB-MSGV3
                 MESSTAB-MSGV4.

    IT_MESSTAB-MSGTYP = MESSTAB-MSGTYP.
    IT_MESSTAB-MSGV1 = MESSTAB-MSGV1.
    IT_MESSTAB-MSGV2 = MESSTAB-MSGV2.
    IF MESSTAB-MSGV2 IS NOT INITIAL.
      IT_MESSTAB-MSGV1 = MESSTAB-MSGV2.
    ENDIF.
    IT_MESSTAB-MSGV3 = MESSTAB-MSGV3.
    IT_MESSTAB-MSGV4 = MESSTAB-MSGV4.
    IT_MESSTAB-L_MSTRING = L_MSTRING.

    APPEND IT_MESSTAB .
  ENDLOOP.

  REFRESH BDCDATA.
ENDFORM.                    "BDC_TRANSACTION

*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
  CLEAR BDCDATA.
  BDCDATA-PROGRAM  = PROGRAM.
  BDCDATA-DYNPRO   = DYNPRO.
  BDCDATA-DYNBEGIN = 'X'.
  APPEND BDCDATA.
ENDFORM.                    "BDC_DYNPRO

*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
  IF FVAL <> SPACE. "NODATA.
    CLEAR BDCDATA.
    BDCDATA-FNAM = FNAM.
    BDCDATA-FVAL = FVAL.
    APPEND BDCDATA.
  ENDIF.
ENDFORM.                    "BDC_FIELD
*&---------------------------------------------------------------------*
*&      Form  BINT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BINT .

  DEFINE f_fldcat.
    clear s_fldcat.
    s_fldcat-fieldname = &1.
    s_fldcat-decimals_out  = &2.
    s_fldcat-seltext_l = &3.
    s_fldcat-outputlen  = &4.
    s_fldcat-just      = &5.
    s_fldcat-no_out    = &6.
    s_fldcat-datatype  = &7.
    s_fldcat-qfieldname = &8.
    s_fldcat-no_zero  = &9.
    append s_fldcat to t_fldcat.
  END-OF-DEFINITION.

  DEFINE f_fldcat2.
    clear s_fldcat2.
    s_fldcat2-fieldname = &1.
    s_fldcat2-decimals_out  = &2.
    s_fldcat2-seltext_l = &3.
    s_fldcat2-outputlen  = &4.
    s_fldcat2-just      = &5.
    s_fldcat2-no_out    = &6.
    s_fldcat2-datatype  = &7.
    s_fldcat2-qfieldname = &8.
    s_fldcat2-no_zero  = &9.
    append s_fldcat2 to t_fldcat2.
  END-OF-DEFINITION.

ENDFORM.                    " BINT
*&---------------------------------------------------------------------*
*&      Form  MODIFY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_DATA.
  REFRESH IT_MAT.
  SELECT MAST~MATNR MAST~WERKS  MAST~STLAN MAST~STLNR MAST~STLAL  MAST~ANDAT
           STPO~STLKN STPO~DATUV IDNRK STPO~POSNR STPO~MEINS STPO~MENGE
           MAKT~MAKTX
       INTO CORRESPONDING FIELDS OF TABLE IT_MAT
       FROM MAST
       INNER JOIN STPO AS STPO ON STPO~STLNR = MAST~STLNR
       INNER JOIN MAKT AS MAKT ON MAKT~MATNR = STPO~IDNRK
      FOR ALL ENTRIES IN IT_MMC1
       WHERE MAST~MATNR EQ IT_MMC1-MATNR
        AND STPO~IDNRK EQ IT_MMC1-IDNRK.

  IF IT_MAT IS NOT INITIAL.
    SORT IT_MAT BY MATNR IDNRK.
    SORT IT_MMC1 BY MATNR IDNRK.
    LOOP AT IT_MMC1 INTO WA_MMC1 WHERE EXIST = 'N'.
      READ TABLE IT_MAT INTO WA_MAT WITH KEY MATNR = WA_MMC1-MATNR
                                             IDNRK = WA_MMC1-IDNRK BINARY SEARCH.
      IF SY-SUBRC EQ 0.
        WA_MMC1-MSGE = 'Bom Component Create'.
        WA_MMC1-POSNR = WA_MAT-POSNR.
        WA_MMC1-MEINS = WA_MAT-MEINS.
        WA_MMC1-MAKTX = WA_MAT-MAKTX.
        WA_MMC1-DATUV = WA_MAT-DATUV.
        WA_MMC1-TRF_LIGHT = '3'.  "Green
      ENDIF.
      MODIFY IT_MMC1 FROM WA_MMC1.
      MOVE-CORRESPONDING WA_MMC1 TO WA_MMXX.
      APPEND WA_MMXX TO IT_MMXX.
    ENDLOOP.
  ENDIF.

ENDFORM.                    " MODIFY_DATA
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT .
*   *   *  *             1     2  3           4   5  6  7      8  9
  f_fldcat2 'MATNR' '' 'Material Bom' '' 'L' ''  'CHAR' '' '' .
  f_fldcat2 'POSNR' '' 'LIne Item' '' 'L' ''  'CHAR' '' '' .
  f_fldcat2 'IDNRK' '' 'Material Component' '' 'L' ''  'CHAR' '' '' .
  f_fldcat2 'MAKTX' '' 'Material Description' '' 'L' ''  'CHAR' '' '' .
  f_fldcat2 'MENGE' '' 'Quantity' '' 'L' ''  'CHAR' '' '' .
  f_fldcat2 'MEINS' '' 'Base Unit of Measure' '' 'L' ''  'CHAR' '' '' .
  f_fldcat2 'DATUV' '' 'Valid From' '' 'L' ''  'DATS' '' '' .
  f_fldcat2 'MSGE' '' 'Status' '' 'L' '' 'CHAR' '' ''.
  CLEAR S_FLDCAT2.

ENDFORM.                    " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  L_BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM L_BUILD_LAYOUT .
  y_layout-colwidth_optimize  = 'X'.
  y_layout-info_fieldname     = 'LINE_COLOR'.
  y_layout-def_status         = 'X'.
  y_layout-lights_fieldname  = 'TRF_LIGHT'.
  y_layout-lights_tabname    = 'I_LIGHTS'.
ENDFORM.                    " L_BUILD_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPLAY .

  d_repid = sy-repid.
  Call function 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = d_repid
      i_callback_pf_status_set = 'STATUS_SET'
      i_callback_user_command  = 'USR_CMD'
      it_fieldcat        = t_fldcat2[]
      it_sort            = t_sort2[]
      is_layout          = y_layout
*        i_default          = 'X'
        i_save             = 'U'
*        is_variant         = x_variant
*        it_event_exit      = t_event_exit[]
*        is_print           = x_print
    TABLES
      t_outtab           = IT_MMXX[]
    EXCEPTIONS
      program_error      = 1
      others             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " DISPLAY

*&---------------------------------------------------------------------*
*&      Form  f_status_set
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM STATUS_SET USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZALV'.
ENDFORM.                    "f_status_set
*&---------------------------------------------------------------------*
*&      Form  MODIFY_MM02
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_MM02 .

  REFRESH IT_MAT.
  IF IT_MMC2 IS NOT INITIAL.
    SELECT MAST~MATNR MAST~WERKS  MAST~STLAN MAST~STLNR MAST~STLAL  MAST~ANDAT
             STPO~STLKN STPO~DATUV IDNRK STPO~POSNR STPO~MEINS STPO~MENGE
             MAKT~MAKTX
         INTO CORRESPONDING FIELDS OF TABLE IT_MAT
         FROM MAST
         INNER JOIN STPO AS STPO ON STPO~STLNR = MAST~STLNR
         INNER JOIN MAKT AS MAKT ON MAKT~MATNR = STPO~IDNRK
        FOR ALL ENTRIES IN IT_MMC2
         WHERE MAST~MATNR EQ IT_MMC2-MATNR
          AND STPO~IDNRK EQ IT_MMC2-IDNRK.
  ENDIF.



  IF IT_MAT IS NOT INITIAL.
    SORT IT_MAT BY MATNR IDNRK.
    SORT IT_MMC2 BY MATNR IDNRK.
    LOOP AT IT_MMC2 INTO WA_MMC2.
      READ TABLE IT_MAT INTO WA_MAT WITH KEY MATNR = WA_MMC2-MATNR
                                             IDNRK = WA_MMC2-IDNRK BINARY SEARCH.

      IF SY-SUBRC EQ 0.
        WA_MMC2-MSGE = 'Add Bom Component Success'.
        WA_MMC2-POSNR = WA_MAT-POSNR.
        WA_MMC2-MEINS = WA_MAT-MEINS.
        WA_MMC2-MAKTX = WA_MAT-MAKTX.
        WA_MMC2-DATUV = WA_MAT-DATUV.
        WA_MMC2-TRF_LIGHT = '3'.  "Green
      ELSE.
        WA_MMC2-MSGE = 'Bom Component Fail Change'.
        WA_MMC2-TRF_LIGHT = '1'.
      ENDIF.
      MODIFY IT_MMC2 FROM WA_MMC2.
      MOVE-CORRESPONDING WA_MMC2 TO WA_MMXX.
      APPEND WA_MMXX TO IT_MMXX.
    ENDLOOP.
  ENDIF.


  LOOP AT IT_MM03 INTO WA_MM03 WHERE EXIST EQ 'F'.
    WA_MM03-MSGE = 'Bom Component Fail Change'.
    WA_MM03-TRF_LIGHT = '1'.
    MODIFY IT_MM03 FROM WA_MM03.
    MOVE-CORRESPONDING WA_MM03 TO WA_MMXX.
    APPEND WA_MMXX TO IT_MMXX.
  ENDLOOP.

ENDFORM.                    " MODIFY_MM02
*&---------------------------------------------------------------------*
*&      Form  PROS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PROS_DATA.

*  Add with New Bom and New Component
  IF IT_MM01[] IS NOT INITIAL.
*  Delete Component are Change
    DELETE IT_MM01 WHERE EXIST = 'C'  OR EXIST = 'F'.

*  Check New Component one Bom Have Different Valid From Make to Valid From
    CLEAR DG_DATUV.
    SORT IT_MM01 BY MATNR DATUV.
    LOOP AT IT_MM01 INTO WA_MM01.
      AT NEW MATNR.
        READ TABLE IT_MM01 INTO WA_MM01 INDEX SY-TABIX.
        DG_DATUV = WA_MM01-DATUV.
      ENDAT.
      WA_MM01-DATUV = DG_DATUV.
      MODIFY IT_MM01 FROM WA_MM01.
    ENDLOOP.

    REFRESH IT_MMC1.
    IT_MMC1 = IT_MM01.

    SORT IT_MM01 BY MATNR.
    DELETE ADJACENT DUPLICATES FROM IT_MM01 COMPARING MATNR DATUV.

    SORT IT_MM01 BY MATNR.
    SORT IT_MMC1 BY MATNR IDNRK.
    LOOP AT IT_MM01 INTO WA_MM01  WHERE EXIST = 'N'.
      perform bdc_dynpro      using 'SAPLCSDI' '0100'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29N-DATUV'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '/00'.
      perform bdc_field       using 'RC29N-MATNR'
                                    WA_MM01-MATNR.
      perform bdc_field       using 'RC29N-WERKS'
                                    '1000'.
      perform bdc_field       using 'RC29N-STLAN'
                                    '5'.
      perform bdc_field       using 'RC29N-DATUV'
                                    WA_MM01-DATUVC.
      perform bdc_dynpro      using 'SAPLCSDI' '0110'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '/00'.
      perform bdc_field       using 'RC29K-BMENG'
*                                     WA_MM01-STLAL.
                                    '1'.
      perform bdc_field       using 'RC29K-STLST'
                                    '1'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29K-EXSTL'.
      perform bdc_dynpro      using 'SAPLCSDI' '0111'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29K-LABOR'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '/00'.

      MOVE 1 TO IDX.
      CLEAR: WA_MMC1.
      SORT IT_MMC1 BY MATNR IDNRK.
      LOOP AT IT_MMC1 INTO WA_MMC1 WHERE MATNR = WA_MM01-MATNR.

        perform bdc_dynpro      using 'SAPLCSDI' '0140'.
        perform bdc_field       using 'BDC_CURSOR'
                                      'RC29P-IDNRK(01)'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '/00'.

        CONCATENATE 'RC29P-IDNRK('IDX')' INTO FNAM.
        perform bdc_field       using  FNAM
                                WA_MMC1-IDNRK.

        CONCATENATE 'RC29P-MENGE('IDX')' INTO FNAM.
        perform bdc_field       using  FNAM
                               WA_MMC1-MENGE.


        CONCATENATE 'RC29P-POSTP('IDX')' INTO FNAM.
        perform bdc_field       using  FNAM
                                'L'.

        perform bdc_dynpro      using 'SAPLCSDI' '0130'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '/00'.
        perform bdc_dynpro      using 'SAPLCSDI' '0131'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '/00'.
        IDX = IDX + 1.
      ENDLOOP.
      perform bdc_dynpro      using 'SAPLCSDI' '0140'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29P-POSNR(01)'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=FCBU'.
      perform bdc_transaction using 'CS01'.
    ENDLOOP.
  ENDIF.



*  Add Component with Exist Component
  IF IT_MM02[] IS NOT INITIAL.

    REFRESH IT_MM03.
    IT_MM03 = IT_MM02.

    SORT IT_MM02 BY MATNR IDNRK EXIST.
    REFRESH: IT_MMC2.
    IT_MMC2 = IT_MM02.

    SORT IT_MM02 BY MATNR.
    DELETE ADJACENT DUPLICATES FROM IT_MM02 COMPARING MATNR.

    SORT IT_MM02 BY MATNR.
    SORT IT_MMC2 BY MATNR DATUV IDNRK.
    LOOP AT IT_MM02 INTO WA_MM02 WHERE EXIST = 'C'.
      perform bdc_dynpro      using 'SAPLCSDI' '0100'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29N-DATUV'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '/00'.
      perform bdc_field       using 'RC29N-MATNR'
                                    WA_MM02-MATNR.
      perform bdc_field       using 'RC29N-WERKS'
                                    '1000'.
      perform bdc_field       using 'RC29N-STLAN'
                                    '5'.
      perform bdc_field       using 'RC29N-DATUV'
                                    WA_MM02-DATUVC.
      perform bdc_field       using 'RC29N-STLAL'
                                    WA_MM02-ALTBOM.

      perform bdc_dynpro      using 'SAPLCSDI' '0150'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29P-POSNR(01)'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=FCNP'.

      MOVE 2 TO IDX.
      CLEAR: WA_MMC2.
      SORT IT_MMC2 BY MATNR IDNRK.
      LOOP AT IT_MMC2 INTO WA_MMC2 WHERE MATNR = WA_MM02-MATNR.

        perform bdc_dynpro      using 'SAPLCSDI' '0140'.
        perform bdc_field       using 'BDC_CURSOR'
                                      'RC29P-IDNRK(01)'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '/00'.

        CONCATENATE 'RC29P-IDNRK('IDX')' INTO FNAM.
        perform bdc_field       using  FNAM
                                WA_MMC2-IDNRK.


        CONCATENATE 'RC29P-MENGE('IDX')' INTO FNAM.
        perform bdc_field       using  FNAM
                               WA_MMC2-MENGE.

        CONCATENATE 'RC29P-POSTP('IDX')' INTO FNAM.
        perform bdc_field       using  FNAM
                                'L'.

        perform bdc_dynpro      using 'SAPLCSDI' '0130'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '/00'.
        perform bdc_dynpro      using 'SAPLCSDI' '0131'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '/00'.
        IDX = IDX + 1.
      ENDLOOP.
      perform bdc_dynpro      using 'SAPLCSDI' '0140'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29P-POSNR(01)'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=FCBU'.
      perform bdc_transaction using 'CS02'.
    ENDLOOP.
  ENDIF.

*  ****************************************


*  Delete  Component
  IF IT_MM04[] IS NOT INITIAL.

    REFRESH IT_MM03.
    IT_MM03 = IT_MM04.

    SORT IT_MM04 BY MATNR IDNRK EXIST.
    REFRESH: IT_MMC4.
    IT_MMC4 = IT_MM04.

    SORT IT_MM04 BY MATNR.
    DELETE ADJACENT DUPLICATES FROM IT_MM04 COMPARING MATNR.

    SORT IT_MM04 BY MATNR.
    SORT IT_MMC4 BY MATNR DATUV IDNRK.
    LOOP AT IT_MM04 INTO WA_MM04 WHERE EXIST = 'D'.
      perform bdc_dynpro      using 'SAPLCSDI' '0100'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29N-DATUV'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '/00'.
      perform bdc_field       using 'RC29N-MATNR'
                                    WA_MM04-MATNR.
      perform bdc_field       using 'RC29N-WERKS'
                                    '1000'.
      perform bdc_field       using 'RC29N-STLAN'
                                    '5'.
      perform bdc_field       using 'RC29N-DATUV'
                                    WA_MM04-DATUVC.
      perform bdc_field       using 'RC29N-STLAL'
                                    WA_MM04-ALTBOM.


      CLEAR: WA_MMC4.
      SORT IT_MMC4 BY MATNR IDNRK.
      LOOP AT IT_MMC4 INTO WA_MMC4 WHERE MATNR = WA_MM04-MATNR.
        perform bdc_dynpro      using 'SAPLCSDI' '0150'.
        perform bdc_field       using 'BDC_CURSOR'
                                      'RC29P-POSNR(01)'.

        perform bdc_field       using 'BDC_OKCODE'
                                     '=SETP'.
        perform bdc_dynpro      using 'SAPLCSDI' '0708'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '=CLWI'.
        perform bdc_field       using 'BDC_CURSOR'
                                      'RC29P-SELID'.
        perform bdc_field       using 'RC29P-SELID'
                                      WA_MMC4-IDNRK. "'BRC1C62'.
        perform bdc_dynpro      using 'SAPLCSDI' '0150'.
        perform bdc_field       using 'BDC_CURSOR'
                                      'RC29P-AUSKZ(01)'.
        perform bdc_field       using 'RC29P-AUSKZ(01)'
                                      'X'.
        perform bdc_field       using 'BDC_OKCODE'
                                      '=FCDL'.
      ENDLOOP.

      perform bdc_dynpro      using 'SAPLCSDI' '0150'.
      perform bdc_field       using 'BDC_CURSOR'
                                    'RC29P-POSNR(01)'.
      perform bdc_field       using 'BDC_OKCODE'
                                    '=FCBU'.
      perform bdc_transaction using 'CS02'.
    ENDLOOP.
  ENDIF.

* ******************************************

  MESSAGE ' ' TYPE 'S'.

*  Process Data
  IF IT_MM01[] IS NOT INITIAL.
    PERFORM Modify_data.
  ENDIF.

  IF IT_MM02[] IS NOT INITIAL.
    PERFORM MODIFY_MM02.
  ENDIF.

  IF IT_MM04[] IS NOT INITIAL.
    PERFORM MODIFY_MM03.
  ENDIF.

*Check Create or Update, Success or Not
  LOOP AT IT_MMXX INTO WA_MMXX.
    SELECT SINGLE MATNR
    FROM MARA INTO MARA-MATNR
    WHERE MATNR EQ WA_MMXX-MATNR.
    IF SY-SUBRC NE 0.
      WA_MMXX-TRF_LIGHT = '1'.
    ENDIF.
    MODIFY IT_MMXX FROM WA_MMXX.
  ENDLOOP.

  SORT IT_MMXX BY MATNR POSNR IDNRK.

*  Save to table
  PERFORM SAVE_TABLE.
ENDFORM.                    " PROS_DATA
*&---------------------------------------------------------------------*
*&      Form  END_VIEW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM END_VIEW_DATA .  "Sini
  rs_selfield-refresh = abap_true.
  PERFORM build_fieldcat.
  PERFORM l_build_layout.
  PERFORM display.
ENDFORM.                    " END_VIEW_DATA
*&---------------------------------------------------------------------*
*&      Form  FIRST_VIEW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FIRST_VIEW_DATA .
  PERFORM  build_fieldcat_ist.
  PERFORM  l_build_layout_ist.
  PERFORM  display_ist.
ENDFORM.                    " FIRST_VIEW_DATA
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_IST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPLAY_IST.
  d_repid = sy-repid.
  Call function 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = d_repid
      i_callback_pf_status_set = 'STAT_SET'
      i_callback_user_command  = 'USER_COMMAND'
      it_fieldcat              = t_fldcat[]
      it_sort                  = t_sort[]
      is_layout                = x_layout
      i_default                = ''
      i_save                   = ''
    TABLES
      t_outtab                 = IT_MM01[]
    EXCEPTIONS
      program_error            = 1
      others                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " DISPLAY_IST
*&---------------------------------------------------------------------*
*&      Form  L_BUILD_LAYOUT_IST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM L_BUILD_LAYOUT_IST .
  x_layout-colwidth_optimize  = 'X'.
  x_layout-info_fieldname     = 'LINE_COLOR'.
  x_layout-def_status         = 'X'.
  x_layout-lights_fieldname  = 'TRF_LIGHT'.
  x_layout-lights_tabname    = 'I_LIGHTS'.

ENDFORM.                    " L_BUILD_LAYOUT_IST
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT_IST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT_IST.
  f_fldcat 'MATNR' '' 'Material Bom' '' 'L' ''  'CHAR' '' '' .
  f_fldcat 'IDNRK' '' 'Material Component' '' 'L' ''  'CHAR' '' '' .
  f_fldcat 'MENGE' '' 'Quantity' '' 'L' ''  'CHAR' '' '' .
  f_fldcat 'DATUV' '' 'Valid From' '' 'L' ''  'DATS' '' '' .
  f_fldcat 'ALTBOM' '' 'Alternative Bom' '' 'L' ''  'CHAR' '' '' .
  f_fldcat 'STATUS' '' 'Status' '' 'L' '' 'CHAR' '' ''.
  CLEAR S_FLDCAT.
ENDFORM.                    " BUILD_FIELDCAT_IST

*&---------------------------------------------------------------------*
*&      Form  f_status_set
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM stat_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZALV2'.
ENDFORM.                    "stat_set
*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM    text
*      -->P_SELFIELD text
*----------------------------------------------------------------------*
FORM USER_COMMAND  USING p_ucomm    LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.
  CASE p_ucomm.
    WHEN '&PRO'.
      PERFORM PROS_DATA.
      PERFORM END_VIEW_DATA.
    WHEN '&BACK'.
      LEAVE TO SCREEN 0.
    WHEN '&EXIT'.
      LEAVE TO SCREEN 0.
    WHEN '&CNCL'.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDFORM.                    "USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM    text
*      -->P_SELFIELD text
*----------------------------------------------------------------------*
FORM USR_CMD USING p_ucomm    LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.
  CASE p_ucomm.
    WHEN '&BACK'.
      SUBMIT Z_DID_SD_CRT_COM via SELECTION-SCREEN.
  ENDCASE.
ENDFORM.                    "USER_COMMAND
*&---------------------------------------------------------------------*
*&      Form  MODIFY_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_SCREEN .

  LOOP AT SCREEN.
    IF RB_UP = 'X' .
      IF screen-name = 'PDIRP' OR  screen-name = 'P_PSAVEP'.
        screen-input = '0'.
        MODIFY SCREEN.
      ENDIF.
      CLEAR : PDIRP,P_PSAVEP.
    ELSEIF RB_TMP = 'X' .
      IF screen-name = 'P_FNAME'.
        screen-input = '0'.
        P_PSAVEP = 'BOM-COMP Master.xls'.
        MODIFY SCREEN.
      ENDIF.
      CLEAR: P_FNAME.
    ELSEIF RB_DWN = 'X'.
      IF screen-name = 'P_FNAME' OR screen-name = 'PDIRP' OR  screen-name = 'P_PSAVEP'.
        screen-input = '0'.
        MODIFY SCREEN.
      ENDIF.
    ELSE.
      IF screen-name = 'PDIRP' OR  screen-name = 'P_PSAVEP'.
        screen-input = '0'.
        MODIFY SCREEN.
      ENDIF.
      CLEAR: PDIRP,P_PSAVEP.
    ENDIF.

  ENDLOOP.
ENDFORM.                    " MODIFY_SCREEN
*&---------------------------------------------------------------------*
*&      Form  SAVE_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SAVE_TABLE .

  SELECT MAX( CNTRL ) FROM ZTB_BOM_UPL_LOG INTO CNTR_NO.

  LINE_NO = 1.
  LINE_NO  = LINE_NO + CNTR_NO.

  LOOP AT  IT_MMXX INTO WA_MMXX WHERE TRF_LIGHT NE '1'.
    ZTB_BOM_UPL_LOG-MATNR = WA_MMXX-MATNR.
    ZTB_BOM_UPL_LOG-CNTRL = LINE_NO.
    ZTB_BOM_UPL_LOG-IDNRK = WA_MMXX-IDNRK.
    ZTB_BOM_UPL_LOG-MENGE = WA_MMXX-MENGE.
    ZTB_BOM_UPL_LOG-MEINS = WA_MMXX-MEINS.
    ZTB_BOM_UPL_LOG-DATUV = WA_MMXX-DATUV.
    ZTB_BOM_UPL_LOG-USNAM = SY-UNAME.
    ZTB_BOM_UPL_LOG-CPUDT = SY-DATUM.
    LINE_NO  = LINE_NO + 1.
    INSERT ZTB_BOM_UPL_LOG.
  ENDLOOP.

ENDFORM.                    " SAVE_TABLE
*&---------------------------------------------------------------------*
*&      Form  MODIFY_MM03
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_MM03 .
  REFRESH IT_MAT.
  IF IT_MMC4 IS NOT INITIAL.
    SELECT MAST~MATNR MAST~WERKS  MAST~STLAN MAST~STLNR MAST~STLAL  MAST~ANDAT
             STPO~STLKN STPO~DATUV IDNRK STPO~POSNR STPO~MEINS STPO~MENGE
             MAKT~MAKTX
         INTO CORRESPONDING FIELDS OF TABLE IT_MAT
         FROM MAST
         INNER JOIN STPO AS STPO ON STPO~STLNR = MAST~STLNR
         INNER JOIN MAKT AS MAKT ON MAKT~MATNR = STPO~IDNRK
        FOR ALL ENTRIES IN IT_MMC4
         WHERE MAST~MATNR EQ IT_MMC4-MATNR
          AND STPO~IDNRK EQ IT_MMC4-IDNRK
          AND MAST~STLAL EQ IT_MMC4-ALTBOM.
  ENDIF.
    SORT IT_MMC4 BY MATNR IDNRK.
    LOOP AT IT_MMC4 INTO WA_MMC4.
      WA_MMC4-MSGE = 'Delete Bom Component Completed'.
      WA_MMC4-TRF_LIGHT = '3'.  "Green
      MODIFY IT_MMC4 FROM WA_MMC4.
      MOVE-CORRESPONDING WA_MMC4 TO WA_MMXX.
      APPEND WA_MMXX TO IT_MMXX.
    ENDLOOP.
ENDFORM.                    " MODIFY_MM03

Update Order Master to Complete BUCO


Sample Program Update Order BUCO :



REPORT  Z_CS_DWN_IW32 .

TABLES: AUFK,JEST.
*        MARC,MVKE,MARA,KLAH,CABN ,
*        A100,KONP,SSCRFIELDS,A902,A604,A614,KONM,A305,MAST.

TYPE-POOLS: SLIS.

DATA : NO(2) TYPE P.

DATA: it_folder   LIKE STANDARD TABLE OF sdokpath,
      it_file     LIKE STANDARD TABLE OF sdokpath,
      it_fol_fil  LIKE STANDARD TABLE OF sdokpath,
      wa_fol_fil  LIKE sdokpath,
      file_count  TYPE i,
      dir_count   TYPE i.

DATA : BEGIN OF it_join_fields OCCURS 0,
         field_name(20),
       END OF it_join_fields.

DATA : BEGIN OF it_data OCCURS 0,
         AUFNR(018),
         LINE(100),
         AUART(010),
      END OF it_data.

TYPES : BEGIN OF TY_ORDO,
          AUFNR(18)," TYPE AUFK-AUFNR,
          OBJNR TYPE OBJNR,
          AUART LIKE AUFK-AUART,
          STAT TYPE JEST-STAT,
          LINE  LIKE  BSVX-STTXT,
          USER_LINE  LIKE  BSVX-STTXT,

          STATUS(60),
        END OF TY_ORDO.

DATA :IT_ORDO TYPE TABLE OF TY_ORDO,
      WA_ORDO TYPE TY_ORDO.

*----------------------------------------------------------------------*
*   data definition
*----------------------------------------------------------------------*
*       Batchinputdata of single transaction
DATA:   BDCDATA LIKE BDCDATA    OCCURS 0 WITH HEADER LINE.
*       messages of call transaction
DATA:   MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
*       error session opened (' ' or 'X')

DATA:  BEGIN OF IT_MESSTAB OCCURS 0 .
        INCLUDE STRUCTURE BDCMSGCOLL.
DATA:  AUFNR TYPE AUFK-AUFNR.
DATA:  MESS(15).
DATA:  L_MSTRING(480) TYPE C.
DATA:  END OF IT_MESSTAB,

*      IT_AUSP TYPE TABLE OF TY_AUSP,
*      WA_AUSP TYPE TY_AUSP,
      TABLE_N TYPE I ,
      T_FLDCAT     TYPE SLIS_T_FIELDCAT_ALV,
      S_FLDCAT     TYPE SLIS_FIELDCAT_ALV,
      T_SORT       TYPE SLIS_T_SORTINFO_ALV," WITH HEADER LINE,
      WA_SORTINFO TYPE SLIS_SORTINFO_ALV,
      X_LAYOUT     TYPE SLIS_LAYOUT_ALV,
      GD_LAYOUT    TYPE LVC_S_LAYO,
      X_PRINT      TYPE SLIS_PRINT_ALV,
      X_VARIANT    TYPE DISVARIANT,
      D_REPID      TYPE SY-REPID,
      CT_TYPE(2) ,
      F_FLDCAT2 TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
      G_LAYOUT TYPE SLIS_LAYOUT_ALV,
      GS_FIELDCATALOG TYPE LVC_S_FCAT OCCURS 0,
      GV_FCAT LIKE LINE OF GS_FIELDCATALOG,
      GUS_FIELDCATALOG TYPE LVC_S_FCAT OCCURS 0,
     it_alv_hedr       TYPE TABLE OF slis_listheader
                        INITIAL SIZE 0,          "ALVHEADER
     st_alv_hedr       TYPE slis_listheader,

     st_alv_layt       TYPE slis_layout_alv,         "ALVLEYOUT

     it_alv_fcat       TYPE TABLE OF slis_fieldcat_alv
                               INITIAL SIZE 0,
     st_alv_fcat       TYPE slis_fieldcat_alv,

     it_alv_sort       TYPE TABLE OF slis_sortinfo_alv
                               INITIAL SIZE 0,
     st_alv_sort       TYPE slis_sortinfo_alv,
     st_disvariant     TYPE slis_vari.
DATA:  gd_scftx TYPE smp_dyntxt.   "function key 1 properties

DATA : OK_CODE TYPE SY-UCOMM,
       SAVE_OK LIKE OK_CODE,
       OUTPUT  LIKE OK_CODE.
DATA:
       t_stpo_read like STPO_API02 occurs 0 with header line,
       t_stpo_data like STPO_API02 occurs 0 with header line,
       t_stpo_update like STPO_API03 occurs 0 with header line,
       i_stko LIKE stko_api01," OCCURS 0 WITH HEADER LINE,
       T_STKO LIKE STKO_API02 OCCURS 0 WITH HEADER LINE,
       wrk_date like CSAP_MBOM-DATUV.

DATA: AUFK_LINES TYPE I,
      GD_PERCENT TYPE I.

SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
      S_AUFNR FOR AUFK-AUFNR ,
      S_AUART FOR AUFK-AUART OBLIGATORY,
      S_ERDAT FOR AUFK-ERDAT,
      S_VAPLZ FOR AUFK-VAPLZ.
*SELECTION-SCREEN SKIP 1.
*PARAMETERS : C_TECO AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK BLOCK1.

SELECTION-SCREEN BEGIN OF SCREEN 0100 AS WINDOW TITLE txtblk03.
PARAMETERS:  p_pdirp   TYPE pfeflnamel DEFAULT 'C:\',
             psavep    TYPE string DEFAULT 'Order.XLS'.
SELECTION-SCREEN END OF SCREEN 0100.

*AT SELECTION-SCREEN OUTPUT.
*  PERFORM MODIFY_SCREEN.

*F4 for Getting Directory Path
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pdirp.
  DATA: fname TYPE string.

  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Select Directory'
    CHANGING
      selected_folder      = fname
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  p_pdirp = fname.

*F4 for Getting File Path and Name
AT SELECTION-SCREEN ON VALUE-REQUEST FOR psavep.

  DATA: filename TYPE string,
        path TYPE string.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = 'Select path and file name'
      default_extension    = 'XLS'
    CHANGING
      filename             = filename
      path                 = path
      fullpath             = psavep
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

INITIALIZATION.
  PERFORM INIT.
  txtblk03 = 'Download File'.
  psavep   = 'Order.XLS'.


START-OF-SELECTION.

  PERFORM FILL_DATA.
  PERFORM VIEW_DATA.
*  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FILL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FILL_DATA .

  DATA : DG_OBJNR TYPE AUFK-OBJNR.

* Append Data to Itab.
  REFRESH IT_DATA.
  IT_DATA-AUFNR = 'Material Bom'.
  IT_DATA-LINE  = 'System User'.
  IT_DATA-AUART = 'Order Type'.
  APPEND IT_DATA.CLEAR IT_DATA.

*  First Step and .

  REFRESH IT_ORDO.
  SELECT AUFK~AUFNR AUFK~OBJNR AUFK~AUART JEST~STAT
    INTO CORRESPONDING FIELDS OF TABLE IT_ORDO
    FROM AUFK
    INNER JOIN JEST AS JEST ON JEST~OBJNR = AUFK~OBJNR
   WHERE AUFK~AUFNR IN S_AUFNR
     AND AUFK~AUART IN S_AUART
     AND AUFK~ERDAT IN S_ERDAT
     AND AUFK~VAPLZ IN S_VAPLZ
     AND JEST~INACT NE 'X'
     AND JEST~STAT = 'I0046'.

  table_n = 0.
  DESCRIBE TABLE IT_ORDO LINES table_n.
  IF table_n EQ 0.
    CALL FUNCTION 'C14A_POPUP_NO_HITS'.
    STOP.
  ENDIF.

*  SORT IT_ORDO BY AUFNR.
*  DELETE ADJACENT DUPLICATES FROM IT_ORDO COMPARING AUFNR.
*
  LOOP AT IT_ORDO INTO WA_ORDO.

    DG_OBJNR = WA_ORDO-OBJNR.

    CALL FUNCTION 'STATUS_TEXT_EDIT'
      EXPORTING
       FLG_USER_STAT           = 'X'
        OBJNR                   = DG_OBJNR  "WA_OR02-OBJNR
        SPRAS                   = sy-langu
     IMPORTING
*       ANW_STAT_EXISTING       =
*       E_STSMA                 =
       LINE                    =  WA_ORDO-LINE
       USER_LINE               =  WA_ORDO-USER_LINE
*       STONR                   =
*     EXCEPTIONS
*       OBJECT_NOT_FOUND        = 1
*       OTHERS                  = 2
              .
    IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    MODIFY IT_ORDO FROM WA_ORDO.
  ENDLOOP.

*  Change using IW32
  Perform Proses.
*  `WAIT UP TO 30 SECONDS.
  Perform lst_view.


*  SORT IT_ORDO BY ORDONR POSNR.
  LOOP AT IT_ORDO INTO WA_ORDO.
    CONCATENATE '="'  WA_ORDO-AUFNR '"' INTO WA_ORDO-AUFNR.
    MOVE-CORRESPONDING WA_ORDO TO IT_DATA.
    APPEND IT_DATA.
  ENDLOOP.

  SORT IT_ORDO BY AUFNR.
*  SORT IT_DATA BY AUFNR.

ENDFORM.                    " FILL_DATA
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWNLOAD .

  Concatenate p_Pdirp '\' psavep INTO psavep.

  IF IT_DATA[] IS NOT INITIAL.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        filename                = psavep " Path and Name of Excel File with Extension .xls
        write_field_separator   = 'X'
*          FILETYPE                      = 'ASC'
      TABLES
        data_tab                = it_data " Internal Table having all Name of Folders and Files
*        fieldnames              = it_join_fields
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        OTHERS                  = 22.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ELSE.
    MESSAGE: 'No file found in the selected Directory' TYPE 'I'.
  ENDIF.
ENDFORM.                    " DOWNLOAD
*&---------------------------------------------------------------------*
*&      Form  MODIFY_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_SCREEN .
  LOOP AT SCREEN.
    IF screen-name = 'pdirp'.
      screen-input = '0'.
      PSAVEP = 'Material Master.xls'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " MODIFY_SCREEN
*&---------------------------------------------------------------------*
*&      Form  VIEW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM VIEW_DATA .

* Display Message Upload.
  PERFORM build_fieldcat.
  PERFORM L_build_layout.
  .
  SORT IT_ORDO BY AUFNR.
  PERFORM View.

ENDFORM.                    " VIEW_DATA
*&---------------------------------------------------------------------*
*&      Form  INIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM INIT .
  DEFINE f_fldcat.
    clear s_fldcat.
    s_fldcat-fieldname = &1.
    s_fldcat-decimals_out  = &2.
    s_fldcat-seltext_l = &3.
    s_fldcat-outputlen  = &4.
    s_fldcat-just      = &5.
    s_fldcat-no_out    = &6.
    s_fldcat-datatype  = &7.
    s_fldcat-cfieldname = &8.
    s_fldcat-no_zero  = &9.
*    s_fldcat-outputlen  = &10.

    append s_fldcat to t_fldcat.
  END-OF-DEFINITION.
ENDFORM.                    " INIT
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT .
*           *  *             1     2  3           4   5  6  7      8  9
  f_fldcat 'AUFNR' '' 'Order' '' 'L' ''  'CHAR' '' '' .
  f_fldcat 'LINE' '' 'System User' '' 'L' ''  'CHAR' '' '' .
  f_fldcat 'AUART' '' 'Order Type' '' 'L' '' 'CHAR' '' ''.
  f_fldcat 'STATUS' '' 'Status' '' 'L' '' 'CHAR' '' ''.
  CLEAR S_FLDCAT.

ENDFORM.                    " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  L_BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM L_BUILD_LAYOUT .
  x_layout-colwidth_optimize  = 'X'.
  x_layout-info_fieldname     = 'LINE_COLOR'.
  x_layout-def_status         = 'X'.
ENDFORM.                    " L_BUILD_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  VIEW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM VIEW .
  d_repid = sy-repid.
  Call function 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = d_repid
      i_callback_pf_status_set = 'F_STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
      it_fieldcat        = t_fldcat[]
      it_sort            = t_sort[]
      is_layout          = x_layout
*        i_default          = 'X'
        i_save             = 'A'
*        is_variant         = x_variant
*        it_event_exit      = t_event_exit[]
*        is_print           = x_print
    TABLES
      t_outtab           = IT_ORDO[]
    EXCEPTIONS
      program_error      = 1
      others             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " VIEW

*&---------------------------------------------------------------------*
*&      Form  f_status_set
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM f_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZALVV'.
ENDFORM.                    "f_status_set

"stat_set
*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_UCOMM    text
*      -->P_SELFIELD text
*----------------------------------------------------------------------*
FORM USER_COMMAND  USING p_ucomm    LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.
  CASE p_ucomm.
    WHEN '&DWN'.
      CLEAR: p_pdirp,psavep. .
      CALL SCREEN 0101 STARTING AT 10 05.
  ENDCASE.

ENDFORM.                    "USER_COMMAND
*&---------------------------------------------------------------------*
*&      Module  PF_STATUS  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PF_STATUS OUTPUT.
  SET PF-STATUS 'Z_ST_ALV'.
ENDMODULE.                 " PF_STATUS  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0101  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0101 OUTPUT.
  SET PF-STATUS 'Z_ST_ALV'.
*  SET TITLEBAR 'xxx'.

  PERFORM MODIFY_SCREEN_101.

ENDMODULE.                 " STATUS_0101  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0101  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0101 INPUT.

  CASE SY-UCOMM.
    WHEN '&EXEC'.
      IF p_pdirp is not INITIAL AND psavep is not initial.
*        PERFORM DOWNLOAD.
        MESSAGE: 'Can Not Download ' TYPE 'S'.
        LEAVE TO SCREEN 0.
      ELSE.
        MESSAGE: 'Folder and File Name Cannot Empty ' TYPE 'S'.
      ENDIF.
    WHEN 'G_FIND'.
      PERFORM FIND.
    WHEN '&CANC'.
      LEAVE TO SCREEN 0 .
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0101  INPUT
*&---------------------------------------------------------------------*
*&      Form  MODIFY_SCREEN_101
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_SCREEN_101 .
  LOOP AT SCREEN.
    IF screen-name = 'OK_CODE'." 'pdirp'.
      screen-input = '0'.
*      P_PDIRP = 'D:\'.
      PSAVEP = 'Order.xls'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " MODIFY_SCREEN_101
*&---------------------------------------------------------------------*
*&      Form  FIND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FIND .
  DATA: fname TYPE string.

  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Select Directory'
    CHANGING
      selected_folder      = fname
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  p_pdirp = fname.

ENDFORM.                    " FIND
*&---------------------------------------------------------------------*
*&      Form  PROSES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PROSES .
*  DATA: AUFK_LINES TYPE I,
*        GD_PERCENT TYPE I.


  SORT IT_ORDO BY AUFNR.
  DELETE ADJACENT DUPLICATES FROM IT_ORDO COMPARING AUFNR.

*  CHECK SY-SUBRC EQ 0.
  DESCRIBE TABLE IT_ORDO LINES AUFK_LINES.
*  AUFK_LINES = SY-DBCNT.
  CLEAR: GD_PERCENT.


  SORT IT_ORDO BY AUFNR .
  LOOP AT IT_ORDO INTO WA_ORDO.
    PERFORM PROGRESS_BAR USING '         Retrieving data...'(001)
                               SY-TABIX
                               AUFK_LINES.


    perform bdc_dynpro      using 'SAPLCOIH' '0101'.
    perform bdc_field       using 'BDC_CURSOR'
                                  'CAUFVD-AUFNR'.
    perform bdc_field       using 'BDC_OKCODE'
                                  '/00'.
    perform bdc_field       using 'CAUFVD-AUFNR'
                                  WA_ORDO-AUFNR.
    perform bdc_dynpro      using 'SAPLCOIH' '3000'.
    perform bdc_field       using 'BDC_OKCODE'
                                   '=BBAB'.
    perform bdc_field       using 'BDC_CURSOR'
                                  'CAUFVD-KTEXT'.

    perform bdc_dynpro      using 'SAPLCOIH' '3000'.
    perform bdc_field       using 'BDC_OKCODE'
                                  '=BU'.
    perform bdc_field       using 'BDC_CURSOR'
                                  'CAUFVD-KTEXT'.
    perform bdc_transaction using 'IW32'.

*    WAIT UP TO 5 SECONDS.

  ENDLOOP.

  MESSAGE '       ' TYPE 'S'.

ENDFORM.                    " PROSES


*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
  CLEAR BDCDATA.
  BDCDATA-PROGRAM  = PROGRAM.
  BDCDATA-DYNPRO   = DYNPRO.
  BDCDATA-DYNBEGIN = 'X'.
  APPEND BDCDATA.
ENDFORM.                    "BDC_DYNPRO

*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
  IF FVAL <> SPACE. "NODATA.
    CLEAR BDCDATA.
    BDCDATA-FNAM = FNAM.
    BDCDATA-FVAL = FVAL.
    APPEND BDCDATA.
  ENDIF.
ENDFORM.                    "BDC_FIELD


*----------------------------------------------------------------------*
*        Start new transaction according to parameters                 *
*----------------------------------------------------------------------*
FORM BDC_TRANSACTION USING TCODE.
  DATA: L_MSTRING(480).
  DATA: L_SUBRC LIKE SY-SUBRC.
  REFRESH MESSTAB.
  CALL TRANSACTION TCODE USING BDCDATA
                   MODE  'N' " 'N' "'A' "CTUMODE
                   UPDATE 'L' "'L' "'S' "CUPDATE
                   MESSAGES INTO MESSTAB.

  LOOP AT MESSTAB.
    MESSAGE ID     MESSTAB-MSGID
            TYPE   MESSTAB-MSGTYP
            NUMBER MESSTAB-MSGNR
            INTO L_MSTRING
            WITH MESSTAB-MSGV1
                 MESSTAB-MSGV2
                 MESSTAB-MSGV3
                 MESSTAB-MSGV4.

    IT_MESSTAB-MSGTYP = MESSTAB-MSGTYP.
    IT_MESSTAB-MSGV1 = MESSTAB-MSGV1.
    IT_MESSTAB-MSGV2 = MESSTAB-MSGV2.
    IF MESSTAB-MSGV2 IS NOT INITIAL.
      IT_MESSTAB-MSGV1 = MESSTAB-MSGV2.
    ENDIF.
    IT_MESSTAB-MSGV3 = MESSTAB-MSGV3.
    IT_MESSTAB-MSGV4 = MESSTAB-MSGV4.
    IT_MESSTAB-L_MSTRING = L_MSTRING.

    APPEND IT_MESSTAB .
  ENDLOOP.

  REFRESH BDCDATA.
ENDFORM.                    "BDC_TRANSACTION
*&---------------------------------------------------------------------*
*&      Form  LST_VIEW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM LST_VIEW.
  LOOP AT IT_MESSTAB.
    IT_MESSTAB-AUFNR = IT_MESSTAB-AUFNR.
    IT_MESSTAB-MESS = IT_MESSTAB-L_MSTRING+6(5).
    MODIFY  IT_MESSTAB.
  ENDLOOP.


  SORT IT_MESSTAB BY MESS.
  DELETE IT_MESSTAB WHERE MESS NE 'saved'.
  SORT IT_MESSTAB BY MSGV1.

  SORT IT_ORDO BY AUFNR.
  SORT IT_MESSTAB BY MSGV1.
  IF IT_MESSTAB IS NOT INITIAL.
    LOOP AT IT_ORDO INTO WA_ORDO.
      READ TABLE IT_MESSTAB WITH KEY MSGV1 = WA_ORDO-AUFNR BINARY SEARCH.

      IF SY-SUBRC EQ 0.
        WA_ORDO-STATUS = 'Updated'.
          REPLACE ALL OCCURRENCES OF 'CLSD' IN WA_ORDO-LINE WITH 'TECO'.
      ELSE.
        WA_ORDO-STATUS = 'Not Update'.
      ENDIF.

      MODIFY IT_ORDO FROM WA_ORDO.
    ENDLOOP.

  ENDIF.

*  LOOP AT IT_ORDO INTO WA_ORDO.
*    MOVE-CORRESPONDING WA_ORDO TO WA_MMXX.
*    APPEND WA_MMXX TO IT_MMXX.
*  ENDLOOP.
ENDFORM.                    " LST_VIEW
*&---------------------------------------------------------------------*
*&      Form  PROGRESS_BAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_1177   text
*      -->P_SY_TABIX  text
*      -->P_AUFK_LINES  text
*----------------------------------------------------------------------*
FORM PROGRESS_BAR  USING    P_VALUE
                            P_SY-TABIX
                            P_NLINES.
DATA: W_TEXT(40),
      W_PERCENTAGE TYPE P,
      W_PERCENT_CHAR(3).

  W_PERCENTAGE = ( P_SY-TABIX / P_NLINES ) * 100.
  W_PERCENT_CHAR = W_PERCENTAGE.
  SHIFT W_PERCENT_CHAR LEFT DELETING LEADING ' '.
  CONCATENATE P_VALUE W_PERCENT_CHAR '% Complete'(002) INTO W_TEXT.
* This check needs to be in otherwise when looping around big tables
* SAP will re-display indicator too many times causing report to run
* very slow. (No need to re-display same percentage anyway)
  IF W_PERCENTAGE GT GD_PERCENT OR P_SY-TABIX EQ 1.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        PERCENTAGE = W_PERCENTAGE
        TEXT       = W_TEXT.
    GD_PERCENT = W_PERCENTAGE.
  ENDIF.

ENDFORM.                    " PROGRESS_BAR

Visitor

Code Syntax Try...Endtry

  Code : Report Try. Parameters  NUMBER  type  I . data  RESULT  type  P  decimals  2 . data  OREF  type  ref  to  CX_ROOT . data  TEXT  typ...