Qué son los subtipos?

Documentos relacionados
Qué son los subtipos?

Qué son los subtipos?

Curso GeneXus - Haciendo crecer la aplicación

Y cuando en la transacción Flight nombramos a CountryName, sabemos que será inferido a través del atributo AirporId.

Diseñando más transacciones

Relaciones entre entidades de la realidad

Diseñando la primera transacción

Comando for each anidado para listar info agrupada

Fórmulas Locales. Page1. Video filmado con GeneXus X Evolution 2. Veremos ahora qué es una fórmula local.

Tipos de datos estructurados

Diseñando más transacciones

Introducción a Smart Devices

Agregando funcionalidad con patrones

Comando For Each simple y For Each anidado para listar info relacionada

Momentos de disparo de reglas en transacciones

Momentos de disparo de reglas en transacciones

Cargando los tipos de datos compuestos

Actualización de la Base de Datos - Business Components

Testeando las aplicaciones (GXtest)

Actualización de la Base de Datos - For each, delete, new

Cargando Tipos de Datos Compuestos (SDT) mediante Data Providers

Definiendo reglas. En las transacciones, las reglas que deben cumplirse, o los controles que nos solicitan validar, se definen en la sección de Rules.

Momentos de disparo de reglas en transacciones

Introducción a procedimientos, listados y comando For each

Actualización de la Base de Datos - For each, delete, new

BPM (Business Process Management)

Cargando los tipos de datos estructurados

Script For each simple tabla base y cláusula order

Data Providers - Más conocimientos

En el ejemplo, se procede en este orden:

Definición de reglas

Introducción a procedimientos, listados y comando For each

Fórmulas Globales. Page1. Video filmado con GeneXus X Evolution 2

Dos formas de devolver una colección con un Data Provider

Convirtiendo el modelo en una aplicación funcional

Componentes de pantalla (Extended controls)

Actualización de la Base de Datos - Business Components

Formularios dinámicos

Consulta con salida Chart (Parte I)

Overview GeneXus - Demo: 2.Cómo obtener el ejecutable de la KB y declaración de algunas reglas del negocio.

Componentes de pantalla (Extended controls)

Para eso abrimos el ambiente de desarrollo de Genexus.

Curso GeneXus - Otro ejemplo de uso de Business components

Otro ejemplo de uso de Business Components

Reglas en transacciones - Más conocimientos

Programando el Evento Start, Click o De usuario en un Web Panel

Tareas multi-instanciadas y mapeo de datos relevantes

Qué son las fórmulas?

Trabajando con documentos

Introducción a procedimientos y listados. Comando para consultar la base de datos.

Data Provider que carga colección con valores fijos (no extraídos de la base de datos)

Objeto Query - Más conocimientos

Comunicación entre objetos

Reporting (objeto Query)

El listado de navegación nos informa claramente que la tabla base es ATTRACTION, que la recorrida será ordenada por la clave primaria de dicha tabla:

Cláusula Unique. La cláusula Unique permite mencionar atributos cuyos valores no deben salir duplicados en el resultado de la consulta.

Modificación de dato relevante, evento timer y calendarios

Agregando funcionalidad con patrones

Orders Searchs Conditions

Usuarios y roles. Para administrar el acceso a las tareas de un diagrama de procesos, debemos definir ciertos roles que serán parte del modelo.

Creación de la Knowledge Base

Transacción de 2 niveles usada como Business Component y manejo de errores.

Uso de la API del GAM

Overview GeneXus - Demo: 3. Se agregan transacciones para registrar Clientes y Productos al sistema de facturación.

Creación de la KB. Page1. Video filmado con GeneXus X Evolution 3. Vamos a ejecutar a GeneXus

1 - Objetivos de Venta por Vendedor y Grupo de Objetivos

Transcripción:

Qué son los subtipos? Hasta ahora hemos visto que GeneXus establece relaciones entre transacciones -y entre tablas- básandose en los nombres de atributos que encuentra iguales. Por ejemplo, en la transacción Attraction está el atributo CountryId con rol de llave foránea, dado que con igual nombre está presente en la transacción Country, y allí es llave primaria El atributo CountryName por su parte Page1

también se encuentra en ambas transacciones con el mismo nombre, por lo que GeneXus interpreta que se trata del mismo atributo. GeneXus siempre asume que si usamos el mismo nombre de atributo, estamos representando al mismo concepto. Sin embargo, hay casos en los que podríamos necesitar usar nombres distintos para el mismo concepto, e indicarle a GeneXus, que ambos nombres significan lo mismo. Veamos esto. Supongamos que en la agencia de viajes nos piden registrar los vuelos que ofrecen a los clientes para arribar a Page2

una atracción turística. Debemos registrar la ciudad y país desde donde parte el vuelo así como también la ciudad y país a donde arriba el mismo Page3

Para eso, vamos a crear una transacción Flight con los atributos necesarios para registrar esta información Page4

