Cargando los tipos de datos estructurados
Transcript of Cargando los tipos de datos estructurados
Video filmado con GeneXus X Evolution 2
Pag
e1
Cargando los tipos de datos estructurados
En más de una oportunidad, necesitamos almacenar en memoria una lista de elementos que tienen el mismo tipo de información pero distintos valores guardados. Por ejemplo, la agencia de viajes puede necesitar realizar operaciones con un grupo de clientes que cumplan cierto requisito,
o nos pueden solicitar procesar información de algunos datos específicos de un conjunto de atracciones turísticas
Video filmado con GeneXus X Evolution 2
Pag
e2
y eso nos puede implicar tener que cargar estas listas temporalmente en memoria. Para resolver este tipo de requisito, es necesario crear una estructura en memoria capaz de almacenar una colección de elementos.
Ya hemos visto que los tipos de datos estructurados nos permiten definir estructuras que almacenan varios datos correspondientes a un elemento
Video filmado con GeneXus X Evolution 2
Pag
e3
por ejemplo cuando almacenamos el identificador, el nombre y la dirección de un cliente
Para almacenar varios elementos con datos de clientes,
Video filmado con GeneXus X Evolution 2
Pag
e4
vimos que es necesario definir un tipo de datos estructurado
y marcar que se trata de una colección
Video filmado con GeneXus X Evolution 2
Pag
e5
Vamos a hacerlo en GeneXus…
Seleccionamos al tipo de datos estructurado SDTCustomer que habíamos creado, presionamos el botón derecho de mouse, elegimos “Save as…”
Video filmado con GeneXus X Evolution 2
Pag
e6
y le damos el nombre SDTCustomers
Ahora, hacemos clic en el checkbox “Is Collection”:
Video filmado con GeneXus X Evolution 2
Pag
e7
Si comparamos la estructura del SDTCustomer y el SDTCustomers
vemos que este último
Video filmado con GeneXus X Evolution 2
Pag
e8
tiene los mismos miembros que el anterior, pero agrupados en una subestructura denominada SDTCustomersItem
Esta subestructura se creó automáticamente cuando marcamos que se trata de una colección
Video filmado con GeneXus X Evolution 2
Pag
e9
Cada ítem almacenará los datos de un cliente
y la colección, al conjunto de clientes
Video filmado con GeneXus X Evolution 2
Pag
e10
Para cargar los datos de la colección vamos a utilizar un objeto Data Provider
Este objeto nos permite cargar una estructura de datos
Video filmado con GeneXus X Evolution 2
Pag
e11
(por ejemplo a partir de datos de la base de datos)
y nos devuelve dicha estructura ya cargada
Video filmado con GeneXus X Evolution 2
Pag
e12
Vamos a crear un objeto Data Provider en GeneXus.
Presionamos Ctrl N, elegimos el tipo Data Provider y le ponemos al objeto el nombre: DataProviderCustomers
Video filmado con GeneXus X Evolution 2
Pag
e13
Vemos que GeneXus nos posiciona en la sección Source del Data Provider
Aquí es donde vamos a declarar cómo queremos que se carguen los datos en la colección que queremos devolver. Observemos qué fácil resulta declarar la carga: Vamos a la ventana del Knowledge Base Navigator, ubicamos al tipo de datos estructurado SDTCustomers y lo arrastramos hacia el Source del Data Provider
Video filmado con GeneXus X Evolution 2
Pag
e14
Vemos que GeneXus escribió automáticamente varias líneas de texto.
Si abrimos las propiedades del DataProvider,
Observamos que GeneXus asignó el nombre de la colección SDTCustomers a la propiedad Output
Video filmado con GeneXus X Evolution 2
Pag
e15
Esto significa que el DataProvider devolverá una colección del tipo de datos estructurado SDTCustomers, cargada con datos. Como el SDTCustomers ya es una colección, no es necesario configurar la propiedad Collection con valor True
Esto lo haríamos si quisiéramos que el DataProvider nos devuelva una colección a partir de un tipo de datos estructurado simple. Estudiemos ahora qué fue lo que escribió GeneXus en el source…
Video filmado con GeneXus X Evolution 2
Pag
e16
Reconocemos el nombre del tipo de datos estructurado SDTCustomers que es una colección
y después entre llaves está la subestructura del ítem de la colección
Comparemos esto con la estructura del SDT:
Video filmado con GeneXus X Evolution 2
Pag
e17
Vemos que GeneXus representó en forma de texto la estructura del SDTCustomers
y nos dejó prontos los miembros Id, Name y Address
del ítem SDTCustomersItem, para cargarles un valor.
Video filmado con GeneXus X Evolution 2
Pag
e18
Como vamos a cargar esta colección a partir del contenido de la tabla CUSTOMER, le asignamos al miembro Id el valor del atributo CustomerId
al miembro Name el valor del atributo CustomerName
y al miembro Address el valor del atributo CustomerAddress.
Observemos que en ningún lado estamos indicando a GeneXus cómo queremos que se carguen estos valores, es decir que se debería navegar la tabla CUSTOMER y que para cada cliente encontrado, deberían copiarse sus datos a un ítem de la colección. Lo que estamos haciendo es simplemente declarando con qué valores queremos que GeneXus cargue la colección de clientes, a partir de los valores de los atributos definidos en la transacción de clientes.
Video filmado con GeneXus X Evolution 2
Pag
e19
A partir de esta declaración, al encontrar atributos del lado derecho de las asignaciones
GeneXus trata de encontrar la tabla base que contiene a estos atributos, de forma similar a como se determinó la tabla base de un For Each. En este caso la tabla base es claramente: CUSTOMER
Como estamos asignando valores a un ítem de una estructura del tipo colección, GeneXus recorre la tabla CUSTOMER y para cada cliente encontrado, copia los datos almacenados en los atributos CustomerId, CustomerName y CustomerAddress
Video filmado con GeneXus X Evolution 2
Pag
e20
hacia los miembros Id, Name y Address de un nuevo ítem de la colección
El resultado final es que habrán quedado almacenados en la colección, los datos de todos los clientes de la base de datos. Vamos a crear ahora un objetoWeb Panel para visualizar el contenido de la colección de clientes. Un web panel es un objeto muy versátil que nos permite entre otras cosas, desplegar información, ingresar datos o construir una pantalla de inicio de nuestra aplicación. Presionamos Ctrl N, seleccionamos el tipo de objeto web panel y le ponemos de nombre WebPanelViewCustomers.
Ahora vamos a la sección de variables del web panel y definimos una variable &Customers del tipo SDTCustomers…
Video filmado con GeneXus X Evolution 2
Pag
e21
Vamos a la sección Web Form y desde la ToolBox arrastramos un control de atributo o variable
y elegimos a la variable Customers
Por tratarse de una variable de tipo SDT colección, GeneXus nos abre un cuadro de diálogo para seleccionar qué
Video filmado con GeneXus X Evolution 2
Pag
e22
miembros del SDTCustomers queremos ver. Están todos seleccionados y como los queremos ver a todos, presionamos OK.
Observamos que GeneXus creó en el Web Form una serie de controles
para visualizar los distintos elementos de la variable &Customers. Ahora vamos a la sección Events del web panel
Video filmado con GeneXus X Evolution 2
Pag
e23
… y en el combo box de arriba a la derecha se nos ofrecen varios nombres de eventos y elegimos Start
Al seleccionarlo, GeneXus escribe los comandos de inicio y fin del evento Start
Video filmado con GeneXus X Evolution 2
Pag
e24
Vamos a codificar el evento start. Escribimos & y elegimos a la variable Customers.
Ahora vamos a cargar esta variable del tipo colección, usando el DataProvider que creamos antes. Para eso escribimos el signo de igual y luego vamos a la ventana Knowledge Base Navigator, ubicamos al DataProvider Customers y lo arrastramos hasta la derecha del signo de igual.
Completamos la instrucción agregando 2 paréntesis:
Con esta instrucción que hemos escrito, estamos invocando al DataProviderCustomers, y éste retornará una colección de clientes, que quedará cargada en la variable &Customers. Recordemos que la variable &Customers es del tipo SDTCustomers
Video filmado con GeneXus X Evolution 2
Pag
e25
Y en el Data Provider
se carga y devuelve una colección de dicho tipo desde el momento que arrastramos SDTCustomers a su Source. Ahora bien, dado que ya hemos definido en el evento start del web panel que se cargue la variable &customers invocando al Data Provider que definimos
Video filmado con GeneXus X Evolution 2
Pag
e26
… y como ya incluimos a la variable &Customers en el Form
está todo listo para que presionemos F5 y podamos ver los datos cargados en la colección.
Video filmado con GeneXus X Evolution 2
Pag
e27
Vemos que GeneXus agregó un link correspondiente al Web Panel View Customers
Hacemos click en el link …
Video filmado con GeneXus X Evolution 2
Pag
e28
Y vemos desplegados en pantalla a todos los clientes que estaban almacenados en la base de datos. Estos datos fueron extraídos de la base de datos por el Data Provider, cargados en memoria temporal en una variable de tipo SDT colección y su contenido fue desplegado en el form del web panel. En lugar de simplemente desplegar los datos, al estar disponibles en memoria, podríamos haber realizado algún proceso u operaciones sobre los mismos sin necesidad de tener que acceder nuevamente a la base de datos para obtenerlos. Hemos visto la flexibilidad y potencia de los Data Providers para cargar datos en una estructura de datos, en particular una del tipo colección y lo sencillo que fue declarar qué queríamos cargar, resolviendo GeneXus todo lo necesario para llevarlo a cabo. Más adelante veremos otros ejemplos de uso de los Data Providers.