Trucos Genexus
Trucos Genexus
Trucos Genexus
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 :
Page
Presionamos el botn derecho del mouse, seleccionamos Run With this Only
Page
Y vemos que las atracciones tursticas son listadas ordenadas alfabticamente por nombre.
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
Page
Page
Vemos que salen listadas las atracciones ordenadas alfabticamente por nombre de pas!
Page
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.
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
WhereCountryId=2
en
el
rengln
siguiente
al
For
Each
escribimos
Page
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
Page
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.
Page
Agregamos al Cristo Redentor, que est en Brasil, en la ciudad de Rio de Janeiro, su categora es
Monument
Page
y cargamos su imagen.
Ahora ingresamos al Museo Smithoniano, que est en Estados Unidos, en Washington y elegimos su
imagen.
Page
10
Queremos mostrar cada categora ingresada y para cada categora, todas las atracciones que
pertenecen a esa categora.
Page
11
Page
12
Empecemos por definir el layout del procedimiento basndonos en lo que nos pidieron ver, y luego
veremos cmo codificar el source
Page
13
Page
14
Page
15
Page
16
Page
17
Ahora insertamos un ltimo printblock para mostrar en el mismo los datos de las atracciones.
Page
18
Page
19
y para cada una de ellas, navegar varias atracciones que pertenecen a dicha categora
Page
20
y dado que cada atraccin tiene 1 slo pas, podamos recuperar el nombre del pas
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
Page
21
En cambio si estamos navegando una tabla y necesitamos para cada registro accedido,
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
Page
22
GeneXus entender que la tabla base de este For each ser CATEGORY
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
Page
23
Page
24
Recordemos que para que salga el listado con formato PDF, tenemos que configurar la propiedades
del reporte Main program con valor True
Salvamos
Page
25
Page
26
y para cada una de ellas se listaron las atracciones que pertenecen a dicha categora!
Page
27
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?
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?
Page
28
Si 2 comandos For each se escriben uno a continuacin del otro, son independientes entre s
Page
29
es porque para cada registro de la primer navegacin, queremos recorrer un conjunto de registros
Page
30
GeneXus determina para cada For each, la tabla base que navegar y luego busca si existe alguna
relacin entre dichas tablas base.
31
Page
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
Page
32
De modo que el atributo CategoryId hace que se relacionen las tablas ATTRACTION y
CATEGORY, como vemos aqu, en una relacin 1 a N
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.
Page
33
Where CategoryId=CategoryId. pero no tenemos que ponerlo, porque GeneXus lo detecta y aplica.
Page
34
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.