Practico Curso GXX
Practico Curso GXX
Practico Curso GXX
Ejercicios Prcticos
ltima actualizacin: 11 de Enero de 2010
Marcas Registradas Artech y GeneXus son marcas o marcas registradas de Artech Consultores S.R.L. Todas las dems marcas mencionadas en este documento son propiedad de sus respectivos dueos.
Notas previas
El presente material corresponde a los ejercicios prcticos que el alumno del curso GeneXus deber ir desarrollando en forma paralela a las clases tericas. 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. Finalizada esta parte prctica del curso, el alumno estar en condiciones de analizar una realidad simple y modelarla utilizando GeneXus, con el apoyo de un instructor, de forma tal de cerrar un mdulo completo de aprendizaje fundamental para poder empezar a desarrollar sus propias aplicaciones. Dado que la finalidad de este curso es aprender la lgica de GeneXus, su esencia, independientemente de la plataforma en que la aplicacin vaya a implementarse, podra ud. prototipar en cualquiera de las plataformas soportadas por GeneXus. El instructor deber entregarle al comenzar el prctico los datos de la plataforma elegida para el curso, de manera tal que ud. configure el Environment con esa informacin. Encontrar notas a continuacin de algunos ejercicios, que invitan a la reflexin sobre lo realizado. Fueron incluidas para que el alumno no pase por alto conceptos tericos importantes que estn siendo aplicados. Tambin las habr con sugerencias de variaciones al ejercicio, para que las pruebe si as lo desea.
Pgina 1
1. 2. CREARUNABASEDECONOCIMIENTO..................................................................................................................3 EJERCICIOSDETRANSACCIONES...........................................................................................................................3
TRANSACCINCOUNTRY............................................................................................................................................................3 TRANSACCINCUSTOMER..........................................................................................................................................................5 CONSTRUIRYEJECUTARLAAPLICACIN ...........................................................................................................................................7 . Clavecandidata..................................................................................................................................................................8 EfectodepermitirvaloresnulosenatributosForeignKey(FK)..........................................................................................8 MSTRANSACCIONES:PRODUCTEINVOICE.................................................................................................................................8 TRANSACCININVOICE ............................................................................................................................................................10 . EJECUTELASTRANSACCIONESPRODUCTEINVOICE......................................................................................................................13 Regladeasignacinversusfrmula.................................................................................................................................13 NORMALIZACIN......................................................................................................................................................................14 AVANZADO:TRANSACCINCUSTOMER[OPCIONAL] ....................................................................................................................15 . AVANZADO:USODEIMGENES[OPCIONAL] ..................................................................................................................................18 . AVANZADO:USODEDOCUMENTOSYARCHIVOS[OPCIONAL].............................................................................................................19 3. 4. 5. 6. 7. 8. 9. 10. CONSULTASBATCH:PROCEDIMIENTOS..............................................................................................................20 DATASELECTORS...............................................................................................................................................23 ACTUALIZACIONESNOINTERACTIVASALABD...................................................................................................24 SUBTIPOS..........................................................................................................................................................26 INTERFAZDEUSUARIO:PATTERNWORKWITHYWEBPANELS...........................................................................26 CONSULTASDINMICAS....................................................................................................................................27 WORKFLOW......................................................................................................................................................27 APNDICE:SQLSERVEREXPRESS2005...............................................................................................................29
Pgina 2
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 la ventana 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.
2. Ejercicios de transacciones
A continuacin se solicita que se definan algunas transacciones en la base de conocimiento creada antes. Para cada una de ellas se muestra una imagen del Web Form y una lista de atributos a incluir en su estructura (sin embargo, podr ser necesario incluir otros). Se ejercitan diversas caractersticas de las transacciones (definicin de reglas, frmulas, etc.).
Recordar que para crear objeto existen varias alternativas: Hacerlo desde la Start Page. Hacerlo desde el men: File/New/Object. Ctrl+N.
Sugerencias: - Utilizar la insercin de reglas mediante los snippets de la ToolBox; insertar funciones mediante Insert/Functions. - Utilizar: View/Work With Object. - Utilizar: View/Work With Attributes. - Hacer Diagrama de Tablas y Transacciones creando un objeto tipo Diagram (File/New object/Diagram).
Transaccin Country
Atributos: CountryId CountryName Country Id Country Name Numeric(6) Character(50)
Pgina 3
Luego de haber ingresado el CountryId en la estructura de la transaccin, con toda su informacin relacionada (Type, Description, Nullable, etc.), y cuando est pronto para digitar el prximo atributo CountryName, en lugar de digitar la primera letra, C, para escribir Country, digite punto .. Qu sucedi? En el campo Nullable del atributo CountryName en la estructura, se dispone de un combo box con los valores posibles para esa columna (Yes, No, por defecto es No). Por qu no puede cambiar el valor por defecto del atributo CountryId?
Form Web:
Para empezar, utilice la insercin de reglas mediante los Snippets de la ToolBox, (si no tiene la ventana abierta, edtela con View/Other Tool Windows) y Drag & Drop (D&D); o utilice el men Insert. Para utilizar un atributo sin tener que tipearlo, utilice la ventana View/Work With Attributes y Drag & Drop; o el men Insert/Attibute (Ctrl+Shift+A). Cuando presiona punto . luego del nombre de un atributo o variable, se le abrir una lista de propiedades y mtodos asociados a ese atributo o variable, para que seleccione el que desee. Recuerde que los mtodos incluyen parntesis (). Si no aparecen deber agregarlos. Ej CountryName.IsEmpty().
Observe los Text Blocks que aparecen en el form, a la izquieda de los atributos. En la estructura de la transaccin, edite las propiedades del atributo CountryId y modifique el valor de la propiedad ContextualTitle por Identifier. Grabe y observe qu sucede con el Text Block de la izquierda de CountryId en el form Web. Deduzca el valor por defecto que coloca GeneXus en la propiedad mencionada.
Pgina 4
Transaccin Customer
Definir 4 dominios siguiendo lo que se indica a continuacin.
Existen distintos caminos que conducen a la definicin de un dominio: Cuando ya antes de comenzar a crear transacciones se identifica que ser necesario definir determinado dominio, se puede crear mediante View/Domains o con doble clic sobre Domains en el Folder View. Pruebe definir los dominios Name como Character(50), Price como Numeric(9.2) y Total como Price (dominio basado en dominio) de esta manera centralizada. Luego los utilizar en las transacciones, cuando defina atributos basados en estos dominios. Cuando est definiendo al atributo CustomerId, al completar su tipo de datos digite: Id = Numeric(6.0). Luego de hacerlo, vaya a View/Domains para ver todos los dominios definidos en la KB. Est all Id? Modifquele al dominio la propiedad Autonumber, pasando su valor a True.
Cuando est definiendo al atributo CustomerName, observe lo que sugiere GeneXus automticamente para su tipo de datos.
Atributos: CustomerId CustomerName CustomerAddress CustomerGender CustomerTotalPurchases CustomerTotalPayments CustomerBalance CountryId CountryName Customer Id Customer Name Customer Address Customer Gender (Sexo de Cliente) Customer Total Purchases (Total de compras de Cliente) Customer Total Payments (Total de pagos de Cliente) Customer Balance (Saldo de Cliente) Country Identifier Country Name Id = Numeric(6.0) Name Character(30) Character(1) Total Total Total Id Name
Por qu los atributos CountryId y CountryName no aparecen en la estructura de Customer con los dominios Id y Name respectivamente? Ascieselos directamente en esta transaccin. Abra Country (debe refrescar la pantalla si la tena abierta) y vea que CountryId y CountryName quedaron con los dominios asignados. Edite el dominio Name y modifique su tipo de datos para que en vez de Character(50) sea Character(30). Observe la repercusin en los atributos que tienen este dominio asociado (ver Properties/Type Definition de los atributos CountryName y CustomerName). Observe los conos que aparecen en la estructura de la transaccin Customer, a la izquierda de los atributos CountryId y CountryName respectivamente. Qu le estn indicando?
Pgina 5
Form Web:
Generalidades: Definir CustomerGender para que aparezca en todo form como un control Radio Button.
Esto se debe hacer modificando las propiedades del atributo CustomerGender en la estructura. Para la propiedad Control Type seleccione el valor Radio Button y para la propiedad Values agregue el texto Male (masculino) con el valor M y Female (femenino) con el valor F. Observe que tras grabar, el form se actualiza mostrando el radio button. Por haber modificado estas propiedades asociadas al atributo, cada vez que se agregue CustomerGender en un form de cualquier objeto GeneXus, por defecto aparecer como Radio Button. En cambio si se configuran las propiedades asociadas al control en el form, solo aplicar a ese control CustomerGender en este form en particular, y no en cualquier otro donde se inserte.
Pgina 6
Reglas: No se permiten clientes sin nombre. Avisar en caso de que no se ingrese la direccin. No permitir que se ingrese valor en el total de compras (se ir actualizando desde las facturas del cliente). El saldo del cliente se calcula como la diferencia entre sus compras y pagos. No permitir que se ingrese valor en este atributo (CustomerBalance). Que ofrezca por defecto el valor Female de CustomerGender.
Ingrese algunos pases y clientes. De dnde salen el encabezado (Application Header) y pie de pgina (footer) que puede visualizar en ejecucin de ambas transacciones? (Observe en GeneXus, en la solapa Navigation View que se abri en la ventana central, el objeto AppMasterPage generado). Luego: Pruebe ingresar un pas sin dar valor al Identificador. Est funcionando el autonumber? Pruebe ingresar un pas sin nombre. Pruebe los botones de navegacin para recorrer los pases ingresados. Pruebe seleccionar un pas de los existentes, utilizando el botn Select. Qu objeto es el que se abre al hacerlo? Lo program ud.? Vaya a su KB y bsquelo en la lista de objetos. Pruebe editar un pas existente, digitando su cdigo en el campo CountryId y saliendo luego del campo. Pruebe vaciar el campo correspondiente al nombre del pas y confirmar. Pruebe editar un pas existente y eliminarlo. Pruebe ingresar un cliente nuevo, digtele un identificador de pas inexistente, o deje vaco el pas. Qu ndice se utiliz para validar que el pas exista? Presione la imagen que se ofrece al lado de CountryId y seleccione uno de los pases existentes. Qu objeto se abri? Observe que es el mismo que cuando presion Select en la transaccin Country para elegir un pas. Pruebe dejar vaco el nombre de un cliente, y luego la direccin. Observe que CustomerTotalPurchases est Read Only, al igual que CustomerBalance. Por qu? Pruebe eliminar un pas para el que tenga por lo menos un cliente asociado. Qu ndice se utiliz para
Pgina 7
validar que el pas tena al menos un cliente asociado e impedir la eliminacin? Ingrese 2 clientes con el mismo nombre. A continuacin veremos cmo evitar que esto suceda.
Clave candidata
Si en su realidad no pueden existir 2 clientes con el mismo nombre, es decir, si CustomerName no puede tener valores duplicados, cmo lo implementa para que sea chequeado automticamente? Defina un ndice unique sobre la tabla CUSTOMER, compuesto por el atributo CustomerName, de tipo ascendente. Para hacerlo deber abrir la tabla CUSTOMER (Folder View/Tables) y seleccionar la solapa Indexes. Observe el Warning que se presenta en el Impact Analysis luego del F5: le avisa que de tener clientes con el mismo nombre, la reorganizacin fallar. Ud. puede proseguir con la reorganizacin, sin embargo si es su caso el avisado en el warning, la reorganizacin cancelar. Por lo tanto vaya al browser, ejecute la transaccin Customer (http://localhost/BillingSystem.NetEnvironment/customer.aspx) y modifique el nombre de uno de los clientes con nombre repetido. Vuelva a GeneXus y presione nuevamente F5. Ahora s podr ejecutar la reorganizacin, se crear el ndice unique por CustomerName en la tabla CUSTOMER, y se validar que no se ingresen clientes con nombre repetido.
ProductStock ProductPrice
Pgina 8
Seleccione con el mouse los distintos controles del form y vea cmo va cambiando lo que se muestra en esta barra.
Pgina 9
Puede ejecutar ahora la nueva transaccin, o esperar a hacerlo luego de crear la siguiente, Invoice. Sugerimos esto ltimo.
Transaccin Invoice
Cree a la transaccin Invoice de 2 niveles con los atributos de la siguiente tabla y defina el dominio Amount basado en el dominio Total, y los dominios ShortId y Quantity como se indica:
InvoiceId InvoiceDate CustomerId CustomerName CustomerTotalPurchases { InvoiceDetailId ProductId ProductDescription ProductStock ProductPrice InvoiceDetailQuantity
Invoice Identifier Invoice Date Customer Id Customer Name Customer Total Purchases Detail identifier Product Identifier Product Description Product Stock Product Price Invoice Detail Quantity (Cantidad llevada de Producto)
Id Date Id Name Total ShortId = Numeric(2) Id Description Stock Price Quantity= Numeric(3)
InvoiceDetailAmount }
Amount
Pgina 10
InvoiceAmount
Amount
En lugar de insertar uno a uno los atributos ProductId, ProductDescription, ProductStock y ProductPrice, puede seleccionarlos del View/Work With Attributes y hacer Drag & Drop a la estructura de la transaccin. Asigne el nombre Detail al segundo nivel de la transaccin. Observe que estando en el segundo nivel, al presionar . para nombrar a los atributos InvoiceDetailQuantity e InvoiceDetailAmount, ya le sugiere InvoiceDetail como primera parte del nombre. Recuerde que puede mover un atributo de un nivel hacia el nivel padre, con botn derecho sobre el atributo y Unindent. La operacin contraria se realiza con Indent. Pruebe subir y bajar atributos dentro del mismo nivel, seleccionando al o a los atributos y luego presionando botn derecho y Move Items up o Move Items Down. Salve la transaccin definida. Vaya al folder Tables del FolderView y observe los nombres que GeneXus asigna por defecto a las tablas correspondientes a cada uno de los niveles. Observe los atributos que aparecen en cada una. La clave primaria de la tabla correspondiente al segundo nivel est conformada por dos atributos: InvoiceId e InvoiceDetailId. Observe los ndices que crear GeneXus sobre esta tabla.
Observe el form web creado por defecto y comprelo con el siguiente que ha sido ligeramente modificado: Form Web:
Observe que CustomerId y CustomerName se han puesto en la misma fila (puede mover controles de lugar con Drag & Drop). CustomerTotalPurchases no aparece en el form (deber borrar este control). Para eliminar una fila vaca de una tabla, posicinese en una celda de la fila a ser eliminada, y seleccione botn derecho/Table/Delete Row. La forma de alinear controles es colocndolos en tablas. Para insertar una tabla, un camino posible es seleccionar: Insert/Table. Con el cono Show Borders: logra que se le muestren (en tiempo de diseo, no en ejecucin) los bordes de las tablas donde estn contenidos los controles del form. Cliquee este cono para ver
Pgina 11
Observe que ProductStock no aparece en el grid del form mostrado. Deber ocultarlo para que no se vea. Recuerde que para trabajar con las columnas de un grid, eliminar atributos o variables de las columnas, reordenar las columnas, etc., cuenta con: Properties (F4): Estando posicionado sobre cierta columna del grid, edita las propiedades de esa columna. Para la columna ProductStock cambie el valor de la propiedad Visible de True a False. Botn derecho sobre el grid/Columns: Se muestra la lista de columnas incluidas en el grid (por defecto son los atributos correspondientes al segundo nivel de la transaccin). Por este camino tambin es posible seleccionar ProducStock, editar su propiedades y cambiar el valor de la propiedad Visible de True a False. Botn derecho sobre una columna del grid /Insert Column: para agregar una columna. Botn derecho sobre una columna del grid/Delete Column: para borrar dicha columna. Arrastrar y soltar (Drag & Drop) una columna: para cambiarla de lugar en el grid.
Observe que los ttulos de las columnas del grid son cortos (no coinciden con las descripciones que le dimos a los atributos). Posicinese en la columna ProductDescription y con F4 edite sus propiedades. Vea que la propiedad Title tiene el valor =ProductDescription.ColumnTitle (es decir que est tomando dinmicamente el valor de la propiedad ColumnTitle del atributo ProductDescription). Si ahora se posiciona en la columna InvoiceDetailQuantity o en la columna InvoiceDetailAmount (que corresponden a atributos de la propia tabla INVOICEDETAIL), encontrar que sus propiedades Title tienen respectivamente los valores =InvoiceDetailQuantity.ContextualTitle y =InvoiceDetailAmount.ContextualTitle (es decir que estn tomando dinmicamente el valor de la propiedad ContextualTitle del atributo). Cmo lograr entonces cambiar el valor de los ttulos de las columnas? Opciones: Cambiar el valor de la propiedad Title de la columna, estticamente. De acuerdo a la columna, cambiar la propiedad Column Title o Contextual Title del atributo correspondiente en la estructura de la transaccin. Tambin observe en su form el Text Block Detail que da nombre al grid. Vaya a la estructura de la transaccin, posicinese sobre el nombre del segundo nivel y edite sus propiedades. Cambie la propiedad Description y observe qu sucede con este text block en el form. Se refresc el Text Block con la nueva descripcin que ingres? Por qu?
En el form mostrado arriba, el control atributo InvoiceAmount aparece en rojo y a la derecha. Para lograrlo: Observe que todos los atributos y sus descripciones (tanto los que corresponden al primer nivel, como los que corresponden al segundo nivel y estn incluidos en un grid) se encuentran dentro de una tabla de 5 filas x 2 columnas. Inicialmente la tabla tena 7 filas pero por lo solicitado en este prctico, ud. debe haber eliminado 2 filas. Puede observar esto con mayor claridad valindose de la ventana Document Outliner. Posicinese en la fila donde se encuentra el atributo InvoiceAmount. En la primera celda de esa fila encontrar el text block de ttulo Amount, Observe la propiedad Caption de este text block (vea que la descripcin Amount es tomada dinmicamente de la propiedad ContextualTitle del atributo InvoiceAmount). Ahora posicinese en la celda en la que se encuentra el atributo InvoiceAmount. Haga botn derecho/Properties (o F4), y modifique la propiedad Align para lograr una alineacin derecha del contenido de la celda. Inserte dentro de la celda en la que est el atributo InvoiceAmount una tabla de 1 fila x 2 columnas. Para ello puede seleccionar Insert/Table o hacer Drag & Drop desde la Toolbox. Mueva el control correspondiente al atributo InvoiceAmount a la celda derecha de la tabla que acaba de crear. Y al text block con texto Amount colquelo en la celda izquierda de la tabla. Para modificar las propiedades de esos controles (texto y atributo) para que aparezcan en negrita y rojo respectivamente, seleccione cada control y modifique la propiedad que corresponda mediante de la ventana de Propiedades.
Pgina 12
Frmulas:
1. Calcular el importe de cada lnea de la factura (InvoiceDetailAmount). 2. Calcular el total de la factura (InvoiceAmount). 3. Contar la cantidad de lneas ingresadas. Construya la aplicacin (F5).
Por qu hay que reorganizar? Observe detenidamente lo informado por el IAR. Deben eliminarse los atributos InvoiceAmount e InvoiceDetailAmount de las tablas correspondientes. Por qu? El listado de navegacin de Invoice arrojar 2 Warnings debido a la presencia de las reglas Add y Subtract. Se le informa que en modo update no podrn actualizarse los atributos CustomerId y ProductId. Explicacin:, Si se permitiera modificar el ProductId, la regla Subtract(InvoiceDetailQuantity, ProductStock) debera acceder al registro de PRODUCT correspondiente al ProductId que la lnea tena inicialmente, deshacer el subtract que se haba efectuado previamente, y luego acceder al registro de PRODUCT correspondiente al ProductId actual en la lnea y realizar el subtract. Es decir, se debera acceder a 2 registros distintos de PRODUCT. Esto no es posible, y por ello se deshabilita la posibiliad de modificar el atributo ProductId. Si se desea modificar el producto en una lnea, habr entonces que borrar la lnea y volverla a insertar con el Id de producto deseado. Anlogo es el caso de la regla Add y el atributo CustomerId. Pruebe en ejecucin todo lo que ha agregado.
Pgina 13
Antes del F5, reflexione sobre si deber reorganizarse la base de datos. Qu tabla deber modificarse?
Normalizacin
Si en la estructura de la transaccin Invoice se agregan al primer nivel los atributos CountryId y CountryName, qu ocurrir con la tabla INVOICE? Se almacenar el atributo CountryId como Foreign Key a la tabla COUNTRY? O GeneXus entender que ese atributo deber inferirse, al igual que CustomerName, del cliente CustomerId? Prubelo en GeneXus (agregue los atributos CountryId y CountryName al primer nivel de Invoice y vea cmo al salvar, el cono de la izquierda de CountryId en la estructura ya le indican antes del F5 si se tratar de una FK o si ser un atributo inferido). Corrobore si el comportamiento es el que esperaba. Reflexione sobre lo realizado.
Y si quisiera que la factura tuviera un pas propio, que deba ser ingresado asociado a la factura e independiente del pas del cliente? Por ahora ud. no cuenta con las herramientas para resolverlo. Lo har ms adelante, cuando estudie el concepto de subtipos.
Pgina 14
Lo que se hizo aqu fue disfrazar el atributo CountryId de CountryName, para permitirle al usuario en ejecucin trabajar con descripciones en lugar de tener que trabajar con cdigos. Vea este nuevo form propuesto en ejecucin:
Para el usuario ser ms fcil recordar el nombre de un pas, que su identificador. El sistema internamente sigue trabajando con el identificador.
Pgina 15
Cmo se logra este comportamiento? Tenemos una forma particular (que aplicar a ese control en ese form) y otra general (que aplicar para todo form en el que se presente CountryId). La forma particular es editando las propiedades del control atributo CountryId en el form. Hay que seleccionar el control en el form y modificar el valor de la propiedad InputType asociada al control. Por defecto esta propiedad tiene el valor Values (que significa que el propio valor del atributo ser ingresado) y habr que seleccionar el valor Descriptions (que significa que el valor entrado ser tomado de un atributo descriptivo, pero el valor almacenado ser el que corresponda al propio atributo).
1)
Elegir valor: Descriptions En consecuencia: 2) Se completa automticamente la propiedad ItemValues = CountryId Se solicita completar la propiedad ItemDescriptions
3) Observe en la prxima captura todas las propiedades remarcadas. Una vez configuradas dichas propiedades para el control CountryId en el form de Invoice, queda implementado el disfraz para que el valor que el usuario entre en CountryId sea un nombre de pas, pero el valor que quede almacenado en el atributo CountryId sea el identificador de pas correspondiente:
Pgina 16
Observe que se ha configurado tambin el valor de la propiedad Suggest. Esta propiedad permite indicar si se desea sugerir al usuario a medida que ste va digitando, las descripciones almacenadas que coincidan con lo que viene digitando (para que elija uno de los valores ya existentes). En el form en ejecucin mostrado arriba, se puede observar este comportamiento.
Observe que luego de definido este disfraz, el control CountryId se visualiza en el form del largo de la definicin de CountryName (ya que el usuario ingresar nombres de pases en dicho control). Quite el control atributo CountryName del form, pues ya no se necesita tenerlo aparte.
En lugar de haber configurado estas propiedades a nivel del control en el form, podra haberse optado por la solucin general, configurando las mismas propiedades pero asociadas al atributo (editando las propiedades del atributo en la estructura de la transaccin). De hacer la definicin de esta manera, en todo form en el que se inserte CountryId se manejar el disfraz (y el control atributo CountryName directamente no se incluir).
Una funcionalidad muy similar a la vista aqu es la de utilizar un Dynamic ComboBox para el atributo CountryId.
Pruebe el comportamiento.
Pgina 17
El siguiente paso le pedir ingresar tanto el nombre que tendr la imagen en la KB, como el path donde se encuentra:
Los check boxes tienen que ver con dos funcionalidades que no veremos en el presente curso. Djelas desmarcadas. Seleccione Finish en el wizard y grabe la imagen que ha creado en la KB. Una vez creada la imagen en la KB, podr insertarla en el form que desee, como control Image. Abra la master page asociada a sus pginas (la master page por defecto) AppMasterPage que se encuentra en el folder GeneralWeb. Inserte un control imagen donde le resulte ms conveniente, con la imagen recin creada. Haga F5 para probar la ejecucin. Ver que GeneXus slo necesita generar el objeto AppMasterPage y ya tiene el cambio en funcionamiento.
Pgina 18
Y otra forma es escribir dos parntesis rectos y se abrir una lista de objetos a seleccionar, para incluir link a su seccin de documentacin:
Pgina 19
Para poder visualizar directamente desde el browser un listado, el mismo debe ser generado como 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)
LISTADOS SOLICITADOS:
1.
Listado de clientes cuyos nombres estn incluidos en un rango determinado. Si todava no vio nada de Web Panels deber manejar un rango fijo en el Source (hardcoded). Si ya vio cmo implementar un Web Panel para pedirle datos al usuario, implemntelo e invoque desde el Web Panel al listado solicitado (pase por parmetro al listado, el rango ingresado por el usuario en el Web Panel). Los datos que se desean mostrar en el listado para cada cliente son: Nombre, Direccin y Saldo (CustomerBalance).
Antes de ejecutar dedique unos minutos a estudiar el listado de navegacin. Recuerde que el mismo le brinda la informacin de las tablas que sern navegadas, los filtros que sern aplicados, el orden en que sern devueltos los datos, etc. Es fundamental antes de probar en ejecucin, prestar especial atencin a lo aqu informado. Observe el orden que eligi GeneXus para el For each. Est optimizado este procedimiento? Agregue la clusula order CustomerName en el For each y observe qu cambia en el listado de navegacin. Observe el ndice utilizado en cada caso (si se agrega / saca la clusula order). A qu tablas est accediendo el For each? Ahora agregue el nombre del pas del cliente a la informacin que quiere mostrarse, y observe la repercusin en el listado de navegacin. Debug Active la configuracin Debug para controlar el valor que van tomando los atributos durante la ejecucin del listado: Agregue un breakpoint al comienzo del bloque for each. Agregue el atributo CustomerName en la ventana de visualizacin. Ejecute la aplicacin. Observe el valor que va tomando el atributo CustomerName.
2.
Recuerde detenerse a observar el listado de navegacin resultante de la especificacin de su reporte. Debi incluir un parmetro en el procedimiento para recibir el identificador de la factura que se debe imprimir. Este parmetro lo declar como el atributo InvoiceId, o defini una variable? Qu cambios deber hacer en su reporte si ahora declarara como parmetro la opcin contraria a la que eligi? Qu informacin aparecer listada si desde la transaccin Invoice invoca este reporte con call en las reglas, y condiciona la invocacin con el evento de disparo: On BeforeInsert? Y si condiciona la invocacin con el evento de disparo: On AfterInsert? Estara bien condicionar el disparo con On AfterInsert Level InvoiceDetailQuantity? Y con On AfterLevel Level InvoiceDetailQuantity? Qu diferencia tiene este caso con On AfterComplete?
Pgina 20
3.
Listado de ventas por cliente, incluyendo slo los clientes que tienen facturas (Corte de Control).
Cliente : CliXXX
Id. Factura 1 2
Cliente : CliYYY
Id. Factura 15 11
Observe cuidadosamente el listado de navegacin. Cmo sabe que implement un corte de control? Si adems de querer agrupar las facturas por cliente, totalizando el importe, desea que salgan ordenadas las facturas por nmero, qu deber hacer? Prubelo. En el ejemplo la factura 11 debera salir antes que la 15. Por qu GeneXus informa en el listado de navegacin que el orden ser el mismo para los dos For Eachs, incluso cuando ud. especific un orden para el For Each externo y otro orden para el For Each anidado?
Pgina 21
4.
[Opcional: Doble Corte de control] Listado de ventas por fecha, agrupadas por cliente. Es decir, para cada fecha en la que hay facturas, se desea ver la informacin de las mismas (Identificador e Importe), pero agrupada por cliente.
Fecha: 01/01/08
Fecha: 02/02/08
Este tema no aparece en las diapositivas del curso, pero s en las notas incluidas al final del tema: Corte de Control. Lea cuidadosamente el ejemplo e implemente el listado que se le pide. Cuntos For Eachs son necesarios para implementar un corte de control doble? Dnde se especifica cada criterio de corte?
5.
Listado de pases que tienen asignados ms de 5 clientes. Los datos a listar son Identificador y Nombre del pas.
Recordar que las frmulas pueden definirse tanto a nivel global (a nivel de un atributo en una transaccin) como a nivel local (inline, en medio de cierto cdigo). Observe con cuidado el listado de navegacin. Si la frmula local se encuentra dentro de un For Each, los atributos mencionados de la frmula participan en la determinacin de la tabla base del For Each?
Pgina 22
4. Data Selectors
Agregue a la transaccin Customer el atributo CustomerStatus, que tomar uno de 3 valores: Active, OnHold o Closed. Para ello cree el dominio Status enumerado (es decir, ingrese en la propiedad Enum values del dominio los valores: Active, OnHold o Closed). Deber reorganizarse la tabla CUSTOMER para agregar este atributo. Puede agregar a la transaccin Customer la regla: Default( CustomerStatus, Status.Active); para que los clientes que se inserten mediante la transaccin sean inicializados como activos. Pero, qu valor asumir el atributo CustomerStatus en los registros ya existentes de la tabla CUSTOMER (que se insertaron antes de definir esta regla)? Haga F5 y observe el Warning que le muestra el IAR. Cancele la reorganizacin, vuelva al atributo CustomerStatus de la transaccin, y modifique su propiedad Initial Value:
Esta propiedad permite especificar un valor para un atributo, para que puntualmente al momento de efectuar la reorganizacin que agregue dicho atributo en la tabla, se asigne a los registros que ya estaban almacenados en la tabla, el valor especificado en el atributo creado. Vuelva a hacer F5. Vea que desapareci la advertencia. Observe con el Scroll en el IAR que en la columna Takes value from aparece el valor Status.Active para este atributo a ser creado.
Suponiendo que repetidamente a nivel de la aplicacin se requerir filtrar por clientes activos, tiene sentido centralizar esta definicin, de manera tal de reutilizarla en todos los lugares en que se necesite. Para ello defina el siguiente Data Selector:
Ejemplos de utilizacin de clientes activos: - Modifique el listado de clientes dentro de un rango, para que muestre slo los activos, aprovechando la definicin del Data Selector. - Modifique el ltimo listado (el 5 del prctico) que realiz, de manera tal que slo liste los pases con ms de 5 clientes activos. - Ahora, en lugar de utilizar el Data Selector en una frmula inline, defina un atributo frmula global en la transaccin Country que cuente la cantidad de clientes activos de cada pas. Muestre en el form de la transaccin Country el atributo frmula global definido.
Ventajas del uso de Data Selectors: Si la definicin de lo que es un cliente activo se modifica, alcanzar con modificarla en un slo lugar: en el Data Selector, y todos los objetos, atributos, frmulas que lo utilizan, sern impactadas sin necesidad de tener que ir a buscarlas y modificarlas manualmente.
Pgina 23
5. Actualizaciones no interactivas a la BD
1. Realizar la modificacin de diseo necesaria en la transaccin Product para que cada producto en lugar de tener un solo precio, tenga un histrico de precios segn la fecha. Es decir, la estructura de la transaccin Product quedara: ProductId ProductDescription ProductStock { ProductPriceListDate* ProductPriceListPrice } Product identifier Product description Product Stock Product Date Product Price Id Description Stock Date Price
Como consecuencia del cambio de diseo anterior en la transaccin Product, ya no es posible inferir el atributo ProductPrice en el segundo nivel de la transaccin Invoice (porque ProductPrice ya no pertenece a la tabla extendida de la tabla INVOICEDETAIL).
Pgina 24
Qu forma de actualizacin (Business Component o comando new) eligi y por qu? Recuerde el uso de las frmulas inline. Realice tambin la actualizacin utilizando la opcin contraria a la que eligi. Ejecute 2 veces el procedimiento, con la misma fecha de aumento. Qu suceder? En el caso de actualizacin con BC realice el manejo de errores y observe los mensajes obtenidos al intentar insertar 2 veces con la misma fecha.
3.
Definir la transaccin Bill, para registrar los recibos efectuados a los clientes por concepto de facturas. Su estructura ser:
Bill Id Bill Date Customer Id Customer Name Bill Invoice Period Start Date Bill Invoice Period End Date Bill Amount
Se desea implementar lo siguiente: para un perodo de fechas ingresado por el usuario, se desea que un proceso batch sumarice para cada cliente el importe de todas sus facturas y genere un recibo para dicho cliente, con la fecha del da, el rango de fechas considerado y el importe total a cobrarle. En el material terico de Business Components se presenta un web panel que solicita un rango de fechas al usuario; defina ese mismo web panel e invoque desde el web panel a un procedimiento que reciba por parmetro los datos ingresados por el usuario en el web panel y resuelva lo solicitado. Utilice un Data Provider para cargar los recibos antes de ingresarlos a la base de datos. Y si slo se desea se desea ejecutar esto para los clientes activos?
A efectos de puro aprendizaje, puede modificar su Data Provider cargando manualmente un recibo que usted sepa violar la integridad referencial (cliente inexistente). Tambin puede probar agregar alguna regla msg y alguna error en la transaccin Bill y en el Data Provider cargar recibos que cumplan las condiciones de esas reglas y ver qu pasa al intentar insertar esos registros.
Pgina 25
6. Subtipos
Se desea representar que cada factura pertenece a un pas independientemente de que el cliente la factura tiene su pas Qu modificaciones debe realizar? Implemntelas.
Observar que la factura pertencer a un pas, por ejemplo Uruguay, y el cliente de la factura podr pertenecer a otro pas distinto, por ejemplo United States.
Web panels
Se requiere una consulta interactiva vistosa para cada actor: Customer, Country, Product e Invoice que ofrezca consultar todos los registros, o bien filtrar los registros que cumplan con varias condiciones posibles (a continuacin se indicarn cules), con varios rdenes posibles para la consulta, y poder seleccionar un registro para modificar sus datos, o bien eliminarlo o insertar un registro nuevo. El objetivo es ofrecer consultas vistosas, uniformes, consistentes y bien funcionales.
Consulta interactiva de clientes: Al realizar la consulta se desea visualizar de cada cliente: su su su su identificador nombre direccin status (Active, OnHold, Closed)
Debe ser posible filtrar por: nombre de cliente y/o direccin. Debe ser posible obtener el resultado de la consulta ordenada por: nombre de cliente o direccin. La consulta debe ofrecer paginacin: Observe en el tab Work With del selector Patterns de la transaccin Customer que en la propiedad Page del nodo Selection(Work With Customers) aparece el valor <default>. De dnde se toma ese <default>? Podra fijar un valor e independizarse del default, o modificar lo asignado al default (10).
Recuerde que en la ventana Knwoledge Base Navigator, bajo Preferences, se encuentra el nodo Patters/Work With. Aqu estn configurados los <defaults> a aplicarse en todos las Instancias correspondientes a los Work With de todas las transacciones (Work With Pattern Instance). En particular detngase en las propiedades de los nodos Template, Grid y Standard Actions. Observe que la propiedad Page del nodo Grid tiene como valor un tipo de datos enumerado que se crear automticamente en la KB una vez aplicado el pattern Work With a alguna transaccin.
Se desea poder seleccionar un cliente y modificar sus datos o eliminarlo. Tambin debe ser posible insertar un cliente nuevo. Observe que estos son los modos ofrecidos por defecto (acciones estndar). Puede probar variar cules modos ofrecer (modificando los <default> o directamente desde la instancia de la transaccin).
Observe cmo al grabar la transaccin se generar en el FolderView, bajo la transaccin un nodo WorkWithCustomer que corresponde a la propia definicin de la instancia del Pattern para esa transaccin y subordinados todos los objetos que el Pattern crear para construir el work with.
Pgina 26
Ejecute y pruebe lo realizado hasta el momento. Agregue al grid de seleccin la cantidad de facturas del cliente. Pruebe su solucin.
Observe en ejecucin que el atributo CustomerName es el que tiene el link para visualizacin de los datos de ese cliente, con la posibilidad de actualizar o eliminar el cliente, as como ver sus facturas. Por qu el pattern eligi ese atributo? Observe la instancia del pattern y deduzca la razn.
Modifique los atributos que se visualizan al seguir ese link: elimine de la visualizacin los atributos correspondientes a Total Purchases, Total Payments y Country Id y reordnelos para que salgan en el orden que ud. prefiera. Deshabilite la posibilidad de insertar una nueva factura mediante el Tab (Invoice) y prubelo.
Se requiere adems que la consulta interactiva de clientes, contenga un botn bajo el grid, que llame a otra pgina que muestre lo siguiente: una lista (grid) con todos los pases, siendo posible seleccionar uno y a partir de l que se muestre otra lista (grid) con todas los clientes activos de ese pas, y luego eligiendo uno de estos clientes, que se muestren todas las facturas del cliente elegido.
Defina consultas interactivas de pases, productos y facturas, para sentir lo fcil que es obtener una aplicacin vistosa en segundos.
8. Consultas dinmicas
Queremos consultar por pas y cliente, los totales por concepto de facturas, junto con la cantidad de facturas. Luego, queremos agregar como eje, las fechas de factura y poder pivotear la tabla, de manera de poder ver los totales por pas, cliente y fecha, y luego por pas, fecha y cliente. Luego de probar lo anterior en un objeto Query, integre la consulta a la aplicacin web, creando un web panel que muestre el resultado de la consulta en una pivot table.
9. Workflow
Modelaremos y ejecutaremos un workflow pequeo para ver en la prctica esta funcionalidad. Como paso previo, defina la transaccin PaymentMethod:
Pgina 27
Cuando una vendedora ingrese una venta (a travs de la transaccin Invoice), ingresar el cliente, los productos solicitados, las cantidades, la forma de pago solicitada por el cliente, grabar la venta y ah terminar la primer actividad. Luego esa venta deber ser evaluada por un supervisor (quien evaluar de qu cliente se trata, el monto, la forma de pago), y el supervisor deber aceptar o denegar la venta. Para realizar esta tarea el supervisor ejecutar un web panel de nombre Authorization.
Defina un web panel de nombre Authorization que reciba por parmetro al atributo InvoiceId. Incluya en el form del web panel los atributos con la informacin de la invoice y su customer. Este web panel ofrecer al supervisor 2 botones: Authorize y Refuse.
Este web panel servir al supervisor para tomar la decisin de autorizar o denegar la venta. Si el supervisor presiona Authorize, cargue una variable con valor 1 y si en cambio el supervisor presiona Refuse cargue a la misma variable con 0. Resuelva que el valor asignado a la variable se vea en el diagrama de proceso, para que a continuacin de esta tarea interactiva (web panel Authorization) pueda insertar una condicin que evale si el supervisor autoriz la venta o no.
En caso de haber sido autorizada la venta, que el flujo siga hacia un web panel que diga solamente venta autorizada y tenga un botn para cerrarlo. En caso de haber sido rechazada la venta, que el flujo siga hacia un web panel que diga solamente venta rechazada y tenga un botn para cerrarlo.
Proceda a ejecutar este workflow (si lo desea previamente cree roles y asgnelos a las tareas).
Pgina 28
10. Grabe. 11. Listo. Ahora podr configurar en GeneXus la creacin de la base de datos con el nombre que ud. desee, indicando el Server name que obtuvo del paso 2 y el usuario y clave de los pasos 6 y 7.
Pgina 29