Ir al contenido
Programación ABAP

Procesos en fondo (jobs)

Ejecutar programas en segundo plano: crear, planificar y supervisar jobs, también desde un programa.

Manual ABAP
13 de 14

Antes y ahora

Los jobs funcionan hoy igual que cuando se escribió el capítulo en los sistemas on-premise. Lo nuevo está en cómo se lanzan desde un programa y en ABAP Cloud.

ConceptoEn el manualHoyEstado
Lanzar un report en fondo desde un programaJOB_OPEN, JOB_SUBMIT, JOB_CLOSEJOB_OPEN, SUBMIT … VIA JOB, JOB_CLOSESe escribe distinto
Jobs en ABAP Cloud y S/4HANA Cloud—Application jobs, planificados desde la app Fiori «Application Jobs»Se escribe distinto
Tareas asíncronas cortasCALL FUNCTION … IN BACKGROUND TASKbgPF (background Processing Framework)Se escribe distinto

Sigue igual: SM36 y SM37, los estados de un job, el objeto de autorización S_BTCH_JOB.

13.1. Introducción

Sigue igual

Así se hace hoy

Los conceptos (job, paso, variante, procesos de trabajo de fondo) son los mismos.

  • Jobs:Pueden ejecutarse en ABAP programas sin diálogo con el usuario, es decir, en background: Los jobs. Están completamente integrados en el sistema SAP. Son sencillos de usar y permiten proceso distribuido y operaciones paralelas, sin que sea necesario un lenguaje de control de jobs específico. Permiten planificar y procesar programas ABAP en background. Los trabajos pueden ser visualizados y mantenidos. Fases de un job: job scheduling, job processing, job overview.
  • Tareas o procesos: Desde una sesión de usuario se puede llamar al ‘módulo’ del sistema encargado de despachar las diferentes tareas (el “dispatcher”). Hay varios tipos de procesos de trabajo: diálogo, actualización (update), fondo (batch), bloqueos (enqueue) y spool. Se diferencian entre sí respecto a la estrategia de “dispatching” usada. SAP trabajando es una colección de tareas en proceso.
  • Flujo de proceso: Un job es una secuencia de “steps” o pasos a ser planificados. Un “step” es el procesamiento de un programa individual, con un juego de parámetros (una variante). Es decir, un job es una secuencia de programas a ejecutar (en particular puede ser 1 solo). Cada uno de ellos se va ejecutando en background, en orden, y se va devolviendo el control al job cuando acaban, para lanzar el siguiente, ... Se usa la memoria global de Abap para pasar el contenido de campos, registros y tablas internas a “steps” subsiguientes, a aquellas variables que estén declaradas en varios “steps” o programas. Al final termina totalmente el job y se devuelve el control al sistema.

13.2. Creación y edición de jobs

Sigue igual

Así se hace hoy

Los jobs se crean con la SM36 y se siguen con la SM37, con su log y su spool. Si un job se cancela, el motivo suele estar en un dump de la ST22.

  • Creación de un job: Se usa la función Define Job del módulo básico (BC) de SAP. Se accede a ella por menú: Sistema – Servicios – Jobs, o bien por Sistema – Servicios – Reporting – Programa – Jobs en background (transacción SM36). Se debe dar un nombre (cualquiera) para el job y los nombres de los programas a ejecutar. Después se planifica (dar fecha y hora de inicio) y se graba. La fechas de inicio y ejecución periódica, y los parámetros de impresión se pueden fijar permanentemente. Mediante la clase de job se pueden clasificar los jobs por prioridad y tipo.
  • Edición de un job: Se usa la función Job Overview. Se accede a ella por menú: Sistema – Servicios – Lista de jobs, o bien por Ir a – Job Overview (transacción SM37). Se pueden extender jobs ya creados previamente con “steps” adicionales, es decir, añadir nuevos programas al job.
  • Log: El log de un job contiene todos los mensajes visualizables con la sentencia ABAP MESSAGE (todos los tipos de mensaje), así como mensajes internos del sistema que se verían si la ejecución fuera on-line, no en background. También queda reflejada la hora de inicio y la hora de finalización del job. Los textos que los programas (“steps”) del job escriban con WRITE, al ejecutarlos en segundo plano son almacenados en el “Spool file”. La impresión de los mismos puede ser fijada también en el proceso de planificación.

