La programación dinámica en ABAP, permite la creación de aplicaciones en aquellas situaciones donde no se conocen los objetos de datos y estos tienen que ser creados en tiempo de ejecución. Mediante el uso de este tipo de programación se puede reducir el código fuente en aquellas situaciones donde el código es repetitivo.
Como desventaja de este tipo de programación es que las sentencias usadas son muy elaboradas ocasionando que el mantenimiento de las aplicaciones se torne compleja.
Conceptos claves de la programación dinámica
Para desarrollar aplicativos usando programación dinámica hay que tener claro los siguientes conceptos:- Field Symbols.
- Referencias de Datos.
- Generación de objetos de datos dinámicamente.
Field Symbols 1
Son punteros des referenciados, es decir son objetos de datos que apuntan al contenido de una variable. Básicamente cuando accedemos al field symbol estamos accediendo al contenido del objeto de datos, claro esta que esto ocurre cuando el objeto de datos es asignado al field symbol.Mediante la sentencia FIELD-SYMBOLS se declaran los field symbols dentro del programa. El field symbol puede ser declarado con un tipo definido si se conoce el tipo de la variable al que va apuntar, en caso contrario puede ser de tipo ANY.
Cuando un objeto de datos sea asignado a un field symbol hay que tener en cuenta que el tipo de dato del objeto asignado debe ser compatible con el tipo de dato del field symbol, si esto no se cumple puede ocurrir un error de sintaxis o de tiempo de ejecución, el error en tiempo de ejecución ocurre cuando el tipo de dato del field symbols es ANY.
Cuando ya se desee definir el fiel symbol lo que se hace es asignar el objeto de datos al field symbol mediante la sentencia ASSIGN.
Referencias de Datos 2
Las referencias a los datos son punteros a los objetos de datos, para definir una referencia se hace usando la sentencia TYPE REF TO; un puntero es un apuntador a una dirección de memoria.Generación de objetos de datos dinámicamente
Mediante el uso de referencias de datos se pueden crear objetos de datos de manera dinámica, para esto también debe usar la sentencia CREATE DATA 3.Ejemplo
El problema propuesto es crear un programa que permita visualizar los registros de una tabla transparente, la idea es que se muestren las dos formas que existen para generar un reporte en ABAP, ya sea usando la sentencia WRITE o usando el List Viewer (ALV), que tenga como parámetros de entrada el nombre de la tabla, la cantidad de registros deseados y el tipo de salida del reporte.Pantalla principal
Los parámetros de entrada son el nombre de la tabla, cantidad de registros a mostrar y el tipo de generación (ALV o Reporte normal).Estructura del programa
Código del programa
YFORMAS_DAR_SALIDA_IT
*&---------------------------------------------------------------------*
*& Report YFORMAS_DAR_SALIDA_IT
*&
*&---------------------------------------------------------------------*
*& Elaboro: Fernando Muñoz Beltrán
*& Email: fmunozb@gmail.com
*&
*&---------------------------------------------------------------------*
*& Programa de ejemplo de programación dinámica
*&
INCLUDE
yformas_dar_salita_it_top
.
" global Data
INCLUDE
yformas_dar_salita_it_e01
.
" Events
YFORMAS_DAR_SALITA_IT_TOP
*&---------------------------------------------------------------------*
*& Include YFORMAS_DAR_SALITA_IT_TOP Report YFORMAS_DAR_SALIDA_IT
*&
*&---------------------------------------------------------------------*
REPORT
yformas_dar_salida_it
.
SELECTION-SCREEN
BEGIN
OF
BLOCK
a1
WITH
FRAME
TITLE
text
-
001
.
"'Hola'(001).
PARAMETERS
:
pa_tabla
TYPE
tabname
MATCHCODE
OBJECT dd_tabl OBLIGATORY
,
pa_cant
TYPE
i
OBLIGATORY
DEFAULT
1000
.
SELECTION-SCREEN
BEGIN
OF
BLOCK
a2
WITH
FRAME
TITLE
text
-
002
.
PARAMETERS
:
pa_tipo1
RADIOBUTTON
GROUP
r1
DEFAULT
'X'
,
pa_tipo2
RADIOBUTTON
GROUP
r1
.
SELECTION-SCREEN
END
OF
BLOCK
a2
.
SELECTION-SCREEN
END
OF
BLOCK
a1
.
** Variables referenciadas o campos simbólicos para cargar los datos
FIELD-SYMBOLS
:
<fs_campo>
TYPE
ANY
,
<fs_wa>
TYPE
ANY
,
<fs_it>
TYPE
ANY
TABLE
.
DATA
:
ref_wa
TYPE
REF
TO
data
,
ref_it
TYPE
REF
TO
data
.
YFORMAS_DAR_SALITA_IT_E01
*&---------------------------------------------------------------------*
*& Include YFORMAS_DAR_SALITA_IT_E01
*&---------------------------------------------------------------------*
** Se crea el objeto de datos tabla interna con referencia a la tabla
TRY
.
CREATE
DATA
ref_it
TYPE
STANDARD
TABLE
OF
(
pa_tabla
)
.
CATCH
cx_sy_create_data_error
.
DATA
:
cant
TYPE
i
.
cant
=
STRLEN
(
pa_tabla
)
.
WRITE
:
'La tabla '
,
pa_tabla
(
cant
)
,
' no existe en el diccionario de datos'
.
EXIT
.
ENDTRY
.
** Se asigna la desreferencia del objeto de datos tabla innterna al field symbol
ASSIGN
ref_it
->
*
TO
<fs_it>
.
SELECT
*
FROM
(
pa_tabla
)
INTO
TABLE
<fs_it>
UP
TO
pa_cant
ROWS
.
** Se crea el objeto de datos estructura con referencia a la tabla
CREATE
DATA
ref_wa
TYPE
(
pa_tabla
)
.
** Se asigna la desreferencia del objeto de datos estructura al field symbol
ASSIGN
ref_wa
->
*
TO
<fs_wa>
.
START-OF-SELECTION
.
IF
pa_tipo1
=
'X'
.
WRITE
:
/
'Loop con sentencia write'
.
ULINE
.
NEW-LINE
.
LOOP
AT
<fs_it>
INTO
<fs_wa>
.
DO
.
ASSIGN
COMPONENT
sy
-
index
OF
STRUCTURE
<fs_wa>
TO
<fs_campo>
.
IF
sy
-
subrc <>
0
.
NEW-LINE
.
EXIT
.
ENDIF
.
WRITE
<fs_campo>
.
ENDDO
.
ENDLOOP
.
ELSEIF
pa_tipo2
=
'X'
.
DATA
alv
TYPE
REF
TO
cl_salv_table
.
cl_salv_table
=>
factory
(
IMPORTING
r_salv_table
=
alv
CHANGING
t_table
=
<fs_it>
)
.
alv
->
display
(
)
.
ENDIF
.
*&---------------------------------------------------------------------*
*& Include YFORMAS_DAR_SALITA_IT_TOP Report YFORMAS_DAR_SALIDA_IT
*&
*&---------------------------------------------------------------------*
REPORT
yformas_dar_salida_it
.
SELECTION-SCREEN
BEGIN
OF
BLOCK
a1
WITH
FRAME
TITLE
text
-
001
.
"'Hola'(001).
PARAMETERS
:
pa_tabla
TYPE
tabname
MATCHCODE
OBJECT dd_tabl OBLIGATORY
,
pa_cant
TYPE
i
OBLIGATORY
DEFAULT
1000
.
SELECTION-SCREEN
BEGIN
OF
BLOCK
a2
WITH
FRAME
TITLE
text
-
002
.
PARAMETERS
:
pa_tipo1
RADIOBUTTON
GROUP
r1
DEFAULT
'X'
,
pa_tipo2
RADIOBUTTON
GROUP
r1
.
SELECTION-SCREEN
END
OF
BLOCK
a2
.
SELECTION-SCREEN
END
OF
BLOCK
a1
.
** Variables referenciadas o campos simbólicos para cargar los datos
FIELD-SYMBOLS
:
<fs_campo>
TYPE
ANY
,
<fs_wa>
TYPE
ANY
,
<fs_it>
TYPE
ANY
TABLE
.
DATA
:
ref_wa
TYPE
REF
TO
data
,
ref_it
TYPE
REF
TO
data
.
*&---------------------------------------------------------------------*
*& Include YFORMAS_DAR_SALITA_IT_E01
*&---------------------------------------------------------------------*
** Se crea el objeto de datos tabla interna con referencia a la tabla
TRY
.
CREATE
DATA
ref_it
TYPE
STANDARD
TABLE
OF
(
pa_tabla
)
.
CATCH
cx_sy_create_data_error
.
DATA
:
cant
TYPE
i
.
cant
=
STRLEN
(
pa_tabla
)
.
WRITE
:
'La tabla '
,
pa_tabla
(
cant
)
,
' no existe en el diccionario de datos'
.
EXIT
.
ENDTRY
.
** Se asigna la desreferencia del objeto de datos tabla innterna al field symbol
ASSIGN
ref_it
->
*
TO
<fs_it>
.
SELECT
*
FROM
(
pa_tabla
)
INTO
TABLE
<fs_it>
UP
TO
pa_cant
ROWS
.
** Se crea el objeto de datos estructura con referencia a la tabla
CREATE
DATA
ref_wa
TYPE
(
pa_tabla
)
.
** Se asigna la desreferencia del objeto de datos estructura al field symbol
ASSIGN
ref_wa
->
*
TO
<fs_wa>
.
START-OF-SELECTION
.
IF
pa_tipo1
=
'X'
.
WRITE
:
/
'Loop con sentencia write'
.
ULINE
.
NEW-LINE
.
LOOP
AT
<fs_it>
INTO
<fs_wa>
.
DO
.
ASSIGN
COMPONENT
sy
-
index
OF
STRUCTURE
<fs_wa>
TO
<fs_campo>
.
IF
sy
-
subrc <>
0
.
NEW-LINE
.
EXIT
.
ENDIF
.
WRITE
<fs_campo>
.
ENDDO
.
ENDLOOP
.
ELSEIF
pa_tipo2
=
'X'
.
DATA
alv
TYPE
REF
TO
cl_salv_table
.
cl_salv_table
=>
factory
(
IMPORTING
r_salv_table
=
alv
CHANGING
t_table
=
<fs_it>
)
.
alv
->
display
(
)
.
ENDIF
.
Referencias
1. Help SAP. Field Symbols2. Help SAP. Referencias de Datos
3. Help SAP. CREATE DATA
No hay comentarios:
Publicar un comentario