En el artículo anterior sobre los nodos de contexto de WD4A, comentábamos las propiedades del contexto, pero no mencionamos nada de la función supply. Este artículo explicamos que es y para que se puede utilizar.

La función Supply es un mecanismo para repoblar nodos hijos. Una función Supply puede ser asignada a cada nodo del contexto de un controlador. Esta función se llama automáticamente cuando se intenta leer los datos de un nodo de contexto inválido.

Esta invalidez ocurre cuando:

  • Una colección de un nodo es inicial. Todavía no se han cargado datos en el nodo.
  • La colección del nodo es invalidada por código (método invalidate).
  • El Lead Selection en la colección del nodo padre cambia. Esto solo ocurre para nodos hijos con la propiedad singleton marcada.

Para introducir una función de este tipo, le indicamos el nombre que le queramos dar en la opción Supply Function del nodo. Después, por forward navigation (doble clic sobre el nombre de la función), se crea un método en el controlador en que nos encontremos, donde se crea el código para introducir los datos en el contexto automáticamente. En esta función únicamente se debe crear la lectura de datos de base de datos.

El método creado en el controlador tendrá dos parámetros import. Un elemento de contexto, que corresponde al elemento padre del nodo, y un nodo de contexto, que es el propio nodo.

WD4A, Función supply

También en este método aparece una serie de código abap comentado. Este código nos ayuda a rellenar el nodo con los datos que queramos. Por lo tanto lo más fácil será descomentar las líneas de código que aparecen. Para explicarlo mejor utilizaremos el siguiente contexto de ejemplo, donde existe un nodo hijo con las reservas de un vuelo.

WD4A, nodos de contexto

Primero aparecen unas líneas de código por si queremos coger los elementos del padre. Por ejemplo, para coger el id de Vuelo y la conexión para saber las reservas:

*  if necessary, get static attributes of parent element
DATA ls_parent_attributes TYPE wd_this->element_vuelos.
parent_element->get_static_attributes(
IMPORTING
static_attributes = ls_parent_attributes ).

Luego se accede a la base de datos o lo que se requiera para cargar el nodo, en el ejemplo, recogemos todas las reservas del vuelo:

* data declaration
DATA lt_sbook TYPE wd_this->elements_sbook.
DATA ls_sbook LIKE LINE OF lt_sbook.
* @TODO compute values
* e.g. call a data providing FuBa

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_sbook FROM sbook
WHERE carrid = ls_parent_attributes-carrid
AND connid = ls_parent_attributes-connid
AND fldate = ls_parent_attributes-fldate.

Y por último cargamos el nodo con los datos recogidos.

* bind all the elements
node->bind_table(
new_items            =  lt_sbook
set_initial_elements = abap_true ).

Así, en nuestra aplicación WD4A, mediante la función supply nos podremos asegurar de que siempre que se intente accede a la información del nodo, este tenga los datos correspondientes y así evitemos errores en tiempo de ejecución.