Planificadocreado en SM36Liberadocon fecha o eventoListoesperando procesoActivoen ejecuciónFinalizadover log y spoolCanceladoerror o paradaSM36Crear y planificar jobsSM37Ver y supervisar jobsSM50 / SM66Procesos en ejecuciónSM62Eventos que disparan jobs
Un job pasa por varios estados desde que se crea hasta que termina. En SM37 puedes ver su log y la salida en el spool.

13.3. Transferencia de datos y autorizaciones

Sigue igual

Así se hace hoy

EXPORT e IMPORT a la memoria funcionan igual, pero solo entre programas de la misma cadena de llamadas: un job de fondo es otra sesión y no ve esa memoria. Para pasar datos a un job, usa la variante o una tabla propia.

  • EXPORT nombre1 nombre2 ... TO MEMORY.
    Con las sentencias EXPORT e IMPORT se transfieren datos entre dos programas ABAP incluidos en la misma cadena de llamada. ‘nombre1’, … son los nombres de los campos, variables y tablas internas que se desean almacenar en la memoria global (entonces serán importables)
  • IMPORT nombre1 nombre2 ... FROM MEMORY.
    Con esta sentencia otro programa puede recoger los valores de los objetos antes guardados. En ambos programas dichos objetos deben ser declarados igual (en tipo, longitud y estructura). Se puede usar la opción ID id para hacer referencia a objetos con diferentes identificaciones. Si encuentra los datos, tras IMPORT el campo del sistema SY-SUBRC vale 0; si en esa memoria no hay nada, vale 4.
  • Autorizaciones para los procesos de background: Las funciones individuales están protegidas por los objetos S_BTCH_JOB (actividades del job): DELE (borrar job), PLAN (planificar job), SHOW (mostrar job), RELE (release o liberar job), LIST (mostrar la lista de jobs), PROT (ver el log de los jobs). Dichos objetos S_BTCH_JOB son procesados durante la creación del job por el objeto S_BTCH_NAM: nombre de usuario que puede especificarse cuando se planifica un job. En este momento también pueden indicarse en S_PROGRAM (grupo de autorización y acciones de usuario) programas que pertenezcan al grupo de autorización.

13.4. Generación automática de jobs

Se escribe distinto

Así se hace hoy

La forma más corta de lanzar un report en fondo es SUBMIT … VIA JOB entre JOB_OPEN y JOB_CLOSE: no hace falta JOB_SUBMIT y se pueden pasar los parámetros con WITH.

Antes
CALL FUNCTION 'JOB_OPEN'
  EXPORTING jobname  = lv_job
  IMPORTING jobcount = lv_num.

CALL FUNCTION 'JOB_SUBMIT'
  EXPORTING
    authcknam = sy-uname
    jobcount  = lv_num
    jobname   = lv_job
    report    = 'ZINFORME'
    variant   = 'DIARIA'.

CALL FUNCTION 'JOB_CLOSE'
  EXPORTING
    jobcount  = lv_num
    jobname   = lv_job
    strtimmed = 'X'.
Ahora
CALL FUNCTION 'JOB_OPEN'
  EXPORTING jobname  = lv_job
  IMPORTING jobcount = lv_num.

SUBMIT zinforme USING SELECTION-SET 'DIARIA'
       VIA JOB lv_job NUMBER lv_num
       AND RETURN.

CALL FUNCTION 'JOB_CLOSE'
  EXPORTING
    jobcount  = lv_num
    jobname   = lv_job
    strtimmed = abap_true.