Más adelante agregaremos a esta transacción otros datos como la aerolínea a la que pertenece el vuelo, el precio de los vuelos, etc. Observemos que agregamos estos atributos para almacenar la información del país y ciudad desde donde parte el vuelo Y estos otros para almacenar el país y la ciudad de destino Page5

Vamos a hacer esto en GeneXus Creamos un objeto transacción File..New Object... la nombramos Flight Page6

Agregamos el atributo identificador FlightId y los atributos para almacenar el país y ciudad de origen del vuelo CountryId CountryName CityId CityName Page7

Y ahora vamos a agregar los atributos para almacenar el país y la ciudad de destino del vuelo... Ingresamos CountryId pero cuando damos Enter GeneXus nos indica que hay un error!! Nos dice que estamos agregando un atributo con nombre duplicado! Lo mismo nos va a pasar con todos los atributos que pensábamos agregar para representar la información del vuelo de destino, y que se llamaban igual a los que usamos para registrar la información del origen del vuelo. Cómo podemos hacer entonces para ingresar 2 países y 2 ciudades en una misma transacción? Evidentemente vamos a tener que usar nombres de atributos diferentes para almacenar la información de origen y de destino del vuelo que queremos registrar. Vamos a borrar entonces a los atributos que originalmente habíamos ingresado y vamos a definir nuevos nombres de atributos. Page8

Primero vamos a definir los atributos correspondientes a desde donde sale el vuelo: Llamamos FlightDepartureCountryId al identificador de país de origen del vuelo, FlightDepartureCountryName al nombre de país., FlightDepartureCityId al identificador de ciudad y FlightDepartureCityName al nombre de la ciudad desde donde parte el vuelo. Ahora bien, hemos definido nombres de atributos nuevos pero para GeneXus estos nombres de atributos no tienen relación con CountryId Page9

CountryName CityId Page10

o CityName Tal como dijimos antes, si usamos nombres distintos en la transacción Fligh y en la transacción Country para identificar al concepto Id de país, GeneXus no establecerá ninguna relación entre la transacción Flight y la transacción Country ya que justamente se basa en los nombres de los atributos para establecer relaciones Vamos a crear un diagrama de transacciones, para corroborar esto Hacemos New / Object elegimos Diagram, le dejamos el nombre por defecto Page11

y presionamos Create. Ahora arrastramos a las transacciones Flight y Country al diagrama. Vemos que efectivamente, GeneXus no encuentra relación entre ellas, ya que no se identificó a ninguna clave foránea en Flight que permita la relación con Country. Otra forma de ver esto, es prestar atención a la forma en que GeneXus nos muestra, en la transacción Flight, al atributo identificador de país de partida que ingresamos, FlightDepartureCountrId. Page12

Vemos que está señalizado con el símbolo cuadrado que indica que es un atributo secundario y no es considerado como clave foránea Comparemos esto con la definición del identificador de país de la transacción Attraction Page13

En Attraction, el atributo CountryId tiene una flecha que apunta hacia arriba, lo cual nos indica es un atributo clave foránea pero no es el caso del atributo FlightDepartureCountryId en Flight Page14

Entonces, cómo hacemos para que GeneXus pueda asociar distintos nombres a un mismo concepto? Necesitamos que FlightDepartureCountryId aunque se llame distinto que CountryId, sea considerado como tal, como un identificador de país! Page15

Y lo mismo ocurre con el nombre del país y el identificador y nombre de ciudad. La respuesta es mediante la definición de subtipos. Cuando un atributo se llama distinto a otro ya definido pero ambos representan el mismo concepto Page16

podemos decirle a GeneXus que el nuevo atributo es subtipo del otro y a partir de ese momento Page17

GeneXus los considerará exactamente como si fueran la misma cosa. En nuestro caso, vamos a definir al atributo FlightDepartureCountryId como subtipo de CountryId Page18

y a partir de ese momento GeneXus tratará a FlightDepartureCountryId exactamente como si fuera CountryId, es decir lo identificará como clave foránea en la transacción Flight y establecerá la relación con Country como queríamos. Para definir subtipos, lo primero que debemos hacer es crear un grupo de subtipos. Seleccionamos File New Object elegimos el tipo Subtype y le damos el nombre FlightDeparture: Page19

Digitamos un punto (. ) y GeneXus nos sugiere los atributos que comienzan con FlightDeparture y que ya habíamos definido en la transacción Flight. Elegimos a FlightDepartureCountryId. Ahora damos tabulador y como queremos que FlightDepartureCountryId sea subtipo de CountryId, elegimos como su supertipo al atributo CountryId. Ahora agregamos a FlightDepartureCountryName Page20

como subtipo de CountryName FlightDepartureCityId como subtipo de CityId y FlightDepartureCityName como subtipo de CityName. Salvamos Y ahora abramos nuevamente a la transacción Flight. Page21

