Friday, 10 April 2015

BDC Automation

Hi,

     This  Report  Based on SHDB recording a new BDC report program
  will be automatically generated And Even Download the Flat File structure also ..


*************************************************************************
* OBJECT ID       :  zbdc_auto_create.                                  *
* PROGRAM TITLE   :  BDC Automation                                    *
* PROGRAM TYPE    :  Executable                                         *
* OUTPUT          :  New BDC program based on SHDB recording            *
* CREATED BY      :  Ramkumar.K(51285)                                  *
* CREATION DATE   :  06/04/2013                                         *
*-----------------------------------------------------------------------*
* DESCRIPTION     :  Based on SHDB recording a new BDC report program   *
*                    will be automatically generated                    *
*                                                                       *
*                                                                       *
*************************************************************************
* Modification history:                                                 *
* ----------------------------------------------------------------------*
* DATE      |User ID    |TS Ver  | Transport Request  | Description     *
* ----------------------------------------------------------------------*
  04/06/2015  ram k                   Field download issues corrected.
*                                                                       *
*************************************************************************

REPORT  zbdc_auto_create.

TABLES :d0100 , trdir.
*&---------------------------------------------------------------------*

DATA :      qid     TYPE apqd-qid,
            report  TYPE trdir-name,
            testdata ,
            dsn(132) TYPE c,
            file  VALUE abap_true   .
*           selections of generated program because of texts
DATA: dynprotab LIKE bdcdata OCCURS 0 WITH HEADER LINE.

DATA: BEGIN OF source OCCURS 100,
        line1(30),
        line2(42),
      END OF source.

DATA: tcode LIKE tstc-tcode.

DATA: text_tab   LIKE textpool OCCURS 0 WITH HEADER LINE,
      text_tab_2 LIKE textpool OCCURS 0 WITH HEADER LINE.

DATA: dynpro_fields LIKE bdcdf OCCURS 0 WITH HEADER LINE.

DATA: dynpro_fields_index LIKE sy-tabix,
      tree_name(43).

CONSTANTS: c_flg1edt TYPE x VALUE '80'.

*&---------------------------------------------------------------------*
DATA :  gt_apqi     TYPE TABLE OF apqi,
        gs_apqi     TYPE apqi,
        gt_bdcdata  TYPE TABLE OF  bdcdata,
        gs_bdcdata  TYPE  bdcdata,
        gv_mode     TYPE c,
        gv_sync     TYPE c,
        gv_counti   TYPE i,
        gv_count(3) TYPE c,
        gv_char(4)  ,
        gv_cflag    TYPE c,
        gv_cflag1   TYPE c,
        gv_field    TYPE char50.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE ttext ."text-001.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(15) tp_grpid.
PARAMETERS : p_grpid TYPE apqi-groupid OBLIGATORY.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(15) tp_prg.
PARAMETERS p_prg TYPE RS38M-PROGRAMM OBLIGATORY."MATCHCODE OBJECT rid. " progname.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 1(25) tmsg.
*PARAMETERS p_xls RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 10(9) tp_xls.
PARAMETERS p_xls RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(9) tp_txt.
PARAMETERS p_txt RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 1(25) tmsg1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_as.
PARAMETERS p_as RADIOBUTTON GROUP r2 .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_es.
PARAMETERS p_es RADIOBUTTON GROUP r2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_ns.
PARAMETERS p_ns RADIOBUTTON GROUP r2 DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_ds.
PARAMETERS p_ds RADIOBUTTON GROUP r2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 1(25) tmsg2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_st.
PARAMETERS p_st RADIOBUTTON GROUP r3.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_at.
PARAMETERS p_at RADIOBUTTON GROUP r3.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 1(25) tmsg3.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 10(21) tp_file.
PARAMETERS P_File TYPE RLGRAP-FILENAME..
PARAMETERS P_File1 TYPE RLGRAP-FILENAME NO-DISPLAY..
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_grpid.
  PERFORM f4_help_group.
AT SELECTION-SCREEN on VALUE-REQUEST FOR P_File.
  PERFORM f4_help_file.

INITIALIZATION.
*Selection screen Text.
  ttext    = 'Selection Screen ' .
  tp_grpid = 'Recording Name'.
  tp_prg   = 'Program Name'.
  tp_txt   = 'Text File'.
  tp_xls   = 'XLS File'.
  tp_as    = 'Display All Screen(A)'.
  tp_es    = 'Only Error Screen(E)'.
  tp_ns    = 'No Screen(N)'.
  tp_ds    = 'Debugger Mode (P)'.
  tp_st    = 'synchronous (S)'.
  tp_at    = 'asynchronous (A)'.
  tp_file  = 'File Path'.
  tmsg     = 'Upload file option'.
  tmsg1    = 'BDC Transaction mode'.
  tmsg2    = 'BDC Upadate mode'.
  tmsg3    = 'Download Test File '.

PERFORM file_path.


START-OF-SELECTION.

  PERFORM check_prg_name.
  PERFORM assign_mode.
  PERFORM get_bdc_data.
  set PARAMETER ID  'RID' FIELD report.
  CALL TRANSACTION 'SE38' AND SKIP FIRST SCREEN.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  F4_HELP_GROUP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f4_help_group .
  TYPES: BEGIN OF ts_apqi,
          groupid TYPE apqi-groupid,
          creator TYPE apqi-creator,
          startdate TYPE apqi-startdate,
          starttime TYPE apqi-starttime,
          transcnt TYPE apqi-transcnt,
          msgcnt TYPE apqi-msgcnt,
        END OF ts_apqi.
  DATA : lt_apqi TYPE TABLE OF ts_apqi,
         ls_apqi TYPE ts_apqi.

