Está en la página 1de 137

Genexus Rocha

Episodio Uno
Genexus Rocha
Episodio Uno

Daniel Mrquez Lisboa - Cecilia Fernndez


Genexus Rocha. Episodio Uno

No est permitida la reproduccin total o parcial de este libro ni su tratamiento informtico,


ni la transmisin de ninguna forma o por cualquier medio ya sea electrnico, mecnico,
por fotocopia, por registro u otros mtodos, sin el permiso previo y por escrito de los
titulares del Copyright.

EDITORIAL GRUPO MAGRO


Dr. Gastn Ramn 2312 bis
Tel. (598 2) 708 54 98 - 708 03 86
E-mail: info@grupomagro.com
www.grupomagro.com
Montevideo - Uruguay

Daniel Mrquez Lisboa - Cecilia Fernndez

Editor: Fernando Daz


Diseo: Claudio de los Santos
Diseo de tapa: Fiorella Franzini

Dep. Legal N 343.110 / 07

Impreso y encuadernado en ZONALIBRO


Gral. Palleja 2478 - Tel. (598 2) 208 78 19
E-mail: zonalibro@adinet.com.uy
Montevideo - Uruguay

Printed in Uruguay - Impreso en Uruguay


Prlogo

Todo el equipo de Artech est trabajando mucho en la versin Rocha de GeneXus.


La Versin Rocha no es, simplemente, una versin ms: representa un gran salto
adelante en muchos aspectos y, muy especialmente, en su capacidad de integra-
cin y de extensin ya sea por Artech o por la propia Comunidad GeneXus.
La Comunidad GeneXus, entusiastamente, viene probando las versiones CTP del
producto, utilizndolo y, en muchos casos, construyendo extensiones. En el XVII
Encuentro ser lanzada la primera versin beta.
En este estado hemos encomendado a Daniel Mrquez Lisboa (autor de GeneXus,
Desarrollo Basado en el Conocimiento Gua Prctica editado por Grupo Magro en
el 2006) y a Cecilia Fernndez, con una muy buena experiencia como instructora
en nuestros cursos, un libro introductorio sobre la Versin Rocha de GeneXus.
No niego que, en una primera instancia, me sorprendi el tono informal del libro.
Luego de leerlo cuidadosamente, veo que el tono informal es un acierto ms de
los mltiples que han tenido los autores. Pienso que este libro es una gran contri-
bucin al conocimiento de la Versin Rocha y del gran cambio que ella representa,
de manera que la Comunidad GeneXus pueda prepararse muy bien para su libera-
cin en el 2008.
Espero una muy buena acogida del libro y, desde ya, felicito a los autores por su
trabajo y les deseo el mayor de los xitos.

Ing. Breogn Gonda


Presidente de Artech
Estimado lector

Unos meses atrs nos pidieron escribir un libro sobre la versin de GeneXus que se
encontraba en plena gestacin: la Rocha. Los mand el enemigo, pensamos.
Escribir un libro sobre una versin que va a estar cambiando durante todo el
proceso de escritura?!. Y por si esto fuera poco, una versin que por lo que se
rumoreaba, era ms que una simple nueva versin: era la refundacin del produc-
to. Cuando adems nos contaron que queran un libro que desnudara GeneXus,
que lo mostrara en su personalidad y apariencia, cuerpo y esencia, que lo acercara
a quien quisiera descubrirlo o redescubrirlo, que fuera ameno, que fuera entreteni-
do, que se leyera como un cuento ah quedamos encantados.

Es que, cmo no disfrutar inventando personajes, peripecias, encuentros y


desencuentros! Descubriendo y mostrando. Mostrando y descubriendo. Una y otra
vez: la Rocha.

Pensamos mucho en usted, amigo lector, en quin sera, qu querra saber, cmo,
cunto, si conocera mucho, poquito o nada de GeneXus qu le causara gracia,
qu le aburrira pero cuando tantas hiptesis nos marearon, hacindonos temblar
el pulso, optamos por lo sano: divertirnos. Confiando en que un trabajo hecho con
placer, contagia. Y si no es as, sabr disculparnos. De todas formas quin nos
quita lo bailado?!

Usted podr ser un experto en GeneXus que se acerca a este libro para descubrir la
Rocha, o podr ser su primera vez con la herramienta. Esperamos que pueda ir
siguiendo las pginas de este libro con el mismo entusiasmo que nos llev a escri-
birlas, y que pueda adaptar la lectura a sus ganas y necesidades. Hay captulos
ms tcnicos que otros, en especial el 3 que trata sobre Patterns. No pudimos ceder
ante la tentacin de mostrar toda su potencia, lo que nos llev a desnudar cada vez
un poquito ms. Quien quiera mucho, lo leer todo, quien no, lo leer ms super-
ficialmente. Tmese esa libertad, que fue la que nos permiti dar rienda suelta a
nuestras ganas y descubrir, descubrir y descubrir. Los ltimos captulos, probable-
mente sean los ms giles y disfrutables, donde la historia se pone ms interesan-
te. Porque lo mejor siempre se deja para el final. Asimismo hemos incluido un
anexo, que pretende destacar las caractersticas ms sobresalientes de la Rocha,
que ser de especial utilidad para los entendidos en versiones anteriores de GeneXus.
Escapa al tejido natural del libro, por lo que aparece aparte.
La versin de GeneXus Rocha con la que elaboramos esta novela es la CTP 5,
build 7304. Cuando este libro llegue a sus manos, ya estar en la calle la primera
beta de la versin. Por esta razn, sabr perdonar los posibles cambios que pudiera
encontrar. Confiamos que no sern muchos ni de magnitud.
Puede ser una buena idea para usted, si as lo desea, ir siguiendo la aplicacin que
nuestros personajes irn desarrollando a lo largo del libro. Podr elegir el genera-
dor y DBMS que prefiera; nosotros hemos escogido los default.
Encontrar repetidamente en este texto citas a un white paper de Breogn Gonda
y Nicols Jodal Desarrollo basado en conocimiento. Filosofa y fundamentos teri-
cos de GeneXus, publicado en mayo de 2007.
Por ltimo, agradecer a todos los compaeros que de un modo u otro estuvieron
aportando a este trabajo, leyendo las versiones de los captulos, criticndolas,
sugiriendo, o simplemente dando nimo. Alejandra Pereiro, Armin Bachmann, Gus-
tavo Carriquiry, Gustavo Proto, Gastn Milano, Eugenio Garca, Jos Luis Chalar,
Alfredo Bordagorry, Pablo Mazzilli, Flavio Caiafa, Dane Drotts. A Matas Hernndez,
Silvia Keymetlin, Ana Berta, Jos Lamas Ros, Rodrigo lvarez, Jorge Mastropietro,
David Waszuk por el soporte tcnico. A Marcela Fernndez por el momento de
inspiracin en un almuerzo y a Rodolfo Roballo, por sus ideas y apoyo permanente.
A Mara Jos Serrs por su trajinar con los diseos grficos a nuestro gusto. A
Rosario Prez, nuestra traductora, por su infinita paciencia. A Nicols Jodal, precur-
sor de este proyecto, y en especial a Breogn Gonda, por su lectura concienzuda,
su alegra de siempre y su apoyo, codo a codo.
A todos: gracias!
Mary, Diego, Mike y Julia, esperan ansiosos ser descubiertos
Buena lectura!

Los autores
Montevideo, Setiembre 2007
Sinopsis

Captulo 1: El encuentro. Un hombre y una mujer se reencuentran luego de aos


sin verse, desde sus pocas de estudiantes, dando inicio a este periplo, de la mano
de GeneXus.

Captulo 2: rase una vezun Proyecto. Julia, Mike y Diego definen e inician el
anlisis y desarrollo del sistema web para una agencia de viajes, a la vez que ste
ltimo acompaa a Mary en su primera experiencia con el IDE de GeneXus Rocha y
con la creacin de los primeros objetos del proyecto.

Captulo 3: Hecho a mquina, terminado a mano. Mientras Julia va logrando


gran Productividad gracias a los patterns, Diego da rienda suelta a su creatividad
poniendo de manifiesto que los deseos de los clientes no siempre deben ser un
duro escollo a sortear. Adems, Pattern Work With, Web Panels, Web Components,
Master Pages, User Controls.

Captulo 4: Vuelo al mundo de los Subtipos. A velocidad match 3, Diego muestra


a Mary por qu los Subtipos son la solucin, entre otros problemas, al de mltiples
referencias en el diseo, que pueden presentarse en un proyecto, mientras le pone
el punto final a las ltimas transacciones. Adems, la Comunidad GeneXus y sus
Extensions.

Captulo 5: Cuando el qu no alcanza. El entusiasmo de Mary se va


acrecentando da a da a medida que va adquiriendo los conocimientos que Diego
le trasmite. Pero muchas preguntas an no encuentran respuesta; Diego lo sabe.
Descubre el objeto Procedimiento, el comando For each, los Business Components
y la posibilidad de desplegar listados pdf.

Captulo 6: Soplan nuevos vientos. Sabemos que todo tiene un final, pero lo
que Mary no imaginaba hasta hace un tiempo atrs, era que esto poda llegar a ser
solo el principio. Categorizacin, Full Text Search, Themes, versionado, Data Pro-
viders, Data Selectors, GXflow integrado y Gxportal tambin suman presencia en
este captulo.

Anexo: Construyendo el futuro. Descubra por qu no solo Artech, sino toda la


Comunidad, son partes del engranaje de GeneXus Rocha. La construccin de GeneXus
ahora se hace entre todos.
Captulo 1
El encuentro

Alguien cuenta que esperando por fin ser atendido en un banco, escuch casual-
mente una conversacin entre un hombre y una mujer, que tambin esperaban.
Segn pareca, se reencontraban luego de muchos aos sin verse; antiguos com-
paeros de estudio?

Cmo ests Mary? Marchan bien las cosas? dijo el hombre con voz profun-
da, impostada, mirada fija, aire seductor.

Bueno Diego, luego de tantos aos trabajando en la empresa, logr ascender


y ahora soy Developer Team Manager desde hace ya dos aos dijo la mujer
con rostro sensiblemente cansado.

- Supongo que debo felicitarte, pero por qu esa cara? tienes problemas en el
departamento? He escuchado que los sistemas de ustedes, adems de ser de
gran porte, son fiables

- Lo son. Pero no sabes lo que cuesta su mantenimiento! Me estoy enfermando,


Diego, no duermo bien; muchas responsabilidades, grandes cargas horarias,
poco descanso. Siento en el pecho

- una presin complet Diego Entiendo, Mary dijo al tiempo que deposi-
taba su mano derecha sobre el brazo izquierdo de su antigua compaera como
dando consuelo- Cmo estn trabajando? Qu herramientas estn usando?

- Y de todo un poco, lo usual al final todo es lo mismo contest Mary ajena


a esa cercana- Tengo un equipo importante de personas trabajando en los
desarrollos y mantenimientos, pero an as no damos abasto.

- Bueno, no todo es lo mismo Qu te parece si terminamos este trmite aqu


y vamos a tomar un caf y me sigues contando? pregunt Diego a la vez
contento y turbado.

1
GeneXus?
Ya en el bar, caf mediante, Diego escuchaba atentamente a una Mary angustiada.
Recordaba su antigua firmeza, su empuje. Senta un egosta dejo de alegra de
poder ser ahora l quien la ayudara.

- En cuntos proyectos estn? pregunt Diego para instaurar un clima


confesional.

- Ahora en uno solo. Pero es ms que nada en tareas de mantenimiento. Nues-


tros clientes nos estn solicitando cosas nuevas todo el tiempo, pero nos est
siendo imposible satisfacer nuevos requerimientos. Adems, esta tarea de man-
tenimiento es realmente costosa, y ya no puedo justificar a la Direccin la
incorporacin de ms mano de obra; nos saldramos del punto de equilibrio.

- No ser que los sistemas estn un poco vetustos? No les convendra hacer
una reingeniera de todo a nuevo? pregunt Diego con liviandad.

- S, eso quisiera, y eso he propuesto. Pero los tiempos realmente no nos dan, y
como te dije, puede que estemos ya pasados de costos. No s qu voy a
hacer estoy agotada Diego, me siento en un callejn sin salida.

- Mary, no desesperes, sabes cuntos estn como t? Tu caso es uno ms entre


millones. Las aplicaciones son cada vez ms complejas, y con las herramientas
manuales de las que disponamos, se est tornando imposible desarrollar y peor
an, mantener esos sistemas; se estn volviendo inmanejables. Pero no todo es
negro, Mary. Hoy en da hay soluciones. La alternativa es delegar en procesos
automticos el trabajo que hacemos los humanos, de manera que podamos
dedicarnos a las nuevas complejidades y no a tareas como la codificacin que
pueden ser efectuadas por un programa. Nosotros, sin ir ms lejos, estamos
llevando adelante varios proyectos importantes en simultneo, y no tenemos
demasiados inconvenientes. Conoces algo de GeneXus?

- Ah, GeneXus. S, algo he escuchado, pero no he tenido tiempo de interiorizarme


demasiado Ustedes trabajan con esa herramienta? He odo que cada vez
ms gente no tcnica puede usarla, lo que me despierta cierta curiosidad.

- Mira Mary, no s si GeneXus sea la panacea, pero s s que cura varias de las
dolencias que tienen empresas como la tuya. Es un programa que hace pro-
gramas. Automatiza la construccin y mantenimiento de tus aplicaciones y de
tu base de datos. Obviamente est en un nivel de abstraccin superior a otras
herramientas, comprendes? Contstame a esta pregunta: si t pudieras dis-
poner de un software que te permitiera lograr hacer esto automticamente,
lo usaras?

2
- Absolutamente! Se incorpor en su silla Si justamente se es nuestro
problema. Tenemos que hacer casi todo a mano

La gran dificultad de la empresa de Mary, pens Diego, era el de tantas otras:


imposibilidad de enfrentar nuevos proyectos porque los tiempos de mantenimiento
de los sistemas actuales, fundamentados en metodologas tradicionales, lo impe-
dan. Y eso, para una empresa que vive del desarrollo, es una luz roja de peligro.

Bueno, no lo diga en voz alta, pero usted, estimado lector, se estar preguntando:
Cmo?

- Cmo? pregunt una Mary ya ms vital.

- No te parece razonable pensar que dado un conjunto de visiones de datos,


- se interrumpi Diego con cierta malicia - exista un nico modelo relacional
mnimo que lo satisfaga?

- Hmmm puede ser, no estoy segura. Pero qu tiene esto que ver con mis
problemas de mantenimiento?

- Y si eso es cierto continu Diego, ignorando su vacilacin no te parece


posible encontrar un procedimiento de ingeniera inversa que partiendo de ese
conjunto de visiones d como resultado el esquema de esa base de datos
relacional mnima? Bueno, si me vas a decir ver para creer, con gusto acepto
una apuesta, como en los viejos tiempos; pero desde ya te adelanto: vas a
perder.

Una Apuesta

El objetivo de GeneXus es [a travs de la descripcin de las visiones de los


usuarios] conseguir un muy buen tratamiento automtico del conocimiento
de los sistemas de negocios. Breogn Gonda & Nicols Jodal

GeneXus es una herramienta que parte de las visiones de los usuarios; captura su
conocimiento y lo sistematiza en una base de conocimiento. A partir de esta
ltima, GeneXus es capaz de disear, generar y mantener de manera totalmente
automtica la estructura de la base de datos y los programas de la aplicacin, es
decir, los programas necesarios para que los usuarios puedan operar con sus
visiones.

3
GeneXus trabaja con conocimiento puro, cuya validez es totalmente inde-
pendiente de las tecnologas de moda.

- Mary, GeneXus almacena en una Knowledge Base todos los elementos necesa-
rios para construir la aplicacin, y luego la utiliza para el desarrollo del siste-
ma, construyendo automticamente el modelo de datos en forma normaliza-
da, y tambin utilizando el lenguaje de programacin y base de datos que se
le indique. As que te permite obtener un proyecto con el conocimiento de la
empresa

- Ah! Entonces eso

- S interrumpi Diego ansioso de completar la idea- te permite ganar algo


muy importante: la portabilidad futura de la aplicacin. Todo ese conocimiento
-reglas de negocio, dilogos, controles, reportes- que hoy estn en un lengua-
je de programacin determinado, pueden ser convertidos a otros lenguajes sin
necesidad de arrancar de cero. O sea que se reutiliza el conocimiento porque
la Knowledge Base es conocimiento independiente de la plataforma.

Mary parpade rpidamente un par de veces y, sin mediar palabra alguna, pidi
otra ronda de caf.

4
Base de Conocimiento y
Modelos Externo y Relacional
Nuestros personajes continuaron su conversacin en el caf. A esas alturas, Mary
ya se mostraba particularmente interesada en esa herramienta, y Diego en...

- Bueno, por un lado est el Modelo Relacional, que como bien sabes, est orien-
tado a obtener una buena representacin de los datos en una Base de Datos,
obedeciendo a algunas condicionantes muy deseables.

- Cierto asegur ella Eliminar las redundancias e introducir un pequeo


conjunto de reglas para evitar las mayores fuentes de inconsistencia de los
datos

- Eso mismo, reglas que chequean la unicidad y la integridad referencial y ade-


ms tambin proveen de un conjunto de operadores para poder manipular los
datos a buen nivel acot Diego congratulndose por el clima de complicidad
generado.

- S, claro, por eso todo el mundo las usa. GeneXus no las usa?

- Bueno, s, ya voy a llegar a eso. Te acuerdas tambin del Modelo Externo,


aquel donde se representaban las visiones externas? Bueno, GeneXus pone el
nfasis en este modelo, porque es donde realmente est el conocimiento ge-
nuino, es el realmente importante para los usuarios y los desarrolladores. En
l se recoge el conocimiento exterior y todo lo dems, como otros modelos
auxiliares que pudieran ayudar, puede inferirse automticamente a partir de
ese Modelo Externo.

- Ahel Modelo Externono puede contener ningn elemento fsico o interno


como archivos, tablas, entidades, relaciones entre entidades, ndices ver-
dad?

- Exacto! O cualquier otro que se pueda inferir automticamente exclam


Diego animado, recuperando el entusiasmo que siempre le provocaron las
conversaciones con Mary El Modelo Externo ser utilizado para obtener y
almacenar el conocimiento. Pretende la representacin ms directa y objetiva
posible de la realidad.

- Claro, y con eso te independizas de la implementacin, porque tienes una


descripcin del sistema en alto nivel, descripcin que solo cambiar si cam-
bian las visiones sobre el mismo; voy bien?

5
- Perfecto! Por ello tomamos las visiones de los diferentes usuarios Visiones
que son almacenadas en el modelo. Luego se captura todo el conocimiento
contenido en ellas y se lo sistematiza para maximizar las capacidades de infe-
rencia

- Eso es lo que no termino de


creer. Me suena a pura teora
t intentas decirme que es
posible slo describir y que un
programa, con solo un par de
pases de varita mgica te haga
realidad la aplicacin? pre-
gunt Mary un poco escptica
y al mismo tiempo deseando
ser convencida por los razona-
mientos apasionados de Diego.

- Bueno, yo no dira que es magia. Es un software al fin de cuentas. Y no digo


que no tengas que programar algo, pero s digo que casi nada, lo menos
posible. En GeneXus vas a tener algn cdigo que ser procedural, pero el
lenguaje en que lo escribes no es el lenguaje al que ests acostumbrada en
l tampoco tienes que nombrar tablas, ni ndices, ni nada de lo fsico de una
base de datos.

- Pero no entiendo entonces dnde entra el Modelo Relacional pregunt Mary


confundida.

- Es el que se utiliza para representar y manipular los datos: es el modelo inter-


no o fsico, pero no ser creado por ti, ser inferido por GeneXus con su proce-
dimiento de ingeniera inversa. Mi apuesta fue tramposa.

- Y cmo describes las visiones de los usuarios, el Modelo Externo, de manera


que pueda aplicarse ingeniera inversa sobre ellas y obtener todo eso que
dices? Porque tiene que ser lo bastante formal y rigurosa esa descripcin como
para que no haya ambigedades y que un programa pueda inferir todo eso
que los programadores hacemos todava a mano.

- S, lo es. Las descripciones se realizan a travs de determinados objetos-tipo


de GeneXus que indican el qu. A travs de ellos, GeneXus encuentra el
cmo. Por lo que, para aprender a usar GeneXus, tienes que aprender a
describir, a usar esos objetos-tipo. No necesitas grandes conocimientos tcni-
cos; cada vez menos.

Diego continuaba hablando, llenando el reducido silencio que su interlocutora ha-


ba dejado. A pesar de tantos aos sin verse, conoca bien a Mary, conoca esa

6
expresin de ojos pensativos, y saba que su silencio lo invitaba a proseguir. No
poda tener mejor suerte - Bendito GeneXus! - pens, y continu en tono confi-
dente, manejando las pausas, seguro de lograr los efectos buscados.

- Para lograr todo esto,


GeneXus tiene una base
de conocimiento, que
inicialmente tiene aso-
ciado un conjunto de
mecanismos de inferen-
cia y algunas reglas de
aplicacin general, como
las que aseguran la con-
sistencia (las de integri-
dad referencial, por
ejemplo). Luego, cuan-
do el analista GeneXus comienza a describir la realidad creando objetos, estas
descripciones (el Modelo Externo) son sistematizadas automticamente y pa-
san a estar contenidas en la base de conocimiento Adems, sobre ese cono-
cimiento, obtiene un conjunto de resultados que le ayudan a mejorar la efi-
ciencia de las inferencias posteriores.

- Es una mquina de inferencias! exclam Mary.

- Nada ms cierto. Por ejemplo, dada una visin de los datos, puede inferir
automticamente el programa necesario para manipularla.

GeneXus trabaja permanentemente sobre la Knowledge Base. Todo el conoci-


miento de la Knowledge Base es equivalente al contenido del Modelo Externo
(subconjunto de ella), ya que consiste en el propio Modelo Externo ms reglas y
mecanismos de inferencia independientes de l y un conjunto de otros elementos
que son automticamente inferidos a partir del mismo.

El desarrollador puede alterar, modificando objetos de la realidad del usuario, el


Modelo Externo y las modificaciones se propagarn automticamente a todos los
elementos que lo necesiten: otros elementos de la Knowledge Base, Base de Datos
y programas de la aplicacin. De la misma manera, el desarrollador no puede alterar
directamente ningn elemento que no pertenezca al Modelo Externo

TODO el conocimiento est contenido en el Modelo Externo y, por ello, maana


podramos soportar la Knowledge Base de una manera totalmente diferente y el
conocimiento de nuestros clientes seguira siendo utilizable sin problema alguno.

Breogn Gonda & Nicols Jodal

7
- Diego, debo irme, pero quiero saber ms. Me has dejado con la cabeza confu-
sa. Es muy grande el cambio de mentalidad, quisiera palpar esto ms de cer-
ca, verlo funcionando. Te parece de encontrarnos la semana prxima, misma
hora, mismo lugar?

- Ciertamente expres Diego en tono pretendidamente sereno.

8
Captulo 2
rase una vez
un Proyecto

Travel Agency & Co. es una novel compaa de venta de tickets de viajes y turismo
que ha contratado a la software house ACME Business Software Solutions a fin de
que le sea desarrollado un sitio en Internet que permita a sus clientes realizar
bsquedas de destinos, de vuelos existentes, de servicios brindados, reservar tickets
y obtener pasajes y servicios tursticos. Incluir tambin todo el back-end para el
mantenimiento de la informacin relacionada.
ACME, que viene trabajando con GeneXus en sus sucesivas versiones desde hace
un tiempo, est integrada por varios tcnicos; entre todos ellos, Julia, Mike y Diego
fueron los seleccionados para llevar adelante este desarrollo. Diego y Mike son
Analistas GeneXus y los que normalmente se encargan de la implementacin que
les toque en suerte. En particular, Mike se encarga casi siempre de la tarea de
testear las aplicaciones, mientras que Diego se encarga del desarrollo. Julia, en
cambio, no es tcnica en GeneXus, si bien ha trabajado en muchos proyectos rele-
vando requerimientos; su especialidad es documentar y moderar las charlas entre
los integrantes del equipo a medida que se van produciendo los avances. El hecho
es que los tres conforman un equipo donde todos tienen voz y voto.
Las primeras tareas recaen sobre los hombros de Julia y Diego, mientras Mike
realiza los testings de las otras aplicaciones de ACME en curso para los desarrollos
en otros clientes.
Desde siempre, Julia documentaba en procesadores de texto, y en proyectos de
envergadura le resultaba extremadamente engorroso el mantener decenas de car-
petas con cientos de archivos, conjugarlos entre los desarrolladores, coordinar las
discusiones del equipo (cuando lograba hacerlo), entre otras tareas. Usted com-
prender el impacto que sinti luego de enterarse que GeneXus Rocha contena, en
forma embebida, un perfil de documentacin muy particular que facilitara su vida
de ahora en ms.

