Code20070214 - ooxxvv/MySAPnotes GitHub Wiki

Code20070214

  • 將報表分別存到 Local PC 、 Server 及產生報表
  • 包含利用物件來動態產生 Internal table 的結構
  • 包含如何用程式來取得 AVL 的 Variant 及其設定內容

Code

REPORT zfis00001 NO STANDARD PAGE HEADING
         MESSAGE-ID zx01
         LINE-SIZE 1023
         LINE-COUNT 65.

************************************************************************
*        Variable                                                      *
************************************************************************
*---For data
TABLES: mara.
DATA: it_data LIKE mara OCCURS 0 WITH HEADER LINE.

*---For download
FIELD-SYMBOLS: <it_download> TYPE table, "Download data internal table
               <wa_download> TYPE ANY.   "Download data work area
DATA: g_subrc LIKE syst-subrc.           "Set structure successful or not
DATA: BEGIN OF it_field_text OCCURS 0,   "Download data line (on server)
        scrtext_m LIKE dfies-scrtext_m,
      END OF it_field_text.


************************************************************************
*        Selection-Screen                                              *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bk01 WITH FRAME TITLE text-s01.
SELECT-OPTIONS: s_matnr FOR mara-matnr.              "Material NO.
SELECTION-SCREEN END OF BLOCK bk01.

SELECTION-SCREEN BEGIN OF BLOCK bk02 WITH FRAME TITLE text-s02.
PARAMETERS: p_var LIKE disvariant-variant.           "ALV variant
SELECTION-SCREEN END OF BLOCK bk02.

SELECTION-SCREEN BEGIN OF BLOCK bk03 WITH FRAME TITLE text-s03.
PARAMETERS: p_report TYPE c AS CHECKBOX DEFAULT 'X'. "Output Report

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_nodown TYPE c RADIOBUTTON GROUP gr00   "No download
           USER-COMMAND ra0.
SELECTION-SCREEN COMMENT (20) text-s04.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_server TYPE c RADIOBUTTON GROUP gr00.  "Download to server
SELECTION-SCREEN COMMENT (20) text-s05.
PARAMETERS: p_file_s LIKE ibipparms-path.            "Server path & file name
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_local TYPE c RADIOBUTTON GROUP gr00.   "Download to local
SELECTION-SCREEN COMMENT (20) text-s06.
PARAMETERS: p_file_l LIKE rlgrap-filename.           "Local path & file name
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK bk03.


************************************************************************
*        Initialization                     *
************************************************************************
INITIALIZATION.
  PERFORM get_default_alv_variant CHANGING p_var.
  PERFORM ini_file_path.

************************************************************************
*        At selection-screen                  *
************************************************************************
AT SELECTION-SCREEN OUTPUT.
  PERFORM file_path_control.

AT SELECTION-SCREEN.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
  PERFORM f4_alv_variant CHANGING p_var.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file_l.
  PERFORM f4_local_filename CHANGING p_file_l.

************************************************************************
*        Start of selection                   *
************************************************************************
START-OF-SELECTION.
  PERFORM file_path_control.
*---Get data
  PERFORM get_data.

  IF p_nodown NE 'X'.
*---Set structure & get data
    PERFORM get_data_by_alv_variant USING  p_var    "ALV variant
                                           'MARA'   "Structure name
                                  CHANGING g_subrc. "Return status

    IF g_subrc NE 0.
      STOP.
    ENDIF.

*---Download data
    CASE 'X'.
      WHEN p_local.
        PERFORM download_to_local.
      WHEN p_server.
        PERFORM download_to_server.
    ENDCASE.
  ENDIF.

*---Output ALV report
  IF p_report EQ 'X'.
    PERFORM output_data_alv.
  ENDIF.


************************************************************************
*        End of selelction                   *
************************************************************************
END-OF-SELECTION.











************************************************************************
*        Form                                                          *
************************************************************************
*&---------------------------------------------------------------------*
*&   Form ini_file_path
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM ini_file_path .

  p_file_l  =  'C:\test.txt'.
  p_file_s  =  '/tmp/test.txt'.

ENDFORM.          " ini_file_path
*&---------------------------------------------------------------------*
*&   Form file_path_control
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM file_path_control .

  LOOP AT SCREEN.
    CASE screen-name.
      WHEN 'P_FILE_S'.
        IF p_server EQ 'X'.
          screen-required = 1.
        ELSE.
          screen-input = 0.
        ENDIF.
        MODIFY SCREEN.
      WHEN 'P_FILE_L'.
        IF p_local EQ 'X'.
          screen-required = 1.
        ELSE.
          screen-input = 0.
        ENDIF.
        MODIFY SCREEN.
    ENDCASE.
  ENDLOOP.

