Otro escenario clásico en un proyecto de Sap es, subir los datos contenidos en una hoja excel a una tabla interna para poder trabajar con ellos en el sistema Sap. Por ejemplo, un programa que modifique los precios de los materiales en base a los datos que lee de una hoja excel.
Para subir una hoja Excel a una tabla interna utilizaremos la bapi TEXT_CONVERT_XLS_TO_SAP.
Todos los campos de la tabla interna debe ser de tipo carácter. Si necesitamos utilizar campos de tipo numérico, primero subimos los datos a una tabla con todos sus campos de tipo carácter y después deberemos implementar un código que convierta los registros de la tabla interna al formato requerido en una nueva tabla interna, esta vez ya como campos numéricos.
Esto se ve siempre mejor con un ejemplo.
Solo voy a comentar las partes importantes del código, aquí os dejo el código completo.
El usuario quiere actualizar los precios de los materiales a través de una hoja excel con el siguiente formato:
- Proveedor
- Material
- Tipo Registro Info
- Precio
- Cantidad Base
- Moneda
- UM Precio
*&---------------------------------------------------------------------* *& Form set_filepath *&---------------------------------------------------------------------* * Este FORM sirve para el explorador en el que se selecciona el archivo *----------------------------------------------------------------------* FORM set_filepath CHANGING po_ruta TYPE rlgrap-filename. CONSTANTS: c_ext_exl TYPE string VALUE '*.XLS'. DATA: lt_filetable TYPE filetable, lx_filetable TYPE file_table, wl_sel_text TYPE string, lv_rc TYPE i. CLEAR po_ruta. wl_sel_text = text-s01. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING window_title = wl_sel_text default_extension = c_ext_exl CHANGING file_table = lt_filetable rc = lv_rc 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. ELSE. READ TABLE lt_filetable INTO lx_filetable INDEX 1. CHECK sy-subrc EQ 0. po_ruta = lx_filetable-filename. ENDIF. ENDFORM. " SET_FILEPATH
La siguiente subrutina, sube el archivo excel a una tabla interna, definida con todos sus campos de tipo carácter. Aun no podemos trabajar con estos datos, pues pueden no ser compatibles con los formatos internos de SAP. Por ultimo, recorremos la tabla interna, realizando las conversiones y comprobaciones pertinentes, traspasando los valores, ya en formato interno valido par SAP, a una nueva tabla interna.
*&---------------------------------------------------------------------* *& Form UPLOAD_EXCEL_IT *&---------------------------------------------------------------------* *& Subir un archivo excel a una tabla interna *&--------------------------------------------------------------------- FORM upload_excel_it USING pi_ruta TYPE rlgrap-filename CHANGING to_file TYPE type_t_datos. TYPES: BEGIN OF type_excel, lifnr(10) TYPE c, "Proveedor matnr(18) TYPE c, "Material esokz(1) TYPE c, "Tipo Registro Info netpr(13) TYPE c, "Precio peinh(5) TYPE c, "Cantidad Base waers(3) TYPE c, "moneda bprme(3) TYPE c, "UM Precio END OF type_excel. DATA: tl_exc TYPE STANDARD TABLE OF type_excel. DATA: it_raw TYPE truxs_t_text_data. FIELD-SYMBOLS: <fs_exc> TYPE type_excel, <fs_file> TYPE LINE OF type_t_datos. REFRESH: to_file, tl_exc. CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' EXPORTING * I_FIELD_SEPERATOR = * i_line_header = 'X' i_tab_raw_data = it_raw " WORK TABLE i_filename = pi_ruta TABLES i_tab_converted_data = tl_exc[] "ACTUAL DATA EXCEPTIONS conversion_failed = 1 OTHERS = 2. IF ( sy-subrc <> 0 ). MESSAGE text-e02 TYPE 'I' DISPLAY LIKE 'E'. ELSE. DELETE tl_exc INDEX 1. "eliminar la cabecera LOOP AT tl_exc ASSIGNING <fs_exc>. APPEND INITIAL LINE TO to_file ASSIGNING <fs_file>. PERFORM conversion_sap_format USING <fs_exc>-lifnr CHANGING <fs_file>-lifnr. PERFORM conversion_sap_format USING <fs_exc>-matnr CHANGING <fs_file>-matnr. PERFORM conversion_sap_format USING <fs_exc>-esokz CHANGING <fs_file>-esokz. PERFORM conversion_sap_format USING <fs_exc>-waers CHANGING <fs_file>-waers. PERFORM conversion_sap_unit USING <fs_exc>-bprme CHANGING <fs_file>-bprme. PERFORM conversion_sap_num USING <fs_exc>-netpr CHANGING <fs_file>-netpr. PERFORM conversion_sap_num USING <fs_exc>-peinh CHANGING <fs_file>-peinh. ENDLOOP. ENDIF. ENDFORM. " UPLOAD_EXCEL_IT *&---------------------------------------------------------------------* *& Form CONVERSION_SAP_FORMAT *&---------------------------------------------------------------------* FORM conversion_sap_format USING pi_output CHANGING po_output. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = pi_output IMPORTING output = po_output. ENDFORM. " CONVERSION_SAP_FORMAT *&---------------------------------------------------------------------* *& Form CONVERSION_SAP_UNIT *&---------------------------------------------------------------------* FORM conversion_sap_UNIT USING pi_output CHANGING po_output. CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' EXPORTING input = pi_output language = sy-langu IMPORTING output = po_output EXCEPTIONS unit_not_found = 1. IF sy-subrc <> 0. clear po_output. ENDIF. ENDFORM. " CONVERSION_SAP_FORMAT *&---------------------------------------------------------------------* *& Form CONVERSION_SAP_NUM *&---------------------------------------------------------------------* FORM conversion_sap_NUM USING pi_output CHANGING po_output. CALL FUNCTION 'MOVE_CHAR_TO_NUM' EXPORTING chr = pi_output IMPORTING num = po_output EXCEPTIONS convt_no_number = 1 convt_overflow = 2 OTHERS = 3. IF sy-subrc <> 0. clear po_output. ENDIF. ENDFORM. " CONVERSION_SAP_FORMAT
Entradas relacionadas:
Clasicos ABAP: Descargar tabla interna a una hoja Excel
No hay comentarios:
Publicar un comentario