Skip to Content
Author's profile photo Yurii Sychov

Uploading Appraisal documents from Excel to SAP

In this blog post I describe a flexible program to upload historic appraisal documents from Excel to SAP.

For example, lets upload 3 records for this template

/wp-content/uploads/2014/07/templ_501784.png

Create XLS file with data.

First row – names of columns

Second row – for matching data. You need to write type and element’s code in each column with data.

Uploading data are from third row. It is possible to upload 65000 documents. Number of document elements – 100.

First 5 columns of data are reserved for document name, document period, appraiser and appraisee personnel number.

/wp-content/uploads/2014/07/xls_snap_501839.png

Choose file path and run.

Results in transaction PHAP_ADMIN.

/wp-content/uploads/2014/07/res_501840.png

/wp-content/uploads/2014/07/res2_501841.png

Algorithm:

  1. Read data from XLS.

  2. Preparing/matching data.

  3. Creating template

  4. Saving document

The source code:

REPORT  ZYS_APR_UPLOAD.

PARAMETER  fpath TYPE text200 .” OBLIGATORY

DATA:  g_file TYPE filetable,
        gs_file(1024),
        g_filename LIKE rlgrap-filename ,“TYPE string,
        g_rc TYPE i,
        rec_n type i,
        it_xls   TYPE TABLE OF  ALSMEX_TABLINE,
        wa_xls   TYPE  zbhr_st_alsmex_tabline,
        it_prepare TYPE STANDARD TABLE OF zys_upload,
        wa_prepare TYPE zys_upload,
        ROW_IID type HAP_ROW_IID,
        COLUMN_IID type HAP_COLUMN_IID.

“DATA for HAP documents
DATA:
        g_template_id           TYPE hap_template_id,
        g_header_defaulting     TYPE flag,
        gs_return               TYPE bal_s_msg,
        gs_menu                 TYPE hap_s_menu,           “for status
        gs_appraisal_id         TYPE hap_s_appraisal_id,
        gs_doc_processing       TYPE hap_s_doc_processing,
        gs_header_texts         TYPE hap_s_header_texts,
        gs_header_status        TYPE hap_s_header_status,
        gs_header_dates         TYPE hap_s_header_dates,
        gt_header_add_data      TYPE hap_t_header_add_data,
        gs_header_display       TYPE hap_s_header_display,
        gt_header_appraiser     TYPE hap_t_header_appraiser WITH HEADER LINE,
        gt_header_appraisee     TYPE hap_t_header_appraisee WITH HEADER LINE,
        gt_header_p_appraiser   TYPE hap_t_header_part_appraisers WITH HEADER LINE,
        gt_header_others        TYPE hap_t_header_others,
        gt_buttons              TYPE hap_t_buttons,
        gt_body_columns         TYPE hap_t_body_columns,
        gs_body_columns         LIKE LINE of gt_body_columns,
        gt_body_elements        TYPE hap_t_body_elements,
        gs_body_elements        LIKE LINE of gt_body_elements,
        gt_body_element_descr   TYPE hap_t_body_element_descr,
        gt_body_element_buttons TYPE hap_t_body_element_buttons,
        gt_body_cells           TYPE hap_t_body_cells,
        gs_body_cells           like line of gt_body_cells,
        gt_body_cell_val_values TYPE hap_t_body_cell_val_values,
        gt_body_cell_val_ranges TYPE hap_t_body_cell_val_ranges,
        gt_body_cell_val_c_like TYPE hap_t_body_cell_val_c_like,
        gt_body_cell_val_descr  TYPE hap_t_body_cell_val_descr,
        gt_body_cell_notes      TYPE hap_t_body_cell_notes,
        ls_header_appraiser TYPE hap_s_header_appraiser,
        ls_header_appraisee TYPE hap_s_header_appraisee.

        FIELD-SYMBOLS: <body_cells> like gs_body_cells.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR fpath.
   REFRESH g_file.
   CALL METHOD cl_gui_frontend_services=>file_open_dialog
     EXPORTING
       file_filter  = cl_gui_frontend_services=>filetype_excel
       window_title = ‘File’
     CHANGING
       file_table   = g_file
       rc           = g_rc.
   READ TABLE g_file INTO gs_file INDEX 1.
   g_filename = fpath = gs_file.