ENDFORM.          " file_path_control
*&---------------------------------------------------------------------*
*&   Form output_data_alv
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
FORM output_data_alv .
  TYPE-POOLS: slis.
  DATA: lt_fieldcat   TYPE slis_t_fieldcat_alv, "ALV field setting
        lw_variant    LIKE disvariant,          "ALV variant
        lw_layout     TYPE slis_layout_alv,     "ALV layout
        l_var_save(1) TYPE c,                   "ALV variant can be save or not
        lt_event      TYPE slis_t_event,        "ALV events perform name
        lt_sort       TYPE slis_t_sortinfo_alv. "ALV fields sort

  DATA: l_tabname  LIKE dd02l-tabname.    "Structure name for ALV fields

*---1. Input AVL setting
*------1.1 Set structure name for ALV fields
  l_tabname = 'MARA'.

*------1.2 Set ALV layout
  lw_layout-totals_text    =  text-h01. " Totals
  lw_layout-subtotals_text  = text-h02. " Subtotal
  lw_layout-zebra       = 'X'.    " Striped pattern
  lw_layout-colwidth_optimize = 'X'.

*------1.3 Get ALV field setting from ABAP dictionary
  CLEAR: lt_fieldcat, lt_fieldcat[].

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = sy-repid
      i_structure_name       = l_tabname
      i_client_never_display = 'X'
    CHANGING
      ct_fieldcat            = lt_fieldcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

*------1.4 Set ALV fields sort
  CLEAR: lt_sort.

*------1.5 Set ALV variant can be save or not
  l_var_save = 'A'.

*------1.6 Set ALV variant
  CLEAR: lw_variant.

  lw_variant-report = sy-repid.
  lw_variant-variant = p_var.

*------1.7 Set ALV events perform name
  CLEAR: lt_event.


*---2. Call ALV output function to output data
  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      i_structure_name   = l_tabname
      is_layout          = lw_layout
      it_fieldcat        = lt_fieldcat
      it_sort            = lt_sort
      i_save             = l_var_save
      is_variant         = lw_variant
      it_events          = lt_event
    TABLES
      t_outtab           = it_data
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.

ENDFORM.          " output_data_alv
*&---------------------------------------------------------------------*
*&   Form download_to_local
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
* --> p1    text
* <-- p2    text
*----------------------------------------------------------------------*
FORM download_to_local .
  DATA: l_filename TYPE string.

  CLEAR: l_filename.
  l_filename = p_file_l.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = l_filename
      write_field_separator   = 'X'
    TABLES
      data_tab                = <it_download>
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE i398(00) WITH 'Download error, sy-subrc = ' sy-subrc.
  ELSE.
    MESSAGE s398(00) WITH 'Download succeed'.
  ENDIF.

ENDFORM.          " download_to_local
*&---------------------------------------------------------------------*
*&   Form download_to_server
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
* --> p1    text
* <-- p2    text
*----------------------------------------------------------------------*
FORM download_to_server .
  FIELD-SYMBOLS: <l_field> TYPE ANY.
  DATA: l_line TYPE string,
     l_subrc LIKE sy-subrc,
     l_index LIKE sy-index.

*---1. Set SEPARATED symbol
  DATA: l_tab(1) TYPE c.
  l_tab = cl_abap_char_utilities = >horizontal_tab.

*---2. Transfer to Dataset
  OPEN DATASET p_file_s FOR OUTPUT IN TEXT MODE.

  IF sy-subrc NE 0.
    MESSAGE i398(00) WITH 'Open file error !'.

  ELSE.
    LOOP AT <it_download> INTO <wa_download>.
      CLEAR: l_line, l_subrc, l_index.

*------ 2.1 Concatenate all field
      WHILE l_subrc = 0.
        l_index = sy-index.
        ASSIGN COMPONENT l_index OF STRUCTURE <wa_download> TO <l_field>.
        l_subrc = sy-subrc.
        IF l_subrc EQ 0.
          CONCATENATE l_line <l_field> INTO l_line SEPARATED BY l_tab.
        ENDIF.
      ENDWHILE.
      SHIFT l_line BY 1 PLACES.

      TRANSFER l_line TO p_file_s.
    ENDLOOP.

    CLOSE DATASET p_file_s.

    IF sy-subrc NE 0.
      MESSAGE i398(00) WITH 'Write file error !'.
    ELSE.
      MESSAGE s398(00) WITH 'Write to server succeed '.
    ENDIF.

  ENDIF.