Texto original del manual: sintaxis clásica
  • Un programa ABAP puede generar un job automáticamente, en lugar de hacerlo el usuario manualmente mediante transacciones o por menú. Mediante módulos de función específicos, el programa puede abrir un job (JOB_OPEN), insertar steps en un job (JOB_SUBMIT) y cerrar un job (JOB_CLOSE). Hay otras funciones relacionadas: mostrar el log del job, leerlo, copiar el job, borrarlo, editar un job (JOB_OVERVIEW), disparar un evento (TRIGGER_EVENT), chequear el disparo de un evento (CHECK_EVENT_NAME).
  • JOB_OPEN:Abre un job, identificado por su ‘jobname’. El sistema devuelve el número del job (JOBCOUNT), que hay que pasar a JOB_SUBMIT y JOB_CLOSE.

    ABAP
    CALL FUNCTION 'JOB_OPEN'
      EXPORTING
    *   DELANFREP              = ' '       "borrar report interno
        jobname                =           "nombre del job
    * IMPORTING
    *   JOBCOUNT               =           "número de job devuelto
    * EXCEPTIONS
    *   CANT_CREATE_JOB        = 1
    *   INVALID_JOB_DATA       = 2
    *   JOBNAME_MISSING        = 3
    *   OTHERS                 = 4
    ...
              .
  • JOB_SUBMIT: Se usa para añadir un “step” a un job, especificando todos los parámetros de entrada (EXPORTING) del mismo. Con la sentencia SUBMIT … WITH puede especificarse un conjunto de parámetros de selección para el job.

    ABAP
    CALL FUNCTION 'JOB_SUBMIT'
      EXPORTING
        authcknam                         =        "nombre del usuario propietario del job
        jobcount                          =        "número de job
        jobname                           =        "nombre del job
    *   REPORT                            = ' '    "nombre del report (el "step")
    *   VARIANT                           = ' '    "variante de ejecución del report
    * EXCEPTIONS
    *   INVALID_JOBDATA                   = 1
    *   JOBNAME_MISSING                   = 2
    ...
              .
  • JOB_CLOSE: Se usa para cerrar la planificación de un job, que quedará listo para ejecutarse. Es obligatorio dar su nombre y número de job. Si no se especificó la fecha y hora de inicio en JOB_OPEN, puede hacerse en JOB_CLOSE (para que se ejecute inmediatamente necesita marcarse ‘X’ en el parámetro strtimmed).

    ABAP
      CALL FUNCTION 'JOB_CLOSE'
        EXPORTING
          jobcount             =          "número de job
          jobname              =          "nombre del job
    *     SDLSTRTDT            = NO_DATE  "fecha de inicio planificada
    *     SDLSTRTTM            = NO_TIME  "hora de inicio planificada
    *     STRTIMMED            = ' '      "flag de inicio inmediato
    *   EXCEPTIONS
    *     INVALID_STARTDATE    = 1
    *     JOBNAME_MISSING      = 2
     ...
                    .

En ABAP Cloud: application jobs

En S/4HANA Cloud y en ABAP Cloud no hay SM36 ni SUBMIT: el proceso en fondo es una clase que el usuario planifica desde la app Fiori «Application Jobs».

Application job
CLASS zcl_job_limpieza DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_apj_dt_exec_object.   " parámetros del job
    INTERFACES if_apj_rt_exec_object.   " ejecución
ENDCLASS.

CLASS zcl_job_limpieza IMPLEMENTATION.
  METHOD if_apj_dt_exec_object~get_parameters.
    et_parameter_def = VALUE #( ( selname = 'P_DIAS' kind = if_apj_dt_exec_object=>parameter
                                  datatype = 'N' length = 3
                                  param_text = 'Días a conservar'
                                  changeable_ind = abap_true ) ).
    et_parameter_val = VALUE #( ( selname = 'P_DIAS' kind = if_apj_dt_exec_object=>parameter
                                  sign = 'I' option = 'EQ' low = '30' ) ).
  ENDMETHOD.

  METHOD if_apj_rt_exec_object~execute.
    DATA lv_dias TYPE i VALUE 30.
    LOOP AT it_parameters INTO DATA(ls_param) WHERE selname = 'P_DIAS'.
      lv_dias = ls_param-low.
    ENDLOOP.
    " … borrar los registros con más de lv_dias días …
  ENDMETHOD.
ENDCLASS.
  • Para que el usuario pueda planificarlo, se crean en ADT un job catalog entry (apunta a la clase) y un job template (valores por defecto).
  • Para tareas asíncronas cortas dentro de una aplicación RAP existe el bgPF (background Processing Framework).