Main Program
REPORT ZCA_ADRC_UPLOAD.
include zca_adrc_upload_top.
include zca_adrc_upload_sel.
include zca_adrc_upload_event_handler.
include zca_adrc_upload_frm.
AT SELECTION-SCREEN OUTPUT.
PERFORM modify_screen.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*-- Search help for application server
PERFORM appserver_file_dialog.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dfile.
*-- Search help for application server
PERFORM presentation_file_dialog.
INITIALIZATION.
CLEAR : gv_filename.
*** Program Execution - F8 ( Execute )
START-OF-SELECTION.
*** Read data from selected input file.
PERFORM read_file_data.
PERFORM update_data_in_sap.
*--------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM display_output.
Top Program
TYPES : BEGIN OF ty_file_data,
city1 TYPE adrc-city1,
region TYPE adrc-region,
END OF ty_file_data.
TYPES : BEGIN OF ty_input_data,
city1 TYPE adrc-city1,
region TYPE adrc-region,
END OF ty_input_data.
TYPES : BEGIN OF ty_output,
indicator(4) TYPE C,
type TYPE bapi_mtype,
id TYPE symsgid,
number TYPE symsgno,
message TYPE bapi_msg,
comments TYPE char100,
END OF ty_output.
DATA : gt_file_data TYPE TABLE OF ty_file_data,
gt_input_data TYPE TABLE OF ty_input_data,
gt_output TYPE TABLE OF ty_output.
DATA : gv_filename TYPE string.
Selection Screen
TABLES : ADRC.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: rb1 TYPE c RADIOBUTTON GROUP rg1 USER-COMMAND uc DEFAULT 'X' ,
rb2 TYPE c RADIOBUTTON GROUP rg1,
p_file TYPE dxfields-longpath LOWER CASE MODIF ID gr2, "OBLIGATORY,
p_dfile TYPE dxfields-longpath MODIF ID gr1.
SELECTION-SCREEN END OF BLOCK b1.
"File Parameters
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_delim TYPE char1 OBLIGATORY DEFAULT ',',
p_hrows TYPE numc2 DEFAULT 01,
p_header AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN: END OF BLOCK b2.
" User Selection
SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE TEXT-003.
SELECT-OPTIONS:
s_city FOR adrc-CITY1,
s_zip FOR adrc-POST_CODE1.
SELECTION-SCREEN END OF BLOCK a.
" Output File
SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE TEXT-004.
PARAMETERS:
pfilenm TYPE char50 DEFAULT 'Failed_Address_uUpdates.txt',
pfolder LIKE rlgrap-filename MEMORY ID mfolder "#EC EXISTS
DEFAULT 'C:\Temp'.
SELECTION-SCREEN END OF BLOCK b4.
Event Handler
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
class lcl_event_handler definition.
public section.
methods on_double_click for event double_click of cl_salv_events_table
importing row column.
endclass. "cl_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
class lcl_event_handler implementation.
method on_double_click.
* if column eq 'MATNR'.
* read table gt_material into data(wa_st_data) index row.
*
** Check that material exists
* select count( * ) from mara up to 1 rows where matnr eq wa_st_data-matnr.
*
* if sy-subrc = 0. " Exists?
** Load parameters
* set parameter id 'MXX' field 'K'. " Default view
* set parameter id 'MAT' field wa_st_data-matnr. " Material number
*
* call transaction 'MM03' and skip first screen.
* else. " No ?
*
* call function 'CONVERSION_EXIT_ALPHA_OUTPUT'
* exporting
* input = wa_st_data-matnr
* importing
* output = wa_st_data-matnr.
*
* data(lv_err) = `Material ` && wa_st_data-matnr && ` does not exist.`.
* message lv_err type 'I' display like 'E'.
* endif.
* else.
* message text-002 type 'I'. " Invalid cell
* endif.
endmethod. "on_double_click
endclass. "cl_handler IMPLEMENTATION
Form Routine
**&---------------------------------------------------------------------*
**& Form MODIFY_SCREEN
**&---------------------------------------------------------------------*
**& text
**&---------------------------------------------------------------------*
**& --> p1 text
**& <-- p2 text
**&---------------------------------------------------------------------*
FORM modify_screen .
IF rb1 = abap_true.
LOOP AT SCREEN.
IF screen-group1 = 'GR2'.
screen-active = 0.
ELSE.
screen-active = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ELSE.
LOOP AT SCREEN.
IF screen-group1 = 'GR1'.
screen-active = 0.
ELSE.
screen-active = 1.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDFORM.
**&---------------------------------------------------------------------*
**& Form READ_FILE
**&---------------------------------------------------------------------*
**& text
**&---------------------------------------------------------------------*
**& --> p1 text
**& <-- p2 text
**&---------------------------------------------------------------------*
FORM presentation_file_dialog.
* gv_filename = gr_obj->zif_file_handler~popup_file_browser( ).
DATA : lt_files TYPE filetable,
lv_subrc TYPE sy-subrc.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select a File'
CHANGING
file_table = lt_files
rc = lv_subrc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
READ TABLE lt_files ASSIGNING FIELD-SYMBOL(<fs_file>) INDEX 1.
IF sy-subrc EQ 0.
gv_filename = <fs_file>-filename.
ENDIF.
ENDIF.
p_dfile = gv_filename.
ENDFORM.
*
FORM appserver_file_dialog.
*-- Call F4 help to select the application server file path
CALL FUNCTION '/SAPDMC/LSM_F4_SERVER_FILE'
IMPORTING
serverfile = p_file
EXCEPTIONS
canceled_by_user = 1
OTHERS = 2.
IF sy-subrc = 0.
gv_filename = p_file.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form READ_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM read_file_from_desktop.
TYPES:
BEGIN OF lty_file_upload,
file TYPE char128,
END OF lty_file_upload.
DATA : lv_filename_converted TYPE rlgrap-filename,
lt_file_upload TYPE TABLE OF lty_file_upload,
lv_file TYPE string.
**** For Excel Read
* lv_filename_converted = gv_filename.
* TRANSLATE lv_filename_converted TO UPPER CASE.
* CALL FUNCTION 'UPLOAD_XLS_FILE_2_ITAB'
* EXPORTING
* i_filename = lv_filename_converted
* TABLES
* e_itab = gt_excel_data
* EXCEPTIONS
* file_error = 1
* OTHERS = 2.
* IF sy-subrc <> 0.
* MESSAGE 'Error while reading the file'(001) TYPE 'E'.
* ENDIF.
lv_file = gv_filename.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_file
has_field_separator = abap_true
TABLES
data_tab = lt_file_upload
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
OTHERS = 17.
IF sy-subrc EQ 0.
LOOP AT lt_file_upload ASSIGNING FIELD-SYMBOL(<fs_file_upload>).
APPEND INITIAL LINE TO gt_input_data ASSIGNING FIELD-SYMBOL(<fs_input_data>).
SPLIT <fs_file_upload> AT p_delim
INTO <fs_input_data>-city1 <fs_input_data>-region.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form READ_FILE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM read_file_data.
IF rb1 = abap_true .
PERFORM read_file_from_desktop.
ELSE.
PERFORM read_file_from_server.
ENDIF.
ENDFORM. " READ_FILE_DATA
*&---------------------------------------------------------------------*
*& Form READ_FILE_FROM_SERVER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM read_file_from_server.
DATA : ls_input_data TYPE ty_input_data,
lv_file TYPE string,
lv_string TYPE string,
lv_dummy TYPE string.
CLEAR : gt_input_data.
lv_file = gv_filename.
TRANSLATE lv_file TO LOWER CASE.
* Open file from the application server.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED.
IF sy-subrc = 0.
DO.
* Read data from the file and populate internal table.
CLEAR : ls_input_data, lv_string.
READ DATASET lv_file INTO lv_string.
IF sy-subrc = 0.
SPLIT lv_string AT p_delim INTO
ls_input_data-city1 ls_input_data-region
lv_dummy.
APPEND ls_input_data TO gt_input_data.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET lv_file.
ELSE.
MESSAGE 'ERROR Reading File'(m08) TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPDATE_DATA_IN_SAP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM update_data_in_sap .
DATA lt_return TYPE TABLE OF bapiret2.
APPEND INITIAL LINE TO lt_return ASSIGNING FIELD-SYMBOL(<fs_return>).
<fs_return>-id = 'Z1'.
<fs_return>-type = 'E'.
<fs_return>-message = 'Error'.
APPEND INITIAL LINE TO lt_return ASSIGNING <fs_return>.
<fs_return>-id = 'Z1'.
<fs_return>-type = 'W'.
<fs_return>-message = 'Warning'.
APPEND INITIAL LINE TO lt_return ASSIGNING <fs_return>.
<fs_return>-id = 'Z1'.
<fs_return>-type = 'S'.
<fs_return>-message = 'Success'.
APPEND INITIAL LINE TO lt_return ASSIGNING <fs_return>.
<fs_return>-id = 'Z1'.
<fs_return>-type = 'I'.
<fs_return>-message = 'Information'.
*** IF BAPI Return Exists.
LOOP AT lt_return ASSIGNING <fs_return>.
APPEND INITIAL LINE TO gt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
MOVE-CORRESPONDING <fs_return> TO <fs_output>.
ENDLOOP.
ENDFORM. " UPDATE_DATA_IN_SAP
FORM add_indicators.
LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
CASE <fs_output>-type.
WHEN 'E' OR 'A' OR 'X'.
<fs_output>-indicator = '@0A@'.
WHEN 'W'.
<fs_output>-indicator = '@09@'.
WHEN 'S'.
<fs_output>-indicator = '@08@'.
WHEN OTHERS.
<fs_output>-indicator = '@EB@'.
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY_OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM display_output .
DATA: lo_gr_alv TYPE REF TO cl_salv_table, " Variables for ALV properties
lo_gr_functions TYPE REF TO cl_salv_functions_list.
DATA: lo_event_handler TYPE REF TO lcl_event_handler, " Variables for events
lo_events TYPE REF TO cl_salv_events_table.
DATA: lo_grid TYPE REF TO cl_salv_form_layout_grid, " Variables for header
lo_layout_logo TYPE REF TO cl_salv_form_layout_logo,
lo_content TYPE REF TO cl_salv_form_element,
lv_title TYPE string,
lv_rows TYPE string.
DATA: lo_layout TYPE REF TO cl_salv_layout, " Variables for enabling Save button
lv_key TYPE salv_s_layout_key.
DATA: lo_display TYPE REF TO cl_salv_display_settings. " Variable for layout settings
DATA: lo_selections TYPE REF TO cl_salv_selections, " Variables for selection mode and column properties
lo_columns TYPE REF TO cl_salv_columns.
* lo_column type ref to cl_salv_column_table.
* Create the ALV object
PERFORM add_indicators.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = lo_gr_alv
CHANGING
t_table = gt_output.
CATCH cx_salv_msg.
ENDTRY.
* Let's show all default buttons of ALV
lo_gr_functions = lo_gr_alv->get_functions( ).
lo_gr_functions->set_all( abap_true ).
* Fit the columns
lo_columns = lo_gr_alv->get_columns( ).
lo_columns->set_optimize( 'X' ).
* Create header
DESCRIBE TABLE gt_output LINES lv_rows.
CONCATENATE 'Number of lv_rows: ' lv_rows INTO lv_title SEPARATED BY space.
CREATE OBJECT lo_grid.
CREATE OBJECT lo_layout_logo.
lo_grid->create_label( row = 1 column = 1 text = lv_title tooltip = lv_title ).
lo_layout_logo->set_left_content( lo_grid ).
lo_content = lo_layout_logo.
lo_gr_alv->set_top_of_list( lo_content ).
* Apply zebra style to lv_rows
lo_display = lo_gr_alv->get_display_settings( ).
lo_display->set_striped_pattern( cl_salv_display_settings=>true ).
* Enable the save layout buttons
lv_key-report = sy-repid.
lo_layout = lo_gr_alv->get_layout( ).
lo_layout->set_key( lv_key ).
lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
lo_layout->set_default( abap_true ).
* Register events
lo_events = lo_gr_alv->get_event( ).
CREATE OBJECT lo_event_handler.
SET HANDLER lo_event_handler->on_double_click FOR lo_events.
* Enable cell selection mode
lo_selections = lo_gr_alv->get_selections( ).
lo_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
*
PERFORM set_column_name USING lo_columns 'COMMENTS' 'Comments'.
PERFORM set_column_width USING lo_columns 'COMMENTS' 100.
lo_gr_alv->display( ).
ENDFORM. " DISPLAY_OUTPUT
FORM set_column_name USING po_columns TYPE REF TO cl_salv_columns
p_field_name TYPE LVC_FNAME
p_field_label.
TRY.
DATA : lo_column TYPE REF TO cl_salv_column_table.
lo_column ?= po_columns->get_column( p_field_name ). " Find the 'MAKTX' column ans change attributes
lo_column->set_visible( if_salv_c_bool_sap=>true ).
lo_column->set_long_text( p_field_label ).
lo_column->set_medium_text( p_field_label ).
lo_column->set_short_text( p_field_label ).
CATCH cx_salv_not_found.
CATCH cx_salv_existing.
CATCH cx_salv_data_error.
ENDTRY.
ENDFORM.
FORM set_column_width USING po_columns TYPE REF TO cl_salv_columns
p_field_name TYPE LVC_FNAME
p_width TYPE LVC_OUTLEN.
TRY.
DATA : lo_column TYPE REF TO cl_salv_column_table.
lo_column ?= po_columns->get_column( p_field_name ). " Find the 'MAKTX' column ans change attributes
lo_column->set_output_length( p_width ).
CATCH cx_salv_not_found.
CATCH cx_salv_existing.
CATCH cx_salv_data_error.
ENDTRY.
ENDFORM.
Output :
Selection Screen

Report output after execution

End