Ir al contenido
Programación ABAP

Generación dinámica de programas

Crear, leer y modificar programas mientras otro programa se ejecuta.

Manual ABAP
11 de 14

Antes y ahora

Generar código mientras se ejecuta un programa casi nunca es necesario hoy y es un riesgo de seguridad. Este es el resumen de las alternativas.

ConceptoEn el manualHoyEstado
Consultas variablesGenerar un programa con el SELECTABAP SQL con partes dinámicas entre paréntesisSustituido
Campos por su nombreGenerar códigoASSIGN COMPONENT … OF STRUCTURESustituido
Tipos que se conocen al ejecutarGenerar las declaracionesRTTS (CL_ABAP_TYPEDESCR…) y CREATE DATASustituido
Subrutinas temporalesGENERATE SUBROUTINE POOLLlamadas dinámicas a métodosSustituido

Sigue igual: READ REPORT para leer el código de un programa (herramientas de análisis).

11.1. Creación, modificación y lectura de un programa

Sustituido

Así se hace hoy

INSERT REPORT y GENERATE REPORT crean programas en el sistema mientras se ejecuta otro. Si parte del código viene de lo que escribe el usuario, puede ejecutar cualquier cosa: SAP lo marca en el ATC y no existe en ABAP Cloud. Casi todo se resuelve con programación dinámica:

Necesitas…Usa
Una consulta con tabla, campos o condición variablesABAP SQL con partes dinámicas entre paréntesis
Acceder a un campo por su nombreASSIGN COMPONENT … OF STRUCTURE
Crear una variable o tabla de un tipo que se conoce al ejecutarRTTS: CL_ABAP_TYPEDESCR, CL_ABAP_TABLEDESCR y CREATE DATA
Llamar a un método cuyo nombre se conoce al ejecutarCALL METHOD (lv_clase)=>(lv_metodo)
Texto original del manual: sintaxis clásica

Se puede generar y modificar un programa dinámicamente, es decir, en tiempo de ejecución (de otro programa, que será el que ‘cree’ o modifique el nuevo). Sentencias relacionadas:

  • INSERT REPORT programa FROM tabla.
    Esta sentencia permite la creación dinámica de un programa (se puede dar su nombre con un literal o usando una variable). Para ello debe usarse una tabla interna que contendrá el código del programa a generar. Cada entrada de esta tabla debe tener un solo campo, de 72 caracteres. En cada una se guardará una línea de programa. Si el programa que se especifica ya existiera, será modificado dinámicamente. El contenido de la tabla machacará completam. al programa antiguo.
  • Características del nuevo programa a generar: Clase de desarrollo (la misma que la del programa generador), título (sin título), tipo (1: reports), aplicación (‘S’: sistema básico).
    Ejemplo:

    ABAP
    DATA: tabla(72) OCCURS 0.
    
    APPEND 'REPORT ZF000001.' TO tabla.
    APPEND 'WRITE / ''hola''.' TO tabla.   "dentro de un literal la comilla simple se duplica
    INSERT REPORT 'ZF000001' FROM tabla.  "creación del nuevo programa
  • READ REPORT programa INTO tabla.
    Lee el programa especificado y lo guarda en la tabla dada. Luego ésta puede imprimirse o procesarse normalmente con una sentencia LOOP AT tabla. Es muy útil para modificar de forma dinámica el programa, cambiando alguna entrada de ella y luego haciendo un INSERT REPORT.

11.2. Creación de subrutinas temporales

Sustituido

Así se hace hoy

En lugar de generar una subrutina con la consulta, escribe la consulta con partes dinámicas y escapa todo lo que venga del usuario:

SQL dinámico seguro
DATA(lv_tabla)  = 'SFLIGHT'.
DATA(lv_campos) = `carrid, connid, fldate, price`.

" Escapar siempre lo que viene del usuario
DATA(lv_where) = |carrid = { cl_abap_dyn_prg=>quote( p_carrid ) }|.

DATA lr_datos TYPE REF TO data.
CREATE DATA lr_datos TYPE STANDARD TABLE OF (lv_tabla).
ASSIGN lr_datos->* TO FIELD-SYMBOL(<lt_datos>).

SELECT (lv_campos)
  FROM (lv_tabla)
  WHERE (lv_where)
  INTO CORRESPONDING FIELDS OF TABLE @<lt_datos>.

CL_ABAP_DYN_PRG tiene métodos para validar nombres de tablas y campos (check_table_name_str, check_column_name) y para escapar valores (quote).

Texto original del manual: sintaxis clásica
  • GENERATE SUBROUTINE POOL tabla NAME programa MESSAGE mensaje INCLUDE include LINE línea WORD palabra OFFSET offset TRACE-FILE var.
    Esta sentencia permite crear una subrutina en la memoria principal, de forma temporal, en lugar de almacenarla en SAP. El pool de subrutinas sólo existe durante la ejecución del programa que lo generó. Cada programa puede generar como máximo 36 pools temporales. Si ocurre algún error durante la generación, el campo del sistema SY-SUBRC contendrá 8, y 0 en otro caso.
  • Parámetros: Salvo ‘tabla’ y ‘programa’, el resto de variables son de salida. MESSAGE contiene el mensaje de error, si hay error de sintaxis. INCLUDE contiene el nombre del programa include donde el error ha ocurrido. LINE dice el número de línea errónea. WORD contiene la palabra clave de la sentencia errónea. OFFSET guarda el offset de la palabra con error. Con el campo TRACE-FILE se activa el modo trace, y se deja la traza del programa en ‘var’.

Para seguir