Vous êtes sur la page 1sur 34

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

Page

Presionamos el botn derecho del mouse, seleccionamos Run With this Only

Video filmado con GeneXus X Evolution 2

Page

Y vemos que las atracciones tursticas son listadas ordenadas alfabticamente por nombre.

Video filmado con GeneXus X Evolution 2

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.

Page

Cambiemos el atributo que sucede al order, por CountryName

Video filmado con GeneXus X Evolution 2

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.

Page

Vamos a ejecutar el procedimiento para ver el resultado

Video filmado con GeneXus X Evolution 2

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.

Video filmado con GeneXus X Evolution 2

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

ya que sabemos que el Id de Francia era el 2


Tambin podramos haber puesto Where CountryName=France

Salvamos y ejecutamos el reporte.

Page

Y efectivamente salen en el listado solamente las atracciones de Francia!

Video filmado con GeneXus X Evolution 2

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

con este formato:

Video filmado con GeneXus X Evolution 2

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

Vamos a ejecutar a nuestro Trabajar Con Atracciones

Video filmado con GeneXus X Evolution 2

Agregamos al Cristo Redentor, que est en Brasil, en la ciudad de Rio de Janeiro, su categora es
Monument

Page

y cargamos su imagen.

Video filmado con GeneXus X Evolution 2

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.

Page

10

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

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.

Page

11

Observemos que tenemos que mostrar 3 contenidos fijos

Video filmado con GeneXus X Evolution 2

y 2 contenidos con datos que tenemos que extraer de la base de datos

Page

12

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

Utilizamos el printblock ya creado y le agregamos el ttulo del listado.


Arrastramos un control Rectangle

le cambiamos su propiedad Back color

Page

13

le insertamos dentro un Textblock

Video filmado con GeneXus X Evolution 2

y digitamos el ttulo: Categories and Attractions Report

Nombramos a este printblock: Title

Ahora agregamos otro printblock para mostrar cada nombre de categora

Page

14

Le damos el nombre: Categories

Video filmado con GeneXus X Evolution 2

Arrastramos un control de tipo textblock al printblock

le ponemos el texto Category

Page

15

y arrastramos al lado, un control de tipo atributo/variable

para mostrar el valor del atributo CategoryName

Video filmado con GeneXus X Evolution 2

Creamos otro printblock para mostrar los ttulos de las columnas.

Page

16

Le damos el nombre AttractionsColumnTitles

Video filmado con GeneXus X Evolution 2

y le agregamos el texto Attraction name

el texto Attraction country

Page

17

y la lnea debajo de estos textos:

Video filmado con GeneXus X Evolution 2

Ahora insertamos un ltimo printblock para mostrar en el mismo los datos de las atracciones.

Le damos el nombre Attractions

Page

18

e incluimos en el mismo a los atributos AttractionName y CountryName, debajo de los ttulos


respectivos:

Video filmado con GeneXus X Evolution 2

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

Page

19

Como tenemos que navegar las categoras

Video filmado con GeneXus X Evolution 2

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

Page

20

y dado que cada atraccin tiene 1 slo pas, podamos recuperar el nombre del pas

Video filmado con GeneXus X Evolution 2

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.

Page

21

En cambio si estamos navegando una tabla y necesitamos para cada registro accedido,

Video filmado con GeneXus X Evolution 2

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

Page

22

GeneXus entender que la tabla base de este For each ser CATEGORY

Video filmado con GeneXus X Evolution 2

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

dentro del mismo Print y el nombre del printblock Attractions

Video filmado con GeneXus X Evolution 2

Endfor para cerrar esta navegacin

y el ltimo Endfor para cerrar la primera navegacin.

Video filmado con GeneXus X Evolution 2

Page

en Main object properties, configuramos para la propiedad Call protocol el valor


HTTP

24

Recordemos que para que salga el listado con formato PDF, tenemos que configurar la propiedades
del reporte Main program con valor True

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

Page

25

Y vamos a ejecutar a este listado

Video filmado con GeneXus X Evolution 2

Page

26

Observamos que se listaron todas las categoras que habamos ingresado

Video filmado con GeneXus X Evolution 2

y para cada una de ellas se listaron las atracciones que pertenecen a dicha categora!

O sea, exactamente lo que nos solicitaron!

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?

Video filmado con GeneXus X Evolution 2

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?

Page

28

La respuesta est en la forma en que escribimos los For Each

Video filmado con GeneXus X Evolution 2

Si 2 comandos For each se escriben uno a continuacin del otro, son independientes entre s

Page

29

En cambio si escribimos un For each dentro de otro

Video filmado con GeneXus X Evolution 2

es porque para cada registro de la primer navegacin, queremos recorrer un conjunto de registros

Page

30

Cuando escribimos comandos For Each anidados

Video filmado con GeneXus X Evolution 2

GeneXus determina para cada For each, la tabla base que navegar y luego busca si existe alguna
relacin entre dichas tablas base.

31

En este caso, la tabla base del For each externo es CATEGORY

Page

y la tabla base del For each interno es ATTRACTION

Video filmado con GeneXus X Evolution 2

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

Video filmado con GeneXus X Evolution 2

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.

Page

33

Es como si en el For each interno, hubiramos escrito

Video filmado con GeneXus X Evolution 2

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.

Video filmado con GeneXus X Evolution 2

Vous aimerez peut-être aussi