Programa de Carga directo en Tablas

Facebooktwitterlinkedinmail

Hola a todos,

A continuación escribiré un código de un programa para la carga masiva de datos directamente en una tabla. Este método no es muy recomendable(se recomienda mediante batch input o LSMW), ya que se tiene que tener especial cuidado a la hora de introducir los datos, puesto que si queremos cargar directamente en tabla con, por ejemplo, el código que pondré a continuación ha de estar los datos del fichero «.txt» en las mismas posiciones que tiene la tabla, si no cuando vayamos a ver la tabla podemos encontrarnos con problemas.

Bueno, el código de carga de una tabla es bastante simple:

report ZPROGRAM no standard page heading.tables pa0006.        «Tabla del infotipo 0006
*******************************************************************
*                                                                 
*           DECLARACION DE VARIABLES Y ESTRUCTURAS                
*                                                                 
*******************************************************************dataztab type table of pa0006.
datal_ztab like line of ztab.
data q_return like systsubrc.*******************************************************************
*                                                                 
*                      CODIGO DE PROGRAMA                         
*                                                                 
********************************************************************PANTALLA DE SELECCION, en esta zona indicamos que parametros queremos que nos muestre* cuando ejecutamos el programa, en este caso solo será un parámetro obligatorio
selection-screenbegin of block a1 with frame title text001.
parametersp_ruta like rlgrapfilename obligatory lower case.
selection-screenend of block a1.

* aquí hacemos que el parámetro pueda seleccionar por medio del matchcode la situación 

* del fichero de forma cómoda
at selection-screen on value-request for p_ruta.
perform get_ws_filename.

start-of-selection.

*Comprobamos que el fichero realmente existe
perform check_file_exists.
*Hacemos la carga del fichero a la tabla interna
perform subir_fichero.

*Recorremos la tabla interna para guardarla directamente en la tabla
loop at ztab into l_ztab.

insert pa0006 from l_ztab.

«Comprobamos si hay errores
if sysubrc <> 0.
skip.
write /5 ‘ERROR, Existe un Registro Identico en la Tabla pa0006’.
endif.

endloop.

SKIP.

«escritura al finalizar el programa
WRITE/5 ‘Carga Automatica Finalizada’.

***********************************************************************
*                                                                     *
*                            RUTINAS                                  *
*                                                                     *
***********************************************************************

*&——————————————————————–*
*&      Form  GET_WS_FILENAME                                         *
*&——————————————————————–*

form get_ws_filename.

datal_files type filetable,
h_files type file_table,
l_rc    like sysubrc.

call method cl_gui_frontend_services=>file_open_dialog
changing
file_table              l_files
rc                      l_rc
exceptions
file_open_dialog_failed 1
cntl_error              2
error_no_gui            3
*      not_supported_by_gui    = 4
others                  5.
if sysubrc <> or l_rc < 0.
message id symsgid type symsgty number symsgno
with symsgv1 symsgv2 symsgv3 symsgv4.
else.
read table l_files index into h_files.
p_ruta h_filesfilename.
endif.
endform.                               » GET_WS_FILENAME

*———————————————————————*
*         FORM CHECK_FILE_EXISTS                                      *
*                                                                     *
*      Rutina que comprueba si existe el fichero dado                 *
*———————————————————————*
form check_file_exists.

call function ‘WS_QUERY’
exporting
filename p_ruta
query    ‘FE’
importing
return   q_return
exceptions
others   1.

if systsubrc ne or q_return ne 1.
message e001(zerrorpgc7).
endif.
endform.                    «check_file_exists

*$——————————————————————–*
*&                     Form  subir_fichero                            *
*&——————————————————————–*

form subir_fichero.

DATAl_nombre TYPE string.

l_nombre p_ruta.

CALL FUNCTION ‘GUI_UPLOAD’
EXPORTING
filename                      l_nombre
*      filetype                      = ‘DAT’
has_field_separator           ‘X’
TABLES
data_tab                      ztab
EXCEPTIONS
file_open_error               1
file_read_error               2
no_batch                      3
gui_refuse_filetransfer       4
invalid_type                  5
no_authority                  6
unknown_error                 7
bad_data_format               8
header_not_allowed            9
separator_not_allowed         10
header_too_long               11
unknown_dp_error              12
access_denied                 13
dp_out_of_memory              14
disk_full                     15
dp_timeout                    16
OTHERS                        17.

IF sysubrc <> 0.
MESSAGE ID symsgid TYPE symsgty NUMBER symsgno
WITH symsgv1 symsgv2 symsgv3 symsgv4.
ENDIF.

endform.

Vuelvo a recordar que siguiendo este ejemplo, en el fichero deberia tener esta estructura EXACTA, ya que de no ser así, en algún campo estaríamos introduciendo la información incorrecta.

La estructura en este caso  debería ser la estructura de la tabla PA0006, que se puede comprobar en la SE11:

MANDT Mandante
PERNR Número de personal
SUBTY Subtipo
OBJPS Identificación de objeto
SPRPS Indicador de bloqueo para registro de maestro de personal
ENDDA Fin de la validez
BEGDA Inicio de la validez
SEQNR Número de un registro de infotipo para misma clave
AEDTM Fecha última modificación
UNAME Nombre del responsable que ha modificado el objeto
HISTO Indicador de historial
ITXEX Existe texto para infotipo
REFEX Existen campos referencia (costes primarios/secundarios)
ORDEX Existen campos de notificación
ITBLD Control dynpros infotipo
PREAS Motivo de modificación Datos maestros
FLAG1 Campo de reserva/ campo no utilizado
FLAG2 Campo de reserva/ campo no utilizado
FLAG3 Campo de reserva/ campo no utilizado
FLAG4 Campo de reserva/ campo no utilizado
RESE1 Campo de reserva/ Campo no utilizado de longitud 2
RESE2 Campo de reserva/ Campo no utilizado de longitud 2
GRPVL Valor de agrupamiento p.contratos por ocupación
ANSSA Clase de registro de direcciones
NAME2 Nombre de contacto
STRAS Calle y número
ORT01 Población
ORT02 Distrito
PSTLZ Código postal
LAND1 Clave de país
TELNR Nº teléfono
ENTKM Distancia en kilómetros
WKWNG Viviendas para el personal
BUSRT Ruta del autobús
LOCAT Cpo.adicional direc.
ADR03 Calle 2
ADR04 Calle 3
STATE Región (Estado federal, «land», provincia, condado)
HSNMR Nº (edificio)
POSTA Identificación de una vivienda en una casa
BLDNG Edificio (número o sigla)
FLOOR Planta del edificio
STRDS Sigla de vía pública
ENTK2 Distancia en kilómetros
COM01 Clase de comunicación
NUM01 Número de comunicación
COM02 Clase de comunicación
NUM02 Número de comunicación
COM03 Clase de comunicación
NUM03 Número de comunicación
COM04 Clase de comunicación
NUM04 Número de comunicación
COM05 Clase de comunicación
NUM05 Número de comunicación
COM06 Clase de comunicación
NUM06 Número de comunicación
INDRL Sólo relevante para Japón
COUNC Código de condado
RCTVC Código de la ciudad
OR2KK Sólo relevante para Japón
CONKK Sólo relevante para Japón
OR1KK Sólo relevante para Japón
RAILW Subscripción soc.ferrocarril
ZSECTOR Campo character, longitud 40

 

Recuerda:

Si quieres esta página siga en pié pudiendote ayudar en el día a día, dona, cualquier donativo hará que pueda ayudarte más.

 








Deja una respuesta

Tu dirección de correo electrónico no será publicada.