You are on page 1of 15

GeneXus siempre asume que si usamos el mismo nombre de atributo estamos

representando el mismo concepto.

Sin embargo, hay casos en los que podramos necesitar usar nombres de atributos
distintos para el mismo concepto, e indicarle a GeneXus que ambos nombres
significan lo mismo. Veamos esto con un ejemplo
Supongamos que en la agencia de viajes nos piden registrar los vuelos que ofrecen
a los clientes para arribar a una atraccin turstica. Y debemos registrar para cada
vuelo, el aeropuerto desde donde parte, as como tambin el aeropuerto de llegada.
Para representar esto, vamos a crear en primer lugar una transaccin de nombre:
Flight

Pero a los aeropuertos tendremos que poder registrarlos por s mismos, as luego
podremos referenciarlos desde los vuelos.
As que en la transaccin Flight, agregamos los atributos AirportId, y
AirportName. Pero cuando intentamos agregar nuevamente AirportId
GeneXus dice que hay un error, que estamos agregando un atributo con nombre
duplicado!
Cmo podemos hacer entonces para ingresar dos aeropuertos en una misma
transaccin? Evidentemente vamos a tener que usar nombres de atributos
diferentes para almacenar la informacin de partida y de llegada del vuelo que
queremos registrar.

Hemos definido nombres de atributos nuevos pero para GeneXus estos nombres
de atributos no tienen relacin con AirportId ni AirporName.
Tal como dijimos antes, si usamos nombres distintos en la transaccin Flight y en la
transaccin Airport para identificar al concepto de aeropuerto, GeneXus no
establecer ninguna relacin entre ambas transacciones.
Cuando un atributo se llama distinto a otro ya definido pero ambos representan el
mismo concepto podemos decirle a GeneXus que el nuevo atributo es subtipo del
otro y a partir de ese momento GeneXus los considerar exactamente como si
fueran la misma cosa. En nuestro ejemplo, ambos atributos son Aeropuertos.
Para definir subtipos, lo primero que debemos hacer es crear un grupo de subtipos.

Creamos el grupo de subtipos de nombre FlightDepartureAirport.


En la primera lnea indicamos que el atributo FlightDepartureAirportId ser subtipo
de AirportId. Decimos entonces que AirportId es supertipo de
FlightDepartureAirportId.

Podemos decir que el supertipo es el atributo original, y subtipo es el atributo que


se indica que conceptualmente coincide con ese atributo original, pero que tiene
otro nombre.

Luego agregamos a FlightDepartureAirportName, y definimos que su supertipo es:


AirportName

El atributo FlightDepartureAirportId pasa a ser el identificador de este grupo de


subtipos, por eso lo llamamos primario, y todos los atributos que agreguemos en
este grupo, como FlightDepartureAirportName, dependern de l, al igual que en la
transaccin.

Anlogamente, creamos otro grupo de subtipos, FlightArrivalAirport, para


representar al aeropuerto de llegada.
Vemos que ahora GeneXus s coloca la flecha: GeneXus considera a los atributos
subtipos identificadores de aeropuerto en Flight, exactamente igual que si
hubiramos referenciado a AirportId.

Vemos entonces que GeneXus ha encontrado la relacin entre Flight y Airport.


Observemos que aunque en GeneXus est apareciendo una nica flecha en el
diagrama, siendo estrictos deberan aparecer dos.
Ahora supongamos que en la transaccin Flight, queremos para cada aeropuerto
ver, adems de su nombre, su pas y su ciudad.

Esto simplemente se resuelve definiendo ms atributos subtipos en cada grupo


que corresponda, nombrndolos de acuerdo a las reglas de nomenclatura e
indicando sus supertipos y de esta manera GeneXus entender que para el
subtipo primario del grupo, deber inferir todo el resto de la informacin
asociada.
Probemos de digitar el aeropuerto 15 sale el aviso de que este aeropuerto no
existe.

Se est controlando la consistencia de los datos. Y se est ofreciendo la lista de


seleccin Vemos, as, que contamos con los mismos controles y ayudas que
aparecan cuando los atributos eran llaves forneas con sus nombres originales
pero ahora se trata de atributos subtipos de ellos.

Y esta es justamente la idea: que definiendo subtipos logramos definir que


nombres de atributos distintos correspondan al mismo concepto.

Es por eso los atributos FlightDepartureAirportId y FlightArrivalAirportId sern


interpretados como llaves forneas y que FlightDepartureAirportName y
FlightArrivalAirportName sern inferidos a partir de los primeros.
Pero cmo sabe GeneXus que en este, FlightDepartureAirportName, deber
inferirse el nombre de este aeropuerto, FlightDepartureAirportId, y no de este otro,
FlightArrivalAirportId?

No es por el orden en el que aparecen los atributos ni por el nombre que les dimos.
Lo sabe porque el atributo FlightDepartureAirportName se ha definido en un grupo
con el atributo FlightDepartureAirportId. Y este otro, FlightArrivalAirportName, en
otro grupo, con este otro, FlightArrivalAirportId.

Por lo que es fundamental agrupar en el mismo grupo de subtipos a los


atributos que se corresponden.
Destaquemos que no hemos incluido todos los subtipos en un mismo grupo, ni a los
dos atributos subtipos primarios por un lado en un grupo y a los dos atributos
secundarios por otro. No.
Hemos agrupado los atributos que definen al aeropuerto de partida juntos en un
grupo y a los atributos que definen al aeropuerto de llegada juntos en otro grupo.
Otra solucin posible hubiera sido cambiarle el nombre solamente a los atributos de
uno de los aeropuertos (y no de los dos aeropuertos, como mostramos
anteriormente).

En la solucin de la imagen de la izquierda, se defini un nico grupo de


subtipos, con los atributos correspondientes al aeropuerto de partida. Los
atributos con el nombre original (AirportId y AirportName) se usarn para
ingresar al aeropuerto de arribo.

En la solucin de la imagen de la derecha, se le cambi el nombre a los atributos


relacionados al aeropuerto de arribo. Los atributos con el nombre original
(AirportId y AirportName) se usarn para representar al aeropuerto de partida.

En ambos casos a los nuevos nombres de atributos los definimos como subtipos,
representando de esta forma que son Aeropuertos respectivamente.
Hay muchos otros casos en los que es necesario modificarle el nombre a un
atributo para evitar un conflicto o ambigedad.

Referencias mltiples
En el ejemplo que vimos antes, tratamos el caso de referencias mltiples de una
tabla a otra pero estas referencias no tienen por qu ser directas. Desde esta tabla
tenemos dos caminos para llegar a esta otra tabla. Por lo que se necesitarn
subtipos para diferenciarlos.

Subtipos recursivos
Tambin tenemos el caso de una entidad que debe referenciarse a ella misma, por
ejemplo una transaccin de empleados, en la que entre la informacin del
empleado hay que registrar al jefe, que tambin es un empleado.

Especializacin
Por ltimo tenemos el caso en el que tenemos una entidad que registra informacin
general, por ejemplo, de personas (como el nombre, nmero de telfono, direccin,
etctera) y luego tenemos entidades que son una especializacin de esa otra, por
ejemplo, clientes y pasajeros, que en particular son personas.

Estos son slo algunos ejemplos de los mltiples que hay. Slo los mencionamos.
No los estudiaremos en este curso.

You might also like