ENDFORM.          " download_to_server
*&---------------------------------------------------------------------*
*&   Form get_data
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
* --> p1    text
* <-- p2    text
*----------------------------------------------------------------------*
FORM get_data .

  SELECT *
   INTO TABLE it_data
   FROM mara
   WHERE matnr IN s_matnr.

  IF sy-subrc NE 0.
    MESSAGE i398(00) WITH 'No Data ! '.
    STOP.
  ENDIF.

ENDFORM.          " get_data
*&---------------------------------------------------------------------*
*&   Form get_default_alv_variant
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
*   <--P_P_VAR text
*----------------------------------------------------------------------*
FORM get_default_alv_variant CHANGING f_alv_variant.
  DATA: lw_variant LIKE disvariant.

*---Get program name
  CLEAR lw_variant.
  lw_variant-report = sy-cprog.

*---Get default variant on ALV
  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      i_save     = 'A'
    CHANGING
      cs_variant = lw_variant
    EXCEPTIONS
      not_found  = 2.

  IF sy-subrc = 0.
    f_alv_variant = lw_variant-variant.
  ENDIF.

ENDFORM.          " get_default_alv_variant
*&---------------------------------------------------------------------*
*&   Form ft_alv_variant
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
*   <--P_P_VAR text
*----------------------------------------------------------------------*
FORM f4_alv_variant CHANGING f_alv_variant.
  DATA: lw_variant LIKE disvariant.

*---Get program name
  CLEAR lw_variant.
  lw_variant-report = sy-cprog.

*---Get ALV variant list
  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant    = lw_variant
    IMPORTING
      es_variant    = lw_variant
    EXCEPTIONS
      not_found     = 1
      program_error = 2
      OTHERS        = 3.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    f_alv_variant = lw_variant-variant.
  ENDIF.

ENDFORM.          " ft_alv_variant
*&---------------------------------------------------------------------*
*&   Form f4_local_filename
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
*   <--P_P_FILE_L text
*----------------------------------------------------------------------*
FORM f4_local_filename CHANGING f_filename.

  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      file_name = f_filename.

ENDFORM.          " f4_local_filename
*&---------------------------------------------------------------------*
*&   Form get_data_by_alv_variant
*&---------------------------------------------------------------------*
*    text
*----------------------------------------------------------------------*
*   -->P_P_VAR text
*   -->P_0242  text
*   <--P_G_SUBRC text
*----------------------------------------------------------------------*
FORM get_data_by_alv_variant USING  f_alv_variant f_tabname
               CHANGING f_subrc.
  DATA: l_fieldname TYPE dfies-fieldname.
  DATA: l_line TYPE string,
     l_subrc LIKE sy-subrc,
     l_index LIKE sy-index.
  FIELD-SYMBOLS: <l_field> TYPE ANY.
  DATA: lt_defies_tab LIKE dfies OCCURS 0 WITH HEADER LINE.
  DATA: l_linetype TYPE REF TO cl_abap_structdescr,
     l_tabletype TYPE REF TO cl_abap_tabledescr,
     l_comp_tab TYPE     cl_abap_structdescr = >component_table,
     l_comp   LIKE LINE OF l_comp_tab,
     l_dref_tab TYPE REF TO data,
     l_dref_line TYPE REF TO data,
     l_elemtype TYPE REF TO cl_abap_elemdescr,
     l_len    TYPE i VALUE 30,
     l_no_out(1) TYPE c.
  DATA: lw_varkey LIKE ltdxkey,
     lt_defieldcat LIKE ltdxdata OCCURS 0 WITH HEADER LINE.

*---1. Initial return code
  f_subrc = 0.


*---2. Get ALV variant fields setting
  CLEAR: lw_varkey,
      lt_defieldcat, lt_defieldcat[].

  lw_varkey-report = sy-cprog.
  lw_varkey-variant = f_alv_variant.
  lw_varkey-type  = 'F'.

  CALL FUNCTION 'LT_DBDATA_READ_FROM_LTDX'
    EXPORTING
      is_varkey    = lw_varkey
    TABLES
      t_dbfieldcat = lt_defieldcat
    EXCEPTIONS
      not_found    = 1
      wrong_relid  = 2
      OTHERS       = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


