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, Page 1 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 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. Page 2 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 por ejemplo cuando almacenamos el identificador, el nombre y la dirección de un cliente Page 3 Para almacenar varios elementos con datos de clientes, Video filmado con GeneXus X Evolution 2 vimos que es necesario definir un tipo de datos estructurado Page 4 y marcar que se trata de una colección Video filmado con GeneXus X Evolution 2 Vamos a hacerlo en GeneXus… Page 5 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 y le damos el nombre SDTCustomers Page 6 Ahora, hacemos clic en el checkbox “Is Collection”: Video filmado con GeneXus X Evolution 2 Si comparamos la estructura del SDTCustomer y el SDTCustomers Page 7 vemos que este último Video filmado con GeneXus X Evolution 2 tiene los mismos miembros que el anterior, pero agrupados en una subestructura denominada SDTCustomersItem Page 8 Esta subestructura se creó automáticamente cuando marcamos que se trata de una colección Video filmado con GeneXus X Evolution 2 Cada ítem almacenará los datos de un cliente Page 9 y la colección, al conjunto de clientes Video filmado con GeneXus X Evolution 2 Para cargar los datos de la colección vamos a utilizar un objeto Data Provider Page 10 Este objeto nos permite cargar una estructura de datos Video filmado con GeneXus X Evolution 2 (por ejemplo a partir de datos de la base de datos) Page 11 y nos devuelve dicha estructura ya cargada Video filmado con GeneXus X Evolution 2 Vamos a crear un objeto Data Provider en GeneXus. Page 12 Presionamos Ctrl N, elegimos el tipo Data Provider y le ponemos al objeto el nombre: DataProviderCustomers Video filmado con GeneXus X Evolution 2 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: Page 13 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 Vemos que GeneXus escribió automáticamente varias líneas de texto. Page Observamos que GeneXus asignó el nombre de la colección SDTCustomers a la propiedad Output 14 Si abrimos las propiedades del DataProvider, Video filmado con GeneXus X Evolution 2 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. Page 15 Estudiemos ahora qué fue lo que escribió GeneXus en el source… Video filmado con GeneXus X Evolution 2 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 Page 16 Comparemos esto con la estructura del SDT: Video filmado con GeneXus X Evolution 2 Vemos que GeneXus representó en forma de texto la estructura del SDTCustomers 17 y nos dejó prontos los miembros Id, Name y Address Page del ítem SDTCustomersItem, para cargarles un valor. Video filmado con GeneXus X Evolution 2 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 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 Page 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. 18 y al miembro Address el valor del atributo CustomerAddress. 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 Page 19 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 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. Page 20 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 Vamos a la sección Web Form y desde la ToolBox arrastramos un control de atributo o variable 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 Page 21 y elegimos a la variable Customers 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. Page 22 Ahora vamos a la sección Events del web panel Video filmado con GeneXus X Evolution 2 … y en el combo box de arriba a la derecha se nos ofrecen varios nombres de eventos y elegimos Start Page 23 Al seleccionarlo, GeneXus escribe los comandos de inicio y fin del evento Start Video filmado con GeneXus X Evolution 2 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. Page 24 Recordemos que la variable &Customers es del tipo SDTCustomers Video filmado con GeneXus X Evolution 2 Y en el Data Provider se carga y devuelve una colección de dicho tipo desde el momento que arrastramos SDTCustomers a su Source. Page 25 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 está todo listo para que presionemos F5 y podamos ver los datos cargados en la colección. Video filmado con GeneXus X Evolution 2 Page 26 … y como ya incluimos a la variable &Customers en el Form Vemos que GeneXus agregó un link correspondiente al Web Panel View Customers Page 27 Hacemos click en el link … Video filmado con GeneXus X Evolution 2 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. Page 28 Más adelante veremos otros ejemplos de uso de los Data Providers. Video filmado con GeneXus X Evolution 2