✒️ABAP El Batch Input utilizando Call transaction
ABAP El Batch Input utilizando Call transaction
BATCH INPUT UTILIZANDO CALL TRANSACTION
MI PRIMER BATCH INPUT UTILIZANDO CALL TRANSACTION
Vamos a crear nuestro primer Batch Input utilizando la técnica de CALL TRANSACTION. El obejetivo del Batch Input será la carga inicial de datos de la tabla ZTABLA_USUARIOS.
Para ello, vamos a crear un archivo de texto con registros que cumplan con la estructura de la tabla ZTABLA_USUARIOS, sin tener en cuenta al campo mandante.
Como lo que vamos a hacer será la carga inicial de la tabla de usuarios, borraremos su contenido previamente a la ejecución de este ejemplo. Ahora, seguiremos los pasos que establecimos en la primer lección de la unidad.
PASO 1: Declaración de datos propios del Batch Input
Se declara una tabla interna y una estructura, ambas del tipo BDCDATA. Otra tabla interna del tipo BDCMSGCOLL con su estructura, que servirán para almacenar los mensajes que se produzcan cuando se ejecuta el CALL TRANSACTION, la tabla interna de usuarios, que contendrá los datos que levantemos del archivo de entrada y una tabla para mostrar por pantalla los errores entre otras declaraciones.
*----------------------------------------------------------------------*
* Declaracion de includes
*----------------------------------------------------------------------*
TYPE-POOLS: slis.
* Tabla del BI con la estructura de BDCDATA
DATA: BEGIN OF ti_bdc_data OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF ti_bdc_data.
* Estructura del BI
DATA: st_bdc_data TYPE bdcdata.
* Tabla de mensajes
DATA: BEGIN OF ti_messages OCCURS 0.
INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF ti_messages.
* Estructura de mensajes
DATA: st_messages TYPE bdcmsgcoll.
* Tabla de usuarios
DATA: ti_archivo TYPE STANDARD TABLE OF ztabla_usuarios,
st_archivo LIKE LINE OF ti_archivo.
* Tabla de errores
DATA: BEGIN OF ti_errores OCCURS 0,
dni TYPE z_dni,
descripcion(100) TYPE c,
END OF ti_errores.
* Estructura de errores
DATA: st_errores LIKE LINE OF ti_errores.
* Variables
DATA: v_mensaje(100) TYPE c,
v_error(1) TYPE c,
v_cod_trans(4) TYPE c VALUE 'SM30',
v_modo(1) TYPE c,
v_titulo LIKE sy-title,
v_campo(35) TYPE c,
v_indice(2) TYPE c,
v_repid LIKE sy-repid,
v_msg_id LIKE t100-arbgb,
v_msg_no LIKE t100-msgnr,
v_msg_v1 LIKE balm-msgv1,
v_msg_v2 LIKE balm-msgv2,
v_msg_v3 LIKE balm-msgv3,
v_msg_v4 LIKE balm-msgv4.
* Tablas y estructuras del ALV
DATA: st_layout TYPE slis_layout_alv,
ti_fieldcat TYPE slis_t_fieldcat_alv,
st_fieldcat TYPE slis_fieldcat_alv,
ti_header TYPE slis_t_listheader,
st_header TYPE slis_listheader.
NOTA: Estructura BDCMSGCOLL (Estructura estándar SAP que se utiliza para almacenar los mensajes resultantes de la ejecución de un CALL TRANSACTION). Estructura estándar del sistema utilizada para definir la tabla interna que almacenará los mensajes del batch input.
PASO 2: Lectura de datos de archivo de entrada
Se ejecuta el método CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD para levantar el archivo de entrada con la información para generar el Batch Input.
FORM levantar_archivo_entrada .
DATA: vl_file TYPE string.
IF p_path IS INITIAL.
MESSAGE s000(z_prueba) WITH text-003.
ELSE.
vl_file = p_path.
* Se abre el archivo de entrada para lectura
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = vl_file
filetype = 'ASC'
has_field_separator = ''
CHANGING
data_tab = ti_archivo[]
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
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19.
IF sy-subrc NE 0.
MESSAGE e000(z_prueba) WITH text-004.
ENDIF.
IF ti_archivo[] IS INITIAL.
MESSAGE s000(z_prueba) WITH text-005.
ENDIF.
ENDIF.
ENDFORM. " LEVANTAR_ARCHIVO_ENTRADA
PASO 3: Carga de la tabla BDCDATA
Para cargar la tabla BDCDATA se utiliza la subrutina BDC_FIELD. Antes se debe inicializar la tabla interna del Batch Input y la de los mensajes.
*&---------------------------------------------------------------------*
*& Form bdc_field
*&---------------------------------------------------------------------*
FORM bdc_field USING dyn_begin TYPE c
campo1
campo2.
CLEAR st_bdc_data.
IF dyn_begin = 'X'.
st_bdc_data-program = campo1.
st_bdc_data-dynpro = campo2.
st_bdc_data-dynbegin = dyn_begin.
ELSE.
st_bdc_data-fnam = campo1.
st_bdc_data-fval = campo2.
ENDIF.
APPEND st_bdc_data TO ti_bdc_data.
ENDFORM. " bdc_field
Como se ingresa más de un registro, se debe manejar índices para saber en qué fila de la pantalla se está cargando los datos. Se soluciona concatenando al nombre del campo el número de fila que le corresponde en la pantalla entre paréntesis.
*&---------------------------------------------------------------------*
*& Form CARGO_TABLA_BDCDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM cargo_tabla_bdcdata .
CLEAR: ti_bdc_data, ti_messages.
REFRESH: ti_bdc_data, ti_messages.
* Ingreso a la Primer pantalla y presiono boton de mantenimiento
PERFORM bdc_field USING 'X' 'SAPMSVMA' '0100'.
PERFORM bdc_field USING ' ' 'VIEWNAME' 'ZTABLA_USUARIOS'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=UPD'.
* Presiono boton de nuevas entradas
PERFORM bdc_field USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=NEWL'.
ADD 1 TO v_indice.
PERFORM completo_ceros_izq.
* Cargo datos del usuario
PERFORM bdc_field USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-DNI(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-dni.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-NOMBRE_APE(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-nombre_ape.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-ESTADO_USU(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-estado_usu.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-DIRECCION(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-direccion.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-CODIGO_POSTAL(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-codigo_postal.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-FECHA_NAC(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-fecha_nac.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-ESTADO_CIVIL(' v_indice ')' INTO v_campo.
PERFORM bdc_field USING ' ' v_campo st_archivo-estado_civil.
* Grabo los Registros
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=SAVE'.
* Cierro la segunda pantalla
PERFORM bdc_field USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '=ENDE'.
* Cierro la primer pantalla
PERFORM bdc_field USING 'X' 'SAPMSVMA' '0100'.
PERFORM bdc_field USING ' ' 'BDC_OKCODE' '/EENDE'.
ENDFORM. " CARGO_TABLA_BDCDATA
PASO 4: Ejecución de la sentencia Call Transaction
Se ejecuta la sentencia CALL TRANSACTION.
*&---------------------------------------------------------------------*
*& Form CALL_SM30
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM call_sm30 .
 
 
 
Sobre el autor
Publicación académica de Alexander Castellanos, en su ámbito de estudios para la Carrera Consultor ABAP.
Alexander Castellanos
Profesión: Ingeniero de Sistemas - Colombia - Legajo: JS42A
✒️Autor de: 67 Publicaciones Académicas
🎓Egresado del módulo:
Certificación Académica de Alexander Castellanos