Tuesday, 14 February 2012

Lights in ABAP

  DATA : gcf_reds(4)        TYPE c           VALUE '@0A@'," For red light
       gcf_gre(4)         TYPE c           VALUE '@08@'" For green light
       gcf_yel(4)         TYPE c           VALUE '@09@'" For yellow light


Thursday, 9 February 2012

BDC program

  FORM bdc_rec1 .

  PERFORM bdc_dynpro      USING 'SAPMJ1ID' '0200'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RB1'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=EX'.
  PERFORM bdc_field       USING 'RB11'
                                ''.
  PERFORM bdc_field       USING 'RB1'
                                'X'.
  PERFORM bdc_dynpro      USING 'SAPLJ1I5' '0020'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'J_1IMTCHID-MATNR(01)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=NEWL'.
  PERFORM bdc_dynpro      USING 'SAPLJ1I5' '0020'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'J_1IMTCHID-J_1ICHID(01)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=SAVE'.
  PERFORM bdc_field       USING 'J_1IMTCHID-MATNR(01)'
                                gds_matcin-matnr.
  PERFORM bdc_field       USING 'J_1IMTCHID-WERKS(01)'
                                gds_matcin-werks.
  PERFORM bdc_field       USING 'J_1IMTCHID-J_1ICHID(01)'
                                gds_matcin-j_1ichid.
  PERFORM bdc_field       USING 'J_1IMTCHID-J_1ISUBIND(01)'
                                gds_matcin-j_1isubind.
  PERFORM bdc_field       USING 'J_1IMTCHID-J_1ICAPIND(01)'
                                gds_matcin-j_1icapind.
  PERFORM bdc_field       USING 'J_1IMTCHID-J_1IGRXREF(01)'
                                gds_matcin-j_1igrxref.
  PERFORM bdc_dynpro      USING 'SAPLJ1I5' '0020'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'J_1IMTCHID-MATNR(02)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=BACK'.
  PERFORM bdc_dynpro      USING 'SAPLJ1I5' '0020'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'J_1IMTCHID-MATNR(02)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=BACK'.
  PERFORM bdc_dynpro      USING 'SAPMJ1ID' '0200'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '/EEXIT'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'EXCISE'.

  gds_ctuparams-dismode  = gcf_ctu_mode.
  gds_ctuparams-updmode  = gcf_ctu_update1.

  CALL TRANSACTION gcf_tcode_j1id USING         gdt_bdcdata
                                OPTIONS  FROM gds_ctuparams
                                MESSAGES INTO gdt_msgtab. "#EC CI_CALLTA

  REFRESH : gdt_bdcdata.
 "to get the records whcih are being uploaded along with the comments
  "which says whether it is successful or unsuccessful
  PERFORM log_report_masterdata.



ENDFORM.                                                    " BDC_REC1
*&------------------------------------


  FORM log_report_masterdata .

  MOVE-CORRESPONDING gds_matcin TO gds_matcin2.
  CLEAR : gdf_comments,
          gds_msgtab.

  LOOP AT gdt_msgtab INTO gds_msgtab.

    IF gds_msgtab-msgtyp  EQ gcf_e.

      CALL FUNCTION 'FORMAT_MESSAGE'
        EXPORTING
          id        = gds_msgtab-msgid
          lang      = sy-langu
          no        = gds_msgtab-msgnr
          v1        = gds_msgtab-msgv1
          v2        = gds_msgtab-msgv2
          v3        = gds_msgtab-msgv3
          v4        = gds_msgtab-msgv4
        IMPORTING
          msg       = gds_retab-message
        EXCEPTIONS
          not_found = 1
          OTHERS    = 2.
      IF sy-subrc EQ 0.
***** splitting the message at semicolon
        SPLIT gds_retab-message
        AT gcf_semicolon
        INTO gds_retab-message
             gdf_temp.
        IF gdf_comments IS NOT INITIAL.
          CONCATENATE gdf_comments gcf_dot
          INTO gdf_comments.
        ENDIF.
        CONCATENATE gdf_comments gds_retab-message
        INTO gdf_comments.
      ENDIF.
    ENDIF.
   ENDLOOP.
