Generación dinámica de programas
Crear, leer y modificar programas mientras otro programa se ejecuta.
- Manual ABAP
- 11 de 14
- Anterior
- Modularización
- Siguiente
- Depuración (debugging)
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.
| Concepto | En el manual | Hoy | Estado |
|---|---|---|---|
| Consultas variables | Generar un programa con el SELECT | ABAP SQL con partes dinámicas entre paréntesis | Sustituido |
| Campos por su nombre | Generar código | ASSIGN COMPONENT … OF STRUCTURE | Sustituido |
| Tipos que se conocen al ejecutar | Generar las declaraciones | RTTS (CL_ABAP_TYPEDESCR…) y CREATE DATA | Sustituido |
| Subrutinas temporales | GENERATE SUBROUTINE POOL | Llamadas dinámicas a métodos | Sustituido |
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 variables | ABAP SQL con partes dinámicas entre paréntesis |
| Acceder a un campo por su nombre | ASSIGN COMPONENT … OF STRUCTURE |
| Crear una variable o tabla de un tipo que se conoce al ejecutar | RTTS: CL_ABAP_TYPEDESCR, CL_ABAP_TABLEDESCR y CREATE DATA |
| Llamar a un método cuyo nombre se conoce al ejecutar | CALL 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:
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
- Leer la estructura de una tabla sin generar código: DDIF_FIELDINFO_GET o RTTS.
- Expresiones y constructores: New ABAP 7.5.