Que tal bacha, aqui va un ejemplo especial para ti y que puedas comprender facilmente
El siguiente ejemplo llena una tabla Z llamada ZRUTA_ARCH que tomé solo como un ejemplo, y te explico brevemente que hace.
1.- Tienes que tener un excel con los datos que deseas llenar en la tabla Z
2.- Tienes que tener tu tabla Z ya previamente creada con los tipos de datos homologados a tu access(como sabemos no son iguales, pero no pasa nada, por que el excel lo toma como cadena, solo ten cuidado que en la tabla Z haya numericos, char, string, package o N, de acuerdo a la necesidad)
3.- Modifica la tabla interna que hay en el programa de acuerdo a tus necesidades de campos
4.- La estructura tienes que hacer referencia a tu tabla Z
5.- Ya que esta llena la tabla interna hace un loop para empezar a pasar datos de la tabla interna a la estructura, esto para no tener problemas por compatibilidad de datos
6.- Hace un modify para que no haya duplicados, en el insert podria marcar error.
7.- Hace el commit work
8.- Listo, ve a ver tu tabla Z para que confirmes los registros que acabas de meter.
Empezamos.
REPORT zpruebas_lavr MESSAGE-ID zttl LINE-SIZE 130.
*---------------------------------------------------------------------*
* INCLUDE PARA DEFINICIÓN DE DATOS *
*---------------------------------------------------------------------*
INCLUDE zpruebas_lavr_t001.
*---------------------------------------------------------------------*
* INCLUDE PARA DEFINICIÓN SUBRUTINAS *
*---------------------------------------------------------------------*
INCLUDE zpruebas_lavr_f001.
*---------------------------------------------------------------------*
* EVENTO START-OF-SELECTION *
*---------------------------------------------------------------------*
START-OF-SELECTION.
* Lee un archivo xls y lo carga en una tabla interna
PERFORM f_lee_archivo.
* Recorre tabla interna y va cargando datos en tabla Z
PERFORM f_modifica_tabla_z.
*----------------------------------------------------------------------*
* ZPRUEBAS_LAVR_T001 *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Definición de parámetros de entrada *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK param WITH FRAME TITLE text-001.
PARAMETERS: ruta LIKE rlgrap-filename OBLIGATORY DEFAULT
'C:\CARPETA\ARCHIVO.XLS' LOWER CASE.
SELECTION-SCREEN END OF BLOCK param.
*----------------------------------------------------------------------*
* Definición de tablas internas *
*----------------------------------------------------------------------*
* Tabla que almacena los registros de las filas y columnas de xls
DATA: BEGIN OF i_excel OCCURS 0,
fila LIKE alsmex_tabline-row,
columna LIKE alsmex_tabline-col,
valor LIKE alsmex_tabline-value,
END OF i_excel.
* Tabla que almacena los campos que vienen del archivo
* Estos pueden variar de acuerdo a la tabal que deseamos llenar
DATA: BEGIN OF ti_archivo OCCURS 0,
mandt LIKE zruta_arch-mandt,
id LIKE zruta_arch-id,
progname LIKE zruta_arch-progname,
ruta LIKE zruta_arch-ruta,
END OF ti_archivo.
*----------------------------------------------------------------------*
* Definición de estructuras *
*----------------------------------------------------------------------*
* Se crea una estructura para poder hacer el modify directo a la tabla Z
* y evitar errores por tipos de datos
DATA: BEGIN OF s_zruta_arch.
INCLUDE STRUCTURE zruta_arch.
DATA: END OF s_zruta_arch.
*----------------------------------------------------------------------*
* ZPRUEBAS_LAVR_F001 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form F_LEE_ARCHIVO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_lee_archivo.
* Función que descarga datos desde archivo excel
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = ruta
i_begin_col = '1'
i_begin_row = '1'
i_end_col = '4' " NUMERO DE CAMPOS DE ARCHIVO
i_end_row = '65000'
TABLES
intern = i_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc EQ 0.
* Función para llenar datos descargados en tabla interna
PERFORM f_llena_tabla.
ELSE.
MESSAGE i001 WITH text-002.
ENDIF.
ENDFORM. " F_LEE_ARCHIVO
*&---------------------------------------------------------------------*
*& Form f_llena_tabla
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_llena_tabla.
LOOP AT i_excel.
CASE i_excel-columna.
WHEN '1'.
MOVE i_excel-valor TO ti_archivo-mandt.
WHEN '2'.
MOVE i_excel-valor TO ti_archivo-id.
WHEN '3'.
MOVE i_excel-valor TO ti_archivo-progname.
WHEN '4'.
MOVE i_excel-valor TO ti_archivo-ruta.
ENDCASE.
AT END OF fila.
APPEND ti_archivo.
CLEAR ti_archivo.
ENDAT.
ENDLOOP.
ENDFORM. " f_llena_tabla
*&---------------------------------------------------------------------*
*& Form F_MODIFICA_TABLA_Z
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_modifica_tabla_z.
LOOP AT ti_archivo.
IF sy-subrc EQ 0.
* Se mueven el registro de la tabal interna a la estructura
MOVE-CORRESPONDING ti_archivo TO s_zruta_arch.
* Se utiliza el modify en lugar de inser, para que haya problemas si se
* duplica algun registro por error, o por que lo ejecutes N veces
MODIFY zruta_arch FROM s_zruta_arch.
* Graba en tabla transparente
COMMIT WORK.
CLEAR: ti_archivo, s_zruta_arch.
ENDIF.
ENDLOOP.
ENDFORM. " F_MODIFICA_TABLA_Z
Listo, si tienes alguna duda, estoy para servirte.
Saludos.
|