*Getting List of recording
  PERFORM record_select USING d0100-mapn
                              d0100-von
                              d0100-bis
                              d0100-creator.
  LOOP AT gt_apqi INTO gs_apqi.
    ls_apqi-creator = gs_apqi-creator.
    ls_apqi-groupid = gs_apqi-groupid.
    ls_apqi-startdate = gs_apqi-credate.
    ls_apqi-starttime = gs_apqi-cretime.
    ls_apqi-transcnt = gs_apqi-transcnt.
    ls_apqi-msgcnt = gs_apqi-msgcnt.
    APPEND ls_apqi TO lt_apqi.
    CLEAR ls_apqi.
  ENDLOOP.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'GROUPID'"lv_retfield
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_GRPID'
      value_org       = 'S'
    TABLES
      value_tab       = lt_apqi
*     return_tab      = lT_return_tab
*     dynpfld_mapping = lT_map
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  IF sy-subrc = 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.                    " F4_HELP_GROUP*&---------------------------------------------------------------------*
*&      Form  RECORD_SELECT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_BDC_RECORD_GROUPID  text
*      -->P_D0100_VON  text
*      -->P_D0100_BIS  text
*      -->P_BDC_RECORD_CREATOR  text
*----------------------------------------------------------------------*
FORM record_select USING    p_groupid
                            p_von
                            p_bis
                            p_creator.

  IF p_groupid = space.
    p_groupid = '*'.
  ENDIF.
  IF p_creator = space.
    p_creator = '*'.
  ENDIF.
  CALL FUNCTION 'BDC_OBJECT_SELECT'
    EXPORTING
      name            = p_groupid
      date_from       = p_von
      date_to         = p_bis
      session_creator = p_creator
    TABLES
      apqitab         = gt_apqi
    EXCEPTIONS
      OTHERS          = 1.
  IF sy-subrc <> 0.
*    MESSAGE A604 WITH 'BDC_OBJECT_SELECT' SY-SUBRC.
  ENDIF.
ENDFORM.                    " RECORD_SELECT
*&---------------------------------------------------------------------*
*&      Form  GET_BDC_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_bdc_data .
  d0100-mapn = p_grpid.
  PERFORM record_select USING d0100-mapn
                              d0100-von
                              d0100-bis
                              d0100-creator.
  READ TABLE gt_apqi INTO gs_apqi INDEX 1.
*   IF sy-subrc = 0.


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

* get records *********************************************************
  qid = gs_apqi-qid .
  CALL FUNCTION 'BDC_OBJECT_READ'
    EXPORTING
      queue_id         = qid
    TABLES
      dynprotab        = dynprotab
    EXCEPTIONS
      not_found        = 1
      system_failure   = 2
      invalid_datatype = 3
      OTHERS           = 4.
  IF sy-subrc >< 0.
*    MESSAGE S627 WITH QID. EXIT.
  ENDIF.
* create file with testdata *******************************************
*  IF TESTDATA = 'X'.
*   fill internal table to determine structure of record
  PERFORM fill_dynpro_fields.
*  Download test file
  PERFORM test_file.
*   REPORT = 'ZTEST_REC1'.
*Check if table control is there or not..
  LOOP AT dynpro_fields.
    PERFORM check_table_control .
    IF gv_cflag =  abap_true .
      EXIT.
    ENDIF.
  ENDLOOP.
* same lines for all records ------------------------------------------
* ***report <report>
  CONCATENATE 'report'
              report
              INTO source SEPARATED BY space.
  APPEND source. CLEAR source.
  source =    '       no standard page heading line-size 255.'.
  APPEND source. CLEAR source. APPEND source.
*   fill internal table to determine structure of record
  PERFORM fill_dynpro_fields.
*   ***data: begin of record ... end of record.
  PERFORM source_lines_for_record.
*  ENDIF.
* ***start-of-selection.
  source-line1 = 'start-of-selection.'.
  APPEND source. CLEAR source. APPEND source.
  source = 'PERFORM GET_FILE_DATA.'.
  APPEND source. CLEAR source. APPEND source.
  IF gv_cflag =  abap_true .
    source = '*  clear gv_counti." Table controls '.
    APPEND source. CLEAR source. APPEND source.
  ENDIF.
  source-line1 = 'LOOP AT lt_file into wa_file.'.
  APPEND source. CLEAR source. APPEND source.
  IF gv_cflag =  abap_true .
    source = '*   gv_counti = gv_counti + 1. " Table controls '.
    APPEND source. CLEAR source.
    source = '*   gv_count  = gv_counti. " Table controls '.
    APPEND source. CLEAR source.
    source = '*   CONDENSE gv_count. " Table controls '.
    APPEND source. CLEAR source. APPEND source.
  ENDIF.
  APPEND source. CLEAR source. APPEND source.
  CLEAR gv_cflag1 .
* lines depending on records ------------------------------------------
  LOOP AT dynprotab.
   CLEAR gv_cflag1 .
    CASE dynprotab-dynbegin.
*     new transaction -------------------------------------------------
      WHEN 'T'.
**       store transaction AFTER getting field values!
*        IF NOT TCODE IS INITIAL.
**         ***perform bdc_transaction using dynprotab-fnam.
*          SOURCE-LINE1 = 'perform bdc_transaction using'.
*          CONCATENATE ''''
*                      TCODE
*                      '''.'
*                      INTO SOURCE-LINE2.
*          APPEND SOURCE. CLEAR SOURCE. APPEND SOURCE.
*        ENDIF.
**       save tcode for next transaction
        tcode = dynprotab-fnam.
*     new dynpro ------------------------------------------------------
      WHEN 'X'.