9
El tiempo es tirano
Un breve tiempo atrs, los directores y el equipo de desarrollo se pusieron de
acuerdo en el objetivo de un proyecto a corto plazo, tres semanas o algo as. El
hecho de que iban a trabajar con GeneXus Rocha, a sabiendas del gran aumento de
usabilidad y productividad que sta traa incorporado, les haba permitido reducir a
la mitad los plazos que normalmente pactaban con sus clientes.

Es necesario un dramtico aumento de productividad [en el desarrollo de sistemas]


pero la productividad de los lenguajes de programacin ha llegado hace ya bastante
tiempo a una estabilizacin Cmo lograr, entonces, el aumento de productividad
que se necesita? Haciendo desarrollo basado en conocimiento y no en programacin:
la solucin es describir en vez de programar! Breogn Gonda & Nicols Jodal

Afortunadamente, Travel Agency & Co. ya tena su esquema interno de funciona-


miento bastante slido, con abundante documentacin, y esto ya era una ventaja
para el equipo de desarrollo. Julia, Diego y Mike acordaron que deban tener re-
uniones en forma paralela con los involucrados de cada sector e ir recogiendo sus
visiones.

Cada usuario tiene una o mltiples visiones de los datos que utiliza cotidianamente.
Entre estas visiones, podemos pensar en un primer tipo: el que agrupa aquellas que
se utilizan para manipular los datos (introducirlos, modificarlos, eliminarlos y
visualizarlos en forma limitada), a estas visiones de usuarios les hemos llamado
Transacciones y constituyen el primer objeto-tipo de GeneXus
Breogn Gonda & Nicols Jodal.

Queran rpidamente comenzar a representar la realidad de la empresa; entre


otras cosas, detectaron que Travel Agency & Co. apuntaba fundamentalmente al
turismo de diversin y esparcimiento con destinos muy variados en el mundo.
Qu les deca esto? Antes que nada, que si los destinos eran puntos tursticos de
ciudades distribuidas a lo largo y ancho del mundo, deban disponer de un almace-
namiento para ello.
Es as que el equipo completo se reuni, y luego de intercambiar notas e impresio-
nes, concordaron en que Julia comenzara a describir las primeras pautas obteni-
das, mientras el resto, en especial Diego, comenzara a representar en GeneXus
aquellas visiones de los usuarios ms claramente descriptas.

10
El IDE a primera vista
Ahora intentemos adentrarnos un poco en el ambiente de desarrollo de GeneXus
Rocha. Si usted lo desea podr seguir los pasos de Julia para tomar contacto con
los elementos que componen este ambiente. As, crear la base de conocimiento
del proyecto y el primer objeto de tipo Transaccin.

Generalmente conocido por sus siglas (IDE, Integrated Development Environment),


en realidad este ambiente de desarrollo supera largamente el verdadero significa-
do de las siglas en su acepcin ms general.

Por qu? Porque el concepto ms elemental de IDE es el de un ambiente que


ofrece una buena dosis de comodidad, de ventanas en donde seleccionar elemen-
tos, de ventanas donde codificar, de cajas de herramientas y de fuentes, y alguna
cosa ms.

Sin embargo, el IDE de GeneXus Rocha no solo satisface las mnimas especificacio-
nes, sino que pone al alcance del usuario mecanismos de operatividad integral que
van ms all.

Julia inici la sesin y apareci ante su vista una imagen semejante a la que se
ilustra a continuacin.

Panels

11
Inicialmente, podemos notar dos reas contenedoras claramente definidas. A la iz-
quierda, tenemos el contenedor KnowledgeBase Navigator; su objetivo es ofrecer
distintas vistas. Est compuesto por una zona (ahora en blanco) que contendr, en
forma de rbol, los elementos que integren la base de conocimiento en uso, y un
grupo de paneles horizontales rotulados con descripciones inherentes a otras vistas.

La ventana de la derecha, que podramos considerar la principal (la mayor parte de


nuestra actividad se realizar en ella y as la llamaremos de ahora en adelante), es
en principio otro contenedor de mltiples funciones.

Note que en su esquina superior izquierda se encuentra un tab rotulado Start Page.
Es el primer contenedor abierto dentro de la ventana principal. A medida que usted
vaya trabajando, la presencia de nuevos tabs indicar la disposicin de nuevos
espacios conteniendo elementos del proyecto tales como listados de navegacin,
diagramas, estructuras de transacciones, etc.

Ahora veamos el contenido del nico tab que tenemos. Observe que incluye otros
contenedores con informacin. Por ejemplo, Recent Knowledge Bases nos ofrece
los nombres de las ltimas bases de conocimiento que han sido abiertas, con sus
fechas de ltima modificacin; note que tambin estn presentes links que permi-
ten abrir o crear una nueva base de conocimiento.

Debajo, un contenedor Extensions presenta herramientas desarrolladas por Artech


o terceros, que pueden ser instaladas y utilizadas libremente, y permiten extender
en todas direcciones la potencia de la herramienta.

El sector rotulado GeneXus Community, contiene sindicaciones de contenidos de


sitios Web vinculados a la Comunidad que se actualizan con frecuencia (RSS). Note
que debajo de cada noticia aparece More como link al documento propuesto.

A su vez observe la celda Address que le permitir navegar por la Web o por su
sistema de archivos sin salir del IDE.

As que, ya habiendo hecho un primer reconocimiento, inmiscuymonos en el que-


hacer de Julia.

12
Proyecto nuevo,
Base de Conocimiento nueva

La primera tarea cuando se comienza a desarrollar una aplicacin con GeneXus es


crear la base de conocimiento.

En el siguiente encuentro que mantuvieron en el caf, Mary, con ojos an graves,


pregunt:

- Me contaste que GeneXus automatiza la creacin de base de datos y progra-


mas, pero cmo sabe en qu ambiente, en qu lenguaje debe codificar esos
programas? Por ejemplo, si tuvieras que desarrollar una aplicacin en Java y
suponte, otra, o la misma, en C# (.Net)

- Bueno, cuando creas la Knowledge Base (le solemos llamar KB para abreviar)
le puedes decir que quieres generar el proyecto en un ambiente Java. Como ya
hablamos, la KB es independiente de la plataforma de ejecucin: si t gene-
raste la aplicacin Java, ms adelante, con el mismo conocimiento, puedes
generarla para C#, y no tienes que volver a describir los objetos de la realidad
que ya habas descrito. Simplemente tienes que indicarle que ahora necesitas
asociarle otro ambiente. Cuando le asocias un ambiente, tiene por ah un lugar
donde especificar todo lo referido al mismo. Por ejemplo, en Java tendrs que
indicar cosas tales como dnde estarn las clases en la webapp, algo que en
.Net no tiene sentido. Es decir, en base al ambiente que hayas elegido, te
muestra propiedades necesarias para configurarlo, para que GeneXus pueda
luego decirte: sus deseos son rdenes y te implemente la aplicacin como se
lo pediste.

Casualmente, mientras Diego y Mary intercambiaban palabras y miradas en el


caf, Julia realizaba esos mismos pasos que lo invitamos a seguir a usted tam-
bin.

1. Seleccione File/New/Knowledge Base (o el link New Knowledge Base de la


Start Page). A continuacin ver en la pantalla el siguiente dilogo:

13
TravelAgency

Observe cmo desde aqu se asocia un ambiente de implementacin al proyec-


to. Dejamos la opcin por defecto, C# Environment.

2. Pulse [Create]. GeneXus crear una base de conocimiento vaca, y usted debe-
ra ver una imagen semejante a la que se observa a continuacin.

14
Observe que han cambiado algunos contenidos. En el panel Folder View ha
aparecido un rbol cuya raz es la propia base de conocimiento (con el nombre
que usted le ha dado) y sus ramas los distintos elementos que la componen:
Domains, Tables, Themes, Images, Documentation, Objects, etc.

Tambin note que se ha agregado un nuevo sector dentro de la Start Page


rotulado Knowledge Navigator conteniendo atajos a las tareas ms comunes
que probablemente usted querr ejecutar luego de haber creado o abierto una
base de conocimiento.

Sobre esta base de conocimiento trabajarn los dems integrantes del equipo;
Julia est ahora pronta para comenzar a documentar.

Documentando desde dentro


Documentos, notas, listas de tareas, son solo ejemplos de la documentacin que
rodea a cualquier proceso de desarrollo de software. La documentacin es una
parte importante de cualquier aplicacin si se encuentra actualizada y es fcilmen-
te accesible. Esta es la razn por la cual GeneXus contiene funcionalidades de
documentacin integradas a la KB.

Documentos, archivos, diagramas, objetos pueden estar todos interrelacionados


mediante links, fcilmente accesibles por cualquier miembro del equipo. Por tal
razn decimos que la documentacin es activa e integrada, constituyendo un ver-
dadero wiki.

15
Files
Julia haba recibido por e-mail varios archivos de documento de los jefes de seccin
de cada departamento con requerimientos para el sistema, donde listaban las prio-
ridades y caractersticas de sus sectores, algunos flujos de procesos, etc.

Como estos documentos ya estaban hechos por terceros, decidi que sera impor-
tante incorporarlos en su estado original dentro de la base de conocimiento, de
forma tal que siempre estuvieran disponibles para su consulta. Eran importantes
las palabras de los usuarios expuestas por ellos mismos.

As, expandi el nodo Documentation del rbol y seleccion Files abrindolo con
doble clic. Como resultado, un nuevo tab apareci dentro de la ventana principal,
rotulado Files. All presion Add New File y se le abri una ventana que le permiti
explorar su sistema de archivos, y elegir cada archivo a ser insertado en la KB. As
qued el tab Files luego de esto.

Images
Tambin le haban enviado por e-mail el logo de la empresa, por lo que accedi al
nodo Images del rbol del Folder View e import, almacenndolo en la KB, el
archivo Logo.bmp que sera utilizado en el encabezado de las pginas de la aplica-
cin. En ese mismo e-mail recibi decenas de archivos con imgenes sobre atrac-
ciones tursticas que luego necesitaran almacenar en la base de datos, por lo que
momentneamente las guard tambin aqu, para tenerlas centralizadas en la KB.

16
Main Document
Ahora Julia se apresta a empezar a escribir la pgina principal del wiki de la KB:
observe que bajo el nodo Documentation del rbol aparece un objeto Main Document.
Cada equipo de desarrollo tiene metodologas diferentes respecto a la documenta-
cin. En ACME utilizan esta pgina principal para describir las generalidades del
sistema bajo desarrollo, y para acceder desde aqu a los distintos elementos de
documentacin.

Tambin podra elaborarse aqu mismo el Plan Director del proyecto, en vez de
insertarlo como archivo. Pero usted y su equipo de desarrollo utilizarn esta pgina
como mejor les parezca.

Julia abre Main Document y un nuevo tab aparece en la ventana principal, rotulado
Document: main. Dado que lo que desea es comenzar a escribir, pulsa el selector
Edit que se encuentra al pie de la ventana y redacta lo que se observa en la siguien-
te imagen. Luego pulsa el selector Preview y tiene la vista normalizada de lo que
escribi. Guarda los cambios (Preview se transforma en Browse).

Note que le ha dado algn formato al texto. Para ello se vali de la toolbar formatting:

17
Julia ha cambiado el tipo de letra, su tamao, e incluso puso en
negrita el tpico sobre el cual se comenta.

Pero adems, y bien importante para lograr una documentacin


integrada, Julia necesitaba agregar links hacia los documentos
recibidos e insertados en la KB instantes antes. Para ello se vali
de la toolbox1 , seleccion Table de la misma, arrastrndola a la
pgina y luego de insertada la tabla, escribi:

Queriendo tener una vista previa, presion el selector Preview y, satisfecha, grab,
luego de lo cual se le mostr lo que aparece en la siguiente figura:

1
El IDE de GeneXus ofrece varios paneles con utilidades que se pueden acoplar en cualquier parte de
la ventana y tambin se pueden ocultar automticamente cuando pierden el foco para que no ocupen
sitio en la ventana principal. Usted puede activarlas mediante View/Tool Windows.

18
Observe que como consecuencia de los smbolos que emple en la segunda colum-
na de la tabla, los documentos se encuentran subrayados: son links a los archivos
almacenados. Esto aporta un gran dinamismo a la documentacin, y la integra en
forma activa en el proyecto a travs de la KB.

El editor de documentacin de GeneXus utiliza dos parntesis rectos de apertura


([[) y dos de cierre (]]) en el texto para crear links.

Si usted est siguiendo el ejemplo en forma prctica, habr notado que, apenas
pulsado el segundo parntesis de apertura, el editor le propuso una lista de objetos
vlidos para seleccionar, tal como mostramos en esta imagen:

