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