practicocursogxxev2+(4)

Upload: cynthia-moraes

Post on 05-Apr-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    1/37

    Ejercicios prcticosGeneXus X Ev.2

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    2/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Copyright Artech Consultores S. R. L. 1988-2012.

    Todos los derechos reservados. Este documento no puede ser reproducido en cualquier medio sin el consentimientoexplcito de Artech Consultores S.R.L. La informacin contenida en este documento es para uso personal nicamente.

    Marcas Registradas

    Artech y GeneXus son marcas o marcas registradas de Artech Consultores S.R.L. Todas las dems marcas mencionadas eneste documento son propiedad de sus respectivos dueos.

    Notas previas

    Con este prctico el alumno podr familiarizarse con la herramienta, su ambiente, mens, barra de herramientas, etc.,as como podr poner en prctica de una manera guiada y gradual los conceptos ms importantes.

    Dado que la finalidad de este curso es aprender la lgica de GeneXus, su esencia, independientemente de la plataformaen que la aplicacin vaya a implementarse, podra usted prototipar en cualquiera de las plataformas soportadas porGeneXus.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    3/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    1. EL PROBLEMA .......................................................................................................................................................... 3

    2. NUEVO PROYECTO, NUEVA BASE DE CONOCIMIENTO ............................................................................................. 3

    3. PRIMERAS TRANSACCIONES .................................................................................................................................... 3

    TRANSACCIN CUSTOMER ......................................................................................................................................................... 4

    TRANSACCIONES ATTRACTION Y COUNTRY, RELACIONADAS ........................................................................................................... 7

    Datos relacionados: cmo se mantiene la integridad? ................................................................................................... 10

    TRANSACCIN CATEGORY ......................................................................................................................................................... 11

    AGREGUEMOS LAS CIUDADES A LA TRANSACCIN COUNTRY ............................................................................................................. 13

    TRANSACCIN ATTRACTION: AGREGUEMOS LA CIUDAD. ................................................................................................................ 14

    4. AGREGUEMOS COMPORTAMIENTO A LAS TRANSACCIONES (RULES) .................................................................... 15

    5. PATTERNS: MEJORANDO LA INTERFAZ PARA TRABAJAR CON LA INFORMACIN .................................................. 16

    6. LISTADOS PDF........................................................................................................................................................ 20

    7. VARIABLE DE TIPO DE DATOS ESTRUCTURADO, DATA PROVIDER PARA CARGARLA Y WEB PANEL PARA

    MOSTRARLA .................................................................................................................................................................... 22

    8. TRANSACCIN FLIGHT Y SUBTIPOS .................................................................................................................... 24

    9. BUSINESS COMPONENTS ....................................................................................................................................... 25

    AUMENTO DE PRECIO DE LOS VUELOS ............................................................................................................................................ 25

    PANTALLA PARA ELIMINACIN DE TODOS LOS VUELOS ....................................................................................................................... 27

    AGREGAR UN VUELO A TRAVS DE UN WEB PANEL [OPCIONAL] ........................................................................................................... 28

    10. PROCEDIMIENTOS PARA ACTUALIZAR REGISTROS ................................................................................................ 30

    AUMENTO DE PRECIOS DE LOS VUELOS .......................................................................................................................................... 30

    ELIMINACIN DE TODOS LOS VUELOS............................................................................................................................................. 30

    INICIALIZACIN DE LA INFORMACIN DE LA BASE DE DATOS [OPCIONAL] ............................................................................................... 32

    11. PASAJE DE PARMETROS ...................................................................................................................................... 33

    LISTADO DE ATRACCIONES EN UN RANGO DETERMINADO ................................................................................................................... 34

    OBTENER PDF CON INFO DE UN VUELO LUEGO DE INSERTADO............................................................................................................. 34

    12. FRMULAS ............................................................................................................................................................ 36

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    4/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    1. El problema

    Una agencia de viajes lo contrata para que desarrolle un sistema para almacenar y manipular la informacin

    con la que trabaja. Imagine que el sistema se compone de dos mdulos:

    Backend: parte de la aplicacin que deber correr en un servidor web, de manera tal que losempleados de la agencia puedan manipular la informacin desde cualquier lugar con conexin ainternet. Es privada, por lo que deber tener seguridad.

    Frontend: parte de la aplicacin que implementar el sitio web de la agencia. Ser pblica, utilizadapor cualquier persona que quiera consultar informacin de viajes, destinos, atracciones tursticas,etc.

    En este prctico implementaremos solamente una parte de la solucin a este problema. Qu es lo primeroque debemos hacer?

    2. Nuevo proyecto, nueva base deconocimiento

    Entrar a GeneXus y crear una base de conocimiento de nombre TravelAgency para comenzar el desarrollode la aplicacin.

    Sugerimos:

    Elegir como ambiente de desarrollo C#. Asegrese de tener instalado todo lo necesario (incluyendoSQL Server).

    No crear la base de conocimiento en la carpeta Mis Documentos o cualquier otra carpeta que quedebajo Documents and Settings, debido a que estas carpetas tienen permisos especiales otorgados

    por Windows.

    Tmese unos minutos para familiarizarse con el IDE. Pruebe mover ventanas, personalizndolas a su gusto,visualizar ventanas (View y View/Other Tool Windows) y observe detenidamente el Folder View dentro de laventana Knowledge Base Navigator. Ver que aparecen ya inicializados dominios, algunos objetos, imgenes,etc. Sugerencia: mantenga la ventana de propiedades abierta (F4), pues la utilizar continuamente. Dentro del

    Knowledge Base Navigator eche un vistazo a las Preferences donde se configura el Environment.

    3. Primeras transaccionesEn las reuniones con la agencia de viajes, le transmiten lo siguiente:

    Nosotros registramos los datos de nuestros clientes, y a stos les ofrecemos viajes a distintasciudades de distintos pases, de las que registramos tambin las atracciones tursticas.

    Para empezar a construir la aplicacin, debemos empezar por identificar las entidades de la realidad, yrepresentarlas mediante transacciones. Qu transacciones debemos crear entonces en la base deconocimiento (KB)?

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    5/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Transaccin Customer

    Le preguntamos a la agencia de viajes: qu registran de sus clientes? Sabiendo que la respuesta es:

    El nombre (que no supera los 20 caracteres), apellido (que tampoco los supera), direccin, telfonoy e-mail.

    Ya puede crear la transaccin Customer.

    Recordar que:

    Para crear objetos existen varias alternativas:o Hacerlo desde la Start Page.o Hacerlo desde el men: File/ New Objecto Ctrl+N

    Address, Phone e Email son dominiossemnticos que se estudiarn ms adelante.

    Necesitar un atributo que identifique a cadacliente (CustomerId)

    Digitando punto (.) cuando va a ingresar un

    nuevo atributo, ste se inicializa con el nombrede la transaccin.

    La estructura de la transaccin debera haberle quedado como se muestra (al lado, su form Web):

    Pruebe la aplicacin en ejecucin. F5.

    Qu suceder?

    Solucin

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    6/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Se le abrir una ventana como la siguiente para que ingrese la informacin de Base de Datos, Servidor y mtodode conexin. Recuerde que si no existe una base de datos con ese nombre, en ese servidor, GeneXus la crea.

    Al completar la informacin pedida, antes de cliquear Finish, asegrese de tener la ventana Output de GeneXushabilitada y a la vista. (View/Other Tool Windows /Output)

    Se despliega un Anlisis de Impacto que le informa que se crear la base de datos y la tabla CUSTOMER dentrode la misma:

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    7/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Si presiona el botn Create, GeneXus proceder a ejecutar el programa que llevar a cabo estas creaciones. Alfinalizar el proceso, se le abrir en el navegador que tenga configurado como el predeterminado, el men conlinks para ejecutar los objetos definidos. En este caso slo uno: la transaccin Customer.

    Ingrese algunos clientes al sistema. Modifique algn dato de alguno de los clientes previamente ingresados yelimine algn cliente.

    Tambin pruebe seleccionarun cliente de la lista de seleccin (entre los conos que aparecen sealados en laimagen que sigue, tiene la imagen de una lupa).

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    8/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Ahora pasemos a identificar y crear la siguiente transaccin. Recordemos lo que nos haban enunciado:

    Nosotros registramos los datos de nuestros clientes, y a stos les ofrecemos viajes a distintas

    ciudades de distintos pases, de las que registramos tambin las atracciones tursticas.

    Transacciones Attraction y Country, relacionadas

    Ahora vamos a crear una transaccin para registrar las atracciones tursticas y una para registrar los pases alos que stas pertenecen. Qu informacin maneja de cada atraccin la agencia de viajes?

    Nombre, pas, imagen de la atraccin, categora a la que pertenece.

    Ya puede crear las transacciones. Empecemos porCountry.

    Recuerde que: presionando punto (.) cuando est por dar nombre a un atributo en la estructura de la transaccin,

    aparece inicializado con el nombre de la transaccin. necesitar un atributo identificador, CountryId.

    Cuando est definiendo el tipo de datos del atributo identificador, en vez de utilizar directamenteNumeric(4.0), defina el dominioId con ese tipo de datos.

    Configure la propiedad Autonumber de ese dominio en True, para que todos los atributos basados en elmismo se numeren automticamente, sin que el usuario deba preocuparse.

    Solucin

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    9/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Observe todos los dominios que ya vienen predefinidos en GeneXus. En particular Address, Email y Phone quehaban aparecido automticamente cuando cre los atributos CustomerAddress, CustomerEMail y CustomerPhone enla transaccin Customer.

    Defina el atributo CountryName, con tipo de datos, un nuevo dominio: Name=Character(50).

    Ahora, creemos la transaccinAttraction. Por ahora ingrese solamente identificador, nombre y pas.

    Observe que al ingresar AttractionId, automticamente asume el dominio Id. Anlogamente, cuando ingrese elatributo AttractionName, asumir automticamente el dominio Name.

    Por qu coloc adems de CountryId, el atributo CountryName enAttraction?

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    10/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Ejectue para probar. F5.

    Le aparecer el siguiente reporte de Anlisis de Impacto.

    Por qu en la tabla Attraction que GeneXyus informa que se debe crear en la Base de Datos, no aparece el atributoCountryName? Es decir, por qu la tabla fsica no lo contendr, cuando s est en la estructura de la transaccin?

    Despus de estudiar el reporte, si estamos de acuerdo, presionamos Reorganize para que efectivamente selleve a cabo eso que se informa. Se abrir el navegador con el men con links a los 3 programas quecorresponden a cada una de las transacciones (Customer, Country y Attraction).

    Ingresar como pases a: Brasil, Francia y China. Observar que dejando 0 como valor del identificador, algrabar se le asigna automticamente el nmero posterior al ltimo asignado (efectivamente, se estautonumerando).

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    11/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Ingresar como atraccin turstica:Louvre Museum, que est en Francia. Si no recuerda el identificador deFrancia en el sistema, cmo ingresa el pas?:

    Recuerdeque se le ofrece una Lista de seleccin de pases, creada automticamente por GeneXus, y ofrecida conun cono especial, al lado de CountryId. Esto es porque CountryId tiene el rol de llave fornea (foreign key) en estatransaccin (es decir, est apuntando a otra tabla).

    Datos relacionados: cmo se mantiene la integridad?

    AttractionyCountryestn relacionados. Al colocar CountryId en la estructura de Attraction, estamos diciendo que elpas de la atraccin corresponde al de la tabla de pases. Observe que GeneXus mantiene automticamente la integridadde la informacin. As, por ejemplo:

    Intente ingresar una atraccin con un id de pas que no exista. Le permite grabar la atraccin turstica?

    Elija una atraccin previamente ingresada (por ejemplo, Louvre Museum) y cambie el pas, por uno que no exista.Pudo grabar la modificacin?

    Intente eliminar un pas (usando la transaccin Country) que tenga alguna atraccin asociada (por ejemploFrancia). Se lo permite?

    Conclusin: los programas correspondientes a las transacciones aseguran la integridad de los datos.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    12/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Transaccin Category

    Nos falta completar la informacin de la transaccin Attraction. A usted le han dicho que registran de cada

    atraccin turstica, la categora (monumento, museo, parque, etc.) a la que pertenece. As quenecesitaremos crear una transaccin para registrar esta informacin, y agregar la categora a la transaccinAttraction.

    Pero adems, le han informado que no es obligatorio conocer la categora de atraccin a la que perteneceuna atraccin dada que se est manipulando. Se puede dejar vaca. Si sabemos que GeneXus controlaautomticamente la integridad, cmo lo conseguimos?

    Solucin:

    Para terminar la transaccinAttraction, agreguemos el dato que nos est faltando: la foto.

    Para ello, cree el atributo AttractionPhoto de tipo de datos Image.

    Pdale a GeneXus que construya la aplicacin, as puede probarla en ejecucin. (F5)

    Observe lo que le informa el reporte de Anlisis de Impacto. Deber crearse la tabla Category, y convertirse la tabla

    Attraction ya existente, agregando tres elementos de informacin (uno por el atributo CategoryId y dos por el atributoAttractionPhoto. No se preocupe en entender por qu requiere almacenar dos valores por imagen).

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    13/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Reorganice y ejecute.

    Ingrese categoras (como museo y monumento) y acceda a las atracciones tursticas ya ingresadas paracompletar su informacin (categora y foto).

    Observe que en este caso puede dejar la categora vaca (debido a que puso la propiedad Nullable en Yesen la estructura de la transaccin).

    Sin embargo, si intenta poner como valor de CategoryId para la atraccin turstica un valor inexistente, no le

    dejar grabar.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    14/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Agreguemos las ciudades a la transaccin Country

    Adems de los pases con los que trabaja la agencia de viajes, necesitamos registrar la informacin de sus

    ciudades. Por tanto, debemos agregar un segundo nivel a la transaccin Country, con el identificador y elnombre de ciudad.

    Recuerde que: posicionado en CountryName con botn derecho / Insert Level agrega el subnivel. Una vez que le d un nombre al nuevo nivel, digitando comillas () en lugar de punto, el atributo que defina

    se inicializar con el nombre del nivel. Las ciudades se identificarn por su propio id en combinacin con el del pas. Es decir, no podr identificar a

    una ciudad sin brindar antes la informacin del pas del que se trata. As, podra haber una ciudad 1 Rosariotanto para Uruguay como para Argentina:

    Pas: 1 (Uruguay) Ciudad: 1 (Rosario)Pas: 2 (Argentina) Ciudad: 1 (Rosario)

    O incluso podra ser que Rosario para Argentina se identificara con otro nmero:Pas: 2 (Argentina) Ciudad: 4 (Rosario)

    Reorganice y ejecute (F5).

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    15/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Observe que el Listado de Navegacin le informar que: la propiedad autonumber para el caso de CityId ser ignorada. Esto significa que en ejecucin el usuario

    deber ingresar manualmente los identificadores de ciudad. La explicacin ser tratada ms adelante. Se crear una nueva tabla CountryCity para almacenar la informacin correspondiente a las ciudades.

    Ingrese ciudades para los pases que ya tena registrados.

    Transaccin Attraction: agreguemos la ciudad.

    Completemos la transaccinAttractionagregando la ciudad del pas a la que la atraccin pertenece. Qudebe hacer si la agencia de viajes nos informa que ese valor puede no ser conocido o relevante para una

    atraccin dada en un momento dado?

    Construya la aplicacin y prubela (F5 y Reorganize).

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    16/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Solucin

    Antes de seguir, abra la transaccin Customer y modifique el tipo de datos de CustomerId para que tengadominio Id (y, as, se autonumere). Tambin modifique los tipos de datos de CustomerName yCustomerLastName para que pasen a asumir el dominio Name. Reorganice.

    4. Agreguemos comportamiento a las

    transacciones (rules)Despus de probar con nosotros la aplicacin que venimos desarrollando, en la agencia de viajes nos cuentanque para los clientes hay algn comportamiento especfico que debemos hacer cumplir a la hora demanipular la informacin a travs del programa (transaccinCustomer). Cul es este comportamiento?

    Nos dicen:

    El sistema no debepermitir ingresar clientes sin nombre, ni sin apellido.

    Debe advertirse al usuario si est dejando el telfono sin asignar, por si fue un descuido.

    Se debe registrar la fecha de ingreso del cliente al sistema (CustomerAddedDate) y se debe proponercomo valor predeterminado para ese atributo, la fecha de hoy.

    Especifique ese comportamiento y prubelo (F5 y Reorganize).

    Recuerde que: Las reglas finalizan con punto y coma ;. El mtodo IsEmpty() aplicado a un atributo devuelve True cuando el atributo est vaco y False en caso

    contrario. La variable &today es del sistema y tiene cargado el valor de la fecha del da. Para escribir una variable dentro de la pantalla Rules, cuando tipea & se le despliegan todas las variables

    definidas hasta el momento para que seleccione la que necesita. La otra posibilidad es utilizar Insert / Variable

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    17/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Pruebe ingresar un nuevo cliente dejando vaco el nombre. Le permite grabar o pasar al siguiente campo?

    dem con el apellido. Sucede lo mismo con el telfono?

    Si luego le informan que la fecha de ingreso al sistema no debera ser manipulada por el usuario, sinonicamente visualizada, cmo establece este comportamiento?

    Especifquelo y prubelo en ejecucin.

    5. Patterns: mejorando la interfaz para

    trabajar con la informacin

    Al mostrarle al cliente lo realizado hasta ahora, nos dice que quisiera poder manipular la informacin depases, categoras y atracciones tursticas de un modo ms vistoso.

    Para ello deber aplicar los patrones Work With a las tres transacciones. Prubelo y valo en ejecucin.

    Observar que: existe un Work With para Smart Devices, tambin. Pero el que usted deber aplicar es el que corresponde a

    la aplicacin web que est constuyendo. GeneXus crear automticamente varios objetos por transaccin, para implementar el Trabajar con esa

    entidad.

    Solucin

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    18/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    Por qu no aparecen ms en el Developer Menu las transacciones Category, Country y Attraction?:

    Pruebe:

    1. Ingresar un nuevo pas.

    2. Modificar un pas existente (por ejemplo, agregndole una ciudad)

    3. Eliminar un pas existente

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    19/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    4. Visualizar la informacin de un pas.

    5. Realizar una bsqueda por nombre de pas.

    6. Ingrese un par de atracciones tursticas (Ej: La muralla China, de China/Beijing, Eiffel Tower deFrancia/Pars)

    7. Filtre las atracciones tursticas cuyo nombre empiece con F. Y si ahora quiere poder visualizar todaslas atracciones tursticas de Francia? No est incluida esta posibilidad, por lo que deberemospersonalizar el pattern work with de esta transaccin, para agregrsela. Hgalo en GeneXus ypruebe en ejecucin.

    Solucin

    Para ello primero observe cmo est especificado el filtro que s existe, por nombre de la atraccin turstica:

    8. Ahora quite los identificadores de pas y ciudad de la pantalla del Work With y prubelo en ejecucin.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    20/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina

    9. Si ahora quiere brindar la posibilidad de que el usuario elija si quiere ver las atracciones ordenadaspor nombre de la atraccin o por nombre de pas, implemntelo y pruebe.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    21/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    6. Listados pdf

    Ahora supongamos que como parte de la aplicacin, deber implementarse la posibilidad de que a pedido delusuario, se le desplieguen listados pdf con la informacin requerida. Por ejemplo, suponga que se necesita unlistado que muestre en orden alfabtico, las atracciones tursticas almacenadas en la base de datos.

    Si sabe que debe lucir ms o menos como sigue:

    Implemntelo en GeneXus.

    Recordar que para poder visualizar directamente desde el browser un listado, el mismo debe ser generadocomo PDF. Para esto debe configurar las siguientes propiedades del objeto procedimiento:

    Main program = True Call Protocol = http Report output = Only to File

    Y la siguiente regla: Output_file(nombre-archivo.pdf , PDF)

    Para ejecutar el listado, sobre la pestaa del objeto, botn derecho / Run with this only

    Repar en lo que le informa el listado de navegacin del procedimiento?

    Y si ahora se necesita que el listado salga ordenado por nombre de pas? Implemntelo, observe loinformado en el listado de navegacin y prubelo.

    Y si ahora necesita solamente listas las atracciones de Francia? Prubelo (observando listado denavegacin)

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    22/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    En cada caso, deduzca qu tabla de la base de datos se est recorriendo para realizar la consulta del foreach.

    Tambin se necesita un listado como el que sigue (que muestre cada categora, y por cada una de ellas, susatracciones tursticas). Implemntelo y pruebe lo realizado.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    23/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    7. Variable de Tipo de datos estructurado,

    Data Provider para cargarla y Web Panel

    para mostrarla

    Se va a necesitar mostrar en pantalla las categoras de atracciones tursticas, mostrando de cada una:nombre de la categora y cantidad de atracciones tursticas de esa categora y ese pas, como se ve acontinuacin:

    Como an no aprendimos cmo realizar un clculo, deje el nmero de atracciones tursticas con un valorpredefinido (por ejemplo vaco). Ms adelante, volveremos sobre este punto, para completarlo.

    Recuerde que: El objeto Web Panel le permite disear pantallas para mltiples usos Cada objeto GeneXus puede definir variables que sern espacios de memoria reservados dentro del

    objeto, para mantener temporalmente ciertos valores, mientras el objeto se est ejecutando (y queluego se desechan).

    Las variables son un nombre que se da a un espacio de memoria que se reserva. Para reservar eseespacio, debe especificarse su tipo de datos. Un caso particular, es cuando una variable no es de un

    tipo de datos simple, sino estructurado (all debern reservarse varias posiciones de memoria, paraalmacenar cada uno de los elementos del tipo de datos). Los tipos de datos estructurados pueden ser colecciones de tipos de datos. Los Data Providers se utilizan para cargar variables de tipos de datos estructurados (o business

    components, como se ver luego, que tambin son estructurados).

    Intente implementar lo anterior por su cuenta, sin mirar lo que sigue.

    Solucin

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    24/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    Una posible solucin: crear un tipo de datos estructurado que represente una coleccin de categoras con lainformacin que se necesita (nombre de categora y cantidad de atracciones tursticas correspondientes).

    Y luego un Data Provider que permita cargar una variable de ese tipo, obteniendo el nombre de categora dela base de datos. Para especificar su Source, recuerde que lo ms fcil es arrastrar el SDT del Folder View ysoltarlo en la pantalla Source. As solamente tendr que rellenar lo que se muestra en verde.

    Por ahora dejaremos vaco el valor de CategoryAttractions.

    Observemos que en la propiedad Output, aparece el SDT que es coleccin, por lo que la propiedad Collectionest en False (si se pusiera en True, el resultado sera una coleccin de colecciones).

    Luego cree el Web Panel, definiendo la variable &categories del tipo de datos del SDT anterior e insrtela enel Form. Le ofrecer insertarla dentro de un control Grid.

    Deber cargarla, cmo? En el evento Start, invocando al Data Provider anterior.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    25/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    EventStart&categories = GetCategories()

    EndEvent

    8. Transaccin Flight y subtiposSe necesita ahora registrar los vuelos de la agencia de viajes. Un vuelo tiene un identificador y va de un pasy ciudad origen a un pas y ciudad destino, y tiene un precio. Cree la transaccin para almacenar estainformacin. Para el Precio cree un dominio Numeric(10.0)

    Por qu no puede utilizar directamente los atributos CountryId, CountryName, CityId y CityName?

    Recuerde que en la estructura de la transaccin: un cono representando una flecha hacia arriba informa que el atributo es clave fornea (Foreign

    Key), es decir que apunta a otra tabla. Un cono representado una flecha hacia abajo informa que el atributo es inferido de otra tabla. Un cono representando una indica que el atributo es un subitpo

    Ejecute y verifique que al intentar ingresar un vuelo, se dispare un error si el pas de partida que estqueriendo asignarle al vuelo no existe, o si la ciudad no existe. dem cuando el pas o la ciudad son las dearribo.

    No debe permitirse ingresar un vuelo cuyo pas y ciudad de partida coincidan con el pas y ciudad de arribo.Implemente ese comportamiento y prubelo en ejecucin.

    Solucin

    error( 'Arrival country/City could not be the same than Departure country/city') ifFlightDepartureCountryId = FlightArrivalCountryId and

    FlightDepartureCityId=FlightArrivalCityId;

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    26/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    9. Business Components

    Realizaremos algunas operaciones sobre la base de datos, a travs de business components.

    Aumento de precio de los vuelos

    Cada tanto la agencia de viajes necesita incrementar los precios de los vuelos en un porcentaje determinado.Para ello, deberemos implementar una pantalla que permita al usuario especificar ese porcentaje deaumento, y dar la orden de aplicarlo a todos los vuelos de la base de datos. Implemntelo y pruebe.

    Recuerde que: El objeto web panel le permite implementar pantallas flexibles para entrada y salida de informacin. Para entrada de informacin (que el usuario pueda ingresar valores a la pantalla), se insertan controles

    variable en el form. Si quiere editar barras de men, posicionndose en GeneXus arriba, sobre la barra, con botn derecho

    podr insertar, por ejemplo, la barra Formatting. Para que el web panel tome alguna accin determinada, pueden insertarse botones y programar el

    evento asociado. Los business components son tipos de datos que se crean al marcar la propiedad correspondiente del

    objeto transaccin. Al hacerlo, para insertar, modificar o eliminar registros de las tablascorrespondientes, podr utilizarse, adems de la transaccin, una variable de tipo de datos BusinessComponent en cualquier otro objeto (por ejemplo, un web panel) y realizar las mismas operaciones atravs de los mtodos Load(), Save() y Delete().

    Para que las operaciones realizadas a travs del business component queden efectuadas de manerapermanente, deber ejecutar a continuacin el comando Commit.

    Si a un valor X se le quiere incrementar un 20%, alcanza con hacer X = X*(1+20/100) = X*1,20

    Solucin

    Una solucin posible (intente implementar ud. lo pedido sin mirar lo que sigue): creamos un Web panel,con una variable &percentage, de tipo de datos: Numeric(3.0)

    Al hacer doble clic sobre el botn, nos lleva a la seccin Events, editando el evento Enter, asociado almismo.

    All programaremos la lgica que queremos se ejecute cuando el usuario presione el botn.

    Necesitamos recorrer todos los vuelos y sobreescribir el precio que tenan, aumentndolo en eseporcentaje indicado por el usuario en la variable de pantalla.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    27/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    Para recorrer todos los vuelos de la base de datos, usamos el comando for each.

    Y para cada vuelo, cmo lo editamos para modificarle el valor de FlightPrice?

    Necesitaremos una variable para ello, que tenga toda la estructura de la transaccin Flight, y ademsnos permita grabar en la base de datos. Qu tipo de datos tendr, entonces, esa variable? Elbusiness component Flight (observar que el tipo de datos business component tiene el mismonombre que la transaccin). Pero GeneXus no crea ese tipo de datos automticamente para cadatransaccin. Se lo tenemos que pedir. Cmo lo hacamos? Prendiendo la propiedad correspondiente dela transaccin.

    Una vez hecho esto, entonces:

    EventEnterfor each

    &flight.Load(FlightId)&flight.FlightPrice = &flight.FlightPrice*(1+&percentage/100)&flight.Save()...

    endfor

    EndEvent

    Recuerde que al hacer:

    &flight.Load(1)

    se cargar en la variable &flight (que tiene una estructura compuesta), toda la informacin del registrode la tabla Flight de la base de datos, correspondiente al Id de vuelo, 1:

    Por tanto, al hacer &flight.Load(1), si deseamos cambiar la ciudad de partida por la 4, y dejar todos losdems datos tal y como estaban, alcanzar con hacer:

    &flight.FlightDepartureCityId = 4

    Pero si luego no pedimos que grabe estas modficaciones, se habrn hecho slo en memoria, pero no enel registro de la base de datos. Para efectivamente grabar el cambio, debemos agregar el mtodo Save:

    &flight.Save()

    Ahora, qu suceder si no existe el identificador de ciudad 4 para el pas 2? Al igual que en latransaccin, se controla la integridad de la informacin relacionada, y en ese caso un error impedir quese grabe en la base de datos.

    Como las operaciones de grabacin o eliminacin de la base de datos (a travs de los mtodos Save() yDelete()) pueden provocar errores, es importante saber qu ocurri. Para ello tenemos el mtodoSuccess() que devolver True si no hubo errores, y False en caso contrario.

    EventEnterfor each&flight.Load(FlightId)&flight.FlightPrice = &flight.FlightPrice*(1+&percentage/100)&flight.Save()

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    28/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    If&flight.Success()Commit

    elseRollback

    endifendfor

    EndEvent

    Al insertar, modificar o eliminar registros de una tabla de la base de datos, mientras que no se diga:todo lo hecho que quede permanente, esas modificaciones sern provisorias. Qu quiere decir? Quepor ejemplo, si hay un apagn, esas modificaciones se perdern. La forma de decir lo hecho, quequede permanente es ejecutar el comando Commit. Si por el contrario, queremos que lo que hicimosse deshaga, ejecutamos el comando Rollback.

    Pantalla para eliminacin de todos los vuelos

    Grabe el web panel anterior con otro nombre (para ello alcanza con posicionarse sobre la pestaa y conbotn derecho, hacer Save as) y modifique el Form para que slo contenga un botn con el texto Delete allflights, de modo que en ejecucin este web panel se vea as:

    Cuando el usuario presione el botn, debern eliminarse todos los vuelos de la base de datos.

    Qu debe modificar del evento Enter que tena programado?

    Nota: si se posiciona sobre el botn y ve sus propiedades, en la de nombre Caption puede modificar el texto delbotn.

    Solucin

    Alcanzar con :

    EventEnterfor each

    &flight.Load(FlightId)&flight.Delete()if&flight.Success()

    CommitMsg( 'Successful deletion')

    else

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    29/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    Msg( 'Delection could not be done')Rollback

    endifendfor

    EndEvent

    Con Msg lograr que se despliegue ese mensaje en la pantalla del web panel.

    Agregar un vuelo a travs de un web panel [opcional]

    Con la idea de ms adelante implementar un wizard para el ingreso de un vuelo (es decir, a travs dedistintas pantallas que vayan guiando al usuario): nuevo vuelo en la base de datos.

    por ahora lo haremos en un solo paso. Es decir, crearemos un web panel para que el usuario ingrese losvalores necesarios en una sola pantalla y al presionar el botn Confirm, grabar el vuelo en la base de datos.

    Implemntelo en GeneXus y pruebe en ejecucin. Asegrese que al presionar Confirm el vuelo hayaquedado efectivamente insertado en la tabla correspondiente de la base de datos.

    Vea qu sucede si deja el mismo pas y ciudad de partida que de arribo.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    30/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 2

    Solucin

    Creamos un Web panel, con una variable &flight del tipo de datos el business component Flight.Insertamos la variable en el form (solamente para los valores que necesitamos ingrese el usuario: esdecir, los que no son inferidos ni autonumerados).

    Observe que podemos modificar las propiedades de un control variable para que en lugar de ser un simplecampo de edicin, sea un combo que ofrezca valores de una tabla de la base de datos.

    As, viendo las propiedades del control &flight.FlightDepartureCountryId, cambiamos la Control Type deEdit a Dynamic Combo Box y la propiedad ItemDescriptions como mostramos:

    Luego, en el evento asociado al botn programamos:

    EventEnter&flight.Save()if&flight.Success()

    Commitmsg( 'The flight was successfuly added')

    elseRollbackmsg( 'Error: the flight could not be added')

    endif

    EndEvent

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    31/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 3

    10.Procedimientos para actualizar registros

    Aumento de precios de los vuelos

    Suponga que los vuelos a los que debe aumentar el precio en un porcentaje dado (vuelva al primer ejerciciodel punto 9 del prctico) son miles. Sabiendo que el aumento de precio es un procedimiento sencillo que nohar fallar la integridad de ningn modo, hgalo con un procedimiento, sin utilizar business components.

    Recuerde que: Con el comando for each dentro de un procedimiento, puede actualizar los atributos de su tabla

    extendida a travs de simples asignaciones. La actualizacin directa a travs de procedimientos no controla la integridad de la informacin. Todo objeto debe declarar los parmetros que recibe y los parmetros que devuelve. Si no los declara,

    ni recibir ni devolver valores. Los parmetros se declaran a travs de la regla parm. Las variables son locales al objeto donde se utilizan. Esto significa que si quiero recibir un valor como

    parmetro en una variable &X, debo declararla en el objeto.

    Eliminacin de todos los vuelos

    Y si ahora quisiera eliminar todos los vuelos, tal como lo hizo en el punto 9 del prctico, pero a travs de unprocedimiento?

    Solucin

    Crear un procedimiento FlightsDeletion que no recibe parmetros, con el siguiente cdigo:

    for eachdefined by FlightPriceDelete

    endfor

    Haga un Save as del web panel que tena implementado en el punto 9 (el que haca la eliminacin a travs

    de Business Component), y cambie el evento Enter:

    EventEnterFlightsDeletion()

    EndEvent

    Y si ahora quiere borrar toda la informacin de la base de datos?

    Solucin

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    32/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 3

    Crear un procedimiento DeleteAll con Source:

    for eachdefined by CustomerNamedelete

    endfor

    for eachdefined by FlightPricedelete

    endfor

    for eachdefined by AttractionNamedelete

    endfor

    for eachdefined by CategoryNamedelete

    endfor

    for eachdefined by CountryNamefor each

    defined by CityNamedelete

    endfordelete

    endfor

    Y cambiar el web panel anterior (sabe as), agregndole un botn, al que le asociaremos un evento deusuario. Para ello, editando las propiedades del botn , en OnClickEvent elegimos y le damos elnombre que queramos:

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    33/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 3

    Luego haciendo botn derecho sobre el botn: Go To Event y programamos la invocacin al procedimiento.

    Inicializacin de la informacin de la base de datos [opcional]

    Cuando la aplicacin que usted est desarrollando se ponga en produccin (es decir, empiece a ser utilizadapor la agencia de viajes) debern cargarse todos los datos de clientes, pases, categoras, atracciones,vuelos. Escriba un procedimiento que inicialice esas tablas con informacin que nos ha brindado la agenciade viajes y prubelo.

    Tener en cuenta que: El comando new ingresa un registro en una tabla fsica. Si no asigna valor a un atributo de la tabla, entonces:

    o Si el atributo es autonumerado, al grabarse el registro en la base de datos (al alcanzarse elendnew), en memoria quedar para ese atributo el valor dado por la base de datos al mismo.Por ejemplo, si se est grabando una categora:

    NewCategoryName = Monument

    EndnewSabemos que luego del Endnew si utilizamos el atributo CategoryId ste tendr el valor que labase de datos le dio al registro al ingresarlo.

    Solucin

    Crear un procedimiento DBInitialize con el Source que sigue e invocarlo desde un web panel:

    newCustomerName = 'John'CustomerLastName = 'Cage'CustomerEMail = '[email protected]'CustomerAddress = '11235 NE 4 Ave, Miami'

    endnew//Brazil

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    34/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 3

    newCountryName = 'Brazil'

    endnewnew

    CountryId = CountryIdCityId = 1CityName = 'Rio de Janeiro'

    endnew

    //Francenew

    CountryName = 'France'endnewnew

    CountryId = CountryIdCityId = 1CityName = 'Paris'

    endnewnew

    CategoryName = 'Monument'endnewnew

    AttractionName = 'Eiffel Tower'CountryId = CountryIdCityId = CityIdCategoryId = CategoryIdAttractionPhoto = EiffelTower.Link()

    endnew

    newCountryId = CountryIdCityId = 2CityName = 'Niza'

    endnew

    //Chinanew

    CountryName = 'China'endnewnew

    CountryId = CountryIdCityId = 1CityName = 'Beijing'

    endnewnew

    CountryId = CountryIdCityId = 2CityName = 'Shangai'

    endnew

    11.Pasaje de parmetros

    Muchas veces necesitamos que un objeto reciba parmetros para, en base a los mismos, ejecute su lgica.Por ejemplo, una cosa es realizar un listado pdf de todas las atracciones tursticas de la base de datos, y otraes realizar un listado de aquellas cuyo nombre se encuentra dentro de un rango dado.

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    35/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 3

    Listado de atracciones en un rango determinado

    Grabe con otro nombre el procedimiento que haba creado en el punto 6 para listar las atracciones tursticas,

    y modifquelo para que ahora solamente liste aquellas cuyo nombre se encuentra dentro de un rango recibopor parmetro (el valor inicial y el final del rango sern los parmetros recibidos).

    Implemente una pantalla que pida los valores de ese rango al usuario, e invoque a este objeto, pasndoleesos valores por parmetro. Pruebe en ejecucin.

    Recuerde que: Si define una variable basada en (based on) un atributo, quedar ligada al tipo de datos del atributo,

    es decir, si ste se modifica, el de la variable tambin, acorde al cambio. Las variables utilizadas para realizar una invocacin en el objeto que llama y las utilizadas para declarar

    los parmetros que se reciben en el objeto llamado, no tienen por qu coincidir en nombre, pero sdeben tener tipos de datos compatibles.

    Solucin:

    Al procedimiento (llammosle AttractionsFromTo le agregamos la regla parm (y definimos ambas

    variables en el procedimiento):

    parm( in: &fromName, in: &toName );

    Y en su Source:

    print Titleprint ColumnTitlesfor eachwhere AttractionName>= &fromName

    where AttractionName

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    36/37

    Curso GeneXus X Ev2: Ejercicios prctico

    Pgina 3

    Recuerde que: Cuando en un objeto se declara como uno de los parmetros un atributo, en lugar de una variable, se

    est especificando algo ms fuerte: que en todos los lugares dentro del objeto donde se use eseatributo, se supondr que su valor est fijado: ser el que se recibi por parmetro al invocarse alobjeto.

    o Ej: si en un reporte ListCustomer se tiene: parm( CustomerId ) y en el Source:For each

    Print CustomerPB //printblock con atributos de tabla CUSTOMEREndforY se invoca a este reporte: ListCustomer( 3 )Se listar solamente la informacin del cliente cuyo Id es 3.En cambio si se hubiera declarado en la regla parm( &CustomerId ), una variable, conel mismo Source anterior (es decir, sin utilizar la variable), entonces ante la mismainvocacin, se listar esta vez la informacin de todos los clientes, no slo el 3.

    Solucin:

    Creamos un reporteFlightInfoList con las reglas:

    Parm( in: FlightId );Output_file( 'FlightInfo.pdf', 'pdf');

    Con el Source:

    for eachprint flightPB //FlightId, FlightDepartureCountryId,

    //FlightDepartureCountryName,//FlightDepartureCityId, FlightDepartureCityName, FlightPrice

    endfor

    Y en el evento del web panel, agregamos al final la invocacin al procedimiento:

    EventEnter&flight.Save()if&flight.Success()

    Commitmsg( 'The flight was successfuly added')

    elseRollbackmsg( 'Error: the flight could not be added')

  • 7/31/2019 PracticoCursoGXXEv2+(4)

    37/37

    Curso GeneXus X Ev2: Ejercicios prctico

    endifFlightInfoList( &flight.FlightId )

    EndEvent

    12.Frmulas

    Ahora estamos en condiciones de completar el web panel que implementamos en el punto 7. Calcule lacantidad de atracciones correspondientes a la categora que se est cargando.

    Solucin:

    En el Source del Data Provider especificamos la frmula local Count:

    Categories{

    CategoriesItem{

    Category = CategoryNameCategoryAttractions = count( AttractionName)

    }

    }