*****  reading the table with messages with type error
  SORT gdt_msgtab by msgtyp.
  READ TABLE gdt_msgtab
  INTO gds_msgtab
  WITH KEY msgtyp = gcf_e
  BINARY SEARCH.

  IF sy-subrc EQ 0.
    gds_matcin2-status   = gcf_e.
    gds_matcin2-comments = gdf_comments.
    gdf_unsuccess = gdf_unsuccess + 1."total unsuccessful records
  ELSE.
    gds_matcin2-status = gcf_s.
    gds_matcin2-comments = 'Success'(401) .
    gdf_success = gdf_success + 1."total successful records
  ENDIF.


  APPEND gds_matcin2 TO gdt_matcin2.
   CLEAR gds_matcin2.
   REFRESH gdt_msgtab.
ENDFORM.                    " LOG_REPORT_MASTERDATA


************************************************
Example 2 : Having table control
************************************************
REPORT  zev05r0001 NO STANDARD PAGE HEADING LINE-SIZE 170 LINE-COUNT 58.

*&---------------- ---------------------------------------------------*
* Data declaration
*&--------------------------------------------------------------------*
TYPE-POOLS: truxs,
            slis.

TYPES : BEGIN OF gts_intab,
        auart LIKE vbak-auart,
        vkorg LIKE vbak-vkorg,
        vtweg LIKE vbak-vtweg,
        spart LIKE vbak-spart,
        ktext LIKE vbak-ktext,
*        guebg LIKE vbak-guebg,
*        gueen LIKE vbak-gueen,
        guebg(10) TYPE c,
        gueen(10) TYPE c,
        matnr LIKE vbap-matnr,
*        zmeng LIKE vbap-zmeng,
        zmeng(13) TYPE c,
        zieme LIKE vbap-zieme,
        zzsur LIKE vbak-zzsur,
        zzstp LIKE vbak-zzstp,
        zzotp LIKE vbak-zzotp,
        zzsid LIKE vbak-zzsid,
        END OF gts_intab.

TYPES : BEGIN OF gts_header,    " structure to hold header data
        auart LIKE vbak-auart,
        vkorg LIKE vbak-vkorg,
        vtweg LIKE vbak-vtweg,
        spart LIKE vbak-spart,
        ktext LIKE vbak-ktext,
*        guebg LIKE vbak-guebg,
*        gueen LIKE vbak-gueen,
        guebg(10) TYPE c,
        gueen(10) TYPE c,
        zzsur LIKE vbak-zzsur,
        zzstp LIKE vbak-zzstp,
        zzotp LIKE vbak-zzotp,
        zzsid LIKE vbak-zzsid,
        flag(8)  TYPE n,
       END OF gts_header.
TYPES : BEGIN OF gts_item,      " structure to hold item data
        matnr LIKE vbap-matnr,
*       zmeng LIKE vbap-zmeng,
        zmeng(13) TYPE c,
        zieme LIKE vbap-zieme,
        flag(8)  TYPE n,
       END OF gts_item.
DATA: gdt_itab TYPE STANDARD TABLE OF gts_intab INITIAL SIZE 0," Internal table
      gdt_itab1 TYPE STANDARD TABLE OF gts_intab ," Internal table to hold data having incorrect values
      gds_itab TYPE gts_intab,                                    " Internal table workarea
      gdf_flag(8) TYPE n,                                         " flag for count
      gdf_extn(4) TYPE c,                                         " File extension
      gdf_ind(4) TYPE c,                                          " for item loop
      gdt_temp TYPE truxs_t_text_data.                            "temp variable to upload excel data
DATA : gdt_header TYPE STANDARD TABLE OF gts_header,
       gds_header TYPE gts_header,
       gdt_item TYPE STANDARD TABLE OF gts_item,
       gds_item TYPE gts_item.
DATA : gdt_bdcdata TYPE STANDARD TABLE OF bdcdata,
       gds_bdcdata TYPE bdcdata,
       gdt_message TYPE STANDARD TABLE OF bdcmsgcoll,
       gds_message TYPE bdcmsgcoll.
DATA : gdf_var1(20) TYPE c,
       gdf_var2(20) TYPE c,
       gdf_var3(20) TYPE c,
       gdf_length1 TYPE i, " No of entries in the upload file
       gdf_length2 TYPE i, " No of entries uploaded
       gdf_length3 TYPE i. " No of entries incorrect
*Start of siva
DATA: gdt_it_fieldcat   TYPE  slis_t_fieldcat_alv,
      gds_wa_fieldcat LIKE LINE OF gdt_it_fieldcat ,
      gds_wa_layout TYPE slis_layout_alv,
      gdt_i_alv_top_of_page TYPE slis_t_listheader.
