Estimados,
Me gustaría compartir un caso interesante relacionado con el reprocesamiento automático AIF en este blog. Me hizo la vida más fácil, así que decidí compartirlo con ustedes 😊
Recientemente tuve el requisito de realizar algunas mejoras en el cambio de orden de venta VA02 Tcode. Entonces, para ser más exactos, en caso de agregar nuevas posiciones de artículos, se debe crear la misma posición de artículos en la entrega saliente respectiva. Podría ser un requisito específico con respecto al cliente, pero el cliente siempre tiene la razón 😊
Entonces, nada es especial aquí para hacer el requisito anterior. Puede encontrar fácilmente include para hacer las mejoras en VA02 y use BAPI o BDC estándar para insertar la nueva posición del artículo en la entrega saliente respectiva. Algunas selecciones y mapeo de datos a estructuras BAPI. Voilá… ya está hecho.
Pero en la vida real no todo es tan fácil como parece. Durante el proceso me encontré con un error VL045 – La orden de venta &1 está siendo procesada actualmente por el usuario &2.
Entonces, mostró que mi propio usuario bloqueó la orden de venta actual mientras realizaba cambios en VL02N.
Sí, eso es correcto ya que ambos procesos están interconectados, insertando la nueva posición del artículo en la entrega saliente verifica si la transacción de la orden de venta está bloqueada o no.
Entonces entendí que necesito una herramienta que pueda guardar la carga útil actual y volver a procesarla después de un tiempo. Además, el usuario puede hacer algunos cambios adicionales en VA02, en ese caso, mi solución debería activarse hasta que no reciba un mensaje de error. VL045 – La orden de venta &1 está siendo procesada actualmente por el usuario &2.
Por lo tanto, la herramienta debe incluir la cantidad de contadores para establecer cuántas veces se debe activar mi lógica y la cantidad de tiempo (minutos/segundos) para establecer el intervalo de tiempo para la activación de la lógica.
Además, la lógica debe activarse solo y solo debe tener el mensaje de error VL045.
Y… descubrí que el reprocesamiento automático AIF es la mejor opción aquí.
Entonces, ¿qué es el reprocesamiento automático AIF y cómo usarlo en mi caso? Según la documentación oficial:
En SAP Application Interface Framework, una acción de reprocesamiento es la representación técnica de un módulo de función que llama un trabajo por lotes. Una acción de reprocesamiento contiene el grupo de configuración de tiempo de ejecución de AIF adecuado y el módulo de función al que llama el trabajo de reprocesamiento.
El tiempo de ejecución de AIF programa una acción de reprocesamiento para los mensajes de error registrados según su configuración en las siguientes tablas de configuración:
En primer lugar, ejecutar /AIF/CLIENTE transacción para crear un espacio de nombres a través de Definir espacio de nombres y asigne la interfaz a su espacio de nombres a través de Definir interfaces. Entonces, aquí está el resultado en mi caso:
No olvides revisar el Mover estructuras correspondientes.
En cuanto a Estructura de datos de SAP y Estructura de datos sin procesar, deben tener la estructura que mantiene la carga útil, y se usará más adelante en FM. En mi caso, he creado una estructura que incluye tres campos principales para insertar una nueva posición en la entrega saliente existente:
Como siguiente paso, expanda Propiedades de interfaz adicionales en /AIF/CLIENTE y ejecutar Especificar motores de interfaz y establecer Persistencia estructurada a los siguientes tres campos:
Ahora necesitamos crear acción y FM ejecutando Definir acciones. En cuanto a la FM
En cuanto a la FM, elija Definir funciones e inserte el nombre de FM, haciendo clic en GUARDAR o ENTRAR, la ventana emergente le pide que copie FM de la plantilla AIF. Simplemente haga clic en COPIAR y eso es todo.
Hasta ahora tan bueno. Ya hemos creado algunos elementos básicos de AIF como el espacio de nombres, la interfaz, la estructura de persistencia y la acción. Es hora de hacer un mapeo de estructuras y acciones. Para hacer esto, ejecute Definir asignaciones de estructura inserte su espacio de nombres, interfaz y número de versión. Luego, en la estructura fuente, establezca su estructura que creó en los pasos anteriores y haga lo mismo con Asignar acciones.
Hugh, finalmente es hora de crear los objetos principales para implementar el reprocesamiento automático. El primer paso aquí es crear la configuración del grupo de tiempo de ejecución a través de Tcode /AIF/PERS_CGR
Atención !!! No olvides revisar Runtime Cfg activo y Ejecutar programado casillas de verificación
Ahora definamos la acción de reprocesamiento, usando Tcode /AIF/REP_AC_DEF
presta atención a que /AIF/RESTART_MSG Está establecido.
SAP Application Interface Framework ofrece el módulo de funciones /AIF/RESTART_MSG para reiniciar automáticamente los mensajes de error registrados.
Finalmente, como último paso en AIF, debemos asignar el mensaje de error y la acción de reprocesamiento en Tcode /AIF/REP_AC_ASGN.
Así que ahora, en caso de mensaje de error VL045AIF activará mi lógica dentro de FM generado diez veces cada 10 segundos, hasta que se procese con éxito.
Ahora agreguemos un poco de lógica al FM generado y llamemos FM en VA02 mejora.
Primero, agreguemos la lógica necesaria para insertar el nuevo artículo en la entrega saliente en el FM generado ZAKB_FM_INSERTITEMOBD.
FM tiene parámetros cambiantes y hay uno llamado CURR_LINEcambie su tipo a su estructura de persistencia:
Aquí, encontré dos formas de insertar un nuevo artículo en la entrega saliente:
Acabo de usar la forma BDC para ilustrar en este blog. Y aquí está el código fuente de muestra:
FUNCTION zakb_fm_insertitemobd .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(TESTRUN) TYPE C
*" REFERENCE(SENDING_SYSTEM) TYPE /AIF/AIF_BUSINESS_SYSTEM_KEY
*" OPTIONAL
*" TABLES
*" RETURN_TAB STRUCTURE BAPIRET2
*" CHANGING
*" REFERENCE(DATA)
*" REFERENCE(CURR_LINE) TYPE ZAKB_S_OBD_PAYLOAD
*" REFERENCE(SUCCESS) TYPE /AIF/SUCCESSFLAG
*" REFERENCE(OLD_MESSAGES) TYPE /AIF/BAL_T_MSG
*"----------------------------------------------------------------------
BREAK-POINT. "#EC NOBREAK
DATA lt_bdcdata TYPE TABLE OF bdcdata.
DATA lt_messtab TYPE TABLE OF bdcmsgcoll.
CLEAR: lt_bdcdata,
lt_messtab.
"1st Screen
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING FIELD-SYMBOL(<ls_bdcdata>).
<ls_bdcdata>-program = 'SAPMV50A'.
<ls_bdcdata>-dynpro = '4004'.
<ls_bdcdata>-dynbegin = 'X'.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'LIKP-VBELN'.
<ls_bdcdata>-fval = curr_line-delivery.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'BDC_OKCODE'.
<ls_bdcdata>-fval="=ENT2".
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-program = 'SAPMV50A'.
<ls_bdcdata>-dynpro = '1000'.
<ls_bdcdata>-dynbegin = 'X'.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'BDC_OKCODE'.
<ls_bdcdata>-fval="=RAUF_T".
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-program = 'SAPMV50A'.
<ls_bdcdata>-dynpro = '0105'.
<ls_bdcdata>-dynbegin = 'X'.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'LV50C-DATBI'.
<ls_bdcdata>-fval = sy-datum+6(2) && '.' && sy-datum+4(2) && '.' && sy-datum(4).
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'LV50C-VBELN'.
<ls_bdcdata>-fval = curr_line-salesdocument.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'LV50C-ABPOS'.
<ls_bdcdata>-fval = curr_line-salesdocumentitem.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'LV50C-BIPOS'.
<ls_bdcdata>-fval = curr_line-salesdocumentitem.
DATA: lv_datum TYPE dats.
lv_datum = sy-datum + 30.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'LV50C-DATBI'.
<ls_bdcdata>-fval = lv_datum+6(2) && '.' && lv_datum+4(2) && '.' && lv_datum(4). .
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'BDC_OKCODE'.
<ls_bdcdata>-fval="=ENT1".
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'BDC_OKCODE'.
<ls_bdcdata>-fval="=ENT1".
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'BDC_OKCODE'.
<ls_bdcdata>-fval="=BACK_T".
IF lt_bdcdata[] IS NOT INITIAL.
"Last Screen (Save)
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-program = 'SAPMV50A'.
<ls_bdcdata>-dynpro = '1000'.
<ls_bdcdata>-dynbegin = 'X'.
APPEND INITIAL LINE TO lt_bdcdata ASSIGNING <ls_bdcdata>.
<ls_bdcdata>-fnam = 'BDC_OKCODE'.
<ls_bdcdata>-fval="=SICH_T".
ENDIF.
DATA(lv_mode) = 'N'.
CALL TRANSACTION 'VL02N' USING lt_bdcdata
MODE lv_mode
UPDATE 'S'
MESSAGES INTO return_tab.
ENDFUNCTION.
Ahora necesitamos registrar la llamada a FM, en caso de inserción de un nuevo artículo en la Orden de Venta, use incluir MV45AFZZ y subrutina salida_usuario_guardar_documento_preparar, se activa al hacer clic en el botón GUARDAR en VA02 código T.
Aquí está el código fuente para llamar al evento de reprocesamiento de AIF sin espacio de nombres e ID de configuración de tiempo de ejecución:
" Call AIF automatic re-processing
TRY.
/aif/cl_enabler_xml=>transfer_to_aif( is_any_structure = ls_new_itemobd " Persistence structure type to keep payload
iv_queue_ns="ZIFTST" " AIF Namespace
iv_queue_name="ZRC" ). " Runtime group configuration ID
CATCH /aif/cx_aif_engine_not_found INTO DATA(lx_engine_not_found).
CATCH /aif/cx_enabler_base INTO DATA(lx_enabler_base).
CATCH /aif/cx_aif_engine_base INTO DATA(lx_engine_base).
CATCH /aif/cx_error_handling_general INTO DATA(lx_error_handling).
CATCH /aif/cx_inf_det_base INTO DATA(lx_inf_det_base).
ENDTRY.
Yuuhuu, eso es todo, lo logramos. Ahora tenemos reprocesamiento automático que se activará cada 10 segundos en caso de VL045 mensaje de error, al insertar un nuevo artículo en la orden de venta.
Algunos consejos útiles.
Para resumir:
En SAP AIF, el reprocesamiento automático genera fácilmente un trabajo en segundo plano y puede configurar fácilmente contadores y tiempo para volver a intentar el proceso. Otro punto importante y útil es que el proceso creará un trabajo en segundo plano solo cuando lo activen los mensajes de error que haya registrado.
Documentos útiles:
Si encuentra el blog perspicaz e interesante, siga mi perfil para obtener más temas técnicos interesantes.
Estaré agradecido por sus comentarios y opiniones.
Hasta entonces feliz codificación 😊
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073