
¿Qué es un "Juego de Datos"?
Es una sesión de batch input que se almacena en la base de datos de SAP y se ejecuta posteriormente, ya sea de forma manual (desde la transacción SM35) o automática (vía jobs o programas en background).
Características clave:
· Se ejecuta en background (no bloquea la sesión del usuario).
· Permite reintentos si falla.
· Se puede programar para ejecutar en horarios específicos.
· Ideal para procesos masivos y críticos.
---
Flujo de Trabajo con Juego de Datos
1. Abrir la sesión → BDC_OPEN_GROUP
2. Insertar la transacción → BDC_INSERT
3. Cerrar la sesión → BDC_CLOSE_GROUP
4. Ejecutar la sesión → Manual con SM35 o automático con RSBDCBTC
---
Paso a Paso con Código ABAP
1. Declaración de Datos
```abap
" Tipo para la tabla BDCDATA
TYPES: BEGIN OF ty_bdcdata,
program TYPE bdc_prog, " Programa
dynpro TYPE bdc_dynr, " Dynpro
dynbegin TYPE bdc_start, " Inicio dynpro
fnam TYPE fnam___4, " Nombre del campo
fval TYPE bdc_fval, " Valor del campo
END OF ty_bdcdata.
" Tablas y variables
DATA: ti_bdcdata TYPE TABLE OF ty_bdcdata,
wa_bdcdata LIKE LINE OF ti_bdcdata.
DATA: ti_archivo TYPE TABLE OF ztabla_usuarios, " Estructura de datos de entrada
wa_archivo LIKE LINE OF ti_archivo.
DATA: v_grupo TYPE apqi-groupid. " Nombre del grupo de sesión
DATA: v_gid TYPE apqi-guid. " GUID de la sesión
```
---
2. Leer Archivo de Entrada
```abap
DATA: lv_ruta TYPE string.
lv_ruta = 'C:tempdatos_usuarios.txt'.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_ruta
filetype = 'ASC'
CHANGING
data_tab = ti_archivo.
```
---
3. Abrir la Sesión del Juego de Datos
```abap
v_grupo = 'ZCARGA_USUARIOS'. " Nombre que identifica la sesión
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
client = sy-mandt " Mandante
group = v_grupo " Nombre del grupo
user = sy-uname " Usuario que crea la sesión
keep = 'X' " Mantener sesión después de ejecutar
IMPORTING
gid = v_gid " GUID de la sesión
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
```
---
4. Cargar la Tabla BDCDATA (Usando Subrutina)
```abap
LOOP AT ti_archivo INTO wa_archivo.
REFRESH: ti_bdcdata.
" Pantalla inicial de SM30
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPMSVMA' '0100'.
PERFORM llenar_tabla_bdcdata USING '' 'BDC_CURSOR' 'VIEWNAME'.
PERFORM llenar_tabla_bdcdata USING '' 'BDC_OKCODE' '=UPD'.
PERFORM llenar_tabla_bdcdata USING '' 'VIEWNAME' 'ZTABLA_USUARIOS'.
" Pantalla de mantenimiento de la tabla
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
PERFORM llenar_tabla_bdcdata USING '' 'BDC_OKCODE' '=NEWL'.
" Pantalla de nuevo registro
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPLZTABLA_USUARIOS' '0002'.
PERFORM llenar_tabla_bdcdata USING '' 'ZTABLA_USUARIOS-DNI' wa_archivo-dni.
PERFORM llenar_tabla_bdcdata USING '' 'ZTABLA_USUARIOS-NOMBRE' wa_archivo-nombre.
PERFORM llenar_tabla_bdcdata USING '' 'BDC_OKCODE' '=SAVE'.
" Insertar la transacción en la sesión
PERFORM insertar_en_sesion.
ENDLOOP.
```
---
5. Insertar en la Sesión (`BDC_INSERT`)
```abap
FORM insertar_en_sesion.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tocode = 'SM30' " Transacción a ejecutar
TABLES
dynprotab = ti_bdcdata " Tabla con los datos
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tocode_invalid = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
```
---
6. Cerrar la Sesión (`BDC_CLOSE_GROUP`)
```abap
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
```
---
Ejecución del Juego de Datos
Opción 1: Ejecución Manual (Transacción SM35)
1. Ejecutar SM35.
2. Buscar el nombre del grupo (ej: ZCARGA_USUARIOS).
3. Seleccionar la sesión.
4. Click en Ejecutar (F8).
5. Elegir modo:
· Visual: Muestra las pantallas (útil para debug).
· Invisible: Ejecución en background sin mostrar nada.
· Solo errores: Muestra solo si hay error.
Opción 2: Ejecución Automática (Programa RSBDCBTC)
Se puede ejecutar la sesión via código ABAP usando la función BDC_SUBMIT o el programa RSBDCBTC.
```abap
SUBMIT rsbdcbtc
WITH p_groupe = 'ZCARGA_USUARIOS'
WITH p_dest = space
WITH p_mode = 'N' " Modo background
AND RETURN.
```
---
Ventajas vs Desventajas
Ventajas Desventajas
✅ Ejecución en background âš ï¸� Más complejo de implementar
✅ Reintentos automáticos âš ï¸� Requiere monitoreo (SM35)
✅ Ideal para datos críticos âš ï¸� Menos flexible que CALL TRANSACTION