WD4A: Modificaciones dinámicas del contexto

Al igual que comentamos en el artículo Web Dynpro Abap Layout: Modificaciones dinámicas,   en WD4A, existen las modificaciones dinámicas del contexto y por tanto, puede modificar cualquier elemento UI mediante código, lo mismo ocurre con el contexto de un controlador. A continuación se describe como poder tratar el contexto en tiempo de ejecución.

Es preferible crear todo el contenido del contexto posible en tiempo de diseño, sin embargo, pueden darse situaciones en las que se deba modificar en tiempo de ejecución:

  • Si la estructura de los datos no es conocida en tiempo de diseño.
  • Si el comportamiento de la pantalla va ser genérica.
  • Si los componentes de utilización tiene que ser desarrollados, de una manera genérica.

En WD4A, la definición de cada nodo se guarda en sus metadatos, y para acceder a ellos deberemos instanciar un objeto con referencia al tipo if_wd_context_node_info. En esta interfaz están definidos los métodos para poder crear, modificar o eliminar cualquier elemento del contexto, ya sean nodos o atributos.

Para empezar a modificar los elementos existentes o crear uno nuevo, lo primero es recoger los metadatos del nodo raíz. Este nodo, llamado “CONTEXT” existe en todos los contextos de todos los controladores y se recoge de la siguiente manera.

DATA: lr_root_info TYPE REF TO if_wd_context_node_info.
lr_root_info = wd_context->get_node_info( ).

Una vez que se tiene la referencia a los metadatos, se pueden usar diferentes métodos para ir creando nodos o atributos de contexto. Para crear un nodo se utiliza el método add_new_child_node, con dos diferentes opciones para crearlo:

Crear un nodo sin estructura definida

Crear un nodo vacío, al que luego habrá que ir añadiendo los atributos que se deseen, como por ejemplo:

DATA lr_node_info TYPE REF TO if_wd_context_node_info.
*se crea un nodo vacío, sin atributos
CALL METHOD lr_root_info->add_new_child_node
EXPORTING
name                         = 'NODO_PRUEBA'
is_multiple                  = abap_false
is_mandatory                 = abap_true
is_mandatory_selection       = abap_false
is_multiple_selection        = abap_false
is_singleton                 = abap_true
is_initialize_lead_selection = abap_true
RECEIVING
child_node_info              = lr_node_info.

Con esta llamada se crearía un nuevo nodo con el nombre “NODO_PRUEBA” colgando del nodo raíz. Este nodo sería un nodo de cardinalidad 1…1, de selección 0…1, con las propiedades Lead Selection y Singleton seleccionadas.

Una vez creado el nodo, deberemos ir añadiendo los atributos que se requieran. Esto lo haremos con el método add_attribute. Primero definimos las propiedades del atributo en una estructura del tipo wdr_context_attribute_info, y luego lo añadimos al nodo. Por ejemplo añadimos un atributo de nombre “ATRIBUTO_PRUEBA”, de tipo “STRING” y sin ayuda de búsqueda:

DATA: ls_attribute TYPE wdr_context_attribute_info.
*Se define un atributo
ls_attribute-name   = 'ATRIBUTO_PRUEBA'.
ls_attribute-type_name    = 'STRING'.
ls_attribute-value_help_mode  = '0'.
CALL METHOD lr_flights_info->add_attribute
EXPORTING
attribute_info = ls_attribute.

Esta acción se debe repetir por cada atributo que se necesite.

Crear nodo con estructura definida

Una manera más rápida y sencilla de crear atributos es definiendo el nodo con una estructura ya existente en el diccionario. Con esta opción todos los atributos del nodo se crearán automáticamente con el tipo que tengan definidos en la estructura del diccionario. Esto se realiza utilizando también el método add_ner_child_node, pero pasando como parámetro la estructura.

DATA:  lr_root_info TYPE REF TO if_wd_context_node_info,
lr_flights_info TYPE REF TO if_wd_context_node_info.
*cogemos los metadatos del nodo raíz del contexto
lr_root_info = wd_context->get_node_info( ).
*creamos un nuevo nodo con una estructura ya definida en el diccionario de datos
CALL METHOD lr_root_info->add_new_child_node
EXPORTING
name                         = 'VUELOS'
static_element_type          = 'SFLIGHT'
is_multiple                  = abap_true
is_mandatory                 = abap_true
is_mandatory_selection       = abap_false
is_multiple_selection        = abap_true
is_initialize_lead_selection = abap_true
RECEIVING
child_node_info = lr_flights_info.

Al ejecutarse el método superior, se crearía en el contexto un nodo “VUELOS” del tipo de la tabla de diccionario “SFLIGHT”, con cardinalidad 1…n, selección 0…n y con el Lead Selection seleccionado por defecto.

Así es como se gestionan las modificaciones dinámicas de contexto en WD4A.

Esta entrada fue publicada en Web Dynpro for Abap. Guarda el enlace permanente.
Si te ha gustado...Compártelo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *