• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
SAP ABAP

Explorando el poder de la selección dinámica, la pantalla dinámica y los símbolos de campo dinámico (ASIGNAR COMPONENTE) en SAP ABAP.

By s4pcademy 


Descripción general

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.

Conclusión

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.




¿Cómo manejo los errores de "moneda inconsistente" en las acumulaciones de órdenes de compra?
Previo
Charla de laboratorio Ep. 3 – Habilitando una economía circular con Joanna Maryewska
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.

x