*End of siva

*&---------------- ---------------------------------------------------*
* CONSTANTS
*&--------------------------------------------------------------------*
CONSTANTS: gcf_type TYPE char1
           VALUE 'S'.


*&---------------- ---------------------------------------------------*
* SELECTION-SCREEN
*&--------------------------------------------------------------------*
SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE text-000.
PARAMETERS p_file TYPE rlgrap-filename OBLIGATORY. " Filename
SELECTION-SCREEN:END OF BLOCK b1.

*&---------------- ---------------------------------------------------*
* AT SELECTION-SCREEN
*&--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      field_name = 'p_file'
    IMPORTING
      file_name  = p_file.


START-OF-SELECTION.

*&---------------- ---------------------------------------------------*
* Processing flow
*&--------------------------------------------------------------------*
  PERFORM upload_data.
  PERFORM filter_data.
  PERFORM split_header_item.
  PERFORM bdc.
  PERFORM sub_build_header.
  PERFORM fieldcat.
  PERFORM display_incorrect_data.
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  bdc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM bdc .
*include bdcrecx1.
*
*  PERFORM open_group.
  LOOP AT gdt_header INTO gds_header.
    PERFORM bdc_dynpro      USING 'SAPMV45A' '0101'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'VBAK-AUART'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '/00'.
    PERFORM bdc_field       USING 'VBAK-AUART'
                                 gds_header-auart." 'ZSIP'.
    PERFORM bdc_field       USING 'VBAK-VKORG'
                                  gds_header-vkorg.         " 'AU10'.
    PERFORM bdc_field       USING 'VBAK-VTWEG'
                                  gds_header-vtweg.         " '01'.
    PERFORM bdc_field       USING 'VBAK-SPART'
                                  gds_header-spart.         " '01'.


*    LOOP AT gdt_item INTO gds_item  WHERE flag = gds_header-flag.
    PERFORM bdc_dynpro      USING 'SAPMV45A' '0412'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                   'VBAK-KTEXT'.
    PERFORM bdc_field       USING 'VBAK-KTEXT'
                                gds_header-ktext.           " '215125'.
    PERFORM bdc_field       USING 'VBAK-GUEBG'
                                  gds_header-guebg. " '12.04.2011'.
    PERFORM bdc_field       USING 'VBAK-GUEEN'
                                  gds_header-gueen. " '29.04.2011'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '/00'.
    LOOP AT gdt_item INTO gds_item  WHERE flag = gds_header-flag.
      gdf_ind = gdf_ind + 1 .
      CONDENSE gdf_ind.

      CONCATENATE 'VBAP-MATNR(' gdf_ind ')' INTO gdf_var1.
      CONCATENATE 'VBAP-ZMENG(' gdf_ind ')' INTO gdf_var2.
      CONCATENATE 'VBAP-ZIEME(' gdf_ind ')' INTO gdf_var3.

      PERFORM bdc_field       USING gdf_var1
                                    gds_item-matnr. " 'ZP00102'.
      PERFORM bdc_field       USING gdf_var2
                                    gds_item-zmeng.         " '2'.
      PERFORM bdc_field       USING gdf_var3
                                    gds_item-zieme. " 'EA'.
      PERFORM bdc_field       USING 'BDC_OKCODE'
                                    '/00'.
      IF gdf_ind = 18.
        CLEAR gdf_ind.
        gdf_ind = 1.
        PERFORM bdc_field       USING 'BDC_OKCODE'   '=FCNP'.
*    perform bdc_field       using 'BDC_OKCODE'  '/00'.
        PERFORM bdc_dynpro      USING 'SAPLCSDI' '0140'.
        PERFORM bdc_field       USING 'BDC_CURSOR'  'RV45A-MABNR(20)'.
      ENDIF.
    ENDLOOP.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                             '=KKAS'.
    PERFORM bdc_dynpro      USING 'SAPMV45A' '0306'.
