Post on 08-Oct-2015
description
transcript
Video filmado con GeneXus X Evolution 2
Pag
e1
Comando for each anidado para listar info agrupada
Volvamos ahora a la seccin Source del procedimiento
Una cosa que nos haba quedado pendiente es que queramos que las atracciones salgan ordenadas
en forma alfabtica, por nombre de atraccin.
Y esto lo logramos simplemente escribiendo al lado del comando For Each, la clusula order
AttractionName :
Vamos a ejecutar el procedimiento para verlo
Presionamos el botn derecho del mouse, seleccionamos Run With this Only
Video filmado con GeneXus X Evolution 2
Pag
e2
Y vemos que las atracciones tursticas son listadas ordenadas alfabticamente por nombre.
Video filmado con GeneXus X Evolution 2
Pag
e3
Ahora vamos a observar algo interesante. El For each navega una tabla fsica determinada
que en este caso es ATTRACTION y habamos ordenado sus datos usando el atributo AttractionName
que tambin est en la tabla ATTRACTION.
Pero GeneXus nos permite ordenar por el valor de un atributo que no est en la tabla ATTRACTION,
sino en su tabla extendida.
Cambiemos el atributo que sucede al order, por CountryName
Video filmado con GeneXus X Evolution 2
Pag
e4
Este atributo no se encuentra fsicamente en la tabla base del For each,
pero se encuentra en la tabla extendida de la tabla base
y por lo tanto podemos ordenar por l.
Vamos a ejecutar el procedimiento para ver el resultado
Video filmado con GeneXus X Evolution 2
Pag
e5
Vemos que salen listadas las atracciones ordenadas alfabticamente por nombre de pas!
Ahora bien, qu pasara si en la agencia de viajes nos piden que listemos solamente las atracciones
tursticas de Francia? Volvamos a GeneXus para resolverlo.
Video filmado con GeneXus X Evolution 2
Pag
e6
Solamente agregaremos al comando For Each, una clasula llamada Where, para que filtre y muestre
nicamente los datos que cumplan con la condicin deseada.
Nos posicionamos en el rengln siguiente al For Each y escribimos
WhereCountryId=2
ya que sabemos que el Id de Francia era el 2
Tambin podramos haber puesto Where CountryName=France
Salvamos y ejecutamos el reporte.
Y efectivamente salen en el listado solamente las atracciones de Francia!
Video filmado con GeneXus X Evolution 2
Pag
e7
Muy bien. hasta ahora hemos estado definiendo un procedimiento, que tiene un nico comando
For each, el cual como vimos accede a los datos de una tabla base y su tabla extendida.
Ahora supongamos que la agencia de viajes nos solicita un listado que muestre a todas las categoras
de atracciones y para cada categora, la lista de atracciones tursticas que hay ingresadas
con este formato:
Video filmado con GeneXus X Evolution 2
Pag
e8
Antes de resolver este pedido, vamos a ejecutar la aplicacin para agregar un par de atracciones
tursticas. Presionamos F5
y aqu vemos la nueva pantalla de inicio, que ahora genera la versin Evolution 2 de GeneXus, con la
que estamos trabajando.
Vamos a ejecutar a nuestro Trabajar Con Atracciones
Video filmado con GeneXus X Evolution 2
Pag
e9
Agregamos al Cristo Redentor, que est en Brasil, en la ciudad de Rio de Janeiro, su categora es
Monument
y cargamos su imagen.
Video filmado con GeneXus X Evolution 2
Pag
e10
Ahora ingresamos al Museo Smithoniano, que est en Estados Unidos, en Washington y elegimos su
imagen.
Y ahora s, pasemos a definir el listado que nos solicitaron.
Vamos a crear un objeto procedimiento. Seleccionamos File/New/Object, elegimos procedure y le
damos el nombre CategoriesAttractionReport
Video filmado con GeneXus X Evolution 2
Pag
e11
Ahora volvamos a observar lo que queremos ver en el listado
Queremos mostrar cada categora ingresada y para cada categora, todas las atracciones que
pertenecen a esa categora.
Observemos que tenemos que mostrar 3 contenidos fijos
Video filmado con GeneXus X Evolution 2
Pag
e12
y 2 contenidos con datos que tenemos que extraer de la base de datos
Empecemos por definir el layout del procedimiento basndonos en lo que nos pidieron ver, y luego
veremos cmo codificar el source
Video filmado con GeneXus X Evolution 2
Pag
e13
Utilizamos el printblock ya creado y le agregamos el ttulo del listado.
Arrastramos un control Rectangle
le cambiamos su propiedad Back color
le insertamos dentro un Textblock
Video filmado con GeneXus X Evolution 2
Pag
e14
y digitamos el ttulo: Categories and Attractions Report
Nombramos a este printblock: Title
Ahora agregamos otro printblock para mostrar cada nombre de categora
Le damos el nombre: Categories
Video filmado con GeneXus X Evolution 2
Pag
e15
Arrastramos un control de tipo textblock al printblock
le ponemos el texto Category
y arrastramos al lado, un control de tipo atributo/variable
para mostrar el valor del atributo CategoryName
Video filmado con GeneXus X Evolution 2
Pag
e16
Creamos otro printblock para mostrar los ttulos de las columnas.
Le damos el nombre AttractionsColumnTitles
Video filmado con GeneXus X Evolution 2
Pag
e17
y le agregamos el texto Attraction name
el texto Attraction country
y la lnea debajo de estos textos:
Video filmado con GeneXus X Evolution 2
Pag
e18
Ahora insertamos un ltimo printblock para mostrar en el mismo los datos de las atracciones.
Le damos el nombre Attractions
e incluimos en el mismo a los atributos AttractionName y CountryName, debajo de los ttulos
respectivos:
Video filmado con GeneXus X Evolution 2
Pag
e19
Ahora pasemos a la seccin Source.
Escribamos la primer instruccin para imprimir el ttulo del listado: Print Title
Y ahora detengmonos a ver cmo seguimos
Como tenemos que navegar las categoras
Video filmado con GeneXus X Evolution 2
Pag
e20
y para cada una de ellas, navegar varias atracciones que pertenecen a dicha categora
este caso es diferente al del listado anterior que hemos resuelto.
En el listado anterior como hemos visto, navegbamos las atracciones
y dado que cada atraccin tiene 1 slo pas, podamos recuperar el nombre del pas
Video filmado con GeneXus X Evolution 2
Pag
e21
de cada atraccin, por estar en la tabla extendida de la tabla base que navegbamos.
Siempre que disponemos de la informacin que queremos mostrar, en la tabla extendida de la tabla
base que estamos navegando
la podemos referenciar directamente en el mismo For each.
En cambio si estamos navegando una tabla y necesitamos para cada registro accedido,
Video filmado con GeneXus X Evolution 2
Pag
e22
navegar varios registros relacionados que estn en otra tabla que no pertenece a la tabla extendida
de la tabla que estamos navegando, necesitamos escribir otro For each dentro del primero, para
recorrer el conjunto de registros relacionados.
Volvamos al source.
Comencemos a escribir un 1er For each, para navegar y mostrar las categoras
Escribimos dentro del For each: Print Categories
y como el printblock Categories, solamente tiene includo al atributo CategoryName
GeneXus entender que la tabla base de este For each ser CATEGORY
Video filmado con GeneXus X Evolution 2
Pag
e23
Dentro de este For each que navega las categoras, luego de mostrada una categora, queremos
navegar el conjunto de atracciones pertenecientes a dicha categora entonces necesitamos escribir
el 2do For each que mencionamos, para recorrer el conjunto de atracciones pertenecientes a la
categora que se vena navegando.
Justo antes de navegar el conjunto de atracciones de la categora, habra que mostrar los ttulos que
encabezarn a las atracciones que mostraremos, as que escribamos la instruccin Print
AttractionsColumTitles
Y ahora s escribamos el 2do For each, dentro del cuerpo del 1ero.
Escribimos For each
dentro del mismo Print y el nombre del printblock Attractions
Video filmado con GeneXus X Evolution 2
Pag
e24
Endfor para cerrar esta navegacin
y el ltimo Endfor para cerrar la primera navegacin.
Recordemos que para que salga el listado con formato PDF, tenemos que configurar la propiedades
del reporte Main program con valor True
en Main object properties, configuramos para la propiedad Call protocol el valor
HTTP
Video filmado con GeneXus X Evolution 2
Pag
e25
y tenemos que insertar la regla OutputFile en la seccin de reglas
Completamos el nombre del archivo del listado CategoriesAttractionsReport.PDF y el formato PDF.
Salvamos
Y vamos a ejecutar a este listado
Video filmado con GeneXus X Evolution 2
Pag
e26
Observamos que se listaron todas las categoras que habamos ingresado
Video filmado con GeneXus X Evolution 2
Pag
e27
y para cada una de ellas se listaron las atracciones que pertenecen a dicha categora!
O sea, exactamente lo que nos solicitaron!
Ahora bien, cmo supo GeneXus cules atracciones deba mostrar para cada categora si nosotros
no le agregamos a nuestro source ninguna condicin explcita que indique algo al respecto?
Video filmado con GeneXus X Evolution 2
Pag
e28
Si bien escribimos un For Each que navega las atracciones
no agregamos en ningn lado una clusula where, para filtrar aquellas atracciones que cumplan con
la condicin de que coincida el valor del identificador de la categora, con el de la categora que
estamos listando.
Entonces cmo hizo GeneXus para que al momento de navegar la tabla ATTRACTION donde estn
almacenadas todas las atracciones, recuperarnos para cada categora, solamente aquellas que
pertenecan a dicha categora?
La respuesta est en la forma en que escribimos los For Each
Video filmado con GeneXus X Evolution 2
Pag
e29
Si 2 comandos For each se escriben uno a continuacin del otro, son independientes entre s
En cambio si escribimos un For each dentro de otro
Video filmado con GeneXus X Evolution 2
Pag
e30
es porque para cada registro de la primer navegacin, queremos recorrer un conjunto de registros
Cuando escribimos comandos For Each anidados
Video filmado con GeneXus X Evolution 2
Pag
e31
GeneXus determina para cada For each, la tabla base que navegar y luego busca si existe alguna
relacin entre dichas tablas base.
En este caso, la tabla base del For each externo es CATEGORY
y la tabla base del For each interno es ATTRACTION
Video filmado con GeneXus X Evolution 2
Pag
e32
y GeneXus tiene el conocimiento de que hay un atributo en comn en ambas tablas: CategoryId, que
es llave primaria en CATEGORY y llave fornea en
ATTRACTION
De modo que el atributo CategoryId hace que se relacionen las tablas ATTRACTION y
CATEGORY, como vemos aqu, en una relacin 1 a N
Video filmado con GeneXus X Evolution 2
Pag
e33
Es decir, que para cada categora, hay muchas atracciones relacionadas.
Por lo tanto, para cada categora navegada en el For Each externo, GeneXus ejecuta el
For Each que navega la tabla de atracciones
filtrando solamente aquellas atracciones que cumplen que el valor de su CategoryId coincida con el
valor del CategoryId de la categora en la que estamos posicionados.
Es como si en el For each interno, hubiramos escrito
Video filmado con GeneXus X Evolution 2
Pag
e34
Where CategoryId=CategoryId. pero no tenemos que ponerlo, porque GeneXus lo detecta y aplica.
Hemos visto qu fcil es obtener informacin y desplegarla en un reporte pero los procedimientos
pueden hacer mucho ms que eso! Veremos eso ms adelante.