• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
FORMACIÓN SAP

El reprocesamiento automático AIF hace la vida más fácil

By s4pcademy 


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 😊

Requisito

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 😊

Área del problema:

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.

Área de solución:

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:

  • Reprocesamiento automático AIF: Definir acción de reprocesamiento(código de transacción /AIF/REP_AC_DEF )
  • Reprocesamiento automático AIF: Asignar acción de reprocesamiento(código de transacción /AIF/REP_AC_ASGN)

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:

  1. utilizando BAPI BAPI_DELIVERYPROCESSING_EXEC
  2. usando BDC para copiar el nuevo elemento de VA02 a VL02N

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.

  1. Puede verificar si el proceso está realmente registrado en el reprocesamiento automático o el proceso finalizó con éxito en /AIF/ERROR. Inserte su espacio de nombres, interfaz y número de versión de la interfaz. Elija Hoy en Selección genérica y seleccione todos los estados en Selección de estado secciones.
  2. Si el reprocesamiento no está registrado, vuelva a verificar si el mensaje asignado es correcto.
  3. Si desea ver los datos de carga útil que se procesan, genere una tabla de persistencia AIF a través de /AIF/PERS_TBL_GEN código T. Después de generar, verá todas las cargas útiles a través de SE16Ny es bueno para analizar el propósito.
  4. Desafortunadamente, no puede depurar su AIF FM directamente. Pero puede hacerlo generando los datos de prueba en /AIF/ERROR en Modo técnico. Luego ve a Tcode /AIF/IFTEST, elija su archivo de prueba generado. Luego elija el archivo RAW y haga clic en Analizar botón. Por esto, ejecutará FM generado con carga útil en modo de depuración.

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 😊




Proceso de salida: desde el sitio de DC hasta el cliente en S/4 HANA integrado EWM TM: integración avanzada de envío y recepción (ASR): escenario del remitente
Previo
Resumen sobre la ejecución y optimización de consultas de HANA: información útil sobre SAP HANA
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.