File Upload Program

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

%d bloggers like this: