trucos genexus

Author: jose-luis-bravo-carpio

Post on 08-Oct-2015

133 views

Category:

Documents


3 download

Embed Size (px)

DESCRIPTION

For Each Anidado

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.