Vemos que ahora los atributos FlightDepartureCountryId y FlightDepartureCityId tienen el símbolo de la flechita hacia arriba Page22

que indica que serán tratados como claves foráneas y además el símbolo de la letra S, que indica que son atributos definidos como subtipos. Si volvemos a analizar el diagrama de tablas Page23

las relaciones ahora muestran que GeneXus considera a los atributos subtipos identificadores de país y ciudad en Flight, exactamente igual que si hubiéramos referenciado a CountryId y CityId. Vemos que GeneXus ha encontrando la relación entre Flight, CountryCity y Country. Page24

Ahora tenemos que proceder de igual manera para definir a los atributos que permitan registrar el país y la ciudad hacia donde llega el vuelo así que llamamos: FlightArrivalCountryId al identificador de país de llegada del vuelo FlightArrivalCountryName al nombre del país de llegada. FlightArrivalCityId al id de la ciudad de destino y FlightArrivalCityName al nombre de la ciudad de destino. Page25

Salvamos. Y ahora vamos a crear un grupo de subtipos llamado FlightArrival para definir que los nuevos atributos que recién creamos, serán subtipos de los atributos que definen a los países y ciudades. Digitamos., completamos el nombre del atributo con CountryId y el supertipo es CountryId. completamos con CountryName y el supertipo es CountryName. completamos con CityId y el supertipo es CityId y por último, FlightArrival CityName y su supertipo es CityName. Salvamos Page26

y vamos a corroborar en la transacción Flight, que los íconos representan que ya hay relación establecida Vamos a presionar F5 para ver en funcionamiento todo esto. Page27

Ejecutamos la transacción Flight y vamos a registrar un vuelo desde Rio de Janeiro a París. Dejamos el id sin ingresar, ya que como sabemos se autonumerará y elegimos como país de origen del vuelo a Brasil y la ciudad de origen a Rio de Janeiro. Como país de arribo elegimos a Francia y la ciudad: a París. Page28

Confirmamos y vamos a ingresar otro vuelo. Digitamos en el país de partida 15 y sale el aviso de que no existe. Ahora utilicemos la flechita Page29

y seleccionamos a China Page30

Como vimos, contamos con los mismos controles y ayudas, que si los atributos fueran las llaves foráneas con sus nombres originales pero se trata de atributos subtipos de ellos! Y esa es la idea : que definiendo subtipos, logramos definir que nombres de atributos distintos, corresponden al mismo concepto! Page31

Ahora bien, vimos que el uso de subtipos nos permitió representar una situación que se da en la realidad, como ser en este caso, que un vuelo tiene 2 países y 2 ciudades, que cumplen distinto rol. Page32

Un país y una ciudad corresponden a donde se origina el vuelo y el otro país y ciudad corresponden al destino del vuelo. Hemos definido nombres de atributos con nombres descriptivos que hacen alusión al rol de partida y llegada Page33

respectivamente y también fue de vital importancia agrupar en el mismo grupo de subtipos a los atributos que se correspondan. Observemos que no hemos definido a todos los subtipos en un mismo grupo, ni a los 2 países por un lado y a las 2 ciudades por otro. Hemos agrupado a los atributos del país de partida con los atributos de la ciudad de partida: GeneXus entiende con este grupo, que cuando ingresen valor para este identificador de país Page34

el nombre de país correspondiente a este identificador, tiene que cargarse en este atributo Page35

y no en el otro nombre de país que hay en la transacción. De la misma manera entiende que cuando digiten valor para esta ciudad, Page36

el nombre de ciudad correspondiente a este identificador, tiene que cargarse en este atributo y no en el otro nombre de ciudad que hay en la transacción Y algo importante que GeneXus también interpreta con esta definición de grupo, es que debe controlar que Page37

esta ciudad, esté registrada en la base de datos para este país y no para el otro país. El grupo de subtipos que define al país y ciudad de arribo del vuelo Page38

es totalmente equivalente a este y aplica todo lo mismo que recién explicamos. Así hemos visto como resolver una doble referencia a un mismo concepto pero con distintos roles, ya que los 2 países debían obtenerse de la misma tabla pero cada uno tenía distinto rol Page39

y las 2 ciudades debían obtenerse de una misma tabla también Page40

cumpliendo distintos roles Para finalizar Page41

es importante saber que estas podrían haber sido soluciones válidas también En la propuesta de arriba Page42

se ha definido un único grupo de subtipos: el grupo correspondiente al país y ciudad de partida y se ha dejado a los atributos supertipos para el ingreso del destino. Esto es completamente válido. Y en la propuesta de abajo Page43

se ha definido un un único grupo de subtipos también, en este caso el grupo correspondiente al país y ciudad de arribo. En resumen, los subtipos nos permiten indicarle a GeneXus como asociar distintos nombres de atributo a un mismo concepto. Y como vimos, las validaciones y todo el comportamiento de los subtipos será idéntico a si hubiéramos usado a los atributos supertipos. Page44