START-OF-SELECTION.

   PERFORM excel_read.
   PERFORM prepare.
   PERFORM upload.

FORM excel_read.
   DATA:  x1       TYPE  i  VALUE 1,
          y1       TYPE  i  VALUE 1,
          x2       TYPE  i  VALUE 100,
          y2       TYPE  i  VALUE 65000.

   CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’
     EXPORTING
       FILENAME                      = g_filename
       I_BEGIN_COL                   = x1
       I_BEGIN_ROW                   = y1
       I_END_COL                     = x2
       I_END_ROW                     = y2
     TABLES
       INTERN                        = it_xls.

   CHECK: sy-subrc EQ 0.
   DELETE it_xls WHERE row EQ ‘0001’.
ENDFORM.

FORM PREPARE.

   LOOP AT it_xls into wa_xls.
     wa_prepare-row = wa_xls-row .
     wa_prepare-column = wa_xls-col .
     wa_prepare-value = wa_xls-VALUE.
     APPEND wa_prepare TO it_prepare.
   ENDLOOP.
   rec_n = wa_prepare-row.
   LOOP AT it_prepare into wa_prepare
     WHERE ROW = ‘00002’
       AND column > 6.
     wa_prepare-ELEMENT_TYPE = wa_prepare-value+0(2).
     wa_prepare-ELEMENT_ID = wa_prepare-value+2(8).
     MODIFY it_prepare FROM wa_prepare TRANSPORTING ELEMENT_TYPE ELEMENT_ID
      WHERE column =  wa_prepare-column.
   ENDLOOP.
ENDFORM.

