martes, 9 de octubre de 2007

Call Transaction VS. Submit

A la hora de llamar a un programa desde otro programa, si este es de tipo report y además tiene una transacción que lo ejecute, se puede emplear tanto un "CALL" como un "SUBMIT". ¿Cuáles son las diferencia entre uno y otro? Que yo sepa:


1. El CALL TRANSACTION puede llamar a cualquier tipo de programas, sólo hay que crearles una transacción (si no la tienen).


2. El CALL TRANSACTION permite usar una tabla de tipo BDCDATA, y simular un conjunto de acciones (como en un batch input). También permite usar parámetros.


3. El SUBMIT ejecuta el programa sin preguntar por la pantalla por defecto (es decir, si no se le pasan valores a los rangos, toma los que haya por defecto en el caso de que haya pantalla de selección). También permite el uso de parámetros.

Para ilustrarlo, he hecho el siguiente programita, que básicamente llama a la trasacción WE05 usando el primer número de idoc que encuentre ese día.


*&---------------------------------------------------------------------*
*& Report Z_AGH_CALL
*&
*&---------------------------------------------------------------------*
*& Tres ejemplos para llamar a una transacción.
*& Se usará de ejemplo la transacción WE05 y se le pasará el
*& Número de idoc
*&---------------------------------------------------------------------*
*& Alberto García de Haro
*& http://misprogramasabap.blogspot.com/
*&---------------------------------------------------------------------*
*& Textos de selección:
* P_BDC Call Transacion y bdcdata
* P_PAR Call Transaction y parámetros
* P_SUB Submit
*& Símbolos de texto
* 001 Opciones de ejecución
*&---------------------------------------------------------------------*
report z_agh_call.
*&---------------------------------------------------------------------*
*& TOP: variables, tablas internas, etc.
*&---------------------------------------------------------------------*
data: obj like edidc-docnum.
data: begin of i_bdc_data occurs 10.
include structure bdcdata.
data: end of i_bdc_data.
data: begin of i_rspar occurs 10.
include structure rsparams.
data: end of i_rspar.
tables:
usr02.
data: begin of i_users occurs 10.
include structure usr02.
data: end of i_users.
*&---------------------------------------------------------------------*
*& PANTALLA DE SELECCIÓN
*&---------------------------------------------------------------------*
selection-screen begin of block bl1 with frame title text-001.
parameters:
p_sub radiobutton group gr1,
p_par radiobutton group gr1,
p_bdc radiobutton group gr1.
selection-screen end of block bl1.
*&---------------------------------------------------------------------*
*& EVENTOS
*&---------------------------------------------------------------------*
start-of-selection.
perform seleccionar_idoc changing obj.

if p_sub eq 'X'.
perform llamada_submit.
elseif p_par eq 'X'.
perform llamada_parametros.
else. "debe ser p_bdc eq 'X'
perform llamada_bdcdata.
endif.
*&---------------------------------------------------------------------*
*& SUBRUTINAS
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form seleccionar_idoc
*&---------------------------------------------------------------------*
* Selecciona un número de idoc
*----------------------------------------------------------------------*
* <--P_OBJ nº de idoc
*----------------------------------------------------------------------*
form seleccionar_idoc changing p_obj.
data: fecha like sy-datum, d_cont type i. "Para usar la fecha
fecha = sy-datum.
clear d_cont.
do.
select single docnum into p_obj from edidc
where credat eq sy-datum.
if sy-subrc eq 0 or d_cont = 30.
"encontró un idoc O llegó a 30 días sin encontrar nada
exit.
endif.
****RESTAMOS UN DÍA
call function 'SUBTRACT_TIME_FROM_DATE'
exporting
i_idate = fecha
i_time = 1
i_iprkz = 'D'
importing
o_idate = fecha.
add 1 to d_cont.
enddo.
endform. " seleccionar_idoc
*&---------------------------------------------------------------------*&
*& Form llamada_submit
*&---------------------------------------------------------------------
**& Llamada con la sentencia submit
*----------------------------------------------------------------------*
form llamada_submit .
ranges ndocc for edidc-docnum.
clear: ndocc.
move:
'I' to ndocc-sign,
'EQ' to ndocc-option,
obj to ndocc-low.
append ndocc.

submit rseidoc2 with docnum in ndocc
and return.

endform. " llamada_submit
*&---------------------------------------------------------------------*
*& Form llamada_parametros
*&---------------------------------------------------------------------*
Llamada con call transaction y parámetros
*----------------------------------------------------------------------*
form llamada_parametros .
set parameter id 'DCN' field obj.
call transaction 'WE05'.
endform. " llamada_parametros
*&---------------------------------------------------------------------*
*& Form llamada_bdcdata
*&---------------------------------------------------------------------*
Llamada con call transaction y bdc_data
*----------------------------------------------------------------------*

form llamada_bdcdata .

*Llenamos la tabla
refresh i_bdc_data.
i_bdc_data-program = 'RSEIDOC2'.
i_bdc_data-dynpro = '1000'.
i_bdc_data-dynbegin = 'X'.
append i_bdc_data. clear i_bdc_data.


i_bdc_data-fnam = 'DOCNUM-LOW'.
i_bdc_data-fval = obj.
append i_bdc_data. clear i_bdc_data.

call transaction 'WE05' using i_bdc_data.

endform. " llamada_bdcdata