Julia seleccion File y al digitar . se abri la lista de los archivos disponibles (tam-
bin podra haber arrastrado desde la toolbox el objeto File y habra obtenido igual
resultado que al escribir [[File.).

Entonces seleccion el deseado en cada momento, puls <Enter> y el texto qued


rematado con los dos parntesis finales.

19
Creando la primera Transaccin: Attraction
Diego piensa, mientras conversa con Mary (la mirada perdida en el caf humean-
te), que ya debe dar inicio al volcado de las primeras visiones obtenidas a travs de
los usuarios que entrevist en el Departamento de Informaciones Tursticas de
Travel Agency & Co. Este departamento tiene a cargo la bsqueda de informacin
que agrega o suprime los destinos e itinerarios que ofrece la empresa a sus clien-
tes. Piensa que ni bien vuelva al trabajo, deber crear la transaccin Attraction,
cuando Mary interrumpe su interno discurrir:

- Sabes Diego? No comprendo muy bien cmo puedes describir rigurosamente


las visiones de los usuarios como para que no haya ambigedades y se pueda
inferir todo automticamente.

- Bueno. Recuerdas que te coment que estamos trabajando en un proyecto


nuevo? Bien, pues me he estado reuniendo con los usuarios quienes me conta-
ron que manejan atracciones tursticas de cada pas y ciudad, para poder ofre-
cer a los viajeros. Manejan el nombre de la atraccin, como podra ser Cente-
nario Stadium o Roman Colisseum o Disney World; manejan el nombre de
pas y ciudad al que pertenece la atraccin y una imagen de la misma. Tambin
me contaron que las atracciones estn categorizadas. Por ejemplo, Centenario
Stadium pertenece a la categora Great Monuments o algo as, y Disney
World a Entertainment. Estas son sus visiones de los datos

- Aj. y cmo describes esas visiones objetivamente?

- Mediante atributos y objetos de tipo Transaccin. Djame explicarte un poco.


Los atributos son el marco de referencia sobre el cul hacer las dems descrip-
ciones. No es exactamente lo mismo que un atributo en un modelo relacional.
El atributo es el elemento semntico fundamental. El significado del mismo
vendr dado por su nombre, por lo que los nombres de los atributos pasan a
ser esenciales en GeneXus.

Diego tom una servilleta de papel de la mesa del bar y garabate algunos nom-
bres: AttractionName, CountryName, CityName, AttractionImage,
AttractionCategoryDescription. Y prosigui:

- Estos atributos tienen un contenido semntico claro, que cualquier persona


podr entender sin necesidad de contexto alguno. No son solo Name o
Description. Existe una fuerte relacin entre el nombre del atributo y su

20
significado. Ese nombre, a su vez, es una secuencia de caracteres, algo
sintctico, nico, con lo que cualquier programa puede trabajar, sin ambige-
dad. Si yo coloco AttractionCategoryDescription en algn lado, t y yo sabe-
mos que estamos hablando de la descripcin de la categora de la atraccin.
GeneXus lo reconoce, por su sintaxis.

- Aj, entonces interrumpi Mary- claramente no puedes usar el mismo nom-


bre de atributo cuando quieras referirte a otro dato, pues ah s habra confu-
sin y ambigedad.

- Exacto. Un atributo deber tener el mismo nombre en todos los lugares donde
aparezca y no podr haber dos atributos diferentes, con significado diferente,
que compartan el mismo nombre. En eso se basa. Hay una excepcin, pero no
te quiero confundir ahora. Estas visiones que me expresaron los usuarios,
corresponden a aquellas que se utilizan para manipular los datos (ingresarlos,
modificarlos, eliminarlos, visualizarlos), y son las que se representan en GeneXus
mediante el objeto de tipo Transaccin. Cada transaccin tiene un conjunto de
elementos: una estructura, reglas, frmulas, elementos de presentacin. Es
decir, en un mismo objeto, se matan varios pjaros de un tiro: al tiempo que
dices con qu informacin se va a trabajar, tambin diseas la pantalla que se
desplegar al usuario final para hacerlo, declaras el comportamiento que de-
bern tener esos datos cuando se vayan ingresando, y dems.

Diego volvi a tomar la servilleta que haba dejado sobre la mesa, y esta vez
escribi (y luego dijo):

- Los datos se presentan de acuerdo a una estructura que debe recogerse con
todo rigor. Esta sera la estructura de la transaccin Attraction. El asterisco que
sigue a AttractionId significa que para cada atraccin, existe un nico
AttractionId, es decir, es lo que le da unicidad a la atraccin: un identificador.

21
Toda informacin debe poder identificarse. Una atraccin debe identificarse
mediante algn o algunos de sus atributos.

- Espera Diego. Me surgen algunas dudas en definitiva me ests hablando


del concepto de clave primaria de una tabla en un modelo relacional? Esos
atributos que listas no sern las columnas de una tabla fsica que almacenar
esa informacin? En definitiva, con la transaccin, no ests diseando una
tabla?

- S, indirectamente. Y no: yo no me preocup de disear una tabla fsica del


modelo relacional. Solamente me limit a especificar los atributos con los que
el usuario final interactuar al ingresar atracciones al sistema. Especifiqu una
vista de usuario, no una tabla. Aqu entra lo de la ingeniera inversa y el
Modelo Relacional inferido por GeneXus. Si no hubiesen ms transacciones
que sta en la base de conocimiento, entonces GeneXus inferira una tabla
fsica compuesta exactamente por los atributos listados. Pero la cosa cambia si
existen otras transacciones compartiendo algunos de los atributos menciona-
dos. All habr que normalizar. Pero no me quiero apurar, espera un poco que
ya te contar de esa parte.

- Creo que te voy entendiendo, Diego. Pero me llama la atencin que pusiste en
la estructura de la transaccin atributos que no dijiste que hubieran menciona-
do los usuarios. Todos los que terminan con Id Por otro lado, por qu no
utilizaste el nombre de la atraccin como identificador?

- Y si el nombre de la atraccin pudiera repetirse para atracciones de distintos


pases y ciudades? Suponte: Disney World que existe en Pars, Miami, Las
Vegas, Orlando. En este caso, necesitamos un atributo que d unicidad al
conjunto de elementos de informacin que constituyen una atraccin. Toda
estructura de transaccin debe tener un atributo o atributos que identifiquen a
cada instancia. En principio, en esta transaccin, coincidir exactamente con
la clave primaria de la tabla inferida. Pero no siempre ser as, como vers
cuando te muestre un ejemplo de transaccin con niveles. No te preocupes
ahora. En nuestro caso, podremos decirle a GeneXus que AttractionId ser
numrico y que queremos que se numere automticamente.

- Y qu me dices de los atributos AttractionCategoryId, CountryId, CityId? Ms


identificadores?

22
- S, sern identificadores en otras transacciones. Me explico: evidentemente
los pases y ciudades, as como las categoras de atracciones, corresponden en
s mismas a entidades independientes de la atraccin turstica. Por ejemplo,
no hemos entrado a ver eso an con este cliente, pero evidentemente los
vuelos areos tambin tendrn pas y ciudad (de origen y de destino). Es decir,
resulta evidente que deberemos crear una transaccin para representar e in-
gresar la informacin de pases y sus ciudades, as como de las categoras de
atracciones existentes. Esos identificadores de los que me preguntabas, sern,
casualmente, los que identifiquen cada dato (instancia) de estos.

- A ver si entiendo: una vez que definas esas otras transacciones, GeneXus
inferir tablas para almacenar los datos que manipulan, y a partir de all, se
dar cuenta que esos atributos que colocaste en la estructura de la transaccin
Attraction, (AttractionCategoryId, CountryId y CityId) son los que se traduci-
ran en claves forneas en la tabla relacional asociada.

- Sigues siendo la misma luz de siempre, Mary! exclam Diego con ojos
plenos de fascinacin.

- Pero entonces, qu hacen en esa estructura CountryName, CityName,


AttractionCategoryDescription? En un modelo relacional normalizado nunca
podran estar en esa tabla.

- Es que no lo estarn, por eso te deca que la estructura de una transaccin no


se corresponde exactamente con la de la tabla fsica asociada. Ya te lo expli-
car, no quiero abrumarte con detalles. Traer mi notebook al prximo en-
cuentro porque lo habr, no? pregunt Diego no sin cierta timidez-, y te
mostrar

Ahora el lector ver los pasos que sigui Diego en la creacin de la transaccin
mediante el IDE de GeneXus al da siguiente en su trabajo.

Primero que nada, seleccion el link New Object de la Start Page y apareci a su
vista la ventana cuyo dilogo permite la creacin de un objeto dentro de la KB. De
la caja Select a Type, con la lista de objetos GeneXus disponibles, seleccion
Transaction y luego, en la celda Name escribi el nombre Attraction, quedando
una imagen semejante a la que se muestra a continuacin.

23
A continuacin, puls [Create], tras lo cual la transaccin se abri.

Obsrvese en la imagen siguiente que aparece un nuevo tab en la ventana princi-


pal con el nombre de la transaccin. Qu se est editando? Una parte de la tran-
saccin: su estructura.

Los objetos que se abren en la ventana principal del IDE aparecen como tabs, donde
uno solo, el activo, se presenta en la ventana central. El objeto abierto puede tener
varios elementos o partes, en cuyo caso ser uno el activo en cada oportunidad. En el
tope inferior de la ventana, aparece una barra de acceso que permite seleccionar
otra de las partes del objeto activo.

La ventana de edicin de la estructura contiene una serie de columnas que el


desarrollador utiliza para crear un atributo; es decir, darle un nombre, un tipo de
dato, una descripcin, etc.

24
Selectors

Corresponde en GeneXus, a la estructura dibujada por Diego en una servilleta de


papel. Diego asign nombres a los atributos utilizando lo que se conoce como
nomenclatura GIK (GeneXus Incremental Knowledge), un estndar creado por Artech
y adoptado desde siempre por la Comunidad, cuyo fin es dotar a un atributo de un
nombre nico que transmita lo ms claramente posible su concepto, su semntica.

Usted habr deducido correctamente que la columna Type pretende dotar al atri-
buto con alguno de los tipos de datos soportados por GeneXus.

25
El tipo de datos Blob posibilita el almacenar una gran diversidad de tipos de infor-
macin (videos, planillas, documentos de todo tipo, archivos de msica, imgenes
digitalizadas, etc.) en la propia base de datos. La idea del atributo AttractionImage
es justamente almacenar una imagen de la atraccin, que podr ser un archivo
bmp, jpg, etc.

La columna Description pretende que se asigne una descripcin ampliada del atri-
buto. Por ahora dejaremos las sugerencias de GeneXus a partir del nombre del
atributo.

Para continuar agregando atributos, simplemente pulse <Enter> luego de termi-


nada una definicin y repita el mecanismo.

Atributos Clave. Como puede usted apreciar, el atributo clave que Diego indicaba
con un asterisco en la servilleta, se indica en GeneXus por el cono de una llave.

Atributo Descriptor. Y qu significa el cono de lupa al lado del atributo


AttractionName? Es una forma de indicar que si uno tuviera que quedarse con uno
solo de todos los atributos, de forma tal que sea el que mejor describa a la entidad,
se ser el elegido (el de mayor carga semntica). Ahora no nos preocuparemos de
esto, servir a herramientas que automaticen, no a nosotros

Cuando Diego estaba asignando el tipo de datos en la columna Type para el atribu-
to AttractionName, consider oportuno crear un dominio Name para todos los atri-
butos que fueran nombres de algo, as como uno Id para todos los que tuvieran la
caracterstica de ser identificadores numricos.

Usted estar ya acostumbrado a trabajar con Dominios. Si no es as, lea el siguien-


te prrafo que le aclarar la cuestin.

Dominios?: Es comn en las aplicaciones tener atributos que comparten las


mismas definiciones de tipo de dato, tamao y algunas otras caractersticas. Por
ejemplo, en la transaccin Attraction hay varios atributos que son Id (AttractionId,
AttractionCategoryId, CityId, y CountryId). Diego ha creado un dominio al que
llam Id, con todas las caractersticas propias de los identificadores y se lo aplicar
a todos aquellos atributos que tengan la funcionalidad de representar un valor
inexistente en la realidad pero necesario para lograr la unicidad.

26
Cada dominio es un conjunto de caractersticas nicas que pueden ser compartidas
por varios atributos. Esto proporciona consistencia y facilita el mantenimiento, ya
que cambiando alguna de las caractersticas de un dominio se provocar la propaga-
cin del cambio a todos los atributos basados en l.

Definicin de Dominios 2
Diego hizo doble clic sobre el nodo Domains en el rbol del Folder View tras lo cual
se abri en la ventana principal el tab que muestra y permite editar dominios.
Ingres as los dominios Id y Name. El mecanismo es semejante al de crear atribu-
tos en una transaccin.

Existen algunos dominios que son creados automticamente por GeneXus cuando
se crea la KB.

Teniendo los primeros dominios definidos, Diego prosigui con la transaccin hasta
que sta qued tal como mostramos anteriormente, solo que en vez de ver los
tipos de datos como Numeric y Character, stos se ven ahora como Id y Name.

2
En general en GeneXus existen varios caminos que le permiten realizar lo mismo, para que el efectuar
su tarea le resulte siempre cmodo. Por ello, esta no ser la nica va para definir un dominio; de hecho
podr hacerlo en el mismo momento en que asigna el tipo de datos a un atributo.

27
La Tabla ATTRACTION
Por defecto, cuando GeneXus disea las tablas les asigna como nombre el mismo
que el de la transaccin en la que estn basadas3. En todo momento puede verse el
diseo de la tabla (su estructura, ndices, etc.) abriendo el nodo Tables del rbol que
se encuentra en el panel Folder View. Para ATTRACTION se ver la siguiente imagen.

Dada la estructura de la transaccin, GeneXus disear tambin un form para la


misma, que ser la pantalla a travs de la cual el usuario ingresar atracciones.
Puede verse escogiendo el selector WebForm de la barra de acceso:

3
En lo que sigue en este material, para diferenciar los nombres de las tablas de los de las transacciones
usted ver a las tablas escritas en maysculas.

28
Este form podr ser personalizado, moviendo de lugar, insertando, modificando,
eliminando controles, cambiando su aspecto, etc. A travs de esta pantalla, en
ejecucin, el usuario final manipular las atracciones.

Conforme con el resultado, Diego record que no haba documentado nada sobre la
transaccin. Es norma de los integrantes de ACME el ir documentando a medida
que se producen los avances, sobre todo en lo que respecta a las entidades, tal
como la transaccin Attraction.

As que abri Main Document, insert una nueva tabla, esta vez titulada Objects
y agreg en la primera fila un link hacia la transaccin recin creada (del mismo
modo en que lo hizo Julia varias pginas atrs, al incluir los links a los documen-
tos), junto con una breve descripcin.

Podemos ver Attraction como link. Qu suceder cuando Diego haga clic sobre el
mismo? Se abrir un nuevo tab de documentacin, esta vez de la transaccin,
donde podr editarla, e incluso abrir la propia transaccin:

29
Supngase que necesita abrir la transaccin para mirar su estructura antes de
documentar. Pues siguiendo el link Open Transaction: Attraction, podr hacerlo, y
luego para efectivamente ir a la ventana de edicin de la documentacin, podr
directamente elegir el selector Documentation. Como podr constatar usted mis-
mo, estimado lector, en GeneXus tambin aplica aquello de que varios caminos
conducen a Roma.

30
Creando la segunda Transaccin: Country
Luego Diego se aboc a crear la transaccin que contendra la informacin inherente a
los pases y ciudades. Tena dibujada la estructura en la servilleta de papel que decidi
guardarse en un bolsillo cuando se despidi de Mary en el encuentro anterior:

Ya que tena abierto Main Document, esta vez empez por ah. Agreg un nuevo
link en la tabla, ahora a la transaccin Country. Pero todava no la haba creado!
Observe que aparece un link, s, pero sobre un smbolo ?:

Cuando Diego haga clic sobre ? automticamente se crear la transaccin que


aparecer abierta en la estructura, lista para que l comience a ingresar los atribu-
tos, y el link quedar ahora definido en Main Document. (No queremos ser reitera-
tivos, pero cmo era aquello de los caminos a Roma?).

31
Country: una Transaccin de dos niveles
Como todos sabemos, los pases contienen ciudades, es decir, la realidad dictamina
que se tienen n cantidad de ciudades por pas. GeneXus dispone de una forma muy
sencilla y prctica de representar esta realidad, y lo hace a travs de transacciones
de dos niveles.

La transaccin Country consta entonces de dos niveles: el primer nivel, tambin


conocido como prlogo o simplemente cabezal, queda de hecho implcito, por lo
que no es necesario identificarlo. En este caso, los atributos del prlogo implican
que habr una sola instancia para cada pas.

Sin embargo, como existen varias ciudades para un mismo pas, se recurre a una
representacin (en el papel: se recurre a un juego de parntesis) que determina un
grupo de atributos que son repetitivos para el prlogo: se lo conoce como cuerpo
o segundo nivel.

Ahora, note usted que ambos niveles (cabezal y cuerpo) tienen identificadores
propios: el atributo CountryId es el identificador del primer nivel, y el atributo
CityId es el identificador del segundo nivel, lo que significa que para un pas dado
(CountryId) no puede repetirse la misma ciudad (CityId).

A partir de esta estructura, GeneXus determina que debe crear dos tablas: la tabla
COUNTRY y la tabla COUNTRYCITY. En la primera, la clave primaria es CountryId,
mientras en que la segunda, la clave primaria est compuesta por CountryId y
CityId.

La siguiente imagen muestra cmo qued la estructura luego de que Diego la


ingresara4.

4
Obsrvese que aparecen nuevos dominios. Es de suponer que Diego los cre, o bien antes o bien en
el mismo momento de ingresar estos atributos, por ejemplo, al ingresar CountryFullName, en la colum-
na Type pudo haber digitado: LongName = Character(50) con el mismo resultado. Suponiendo que
Diego ya tuviera definido un dominio Details como VarChar(500,200), tambin es interesante destacar
que cuando inserte el atributo CountryDetails, GeneXus ya inferir como su tipo de datos, el dominio
Details (ya que lo contiene como ltima parte de su nombre)

32
Para insertar un segundo nivel en una transaccin, sitese en el atributo anterior y
pulse <Ctrl+L> (en este caso, sitese sobre el atributo CountryFlag). Luego prosiga
con el resto de los atributos segn el mecanismo natural. Tambin lo logra haciendo
botn derecho sobre el atributo, donde se le desplegar un men contextual para,
por ejemplo, insertar un nuevo nivel, mover el atributo de lugar, etc. Obsrvese
tambin que Diego le ha dado un nombre al nivel.

Normalizacin de la Base de Datos


Al definir la transaccin Country se produjeron algunos cambios importantes. En
particular, la tabla ATTRACTION ha variado en su composicin por la sencilla razn
de que GeneXus la ha normalizado en virtud de las nuevas dependencias funciona-
les que se introducen. Vea las composiciones de las tablas ahora.

33
Percibe los cambios? Al crear la transaccin Country, y al designar a los atributos
CountryId y CityId como identificadores de sus respectivos niveles, se est dicien-
do que:

1. Todo pas se identificar (de manera nica) por el valor de CountryId y que
este valor tendr asociado (determinar) un CountryName (y solo uno),
CountryFullName, etc. En un Modelo Relacional normalizado, esto deriva en
una tabla fsica con clave primaria CountryId para almacenar esta informacin
respetando esta unicidad establecida.

2. Toda ciudad se identificar para un pas dado (CountryId), por el valor de


CityId, y que por tanto, este par (CountryId, CityId) determinar un CityName
y CityInformation. De esto se desprende que deber existir una tabla fsica con
clave primaria {CountryId, CityId} para almacenar la informacin de cada
ciudad1 .

Pero entonces: qu hace GeneXus con los atributos de igual nombre en diferentes
transacciones?

Teniendo presentes los dos enunciados mandatarios en la filosofa GeneXus:

Conceptos iguales deben tener el mismo nombre de atributo, y


Conceptos diferentes no deben tener el mismo nombre de atributo.

5
Observe que GeneXus nombra la tabla concatenando el nombre de la transaccin al nombre del nivel:
COUNTRYCITY

34
encontrar atributos de igual nombre en distintas transacciones solo puede que-
rer decir una cosa: son lo mismo!. Entonces qu puede hacer GeneXus para
mantener la base de datos inferida normalizada? Transformar en la tabla
ATTRACTION a los atributos CountryId y CityId en claves forneas, y quitar,
por tanto, a los atributos CountryName y CityName de dicha tabla (pasan a
poder inferirse a travs de los anteriores; si se dejaran se tendra informacin
redundante).

Atributos: almacenados e inferidos

Aqu viene a cuenta la pregunta que Mary le hiciera a Diego sobre la confusa
presencia de los atributos CountryName y CityName referenciados en la estructura
de la transaccin Attraction, dado que no van a estar presentes en la tabla fsica
asociada para qu Diego los coloc en Attraction entonces?

Si el lector revisa unas pginas atrs (pg. 28) y observa el form de la transaccin
podr constatar que aparecen esos atributos. Para qu?

La transaccin se va a convertir en un programa ejecutndose. El usuario final va a


acceder a la transaccin mediante su Browser, y a travs de una pantalla cuyo
diseo ser el del WebForm, podr, por ejemplo, ingresar una nueva atraccin
(nuevo registro en la tabla ATTRACTION subyacente). Sera deseable que cuando el
usuario final colocara un identificador de pas en el campo correspondiente a
CountryId, y uno de ciudad en CityId pudiera visualizar automticamente el nom-
bre de dicho pas, CountryName y de dicha ciudad, CityName. Es decir, que
CountryName y CityName sean trados en ejecucin de las tablas COUNTRY y
COUNTRYCITY a travs de la clave fornea {CountryId, CityId}. Para poder colocar
en el form atributos a los que se llega a travs de claves forneas, es necesario que
estn presentes, inferidos, en la estructura.

Qu sucedera si el usuario digitara para CountryId, CityId un par de valores


inexistentes? Y si mediante la transaccin Country se quisiera eliminar una
ciudad para la que existieran atracciones? Si se nos permitieran hacer estas
operaciones, se estara violando una de las condiciones ms importantes de los
modelos relacionales para mantener la consistencia de los datos: la integridad
referencial.

35
Integridad Referencial
Diego comunic a Julia que ya haba definido las dos primeras transacciones. A los
efectos de comprobar que el modelo reflejara la realidad, ella hizo un Diagrama de
Bachman sobre las tablas inferidas por GeneXus a partir de las transacciones.

Para ello expandi el nodo Tables del contenedor Folder View, luego puls <Ctrl+N>,
tras lo cual se abri la ventana New Object donde seleccion el objeto Diagrams
para finalmente pulsar [Create]. Seleccion las tres tablas simultneamente y las
arrastr hacia la hoja en blanco, obteniendo el siguiente resultado.

En este tipo de diagrama, la punta simple de la flecha representa la existencia de


una instancia de la tabla apuntada para cada instancia de la otra; es decir: para
cada ciudad existe solo un pas; para cada atraccin turstica existe una sola ciu-
dad. Recprocamente, la punta doble representa la ocurrencia de varias instancias
de la tabla apuntada para cada instancia de la otra, es decir: para cada pas existen
muchas ciudades relacionadas; para cada ciudad muchas atracciones.

Esto permite determinar las relaciones entre ellas. Por ejemplo, la relacin entre
COUNTRY y COUNTRYCITY es de 1 a N (1 a muchos) y viceversa es N a 1 (muchos
a 1). La de COUNTRYCITY con ATTRACTION tambin es 1 a N.

Para asegurar la integridad referencial, deber entonces controlarse que cuando se


inserte o modifique un registro en la tabla ATTRACTION, exista el registro relacio-
nado en la tabla COUNTRYCITY. Y cuando se elimine un registro de la tabla

36
COUNTRYCITY, no existan registros en la tabla ATTRACTION relacionados. GeneXus
resuelve esto automticamente, agregando esta lgica a las transacciones Attraction
y Country, en forma transparente para el desarrollador. Anlogas consideraciones
pueden hacerse respecto a los controles sobre las tablas relacionadas COUNTRY y
COUNTRYCITY.

Concepto de Tabla Base


y Tabla Extendida
Mientras Julia comprobaba que estuviera todo bien, al recuerdo de Diego vinieron
fragmentos de la ltima conversacin en el bar:

- Mira, Mary, por una cuestin prctica, le llamamos tabla base, en el contexto
que sea, a la tabla en la que ests parada en un momento dado, la que sea
foco de tu atencin en ese momento, en el que ests queriendo hacer algo con
sus registros. As es que en la transaccin Attraction, decimos que su tabla
base es la del mismo nombre, porque siempre que trabajes con la transaccin,
vas a trabajar con un registro de esa tabla, ya sea para insertarlo, modificarlo,
o eliminarlo. Y luego vas a seguir por otro, y por otro y por otro. Pero adems,
cuando ests trabajando con un registro individual de una tabla base, podras
acceder tambin a la informacin que est unvocamente relacionada con l,
de otras tablas.

- Aj, siguiendo las relaciones N a 1, desde el registro de la dijiste tabla base?


en la que estemos parados, hasta llegar al registro que tiene la informacin
que queremos. S, no hay nada nuevo en eso.

- Es verdad. Solo la terminologa: le llamaremos tabla extendida de una tabla


base dada, al conjunto de las tablas a las que se llega partiendo de la tabla
base, a travs de relaciones N a 1.

- A ver si entiendo Si no fuera por la necesidad de tener la informacin


desperdigada en varias tablas para evitar redundancias, la tendras toda en
una misma tabla fsica. En el caso de las atracciones, tendras una sola gran
tabla con todos los atributos de ATTRACTION, ms los atributos de
COUNTRYCITY, ms los de COUNTRY. No puedes, por lo de las posibles
inconsistencias que provienen de redundar datos, pero de todas formas le
das un nombre a la tabla que tendras si s pudieras: y ese es el concepto de
tabla extendida. Una tabla que fsicamente no existe, pero que te la imagi-
nas.

37
- Absolutamente cierto. Vers que utilizamos el concepto a lo largo y ancho de
GeneXus y por eso se le ha puesto un nombre.

Mientras Diego permaneca absorto en sus recuerdos, Julia comprob que se cum-
plan correctamente las necesidades de accesos a la informacin entre las tablas.

Mirando un Diagrama de Bachman es fcil determinar cul es la tabla extendida de


cada tabla (base). Todas las tablas a las cuales se pueda llegar siguiendo las flechas
de punta simple (relaciones N-1) desde la tabla base, formarn parte de su tabla
extendida. La tabla extendida no tiene existencia fsica, sino solo conceptual. Nos
permitir referirnos a la informacin unvocamente relacionada con el registro en el
que estemos posicionados.

Comenzando a Prototipar
Para poder dejarle paso a Mike, y que ste pueda comenzar a jugar su papel de
tester del proyecto, Diego puls <F5> para dar comienzo a la prototipacin.

Con GeneXus no hay diferencia entre prototipar e implementar el sistema. La


prototipacin no es ni ms ni menos que la aplicacin generada en una plataforma
determinada: lo mismo que la aplicacin final! La diferencia entre una cosa y otra es
solamente el uso que se le da.

Recuerde que ya se haba seleccionado el ambiente cuando se cre la KB, de modo


que varias propiedades ya aparecan configuradas6, entre ellas el DBMS Default,
SQLServer. Pero an falta algo para poder implementar el sistema Un asistente le
pedir a Diego la informacin del servidor de DBMS y la base de datos, por esta
nica vez. Diego especific localhost y TravelAgencyTest, respectivamente.

6
Si desea modificar alguna de ellas, alcanza con seleccionar el panel Preferentes del contenedor
KnowledgeBase Navigator y all buscar la preferencia a configurar, por ejemplo el DBMS asociado, o el
Lenguaje de implementacin, etc. y con <F4> sus propiedades (en la ventana que se abre).

38
Luego GeneXus proceder a la generacin y ejecucin del Developer Menu7, a fin de
que los desarrolladores puedan ponerse a testear inmediatamente las aplicaciones.
Una vez que el ambiente est completamente configurado, cada vez que se presio-
ne <F5> GeneXus proceder a efectuar todos los pasos pendientes, necesarios
para ejecutar la aplicacin. Diego esperaba ver lo que se observa en la siguiente
imagen: el primer Anlisis de Impacto de esta base de conocimiento.

El Impact Analysis Report (IAR) que estaba observando le deca que se iban a
crear las tablas que se mostraban a la izquierda, y cuyas estructuras y dems
informacin como ndices, etc.8, podan verse a la derecha.

Qu es el Impact Analysis Report? GeneXus disea a partir de la base de conoci-


miento la base de datos. En todo momento pueden hacerse modificaciones a los
objetos existentes, o pueden crearse nuevos objetos, modificndose la KB. El IAR
es el resultado de un anlisis que realiza GeneXus del impacto causado por las
definiciones nuevas o cambios del modelo de desarrollo en una KB, sobre la base
de datos fsica asociada. Por tanto este anlisis tiene por finalidad informar al
desarrollador sobre los cambios estructurales que GeneXus deber llevar a cabo
sobre la base de datos para dejarla en el nuevo estado, consistente con la KB.

7
Un sencillo men de prototipacin creado por GeneXus (es un xml conteniendo links a los distintos
objetos GeneXus creados, para poder invocarlos en forma fcil y rpida como se ver en breve).
8
Obsrvese que abajo se muestran las sentencias SQL que se utilizarn para reorganizar (en este caso
crear) esa tabla.

39
De conformidad con el IAR, Diego puls [Create] dando paso a la reorganizacin de
la base de datos9. Como en este primer paso sta no exista, se va a crear. Ser en
sucesivos cambios que ser reorganizada, en tanto reestructurada. Ahora bien,
cundo se generan los programas? Inmediatamente, listos para ser probados!
Desde que Diego presion <F5> e ingres la informacin que le faltaba a la plata-
forma, hasta que se le abri una ventana del Browser con el Developer Menu listo
para ejecutar, no pas ms de un minuto. Diego estudi detenidamente unos lista-
dos desplegados por GeneXus antes, que le permitieron ver que iba por buen cami-
no pero no se apure, estimado lector, que sobre este punto volveremos ms
adelante y Mike est un poco ansioso por entrar en escena.

Mike 007 con licencia para matar


Era su turno. Deba destrozarlas. A las transacciones, claro.

Con su vista fija en el Developer Menu desplegado en el Browser conteniendo links


a las transacciones, entrecruz sus dedos, los hizo sonar, y tras una breve pausa,
se dijo all vamos.

9
El trmino reorganizar refiere a efectuar cambios fsicos.

40
La idea era comenzar cuanto antes a probar, cargando informacin en la base de
datos recin creada por GeneXus y verificar el comportamiento de las transaccio-
nes. Va a tomar nota de todo, as que tambin se prepara para iniciar una conver-
sacin en la documentacin de la transaccin.

Puls sobre Country y apareci ante su vista una imagen semejante a la que se
observa a continuacin.

Esta es la transaccin Country en plena ejecucin.

Inmediatamente se percat de que el atributo CountryId debera ser autonumerado,


es decir, que el usuario no debera preocuparse por asignarle un valor especfico ya
que CountryId no representa nada de la realidad, es solo un nmero que otorga
unicidad al registro a ser insertado.

41
Asimismo, cuando Mike se enfrent a CountryWorldRegion, atributo numrico de
apenas un dgito, no supo qu valor numrico representaba cada regin del mundo
(cmo indicar que se trata de un pas africano, norteamericano, europeo, etc.?)
Hay que mostrarle al usuario final los nombres de las regiones para que escoja el
apropiado!, se dijo.

As que decidi iniciar con Diego una conversacin sobre el tema, de forma tal que
todos estuvieran de acuerdo sobre lo que propona. Volvi a la KB, ingresando a la
seccin de documentacin de Country.

Agregando conversacin
Entre los selectores que se presentan al abrir la documentacin, aparece uno: Talk,
que tiene por finalidad permitirnos crear un espacio donde establecer un dilogo
con otros usuarios sobre el objeto en cuestin.

Note que el texto indicador superior est declarando un documento Talk para la
transaccin y que finaliza con un signo de interrogacin. Este signo indica que an
no existe una pgina Talk para este objeto, y antes de comenzar a escribir, sta
debe ser creada. Cuando Mike salve este espacio de memoria, se generar una
pgina con su contenido.

Al cliquear sobre el signo de interrogacin, cambi al estado de edicin e ingres el


texto, grab, y pudo ver:

42
Determinando un Atributo Identificador
como Autonumber
Rato despus, en cuanto Diego ley lo que haba escrito Mike, contest positiva-
mente en el Talk de la transaccin Country y se dispuso a realizar los cambios.

Quera que se numerara en forma automtica el atributo CountryId, identificador


numrico, utilizando la funcionalidad Autonumber de los DBMSs que la soportan.

Todos los objetos de GeneXus contienen propiedades que afectan tanto su aparien-
cia como su comportamiento.

Las propiedades de todo objeto, atributo, etc. pueden editarse en cualquier momen-
to con <F4> y se abrirn en una ventana flotante.

Por lo que Diego seleccion el atributo CountryId y puls <F4>.

43
Primeramente, asign el valor True a la propiedad Autonumber, y configur las
propiedades como mostramos en la figura.

Ciruga esttica para un atributo


Para completar el siguiente pedido de Mike en el Talk, Diego se situ en el WebForm
de la transaccin, se posicion sobre el control atributo CountryWorldRegion y
puls <F4>. Ya en la ventana de propiedades del control, en la propiedad
ControlType seleccion Combo Box; a continuacin, seleccion la propiedad
Values para abrir la ventana Values Editor y carg los posibles valores para el
atributo. Eso fue todo.

44
Si en lugar de haber hecho esto especficamente en las propiedades del control
CountryWorldRegion del form lo hubiese hecho en las propiedades del atributo
CountryWorldRegion en la estructura, habra hincado el bistur ms a fondo:
significara que en todos los forms donde se colocase ese atributo, por defecto se
mostrase como Combo Box, con la definicin indicada y no como control Edit.
Cuando se da cuenta de su distraccin, Diego decide hacer esa definicin a nivel de
la estructura. Aqu queda claro cmo es que el conocimiento se infiere en la base de
conocimiento, y es reutilizado.

Reorganizando (reorg)
Diego cambi propiedades de dos atributos de la transaccin Country, esto indi-
rectamente disparar algn cambio en la tabla fsica? Veamos el siguiente Impact
Analysis Report que se observa luego de que Diego pulsara <F5>:

45
S, GeneXus encontr que debe realizar una reorganizacin de la tabla. Note que
ahora aparece el texto Autonumber a la derecha del tipo de datos en el atributo
CountryId. La reorganizacin deber prender esa propiedad a nivel del DBMS.
Pero, qu pas con el otro cambio, con el de CountryWorldRegion? Nada! No se
trata de un cambio a efectuar sobre la base de datos, sino que solamente vale a
nivel de la KB; es esttico, para indicar que en todos los forms donde se presente
ese atributo como control, lo haga como Combo Box. Aqu se evidencia que no
todos los cambios que se efecten en un objeto GeneXus necesariamente provoca-
rn una reorganizacin; mencionaremos otro ejemplo de ello a continuacin cuan-
do hablemos de las reglas de una transaccin.

Diego puede decidir pedirle a GeneXus que haga efectivamente los cambios infor-
mados ([Reorganize]) o cancelar la reorganizacin, con lo cual la prxima vez que
se presione <F5> volver a realizarse el IAR. Elige reorganizar.

Al releer lo charlado en el Talk, con intenciones de contestar que todo fue hecho,
encuentra que Mike propona que por defecto todos los Ids de transacciones fueran
autonumerados. (Su confusin vino a raz de que Mike, en lugar de documentar
esto en el Talk del Main Document, lo hiciera en el de la transaccin Country). Pero
entonces, para implementar eso, tendra que ir uno por uno a cambiar las propie-
dades de esos atributos? No!, pronto record que todos ellos estaban basados en
el dominio Id. Alcanzaba con editar el dominio, sus propiedades y all, de igual
manera que se hizo para el atributo CountryId, encender la propiedad Autonumber
a nivel del dominio. Todos los atributos basados en el presente y en el futuro en
ese dominio, automticamente heredarn la propiedad!

46
PeroUy, problema!, pens Diego. CityId no es clave primaria simple. Para
dotar a un atributo con la caracterstica de autonumerado, ste debe ser clave
primaria simple. CityId es parte de la clave primaria de COUNTRYCITY10.

Cmo hacer, entonces, para que este atributo no tome la propiedad Autonumber
como True dada a su dominio Id?11 Sencillo. Se editan las propiedades del atribu-
to CityId (como antes se hiciera con CountryId) y se modifica la Autonumber,
llevndola a False. Se est cambiando, pues, el comportamiento por defecto dado
por el dominio.

Lo mismo puede decirse del atributo AttractionCategoryId que por el momento es


de Attraction y no es clave primaria, aunque pronto lo ser cuando Diego cree la
nueva transaccin AttractionCategory, unos pasos ms adelante. Por esta razn,
decidi dejar la modificacin en la definicin del dominio Id (para encender el
Autonumber) para ms adelante, cuando cree la nueva transaccin (dejando este
To-Do Diego documentado).

Transacciones: no solo una cara bonita,


tambin personalidad

Diego decidi incorporar a las transacciones el comportamiento que los usuarios


haban descrito respecto a la manipulacin de los datos.

Nunca debe ingresarse al sistema una atraccin a la que no se le haya dado un


nombre. Abri, por tanto, la transaccin Attraction, puls sobre el selector Rules y
escribi lo siguiente:

Error(Attraction must have a name)


if AttractionName.IsEmpty();

En ejecucin, si el usuario dejara vaco el campo AttractionName, le aparecer el


mensaje indicado y el control quedar en el mismo campo sin dejarle continuar.
Tampoco se le permitir grabar el registro en la tabla correspondiente.

10
Para dar valores consecutivos a este atributo, habr, pues, que apelar a una regla: Serial. Le pro-
ponemos la investigue luego de ver algunas reglas.
11
De todas formas, como GeneXus sabe de esta restriccin, si Diego no se hubiera percatado del
problema, GeneXus igualmente hubiera actuado con inteligencia y no hubiera definido el atributo en la
base de datos con autonumber. A efectos didcticos preferimos hacer trabajar a Diego.

47
Nunca debe ingresarse al sistema un pas sin nombre y nombre completo S se
permite no ingresar detalles del pas, pero en este caso se le quiere dar un mensaje
al usuario, advirtindole por si lo dej vaco por distraccin. Seleccion, pues, el
selector Rules de la transaccin Country y escribi las siguientes tres reglas en un
orden cualquiera:

Error(Country must have a name)


if CountryName.IsEmpty();

Error(Country must be in full)


if CountryFullName.IsEmpty();

Msg(No country details were provided. Do you want to continue?)


if CountryDetails.IsEmpty();

La tercera regla tambin emite un mensaje, pero a diferencia de la Error, no traba


el paso del usuario hacia el campo siguiente, y permite grabar el registro.

Existen muchas ms reglas, que permiten programar el comportamiento especfico


que tendr la transaccin. Obsrvese que se escriben siguiendo un estilo declarati-
vo: salvo excepciones no importa el orden. En nuestro caso, se dispararn de acuerdo
al orden en que se encuentren los atributos CountryName, CountryFullName y
CountryDetails en el form.

En una transaccin de dos niveles, se estn manipulando registros de dos ta-


blas. Por tanto, cuando el usuario ingresa un nuevo pas y sus n ciudades me-
diante el form de la transaccin Country, se estarn insertando n + 1 registros:
1 en la tabla COUNTRY y n en la tabla COUNTRYCITY. Se insertarn en el orden
en que se hayan ingresado en el form. Puede querer dispararse una regla inme-
diatamente antes o inmediatamente despus que una grabacin de estas se
efecte. Para ello las reglas pueden condicionarse no solo con clusulas if como
las mostradas, sino tambin con eventos de disparo como son el BeforeInsert
o el AfterInsert.

Luego de grabarse los n+1 registros de la transaccin (cabezal y sus n lneas) se


realiza automticamente un Commit. Puede ser deshabilitado por el analista GeneXus
mediante una propiedad de la transaccin. Tambin existen eventos de disparo de
reglas, que capturan el momento inmediatamente anterior a realizarse el Commit,
o el inmediatamente posterior. Por ejemplo, si quisiera realizarse un listado del
pas recin ingresado con sus respectivas ciudades, podra invocarse a otro objeto
GeneXus de otro tipo: Procedimiento, asegurndose de invocarlo luego de haberse
insertado los n+1 registros, envindole por parmetro el identificador de pas re-
cin ingresado y si se quiere que sea antes del Commit se escribir en la seccin
de reglas:

48
PrintCountry.call( CountryId ) on BeforeComplete;12

Y si se quiere que sea luego del Commit se escribir:

PrintCountry.call( CountryId ) on AfterComplete;

Diego deja documentadas las modificaciones efectuadas. Piense cules fueron los
cambios en la KB desde el <F5> anterior.

Lo que se esconde tras el <F5>


1. Lo primero que hace GeneXus tras un <F5> es un anlisis del impacto que
tendrn los cambios efectuados en la KB, sobre la base de datos. En caso de
que haya impacto, desplegar el Impact Analysis Report, que puede ser confir-
mado, en cuyo paso se reorganizar fsicamente la base de datos, o cancelado,
como ya vimos.

Sabiendo que lo nico que modific desde el anterior <F5> fueron reglas (de la
transaccin Country), anticipa que cuando ahora vuelva a pulsar <F5> no habr
reorganizacin, pero s los pasos que siguen.

2. GeneXus da paso a la etapa de especificacin, que es un anlisis de todo lo


definido en cada uno de los elementos que componen a los objetos que usted
haya cambiado, como por ejemplo, las estructuras, los forms, las reglas incor-
poradas, y ms. Esta tarea da por resultado un listado de navegacin en el
cual GeneXus informa de la lgica que ha interpretado para cada objeto que
haya sufrido cambios desde el <F5> anterior, junto con advertencias y errores
(en caso de haberlos).

En el caso de nuestros amigos, el nico objeto que cambi fue Country, por lo
que esto ser lo que Diego ver tras su <F5>:

12
Obsrvese que se est utilizando un mtodo de invocacin corriente en GeneXus: el Call, que est
apareciendo aqu como una regla. Tambin obsrvese que lo que precede al call es el nombre del
objeto invocado, en nuestro caso ser otro objeto GeneXus, de tipo Procedimiento, y por ltimo,
obsrvese que los eventos de disparo aparecen identificados en la sintaxis de una regla:
Rule if condition on Event
Donde condition es una condicin booleana y Event es uno de los eventos de disparo vlidos, que
invitamos al lector interesado a buscar en las distintas fuentes de documentacin del producto. Listamos
algunos: AfterValidate, BeforeInsert, BeforeUpdate, BeforeDelete, AfterInsert, AfterUpdate, AfterDelete,
BeforeComplete, AfterComplete, etc.

49
No hubo advertencias ni errores. Observe el lector cmo le informa las tablas en las
que se realizarn las grabaciones y la integridad referencial que controlar cuando
se pretenda eliminar un pas, o una ciudad.

3. Luego de especificar, se pasa a la etapa de generar el o los objetos que


GeneXus considere necesarios (si hay objetos que no han variado, y fueron
generados en un <F5> anterior, para qu hacerlo nuevamente?!) para que la
ejecucin pueda realizarse en forma completa. La generacin implica la escri-
tura de lneas de cdigo que implementen la programacin de los objetos en el
lenguaje elegido por usted.

4. Por ltimo, GeneXus compila y ejecuta la aplicacin en el Browser instalado


en esa mquina.

Todo este proceso es enteramente automtico. Usted nunca tendr que especificar
y/o generar un objeto en forma explcita, pues GeneXus es lo suficientemente
inteligente como para determinar qu acciones disparar en cada momento.

As fue que, avisado por Diego, previo paso por el Developer Menu, Mike ejecut
Country, ingres unos cuantos registros, modific algunos, elimin otros y docu-
ment los resultados en la Documentation de la transaccin otorgndole el status
de okay. Le faltaba an probar Attraction (habiendo encontrado cosas a modificar
en Country, haba decidido esperar un poco antes de probar Attraction), cuando vio
en el Talk de la misma que Diego le indicaba que postergara la prueba hasta que l
creara la siguiente transaccin relacionada.

50
Creando la Transaccin AttractionCategory

Diego nombr en la transaccin Attraction al par de atributos AttractionCategoryId


y AttractionCategoryDescription sabiendo que ms tarde creara una transaccin
AttractionCategory, que los contendra.

La finalidad de esta transaccin es categorizar los variados puntos de atracciones


de una ciudad en un pas. Ejemplos de esto pueden ser las categoras Buildings/
Structures, Nightlife, Relaxation, Adventure, Gastronomy, Safaris, Busi-
ness, etc.

Con las estructuras de las transacciones Attraction y AttractionCategory tal como


las definimos estamos diciendo implcitamente que: una atraccin pertenecer a
una y solo una categora, mientras que una categora podr contener n atrac-
ciones asociadas.

GeneXus deber reorganizar la base de datos en el prximo <F5>, creando la


nueva tabla ATTRACTIONCATEGORY y quitando de ATTRACTION al atributo
AttractionCategoryDescription, que pasar ahora a ser inferido, a partir de la nueva
clave fornea, AttractionCategoryId.13

El siguiente Diagrama de Bachman muestra la nueva relacin existente entre las


tablas involucradas hasta el momento en el proyecto.

13
Si Mike hubiese probado anteriormente la transaccin Attraction, y hubiese insertado registros en la
misma antes de esta reorganizacin, supngase que hubiera ingresado una atraccin con id de catego-
ra 1 y descripcin Nightlife, cabe hacerse la siguiente pregunta: qu pasara entonces en la reorga-
nizacin, cuando se creara la tabla ATTRACTIONCATEGORY y AttractionCategoryId pasase a ser clave
fornea en ATTRACTION y AttractionCategoryDescription inferido? Qu pasar con el registro en
ATTRACTION? Para que la base de datos quede en estado consistente, tendr que crearse un registro
en ATTRACTIONCATEGORY, con Id 1 y con descripcin Nightlife. Esto lo har el propio programa de
reorganizacin. Qu pasar si existieran dos o ms atracciones con el mismo Id de categora y distinta
descripcin? Lo imagina? Prubelo.

51
Antes de dar <F5>, Diego record modificar el dominio Id para que fuera Autonumber
(como haba dejado anotado en la documentacin para hacer cuando creara la
transaccin AttractionCategory).

Ahora s, <F5>. Analiz los Impact Analysis Report correspondientes y tras el


[Reorganize], obtuvo la nueva base de datos y los nuevos programas generados.
Cerr el Browser, pues la tarea de testear todo era de Mike y finalmente document
la nueva transaccin y los cambios de Autonumber.

Mike ley lo escrito por Diego, y se puso a prototipar todas las transacciones. <F5>
nuevamente

Para que el usuario final no tenga que recordar cdigos para las claves forneas,
GeneXus crea objetos automticamente que se conocen como Prompts y que se in-
vocan mediante la imagen que aparece en ejecucin al lado de todo campo clave
fornea. Se trata de listas de seleccin que muestran toda la informacin de la tabla
referida, para que el usuario seleccione la deseada.

As, cuando Mike prob la transaccin Attraction, al momento de ingresar la cate-


gora de la atraccin Tour Eiffel, no recordaba el cdigo que corresponda a la
categora de atraccin Buildings/Structures que deba asociarle. Entonces presio-
n en la imagen que sucede al campo para ingresar el Id de la categora, y se le
abri la lista de seleccin de categoras creada automticamente por GeneXus,
como aparece en la siguiente imagen:

52
Con esa lista abierta, Mike elegir la primera opcin, Buildings/Structures, y el
control volver a la transaccin Attraction, donde aparecer en el campo
AttractionCategoryId el valor 1, correspondiente; el foco estar all, y el usuario
podr pasar a ingresar el siguiente campo (en nuestro caso la imagen de la atrac-
cin, y luego el Id de pas, para lo que el procedimiento podra repetirse).

Tambin prob que estuvieran funcionando bien los controles de integridad


referencial, por lo que luego coloc en AttractionCategoryId un valor inexistente de
categora, y vio cmo en ejecucin apareca un mensaje de error indicndoselo14.

14
Segundos ms tarde, probara intentar eliminar en la transaccin AttractionCategory una categora
con atracciones asociadas, esperando ver que fallara la eliminacin, asegurndose, as, la integridad
referencial. Amigo lector: pruebe y ver.

53
Para que el usuario final no tenga que estar abriendo las listas de seleccin cada
vez que tenga que ingresar el valor de una clave fornea, GeneXus provee de la
facilidad de disfrazar en ejecucin un atributo por otro. Mike propuso esto ltimo;
Diego lo realiz cambiando dos propiedades del atributo AttractionCategoryId, y
como resultado, ahora para ingresar la categora Buildings/Structures Mike solo
debe recordar con qu letras empieza, digitarlas y tendr autocomplete:

El atributo en el que el usuario final estar ingresando la descripcin es en realidad


la clave fornea AttractionCategoryId, que est disfrazada de
AttractionCategoryDescription, de manera que el usuario final ingresa descripcio-
nes, pero lo que queda almacenado realmente es el Id correspondiente, que se fue
a buscar a la tabla, en forma transparente para el usuario.

Ahora quedaba mejorar un poco la usabilidad y la apariencia de lo que iba del


proyecto, y dejaron por escrito que habra que comenzar a hacer uso de algunas de
las otras herramientas de GeneXus, como los GXpatterns. Y tal vez ya podran
reunirse todos para discutir si poner en produccin alguna parte de la aplicacin en
el sector Tourism de la agencia, de tal forma que los usuarios pudieran ir probando,
cargando pases y ciudades y enviando las sugerencias que encontraran.

La prototipacin es un gran recurso, y utilizndola adecuadamente, se evita una


exagerada dependencia de la prueba final o, an, de la puesta en marcha (el Da D,
donde todo ocurre y donde la ley de Murphy se aplica especialmente).
Breogn Gonda & Nicols Jodal

Por las caractersticas de GeneXus, todo se puede probar en cualquier momento y,


en particular, se puede prototipar cada objeto en el momento en que se considere
oportuno hacerlo. Esta posibilidad es siempre muy importante y es consecuencia
directa de la teora de GeneXus y, en particular, de su propagacin automtica de
los cambios.

54
Captulo 3
Hecho a mquina,
terminado a mano

Planes Inmediatos
El proyecto de Travel Agency & Co. ya ha avanzado lo suficiente como para que
varias de sus partes sean puestas en preproduccin. Es momento de pruebas por
parte de los usuarios y a la vez de seguir incrementando el sistema.

El problema: pobreza de la aplicacin


Julia asiste con los usuarios finales para tener un feedback temprano y corregir
posibles desvos. Cuando stos comienzan a probar el ingreso de datos mediante
las transacciones, manifiestan estar satisfechos respecto a los controles y la forma
de ingresar los datos individuales, pero quieren consultas con vistas ms comple-
tas y con algn aumento de funcionalidad. Por ejemplo, quieren poder trabajar con
los pases de una forma ms vistosa y amigable. Quieren poder visualizar en un
grid todos los pases existentes, seleccionar uno de ellos para poder modificarlo o
eliminarlo, o incluso ver la informacin completa de ese pas, incluyendo sus ciuda-
des y toda otra informacin que pueda tener relacionada.

La solucin: aplicacin vistosa


en solo tres clics
Sin titubeos se dijo Patterns, all vamos Con la transaccin Country en edicin,
tres clics y un <F5>, pregunt a los usuarios finales Es esto lo que desean?.

55
Los usuarios finales ven en el Developer Menu un nuevo link, Work With Country, que
al ser cliqueado abre un nuevo objeto en el Browser, WWCountry, que no solo muestra
en un grid los pases existentes en el sistema, ordenados por su atributo ms signifi-
cativo, el nombre1, sino que adems permite filtrar en ese grid tambin por nombre (a
medida que el usuario final va digitando en la variable de filtro, automticamente se
va filtrando en el grid), as como pagina automticamente el grid2:

Filtro sobre el grid

Para
desplazamiento
entre las pginas
del grid

Y no solo eso, tambin permite realizar acciones tales como:

insertar un nuevo pas, cliqueando en la imagen que aparece arriba y a la


derecha del grid, , lo que llamar a la transaccin Country en modo Insert3
(para insertar un pas y sus ciudades) y retornar

1
Ver pg. 26. Cuando se ingresan los atributos en la estructura de una transaccin, el primero de tipo
Character o VarChar ingresado, se marca como el descriptor. Se puede cambiar de descriptor
posicionndose en la estructura sobre el nuevo atributo descriptor, y va botn derecho- eligindolo
mediante Toogle description attribute en el men contextual desplegado. Aunque como veremos
apenas ms adelante, Julia tendr otra alternativa para hacerlo
2
El valor por defecto es de 10 registros por pgina (es decir, carga 10 lneas del grid). Lo hemos
modificado a 3 en un lugar centralizado del que luego hablaremos.
3
El objeto Transaccin tiene una variable predefinida, &Mode, que identifica el modo en que se encuen-
tra en un momento dado (modo Insert, modo Update, modo Delete o modo Display) de acuerdo a la
operacin que se vaya a realizar. Si se le enva por parmetro el modo y se recibe en esta variable,
entonces la transaccin sabr qu operacin se quiere realizar.

56
modificar informacin de uno de los pases, cliqueando en la imagen que
aparece en la lnea del grid correspondiente a ese pas (lo que tambin llamar
a la transaccin Country pero en modo Update, para actualizar ese pas y
retornar)

eliminar un pas del sistema (cliqueando ahora la imagen ) lo que tambin


llamar a la transaccin, en modo Delete y luego retornar

visualizar toda la informacin de un pas determinado (observar el link que


aparece sobre el nombre del pas): cliqueando aqu se abrir un nuevo objeto
(creado automticamente), ViewCountry, que mostrar toda la informacin
relacionada con el pas (en tabs):

Es decir, se cre un verdadero Trabajar con Pases (Work With Countries). Lo


mismo podran pedir los usuarios para trabajar con las otras entidades: atracciones
y categoras de las atracciones.

Patrones?
En lneas generales usted ya sabe de qu se habla cuando se dice patrn: conoci-
miento comn que puede ser aplicado a situaciones distintas. Un pattern en GeneXus
es muy potente; evita que usted deba crear manualmente objetos de gran versa-
tilidad funcional; permite el reuso del conocimiento; y es un utilitario abierto:

57
llegado el caso, usted mismo puede crear sus propios patrones. Introducen un alto
nivel de productividad y generan aplicaciones de calidad, con interfaces ms uni-
formes, y una lgica consistente. Es un generador de conocimiento a partir de
conocimiento.

Todo lo que Julia hizo fue aplicar el patrn Work With (uno de los varios posibles) a la
transaccin Country, obteniendo un trozo de aplicacin que implementa todo lo nece-
sario para poder Trabajar con la informacin asociada, en nuestro caso: pases.

Podemos pensar al patrn Work With (as como muchos otros) como una mquina,
cuya entrada es una transaccin (y la KB) y cuya salida es un conjunto de nuevos
objetos GeneXus (algunos de los cuales mostramos antes en ejecucin), ms cam-
bios en algunas propiedades de la KB ms la propia transaccin modificada4

Personalizacin: siempre hay un pero


Los usuarios respondieron a la pregunta de Julia: s, es esto lo que deseamos,
pero

1. En el grid solo queremos ver el nombre del pas y la regin del mundo (el resto
de la informacin no nos interesa).

2. Adems quisiramos poder ordenar los pases mostrados no solo por nombre
de pas, sino tambin por regin del mundo, as como tambin por el par
{regin del mundo, nombre de pas}, y por ltimo queremos poder:

3. filtrar el grid por regin del mundo (adems de por nombre)

4
En particular la transaccin deber declarar que recibe parmetros, dado que ahora se la quiere poder
invocar desde el objeto Work With Countries (WWCountry)

58
Todo lo que Julia haba hecho para aplicar el pattern Work With fue abrir la transac-
cin Country, pulsar sobre el selector Work With que se halla al pie (1er. clic),
marcar el check box Apply this pattern on save (2do. clic) como podr observar
en la imagen que sigue y grabar (3er. clic). Luego <F5> (tras lo cul los usuarios
pudieron ver la aplicacin funcionando).

Sin embargo en la siguiente imagen usted apreciar que el selector Work With no
solo permite marcar el check box, sino que edita una estructura arbrea que Julia
ni mir al realizar los pasos anteriores. Aqu es donde tendr que trabajar ahora
para realizar las modificaciones pedidas.

Configura
el web panel
WWCountry:

Configura
el web panel
WWCountry:

Esta imagen muestra una instancia del pattern Work With, la instancia para
Country, que permite personalizarlo5 . Se puede observar una estructura jerrqui-

5
No hemos definido instancia. Puede pensarse como la declaracin de cmo se aplicar el patrn al
caso particular de este objeto.

59
ca conteniendo nodos y un conjunto de propiedades cuyos valores determinarn la
apariencia y el comportamiento de lo generado por el pattern para esta instancia.

El pattern Work With generar, entre otras cosas, dos nuevos objetos GeneXus,
que pudimos ver en ejecucin, y que hemos incluido para usted sobre la imagen
de la instancia, de un tipo del que an no habamos hablado: Web Panel, que
permite, grosso modo, hacer consultas interactivas a la base de datos, de modo
amigable6.

En la imagen hemos indicado qu nodos de la instancia del pattern permiten con-


figurar las caractersticas de qu web panel. Los usuarios le han pedido a Julia
modificaciones sobre el primer web panel. Nada han dicho por el momento del
segundo (pero tal vez lo hagan).

Observe el lector lo primero que aparece bajo el nodo Level (Country). Recuerde
que CountryName era el atributo descriptor de la transaccin (el de mayor carga
semntica): desde aqu tambin podr modificarlo. Qu repercusin tiene el atri-
buto descriptor en lo generado por el pattern? Mucha. Por ejemplo, define cul ser
el atributo del grid del WWCountry que contendr un link hacia el web panel
ViewCountry creado automticamente para ver la informacin de ese pas. Pero
este es solo un ejemplo, como veremos, se utiliza en muchos lados

Web panel WWCountry:


nodo Selection (Work With Countries)
Obsrvese que el nodo Selection contiene como subnodos: Attributes, Orders y
Filter (adems de acciones: Ins, Upd, Del, Dis).

El subnodo Attributes muestra por defecto todos los atributos del primer nivel de
la transaccin Country, y son los listados (casualmente?) en el grid del web panel
WWCountry (Work With Country)7 generado

Los usuarios pidieron a Julia solamente mostrar CountryName y,


CountryWorldRegion, por lo que lo nico que sta debe hacer es eliminar de ese

6
En un caso tenemos un web panel que nos permite entre otras cosas listar los pases, filtrando por
nombre, y en el otro tenemos un web panel que nos muestra toda la informacin de un pas determi-
nado y sus ciudades (stas en un grid dentro de un tab).
7
En la versin de GeneXus Rocha en la que fue escrito este libro, este web panel, WWCountry tiene su
descripcin en singular Work With Country, sin embargo, en su pantalla se presenta como Work With
Countries. Por lo que para referirnos al mismo, utilizaremos indistintamente el singular y el plural, de
acuerdo a lo ms natural al contexto en el que lo estemos referenciando.

60
nodo, con <Suprime>, el resto de los atributos, con la excepcin de CountryId.
Este ltimo no puede ser eliminado tan alegremente. Aunque no se le muestre al
usuario final en el grid, deber estar presente, invisible, como justificaremos en
breve. Por lo tanto, lo que har Julia en ese caso, ser posicionarse sobre el atributo
en ese nodo, y, editando sus propiedades con <F4>, modificar la propiedad Visible
pasndola a False.

As quedar la instancia; vea la repercusin en ejecucin.

Requerimiento 1 listo!

El subnodo Orders indica el orden por el que en forma predeterminada se desean


recuperar los datos que se cargarn en el grid. El orden elegido por defecto es
(casualmente?) el de CountryName, el atributo descriptor. Los usuarios pidieron
poder elegir entre ese orden y uno por CountryWorldRegion, as como uno compuesto
por ambos.

Cmo puede el usuario decidir en ejecucin por cul criterio quiere ordenar la
informacin a recuperar? Mediante un combo box que le muestre las posibilidades.
Julia necesitar agregar los nuevos ordenamientos pedidos bajo el subnodo Or-
ders, a los que les dar un nombre (World Region, Both) que sern las opciones
que el usuario final ver en ejecucin en el combo insertado automticamente por
el pattern.

As quedar la instancia y luego el web panel generado (en ejecucin):

61
Observe un detalle: puede tambin ordenar en ejecucin lo que haya cargado en el grid en
un momento dado, por alguna de sus columnas, simplemente cliqueando sobre la misma.
Pero cuidado! Si est trabajando con paginado, aqu estar ordenando solo la pgina
actualmente cargada.

Requerimiento 2 listo! Solo queda el 3.

Los usuarios quieren tambin poder filtrar los pases a cargar en el grid por regin
del mundo. Evidentemente: subnodo Filter. Obsrvese lo que aparece en forma
predefinida bajo este nodo (vea pg. 59). Otra vez, casualmente CountryName?
Tmese un tiempo, estimado lector, para deducir qu significan los dos subnodos
Attributes y Conditions, mirando el web panel WWCountry que GeneXus implement
y la instancia en la pgina 59. Y si ahora le mostramos lo que hizo Julia en la
instancia y la repercusin que esto tuvo en el web panel?

62
Al agregar el atributo CountryWorldRegion bajo el subnodo Attributes, se crear
automticamente una variable del mismo nombre, &CountryWorldRegion8 , que se
colocar sobre el grid del web panel y que permitir que el usuario final seleccione
una regin del mundo para que en el grid se le muestren solo los pases de esa
regin (por qu aparece como combo box9 ?). Cmo sabe
que debe hacer ese filtro? Por lo que Julia escribi bajo el subnodo Conditions.
Observe algunos detalles: hay dos filtros definidos (por nombre de pas y regin).
Cul aplica? Ambos. A menos que alguno no deba ser aplicado (observe las clusulas
when de cada filtro. Por ejemplo, &CountryWorldRegion es vaco (IsEmpty())
cuando tiene el valor 0, es decir, con la descripcin (None) del combo. En ese
caso no aplicar ese filtro).

Requerimiento 3 listo!

Obsrvese un hecho interesante y nada casual: cuando Julia mostr en ejecucin a


los usuarios cmo modificar un pas o eliminarlo, se abri la transaccin Country,
editndose el pas seleccionado del grid. Para ello el pattern Work With tuvo que
modificar las reglas de la transaccin, agregando algunas que se suman a las que
ya habamos declarado. Para qu? Para poder instanciar, editar, el pas recibido
por parmetro. Echemos un vistazo:

8
Ya habr deducido que las variables aparecen identificadas en todo el cdigo GeneXus por un & que
es colocado como prefijo del nombre de la variable.
9
Recuerde que Diego indic en las propiedades del atributo CountryWorldRegion que cuando se presente
como control en un form, sea un combo box con los valores que defini (al primero, 0, le dio como
descripcin (None)). Aqu se trata de una variable que se basa en este atributo y observe cmo
hereda el mismo comportamiento, sin tener que decirle nada.

63
La forma que tiene todo objeto GeneXus de declarar los parmetros que recibe y
devuelve, es mediante la regla Parm.

Cuando desde el Work With Countries se elija un pas del grid para modificarlo, se
invocar a esta transaccin envindole el modo UPD que es recibido en la variable
&Mode y se enviar adems el CountryId correspondiente (es por este motivo que
tuvimos que dejarlo en el grid, oculto). Cuando se quiere insertar, se enva INS y
el valor vaco como segundo parmetro, y as

Web panel ViewCountry:


nodo View (Country Information)
Cuando hacemos clic en ejecucin sobre el nombre del pas, se abre el web panel
ViewCountry que nos muestra la informacin del pas correspondiente (ver pg.
57). Observemos qu datos nos muestra: el nombre del pas recibido por parmetro
(otra vez casualmente? CountryName) y luego en un tab General todos los atributos
del primer nivel de la transaccin Country para ese pas, y dos botones para poder
llamar a la transaccin pasndole ese pas por parmetro (para modificar el pas y

64
eliminarlo respectivamente) y en un tab City, nos muestra en un grid todas las
ciudades del pas.

Observe detenidamente el nodo View (Country


Information) de la instancia del Work With de
Country. Si el usuario pidiera que adems del nombre
del pas, apareciera el nombre completo, luego en el
tab General solo se mostraran los atributos
CountryWorldRegion, CountryDetails y CountryFlag,
y si adems quisiera que en el tab City, en el grid de
las ciudades solo se mostrara el nombre de las
mismas, qu cambios debera hacer sobre estos
nodos para lograrlo? Y si no se deseara el tab City
en absoluto?

En la instancia aparecer un Tab por cada tabla


subordinada (muchos a 1)10 aunque Julia podra
agregar otros Tabs con otras cosas pero no nos
apuremos

Concluyendo: Cuando Julia marca Apply this pattern on save en el selector Work
With de Country, al grabar, se generarn objetos GeneXus como los que estuvimos
viendo en ejecucin, pudiendo acceder a ellos en el Folder View, bajo la transaccin.
Asimismo, cada vez que modifique la instancia, al grabar, se regenerarn los objetos
que corresponda, en forma automtica.

10
COUNTRY solo tiene a COUNTRYCITY en esta relacin (muchas ciudades por cada pas) y por ello solo
aparece un Tab. Obsrvese que el nombre que eligi para nombrarlo fue la descripcin del nivel 2 de la
transaccin Country (la descripcin de las lneas, que era City).

65
Ms?
Los usuarios, que por momentos parecen tener como especial misin en el mundo
encontrar las flaquezas de los desarrolladores y volver sus vidas miserables, pidieron
a Julia que luego de modificar un pas, no queran que se volviera al llamador,
WWCountry, sino que les mostrara toda la informacin del pas recin modificado
(es decir, ir al View Country).

Julia, inmutable, se posicion en el nodo raz de la instancia y cambi el valor de la


propiedad AfterUpdate que puede ver a continuacin para Go to View

Obsrvese que inicialmente toma un valor <default>. En algn lado tiene que
decir cul es este (y los dems) <default>. Este valor especifica cul es el
comportamiento predeterminado para todas las instancias (aqu tenemos la de
Country, pero tambin podramos querer un Work With Attractions y un Work With
AttractionCategories). Si en la mayora o todos los Work With de la aplicacin
queremos que el comportamiento por defecto sea que luego de modificar se vaya al
View, entonces en lugar de cambiar a mano una por una esta propiedad en la
instancia de cada transaccin, podemos cambiar en un lugar centralizado el <de-
fault>.

Cul es este lugar centralizado?

Se encuentra bajo el nodo Pattern Settings del Folder View. Observe en la imagen
que sigue que al momento solo se encuentra el Work With. Pero ya habr otros
patterns, de usted, de Artech y de terceros

(Extensibilidad integrabilidad piezas claves en la ideologa Rocha)

66
Obsrvese que aqu aparecen todos los comportamientos predeterminados que
heredarn las instancias particulares del Work With para cada transaccin. Por
ejemplo, todas las caractersticas relativas a los grids de los Work With, como el
paginado, aparecen como propiedades del nodo Grid. 11 Invitamos al lector interesado
a investigar sobre las configuraciones generales que puede realizar desde aqu. Por
ejemplo, puede cambiar el aspecto general de las pginas, los nombres de las
mismas, las imgenes para las acciones de Insert, Update, Delete y mucho ms.

Reflexione el lector sobre lo que significa trabajar con. Qu otras cosas podra
pedir el infame usuario? (perdn lector, es que tambin somos humanos). Pregntele
a Julia y ella le podr contar que en esa misma reunin, se le ocurri a esa especie
particular de homo sapiens que quera:

A. Exportar la informacin de los pases con los que estaba trabajando, a una
planilla Excel. Puede usted creer? Adems dijeron que no queran:

B. Que se pudiera eliminar pases desde el Work With Countries. Y por si esto
fuera poco, que queran:

C. Agregar otra accin ms sobre los pases (adems de las de Insert y Update ),
cuyo efecto fuera mostrar en otra pantalla cada pas con sus ciudades, todos
juntos!, y en un formato ms agradable a la vista. (Un poco ambiguo para
nuestro gusto y el de Julia)

11
Si observa en su KB la propiedad Page del nodo Grid, encontrar que tiene el valor Page.Rows.
Qu es Page? Pues un dominio enumerado creado automticamente, que contiene un solo valor,
Rows, cuyo valor por defecto es 10 y que nosotros hemos cambiado a 3.

67
Julia disfrut con sorna: ante cada requerimiento que el usuario peda con ojos
maliciosos, haca un par de clics y listo. Salvo para el ltimo, donde el usuario logr
su aparente objetivo: complicarle la vida. Pero ni tanto. No olvidemos que Julia no
es tcnica, luego en la oficina pedira ayuda a Diego.

Acciones en el Work With Countries

Aqu se muestran las acciones que el pattern Work With tiene disponibles para
implementar sobre los datos del WWCountry con los que trabaja. En particular
obsrvese que existe la opcin Export.
Otra vez los valores default! Otra vez,
s, estos estarn configurados en el objeto
WorkWith que vimos antes que centraliza
todo esto. En nuestro caso, los valores
default para Delete y para Export, eran
true y false, respectivamente. Para
deshabilitar la accin de eliminacin de Exportacin
un pas y habilitar la accin de
exportacin, Julia solo tuvo que modificar
los combos que mostramos arriba,
pasndolos a false y true respectiva-
mente. Requerimientos A y B listos!

Ahora queda el ltimo requerimiento, el C: agregar una accin que no es una de


las predefinidas. Pero el objeto al que hay que invocar como resultado de la
accin, no es creado por el pattern Work With; se quiere hacer a medida, para
estos datos en particular; se sale de lo que es comn a cualquier trabajar con.
Aqu es donde deber intervenir Diego, implementando en GeneXus ese objeto.
Julia escribe en el selector Documentation del WorkWithCountry que esto queda

68
pendiente, bajo un ttulo To-Do Diego para que sea implementado por Diego
cuando ponga manos a la obra12.

Los insaciables de siempre: quiero ms!


Tras volver de la reunin con los usuarios, Julia se encuentra con un e-mail de los
usuarios!... solicitndole que en la lista de pases del Trabajar con se pudiera ver
aunque ms no fuere un trozo de los detalles del pas, CountryDetails, cuestin de
poder comentar a sus clientes algo muy breve de cada uno. Tambin queran poder
ver para cada pas su cantidad de atracciones.

Necesitaba agregar dos nuevas columnas al grid del Work With Countries. Una para
la descripcin corta, y otra para la cantidad de atracciones. Pero no saba cmo
lograrlo, ya que esa informacin no estaba almacenada en atributos de la base de
datos, sino que se tena que obtener mediante algn procesamiento. Ya tena en
mente llamar a Diego para que le enseara cmo implementar el requerimiento
que haba quedado pendiente, el C, por lo que tom el telfono inmediatamente.

Diego cre el dominio ShortDetails de tipo


Character(30). Luego abri el Work With
Pattern Instance de Country y mediante el
comando Add agreg una variable al grid.

12
Como usted ver un poco ms adelante, a Diego no le resultar nada complicado ubicar esta nota de
Julia entre toda la documentacin que se supone desperdigada entre tantos objetos de la KB, y ser
gracias a las Categoras Dinmicas, de las que l mismo hablar en el captulo 6.

69
Obsrvese que en el dilogo de propiedades se le debe necesariamente dar un
nombre y asignar un dominio a la variable que se est insertando (es lo que indica
el cono ). Diego le asigna como nombre ShortDetails y como dominio el recin
creado de igual nombre. Solamente resta decirle el valor que deber tomar para
cada lnea del grid.

- Como bien intuyes, Julia, cuando ponas los atributos bajo este nodo no era
preciso decir ms: GeneXus recorrera la tabla COUNTRY, y para cada registro
que cumpliera con las condiciones de los filtros especificados (en nuestro caso
veo que son por CountryName y CountryWorldRegion), cargara una lnea nueva
en el grid del Trabajar con con los valores de esos atributos en cada columna.
Si los usuarios quisieran la descripcin completa del pas, bastara con incluir
el atributo CountryDetails, pero lo que quieren es acortar la descripcin a 30
caracteres. Por lo que, lo nico que tendremos que hacer es especificar en la
propiedad LoadCode de la variable que ingresamos, el valor que tomar para
cada lnea: ser la operacin de quedarnos con los primeros 30 caracteres del
string13, es decir: &ShortDetails = Substr(CountryDetails,1,30). S, CountryDetails
es el atributo. As de sencillo. Ya puedes hacerlo sola.

- Entiendo, y entonces para el otro requerimiento, el de mostrar el nmero de


atracciones que tiene cada pas

- Bueno, ah es un poquito ms complicado, pues el procesamiento que debes


hacer para cargar la variable que contendr esa informacin es ms complejo.
Fjate que para el pas que se est cargando en una lnea del grid en cada
oportunidad, se debern recorrer todas sus atracciones para contarlas. Tienes
dos caminos, uno es programar ese cdigo que te permite recorrer informacin14,
otra vez en el LoadCode. El otro, es agregar un atributo a la transaccin
Country, que contenga esa informacin, suponte un: CountryTotalAttractions.
De esta manera solo tienes que agregar este atributo al nodo Attributes de la
instancia, y listo!

- Pero, no entiendo Cuando el usuario ingrese la informacin de un pas


mediante la transaccin, va a digitar el nmero de atracciones que contendr?
Y si despus resulta que no coincide con las atracciones reales que ingres?
Eso no les va a gustar a los usuarios.

13
GeneXus cuenta con mltiples funciones para trabajar con los distintos tipos de datos. En particular,
tiene la funcin substr, que permite recuperar un substring de un string dado.
14
Ser el comando For each, del que hablaremos ms adelante.

70
- Julia, en cualquier momento me dejas en la calle! Exactamente: no tiene
sentido que el usuario tenga que digitar una cantidad que es resultado de un
clculo entre valores que estn en la base de datos. Este atributo,
CountryTotalAttractions ser de un tipo especial, que en GeneXus se denomina
frmula. Vers, ingresar ese atributo nuevo en la estructura de la transaccin
Country, y le dir a GeneXus que tengo ms informacin, que s cmo debe
calcularlo, y que por tanto no lo almacene en la base de datos, sino que siempre
que se le pida su valor, la calcule como yo le digo:

- Count(AttractionName)?! Aj, con eso le dices a GeneXus que quieres que


para ese pas cuente la cantidad de valores de AttractionName15, no? Ahora,
cmo sabe que tiene que contar las atracciones de ese pas y no de todos
los pases?

- Bueno, recuerda que GeneXus conoce las relaciones entre los datos y sabe que
una atraccin pertenece a un pas y ciudad determinado. Y cada pas-ciudad,
pertenece en particular a un pas. Con eso basta.

- Y qu ventaja tiene esta solucin para nosotros, frente a la otra, la de agregar


una variable en la instancia del pattern y decirle cmo hacer el clculo (cosa
que, por otra parte, no s hacer)?

15
Para usted que s es informtico (porque lo es, verdad?): para cada pas contar la cantidad
de registros asociados de la tabla donde se encuentra AttractionName, que en este momento es
ATTRACTION.

71
- Pues que aqu has implementado una solucin general. Si en otros lados, en
otros objetos, cuando recuperas un pas necesitas saber su cantidad de
atracciones, solo con nombrar el atributo frmula ya se dispara el clculo, y no
tienes que programarlo a mano. Ahora solo tienes que agregar al nodo At-
tributes de la instancia este atributo frmula. Ya estn listos los dos
requerimientos del e-mail!

Existen diversos tipos de frmulas en GeneXus (para sumar, contar, buscar,


maximizar, minimizar, etc.) Es importante destacar que son atributos virtuales: no
estarn almacenados en la base de datos.

Quod Pattern non dat, GeneXus praestat16


En lo que Julia demor en ir a servirse un caf, saludar a un compaero y volver
con la taza humeante, Diego ya haba implementado el ltimo requerimiento (el C
pendiente). Como no estaban seguros si implementaba lo que deseaban los clientes,
capturaron la siguiente pantalla y la enviaron por e-mail:

16
N. de A. Frase latina, Quod Natura non dat, Salamantica non praestat para referir a que si la
naturaleza no da inteligencia, ni la prestigiosa Universidad de Salamanca puede hacer magia.

72
- Cmo lo hiciste tan rpido, Diego? Me enseas? No puede ser complicado.

- No lo es; lo que hice fue crear un nuevo objeto en GeneXus, de tipo Web
Panel. Es el que ests viendo en la pantalla en ejecucin. Fjate que lo que
deseas es mostrar informacin de pases y de ciudades (las suyas). Olvdate
por un momento de los pases, y supn que solo quieres listar informacin de
las ciudades, en un grid. Lo nico que debes hacer es insertar un control de
este tipo en el form del web panel y decir qu atributos compondrn sus
columnas. Solo con hacer esto, cuando presiones <F5> vers en ejecucin
listadas todas las ciudades existentes. GeneXus observa los atributos presentes
y de ellos infiere la tabla que deseas navegar (le llama tabla base). Fjate
cre un web panel Cities en un segundo, insert el grid mediante la toolbox
que ofrece todos los controles que pueden insertarse en un form, eligi el
atributo CityName, y qued el form del objeto como puede ver a continuacin
- en nuestro caso, los atributos que colocamos en el grid (CityName) son de la
tabla COUNTRYCITY y esa ser la que navegar GeneXus.

- El grid que hemos insertado se conoce como Grid a secas, grid estndar, ya
que permite mostrar la informacin de cada registro de una tabla (y de su
extendida), con un elemento de informacin por columna (observa que nuestro
grid tiene una sola columna, con un ttulo y corresponde al atributo CityName,
pero si tuviramos otro, lo colocara en otra columna). Ahora olvdate por un
instante de las ciudades, y piensa que algo muy parecido quieres hacer con los
pases, solo que quieres mostrar la informacin de cada pas no en columnas
rgidas, sino de forma ms flexible, como puedes ver en la pantalla que le
enviamos a los clientes. Observa el web panel que hice mientras ibas por tu
taza de caf:

73
- Observa que ahora aparece el grid de ciudades, junto con los atributos
CountryFlag y CountryName dentro de un rectngulo. Qu es? Otro tipo de
grid, uno llamado Free Style, pues como ves, la informacin del pas que quieres
listar se muestra no por columna, sino toda junta, con el diseo que t decidas.
Pero tambin es un grid. Mostrar por tanto, tantos pases como existan en la
tabla de pases. Observa que en sus propiedades aparece una Columns, a la
que modifiqu el valor de 1 a 3, y es por ello que puedes ver en la imagen
que le enviamos a los usuarios tres pases por fila. Rows 0 significa que no
realice paginado, sino que muestre todos los pases existentes. Luego observa
que dentro del Free Style, podemos colocar cualquier control, incluyendo otro
grid. Y al hacerlo, GeneXus encuentra las relaciones entre las tablas, y es por
esta razn que est listando por cada pas, sus ciudades en el grid, sin tener
que indicarle nada, lo hace solo. Si no te convence, mralo t misma en el
listado de navegacin que aparecer luego de la especificacin, tras el <F5>.
A ver si lo puedes entender

74
El pas que se
est cargando
en el grid

- Lo que s entiendo es por qu lo implementaste tan rpido no es que Natura


te dio, es que GeneXus te prest. No tuviste que hacer casi nada!, Diego
Cambia esa cara, estaba bromeando. No vendr tu amiga hoy a verte?

- hmmmadems podramos hacer otro web panel, invocado va un Tab del


View de pases, que dado el pas muestre la cantidad de atracciones por ciudad,
pero en forma grfica, por ejemplo en forma de torta en 3D. Quisiera hacer
algo que impresione qued pensativo.

- A los usuarios? Bueno, Diego, veo que hoy no ests para bromas. Antes de
que sigas, qued pendiente poder llamar desde el Work With Countries a este
web panel que acabas de implementar.

- Es verdad, pero eso sabes hacerlo. Simplemente debes agregar una nueva
accin a las ya predeterminadas (insert, update, etc.) en la instancia del Work
With de Country: la asociaremos a un botn fuera del grid y le indicaremos que
como resultado de la accin queremos invocar al web panel CitiesPerCountry
que acabo de crear.

75
Sobre el nodo Selection (Work With Countries), con botn derecho, seleccionar
Add actions y luego posicionarse sobre el nuevo nodo Actions y otra vez repetir
la operacin. Vea lo que hicieron nuestros amigos, y la repercusin en ejecucin:

Requerimiento C listo!

Nuevo Tab en el View Country


Diego quera impresionar a alguien, no sabemos a quien (tal vez a usted, estimado
lector) con un nuevo requerimiento: en el ViewCountry, agregar un nuevo control
Tab que muestre en un grfico de torta en 3D la cantidad de atracciones por ciudad
de ese pas. Para ello, agrega un nodo Tab en la instancia del pattern Work With
correspondiente al View, que se cargar con el contenido de otro objeto GeneXus
que Diego deber programar. Podra ser un web panel, pero en realidad tiene que
ser un objeto que se pueda ejecutar dentro de otro (en nuestro caso del ViewCountry).

76
Se tratar de un Web Component. A los dems efectos ser igual que un web
panel.17 Le llamar AttractionsXCity, y deber indicar en el nuevo Tab que se cargar
con el mismo:

Se le deber pasar el CountryId como


parmetro al Web Component que
implementa el grfico:

Otra cara de la extensibilidad: User controls


GXchart es un servicio online que crea instantneamente cualquier grfica que
usted necesite visualizar en una pgina HTML. Solo debe definir el grfico que
quiere y el servidor GXchart le devolver una imagen de l.

Adems de los controles estndares que usted suele insertar en sus forms (at-
tribute, grid, text block, etc.), GeneXus Rocha le permite crear sus propios controles
personalizados: user controls. Una vez que un control de usuario es instalado,
puede ser utilizado como cualquier control estndar. GeneXus Rocha viene con
algunos controles de usuario ya instalados: uno de ellos es el GXchart. Observemos
en la foto composicin que sigue que Diego insert un control de ese tipo en el form
del web component, y luego lo nico que tuvo que hacer fue configurarle sus
propiedades, cargar los valores que quera ver en el eje de las X (las ciudades del
pas) y los que quera ver en el eje de las Y (la cantidad de atracciones). Al insertar
este control en el form, se crea automticamente un tipo de datos estructurado,

17
De hecho ser un web panel, al que se le especifica la propiedad Type=Component

77
ms conocido como SDT por su sigla en ingls, que en forma flexible, permite
construir listas de records de largo variable. A su vez crea dos variables,
&GxChartData y &GxChartSerie mediante las que carga esas listas (ciudades y
atracciones). El cdigo mediante el cul las carga puede verse dentro del evento
del sistema Start, que Diego program. No importa que ahora no entienda este
cdigo. Solo queramos mostrarle lo fcil que es lograr este requerimiento.

Look & Feel consistente sin transpirar?


Tener un look&feel consistente es hoy en da un deber de toda aplicacin Web.
Crear y mantener cada pgina de una aplicacin Web asegurando la consistencia
con el resto del sitio toma gran tiempo de programacin ley Julia en voz alta de
una revista tcnica que estaba sobre la mesa del escritorio de Diego.

- No con las Master Pages acot Diego-. Como te cont, un web panel puede
implementar una pgina web comn y corriente, como la que hicimos
CitiesPerCountry (con los grids Free Style y estndar), es decir, una pgina
web independiente que ser invocada por otra (en nuestro caso por
WWCountry); o puede implementar una pgina web que ser parte componente
de otra, como la de la grfica que era un Web Component parte del ViewCountry;
o por ltimo, puede ser una pgina maestra, es decir, una pgina que contiene
centralizado all lo que ser comn a todas las pginas del sitio, como el

78
encabezado y el pie de pgina que has visto
por todos lados repetido; incluso suelen tener
un men vertical a la izquierda, de manera
tal que solo est en un lugar, y que si se
quiere modificar, se lo haga en un solo sitio.

- Con razn! Cuando empezamos con el


proyecto vi a Mike ejecutando las transacciones y no entenda cmo era que
todas salan con el mismo encabezado y pie de pgina (que tambin tienen el
Work With Countries, y el View Country) siendo que en el form de esos objetos
esas partes no aparecan. Existe una master page que programa ese look
comn, verdad?

- Efectivamente. Mira esto- dijo Diego a la vez que


seleccionaba la transaccin Country y acceda a
sus propiedades-. Vers lo mismo en cada
transaccin y en los web panels creados por pat-
terns: AppMasterPage es una master page creada
automticamente con la KB y es la que contiene
ese encabezado y pie de pgina que se repite
por doquier.

Si abrimos este web panel,


mira sus propiedades. Qu te
dice esto?

Y aqu no solo se programa el


form comn: tambin se le
puede programar el
comportamiento comn. Es
ms que habitual que las
pginas sean restringidas a
usuarios autorizados, que
debern loguearse al sistema
antes de comenzar a navegar
por las distintas pginas del
sitio. Antiguamente la
validacin de que el usuario estuviera autorizado deba repetirse en cada pgina
web a la que se accediera. Sin embargo, con las master pages, alcanza con escribir

79
el cdigo de validacin solamente una vez, aqu, y listo! Nos aseguramos que
todas las pginas asociadas realizarn esa validacin, y su cdigo no estar
desperdigado por todos lados.

- Qu bueno! Digo, para ustedes, que tienen que trabajar menos para que les
quede todo consistente. Me voy a almorzar y luego a impactar el pattern al
resto de las transacciones que tenemos Ya almorzaste?

80
Captulo 4
Vuelo al mundo
de los subtipos

El proyecto avanzaba segn los tiempos estipulados. Cada uno en lo suyo. Dada la
filosofa incremental de GeneXus, no teman a los cambios ni a lo nuevo. El modelo
amparaba todo lo necesario. Solo lo necesario.

Restantes Transacciones al vuelo


Diego no haba almorzado No tena apetito. Deba comenzar a crear el resto de
las transacciones, pero decidi esperar un rato. Quera lucirse frente a Mary, a
quien haba ofrecido mostrar ms de GeneXus Rocha. En lugar de llevar su
notebook al bar, le haba propuesto encontrarse, esa misma tarde, en su oficina
en ACME.

- Mary te ves bien Cmo ests?

- Mejor. Te agradezco que me hubieras invitado a un nuevo encuentro, aun cuando


estemos en empresas competidoras. Es un lindo gesto de tu parte.

- Hummm bueno, no es tan as dijo torpemente, mientras en la pizarra a


sus espaldas escriba: la Comunidad No, por favor, no me malinterpretes,
no quise decir Me refera a esto de la rivalidad, de la competencia. Mira,
entre los miles de desarrolladores GeneXus existe en forma etrea algo que
se conoce como: la Comunidad. Es muy estimulante. Sinrgico, escuchars
decir. T me preguntars si es un club; pues no desde el punto de vista de
actividades sociales o deportivas, al menos por ahora agreg sonriendo,
intentando disimular el temblequeo en la voz - pero s respecto a la interaccin.
Es como un tejido del que todos formamos parte, compartiendo conocimien-
to y soluciones a travs de GeneXus y de las dems herramientas que se han
desarrollado alrededor. Existen incontables de programas y extensiones crea-

81
dos por la Comunidad para satisfacer distintas necesidades. Existen muchos
sitios Web de donde descargarlas, y a donde subirlas tambin. La Comunidad
es muy activa. Existen decenas de foros donde se intercambian soluciones de
todo tipo. Yo estoy en las listas de varios de ellos; me considero un miembro
activo.

- Suena lindo. Pero funciona? Digo, te dan una mano desinteresada cuando
la necesitas?... O es puro cuento?

- Es que es hoy por m y maana por ti. Todos necesitamos una mano de vez en
cuando. Si en vez de vernos como competidores nos sentimos cooperadores,
trabajamos mejor, ms animados, llegamos a mejores soluciones, para todos.
Tiramos para un mismo lado: hacer crecer a la Comunidad, en beneficio de
todos. Puede resultarte un poco ingenuo, pero la prueba est a la vista: fun-
ciona. Como evidencia: el propio GeneXus Rocha est compuesto por exten-
siones de GeneXus. Es decir, la Comunidad puede seguir haciendo crecer a
GeneXus Rocha con sus propias extensiones. De hecho, GeneXus puede consi-
derarse en s mismo una extensin.

Tras reparar en esa luz antigua, conocida, que adquira su mirada, continu ms
seguro:

- Mira invit Diego al tiempo que abra la ventana Extensions Manager a tra-
vs de la opcin Tools del men de GeneXus- Esta es la lista de extensiones
que componen GeneXus Rocha en este momento. La mayora han sido desa-
rrolladas por Artech y las otras por personas de la Comunidad que las publican
para que diferentes miembros puedan hacer uso de ellas.

- Veo que en la Start Page aparece una seccin que dice Extensions, con un
abstract escrito por el autor, y un link para instalarla acot observadora.

- S, y si te fijas, aparecen unas cuantas que no dicen By Artech. Son extensio-


nes realizadas por terceros, miembros de la Comunidad.

En cuanto al proyecto en s y al punto en que ha-


ban llegado, la realidad reclamaba otras transac-
ciones. Tras una breve ojeada a lo ya hecho, Diego
pas a crear Airline. Su finalidad: almacenar el
nombre de las compaas areas involucradas con
Travel Agency & Co.

82
Transaccin Flight:
vuelo al mundo de los Subtipos
En cuanto Diego mir sus papeles, agradeci por la complejidad asociada a la
prxima transaccin. A Mary solan gustarle los desafos.

- Mary, vamos a crear la siguiente transaccin, pero va a hacer falta un poco de


concentracin de tu parte advirti tratando de disponerla a lo que podra ser
una sorpresa Mira este caso. La transaccin contendr informacin relativa a
los vuelos; cosas tales como la descripcin, la aerolnea, la hora de despegue,
la cantidad mxima de pasajeros, fciles de entender; y por otro lado, tendre-
mos la ciudad de donde se sale y la ciudad a donde se llega1 , informacin que
debemos conocer y almacenar porque est comprendida en la realidad. Re-
cuerdas que te coment en el bar que dos atributos con igual concepto deben
tener el mismo nombre?

- S, fue cuando me explicaste cmo crear la transaccin Country. Recuerdo


perfectamente que mencionaste que haba una excepcin

- Lleg la hora de aclarar eso. Hay momentos en los que no hay ms remedio
que llamar distinto a dos atributos que son bsicamente lo mismo. Mira, en la
transaccin Flight se nos presenta el problema que da lugar a la excepcin que
lo resuelve: en cada vuelo existen dos pases y dos ciudades involucradas, que
cumplen roles diferentes: un pas y una ciudad son de partida y otro pas y
ciudad son de destino. Es decir, tenemos dos referencias a una misma tabla,
COUNTRYCITY. Observa, si solo escribiramos esto que dibujo en el papel:

...podramos decir que los atributos


CountryId y CityId en la transaccin
Flight representan una ciudad de un
pas, pues se llaman igual que los
identificadores de la transaccin
Country. Es decir, sern una clave
fornea a la tabla COUNTRYCITY. Has-
ta all nada nuevo bajo el sol, pero ahora debemos agregar otra ciudad2 , en

1
Recuerde que estamos simplificando la realidad: supondremos que no habr nunca ms de un aero-
puerto por ciudad.
2
Cuando hablamos de ciudad, nos referimos a una ciudad real, como Pars. Para identificar una
ciudad, necesariamente debemos dar el par: {CountryId, CityId}. Est sobreentendido. Por el diseo
de nuestras transacciones, una ciudad no tiene existencia independiente del pas al que pertenece. As,
existe ciudad Rosario de Argentina y ciudad Rosario de Uruguay. Pero no existe Rosario, independiente
del pas del que se trate.

83
otro rol, el de ciudad de destino. Es decir, tiene que aparecer una doble
referencia a una ciudad: en un caso en un rol de ciudad origen, y en el otro de
ciudad destino. Cmo hacemos esto? GeneXus no nos permitir agregar la
misma pareja de atributos en la misma transaccin, eso es obvio porque cmo
se discriminara entre un atributo y otro?! Pero podramos hacer algo as
tom el lpiz y escribi dos atributos nuevos, luego de lo cual antecedi a los
dos primeros con la D de departure y a los dos ltimos con A de arrival.

- Hmm pero si GeneXus entiende que si se llaman distinto son otra cosa ya
no habra conexin entre vuelos y ciudades, verdad?...

- Verdad. Solucin? Poder decir-


le a GeneXus que si bien se les
ha cambiado el nombre a los
atributos, por la necesidad de
diferenciarlos, de todos modos
corresponden al mismo concep-
to. Es decir, que no se confun-
da: que por ms que el atribu-
to DCountryId no se llame CountryId, a todos los efectos es como si se llamase
as, de modo que siga estableciendo las relaciones de integridad referencial
igual que antes. Decirle esto a GeneXus es decirle que DCountryId es un subtipo
de CountryId3 . La solucin completa, por tanto, es agrupar estas parejas en
dos grupos de subtipos, ves? inquira a la vez que rearmaba el croquis.

- Ah, comprendo! Gracias


a ello, DCountryId y
DCityId sern una clave
fornea en FLIGHT a la
tabla COUNTRYCITY, al
igual que ACountryId y
ACityId, verdad? Tienes
dos claves forneas a la
misma tabla.

- As es, y se deben realizar todos los contro-


les de integridad referencial automtica-
mente contest al tiempo que descubra
un entusiasmo nuevo en Mary. Podra lue-
go quitarla del teclado?

3
Recprocamente, decimos que CountryId es supertipo de DCountryId

84
- De todos modos el problema no se termin aqu- continu Diego.- En esta
transaccin, adems de representar que un vuelo tiene un pas-ciudad de
origen y otro de destino, cosa que ya hicimos, queremos poder inferir el
nombre de cada pas y ciudad, para verlos en el form. Es decir, queremos
inferir para mostrar atributos que pertenecen a la tabla extendida de FLIGHT,
pero cmo los inferimos si tenemos una doble referencia a la tabla?, es
decir, no podemos poner directamente CityName, porque de cul se trata-
ra? Del atributo que se debe inferir de la clave fornea {DCountryId,
DCityId}, o del que se debe inferir de la otra clave fornea {ACountryId,
ACityId}? Hay una ambigedad!

- Y bueno, le tendrs que cambiar el nombre tambin a esos atributos que


necesitas inferir (CountryName, CityName) y colocarlos en el grupo de subtipos
adecuado- pens Mary pero no emiti palabra- Mustrame cmo se definen
estos grupos en GeneXus, anda; as me lo explicas mejor.

Como si hubiera ledo sus pensamientos, Diego ya estaba seleccionando el icono


Subtype Group de la ventana New Object, y le asign por nombre Departure.
Mary mantena un silencio cmplice

- Te haba dicho grupos, y realmente es as. Creas uno, le das un nombre y le


incluyes los nuevos atributos4 apuntando a sus respectivos supertipos. Enton-
ces, expresado as, GeneXus sabr que el atributo FlightDepartureCountryName
ser inferido a travs del atributo FlightDepartureCountryId y no otro. Por per-
tenecer ambos al mismo grupo, Departure. Comprendes la conexin?

4
Obsrvese cmo Diego ha establecido el nombre de los subtipos respetando la nomenclatura GIK y
comienzan con Flight, el nombre de la transaccin, y continan con el nombre del grupo, Departure.
De esta manera se asegura una semntica clara, estableciendo el rol que juegan en la transaccin.

85
- Comprendo respondi ella - Esto quiere decir que cuando el usuario digite un
valor sobre la clave fornea {FlightDepartureCountryId, FlightDepartureCityId}
no solo se va a disparar el control de integridad referencial sobre COUNTRYCITY
sino que se va a inferir en el atributo
FlightDepartureCityName el nombre
correspondiente a ese cdigo de pas-
ciudad y tambin, por tabla extendi-
da, se inferir el CountryName de ese
pas en FlightDepartureCountryName.
Ahora habra que crear el otro grupo
de subtipos, el de los arribos,
verdad?

- Bueno, no necesariamente, pues ya estn claramente identificados los dos


grupos; uno es el explcito, el que acabo de crear. Y el otro est implcito si yo
coloco los atributos CountryId, CityId en la estructura de la transaccin5 . Pero
por claridad, solemos en casos de este tipo mantener todas las ocurrencias en
grupos, porque si no, uno de los roles, en este caso el de ciudad de arribo, no
quedara claramente identificado. Te invito a que t sola armes el otro grupo,
te animas? pregunt Diego, sealando con su mano el laptop.

- Bueno, veamos - dijo Mary controlando sus impulsos para no abalanzarse


sobre el teclado Tipe, tipe y tipe, hasta que...

5
Solo con cambiarle el nombre a una de las dos ocurrencias de CountryId y de CityId alcanzara para
eliminar la ambigedad.

86
Perfecto! Diego ya tena todo para crear la transaccin Flight en GeneXus. Esta
transaccin ser de dos niveles dado que para cada vuelo existen tres clases (Bu-
siness, Standard y Executive) con tres precios diferentes, lo que en realidad la
transforma en una lista de precios (relacin 1-N). Todos los vuelos tienen hasta
tres tarifas, no ms. Otra cosa importante: el identificador de vuelo no deber
numerarse automticamente, dado que ese nmero lo determina un estndar in-
ternacional, que considera ruta y hora. Por ejemplo, el vuelo 0174, Montevideo-
Buenos Aires, corresponde a un vuelo de Pluna de los sbados de maana. Si ese
vuelo cambiara para la tarde, tambin cambiara su nmero de vuelo.

La siguiente imagen muestra la estructura final. Observe usted el cono que indica
que un atributo es un subtipo.

Capacidad mxima de pasajeros en el vuelo

Viendo que el atributo FlightClassId solo puede tener hasta tres posibles valores, fijos: Business,
Standard y Executive, se le ocurre a usted, estimado lector, qu puede hacer Diego para facilitarle
la seleccin al usuario?

Nuestro amigo comenz a documentar en el Wiki de la KB lo realizado, con la clara


intencin de cuando Mary sorpresivamente anunci que deba irse. Mil gracias,
Diego, disclpame pero debo irme, te llamo en estos das

87
Un vuelo real: Transaccin FlightInstance
La transaccin Flight pretende manejar datos generales de un vuelo, por ejemplo,
el 0174 de la aerolnea Pluna, Montevideo-Buenos Aires, que sale todos los das a
las 11:15 AM. Pero por cada vuelo 0174, tendremos un avin real, que realizar en
un da determinado, ese viaje, con determinados pasajeros.

Lo que consigue la siguiente transaccin es representar el vuelo real, con informa-


cin como la fecha y hora de partida, la cantidad de pasajeros, sus reservas con sus
nombres y nmeros de asiento. Aqu el identificador s ser numerado
automticamente.

count(FlightInstancePassengerSeatNumber)

Con este diseo, FlightNumber ser una clave fornea. Cuntos FlightInstance podrn haber para el
mismo vuelo, FlightNumber? Corresponde a lo deseado?

Existen algunos atributos aqu que merecen especial atencin. Por ejemplo,
FlightDepartureTime6 es la hora de partida estipulada del vuelo (es inferido a tra-
vs de FlightNumber), mientras que FlightInstanceDate y FlightInstanceTime son
la fecha y hora reales, del vuelo real. La hora del vuelo real, se inicializa en forma
predeterminada con el valor de FlightDepartureTime, pudiendo ser cambiada por el
usuario, para lo que Diego declar en las Rules:

default(FlightInstanceTime,FlightDepartureTime);

6
Si bien los atributos FlightDepartureTime y FlightInstanceTime son de tipo DateTime (permiten alma-
cenar una fecha+hora), solo nos interesa la representacin de la hora.

88
Esta regla solo se ejecuta cuando el modo es Insert. Por otro lado, observe la otra
regla que ha agregado Diego:

error(Number of passengers exceeded)


if FlightInstanceNumberOfPassengers > FlightTotalCapacity;

El atributo FlightTotalCapacity es inferido a travs de FlightNumber. Y


FlightInstanceNumberOfPassengers? Es una frmula que cuenta la cantidad de lneas
que se han ingresado en el subnivel. Cada vez que se agregue un nuevo pasajero
en el grid del form (que no hemos mostrado pero que usted imaginar sin problemas),
se estar agregando un nuevo nmero de asiento para ese vuelo real,
FlightInstancePassengerSeatNumber, por lo que la frmula se actualizar, sumando
1, y si con ese pasajero se ha superado la capacidad, se disparar el error que
impedir que se inserte en la base de datos, para ese vuelo.

Por ltimo, Diego declara la regla:

error(The flight departure cannot be advanced)


if update and FlightInstanceTime < FlightInstanceTime.GetOldValue()
and FlightInstanceDate <= FlightInstanceDate.GetOldValue();

Es decir, si se est actualizando un vuelo real, solo se permitir modificar su da y/


u hora de partida, siempre y cuando no se lo adelante. Obsrvese que se utiliza el
mtodo GetOldValue() de un atributo, que devuelve el valor que est almacenado
en la base de datos, mientras que el atributo tiene ahora el valor que el usuario
coloc en el form en este momento (est en memoria).

Por supuesto, se necesitar almacenar informacin de los pasajeros, por lo que


Diego crear la ltima transaccin de esta etapa.

De carne y hueso: Transaccin Passenger

89
Observe el lector que con la creacin de esta transaccin, el atributo PassengerId
de la transaccin FlightInstance se convierte en clave fornea.

El siguiente Diagrama de Bachman representa las relaciones entre las nuevas tablas
y las ya construidas.

Todo pareca bien, as que Diego accedi al Wiki, document la terminacin de esta
etapa y dej a Julia la tarea de aplicar los Work With.

90
Captulo 5
Cuando el qu
no alcanza

Solo declarar?...
y las descripciones procedurales?
Fue lo que Mary cuestion un par de citas despus, en el bar de siempre. Se haban
estado viendo con mayor frecuencia, en su oficina o en el bar, lo que haba dado
oportunidad a intercambiar sobre varios asuntos, como patterns, web panels y
dems. Lleg a este nuevo encuentro, reflexiva. Deca entender que las transaccio-
nes permiten de manera declarativa describir las visiones de datos de los usuarios.
Pero, es esto suficiente? Qu pasa con los procesos batch o similares, que en
toda aplicacin se necesitan? Estos procesos no se pueden inferir a partir del cono-
cimiento aportado por las visiones de datos. Entonces?

- S, faltara un lenguaje procedural, estamos de acuerdo precis Diego-. Si


piensas en la filosofa de GeneXus, evidentemente deber ser un lenguaje de
muy alto nivel. Ms an: deber ser un lenguaje que no utilice jams referen-
cias al Modelo Relacional, sino slo al Externo. Te mostrar un ejemplo tonto:
suponte que necesitas, por la razn que fuere, por ejemplo por malas condi-
ciones en la pista de un determinado aeropuerto en un determinado momento
de un determinado da, posponer la hora de partida prevista de todos los
vuelos grandes (que sobrepasan determinada capacidad de pasajeros). Suponte
que debern atrasarse. En definitiva, debers acceder a todos los registros de
FLIGHTINSTANCE, tales que el valor de FlightInstanceDate y FlightInstanceTime
coincidan con la fecha y hora en la que no deben despegar los aviones, y tales
que correspondan a un vuelo que parta del pas y ciudad determinado (aero-
puerto) y que tenga una capacidad de pasajeros mayor que un valor determi-
nado. Para esos registros debes modificar el valor de FlightInstanceTime, y
eventualmente tambin el de FlightInstanceDate por los nuevos. Podras ha-
cerlo filtrando en el Work With FlightInstance por esos valores, y para cada
lnea (un vuelo real) desplegada en el grid, llamar a la transaccin FlightInstance

91
en modo Update y modificar los valores manualmente, lo que seguramente
ser inaceptable para el usuario final. La otra alternativa: desde algn web
panel (bien podra ser el propio Work With FlightInstance) en variables pe-
dirle al usuario los valores de fecha y hora a modificar, pas y ciudad, y capa-
cidad, y el valor de la nueva fecha y hora de esos vuelos, y luego llamar
mediante una accin (botn o imagen) a un procedimiento que recorra los
registros de FLIGHTINSTANCE y realice el cambio.

- Un procedimiento comn y corriente?

- S, ser un nuevo tipo de objeto GeneXus. Aqu tengo la notebook. Hagamos ese
procedimiento para probarlo directamente en GeneXus. Va a ser ms claro.

Segundos despus, Diego estaba pronto para crear el objeto de tipo Procedimiento
que implementara la lgica anterior. Obsrvese la ventana de edicin del procedi-
miento terminado.

Diego declar mediante el selector Rules los parmetros recibidos:

parm( in: &CurrentInstanceDate, in: &CurrentInstanceTime,


in: &CountryId, in: &CityId, in: &NewFlightInstanceDate,
in: &NewFlightInstanceTime, in: &FlightTotalCapacity);

- Espera, Diego, que me he perdido. Deduzco que el For each es un comando


que permite acceder a la base de datos recorriendo una tabla. Pero, dnde le
dices que es FLIGHTINSTANCE la tabla que debe recorrer? Adems ests
utilizando atributos de otra tabla tambin. No deberas recorrer primero FLIGHT,
y para los registros que cumplan con las condiciones, hacer un join con la tabla
FLIGHTINSTANCE?

92
- No es necesario observ Diego-. Para empezar, la tabla no se la dices
directamente. Ah est la gracia. Mira lo que le ests diciendo con el For each
que hemos escrito:1 para cada registro de la tabla donde se encuentren los
atributos mencionados: FlightInstanceDate, FlightInstanceTime,
FlightDepartureCountryId, FlightDepartureCityId, y FlightTotalCapacity, tales
que los valores de los primeros cuatro coincidan con los de las variables recibidas
por parmetro, y el valor de FlightTotalCapacity sea mayor o igual que el de la
variable tambin recibida por parmetro, cmbiale el valor a FlightInstanceDate
y a FlightInstanceTime por los indicados.

- Sigo sin entender. Esos atributos estn en tablas distintas. FlightInstanceDate


y FlightInstanceTime estn en FLIGHTINSTANCE, s, pero los dems estn todos
en FLIGHT No deberas recorrer?

- Cierto interrumpi Diego sin dejarla terminar-. Pero FLIGHT est en la


tabla extendida de FLIGHTINSTANCE. Es decir, por cada vuelo real, tienes
un FlightNumber (clave fornea) que corresponde a un y solo un registro de
l a t a b l a F L I G H T, q u e t i e n e u n F l i g h t D e p a r t u r e C o u n t r y I d , u n
FlightDepartureCityId, y un FlightTotalCapacity. Hay una relacin N a 1 en-
tre FLIGHTINSTANCE y FLIGHT. Con eso no necesita ms: sabr que debe
recorrer la tabla FLIGHTINSTANCE, accediendo para cada registro a su
correspondiente en FLIGHT, es decir, haciendo un join automtico para sa-
ber el valor de los atributos FlightDepartureCountryId, FlightDepartureCityId
y FlightTotalCapacity y con eso decidir si se queda o no con el registro para
procesarlo (por supuesto, siempre y cuando el propio registro de
FLIGHTINSTANCE cumpla con ser del da y hora indicados por las variables
&CurrentInstanceDate y &CurrentInstanceTime). La condicin que impone
sobre un registro para quedarse con l y procesarlo, es la concatenacin
con And de todas las condiciones lgicas que ves en las clusulas Where del
For each. Como antes hablamos de tabla base, aqu tambin: para el For
each es la tabla que recorre. Observa, entonces, cmo conociendo las
relaciones entre las tablas y dnde estn los atributos en el momento del
anlisis, GeneXus puede inferir el acceso a los datos sin que le tengas que
nombrar tabla alguna. Esto tiene una consecuencia importante: permite
que se puedan cambiar de tabla esos atributos, sin que la descripcin del
procedimiento pierda validez2 .

1
Respire profundo, amigo lector, no se nos vaya a quedar sin aire a la mitad
2
Por supuesto: siempre y cuando los atributos pertenezcan a una misma tabla extendida. En caso
contrario GeneXus arrojar un error, informando que no fue posible relacionarlos.

93
- Por qu? Hmmm parece un poco mgico, no me sentira segura programando
as.

- No Mary, creme, nada es mgico. Miremos el listado de navegacin para


aclarar tus dudas (y las mas; siempre antes de ejecutar un procedimiento
para probarlo, el primer test ya est hecho: es el listado de navegacin, que
informa sobre gran parte de lo que te da inseguridad. Por eso, nunca ejecuto
sin antes mirar ese listado. Bueno, est bien, no te voy a mentir. A veces no lo
miro, de apurado noms, y luego me arrepiento). Mirmoslo juntos

Tabla base

Se debe acceder
a esta tabla
haciendo Join

- Ves? Te informa la tabla base del For each, el orden por el que procesar la
informacin3 y el ndice que propone para satisfacer ese orden (si es que existe).
Adems te informa los filtros de navegacin, es decir, desde dnde empezar
a recorrer la tabla y hasta dnde (en nuestro caso, recorrer toda la tabla4 ).
Luego se observan las Constraints (filtros sobre los registros a recorrer). Ms
abajo se observa que por cada registro de FLIGHTINSTANCE se debe hacer un

3
El orden puede indicarse mediante la clusula Order del comando For each. Como no se ha indicado,
y no existe ningn ndice en la base de datos que permita optimizar la bsqueda de los registros que
cumplan estas condiciones, asume clave primaria de la tabla a recorrer.
4
Si existiera un ndice compuesto por {FlightInstanceDate, FlightInstanceTime, FlightDepartureCountryId,
FlightDepartureCityId, FlightTotalCapacity}, lo propondra sin dudar, optimizando la consulta, de modo
que ya no tendra que recorrer toda la tabla y esto lo informara en los Navigation filters del listado de
Navegacin. Aun si no existiera este ndice, pero s uno compuesto por un subconjunto de esos atributos,
lo propondra. Es decir, siempre que exista un ndice que le permita optimizar la consulta, lo propondr.
(No lo dijimos antes, pero en cualquier momento usted puede pedirle a GeneXus la creacin de un
ndice de usuario) Por qu decimos lo propondr? Pues para los generadores SQL si bien esta
informacin es til e influyente, en realidad es el propio DBMS quien resuelve el plan de acceso ms
apropiado. Para los no SQL (RPG, COBOL, VB-Access, VFP-DBF) en cambio, es vital. Existe mucho para
conversar sobre este tema, estimado lector, pero no viene a cuento en esta historia.

94
join con la tabla FLIGHT de su extendida (para realizar los filtros por
FlightDepartureCountryId, FlightDepartureCityId y FlightTotalCapacity) y que
se actualizarn de la tabla FLIGHTINSTANCE los atributos FlightInstanceDate
y FlightInstanceTime. S franca, Mary, y dime cunto ms te costar
implementar esto mismo utilizando las herramientas que usas. Habras
implementado t misma este join. Lo mejor, en verdad, es el hecho de seguir
hablando en alto nivel. Piensa qu pasara en tu implementacin, que
seguramente requerir nombrar las tablas, si mueves por ejemplo, el atributo
FlightTotalCapacity de FLIGHT a FLIGHTINSTANCE. Aqu no tendrs que tocar
absolutamente nada. Simplemente volver a generar el objeto, para que GeneXus
infiera la nueva navegacin y listo!

- S, comprendo. Y cmo insertas y eliminas registros de la base de datos?

- Bueno, el comando For each te permite recorrer una tabla de la base de datos,
y acceder a su extendida, tanto para consultar solamente, como para actualizar
atributos. Por este motivo, es un comando importantsimo, que podr ser
utilizado no solo en procedimientos sino en todo objeto GeneXus donde se
admita cdigo procedural (como los eventos de transacciones y web panels,
por ejemplo). Para las inserciones y eliminaciones se han creado dos comandos
especficos: New y Delete5 .

- Ahora que pienso, no ests controlando en el procedimiento lo que s controlas


en la transaccin FlightInstance: que no intenten cambiar la fecha y hora del
vuelo, adelantndolo. Si mal no recuerdo, all tenas una regla de error que
controlaba eso.

- Tienes razn! - Pensativo, Diego rumiaba algo. Mary lo miraba entusiasmada.


Tras unos segundos de meditacin, rompi el silencio- Tendra que hacer ese
control en el procedimiento, preguntando con un comando If antes de lanzarme
a actualizar as sin ms. Toda vez que quiera modificar fecha y/u hora de un
vuelo real, en cualquier objeto, tendr que volver a hacer el mismo control que
haca mediante la regla en la transaccin. Repitiendo el cdigo. Una y otra, y
otra vez. Quizs en alguna me olvido. o me equivoco.

5
En ninguno de los dos casos se hacen controles de integridad referencial, permitiendo as insertar
registros que apuntan a un registro inexistente, o eliminar registros que son apuntados por otros,
dejando a estos ltimos hurfanos. El nico control que se realiza es el de unicidad. Hablamos de
controles programticos, ya que en GeneXus se puede indicar si se desea activar la integridad referencial
a nivel del DBMS, en cuyo caso siempre se controlar.

95
A lo seguro y sin transpirar:
el qu de los Business Components
- Ya que sabemos continu con una renovada vitalidad- que las transacciones
son uno de los objetos ms importantes, porque en ellas se recogen las visiones
de los usuarios, las reglas del negocio, las frmulas, y se ejecutan los controles
de unicidad y de integridad referencial, qu me dices sobre reutilizarlas desde
cualquier otro objeto GeneXus?

- Ehh?! la expresin extraada de Mary provoc la risa de nuestro amigo.

- S, reutilizarlas, aprovechando todo ese conocimiento que ya tienen


incorporado. Por ejemplo, si yo tuviera una forma de encapsular toda la lgica
de la transaccin FlightInstance, dejando de lado la interfaz es decir, si
pudiera tener algn buffer o parecido, alguna estructura temporal, por ejemplo
una variable compuesta, estructurada, donde cargar los datos de un vuelo
real (cabezal y lneas) podra ingresarlo en la base de datos desde cualquier
objeto Si realmente tuviera encapsulada la lgica de la transaccin de esa
forma, entonces se permitir la insercin solamente si se cumple todo lo que
se debe cumplir para ingresar esa misma informacin va la transaccin
Quiero decir: si quisiera insertar una instancia de vuelo asocindole un vuelo
(FlightNumber) inexistente, o pretendiendo agregar algn pasajero inexistente,
fallar y no me dejar hacer la insercin, tal como ocurre con la transaccin.
O, por ejemplo, si quiero agregar un pasajero existente pero con el que se
excede la capacidad del vuelo, no me dejar realizar esa insercin, tal como
sucede cuando quiero hacerlo va la transaccin, dado que tengo una regla
de error en la misma que lo impide Diego abri la transaccin FlightInstance
y mostr a Mary la seccin Rules. Usted, estimado lector, puede buscarla en
el captulo anterior (pg. 89)-. Encapsular la lgica de la transaccin,
quedndose con la estructura pero dejando de lado el form es posible: se
llama Business Component. Es un tipo de datos generado por GeneXus a
partir de una transaccin6 .

- Y cmo haces para encapsular todo eso? y cmo lo usas?

6
Los Business Components se obtienen de objetos transaccin, pero pueden ser utilizados desde
cualquier otro objeto GeneXus, para hacer inserciones, eliminaciones y modificaciones en sus tablas.

96
- A la transaccin que quieres utilizar de esta otra forma silenciosa, alcanza
con cambiarle el valor de su propiedad Business Component a True. A
partir del momento en que guardas este cambio, GeneXus crear un nuevo
tipo de datos Business Component, cuyo nombre ser el de la transaccin.

- Y cmo lo utilizas? volvi a preguntar, intrigada.

- A travs de variables basadas en ese tipo de datos. Siempre que quieras


actualizar, insertar o eliminar una instancia de vuelo, en vez de utilizar For
each, New y Delete, podrs utilizar toda la potencia de la transaccin
FlightInstance a travs de las propiedades y los mtodos de una variable basada
en el tipo de datos FlightInstance que GeneXus gener. Modifiquemos el
procedimiento anterior para hacer la actualizacin mediante un Business Compo-
nent prosigui Diego su monlogo; Mary observaba expectante sin hablar-.
Necesitamos una variable, &FlightInstance de este tipo de dato generado cuando
pasamos a True la propiedad Business Component. En ella alojaremos todo
el contenido de la instancia de vuelo a cambiar. Esta variable ser, lgicamente,
estructurada, ser el buffer donde temporalmente tener los datos del vuelo
que queremos manipular en un momento dado. El cdigo nos quedara ms o
menos as- y sustituy en el objeto las dos asignaciones directas por las
cuatro sentencias que se pueden observar en la siguiente imagen-. Observa
que aqu solo utilizamos el For each para recorrer la tabla base y filtrar, pero no
actualizamos directamente:

97
Ves? Lo primero que hago aqu es cargar desde la base de datos la instancia
de vuelo a modificar, dentro de la variable &FlightInstance, segn el valor de
FlightInstanceId que corresponde al registro que cumpli las condiciones de
filtro dentro del For each (es el registro de esa iteracin). Luego cambio
solamente los datos que debemos modificar, y luego grabo, con el mtodo
Save. Observa la analoga: para editar un vuelo mediante la transaccin,
hubieses colocado el identificador en el campo FlightInstanceId del form y
salido del campo. Para hacer eso con el Business Component, utilizamos el
mtodo Load. En la transaccin hubieses cambiado en el form, los valores de
los campos FlightInstanceDate y FlightInstanceTime y luego hubieras presionado
[Confirm]. Y aqu? Cambias lo valores en la variable, y luego ejecutas el
mtodo Save. Lo que pasar como consecuencia de esas acciones, es
prcticamente lo mismo. Quiero decir, qu pasara si en la transaccin
modificaras fecha y hora de forma tal que adelantaras el vuelo?

- Se disparara el error ese que habas programado como regla, y no nos dejara
grabar, o sea, no se realizara ese cambio en el registro. Lo dejara como
estaba antes.

- Exactamente. Y qu piensas que suceder aqu, en el procedimiento?

- Lo mismo? pregunt y afirm al mismo tiempo.

- Lo mismo! Disparar la regla, y como su condicin se satisfar, no te dejar


grabar el cambio.

- Y cmo me entero?

- Bueno, en el caso de la transaccin, como es un objeto interactivo, all no hay


duda. Sin embargo, un Business Component no lo es, razn por la cul los
posibles mensajes y errores producto del procesamiento (ejecucin de mtodos
Load, Save o tambin Delete, el utilizado para eliminar) deben quedarte
almacenados en algn lado. GeneXus los inserta en una coleccin (lista) de
mensajes asociados a la variable Business Component de que se trate, y la
puedes recuperar con un mtodo (GetMessages). Luego tienes la posibilidad
de recorrer esa lista de mensajes Pero si solo te interesa saber si se produjo
algn error, tienes el mtodo Fail que te devuelve True en caso de error: as,
en nuestro caso, programaras if &FlightInstance.Fail()

- Entiendo. Y qu otros errores podran producirse cuando manipulas la


informacin con el Business Component?

98
- Los mismos que cuando intentas insertar mediante la transaccin
FlightInstance. Es decir: los de integridad referencial (si quisieras cambiar
por ejemplo el vuelo, FlightNumber, que es clave fornea, por uno inexistente),
el de unicidad (por ejemplo, si quisieras insertar una instancia de vuelo nueva,
y le asignas un FlightInstanceId que ya existe para otro registro), las
validaciones de tipos de datos, las reglas de error declaradas en la transaccin,
y cuyas condiciones de disparo se satisficieran Observa como en este sentido
es ms seguro hacer un procedimiento utilizando Business Component... y
sabes que se van a disparar todas las reglas del negocio, sin tener que
repetirlas.

- Todas? Si no te quedas con la interfaz visual, qu ocurre si en la transaccin


hubiera una regla que disparara una llamada a un web panel, por ejemplo?

- Bueno, no todas GeneXus ignora en el Business Component las reglas que


hacen uso de interfaces de usuario. Esa no ser incluida.

- Interesante -dijo pensativa.

A dnde quieres llegar?


Atracciones que invitan en pdf

El lector observador habr notado lo que Mary en su momento (y que prefiri dejar
en el tintero esperando la oportunidad propicia):

- Entre los selectores del objeto de tipo Procedimiento aparece uno


Layout. Para qu? Acaso un procedimiento te permite efectuar una
salida visual?

- Pues s. Casualmente los usuarios nos han pedido como requerimiento que el
sitio de la agencia de viajes tenga una pgina que muestre las atracciones por
ciudad, y un link del estilo Ver como pdf. Para eso, yo cre un procedimiento
al que llam AttractionsPerCity. Mira dijo Diego mientras abra el objeto en su
notebook y seleccionaba Layout.

99
Le tendr que decir a este procedimiento que tendr una salida como pdf. La idea del
Layout es declarar qu es lo que quiero mostrar en la salida. Como resultado de la
ejecucin, quiero mostrar para cada ciudad, todas sus atracciones. Evidentemente,
el usuario final tendr que tener Acrobat Reader instalado para que desde el Browser
se pueda abrir correctamente el archivo pdf generado. Para indicar qu es lo que se
quiere mostrar en la salida y su formato, el Layout contiene reas de impresin, que
son controles llamados printblocks. Coloreados en la imagen, puedes ver donde
empiezan dos de esos controles: City_Block y Attraction_Block. Esos nombres se los
di yo luego de insertar cada control. Dentro de cada printblock insertas la informacin
(atributos, variables, imgenes, lneas, recuadros, etc.) que deseas desplegar en esa
rea de datos, cuando sea invocada desde el cdigo. Por ejemplo, observa que dentro
de City_Block he insertado los controles atributo CityId y CityName, porque esa es la
informacin de cada ciudad que querr mostrar en el listado.

- Y solo con eso GeneXus ya sabe qu listar y cmo?

- Uhhh Mary, espera. No le pidas magia al amigo! Con eso solo no puede saber
cmo quieres listar la informacin. Falta el cdigo dijo enarcando las cejas,
con expresin risuea, al tiempo que un rubor se instalaba en las mejillas de
su interlocutora.

- Bueno, lo presentas como tan maravilloso bien podra adivinar tus intenciones,
no? sonrieron ambos.

100
- T las adivinas? avanz Diego.

- Y si las explicitas? contest Mary sin retroceder, mirndolo fijamente a los


ojos, con una expresin que a l se le antoj encantadora.

- Sus deseos son rdenes!... y tras un breve silencio que a ambos pareci
eterno, continu diciendo- Quiero recorrer dos tablas: COUNTRYCITY y
ATTRACTION. Para cada registro de COUNTRYCITY, quiero recorrer todos los
registros de ATTRACTION relacionados, es decir, que correspondan a ese pas-
ciudad. Esto implica la utilizacin de dos For eachs anidados.

Mary aproxim su silla a la de l, tom el mouse sin preguntar, siempre sonriendo,


y se posicion en el selector Procedure. La ventana se transform, mostrando el
siguiente cdigo:

Diego continu:

- Observa que no necesitas establecer el filtro por ciudad para el segundo For
each: es que existe una relacin 1-N directa entre las tablas que se recorren,
siendo uno de los casos ms comunes de For eachs anidados. La tabla base del
For each externo es COUNTRYCITY, y la del interno es ATTRACTION (por los
atributos de los printblocks involucrados), y como GeneXus conoce las relaciones
entre las tablas, l implcitamente aplica la restriccin sobre los registros a
recuperar. Pero es ms potente que eso, encuentra tambin relaciones 1-N
indirectas; por ejemplo, si quisieras listar para cada aerolnea la cantidad de
instancias de vuelo7 .

7
Entre las tablas AIRLINE y FLIGHTINSTANCE hay una relacin 1-N indirecta (est la tabla FLIGHT de
intermediara). GeneXus encuentra en muchos otros casos relacin 1-N indirecta y hace el join.

101
Mary no emita palabra. Miraba la pantalla. Una sonrisa segua estampada en su
rostro. Posicion el mouse sobre el Tab del procedimiento donde se encontraba su
nombre, y con botn derecho seleccion View Navigation del men contextual.
Diego la miraba. Apareci un nuevo Tab en la pantalla, conteniendo la siguiente
ventana:

- Ves lo que digo? Est restringiendo la bsqueda- explic a una Mary que
observaba y sonrea-. Te lo indican los filtros en la navegacin de la tabla
ATTRACTION en el segundo For each. Observa el @. Est indicando que toma
esos valores del contexto. Cules son @CountryId y @CityId? Los del registro
del primer For each con el que se encuentra trabajando en esa iteracin. Esas
intenciones GeneXus s las descubre.

Diego continu, llenando el silencio que Mary no llenaba:

- Tambin puedes decirle que quieres que enve la salida a alguna impresora de
las que estn bajo el alcance de la computadora desde la que se est ejecutando
el browser con la aplicacin.

Por fin, tras algunos instantes, Mary rompi el silencio. -Me atrae Pars
Por qu no vienes esta noche a cenar a casa? Y me sigues contando

102
Captulo 6
Soplan nuevos vientos

Poniendo la casa en orden: categorizacin


Esa noche Diego llev el vino. Y la notebook. La msica de fondo creaba un am-
biente por dems acogedor.

- Debes cumplir lo prometido reclam Mary sonriendo, mientras llenaba su


copa-. Dime ms.

- Sobre GeneXus? Bueno, no s qu decirte -pareca nervioso, aunque pronto


sali del paso-. Hoy por ejemplo estuve
categorizando los objetos de la KB. No s si re-
cuerdas, pero el IDE tiene un panel rotulado
Category View en el contenedor KnowledgeBase
Navigator que te expone, en rbol, todos los obje-
tos que hayas clasificado dentro de sus corres-
pondientes categoras. Espera que te muestro
deposit la notebook en su falda y la copa sobre
la mesita prxima al sof.

- No veo clara la finalidad respondi Mary sentn-


dose a su lado.

- Bueno -mientras la notebook terminaba de iniciar,


Diego llenaba el silencio-, por ejemplo, en mi com-
paa solemos tener categoras para identificar el
estado de los objetos: Operating, Under Review,
Under Construction. As, puedes saber en un sim-
ple pestaeo, qu objetos estn prontos para ser
testeados simplemente abriendo la categora
Under Review. En este caso, separamos nuestro
universo de objetos en categoras disjuntas. De
hecho hasta puedes darle un nombre a este crite-

103
rio de clasificacin de tu universo, justamente mediante una categora: Sta-
tus por ejemplo, que contenga a estas tres subcategoras. Pero simultnea-
mente, podemos querer categorizar el mismo universo, de acuerdo a otros
criterios. Lo que quiero decir: puedes incluir un mismo objeto en varias cate-
goras distintas. Por ejemplo, suponte que quieres organizar adems, por sis-
tema, subsistema, etc. Nada impide que un objeto est en la categora corres-
pondiente a un subsistema, y adems en la Under Review de la Status. O
puedes categorizar los objetos segn si se utilizarn en el Back-end de la
aplicacin, o en el Front-end. Las categoras nos permiten organizar y visualizar
la informacin de nuestra KB de acuerdo con nuestras necesidades puntuales.

- Multicategorizar le brillaban mucho los ojos. Al menos eso le pareci a Diego.

- Cuando seleccionas un objeto del Folder View, debajo de la ventana de propie-


dades, tienes un contenedor rotulado como Categories que comienza con una
pequea toolbar en donde puedes tanto agregarle categoras al objeto como
eliminrselas. Pero, como siempre, tienes varios caminos para llegar a Roma

- Hoy estuviste categorizando eso significa que tuviste que ir uno por uno a
todos los objetos y asignarles las categoras correspondientes, no? Mucho
trabajo!

- S contest l un poco consternado-. Es que no hace mucho que aparecieron


las categoras, y no me he acostumbrado a usarlas, si bien fue decisin de la
empresa el uso de categoras de estado. A veces es difcil cambiar las costum-
bres. Tendramos que haber creado estas categoras desde el vamos, y los
objetos ya con la categora Under Construction y luego ir movindolos de
categora, en el cambio de estado. Hoy tuve que poner la casa en orden, ya
eran muchos los objetos de la KB. Pero solo tuve que hacer esto para las
subcategoras de Status porque la categora To-Do Diego es dinmica, se
mantiene sola.

- Cmo es eso? Mary estir el brazo hasta la botella de vino.

- En este caso, aprovechando que tena que poner la casa en orden, puse co-
mentarios que contenan el texto To-Do Diego en algunos objetos que tena
pendientes de cerrar. Luego cre una categora dinmica. Las categoras din-
micas tienen asociada una condicin de bsqueda. Todos los objetos resultan-
tes de la bsqueda pasan a formar parte de la categora. Puse en la condicin
de bsqueda que tuviera el texto To-Do Diego y all aparecieron todas las
cosas que tengo por hacer varias por cierto

104
El que busca encuentra
Otra de las interesantes funcionalidades que hallar en GeneXus Rocha es su capa-
cidad de encontrar cualquier cosa que se halle en la KB. Esta facilidad se presenta
de la misma forma que experimentamos cuando hacemos uso de los motores de
bsqueda en la Web. Basado en complejos algoritmos, el motor full-text search de
GeneXus Rocha localiza lo buscado entre lo que podran ser toneladas de palabras
contenidas en los objetos que componen la KB. Y al igual que la mayora de los
buscadores, nos permite utilizar sintaxis intuitivas para acotar las bsquedas. En la
siguiente imagen puede ver la bsqueda por To-Do Diego

El motor full-text search explor la KB y report todos los lugares donde estaba
presente la frase To-Do Diego. Note que debajo, en Advanced, se propone tam-
bin una bsqueda, pero en este caso solo de propiedades. Por ejemplo, si se
quisieran ubicar todos los objetos con la propiedad Main program con valor True,
escribiramos main_program = True y listo.

Obsrvese adems cmo desde esta consulta, puede crearse la categora dinmica
de igual nombre To-Do Diego que Diego mostr antes a Mary. Para ello alcanza
con hacer [Save as Category]. Tal vez sea lo que hizo Diego ese da

105
Base, rimel, sombras
Maquillando la aplicacin
Esa misma tarde, unas cuantas horas antes, Julia liquidaba la documentacin en la
KB cuando Mike, que finalizaba los ltimos testings, coment:

- Me enter por Diego que quieren cambiar el estilo de las pginas. l estaba
muy atareado, terminando el desarrollo de unos objetos, y me deriv este
tema a m. Me dijo que hablara contigo para pedirte los detalles.

- S, me enviaron un e-mail que describe ms o menos el aspecto que desean y


lo copi como Talk del Main Document; luego lo documento bien. Dejaron a
nuestro arbitrio la composicin de colores y dems. Yo ya haba ingresado
hace tiempo el logo de ellos a la KB, en el nodo Images. Quieren que quede
situado arriba en todas las pginas.

- Eso lo hago ahora mismo. Solo tengo que abrir la master page AppMasterPage
creada con la KB y utilizada por defecto por todos los objetos. Es donde se
encuentra centralizado el encabezado y pie que tendrn todas las pginas del
sitio luego sustituyo el encabezado
Application Header que sale por defecto
y listo. Para todo lo otro que piden,
llamemos a Paul, el diseador grfico

- Pero Paul no sabe nada de Genexus y t le vas a permitir que abra los
objetos y modifique los controles en los forms, cambindoles el color, el tama-
o, y dems?! Nunca entend

Mike ri francamente: -Julia, mira, cada uno en lo suyo. Yo no le dejo tocar nues-
tros objetos. Pero necesito que configure para cada control de los forms, su diseo.
Por ejemplo, necesito que especifique para los botones de las transacciones, su
tamao, color de fondo, tipo de letra, etc. Lo mismo para los grids y dems contro-
les. Quisiera centralizar eso y que l no tenga que tocar los controles en los
objetos. Para eso es que existe el objeto de tipo Theme. Observa que bajo el nodo
Themes del Folder View, aparece uno de nombre Modern. Es el que asoci GeneXus
por defecto a nuestros objetos. Si lo abro, vers que se trata de una lista, en rbol,
de clases de controles (aunque no solo).

106
Aqu se configuran
los aspectos de
diseo para esta clase.

- Cada tipo de control tiene varias clases posibles. Dentro de la clase Button hay
una subclase que es BtnDelete, que por defecto hereda sus propiedades pero que
te permite cambiar sus caractersticas. Si ahora vamos a cualquier transaccin y
editamos el form, podremos ver en las propiedades del botn [Delete] que tiene
asociada esta clase. Puedes cambirsela
por otra. Con esto te queda perfectamen-
te separado en tu aplicacin el compor-
tamiento del diseo. Te digo ms, ahora
lo que har ser exportar1 de nuestra KB
el theme Modern (podra tambin crear
uno propio), envirselo a Paul para que
l configure los aspectos de las clases y
me lo enve nuevamente, momento en
que lo importar y listo! Diseo aplicado! Paul no necesita tener GeneXus, sino
solamente el Theme Editor, un utilitario que solo permite trabajar con estos obje-
tos. Es especfico para el diseador grfico. Si no tambin lo puedes hacer desde
dentro de GeneXus.

Los tipos de objeto Master Page y Theme son los que ms importan a la hora de
disear la esttica de la aplicacin.

1
No habamos hablado hasta el momento de exportacin/importacin en GeneXus. En este libro sola-
mente diremos que se pueden exportar objetos GeneXus y otro tipo de conocimiento de una KB en
archivos de extensin xpz, que luego pueden ser importados en otra o la misma KB. Para ello est la
opcin del men Knowledge Manager.

107
Dime cundo y te dir cmo eras
Otra interesante posibilidad que ofrece GeneXus Rocha es la de poder consultar la
evolucin de los objetos dentro de la KB a travs del tiempo. Es decir, cada objeto
tendr asociada una historia que estar registrada con su fecha y hora y el usuario
que hizo las modificaciones. Con esto se podr seguir la evolucin de un objeto
desde su inicio mismo.

Y lo que es ms: en un futuro muy prximo, tal vez ahora mismo, usted podr
disponer del estado real que tena el objeto segn la versin que haya seleccionado
con el mouse. En la siguiente imagen

se observa, a la izquierda, el contenido del panel Latest Changes View y a la


derecha la historia de la transaccin FlightInstance. Note que existieron dos modi-
ficaciones desde su fecha de creacin, por lo tanto hay tres nmeros de versin.
Tambin podr comparar dos versiones entre s y obtener sus diferencias. Potente,
verdad?

108
Lo que dice el Orculo
Cuentan que cuentan ciertos profetas que, sin importar la alineacin de los astros,
el Orculo predijo que un nuevo tiempo se iniciara

Nuevos protagonistas del conocimiento: Data Providers


La meta de GeneXus: que usted declare, declare y declare. Cuando uno declara,
dice el qu, y no se preocupa por el cmo. El cmo vara con el tiempo. Con
frecuencia se encuentran nuevas formas de implementacin, mejores, ms eficien-
tes. El qu es estable. La esencia. Conocimiento que permite automatizar. Las
transacciones y los business components eran, as, las estrellas de GeneXus: de-
claraban la lgica del negocio. Declaraban conocimiento. GeneXus encontraba, en
cada etapa de su evolucin, un cmo. Pero un nuevo tiempo se inicia. Un nuevo
protagonista irrumpe en escena: el Data Provider. Para una gran variedad de casos,
pasaremos de programar procedimientos, a declarar data providers.

Componentes inteligentes, capaces de procesar diversos tipos de inputs, filtrarlos,


ordenarlos, y producir algn tipo deseado de salida (como otra estructura de datos,
o un determinado formato).

En todo proceso podemos decir que tenemos un input, una transformacin y un


output. En los procedimientos el foco est puesto en la transformacin. En los Data
Providers lo relevante, declarado, es el output.

Qued intrigado con tantas luces y brillos puestos en este concepto? Quisiera ver
un ejemplo, que encarne tanta palabra apreciativa? Como nos gusta el misterio, y
dejarlo con la espina clavada hasta el final, nos reservamos una exposicin ms
extensa del tema para el anexo que sigue a este captulo, si es que sigue con ganas

Enmascarando deseos con Data Selectors


Es comn encontrarnos codificando las mismas situaciones (filtros y rdenes de
acceso a la base de datos) en distintos lugares de nuestra aplicacin donde recupe-
ramos datos, desperdigando por variados lugares la misma lgica (o parte de ella).

Observando los siguientes trozos de cdigo

109
y comparando entre ellos, es evidente que obtienen resultados distintos, aunque
con un mismo trozo de lgica: ambos quieren filtrar por ciudades africanas
(CountryWorldRegion=1), ordenndolas por nombre. El primero despliega en la
salida exactamente eso (supongamos que City_Block contiene atributos de ciudades),
y el segundo las atracciones de categora Safaris de ciudades africanas. Obsrvese
el bloque de cdigo en comn, compuesto por un orden y un filtro. Podra haber
decenas de objetos GeneXus donde se necesitaran las ciudades africanas ordenadas
por nombre.

Un Data Selector permite la centralizacin y el reuso de navegaciones, evitando la


duplicacin de cdigo.

Pero tiene ms ventajas. Es muy comn que la gente nueva incorporada al staff de
desarrollo desconozca los criterios o filtros comunes de una aplicacin. Suponiendo
que se quiere promocionar fuertemente el turismo africano, suele pasar, por ejemplo,
que se le pida un listado de ciudades y salgan todas las ciudades en lugar de slo
las africanas. La centralizacin de estos criterios reduce enormemente la curva de
aprendizaje haciendo productivo al personal rpidamente y reduciendo el nmero
de errores.

En el ejemplo anterior, si le diramos un nombre a esas clusulas comunes como si


fuera una macro que luego pudiera expandirse obtendramos un Data Selector!
Un nombre para un criterio de bsqueda de datos. En nuestro caso: AfricanCities.

Los procedimientos anteriores nos quedarn:

110
A la derecha del comando For each se ha escrito la clusula Using la cual dice que
se utilice el contenido del Data Selector AfricanCities; y eso es todo si luego
modificamos el criterio, lo hacemos dentro del objeto Data Selector y se cambia en
todos lados automticamente!

El camino de los procesos


Los humanos somos buenos para muchas cosas, pero en tareas como buscar un
documento entre cientos de otros, tener presente sus vencimientos, y asegurarse
de que el trabajo terminado pase de un lugar a otro respetando una secuencia
previamente definida... hmmm lo somos?

GXflow, conocida herramienta de Artech que se relaciona con la automatizacin de


los procesos en las empresas, determinando flujos de tareas, est tambin integrado
a GeneXus Rocha. Por qu? Las aplicaciones cada vez ms contienen flujos de
procesos que requieren de componentes de Workflow.

En efecto, usted podr crear sus propios diagramas dentro de GeneXus, simplificando
en mucho las tareas de integracin y haciendo sencilla la vinculacin de las
actividades con los objetos de la KB.

En la imagen se ha diseado un sencillo


ejemplo que muestra el flujo del proceso de
reserva de un vuelo.

La reserva en s misma, expresada por el


primer bloque del esquema, no es ni ms ni
menos que la puesta en ejecucin de la
transaccin a la que representa.

Luego se evala determinada condicin, como


podra ser que los datos estn correctos y
completos. A los efectos de exponer un
ejemplo, vea las siguientes condiciones:

Print Tickets IF FlightStatus = AUTHORIZED


Get in contact with Client IF FlightStatus =
CORRECT PERSONAL INFORMATION

111
Estas condiciones son expresadas mediante un editor de condiciones. La idea es que
se puedan expresar reglas, donde primero se indica el nombre de la tarea sucesora e
inmediatamente la condicin que se tiene que cumplir para que siga por ese camino.
Sencillo, prctico y potente.

En caso de que sea as, se imprime el ticket de reserva y se enva a su destinatario.


De lo contrario, el flujo se deriva hacia la puesta en contacto con el cliente, se
actualiza la informacin (seguramente mediante la transaccin correspondiente a
los clientes), y se vuelve a retornar el flujo hacia la reserva, reinicindose el ciclo.

Usted ya era usuario de GXflow? Quiere ver un resumen de los cambios? Al


anexo, sin ms trmites

Back y Front End - Intra e Inter Net


En este libro nos hemos permitido inmiscuir en algunos momentos de la vida de
nuestros personajes, lo que nos permiti observar cmo se han implementado
algunas partes de la aplicacin. El objetivo: ver un poco de cada cosa. Pero no
hemos visto el todo. Por momentos los autores sentimos un poco de vergenza
de nuestro voyeurismo y quitamos la mirada, para luego, tentados, volver
nuestros ojos a la historia. Por esta razn, hemos visto entremezclados objetos
que sern utilizados en el Back-End de la aplicacin (por ejemplo los Work With,
dado que la actualizacin de la informacin de aerolneas, pases, ciudades,
vuelos, pasajeros, etc., slo podr ser efectuado por empleados de la empresa,
con permisos, a travs de la intranet), con otros que pueden utilizarse en el
Front-End, es decir, en el sitio Web que ser consultado por personas de todo el
mundo va Internet.

Sin embargo, Diego, Mike y Julia han trajinado mucho ms de lo que hemos podido
apreciar. Han hecho la pgina principal de la Intranet, modificando un poco la
pgina Home creada por el pattern Work With. Han agregado una seccin de login
a la master page web panels con consultas variadas y distintos mens.

Esa misma tarde, sin ir ms lejos, antes de la cita con Mary, mientras Paul reciba
un theme para modificar, Julia se contactaba con los usuarios de Travel Agency, y
Mike terminaba los testeos, Diego observaba detenidamente cmo haba quedado
la pgina principal del sitio web de la empresa:

112
Obsrvese que se brinda informacin de hoteles, de rentadoras de autos y del
estado del clima. Estas son aplicaciones de terceros, publicadas como Web Ser-
vices que se pueden integrar (consumir) fcilmente dentro de GeneXus. A esta
altura el lector tiene todos los elementos para hacer la radiografa de la pgina y
sospechar qu puede haber detrs de la misma: un web panel, web components,
master page, theme, imgenes, contoles

Sin embargo, Diego no us todo eso. Dentro de las tecnologas GeneXus, GXportal
permiti a nuestros amigos el desarrollo del portal web con mnimo esfuerzo. Lo
habr desarrollado Diego? O habr sido Julia?

GXportal permite disear, administrar y mantener portales escalables, sin necesidad


de programar. Por lo tanto el usuario de GXportal no necesita tener conocimientos
especficos de programacin o diseo. Ofrece un marco de trabajo para la integra-
cin de conocimiento, informacin y aplicaciones a travs de un portal, buscando
unir los distintos actores de la organizacin y las comunidades.

113
Final o principio?
Hasta aqu hemos obtenido distintas piezas de un rompecabezas que usted ir
armando, valindose de la ms importante: su imaginacin.

Con ella, las piezas faltantes se le irn descubriendo en una bsqueda continua.
Inacabable. El puzzle est siempre prximo a pero nunca se completa. All radica
su secreto: mantenernos eternamente en vilo, buscando, pensando, imaginando,
cambiando.

Amigos, con fe, con alegra, con generosidad, con la sinergia de esta
Comunidad, vamos adelante, y preservemos la magia.

Breogn Gonda en el cierre del XVI Encuentro Internacional GeneXus


20 de Setiembre de 2006

Qu pas con nuestros personajes? Fue exitoso el proyecto de desarrollo? Cmo


termin esa cena con msica de fondo? Se habr convencido Mary de ingresar a la
Comunidad? Piezas que faltan, y que cada uno encontrar como los secretos que
an gesta la Rocha

O es que esta historia recin empieza?

114
Anexo
Construyendo el futuro

Da a da, la complejidad en el desarrollo de aplicaciones crece; GeneXus tiene su


arma para combatir esta complejidad y es el desarrollo basado en conocimiento.

La idea a la que siempre ha apostado GeneXus es que partiendo del conocimiento


se puede generar totalmente la aplicacin (y, como subproducto, mantenerla
automticamente). GeneXus Rocha reafirma la plena validez de esa idea. GeneXus
Rocha no es una versin ms en este aspecto, ser su refundacin, la que ms
conocimiento capture y utilice. Por qu? Porque uno de los conceptos fundamen-
tales que diferencia a GeneXus Rocha de sus predecesores es la arquitectura de
extensibilidad con la que fue ideada.

Esto significa actualmente que no solamente Artech construye a Rocha: toda la


Comunidad GeneXus aporta a su construccin a travs de sus propias extensiones.

Cuando hablamos de extensibilidad, hablamos a todo nivel, desde la captura de


conocimiento estructurado o desestructurado, hasta la participacin en la aplica-
cin generada.

Le corresponder, adems de a Artech, a la Comunidad GeneXus, ser la encargada


de idear nuevos mecanismos de captura de conocimiento, metodologas
automatizadas de desarrollo y, en definitiva, generacin de las aplicaciones del
futuro.

El gran beneficiario de las extensiones es la Comunidad (los que participen propo-


niendo extensiones, desarrollando extensiones, probndolas, criticndolas, utili-
zndolas).

115
Extensibilidad: Un denominador comn
Todos los productos de Artech actualmente se estn desarrollando con el concepto
de extensibilidad en mente.

El ambiente de desarrollo de GeneXus (IDE), GXpatterns, productos como GXflow,


GXquery, GXplorer, generador Ruby, as como tambin cada una de las
funcionalidades que se desarrollan para cada uno de esos productos, tienen como
uno de sus pilares la Extensibilidad.

Por tal razn es que cuando hablamos de Extensions englobamos todas estas direc-
ciones, no simplemente aquella relativa al ambiente de desarrollo.

Lo que se debe cumplir: que la captura del conocimiento se realice a la GeneXus Way,
es decir, con una forma clara, simple y usable de lograr abstraer ese conocimiento.

Extensibilidad, Integracin y Usabilidad


En el desarrollo de nuestras nuevas arquitecturas de productos, decidimos que la
extensibilidad deba tener dos aliados inseparables: Integracin y Usabilidad.

Es necesario que nuestras extensiones se vean realmente integradas en diferentes


ambientes, como puede ser el ambiente de desarrollo o como podra ser un am-
biente batch.

La extensibilidad a nivel de Workflow, por ejemplo, solo puede ser vista como una
extensin real si existe una verdadera Integracin del Workflow en mi proceso de
desarrollo, en un mismo ambiente y con un gran nivel de Usabilidad.

Con toda seguridad, slo aquellas extensiones que consideren la Usabilidad un


punto fundamental tendrn buena acogida en la Comunidad.

Un ambiente Extensible
Una de las caractersticas ms importantes a nivel de extensibilidad es la del propio
ambiente de desarrollo GeneXus.

ste es actualmente extensible a travs de Mdulos, llamados paquetes, los cuales


proveen alguna funcionalidad especfica.

El ambiente provee un Framework de interfaz de usuario, con servicios permitiendo


la interaccin con mens, toolbars, ventanas, manejo de preferencias de interfaz
de usuario, etc., y adems, un Universal Data Model para manejar conceptos como
Knowledge Base, Model, Versions, etc.

116
Cada nuevo paquete que es agregado al ambiente, define nuevos conceptos, adi-
ciona funcionalidad, y enriquece la interfaz de usuario. El propio GeneXus es
implementado como un paquete de este ambiente, agregando los conceptos de
Transaccin, Dominio, Atributo, etc. GXflow agrega los conceptos de Procesos de
Negocios, Patterns integra mecanismos de generacin basados en GeneXus, etc.

Por tanto, no hay diferencia entre lo que un paquete de terceros podra realizar
comparado con, por ejemplo, GXflow, o el propio GeneXus.

Algunas de las cosas que un paquete podra incluir son:

Definir nuevos tipos de objetos (por ejemplo, WebPanel, Data Provider, Activity
Diagram, etc.)

Definir nuevas partes de objetos (por ejemplo, WebForm, WinForm, Variables, etc.)

Proveer nuevos editores

Agregar opciones a mens

Adicionar barras de herramientas (toolbars)

Definir nuevas propiedades a los objetos o partes

Suscribirse a eventos

Crear nuevos servicios y consumir existentes

Data Providers:
Accediendo al Conocimiento
En el diseo de una aplicacin, es de gran importancia conceptualizar cul ser
nuestra lgica de negocio, independientemente de la arquitectura que se piensa
desarrollar. Esta lgica de negocio aplicada en el desarrollo basado en conocimiento,
se representa a travs de reglas en forma natural.

Es as que GeneXus provee con las Transacciones (y en particular los Business


Components) la forma de capturar estas reglas y efectivamente generarlas y
mantenerlas hacindolas cumplir cuando corresponda. Es por ello que los Business
Components juegan un papel preponderante en la construccin de la Business
Logic.

Sin embargo, existe algo importantsimo que complementa estos componentes de


actualizacin y aplicacin de reglas que son los componentes que definen en cierta
forma los servicios de extraccin y presentacin de la informacin de nuestra

117
aplicacin, conformando as lo que podramos llamar el Business Framework de la
misma.

A estos componentes inteligentes, capaces de procesar diversos tipos de inputs,


filtrarlos, ordenarlos y producir algn tipo deseado de salida1 le llamaremos Data
Providers. Sern, junto con los Business Components, protagonistas de la
construccin de los futuros Business Frameworks de nuestras aplicaciones.

Declarando nuestros Data Providers


El Data Provider constituye un paso muy importante en la evolucin de GeneXus
dado que es un nuevo objeto que le permitir capturar, en forma declarativa, el
conocimiento automatizable.

La gran evolucin es la forma en que el usuario GeneXus expresar los mismos, y


entonces podramos decir que pasaremos de programar Procedimientos a decla-
rar Data Providers para un gran nmero de casos.

Ser declarativo en lo que se desea permite obtener un conocimiento que abre


puertas a un sinnmero de variantes a la hora de generar el cdigo definitivo de la
aplicacin. GeneXus siempre tender a declarar el conocimiento en vez de progra-
mar la aplicacin, ya que esto ltimo es simplemente un paso automtico luego del
primero.

Si un Data Provider declara que quiere un conjunto de datos con determinados


filtros, estos mismos datos pueden obtenerse de diversas formas, de diversas fuentes,
con diferentes tecnologas. Si tengo algo declarativo, estos parmetros no me tienen
que preocupar a la hora de declarar el conocimiento: simplemente ser una decisin
posterior que, eventualmente, ser automtica.

Qu es lo que declaro?
En todo proceso podemos decir que tenemos un input, una transformacin y un
output. En los Data Providers, lo que tiene relevancia y se declara es el output.

Como decamos anteriormente, declarando la salida Genexus podr evolucionar en


la forma de obtener esa salida. Cuando hablamos de salida no debemos pensar
nicamente en casos de salida a un cierto formato determinado. Esos son casos
comunes s, pero que varan con el tiempo.

Hay un conjunto de salidas que son ms importantes que esas, y son aquellas

1
Por ejemplo, otra estructura de datos o un determinado formato.

118
salidas como por ejemplo a componentes internos de mi Business Framework.

Un Data Provider que tiene como entrada una Factura y como salida un conjunto de
asientos contables, es claramente mucho ms importante para mi Framework que
el Data Provider que genera un RSS con los asientos. Este ltimo seguramente
cambiar con el tiempo ya que quizs el formato RSS no exista ms, mientras que
el primero es conocimiento puro de cmo convertir una factura en los
correspondientes asientos. Veamos este caso en concreto.

Caso de uso: contabilizando una factura de venta


Supongamos que tenemos la siguiente factura para la cual queremos obtener su
correspondiente asiento contable.

Su asiento contable sera:

Hay algunas consideraciones que observar antes de ver el ejemplo concreto:

Primero, que la transformacin es bastante compleja, es decir, de una factura de


dos lneas se genera un asiento de seis movimientos (cuatro fijos, y los otros varan
segn la cantidad de lneas del documento).

119
Segundo, que el problema se plantea desde el output, por lo que los Data Providers
constituyen una solucin natural.

Y por ltimo, hemos declarado nuestra intencin, y no hemos especificado el proce-


so de transformacin; simplemente declaramos el output.

Entry
{
EntryDate = InvoiceDate
EntryDescription = 'Invoice ' + InvoiceId
Movements
{
Movement
{
AccountId = ObtainAccount.udp('Cash/Bank')
MoveType = 'CR'
MoveAmount = TotalInvoice
}
Movement
{
AccountId = ObtainAccount.udp('Debtors')
MoveType = 'DB'
MoveAmount = TotalInvoice
}
Movement
{
AccountId = ObtainAccount.udp('TAX')
MoveType = 'CR'
MoveAmount = TotalInvoice * 0.20
}
&MoveAmount = 0
Movement
{
AccountId = AccountForProduct.udp(ProductId)
MoveType = 'DB'
&MoveAmountItem = ProductCost.udp(ProductId) * InvoiceLineQuantity
&MoveAmount = &MoveAmount + &MoveAmountItem
MoveAmount = &MoveAmountItem
}
Movement
{
AccountId = ObtainAccount.udp('SaleCost')
MoveType = 'CR'
MoveAmount = &MoveAmount
}
}
}

Adems de ser muy simple esta declaracin, no por eso pierde potencia en los Data
Providers. Note que en el ejemplo se utilizan frmulas; tambin se podran utilizar
filtros, diferentes tipos de outputs, y muchas cosas ms que hacen de los Data
Providers un objeto simple y potente, cosas muy difciles de lograr en forma
simultnea.

120
El camino de los procesos
GXflow, conocida herramienta de Artech que se relaciona con la automatizacin de
los procesos en las empresas, determinando flujos de tareas, est tambin integrado
a GeneXus Rocha.

Por qu? Las aplicaciones cada vez ms contienen flujos de procesos, que requieren
de componentes de Workflow.

Qu ganamos?
El modelado de procesos es parte de la KB, es decir, se agrega ms conocimiento
de alto nivel sobre el negocio en la propia KB.
A priori no es necesario ser consciente cuando se estn modelando las reglas
de negocios a travs de las transacciones u otros objetos si los mismos sern
utilizados o no en un proceso de Workflow.
Al realizar un Drag & Drop de un objeto sobre un diagrama de actividades
GeneXus se asegura que la invocacin de ese objeto por parte del motor ser
posible sin tener que realizar ninguna programacin adicional.
Se podrn expresar condiciones a travs de un editor que permite describir las
reglas de transicin en base a los atributos y datos relevantes definidos para el
proceso.
Se cuenta con todas las funcionalidades de cross-reference dado que los
diagramas son un objeto ms de la KB
El GXflow Prototyper permitir ejecutar rpidamente el diagrama de manera
de ir realizando el prototipado incrementalmente. Es decir, a medida que se
arma el diagrama se puede ejecutar simplemente con la funcin <F5> y en
ese momento ocurrir todo lo necesario para poder ejecutar el diagrama, desde
el impacto del proceso en la metadata hasta la generacin y compilacin de los
objetos asociados al mismo.
El motor y cliente de GXflow ser un componente externo a la KB por lo cual no
pesar en el proceso de build de la misma.

Y las consultas?
Agregaremos la capacidad de expresar consultas dentro de la base de conocimiento
que podrn ser usadas en cualquier objeto, ya sea que se las quiera presentar
como una pivot table, una grfica, o simplemente recorrer los datos devueltos por
dicha consulta. Para esto se tendr una interfaz que guiar al usuario dentro de la
KB para crear estas consultas, donde dicho usuario tan solo tendr que seleccionar
los atributos (datos) que desear obtener, y se le irn presentando aquellos que
estn relacionados con el mismo.

121

También podría gustarte