Skip to Content
Author's profile photo DAIRO LEONARDO LOZANO RODRIGUEZ

Como resolver problemas de actualización asíncrona en ABAP – Parte 2

En del documento anterior analizamos en qué consisten los problemas de actualización asíncrona y evaluamos una forma de solucionarlos mediante la sentencia SET UPDATE TASK LOCAL

En este documento analizaremos el mismo caso, pero ejecutando las tareas de actualización en un proceso que se ejecuta en una sesión aparte, la cual puede ser ejecutada en fondo.

El procedimiento es el siguiente:

Paso 1: Forzar la ejecución de un módulo de función o BAPI en una nueva sesión:


CALL FUNCTION ‘BAPI_OUTB_DELIVERY_CHANGE’

  DESTINATION ‘NONE’

    EXPORTING

      header_data    = ls_header_data

      header_control = ls_header_control

      delivery       = lv_bapi_delivery

    TABLES

      return         = lt_return.



Paso 2: Forzar la actualización de la base de datos en la nueva sesión.


CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’

  DESTINATION ‘NONE’

    EXPORTING wait = ‘X’.



Paso 3: Forzar el cierre de la sesión para que se ejecuten las actualizaciones.


CALL FUNCTION ‘RFC_CONNECTION_CLOSE’

  EXPORTING destination = ‘NONE’

  EXCEPTIONS OTHERS = 0.


Vale la pena aclarar que para este escenario lo que se requiere es que el proceso de actualización se realice en la nueva sesión por lo que es necesario utilizar el módulo de función BAPI_TRANSACTION_COMMIT en lugar de la sentencia  COMMIT WORK AND WAIT.

Una vez se ejecute el módulo de función ‘RFC_CONNECTION_CLOSE’  se ejecutarán todas las actualizaciones y se cerrará la sesión separada.

Assigned Tags

      2 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Cristina Cebreros Catzoli
      Cristina Cebreros Catzoli

      Hola Leonardo,

      ¡Muchísimas gracias! Acabo de resolver justo un tema de actualización en SAP TM siguiendo tus recomendaciones. Felicidades por tu contenido tan claro.

      Author's profile photo RUBEN DARIO RAMIREZ
      RUBEN DARIO RAMIREZ

      Hola Leonardo

      He implementado la solucion de la part 1; es decir;

      SET UPDATE TASK LOCAL.

      CALL FUNCTION 'HU_POST'
      EXPORTING
      IF_COMMIT            'X'
      IF_NO_RENAME         SPACE
      IF_NO_MESSAGES       no_message
      IS_OBJECT            WA_OBJECT
      IMPORTING
      EF_NUMBER            WA_NUMBER
      ES_EMKPF             WA_EMKPF
      ET_MESSAGES          IT_MESSAGES.

      COMMIT WORK AND WAIT.

      Para despues ejecutar el siguiente FM

       CALL FUNCTION 'L_TO_CREATE_MOVE_SU'
      EXPORTING
      I_LENUM                     PU_LENUM
      I_NLTYP                     PU_LGTYP
      I_BWLVS                     V_BWLVS
      I_NLPLA                     PU_LGPLA
      I_BETYP                     V_BETYP
      I_BENUM                     PU_BENUM
      I_SQUIT                     'X'
      I_COMMIT_WORK               'X'
      I_BNAME                     SY-UNAME
      IMPORTING
      E_TANUM                     V_TANUM.

       

      El detalle es que para ejecutar el ultimo FM necesito que termine el FM anterior ya que requiero que el resultado ya exista en Base de dato, el problema es que esto es una automatizacion y se puede ejecutar N veces por lo que los tiempos de ejecucion se va a hasta minutos.

      Con la solucion que presentas de la parte 2 se puede mejorar el tiempo de respuesta?