
El Batch Input utilizando Call transaction
LECCION 4º DE 7:
1 - Mi primer BI usando Call transaction
1 - declaracion de los datos propios del BI.
*&---------------------------------------------------------------------*
*& Report ZTEST_CALL_TRANSACCTION
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztest_call_transacction.
* Tipos
TYPE-POOLS: slis.
* Tabla interna del BI con la estructura de BDCDATA
DATA: BEGIN OF ti_bdcdata OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF ti_bdcdata.
* Estructura del BI
DATA: wa_bdcdata TYPE bdcdata.
* Tabla interna de mensajes
DATA: BEGIN OF ti_mensajes OCCURS 0.
INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF ti_mensajes.
* Estructura de mensajes
DATA: wa_mensajes TYPE bdcmsgcoll.
* Tabla interna de usuarios
DATA: ti_archivo TYPE STANDARD TABLE OF ztabla_usuarios,
wa_archivo LIKE LINE OF ti_archivo.
* Tabla interna 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: wa_errores LIKE LINE OF ti_errores.
Estructura BDCMSGCOLL: se usa para almacenar los mensajes del BI.
2 - Lectura de datos del archivo de entrada.
*&---------------------------------------------------------------------*
*& Form LEVANTAR_ARCHIVO_ENTRADA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
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
3 - Carga de ti bdcdata.
*&---------------------------------------------------------------------*
*& Form CARGAR_TABLA_BDCDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM cargar_tabla_bdcdata .
CLEAR: ti_bdcdata, ti_mensajes.
REFRESH: ti_bdcdata, ti_mensajes.
* Ingresamos a la primer pantalla y presionamos el botón de mantenimiento
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPMSVMA' '0100'.
PERFORM llenar_tabla_bdcdata USING ' ' 'VIEWNAME' 'ZTABLA_USUARIOS'.
PERFORM llenar_tabla_bdcdata USING ' ' 'BDC_OKCODE' '=UPD'.
* Hacemos clic en el botón nuevas entradas
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
PERFORM llenar_tabla_bdcdata USING ' ' 'BDC_OKCODE' '=NEWL'.
ADD 1 TO v_indice.
PERFORM completo_ceros_izq.
* Cargamos los datos del usuario
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-DNI(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-dni.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-NOMBRE_APE(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-nombre_ape.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-ESTADO_USU(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-estado_usu.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-DIRECCION(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-direccion.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-FNACIMIENTO(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-fnacimiento.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-NACIONALIDAD(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-nacionalidad.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-CODIGO_POSTAL(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-codigo_postal.
CLEAR v_campo.
CONCATENATE 'ZTABLA_USUARIOS-ESTADO_CIVIL(' v_indice ')' INTO v_campo.
PERFORM llenar_tabla_bdcdata USING ' ' v_campo wa_archivo-estado_civil.
* Grabamos los registros
PERFORM llenar_tabla_bdcdata USING ' ' 'BDC_OKCODE' '=SAVE'.
* Cerramos la segunda pantalla
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPLZTABLA_USUARIOS' '0001'.
PERFORM llenar_tabla_bdcdata USING ' ' 'BDC_OKCODE' '=ENDE'.
* Cerramos la primer pantalla
PERFORM llenar_tabla_bdcdata USING 'X' 'SAPMSVMA' '0100'.
PERFORM llenar_tabla_bdcdata USING ' ' 'BDC_OKCODE' '/EENDE'.
ENDFORM. " CARGAR_TABLA_BDCDATA
4 - Ejecucion de CALl Transaction
*&---------------------------------------------------------------------*
*& Form CALL_SM30
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM call_sm30 .
CLEAR: ti_mensajes, v_error.
REFRESH ti_mensajes.
IF p_a EQ c_x.
v_modo = c_a.
ELSE.
v_modo = c_n.
ENDIF.
* Call transaction
CALL TRANSACTION v_cod_trans USING ti_bdcdata
MODE v_modo
UPDATE v_update
MESSAGES INTO ti_mensajes.
IF NOT sy-subrc IS INITIAL.
v_error = c_x.
ENDIF.
ENDFORM. " CALL_SM30
La sentencia Call Transaction tambien se usa en reportes, para acceder a una determinada transaccion ,
a partir de los datos ingresados por pantalla , con el agregado de la clausula AND SKIP FIRST SCREEN.