*    PERFORM bdc_field       USING 'BDC_OKCODE'
*                                  '=SICH'.
*      PERFORM bdc_field       USING 'VBAK-AUDAT'       " this is taking the date of the day recording.
*                                    gds_header-audat. " '28.04.2011'.
    PERFORM bdc_field       USING 'VBAK-GUEBG'
                                  gds_header-guebg. " '12.04.2011'.
    PERFORM bdc_field       USING 'VBAK-GUEEN'
                                  gds_header-gueen. " '29.04.2011'.
    PERFORM bdc_field       USING 'VBAK-KTEXT'
                                  gds_header-ktext.         " '215125'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'GDS_VBAK-ZZSID'.
    PERFORM bdc_field       USING 'GDS_VBAK-ZZSUR'
                                  gds_header-zzsur. " '1004279'.
    PERFORM bdc_field       USING 'GDS_VBAK-ZZSTP'
                                  gds_header-zzstp. " 'P'.
    PERFORM bdc_field       USING 'GDS_VBAK-ZZOTP'
                                  gds_header-zzotp. " 'ESLAPCOLON'.
    PERFORM bdc_field       USING 'GDS_VBAK-ZZSID'
                                  gds_header-zzsid. " 'B'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                              '=SICH'.
    CALL TRANSACTION 'VA51'
    USING gdt_bdcdata
    MODE 'E'
*      MESSAGES INTO gds_message.
    MESSAGES INTO gdt_message.
*      APPEND gds_message TO gdt_message.

*  PERFORM bdc_transaction USING 'VA51'.
*
*  PERFORM close_group.
    REFRESH gdt_bdcdata.
    CLEAR gds_bdcdata.
    CLEAR gdf_ind.
  ENDLOOP.

ENDFORM.                    "bdc

*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
  CLEAR gds_bdcdata.
  gds_bdcdata-program  = program.
  gds_bdcdata-dynpro   = dynpro.
  gds_bdcdata-dynbegin = 'X'.
  APPEND gds_bdcdata TO gdt_bdcdata.
ENDFORM.                    "BDC_DYNPRO
*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
  IF fval <> space.
    CLEAR gds_bdcdata.
    gds_bdcdata-fnam = fnam.
    gds_bdcdata-fval = fval.
    APPEND gds_bdcdata TO gdt_bdcdata.
  ENDIF.
ENDFORM.                    "bdc_field

*&---------------------------------------------------------------------*
*&      Form split_header_item.
*&---------------------------------------------------------------------*
FORM split_header_item.
  LOOP AT gdt_itab INTO gds_itab .
    gds_header-auart = gds_itab-auart.
    gds_header-vkorg = gds_itab-vkorg.
    gds_header-vtweg = gds_itab-vtweg.
    gds_header-spart = gds_itab-spart.
    gds_header-ktext = gds_itab-ktext.
    gds_header-guebg = gds_itab-guebg.
    gds_header-gueen = gds_itab-gueen.
    gds_item-matnr   = gds_itab-matnr.
    gds_item-zmeng   = gds_itab-zmeng.
    gds_item-zieme   = gds_itab-zieme.
    gds_header-zzsur = gds_itab-zzsur.
    gds_header-zzstp = gds_itab-zzstp.
    gds_header-zzotp = gds_itab-zzotp.
    gds_header-zzsid = gds_itab-zzsid.
    CONDENSE gds_item-zmeng. " removing the preceeding space for quantity
    AT NEW ktext.
      ADD 1 TO gdf_flag.
    ENDAT.
    gds_header-flag = gdf_flag.
    gds_item-flag = gdf_flag.
    APPEND gds_header TO gdt_header.
    APPEND gds_item TO gdt_item.
  ENDLOOP.
  DELETE ADJACENT DUPLICATES FROM gdt_header.
ENDFORM.                    "split_header_item
*&---------------------------------------------------------------------*
*&      Form  FILTER_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM filter_data .
  LOOP AT gdt_itab INTO gds_itab.
    IF ( gds_itab-auart IS INITIAL OR gds_itab-auart EQ '0' ) OR
    ( gds_itab-vkorg IS INITIAL OR gds_itab-vkorg EQ '0' ) OR
    ( gds_itab-vtweg IS INITIAL OR gds_itab-vtweg EQ '0' ) OR
    ( gds_itab-spart IS INITIAL OR gds_itab-spart EQ '0' ) OR
    ( gds_itab-ktext IS INITIAL OR gds_itab-ktext EQ '0' ) OR
    ( gds_itab-matnr IS INITIAL OR gds_itab-matnr EQ '0' ) OR
    ( gds_itab-zmeng IS INITIAL OR gds_itab-zmeng EQ '0' )  .
      DELETE gdt_itab INDEX sy-tabix.
      APPEND gds_itab TO gdt_itab1.
    ENDIF.
  ENDLOOP.
  DESCRIBE TABLE gdt_itab1 LINES gdf_length2.