*       ***perform bdc_dynpro using dynprotab-program dynprotab-dynpro.
        source-line1 = 'perform bdc_dynpro      using'.
        CONCATENATE ''''
                    dynprotab-program
                    ''''
                    ' '''
                    dynprotab-dynpro
                    '''.'
                    INTO source-line2.
        APPEND source. CLEAR source.
*     dynpro field ----------------------------------------------------
      WHEN space.
*       ***perform bdc_field using <dynprotab-fnam> <dynprotab-fval>.
        CHECK dynprotab-fnam <> 'BDC_SUBSCR'.
        READ TABLE dynpro_fields WITH KEY fieldname = dynprotab-fnam .
        IF sy-subrc = 0.
        PERFORM check_table_control .
        ENDIF.
        IF gv_cflag1 = abap_true .
          source = '* Clear GV_TC . " Table controls ' .
          APPEND source. CLEAR source.
          CONCATENATE '*CONCATENATE ' ''''
                      gv_field '(' '''' 'gv_count' '''' ')' '''' 'INTO GV_TC . " Table controls '   " dynprotab-fnam

                      INTO source.
          APPEND source. CLEAR source.

        source = '*perform bdc_field       using    " Table controls '.

*        IF gv_cflag1 = abap_true .

*          CONCATENATE ''''
*                      dynprotab-fnam
*                      ''''
*                      INTO source-line2.
          source-line2  = '"  GV_TC  " Table controls '  .
          ENDIF.
*        ELSE.
         APPEND source. CLEAR source.
        source-line1 = 'perform bdc_field       using    '.
          CONCATENATE ''''
                      dynprotab-fnam
                      ''''
                      INTO source-line2.
*        ENDIF.
        APPEND source. CLEAR source.
*       source line for read from dataset
        IF file = 'X'.
*         * ...records-<field>
          PERFORM source_line_for_var_field.
*       source line for read from records
        ELSE.
*         * ...<dynprotab-fval>
          PERFORM source_line_for_field_content USING dynprotab-fval.
        ENDIF.
    ENDCASE.
  ENDLOOP.
* insert last transaction ---------------------------------------------
  IF gv_cflag = abap_true.
    source = '*&--Default Table control row is bellow 5 means pls adjust..*.'.  " Scroll down for  Table control
    APPEND source. CLEAR source.
    source = '*IF gv_counti => 05. " Table controls'.  " Scroll down for  Table control
    APPEND source. CLEAR source.
    source-line1 =  '*perform bdc_field       using '.
*    APPEND source. CLEAR source.
    CONCATENATE '''bdc_okcode'''  '" Table controls.' INTO source-line2.
    APPEND source. CLEAR source.
    CONCATENATE '"'  '''=NP''. " Table controls' INTO source-line2.
    APPEND source. CLEAR source.
    source = '*gv_counti = 1." Table controls'.
    APPEND source. CLEAR source.
    source = '*ENDIF." Table controls'.
    APPEND source. CLEAR source.  APPEND source.
  ENDIF.
*ENDIF.

  CONCATENATE  'CALL TRANSACTION   ' ''''tcode'''' 'USING ' INTO source ."SEPARATED BY space.
  CONCATENATE source 'lt_bdc MODE ' INTO source SEPARATED BY space.
  CONCATENATE source ''''gv_mode'''' 'UPDATE' ''''gv_sync''''  INTO source ."SEPARATED BY space.
  APPEND source. CLEAR source.
  source = 'MESSAGES INTO lT_MSG .' .
  APPEND source. CLEAR source. APPEND source.
  source = 'perform Error_log.'.
  APPEND source. CLEAR source. APPEND source.
  source-line1 = 'REFRESH : lt_msg , lt_bdc .'.
  APPEND source. CLEAR source. APPEND source.
  source-line1 = 'ENDLOOP .'.
  APPEND source. CLEAR source. APPEND source.
  source = 'PERFORM alv_display.'.
  APPEND source. CLEAR source.
  PERFORM get_subroutines.
* insert report *******************************************************
  INSERT REPORT report FROM source.

* insert selection texts **********************************************
* texts for generated report in textpool of this report
  READ TEXTPOOL sy-repid INTO text_tab LANGUAGE sy-langu.
  IF sy-subrc = 0.
*   delete texts that belong to this report
    DELETE text_tab WHERE id >< 'S' AND id >< 'I'.
    DELETE text_tab WHERE id  = 'S' AND key >< 'DATASET'.
*   insert title of actual report
    READ TEXTPOOL report INTO text_tab_2 LANGUAGE sy-langu.
    text_tab_2-id = 'R'.
    READ TABLE text_tab_2 WITH KEY id = 'R'.
    MOVE-CORRESPONDING text_tab_2 TO text_tab.
    APPEND text_tab.
    text_tab_2-id = 'S'.
    text_tab_2-key = 'P_FNAME'.
    text_tab_2-entry = '           File Name'.
    text_tab_2-length = `100`.
    APPEND text_tab_2.
    text_tab_2-id = 'I'.
    text_tab_2-key = '001'.
    text_tab_2-entry = 'Selection Screen'.
    text_tab_2-length = `100`.
    APPEND text_tab_2.
*   insert textpool from text_tab
    INSERT TEXTPOOL report FROM text_tab_2.
  ENDIF.

* actualize EU-tree ***************************************************
  CONCATENATE 'PG_'
              report
              INTO tree_name.
  CALL FUNCTION 'WB_TREE_ACTUALIZE'
    EXPORTING
      tree_name = tree_name.

ENDFORM.                    "GET_BDC_DATA
**** source_line_for_field_content ************************************
FORM source_line_for_field_content USING p_fval.
  DATA: l_fval LIKE dynprotab-fval.

  l_fval = p_fval.
  IF l_fval+39 = space.
    CONCATENATE ''''
                l_fval
                '''.'
                INTO source-line2.
    APPEND source. CLEAR source.
  ELSE.                "field content longer than 38
    CONCATENATE ''''
                l_fval(38)
                ''''
                INTO source-line2.
    APPEND source. CLEAR source.
    source-line1+28 = '&'.
    DO 4 TIMES.
      SHIFT l_fval BY 38 PLACES.
      IF l_fval+39 = space.
        CONCATENATE ''''
                    l_fval
                    '''.'
                    INTO source-line2.
        APPEND source. CLEAR source.
        EXIT.
      ELSE.                "field content longer than n x 38
        CONCATENATE ''''
                    l_fval(38)
                    ''''
                    INTO source-line2.
        APPEND source. CLEAR source-line2.
      ENDIF.
    ENDDO.
  ENDIF.
