*&---------------------------------------------------------------------*
*& Report ZUPLOAD
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZUPLOAD MESSAGE-ID zx_message.
*----------------------------------------------------------------------*
* CLASS upload DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS upload DEFINITION.
PUBLIC SECTION.
CLASS-METHODS open_file.
METHODS start.
METHODS end.
METHODS free_log.
METHODS display_output.
METHODS display_log.
PRIVATE SECTION.
CONSTANTS c_max_ranges TYPE i VALUE 100.
CONSTANTS c_seperator TYPE abap_char1 VALUE cl_abap_char_utilities=>horizontal_tab.
DATA upload_file_tab TYPE REF TO data.
DATA upload_file_row TYPE REF TO data.
DATA t_tab_file TYPE TABLE OF string.
DATA o_struc_type TYPE REF TO cl_abap_structdescr.
DATA s_log TYPE bal_s_log.
DATA log_handle TYPE balloghndl.
DATA t_log_handle TYPE bal_t_logh.
DATA o_ccont_display TYPE REF TO cl_gui_custom_container.
DATA o_ccont_log TYPE REF TO cl_gui_custom_container.
DATA dummy.
DATA t_filecontent TYPE string_table.
METHODS convert_file2struc IMPORTING i_header TYPE boolean
i_separator TYPE c.
METHODS create_table_and_row.
METHODS read_file IMPORTING i_file TYPE string.
METHODS open_log.
METHODS add_msg.
ENDCLASS. "upload DEFINITION
DATA o_upload TYPE REF TO upload.
DATA s_t001 TYPE t001.
*--------------------------------------------------------------------*
* File Location
SELECTION-SCREEN BEGIN OF BLOCK file WITH FRAME TITLE text-f01.
PARAMETERS:
p_file TYPE rlgrap-filename OBLIGATORY,
p_header AS CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN END OF BLOCK file.
*--------------------------------------------------------------------*
* Material selection
SELECTION-SCREEN BEGIN OF BLOCK bukrs WITH FRAME TITLE text-001.
*--- company options
SELECT-OPTIONS s_bukrs FOR s_t001-bukrs.
SELECTION-SCREEN END OF BLOCK bukrs.
*--------------------------------------------------------------------*
* Defaults
SELECTION-SCREEN BEGIN OF BLOCK intr WITH FRAME TITLE text-t03.
PARAMETERS:
p_struc TYPE strukname DEFAULT 'T001'.
SELECTION-SCREEN END OF BLOCK intr.
*--------------------------------------------------------------------*
* F4
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
upload=>open_file( ).
*--------------------------------------------------------------------*
START-OF-SELECTION.
CREATE OBJECT o_upload.
o_upload->start( ).
*--------------------------------------------------------------------*
END-OF-SELECTION.
o_upload->end( ).
CALL SCREEN 0100.
*----------------------------------------------------------------------*
* CLASS upload IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS upload IMPLEMENTATION.
METHOD open_file.
DATA:
l_t_file_table TYPE TABLE OF file_table,
l_s_file_table TYPE file_table.
DATA l_subrc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
CHANGING
file_table = l_t_file_table
rc = l_subrc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
READ TABLE l_t_file_table INTO l_s_file_table INDEX 1.
p_file = l_s_file_table-filename.
ENDMETHOD. "open_file
METHOD start.
DATA l_file TYPE string.
l_file = p_file.
open_log( ).
create_table_and_row( ).
read_file( i_file = l_file ).
convert_file2struc( i_header = p_header
i_separator = c_seperator ).
ENDMETHOD. "start
METHOD create_table_and_row.
DATA l_type TYPE string.
DATA lo_type TYPE REF TO cl_abap_typedescr.
DATA lo_tabletype TYPE REF TO cl_abap_tabledescr.
l_type = p_struc.
CALL METHOD cl_abap_structdescr=>describe_by_name
EXPORTING
p_name = l_type
RECEIVING
p_descr_ref = lo_type
EXCEPTIONS
type_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
o_struc_type ?= lo_type.
CREATE DATA upload_file_row TYPE HANDLE o_struc_type.
TRY.
CALL METHOD cl_abap_tabledescr=>create
EXPORTING
p_line_type = o_struc_type
* P_TABLE_KIND = TABLEKIND_STD
* P_UNIQUE = ABAP_FALSE
* P_KEY =
* P_KEY_KIND = KEYDEFKIND_DEFAULT
RECEIVING
p_result = lo_tabletype
.
CATCH cx_sy_table_creation .
ENDTRY.
CREATE DATA upload_file_tab TYPE HANDLE lo_tabletype.
* Structure mapped successfully
MESSAGE s181 INTO dummy.
add_msg( ).
ENDMETHOD. "create_table_and_row
METHOD convert_file2struc.
DATA:
l_struc TYPE REF TO data,
l_o_datadescr TYPE REF TO cl_abap_datadescr,
l_o_tabledescr TYPE REF TO cl_abap_tabledescr,
l_t_fields TYPE string_table,
l_s_fields TYPE string.
FIELD-SYMBOLS:
<l_filecontent> TYPE ANY,
<l_field> TYPE ANY,
<l_row> TYPE ANY,
<l_struc_content> TYPE table.
ASSIGN upload_file_row->* TO <l_row>.
ASSIGN upload_file_tab->* TO <l_struc_content>.
LOOP AT t_filecontent ASSIGNING <l_filecontent>.
IF i_separator IS INITIAL. " File is same as structure
<l_row> = <l_filecontent>.
ELSE.
*---split based on the separator
SPLIT <l_filecontent> AT i_separator INTO TABLE l_t_fields.
LOOP AT l_t_fields INTO l_s_fields.
ASSIGN COMPONENT sy-tabix OF STRUCTURE <l_row> TO <l_field>.
<l_field> = l_s_fields.
ENDLOOP.
ENDIF.
APPEND <l_row> TO <l_struc_content>.
ENDLOOP.
ENDMETHOD. "convert_file2struc
METHOD end.
ENDMETHOD. "end
METHOD open_log.
* create a log
s_log-extnumber = 'Application Log in Subscreen'(001).
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = s_log
IMPORTING
e_log_handle = log_handle
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
INSERT log_handle INTO TABLE t_log_handle.
* Log opened successfully
MESSAGE s180 INTO dummy.
add_msg( ).
ENDMETHOD. "open_log
METHOD add_msg.
DATA:
l_s_msg TYPE bal_s_msg.
* define data of message for Application Log
l_s_msg-msgty = sy-msgty.
l_s_msg-msgid = sy-msgid.
l_s_msg-msgno = sy-msgno.
l_s_msg-msgv1 = sy-msgv1.
l_s_msg-msgv2 = sy-msgv2.
l_s_msg-msgv3 = sy-msgv3.
l_s_msg-msgv4 = sy-msgv4.
* add this message to log file
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_log_handle = log_handle
i_s_msg = l_s_msg
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD. "add_msg
METHOD free_log.
* free all data (this must NOT be forgotten !)
CALL FUNCTION 'BAL_DSP_OUTPUT_FREE'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD. "free_log
METHOD display_output.
DATA:
l_r_table TYPE REF TO cl_salv_table,
* l_r_event_handler TYPE REF TO l_cl_event_handler,
l_r_events TYPE REF TO cl_salv_events_table,
l_t_salv_t_int4_column TYPE salv_t_int4_column,
l_s_salv_t_int4_column TYPE LINE OF salv_t_int4_column.
FIELD-SYMBOLS <l_upload_file_tab> TYPE table.
ASSIGN upload_file_tab->* TO <l_upload_file_tab>.
*--------------------------------------------------------------------*
IF o_ccont_display IS INITIAL.
* Create holder container
CREATE OBJECT o_ccont_display
EXPORTING
* PARENT =
container_name = 'CCONTROL_0101'
* STYLE =
* LIFETIME = lifetime_default
* REPID =
* DYNNR =
* NO_AUTODEF_PROGID_DYNNR =
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*--------------------------------------------------------------------*
* Create AVL table
TRY.
cl_salv_table=>factory(
EXPORTING
r_container = o_ccont_display
IMPORTING
r_salv_table = l_r_table
CHANGING
t_table = <l_upload_file_tab> ).
CATCH cx_salv_msg. "#EC NO_HANDLER
ENDTRY.
*--------------------------------------------------------------------*
* Functions
DATA:
lr_functions TYPE REF TO cl_salv_functions_list.
lr_functions = l_r_table->get_functions( ).
* lr_functions->set_aggregation_total( abap_true ).
lr_functions->set_default( abap_true ).
* Columns
DATA:
lr_columns TYPE REF TO cl_salv_columns_table,
lr_column TYPE REF TO cl_salv_column.
lr_columns = l_r_table->get_columns( ).
lr_columns->set_optimize( abap_true ).
TRY.
CALL METHOD lr_columns->set_exception_column
EXPORTING
value = 'TRAFFIC_LIGHT'
group = '2'
condensed = if_salv_c_bool_sap=>false.
CATCH cx_salv_data_error .
ENDTRY.
TRY.
CALL METHOD lr_columns->set_cell_type_column
EXPORTING
value = 'CELL_TYPE'.
CATCH cx_salv_data_error .
ENDTRY.
l_r_table->display( ).
ENDIF.
ENDMETHOD. "get_e1maktm
METHOD display_log.
DATA:
l_r_table TYPE REF TO cl_salv_table,
* l_r_event_handler TYPE REF TO l_cl_event_handler,
l_r_events TYPE REF TO cl_salv_events_table,
l_t_salv_t_int4_column TYPE salv_t_int4_column,
l_s_salv_t_int4_column TYPE LINE OF salv_t_int4_column.
DATA ls_display_profile TYPE bal_s_prof.
DATA l_control_handle TYPE balcnthndl.
FIELD-SYMBOLS <l_upload_file_tab> TYPE table.
*--------------------------------------------------------------------*
* Create holder container
IF o_ccont_log IS INITIAL.
CREATE OBJECT o_ccont_log
EXPORTING
* PARENT =
container_name = 'CCONTROL_0102'
* STYLE =
* LIFETIME = lifetime_default
* REPID =
* DYNNR =
* NO_AUTODEF_PROGID_DYNNR =
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* get a display profile which describes how to display messages
CALL FUNCTION 'BAL_DSP_PROFILE_NO_TREE_GET'
IMPORTING
e_s_display_profile = ls_display_profile.
ls_display_profile-no_toolbar = 'X'.
*--------------------------------------------------------------------*
* create control to display data
CALL FUNCTION 'BAL_CNTL_CREATE'
EXPORTING
i_container = o_ccont_log
i_s_display_profile = ls_display_profile
i_t_log_handle = t_log_handle
IMPORTING
e_control_handle = l_control_handle
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
ENDMETHOD. "display_log
METHOD read_file.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = i_file
* has_field_separator = 'X'
CHANGING
data_tab = t_filecontent
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD. "read_file
ENDCLASS. "upload IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Module status_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
* set status and title
SET PF-STATUS 'STATUS'.
SET TITLEBAR 'TITLE'.
* flush data to frontend
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE. " status_0100 OUTPUT
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'TAB_STRIP'
CONSTANTS: BEGIN OF c_tab_strip,
tab1 LIKE sy-ucomm VALUE 'TAB_STRIP_FC1',
tab2 LIKE sy-ucomm VALUE 'TAB_STRIP_FC2',
END OF c_tab_strip.
*&SPWIZARD: DATA FOR TABSTRIP 'TAB_STRIP'
CONTROLS: tab_strip TYPE TABSTRIP.
DATA: BEGIN OF g_tab_strip,
subscreen LIKE sy-dynnr,
prog LIKE sy-repid VALUE 'Zupload',
pressed_tab LIKE sy-ucomm VALUE c_tab_strip-tab1,
END OF g_tab_strip.
DATA: ok_code LIKE sy-ucomm.
*&SPWIZARD: OUTPUT MODULE FOR TS 'TAB_STRIP'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE tab_strip_active_tab_set OUTPUT.
tab_strip-activetab = g_tab_strip-pressed_tab.
CASE g_tab_strip-pressed_tab.
WHEN c_tab_strip-tab1.
g_tab_strip-subscreen = '0101'.
WHEN c_tab_strip-tab2.
g_tab_strip-subscreen = '0102'.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE. "TAB_STRIP_ACTIVE_TAB_SET OUTPUT
*&SPWIZARD: INPUT MODULE FOR TS 'TAB_STRIP'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE tab_strip_active_tab_get INPUT.
ok_code = sy-ucomm.
CASE ok_code.
WHEN c_tab_strip-tab1.
g_tab_strip-pressed_tab = c_tab_strip-tab1.
WHEN c_tab_strip-tab2.
g_tab_strip-pressed_tab = c_tab_strip-tab2.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE. "TAB_STRIP_ACTIVE_TAB_GET INPUT
*&---------------------------------------------------------------------*
*& Module user_command_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code.
* leave this screen
WHEN 'ABBR' OR 'BACK' OR 'BEEN'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
* Delete log profile
o_upload->free_log( ).
* call dispatch method of control framwork
CALL METHOD cl_gui_cfw=>dispatch.
ENDMODULE. " user_command_0100 INPUT
*&---------------------------------------------------------------------*
*& Module display_output OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE display_output OUTPUT.
o_upload->display_output( ).
ENDMODULE. " display_output OUTPUT
*&---------------------------------------------------------------------*
*& Module display_log OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE display_log OUTPUT.
o_upload->display_log( ).
ENDMODULE. " display_log OUTPUT