Muchos desarrolladores suelen pasar por alto las selecciones dinámicas y los símbolos de campos dinámicos en SAP ABAP, a pesar de que tienen el potencial de simplificar las tareas y agilizar el desarrollo.
Esta publicación de blog profundizará en los beneficios de usar la selección dinámica, la pantalla dinámica y los símbolos de campo en SAP ABAP. Proporcionaremos a los desarrolladores una guía completa que cubre todo, desde los conceptos básicos hasta las técnicas más avanzadas, lo que les permitirá utilizar completamente estas poderosas herramientas. Con esta guía, podrá desbloquear todo el potencial de la selección dinámica y los símbolos de campo en sus proyectos de desarrollo.
La selección dinámica es una característica poderosa en ABAP que permite a los desarrolladores crear flexible y consultas adaptables para recuperar datos de tablas. Esta característica permite a los desarrolladores construir consultas dinámicamente en tiempo de ejecución, en función de las entradas de los usuarios u otros criterios, en lugar de depender de consultas fijas y predefinidas. Al aprovechar la selección dinámica, los desarrolladores pueden crear código más eficiente y flexible, lo que reduce la necesidad de codificación personalizada y mejora el rendimiento general del sistema.
Entonces, en el siguiente ejemplo, usaremos la selección dinámica para recuperar datos de una tabla con condiciones en la pantalla de selección.
Parámetros de la pantalla de selección:
PARAMETERS: p_tabnam TYPE tabname, ”Table name
p_selfl1 TYPE edpline, ” fields to select
p_where1 TYPE edpline. ” Condition
Declaración y cesión de datos:
DATA: lt_where TYPE TABLE OF edpline,
lt_sel_list TYPE TABLE OF edpline,
ls_where TYPE edpline,
dref TYPE REF TO data,
itab_type TYPE REF TO cl_abap_tabledescr,
struct_type TYPE REF TO cl_abap_structdescr,
comp_tab TYPE cl_abap_structdescr=>component_table.
TYPES: f_count TYPE i.
FIELD-SYMBOLS : <lt_outtab> TYPE ANY TABLE,
<l_fld> TYPE any.
struct_type ?= cl_abap_typedescr=>describe_by_name( p_tabnam ).
comp_tab = struct_type->get_components( ).
struct_type = cl_abap_structdescr=>create( comp_tab ).
itab_type = cl_abap_tabledescr=>create( struct_type ).
“creation of the data for the selection
CREATE DATA dref TYPE HANDLE itab_type.
ASSIGN dref->* TO <lt_outtab>.
APPEND p_selfl1 TO lt_sel_list.
ls_where = p_where1 .
APPEND ls_where TO lt_where.
Y ahora procedemos con nuestra selección dinámica.
“dynamique selection .
SELECT (lt_sel_list)
FROM (p_tabnam)
INTO CORRESPONDING FIELDS OF TABLE <lt_outtab>
WHERE (lt_where).
En resumen, este programa toma como parámetros el nombre de la tabla, la condición y los campos que queremos recuperar, y luego utiliza dinámicamente estos campos en la selección para recuperar los datos.
El programa está destinado a ilustrar que podemos generar dinámicamente cualquier parte de la declaración de selección de acuerdo con las necesidades del cliente.
Debe usar este programa como referencia y usarlo de acuerdo a sus necesidades. A veces, solo las condiciones serán dinámicas y, a veces, solo los campos serán dinámicos.
Para implementar correctamente las pantallas dinámicas, se debe pensar detenidamente en la solución antes de desarrollarla y, especialmente, utilizar los módulos de funciones estándar de SAP.
«SELECCIONES_GRATIS_INIT» se utiliza para inicializar una pantalla de selección dinámica para un informe o programa.
Cuando se llama, este módulo de funciones inicializa la pantalla de selección dinámica y le asigna los campos de criterios de selección relevantes. También establece valores predeterminados para los campos de selección y los completa con los datos que ya están disponibles.
CALL FUNCTION 'FREE_SELECTIONS_INIT'
EXPORTING
kind = 'T'
IMPORTING
selection_id = selid
TABLES
tables_tab = table_tab “the name of the table in sec_tab.
EXCEPTIONS
OTHERS = 4.
‘FREE_SELECTIONS_DIALOG’ muestra un cuadro de diálogo que permite al usuario introducir criterios de selección para un informe. El usuario puede especificar qué datos deben incluirse en el informe en función de ciertas condiciones que establezca.
Una vez que el usuario ha introducido los criterios de selección, el módulo de funciones devuelve los valores de selección.
‘FREE_SELECTIONS_DIALOG’ proporciona una manera conveniente para que los usuarios especifiquen criterios de selección complejos para los informes sin tener que recordar la sintaxis exacta del idioma de los criterios de selección.
CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
EXPORTING
selection_id = selid
title="Free Selection"
as_window = ' '
IMPORTING
where_clauses = cond_tab
TABLES
fields_tab = field_tab
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'No free selection created' TYPE 'I'.
LEAVE PROGRAM.
ENDIF.
Después de este punto, podemos usar la selección dinámica:
ASSIGN cond_tab[ tablename = checked_dbtab ] TO <cond>.
IF sy-subrc <> 0.
MESSAGE 'Error in condition' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
CREATE DATA dref TYPE TABLE OF (checked_dbtab).
ASSIGN dref->* TO <table>.
TRY.
SELECT *
FROM (checked_dbtab)
WHERE (<cond>-where_tab)
INTO TABLE @<table>.
CATCH cx_sy_dynamic_osql_error.
MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(alv)
CHANGING t_table = <table> ).
alv->display( ).
CATCH cx_salv_msg.
MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
Símbolos de campo dinámico con el ASIGNAR COMPONENTE La declaración es una característica valiosa en SAP ABAP que permite a los desarrolladores hacer referencia y manipular datos dinámicamente. Esta característica permite a los desarrolladores acceder y manipular datos almacenados en tablas internas, estructuras y objetos en tiempo de ejecución. Mediante el uso de símbolos de campo dinámicos, los desarrolladores pueden crear un código más flexible y adaptable que pueda manejar escenarios de datos cambiantes, lo que lleva a un desarrollo más eficiente y optimizado.
En este ejemplo tenemos lo siguiente 3 campos en el MARA mesa:
FSH_MG_AT1 | FSH_MG_AT2 | FSH_MG_AT3 |
Valor 101 | Valor 201 | Valor 301 |
Y usaremos ASSIGN COMPONENT para hacer esto dinámicamente:
Por favor revise los comentarios en el código
" Table for our data .
DATA gt_table TYPE STANDARD TABLE OF mara.
DATA wa_table TYPE mara.
"the Value that we will increment .
DATA increment TYPE c.
"Field SYMBOLS that we will use dynamically .
FIELD-SYMBOLS : <final_value> TYPE any,
<wa_final> TYPE mara.
"We select the 10th row of the table Mara .
SELECT * FROM mara INTO TABLE gt_table UP TO 10 ROWS.
"We want to retrieve the 3 fields( FSH_MG_AT1 FSH_MG_AT2 FSH_MG_AT3 )
LOOP AT gt_table INTO wa_table.
"For the first field, we increment the value by 1 .
increment = 1 .
"To dynamically create the field, we will use a while/endwhile .
WHILE ( increment < 3 ) .
"At each iteration, we will have FSH_MG_AT1 / FSH_MG_AT2 / FSH_MG_AT3
CONCATENATE 'FSH_MG_AT' increment INTO DATA(lv_field) .
" We use Assign Component to get the value dynamically.
ASSIGN COMPONENT lv_field OF STRUCTURE wa_table TO <final_value>.
"<final_value> is our dynamic field name's value that we can use in our code.
" if increment = 1 we will have value 101
" if increment = 2 we will have value 201
" if increment = 3 we will have value 301
increment = increment + 1.
ENDWHILE .
"the second ligne .
ENDLOOP .
En este código, como habrás visto, generamos el nombre del campo a recuperar y usamos ‘ASIGNAR COMPONENTE‘ para recuperar su valor .
Agrego a todas estas partes esto FM que es ampliamente utilizado para desarrollar dinámicamente.
DDIF_TABL_GET se utiliza para recuperar información de metadatos sobre una tabla de base de datos. El módulo de funciones toma el nombre de la tabla de la base de datos como entrada y devuelve una estructura de datos que contiene varios atributos de la tabla, como los campos de la tabla, tipos de datos, longitudes de campo y campos clave.
Se usa comúnmente en el desarrollo de ABAP cuando existe la necesidad de recuperar información de metadatos sobre una tabla de base de datos dinámicamente en tiempo de ejecución. Los metadatos recuperados se pueden usar de varias maneras, como generar informes, realizar validaciones de datos y mejorar la funcionalidad de la aplicación.
PARAMETERS p_table TYPE DDOBJNAME DEFAULT 'SPFLI'.
data : lt_DD03P type STANDARD TABLE OF DD03P.
data : ls_DD03P type DD03P.
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = p_table
TABLES
dd03p_tab = lt_dd03p.
Todas las partes desarrolladas dinámicamente que hemos visto pueden permitirnos desarrollar nuestra aplicación de manera fácil, rápida y flexible. Al construir estas partes dinámicamente, podemos hacer cambios y actualizaciones sin tener que pasar por un largo proceso de desarrollo cada vez. Esta flexibilidad nos permite adaptarnos a los requisitos comerciales cambiantes y realizar actualizaciones en nuestra aplicación de una manera más ágil. Además, al desarrollar dinámicamente, podemos reducir la cantidad de codificación repetitiva y agilizar nuestro proceso de desarrollo, lo que en última instancia conduce a una mayor eficiencia y productividad en nuestro trabajo.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073