FORM UPLOAD.
   DATA: COUNTER(5) type n VALUE ‘00003’,
         lv_template_id    TYPE  objektid,
         date type sy-datum,
         lv_pernr TYPE pernr_d,
         s_return TYPE  bal_s_msg,
      lt_status_notes TYPE  hap_t_status_note.

   WHILE counter <= rec_n.
     “Making apraisal document header
     “Get TEMPLATE ID
     READ TABLE it_prepare INTO wa_prepare
      WITH KEY row = counter column = ‘0001’.
     lv_template_id = wa_prepare-value.
     “Get template.
     PERFORM get_template USING lv_template_id.

     “APPRAISAL name
     READ TABLE it_prepare INTO wa_prepare
      WITH KEY row = counter column = ‘0002’.
     gs_header_texts-appraisal_name = wa_prepare-value.
     “begda
     READ TABLE it_prepare INTO wa_prepare
      WITH KEY row = counter column = ‘0003’.
     CONCATENATE wa_prepare-value+6(4) wa_prepare-value+3(2) wa_prepare-value+0(2) INTO date.
     gs_header_dates-ap_start_date     = date.
     “endda
     READ TABLE it_prepare INTO wa_prepare
      WITH KEY row = counter column = ‘0004’.
     CONCATENATE wa_prepare-value+6(4) wa_prepare-value+3(2) wa_prepare-value+0(2) INTO date.
     gs_header_dates-ap_end_date      = date.
     gs_header_dates-ap_date_set      = date.
     “APPRAISER
     FREE gt_header_appraiser.
     READ TABLE it_prepare INTO wa_prepare
      WITH KEY row = counter column = ‘0005’.
     ls_header_appraiser-plan_version = ’01’.
     ls_header_appraiser-type         = ‘P’.
     lv_pernr = wa_prepare-value.
     ls_header_appraiser-id = lv_pernr.
     APPEND ls_header_appraiser TO gt_header_appraiser .
     “APPRAISEE
     FREE gt_header_appraisee.
     READ TABLE it_prepare INTO wa_prepare
      WITH KEY row = counter column = ‘0006’.
     ls_header_appraisee-plan_version = ’01’.
     ls_header_appraisee-type         = ‘P’.
     lv_pernr = wa_prepare-value.
     ls_header_appraisee-id = lv_pernr.
     APPEND ls_header_appraisee TO gt_header_appraisee .

     “Making apraisal document body
     LOOP AT it_prepare INTO wa_prepare
       WHERE ELEMENT_ID ne
         AND row = counter.
       “Get row
       READ TABLE gt_body_elements into gs_body_elements
        WITH KEY element_type = wa_prepare-element_type
                 element_id   = wa_prepare-element_id.
       row_iid = gs_body_elements-row_iid.
       “Get FAPP Column.
       READ TABLE gt_body_columns into gs_body_columns
       WITH KEY column_id = ‘FAPP’.
       column_iid = gs_body_columns-column_iid.
       “Write element
       READ TABLE gt_body_cells ASSIGNING <body_cells>
       WITH KEY row_iid = row_iid
             column_iid = column_iid.
       <body_cells>-no_value = .
       <body_cells>-value_num = wa_prepare-value.
       <body_cells>-value_txt = wa_prepare-value.

     ENDLOOP.
     “Saving document
     CALL FUNCTION ‘HRHAP_DOC_UPDATE_BODY_AND_SAVE’
       EXPORTING
         plan_version             = ’01’
       IMPORTING
         s_return                 = s_return
       CHANGING
         s_appraisal_id           = gs_appraisal_id
         s_doc_processing         = gs_doc_processing
         t_header_appraiser       = gt_header_appraiser[]
         t_header_appraisee       = gt_header_appraisee[]
         t_header_part_appraisers = gt_header_p_appraiser[]
         t_header_others          = gt_header_others
         s_header_texts           = gs_header_texts
         s_header_dates           = gs_header_dates
         s_header_status          = gs_header_status
         s_header_display         = gs_header_display
         t_body_columns           = gt_body_columns
         t_body_elements          = gt_body_elements
         t_body_cells             = gt_body_cells[]
         t_body_cell_notes        = gt_body_cell_notes
         t_status_notes           = lt_status_notes.
     IF s_return IS NOT INITIAL  .
       WRITE: / s_return-msgid , s_return-msgty ,s_return-msgno  ,s_return-msgv1,  s_return-msgv2, s_return-msgv3 .
     ENDIF.
     counter = counter + 1.
   ENDWHILE.

ENDFORM.

FORM get_template USING template.
   “Make document from template

   FREE : gs_return.
   CALL FUNCTION ‘HRHAP_TEMPLATE_GET_DETAIL’
     EXPORTING     ” add_on_application       = ‘LSO’
”     UI_MODE                  = ‘X’
*     ADMINISTRATOR            = ‘ ‘
       plan_version             = ’01’
       template_id              = template
*     S_VALIDITY_PERIOD        =
*     S_DISPLAY_UI             =
     IMPORTING
       s_appraisal_id           = gs_appraisal_id
       s_header_texts           = gs_header_texts
       s_header_status          = gs_header_status
       t_header_add_data        = gt_header_add_data
       s_header_display         = gs_header_display
       t_buttons                = gt_buttons
       t_body_columns           = gt_body_columns
       t_body_elements          = gt_body_elements
       t_body_element_descr     = gt_body_element_descr
       t_body_element_buttons   = gt_body_element_buttons
       t_body_cells             = gt_body_cells
       t_body_cell_val_values   = gt_body_cell_val_values
       t_body_cell_val_ranges   = gt_body_cell_val_ranges
       t_body_cell_val_c_like   = gt_body_cell_val_c_like
       t_body_cell_val_descr    = gt_body_cell_val_descr
       t_body_cell_notes        = gt_body_cell_notes
       s_return                 = gs_return
     CHANGING
       s_doc_processing         = gs_doc_processing
       t_header_appraiser       = gt_header_appraiser[]
       t_header_appraisee       = gt_header_appraisee[]
       t_header_part_appraisers = gt_header_p_appraiser[]
       t_header_others          = gt_header_others
       s_header_dates           = gs_header_dates.

   gs_header_status-ap_status = ‘5’.
ENDFORM.                    ” GET_TEMPLATES