ENDFORM.               "SOURCE_LINE_FOR_FIELD_CONTENT

**** source_line_for_var_field ****************************************
FORM source_line_for_var_field.
  IF dynprotab-fnam = 'BDC_OKCODE' OR
     dynprotab-fnam = 'BDC_CURSOR' OR
     dynprotab-fnam = 'BDC_SUBSCR'.
    PERFORM source_line_for_field_content USING dynprotab-fval.
  ELSE.
    ADD 1 TO dynpro_fields_index.
    READ TABLE dynpro_fields INDEX dynpro_fields_index.
    IF sy-subrc <> 0.
*      MESSAGE A614 WITH DYNPROTAB-FNAM.
    ENDIF.
    CONCATENATE 'wa_file-'
                dynpro_fields-recfield
                '.'
                INTO source-line2.
    APPEND source. CLEAR source.
  ENDIF.
ENDFORM.               "SOURCE_LINE_FOR_VAR_FIELD

**** fill_dynpro_fields ***********************************************
FORM fill_dynpro_fields.

  CALL FUNCTION 'BDC_DYNPROTAB_GET_FIELDS'
    TABLES
      dynprotab    = dynprotab
      dynprofields = dynpro_fields.

ENDFORM.                    "FILL_DYNPRO_FIELDS

**** source_lines_for_record ******************************************
FORM source_lines_for_record.
  DATA: l_dfies     LIKE dfies,
        l_tabname   LIKE dcobjdef-name,
        l_fieldname LIKE dfies-lfieldname,
        l_dummy     LIKE dfies-lfieldname.
* *** data: begin of record,
  source = 'Types : begin of ts_File,'.
  APPEND source. CLEAR source.

  LOOP AT dynpro_fields.
*   *** <field_n>(<length>)
    CLEAR l_dfies.
    IF dynpro_fields-fieldname CA '-'.
*     create dataelement comment line
      SPLIT dynpro_fields-fieldname AT '-'
            INTO l_tabname
                 l_fieldname.
      SPLIT l_fieldname AT '('
            INTO l_fieldname
                 l_dummy.
      CALL FUNCTION 'DDIF_FIELDINFO_GET'
           EXPORTING
                tabname        = l_tabname
*               fieldname      = l_fieldname
*               LANGU          = SY-LANGU
                lfieldname     = l_fieldname
*               ALL_TYPES      = ' '
           IMPORTING
*               X030L_WA       =
*               DDOBJTYPE      =
                dfies_wa       = l_dfies
*          TABLES
*               DFIES_TAB      =
           EXCEPTIONS
                not_found      = 1
                internal_error = 2
                OTHERS         = 3.
      IF sy-subrc <> 0.
        CLEAR l_dfies.
      ENDIF.
    ENDIF.
    source    = '* data element: '.
    source+16 = l_dfies-rollname.
    APPEND source. CLEAR source.
    CONCATENATE dynpro_fields-recfield
                '(' dynpro_fields-length ')' ','
                INTO source+8.
    APPEND source. CLEAR source.
  ENDLOOP.

* *** end   of record.
  source = '        end of ts_File,'.
  APPEND source. CLEAR source. APPEND source.
  source = '        begin of ts_msg,'.
  APPEND source.
  source = '         icon      type icon_d ,'  .
  APPEND source.
  source = '         row       type i,'  .
  APPEND source.
  source = '         message   type char200,'  .
  APPEND source.
  source = '        end of ts_msg.'.
  APPEND source.
  source = '*** End generated data section ***'.
  APPEND source.
  source = '*Declaration part'.
  APPEND source.
  source = 'Data : lT_File type Table of ts_file ,'.
  APPEND source.
  source = '       WA_File type          ts_file,'.
  APPEND source.
  source = '       lT_BDC  type Table of BDCDATA,'.
  APPEND source.
  source = '       WA_BDC  type          BDCDATA,'.
  APPEND source.
  source = '       lT_MSG  TYPE TABLE OF bdcmsgcoll,   " Collecting Error messages '.
  APPEND source.
  source = '       WA_MSG  TYPE          bdcmsgcoll,'.
  APPEND source.
  source = '       lT_err  TYPE table of ts_msg,'.
  APPEND source.
  source = '       WA_err  TYPE          ts_msg,'.
  APPEND source.
  source = '       wa_lay  type          SLIS_LAYOUT_ALV ,'.
  APPEND source.
  source = '       lt_fcat type          SLIS_T_FIELDCAT_ALV, '.
  APPEND source .
  source = '       wa_fcat type          SLIS_FIELDCAT_ALV .'.
  APPEND source.
  IF gv_cflag = abap_true.
    source = 'Data : gv_counti    TYPE i,'.
    APPEND source.
    source = '       gv_count(3)  TYPE c,'.
    APPEND source.
    source = '       gv_tc(125)   type c .'.
    APPEND source.
  ENDIF.
  CLEAR source. APPEND source.
  source = '*Selection Screen Part'.
  APPEND source.
  source = 'SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.'.
  APPEND source.
  IF p_xls = abap_true.
    source = 'PARAMETERS : P_FNAME TYPE RLGRAP-FILENAME..'.
  ELSEIF p_txt = abap_true.
    source = 'PARAMETERS : P_FNAME TYPE IBIPPARMS-PATH.'.
  ENDIF.
  APPEND source.
  source = 'SELECTION-SCREEN END OF BLOCK b1. '.
  APPEND source.
  CLEAR source. APPEND source.
  source = '*Selection screen F4 help '.
  APPEND source.
  source = 'AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FNAME.'.
  APPEND source.
  CLEAR source. APPEND source.
  source = '   PERFORM F4_HELP_P_FNAME . '.
  APPEND source.
  CLEAR source. APPEND source.