*---3. If ALV variant is error
*---   then get all field by import structure name
  IF lt_defieldcat[] IS INITIAL.
    CLEAR: lt_defies_tab.
*------3.1 Get all field from Data Dictionary
    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        tabname        = f_tabname
        langu          = sy-langu
      TABLES
        dfies_tab      = lt_defies_tab
      EXCEPTIONS
        not_found      = 1
        internal_error = 2
        OTHERS         = 3.
*------3.2 Append fields setting
    IF sy-subrc = 0.
      LOOP AT lt_defies_tab.
        lt_defieldcat-key1 = lt_defies_tab-fieldname.
        lt_defieldcat-param = 'OUTPUTLEN'.
        lt_defieldcat-value = lt_defies_tab-outputlen.
        APPEND lt_defieldcat.
        CLEAR lt_defieldcat.
      ENDLOOP.
    ENDIF.

*------3.3 Check defieldcat
    IF lt_defieldcat[] IS INITIAL.
      f_subrc = 4.
      EXIT.
    ENDIF.

  ENDIF.


*---4. Set internal table structures
  LOOP AT lt_defieldcat.
*------4.1 Get field name
    l_comp-name = lt_defieldcat-key1.

    CASE lt_defieldcat-param.
*------4.2 Get field output length
      WHEN 'OUTPUTLEN'.
        l_len    = lt_defieldcat-value.
        l_elemtype = cl_abap_elemdescr = >get_c( l_len ).
        l_comp-type = l_elemtype.
*------4.3 Get field output or not
      WHEN 'NO_OUT'.
        l_no_out = lt_defieldcat-value.
      WHEN OTHERS.
    ENDCASE.

    AT END OF key1.
      IF l_no_out NE 'X'.
*------4.4 Append field name, output length
        APPEND l_comp TO l_comp_tab.

*------4.5 Get field text (scrtext_m) form Data Dictionary
        CLEAR: l_fieldname,
            lt_defies_tab, lt_defies_tab[].

        l_fieldname = l_comp-name.

        CALL FUNCTION 'DDIF_FIELDINFO_GET'
          EXPORTING
            tabname        = f_tabname
            fieldname      = l_fieldname
            langu          = sy-langu
          TABLES
            dfies_tab      = lt_defies_tab
          EXCEPTIONS
            not_found      = 1
            internal_error = 2
            OTHERS         = 3.

        IF sy-subrc <> 0.
          it_field_text-scrtext_m = space.
        ELSE.
          READ TABLE lt_defies_tab INDEX 1.
          it_field_text-scrtext_m = lt_defies_tab-scrtext_m.
        ENDIF.

        APPEND it_field_text.
        CLEAR: it_field_text.
      ENDIF.

      CLEAR: l_comp, l_no_out.
    ENDAT.
  ENDLOOP.


*---5. Set download structure
*------5.1 Set work area
  l_linetype = cl_abap_structdescr = >create( l_comp_tab ).
  CREATE DATA l_dref_line TYPE HANDLE l_linetype.
  ASSIGN l_dref_line->* TO <wa_download>.

  IF sy-subrc NE 0.
    f_subrc = sy-subrc.
    EXIT.
  ENDIF.

*------5.2 Set internal table
  l_tabletype = cl_abap_tabledescr = >create( p_line_type = l_linetype ).
  CREATE DATA l_dref_tab TYPE HANDLE l_tabletype.
  ASSIGN l_dref_tab->* TO <it_download>.

  IF sy-subrc NE 0.
    f_subrc = sy-subrc.
    EXIT.
  ENDIF.

*---6. Append data to download
*------6.1. Append title
  CLEAR: l_line, l_subrc, l_index.

  WHILE l_subrc = 0.
    l_index = sy-index.

    ASSIGN COMPONENT l_index OF STRUCTURE <wa_download> TO <l_field>.
    l_subrc = sy-subrc.

    IF l_subrc EQ 0.
      READ TABLE it_field_text INDEX l_index.
      IF sy-subrc EQ 0.
        <l_field> = it_field_text-scrtext_m.
      ELSE.
        <l_field> = space.
      ENDIF.
    ENDIF.
  ENDWHILE.

  APPEND <wa_download> TO <it_download>.

*------6.2. Append data
  LOOP AT it_data.
    MOVE-CORRESPONDING it_data TO <wa_download>.
    APPEND <wa_download> TO <it_download>.
  ENDLOOP.

ENDFORM.          " get_data_by_alv_variant
⚠️ **GitHub.com Fallback** ⚠️