Hola, muy buenas tardes, como se encuentran todos?
vengo a preguntar si es posible que me den una idea del por que al cargar un archivo de Excel a mi programa, este no lo lee, según el Debugger, no accede o no se levanta y por ende, no carga la información de mi archivo.
Dejo mi código por si algo esta mal ahi, debo decir que me lo compartieron y solo copie y pegue, pero según con eso, funcionaria adecuadamente.
Codigo Main
*&---------------------------------------------------------------------*
*& Report ZEXCEL_CALL_CYDSA_EBZ
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZEXCEL_CALL_CYDSA_EBZ.
INCLUDE ZEXCEL_CALL_CYDSA_EBZ_TOP.
INCLUDE ZEXCEL_CALL_CYDSA_EBZ_F01.
*&---------------------------------------------------------------------*
* CONTROL DE PARÁMETROS *
*&---------------------------------------------------------------------*
at selection-screen on value-request for filename.
* Se obtiene la ruta del archivo local donde se leerá el archivo
perform f_route_file.
START-OF-SELECTION.
PERFORM F_CARGA_EXCEL. " Crear Materiales para la carga
Codigo TOP
*&---------------------------------------------------------------------*
*& Include ZEXCEL_CALL_CYDSA_EBZ_TOP
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_alsmex,
row TYPE numc4,
col TYPE numc4,
value TYPE char50,
pestania TYPE char30,
END OF ty_alsmex.
DATA: lt_zalsmex_tabline TYPE STANDARD TABLE OF ty_alsmex.
TYPE-POOLS: ole2.
TYPES: ty_d_itabvalue TYPE char50.
TYPES: BEGIN OF ty_s_senderline,
line(4096) TYPE c,
END OF ty_s_senderline,
ty_t_itab TYPE STANDARD TABLE OF ty_alsmex,
ty_t_sender TYPE ty_s_senderline OCCURS 0.
CONSTANTS: gc_esc VALUE '"'.
DATA:
* FILENAME TYPE rlgrap-filename, "Archivo Layout
i_begin_col TYPE i,
i_begin_row TYPE i,
i_end_col TYPE i,
i_end_row TYPE i,
intern_salida TYPE STANDARD TABLE OF ty_alsmex WITH HEADER LINE.
* Variables Locales
DATA: l_excel TYPE ole2_object,
l_libro TYPE ole2_object,
l_hoja TYPE ole2_object,
l_cont TYPE i,
l_celli TYPE ole2_object,
l_cellf TYPE ole2_object,
l_cell TYPE ole2_object,
lt_tabla TYPE TABLE OF ty_s_senderline.
DATA: ld_separator TYPE c.
DATA: ld_rc TYPE i.
DATA: intern TYPE STANDARD TABLE OF ty_alsmex WITH HEADER LINE.
DATA: lf_pestania(50).
*&---------------------------------------------------------------------*
*& Definición de variables *
*&---------------------------------------------------------------------*
DATA: ft TYPE filetable,
rc TYPE i.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:
filename TYPE rlgrap-filename OBLIGATORY. "Archivo Layout
* c_inser TYPE c as CHECKBOX.
SELECTION-SCREEN END OF BLOCK b1.
Codigo F01
*&---------------------------------------------------------------------*
*& Include ZEXCEL_CALL_CYDSA_EBZ_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form f_route_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_route_file .
CLEAR: ft, rc.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
default_filename = '*'
CHANGING
file_table = ft
rc = 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.
EXIT.
ELSE.
READ TABLE ft INDEX 1 INTO filename.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_CARGA_EXCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM f_carga_excel .
** COORDENADAS DEL ARCHIVO EXCEL
i_begin_col = 1.
i_begin_row = 3.
i_end_col = 5.
i_end_row = 300.
* Abrimos el Excel
IF l_excel-header = space OR l_excel-handle = -1.
CREATE OBJECT l_excel 'Excel.Application'.
ENDIF.
CALL METHOD OF l_excel 'Workbooks' = l_libro.
CALL METHOD OF l_libro 'Open'
EXPORTING
#1 = filename.
* Se identifica el separador de campos
CLASS cl_abap_char_utilities DEFINITION LOAD.
ld_separator = cl_abap_char_utilities=>horizontal_tab.
* Recorremos las Hojas del Excel
DO.
*-- Incrementamos el Contador para ir de hoja en hoja
ADD 1 TO l_cont.
*-- Limpiamos los objetos
FREE OBJECT: l_cell, l_celli, l_cellf, l_hoja.
CLEAR lt_tabla[].
*-- Leemos la Hoja
CALL METHOD OF l_excel 'Worksheets' = l_hoja
EXPORTING
#1 = l_cont.
*-- Si no existe la hoja Salimos del Bucle
IF NOT sy-subrc IS INITIAL.
EXIT.
ENDIF.
* Tomamos el nombre de la pestaña
GET PROPERTY OF l_hoja 'NAME' = lf_pestania.
COMMIT WORK AND WAIT.
*-- Recogemos la Primera Celda
CALL METHOD OF l_hoja 'Cells' = l_celli
EXPORTING
#1 = i_begin_row
#2 = i_begin_col.
COMMIT WORK AND WAIT.
*-- Recogemos la Ultima Celda
CALL METHOD OF l_hoja 'Cells' = l_cellf
EXPORTING
#1 = i_end_row
#2 = i_end_col.
COMMIT WORK AND WAIT.
*-- Recogemos las celdas comprendidas entre la Primera y la Ultima
*-- y lo copiamos a la memoria intermedia
CALL METHOD OF l_hoja 'RANGE' = l_cell
EXPORTING
#1 = l_celli
#2 = l_cellf.
COMMIT WORK AND WAIT.
CALL METHOD OF l_cell 'SELECT'.
COMMIT WORK AND WAIT.
CALL METHOD OF l_cell 'COPY'.
*-- Recogemos los Valores del portapapeles
CALL METHOD cl_gui_frontend_services=>clipboard_import
IMPORTING
data = lt_tabla
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE a037(alsmex).
ENDIF.
*-- Limpiamos los valores en blanco
SORT lt_tabla.
DELETE lt_tabla WHERE line EQ space.
CLEAR: sy-subrc.
*-- Recogemos los datos a la tabla de Salida
CHECK NOT lt_tabla[] IS INITIAL.
PERFORM separated_to_intern_convert TABLES lt_tabla intern
USING ld_separator.
* Se vuelca el contenido de la hoja tratada en la tabla con la
* identificación de la pestaña.
LOOP AT intern.
CLEAR intern_salida.
intern_salida-pestania = lf_pestania.
MOVE-CORRESPONDING intern TO intern_salida.
APPEND intern_salida.
***** AGREGAR LÓGICA PARA GUARDAR REGISTROS EN TABLA INTERNA INI
** La tabla interna debe ser equivalente al layout de excel.
***** AGREGAR LÓGICA PARA GUARDAR REGISTROS EN TABLA INTERNA FIN
ENDLOOP.
* borramos el portapapeles
REFRESH lt_tabla.
CALL METHOD cl_gui_frontend_services=>clipboard_export
IMPORTING
data = lt_tabla
CHANGING
rc = ld_rc
EXCEPTIONS
cntl_error = 1
* ERROR_NO_GUI = 2
* NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
ENDDO.
* Cerramos el Excel
CALL METHOD OF l_excel 'QUIT'.
*-- Limpiamos los objetos
FREE OBJECT l_libro.
FREE OBJECT l_hoja.
FREE OBJECT l_excel.
FREE OBJECT l_celli.
FREE OBJECT l_cellf.
FREE OBJECT l_cell.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SEPARATED_TO_INTERN_CONVERT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM separated_to_intern_convert TABLES i_tab TYPE ty_t_sender
i_intern TYPE ty_t_itab
USING i_separator TYPE c.
DATA: l_sic_tabix LIKE sy-tabix,
l_sic_col TYPE kcd_ex_col.
DATA: l_fdpos LIKE sy-fdpos.
REFRESH i_intern.
LOOP AT i_tab.
l_sic_tabix = sy-tabix.
l_sic_col = 0.
WHILE i_tab CA i_separator.
l_fdpos = sy-fdpos.
l_sic_col = l_sic_col + 1.
PERFORM line_to_cell_separat TABLES i_intern
USING i_tab l_sic_tabix l_sic_col
i_separator l_fdpos.
ENDWHILE.
IF i_tab <> space.
CLEAR i_intern.
i_intern-row = l_sic_tabix.
i_intern-col = l_sic_col + 1.
i_intern-value = i_tab.
APPEND i_intern.
ENDIF.
ENDLOOP.
ENDFORM. " SEPARATED_TO_INTERN_CONVERT
*&---------------------------------------------------------------------*
*& Form line_to_cell_separat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM line_to_cell_separat TABLES i_intern TYPE ty_t_itab
USING i_line
i_row LIKE sy-tabix
ch_cell_col TYPE kcd_ex_col
i_separator TYPE c
i_fdpos LIKE sy-fdpos.
DATA: l_string TYPE ty_s_senderline.
DATA l_sic_int TYPE i.
CLEAR i_intern.
l_sic_int = i_fdpos.
i_intern-row = i_row.
l_string = i_line.
i_intern-col = ch_cell_col.
* csv Dateien mit separator in Zelle: --> ;"abc;cd";
IF ( i_separator = ';' OR i_separator = ',' ) AND
l_string(1) = gc_esc.
PERFORM line_to_cell_esc_sep USING l_string
l_sic_int
i_separator
i_intern-value.
ELSE.
IF l_sic_int > 0.
i_intern-value = i_line(l_sic_int).
ENDIF.
ENDIF.
IF l_sic_int > 0.
APPEND i_intern.
ENDIF.
l_sic_int = l_sic_int + 1.
i_line = i_line+l_sic_int.
ENDFORM. "line_to_cell_separat
*&---------------------------------------------------------------------*
*& Form line_to_cell_esc_sep
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM line_to_cell_esc_sep USING i_string
i_sic_int TYPE i
i_separator TYPE c
i_intern_value TYPE ty_d_itabvalue.
DATA: l_int TYPE i,
l_cell_end(2).
FIELD-SYMBOLS: <l_cell>.
l_cell_end = gc_esc.
l_cell_end+1 = i_separator .
IF i_string CS gc_esc.
i_string = i_string+1.
IF i_string CS l_cell_end.
l_int = sy-fdpos.
ASSIGN i_string(l_int) TO <l_cell>.
i_intern_value = <l_cell>.
l_int = l_int + 2.
i_sic_int = l_int.
i_string = i_string+l_int.
ELSEIF i_string CS gc_esc.
* letzte Celle
l_int = sy-fdpos.
ASSIGN i_string(l_int) TO <l_cell>.
i_intern_value = <l_cell>.
l_int = l_int + 1.
i_sic_int = l_int.
i_string = i_string+l_int.
l_int = strlen( i_string ).
IF l_int > 0 . MESSAGE x001(kx) . ENDIF.
ELSE.
MESSAGE x001(kx) . "was ist mit csv-Format
ENDIF.
ENDIF.
ENDFORM. "line_to_cell_esc_sep
Es la primera vez que pregunto algo, asi que si hice algo mal o no era asi el formato, una disculpa.
Gracias de antemano por leer y por su ayuda.
Saludos