ENDFORM.                    "SOURCE_LINES_FOR_RECORD

*&---------------------------------------------------------------------*
*&      Form  GET_SUBROUTINES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_subroutines .
  CLEAR source.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form  F4_HELP_P_FNAME                                                '.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form F4_HELP_P_FNAME.'.
  APPEND source. CLEAR source.
  source = '  CALL FUNCTION ' .
  CONCATENATE source '''F4_FILENAME''' INTO source .
  APPEND source. CLEAR source.
  source = '   EXPORTING'.
  APPEND source. CLEAR source.
  source = '     PROGRAM_NAME        = SYST-CPROG'.
  APPEND source. CLEAR source.
  source = '     DYNPRO_NUMBER       = SYST-DYNNR'.
  APPEND source. CLEAR source.
  source = '   IMPORTING'.
  APPEND source. CLEAR source.
  source = '     FILE_NAME           = P_FNAME.'.
  APPEND source. CLEAR source.
  source = 'endform.                    " F4_HELP_P_FNAME '.
  APPEND source. CLEAR source.

  CLEAR source.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form  BDC_FIELD                                                 '.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*      -->P_0223   text'.
  APPEND source. CLEAR source.
  source = '*      -->P_0224   text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form BDC_FIELD  using    value(p_0223)'.
  APPEND source. CLEAR source.
  source = '                         value(p_0224).'.
  APPEND source. CLEAR source.
  source = 'wa_bdc-fnam = p_0223.'.
  APPEND source. CLEAR source.
  source = '  wa_bdc-fval = p_0224.'.
  APPEND source. CLEAR source.
  source = '  APPEND WA_BDC TO lt_bdc.'.
  APPEND source. CLEAR source.
  source = 'CLEAR WA_BDC .'.
  APPEND source. CLEAR source.
  source = 'endform.                    " BDC_FIELD'.
  APPEND source. CLEAR source.
  APPEND source. CLEAR source.


  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form  BDC_DYNPRO'.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*      -->P_0129   text'.
  APPEND source. CLEAR source.
  source = '*      -->P_0130   text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form BDC_DYNPRO  using    value(p_0129)'.
  APPEND source. CLEAR source.
  source = '                          value(p_0130)'.
  APPEND source. CLEAR source.
  source = '                          .'.
  APPEND source. CLEAR source.
  source = ''.
  APPEND source. CLEAR source.
  source = 'wa_bdc-program = p_0129.'.
  APPEND source. CLEAR source.
  source = '  wa_bdc-dynpro = p_0130.'.
  APPEND source. CLEAR source.
  source = '  WA_BDC-DYNBEGIN  = Abap_true.'.
  APPEND source. CLEAR source.
  source = 'APPEND WA_BDC TO lt_bdc.'.
  APPEND source. CLEAR source.
  source = 'CLEAR WA_BDC.'.
  APPEND source. CLEAR source.
  source = ' endform.                    " BDC_DYNPRO'.
  APPEND source. CLEAR source.

  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form  Error_log                                               '.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form  Error_log .'.
  APPEND source. CLEAR source.
   source = 'wa_err-row = wa_err-row + 1 . '.
  APPEND source. CLEAR source.
   source = 'LOOP AT lT_msg INTO wa_msg ."WHERE msgtyp EQ '.
*  CONCATENATE source '''E''' '.' INTO source .
  APPEND source. CLEAR source.
**  APPEND source. CLEAR source.
**  source = '  IF wa_msg-msgnr = 307 .' .
***  CONCATENATE source '''E''' '.' INTO source .
**  APPEND source. CLEAR source.
**  source = '      wa_err-icon = '.
**  CONCATENATE source '''@0A@''' '.' INTO source .
**  APPEND source. CLEAR source.
**  source ='   ELSEIF wa_msg-msgnr = 800 . ' .
***  CONCATENATE source '''S''' '.' INTO source .
**  APPEND source. CLEAR source.
**  source = '      wa_err-icon = '.
**  CONCATENATE source '''@08@''' '.' INTO source .
**  APPEND source. CLEAR source.
**  source ='    ENDIF.'.
**  APPEND source. CLEAR source.
**  source = 'if wa_msg-msgnr = 307. '  .
***    CONCATENATE source '''E''' '.' INTO source .
**  APPEND source. CLEAR source.
**  source = 'wa_err-row = wa_err-row + 1 . ' .
**  APPEND source. CLEAR source.
**  source ='   ELSEIF wa_msg-msgnr = 800 .' .
***  CONCATENATE source '''S''' '.' INTO source .
**  APPEND source. CLEAR source.
**  source = 'wa_err-row = wa_err-row + 1 . ' .
**  APPEND source. CLEAR source.
**  source = 'endif. ' .
  APPEND source. CLEAR source.
*  source = 'wa_err-row =  sy-tabix  .'.
*  APPEND source. CLEAR source.
  source = '*     Format Message'.
  APPEND source. CLEAR source.
  source = '      CALL FUNCTION ' .
  CONCATENATE source '''MESSAGE_TEXT_BUILD''' INTO source SEPARATED BY space.
  APPEND source. CLEAR source.
  source = '        EXPORTING'.
  APPEND source. CLEAR source.
  source = '          msgid               = wa_msg-msgid'.
  APPEND source. CLEAR source.
  source = '          msgnr               = wa_msg-msgnr'.
  APPEND source. CLEAR source.
  source = '          msgv1               = wa_msg-msgv1'.
  APPEND source. CLEAR source.
  source = '          msgv2               = wa_msg-msgv2'.
  APPEND source. CLEAR source.
  source = '          msgv3               = wa_msg-msgv3'.
  APPEND source. CLEAR source.
  source = '          msgv4               = wa_msg-msgv4'.
  APPEND source. CLEAR source.
  source = '        IMPORTING'.
  APPEND source. CLEAR source.
  source = '          message_text_output = wa_err-message.'.
  APPEND source. CLEAR source.
  source = 'append wa_err to lt_err. '.
