Académique Documents
Professionnel Documents
Culture Documents
Hasta ahora hemos visto que GeneXus establece relaciones entre transacciones -y entre tablas- basndose en los
nombres de atributos que encuentra iguales.
Por ejemplo, en la transaccin Attraction se encuentra el atributo CountryId
con rol de llave fornea, dado que con igual nombre est presente en la transaccin Country, y all es llave
primaria
Page
Por su parte, el atributo CountryName tambin se encuentra en ambas transacciones con el mismo nombre:
por lo que GeneXus interpreta que se trata del mismo atributo. En este caso no es un atributo primario, as que
GeneXus determinar almacenarlo en la tabla COUNTRY y no en la tabla ATRACTION.
De modo que GeneXus siempre asume que si usamos el mismo nombre de atributo, estamos representando al
mismo concepto.
Sin embargo, hay casos en los que podramos necesitar usar nombres distintos para el mismo concepto, e
indicarle a GeneXus, que ambos nombres significan lo mismo.
Veamos esto.
Page
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
Definimos el atributo FlightId, que automticamente queda basado en el dominio: Id..
Y ahora detengmonos a pensar qu otra informacin debemos registrar.
Page
Pero a los aeropuertos tendremos que poder registrarlos por s mismos., as luego podremos referenciarlos
desde los vuelos.
As que dejemos de trabajar en la transaccin Flight por un instante, y vamos a crear otra transaccin de nombre
Airport .Definimos entonces que cada aeropuerto tiene 1 identificador AirportId, 1 nombre AirportName y cada
aeropuerto se encuentra en 1 pas y en 1 ciudad, as que vamos a agregar los atributos: CountryId, CountryName,
CityId y CityName. Salvamos...
Y ahora volvamos a ver cul era nuestra necesidad en la transaccin Flight.
Page
Y lo mismo nos va a pasar con el atributo AirportName, que pensbamos agregar para representar el nombre del
aeropuerto de llegada.
GeneXus nos dice que hay un error!! que estamos agregando un atributo con nombre duplicado!
Cmo podemos hacer entonces para ingresar 2 aeropuertos en una misma transaccin? Evidentemente vamos
a tener que usar nombres de atributos diferentes para almacenar la informacin de origen y de destino del vuelo
que queremos registrar.
Vamos a borrar entonces los atributos que originalmente habamos ingresado y vamos a definir atributos con
nombres nuevos.
Page
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.
Para verificar esto que acabamos de decir, vamos a crear un diagrama de transacciones.
Y vamos a arrastrar a las transacciones Airport y Flight y vemos que efectivamente, GeneXus no encuentra
relacin entre ellas, ya que no se identific ninguna clave fornea en Flight que permita la relacin con Airport.
Otra forma de ver esto, es prestar atencin a la forma en que GeneXus nos muestra, en la transaccin Flight, al
atributo identificador del aeropuerto.
Vemos que est sealizado con el smbolo cuadrado, que indica que es un atributo secundario y no es considerado
como clave fornea
Page
En Attraction, el atributo CountryId tiene una flecha que apunta hacia arriba, lo cual nos indica que es un atributo
clave fornea pero no es el caso del atributo FlightDepartureAirportId en la transaccin Flight.
Entonces, cmo hacemos para que GeneXus pueda asociar distintos nombres a un mismo concepto?
Necesitamos que FlightDepartureAirportId aunque se llame distinto que AirportId, sea considerado como tal, o
sea, como un identificador de aeropuerto!
Y lo mismo ocurre con el nombre del aeropuerto!
Cmo lo podremos lograr?
Page
Para definir subtipos, lo primero que debemos hacer es crear un grupo de subtipos.
As que creamos un nuevo objeto de tipo Subtype group, y ponemos como nombre
FlightDepartureAirport:
Ahora en la esta primera lnea digitamos la tecla con el punto (.) y GeneXus nos sugiere los atributos que
comienzan con FlightDepartureAirport, que ya habamos definido en la transaccin Flight.
Elegimos entonces a FlightDepartureAirportId.presionamos tabulador y como queremos
FlightDepartureAirportId sea subtipo de AirportId, elegimos como supertipo al atributo AirportId.
que
Page
Arrastramos las transacciones Airport y Flight y las relaciones ahora nos muestran que GeneXus considera a los
atributos subtipos identificadores de aeropuerto en Flight, exactamente igual que si hubiramos referenciado a
AirportId.
Ahora vamos a registrar al aeropuerto Charles de Gaulle seleccionamos: Francia y la ciudad: Pars.
Confirmamos.
Pasemos ahora a registrar un vuelo.
Ejecutamos la transaccin FlightComo aeropuerto de partida vamos a elegir Guarulhos y como aeropuerto
de llegada: Charles de Gaulle
Vamos ahora a ingresar otro vuelo.
Probemos de digitar en el aeropuerto 15 sale el aviso de que este aeropuerto no existe.
Ahora si utilizamos esta flechita vemos que contamos con los mismos controles y ayudas que si los atributos
fueran las llaves forneas con sus nombres originales pero 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!
Bien, vimos que el uso de subtipos nos permiti representar una situacin que se da en la realidad, como ser en
este caso, que un vuelo tiene 2 aeropuertos que cumplen distinto rol: uno es el aeropuerto de partida y otro es
el aeropuerto de llegada.
Page
Algo a hacer notar es que si bien hemos definido atributos con nombres descriptivos que hacen alusin al rol de
partida y llegada respectivamente tambin fue de gran importancia agrupar en el mismo grupo de subtipos,
a los atributos que se corresponden.
10
Page
10
Observemos que no hemos incluido a todos los subtipos en un mismo grupo, ni a los 2 atributos subtipos
primarios por un lado en 1 grupo y a los 2 atributos secundarios por otro.
Hemos agrupado los atributos que definen al aeropuerto de partida juntos en 1 grupo y a los atributos que
definen al aeropuerto de llegada junto en otro grupo.
Esto es as porque GeneXus entiende con este grupo:
el nombre de aeropuerto correspondiente a este identificador, tiene que cargarse en este atributo
FlightDepartureAirportName
Page
11
De la misma manera GeneXus entiende que cuando se digita valor para el identificador de aeropuerto:
FlightArrivalAirportId
11
Bien. 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, con un buen
nombramiento de los mismos e indicando sus supertipos y de esta manera GX entender que para el subtipo
primario del grupo, deber inferir todo el resto de la informacin asociada.
Vamos a hacerlo.
Page
12
12
Definimos
FlightArrivalCountryId como subtipo de CountryId,
FlightArrivalCountryName subtipo de CountryName,
13
Page
13
Page
14
Para finalizar, es importante saber que stas podran haber sido tambin soluciones vlidas:
14
Page
15
En resumen, los subtipos nos permiten indicarle a GeneXus cmo asociar distintos nombres de atributo a un
mismo concepto. Y como vimos, las validaciones y todo el comportamiento de los subtipos ser idntico a si
hubiramos usado los atributos supertipos.
15