Assigned Tags

      5 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Parag Parikh
      Parag Parikh

      Simple and nice. You may want to consider data volume in some scenarios. Like in our existing implementation we had to migrate appraisal data from legacy SAP system to new SAP system. As the data volume was high, we used IDOC as data load method but for IDOC inbound FM used essentially the same FM that you have used.

      Author's profile photo Konstantin Melnik
      Konstantin Melnik

      Great article! Thanks a lot!

      Author's profile photo Yurii Sychov
      Yurii Sychov
      Blog Post Author

      In this example the program add two dynamic elements for qualification.

      REPORT  ZYS_APR_UPLOAD_DYN.

      DATA:  wa_prepare TYPE zys_upload,
              g_template_id           TYPE hap_template_id,
              g_header_defaulting     TYPE flag,
              gs_return               TYPE bal_s_msg,
              gs_menu                 TYPE hap_s_menu,           "for status
              gs_appraisal_id         TYPE hap_s_appraisal_id,
              gs_doc_processing       TYPE hap_s_doc_processing,
              gs_header_texts         TYPE hap_s_header_texts,
              gs_header_status        TYPE hap_s_header_status,
              gs_header_dates         TYPE hap_s_header_dates,
              gt_header_add_data      TYPE hap_t_header_add_data,
              gs_header_display       TYPE hap_s_header_display,
              gt_header_appraiser     TYPE hap_t_header_appraiser ,
              gt_header_appraisee     TYPE hap_t_header_appraisee ,
              gt_header_p_appraiser   TYPE hap_t_header_part_appraisers ,
              gt_header_others        TYPE hap_t_header_others,
              gt_buttons              TYPE hap_t_buttons,
              gt_body_columns         TYPE hap_t_body_columns,
              gs_body_columns         LIKE LINE of gt_body_columns,
              gt_body_elements        TYPE hap_t_body_elements,
              gs_body_elements        LIKE LINE of gt_body_elements,
              gt_body_element_descr   TYPE hap_t_body_element_descr,
              gt_body_element_buttons TYPE hap_t_body_element_buttons,
              gt_body_cells           TYPE hap_t_body_cells,
              gs_body_cells           like line of gt_body_cells,
              gt_body_cell_val_values TYPE hap_t_body_cell_val_values,
              gt_body_cell_val_ranges TYPE hap_t_body_cell_val_ranges,
              gt_body_cell_val_c_like TYPE hap_t_body_cell_val_c_like,
              gt_body_cell_val_descr  TYPE hap_t_body_cell_val_descr,
              gt_body_cell_notes      TYPE hap_t_body_cell_notes,
              ls_header_appraiser TYPE hap_s_header_appraiser,
              ls_header_appraisee TYPE hap_s_header_appraisee.

      DATA: COUNTER(5) type n VALUE '00003',
              lv_template_id    TYPE  objektid,
              date type sy-datum,
              lv_pernr TYPE pernr_d,
              s_return TYPE  bal_s_msg,
              lt_status_notes TYPE  hap_t_status_note,
              lv_error TYPE flag,
              ls_wd_return   TYPE bal_s_msg,
              ET_BODY_ELEMENTS_ADD  type  HAP_T_BODY_ELEMENTS_ADD,
              wa_BODY_ELEMENTS_ADD like line of ET_BODY_ELEMENTS_ADD.

      START-OF-SELECTION.

         gs_header_dates-ap_start_date     = '01.01.2014'.
         "endda
         gs_header_dates-ap_end_date      = '31.12.2014'.
         gs_header_dates-ap_date_set      = '31.12.2014'.
         "APPRAISER
         FREE gt_header_appraiser.
         ls_header_appraiser-plan_version = '01'.
         ls_header_appraiser-type         = 'P'.
         lv_pernr = '1000800'."wa_prepare-value.
         ls_header_appraiser-id = lv_pernr.
         APPEND ls_header_appraiser TO gt_header_appraiser .
         "APPRAISEE
         FREE gt_header_appraisee.
         ls_header_appraisee-plan_version = '01'.
         ls_header_appraisee-type         = 'P'.
         lv_pernr = '1000800'."wa_prepare-value.
         ls_header_appraisee-id = lv_pernr.
         APPEND ls_header_appraisee TO gt_header_appraisee .

         wa_BODY_ELEMENTS_ADD-NEW_ELEMENT_TYPE = 'Q'.
         wa_BODY_ELEMENTS_ADD-NEW_ELEMENT_ID = '50000392'.
         APPEND wa_BODY_ELEMENTS_ADD to et_BODY_ELEMENTS_ADD.
         wa_BODY_ELEMENTS_ADD-NEW_ELEMENT_ID = '50000399'.
         APPEND wa_BODY_ELEMENTS_ADD to et_BODY_ELEMENTS_ADD.
         "Enhance Document
         CALL FUNCTION 'HRHAP_DOC_BODY_ENHANCE'
           EXPORTING
             row_iid                   = '0001'"wd_comp_controller->enhance_row_iid
             plan_version              = '01'
             s_appraisal_id            = gs_appraisal_id
             t_header_appraiser        = gt_header_appraiser
             t_header_appraisee        = gt_header_appraisee
             t_header_part_appraisers  = gt_header_p_appraiser
             t_header_others           = gt_header_others
             s_header_dates            = gs_header_dates
             s_header_status           = gs_header_status
             t_body_columns            = gt_body_columns
      *     FREE_ENHANCEMENT          = ' '
             trusted_call              = 'X'
             enhancement_type          = ' '
             t_body_elements_add       = et_body_elements_add
      *     T_BODY_ELEMENTS_STRUC_ADD =
           IMPORTING
             s_return                  = ls_wd_return
           CHANGING
             s_doc_processing          = gs_doc_processing
             t_body_elements           = gt_body_elements
             t_body_element_descr      = gt_body_element_descr
             t_body_element_buttons    = gt_body_element_buttons
             t_body_cells              = gt_body_cells
             t_body_cell_notes         = gt_body_cell_notes
             t_body_cell_val_values    = gt_body_cell_val_values
             t_body_cell_val_ranges    = gt_body_cell_val_ranges
             t_body_cell_val_c_like    = gt_body_cell_val_c_like
             t_body_cell_val_descr     = gt_body_cell_val_descr.
         "Saving document
         CALL FUNCTION 'HRHAP_DOC_UPDATE_BODY_AND_SAVE'
           EXPORTING
             plan_version             = '01'
           IMPORTING
             s_return                 = s_return
           CHANGING
             s_appraisal_id           = gs_appraisal_id
             s_doc_processing         = gs_doc_processing
             t_header_appraiser       = gt_header_appraiser[]
             t_header_appraisee       = gt_header_appraisee[]
             t_header_part_appraisers = gt_header_p_appraiser[]
             t_header_others          = gt_header_others
             s_header_texts           = gs_header_texts
             s_header_dates           = gs_header_dates
             s_header_status          = gs_header_status
             s_header_display         = gs_header_display
             t_body_columns           = gt_body_columns
             t_body_elements          = gt_body_elements
             t_body_cells             = gt_body_cells[]
             t_body_cell_notes        = gt_body_cell_notes
             t_status_notes           = lt_status_notes.
         IF s_return IS NOT INITIAL  .
           WRITE: / s_return-msgid , s_return-msgty ,s_return-msgno  ,s_return-msgv1,  s_return-msgv2, s_return-msgv3 .
         ENDIF.

      Author's profile photo Former Member
      Former Member

      Hi,

      Document is good.I have one question to you.

      Appraisal documents is created...But Appraisal is not showing under info-type 0025...

      Kindly give some suggestion...

      Regards,

      Ragav

      Author's profile photo Yurii Sychov
      Yurii Sychov
      Blog Post Author

      In all tabs? There are several tabs for appraisals.

      Infotype 0025 Appraisal

      "If you have configured infotype 0025 using IMG menu path Personnel Management> Personnel Administration> Appraisals

      then use 0025, otherwise if its the PD version stick to 0024."