*  APPEND source. CLEAR source.
*  source = 'clear wa_err .'.
  APPEND source. CLEAR source.
  source = 'endloop.'.
  APPEND source. CLEAR source.
*  source = 'PERFORM alv_display.'.
*  APPEND source. CLEAR source.
  source = ' endform.                    " Error_log '.
  APPEND source. CLEAR source.

  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form  alv_display                                             '.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form alv_display  .'.
  APPEND source. CLEAR source.
  APPEND source. CLEAR source.
  source = 'PERFORM fcat USING ' .
*  CONCATENATE source '''Icon'''  '''ICON''' '.' INTO source SEPARATED BY space.
*  APPEND source.
  source = 'PERFORM fcat USING ' .
  CONCATENATE source  '''Row'''  '''ROW''' '.' INTO source SEPARATED BY space..
  APPEND source.
  source = 'PERFORM fcat USING ' .
  CONCATENATE source  '''Message''' '''MESSAGE''' '.' INTO source SEPARATED BY space..
  APPEND source.CLEAR source.
  APPEND source.
  source = 'wa_lay-colwidth_optimize = abap_true.'.
  APPEND source.CLEAR source.
  APPEND source.
  source = 'CALL FUNCTION ' .
  CONCATENATE source '''REUSE_ALV_GRID_DISPLAY''' INTO source.
  APPEND source.
  source = ' EXPORTING'.
  APPEND source.
  source = '   IS_LAYOUT                         = wa_lay'.
  APPEND source.
  source = '   IT_FIELDCAT                       = lt_fcat'.
  APPEND source.
  source = '  TABLES'.
  APPEND source.
  source = '    t_outtab                          = lt_err'.
  APPEND source.
  source = ' EXCEPTIONS'.
  APPEND source.
  source = '   PROGRAM_ERROR                     = 1'.
  APPEND source.
  source = '   OTHERS                            = 2 .'.
  APPEND source.
  source = ' endform.                    " alv_display  '.
  APPEND source. CLEAR source.
  APPEND source. CLEAR source.

  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form  FCAT'.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*      -->p_text   text'.
  APPEND source. CLEAR source.
  source = '*      -->p_value   text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form FCAT  using    value(p_text)'.
  APPEND source. CLEAR source.
  source = '                    value(p_value).'.
  APPEND source. CLEAR source.
  source = 'wa_fcat-seltext_m = p_text.'.
  APPEND source. CLEAR source.
  source = 'wa_fcat-fieldname = p_value.'.
  APPEND source. CLEAR source.
  source = 'APPEND wa_fcat to lt_fcat.'.
  APPEND source. CLEAR source.
  source = 'CLEAR wa_fcat.'.
  APPEND source. CLEAR source.
  source = 'endform.                    " FCAT'.
  APPEND source. CLEAR source.
  APPEND source. CLEAR source.

  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*&      Form   GET_FILE_DATA                                              '.
  APPEND source. CLEAR source.
  source = '*&---------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = '*       text'.
  APPEND source. CLEAR source.
  source = '*----------------------------------------------------------------------*'.
  APPEND source. CLEAR source.
  source = 'form  GET_FILE_DATA  .'.
  APPEND source. CLEAR source.
  IF p_xls = abap_true.
    APPEND source. CLEAR source.
    source = 'DATA: lt_raw  TYPE truxs_t_text_data.'.
    APPEND source. CLEAR source.
    source = '  CLEAR lt_file.'.
    APPEND source. CLEAR source.
    source = '  CALL FUNCTION ' .
    CONCATENATE source '''TEXT_CONVERT_XLS_TO_SAP''' INTO source.
    APPEND source. CLEAR source.
    source = '    EXPORTING'.
    APPEND source. CLEAR source.
    source = '      i_line_header        = abap_true'.
    APPEND source. CLEAR source.
    source = '      i_tab_raw_data       = lt_raw'.
    APPEND source. CLEAR source.
    source = '      i_filename           = p_fname'.
    APPEND source. CLEAR source.
    source = '    TABLES '.
    APPEND source. CLEAR source.
    source = '      i_tab_converted_data = lt_file'.
    APPEND source. CLEAR source.
    source = '    EXCEPTIONS '.
    APPEND source. CLEAR source.
    source = '      conversion_failed    = 1'.
    APPEND source. CLEAR source.
    source = '      OTHERS               = 2.   .'.
    APPEND source. CLEAR source.
  ELSEIF p_txt = abap_true.
    source = ' CALL FUNCTION  '.
    CONCATENATE source '''GUI_UPLOAD''' INTO source.
    APPEND source. CLEAR source.
    source = ' EXPORTING'.
    APPEND source. CLEAR source.
    source = '  filename                      = p_Fname'.
    APPEND source. CLEAR source.
    source = '  HAS_FIELD_SEPARATOR           = abap_true '.
    APPEND source. CLEAR source.
    source = 'tables'.
    APPEND source. CLEAR source.
    source = '  data_tab                    = lt_file.'.
    APPEND source. CLEAR source.
    APPEND source. CLEAR source.
  ENDIF.
  source = ' endform.                    " GET_FILE_DATA  '.
  APPEND source. CLEAR source.

  source = '* This report generated from automation report ( Author : Ramkumar K ) '.
  APPEND source. CLEAR source.

ENDFORM.                    " GET_SUBROUTINES
*&---------------------------------------------------------------------*
*&      Form  CHECK_PRG_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM check_prg_name .
  DATA: l_progname TYPE progname.
  DATA: l_answer.
  DATA: l_subrc LIKE sy-subrc.
  DATA: l_leave_to_editor.

* programname correct?
  l_progname = p_prg.
  report = p_prg.
  CALL FUNCTION 'RS_PROGRAM_CHECK_NAME'
    EXPORTING
      progname = l_progname
    EXCEPTIONS
      OTHERS   = 04.
  IF sy-subrc >< 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
