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
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.
Choose file path and run.
Results in transaction PHAP_ADMIN.
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 TYPEi,
rec_n typei,
it_xls TYPETABLEOF ALSMEX_TABLINE,
wa_xls TYPE zbhr_st_alsmex_tabline,
it_prepare TYPESTANDARDTABLEOF 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 WITHHEADERLINE,
gt_header_appraisee TYPE hap_t_header_appraisee WITHHEADERLINE,
gt_header_p_appraiser TYPE hap_t_header_part_appraisers WITHHEADERLINE,
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 LIKELINEof gt_body_columns,
gt_body_elements TYPE hap_t_body_elements,
gs_body_elements LIKELINEof 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 likelineof 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-SCREENONVALUE-REQUEST FOR fpath.
REFRESH g_file.
CALLMETHOD 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.
READTABLE g_file INTO gs_file INDEX1.
g_filename = fpath = gs_file.
START-OF-SELECTION.
PERFORM excel_read.
PERFORM prepare.
PERFORM upload.
FORM excel_read.
DATA: x1 TYPE i VALUE1,
y1 TYPE i VALUE1,
x2 TYPE i VALUE100,
y2 TYPE i VALUE65000.
CALLFUNCTION'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 EQ0.
DELETE it_xls WHERE row EQ'0001'.
ENDFORM.
FORM PREPARE.
LOOPAT 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.
LOOPAT 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,
datetype 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
READTABLE it_prepare INTO wa_prepare
WITHKEY row = counter column = '0001'.
lv_template_id = wa_prepare-value.
"Get template.
PERFORM get_template USING lv_template_id.
"APPRAISAL name
READTABLE it_prepare INTO wa_prepare
WITHKEY row = counter column = '0002'.
gs_header_texts-appraisal_name = wa_prepare-value.
"begda
READTABLE it_prepare INTO wa_prepare
WITHKEY row = counter column = '0003'.
CONCATENATE wa_prepare-value+6(4) wa_prepare-value+3(2) wa_prepare-value+0(2) INTOdate.
gs_header_dates-ap_start_date = date.
"endda
READTABLE it_prepare INTO wa_prepare
WITHKEY row = counter column = '0004'.
CONCATENATE wa_prepare-value+6(4) wa_prepare-value+3(2) wa_prepare-value+0(2) INTOdate.
gs_header_dates-ap_end_date = date.
gs_header_dates-ap_date_set = date.
"APPRAISER
FREE gt_header_appraiser.
READTABLE it_prepare INTO wa_prepare
WITHKEY 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.
READTABLE it_prepare INTO wa_prepare
WITHKEY 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
LOOPAT it_prepare INTO wa_prepare
WHERE ELEMENT_ID ne''
AND row = counter.
"Get row
READTABLE gt_body_elements into gs_body_elements
WITHKEY element_type = wa_prepare-element_type
element_id = wa_prepare-element_id.
row_iid = gs_body_elements-row_iid.
"Get FAPP Column.
READTABLE gt_body_columns into gs_body_columns
WITHKEY column_id = 'FAPP'.
column_iid = gs_body_columns-column_iid.
"Write element
READTABLE gt_body_cells ASSIGNING<body_cells>
WITHKEY 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
CALLFUNCTION'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 ISNOTINITIAL .
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.
CALLFUNCTION'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