ENDFORM.                    " FILTER_DATA


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_INCORRECT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_incorrect_data .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program     = sy-repid
      i_callback_top_of_page = 'TOP_OF_PAGE'
      is_layout              = gds_wa_layout
      it_fieldcat            = gdt_it_fieldcat
    TABLES
      t_outtab               = gdt_itab1
    EXCEPTIONS
      program_error          = 1
      OTHERS                 = 2.
  IF sy-subrc = 0.
    " No processing
  ENDIF.

ENDFORM.                    " DISPLAY_INCORRECT_DATA


*&---------------------------------------------------------------------*
*&      Form  UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM upload_data .
  DATA: ldf_var1(100) TYPE c,
        ldf_var2(5) TYPE c.
  CONSTANTS: lcf_var(1) TYPE c
              VALUE '.'.
  SPLIT p_file AT lcf_var INTO ldf_var1 ldf_var2.
  IF ldf_var2 eq 'xls' or ldf_var2 eq 'xlsx'.

    CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
       EXPORTING
*   I_FIELD_SEPERATOR          =
       i_line_header              = 'X'
       i_tab_raw_data             = gdt_temp
       i_filename                 = p_file
    TABLES
         i_tab_converted_data     = gdt_itab
    EXCEPTIONS
      conversion_failed           = 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.
    DESCRIBE TABLE gdt_itab LINES gdf_length1.
  ELSE.
    MESSAGE  text-003 TYPE 'E' .
  ENDIF.
ENDFORM.                    " UPLOAD_DATA

*&---------------------------------------------------------------------*
*&      Form  FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fieldcat.
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'AUART'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Item Proposal Type'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'VKORG'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Sales Organisation'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'VTWEG'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Distribution Channel'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'SPART'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Division'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'KTEXT'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Description'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'GUEBG'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Valid From'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'GUEEN'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Valid To'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'MATNR'.
  gds_wa_fieldcat-tabname = 'VBAP'.
  gds_wa_fieldcat-seltext_l = 'Material'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'ZMENG'.
  gds_wa_fieldcat-tabname = 'VBAP'.
  gds_wa_fieldcat-seltext_l = 'Quantity'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'ZIEME'.
  gds_wa_fieldcat-tabname = 'VBAP'.
  gds_wa_fieldcat-seltext_l = 'Unit of Measure'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'ZZSUR'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Surgeon Code'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'ZZSTP'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Case Type'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'ZZOTP'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Case Type'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  CLEAR gds_wa_fieldcat.
  gds_wa_fieldcat-fieldname = 'ZZSID'.
  gds_wa_fieldcat-tabname = 'VBAK'.
  gds_wa_fieldcat-seltext_l = 'Side'.
  APPEND gds_wa_fieldcat TO gdt_it_fieldcat .
  gds_wa_layout-colwidth_optimize = 'X'. " To change column width
ENDFORM.                    " FIELDCAT

*&---------------------------------------------------------------------*
*       FORM top_of_page
*---------------------------------------------------------------------*
*       Call ALV top of page
*---------------------------------------------------------------------*
*       No parameter
*---------------------------------------------------------------------*
FORM top_of_page.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = gdt_i_alv_top_of_page.
ENDFORM.                    "top_of_page*&--------


*&---------------------------------------------------------------------*
*&      Form  sub_build_header
*&---------------------------------------------------------------------*
*       To build the header
*----------------------------------------------------------------------*
*       No Parameter
*----------------------------------------------------------------------*
FORM sub_build_header.
  DATA: lds_r_line     TYPE slis_listheader.  "Hold list header
  CLEAR lds_r_line.
  lds_r_line-typ  = gcf_type.                " Item
  lds_r_line-key = text-001.
  lds_r_line-info = gdf_length1.
  APPEND lds_r_line TO gdt_i_alv_top_of_page.
  CLEAR lds_r_line.
  lds_r_line-typ  = gcf_type.                " Item
  lds_r_line-key = text-002.
  lds_r_line-info = gdf_length2.
  APPEND lds_r_line TO gdt_i_alv_top_of_page.
ENDFORM.                    " sub_build_header