* program should not exist
  SELECT SINGLE * FROM trdir WHERE name = l_progname.
  IF sy-subrc = 0.
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
      EXPORTING
        defaultoption = 'N'
        textline1     = 'Program already exists! '(040)
        textline2     = 'Delete and recreate it? '(041)
        titel         = 'Creating a new program '(042)
        start_column  = 25
        start_row     = 6
      IMPORTING
        answer        = l_answer.
    IF l_answer = 'J'.
      PERFORM delete_program USING l_progname CHANGING l_subrc.
      IF l_subrc = 0.
*        MESSAGE I611 WITH L_PROGNAME.
      ELSE.
        EXIT.
      ENDIF.
    ELSE.
      EXIT.
    ENDIF.
  ENDIF.
* create program attributes
  CLEAR trdir.
  trdir-name = l_progname.
  trdir-subc = '1'.
  CALL FUNCTION 'RS_EDTR_ATTR_ADD'
    EXPORTING
      program_name          = l_progname
      called_by_shdb        = 'X'
      with_trdir_entry      = 'X'
    IMPORTING
      leave_to_editor       = l_leave_to_editor
    CHANGING
      program_trdir         = trdir
    EXCEPTIONS
      program_name_missing  = 1
      program_exists        = 2
      wrong_parameter_value = 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.
* attributes saved?
  SELECT SINGLE * FROM trdir WHERE name = trdir-name.
  CHECK sy-subrc = 0.
* create program
ENDFORM.                    " CHECK_PRG_NAME

*&---------------------------------------------------------------------*
*&      Form  DELETE_PROGRAM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_PROGNAME  text
*      <--P_L_SUBRC  text
*----------------------------------------------------------------------*
FORM delete_program USING    p_progname
                    CHANGING p_subrc.
  DATA:  l_devclass LIKE tadir-devclass.

  CALL FUNCTION 'RS_PROGRAM_GET_DEVCLASS'
    EXPORTING
      progname = p_progname
    IMPORTING
      devclass = l_devclass
    EXCEPTIONS
      OTHERS.
  CALL FUNCTION 'RS_DELETE_PROGRAM'
    EXPORTING
      program            = p_progname
      suppress_popup     = ' '
      tadir_devclass     = l_devclass
    EXCEPTIONS
      enqueue_lock       = 1
      object_not_found   = 2
      permission_failure = 3
      reject_deletion    = 5     "abbr. in popup
      OTHERS             = 4.
  p_subrc = sy-subrc.
  IF sy-msgno = '055'. p_subrc = 1. ENDIF.  "progr. gesperrt
  IF p_subrc < 5.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " DELETE_PROGRAM
*&---------------------------------------------------------------------*
*&      Form  ASSIGN_MODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM assign_mode .

  IF p_ns = abap_true.
    gv_mode = 'N'.
  ELSEIF p_as = abap_true.
    gv_mode = 'A' .
  ELSEIF p_es = abap_true.
    gv_mode = 'E'  .
  ELSEIF p_ds = abap_true.
    gv_mode = 'P'  .
  ENDIF.

  IF p_st = abap_true.
    gv_sync = 'S'.
  ELSEIF p_at = abap_true.
    gv_sync = 'A'  .
  ENDIF.

ENDFORM.                    " ASSIGN_MODE
*&---------------------------------------------------------------------*
*&      Form  CHECK_TABLE_CONTROL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM check_table_control .
  DATA : lv_len TYPE i,
         lv_type TYPE dd01v-datatype.
  CLEAR  gv_cflag1.
  lv_len = strlen( dynpro_fields-fieldname ) .
  lv_len = lv_len - 3 .
  gv_char = dynpro_fields-fieldname+lv_len(2).

  CALL FUNCTION 'NUMERIC_CHECK'
    EXPORTING
      string_in  = gv_char
    IMPORTING
*     STRING_OUT = STRING_OUT
      htype      = lv_type.
  IF lv_type = 'CHAR'.
  ELSE.
    IF gv_cflag IS INITIAL .
      gv_cflag = abap_true.
    ENDIF.
    gv_cflag1 = abap_true.
    lv_len     = lv_len - 1.
    gv_field   = dynpro_fields-fieldname+0(lv_len).
  ENDIF.
ENDFORM.                    " CHECK_TABLE_CONTROL
*&---------------------------------------------------------------------*
*&      Form  TEST_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form TEST_FILE .
*Create Dynamic Structure

  FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
                 <dyn_wa>    TYPE any,
                 <dyn_field> TYPE any.
  DATA:           dy_table   TYPE REF TO data,
                  dy_line    TYPE REF TO data.
  DATA :lv_sum TYPE i.
  DATA :lt_table_s TYPE lvc_t_fcat ,
        ls_table_s TYPE lvc_S_fcat ,
        lv_s_name  TYPE REF TO data,
        lv_length  TYPE i,
        lv_length1  TYPE i,
        lv_str     TYPE string,
*        lv_str(30),
        lv_field(30),
        lv_value(30),
        lv_type TYPE dd01v-datatype,
        lt_dd03m TYPE TABLE OF dd03m,
        ls_dd03m TYPE dd03m.
 DATA : lv_file_path TYPE string .

LOOP AT dynpro_fields .
  SPLIT dynpro_fields-fieldname AT '-' INTO lv_str lv_field .
  IF lv_field IS NOT INITIAL.
   lv_length = strlen( lv_field ).
   lv_length = lv_length - 4 .
   lv_length1 = lv_length + 4 .
   lv_length1 = lv_length1 - 1 .
   IF lv_field+lv_length(1) = '(' AND  lv_field+lv_length1(1) = ')'.
    lv_length = lv_length + 4 .
    lv_length = lv_length - 3 .
    lv_value = lv_field+lv_length(2).
  CALL FUNCTION 'NUMERIC_CHECK'
    EXPORTING
      string_in  = lv_value
    IMPORTING
*     STRING_OUT = STRING_OUT
      htype      = lv_type.
  IF lv_type = 'CHAR'.
  ELSE.
   lv_length = lv_length - 1 .
   lv_field  = lv_field+0(lv_length).
  ENDIF.
   ENDIF.
  ENDIF.
    ls_table_s-fieldname  = lv_field .
    SELECT SINGLE * FROM dd03m INTO ls_dd03m WHERE tabname = lv_str AND fieldname = lv_field AND ddlanguage = 'EN' .
    APPEND ls_dd03m to lt_dd03m .
    ls_table_s-scrtext_m  = ls_dd03m-scrtext_m.
    IF ls_dd03m-scrtext_m IS INITIAL .
    ls_table_s-scrtext_m  = ls_dd03m-ddtext.
    ENDIF.
    ls_table_s-tabname    = lv_str .
    ls_table_s-datatype   = 'CHAR' ."ls_parame-t_f_dt   .
    ls_table_s-inttype    = 'C'."ls_parame-t_f_inty .
    ls_table_s-intlen     = 60 .
    APPEND ls_table_s TO lt_table_s .
    CLEAR ls_table_s.
ENDLOOP.

**********************************************************06/04/2015
*SORT lt_table_s.
*DELETE ADJACENT DUPLICATES FROM lt_table_s COMPARING FIELDNAME .
DATA : lt_table_s_temp TYPE lvc_T_fcat.
TYPES : BEGIN OF lt_FIELDS ,
        FIELD TYPE lvc_S_fcat-fieldname,
        COUNT TYPE I,
       END OF LT_FIELDS.
DATA : LT_FIELDS TYPE TABLE OF lt_FIELDS.
DATA : Ls_FIELDS TYPE lt_FIELDS.
*lt_table_s_temp = lt_table_s.
FIELD-SYMBOLS : <lt_table_s>  TYPE lvc_s_fcat  .
LOOP AT  lt_table_s ASSIGNING  <lt_table_s> .
  READ TABLE lt_table_s_temp INTO <lt_table_s> WITH KEY fieldname = <lt_table_s>-fieldname .
  IF sy-subrc = 0.
    READ TABLE lt_FIELDS INTO ls_fields WITH KEY fielD  = <lt_table_s>-fieldname .
    IF SY-subrc = 0.
      ls_fields-field =  <lt_table_s>-fieldname .
      ls_fields-count =  ls_fields-count + 1.
      MODIFY lt_FIELDS FROM ls_fields INDEX sy-tabix.
    ELSE.
      ls_fields-field = <lt_table_s>-fieldname .
      ls_fields-count = 1 .
      APPEND ls_fields to lt_FIELDS .
    ENDIF.
    DATA  : co(1).
    co = ls_fields-Count .
    CONCATENATE <lt_table_s>-fieldname'_'co INTO <lt_table_s>-fieldname .
    CONDENSE <lt_table_s>-fieldname .
  ELSE.
    APPEND <lt_table_s> to lt_table_s_temp.
  ENDIF.

ENDLOOP.

*********************************************************06/04/2015
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog  = lt_table_s
      i_length_in_byte = 'X'
    IMPORTING
      ep_table         = lv_s_name.

   ASSIGN lv_s_name->* TO <dyn_table>.
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.

*Adding Header Text Data
  APPEND <dyn_wa> TO <dyn_table>.
  DATA ls_table_index TYPE i VALUE 1.
  LOOP AT lt_table_s INTO ls_table_s.
    READ TABLE  <dyn_table> INTO  <dyn_wa> INDEX 1.
    ASSIGN COMPONENT ls_table_index OF STRUCTURE <dyn_wa> TO <dyn_field> .
    ls_table_index = ls_table_index + 1.
    <dyn_field> = ls_table_s-scrtext_m.
    MODIFY <dyn_table> FROM <dyn_wa> INDEX 1.
  ENDLOOP.

*Adding Item Data
  APPEND <dyn_wa> TO <dyn_table>.
*  DATA ls_table_index TYPE i VALUE 1.
  CLEAR ls_table_index.
  LOOP AT dynpro_fields .
    ls_table_index = sy-tabix.
    READ TABLE  <dyn_table> INTO  <dyn_wa> INDEX 2.
    ASSIGN COMPONENT ls_table_index OF STRUCTURE <dyn_wa> TO <dyn_field> .
    ls_table_index = ls_table_index + 1.
    <dyn_field> = dynpro_fields-fieldvalue.
    MODIFY <dyn_table> FROM <dyn_wa> INDEX 2.
  ENDLOOP.

*download file
  lv_file_path = P_File.
 *IF P_File = P_File1.
  CONCATENATE  lv_file_path p_grpid '.XLS' INTO lv_file_path.
* ENDIF.
 CALL FUNCTION 'GUI_DOWNLOAD' " TO DOWNLOAD A TEXT DOCUMENT
   EXPORTING
     filename                        = lv_file_path
    filetype                         = 'DAT'
   TABLES
     data_tab                        = <dyn_table>.
endform.                    " TEST_FILE
*&---------------------------------------------------------------------*
*&      Form  FILE_PATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form FILE_PATH .
*Download File
  DATA :lv_d_file   TYPE string.
  cl_gui_frontend_services=>get_desktop_directory(
  CHANGING
    desktop_directory    = lv_d_file    " Desktop Directory
  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.
  ELSE.
    CALL METHOD cl_gui_cfw=>flush.
    CONCATENATE lv_d_file '\' INTO p_file.
    P_File1 = P_File.
 ENDIF.
endform.                    " FILE_PATH
*&---------------------------------------------------------------------*
*&      Form  F4_HELP_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form F4_HELP_FILE .
   CALL FUNCTION 'F4_FILENAME'
   EXPORTING
     PROGRAM_NAME        = SYST-CPROG
     DYNPRO_NUMBER       = SYST-DYNNR
  IMPORTING
     FILE_NAME           = P_File.
endform.                    " F4_HELP_FILE