Grids En los objetos Web, se dispone de más de un tipo de grid: el grid estándar y el grid Freestyle. Estos grids, potencian el diseño de aplicaciones Web, permitiendo al desarrollador mayor libertad a la hora del diseño. Además es posible utilizar múltiples grids y también anidarlos para permitir navegaciones más complejas. 76 Control Grid • Permite desplegar, ‐y dependiendo del objeto GeneXus que se trate, también ingresar, modificar y/o eliminar‐ información asociada a muchos registros. • Utilizable en Transacciones, Web Panels • Al hacer botón derecho del control grid, se presenta las opciones: Columnas y Propiedades Control Grid Este control permite desplegar, -y dependiendo del objeto GeneXus que se trate, también ingresar, modificar y/o eliminar- información asociada a muchos registros. Puede utilizarse en los objetos con interfaz, es decir Transacciones, Web Panels y permite incluir tanto atributos como variables (incluyendo las de tipo bitmap). Cuando el control Grid se utiliza en una Transacción, por medio del mismo será posible insertar, modificar y/o eliminar registros, en la tabla asociada que corresponda. Cuando en cambio, el control Grid se utiliza en un Web Panel, el mismo permitirá visualizar únicamente los datos almacenados en tablas. El botón que se encuentra en la barra de controles, permite insertar el control Grid. Al hacer botón derecho del control Grid, se abre un diálogo con las siguientes opciones: Columnas y Propiedades. http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6079 77 Control Grid - Columnas Columns Permite indicar las columnas que componen el grid. Botones Add y Delete: Permiten agregar y eliminar columnas al grid respectivamente (tanto atributos como variables). Botones Move Up y Move Down: Permiten cambiar el orden de las columnas. Botón Properties: Permite asignar propiedades específicas a la columna seleccionada. 78 Propiedades del Grid • Propiedades de las Columnas Propiedades de las columnas del grid También es posible indicar propiedades particulares para las diferentes columnas que forman el grid. Para esto, se debe seleccionar la opción Columns del menú que aparece al hacer clic en el grid. En este diálogo, seleccionando Properties sobre una columna se permite configurar las siguientes propiedades: · ControlName · Class La propiedad Class solo se encuentra disponible si el control está en el form de un objeto que tiene un Tema asociado. · ControlType · InputType · Suggest · ReadOnly · EnableHistory · EmptyAsNull · IsPassword · Autoresize · Font · ForeColor · Title · TitleFont · TitleForeColor · Format · Visible · Tooltiptext · ReturnOnClick 79 Web Panels Tipos de grid • Grid estándar: Datos repetitivos en formato fijo (filas y columnas) • Grid Free Style: Datos repetitivos en formato libre. Se dispone de dos tipos de grids: • Grid estándar: la que vimos hasta ahora, en Transacciones y Web Panels • Grid Free Style Los freestyle grids, agregan potencia al diseño de aplicaciones Web, permitiendo al desarrollador mayor libertad a la hora del diseño. 80 Web Panels Grid Free Style • Permite “formato libre” de los registros • Tabla con registros repetitivos • No posee títulos para las columnas • Permite tener más de un tipo de control en una misma celda El grid Free Style permite al usuario definir el formato de los datos a desplegar de una forma menos estructurada que el grid estándar. El grid Freestyle es básicamente una tabla a la que se le pueden insertar los atributos/variables, text blocks, imágenes, botones, web components, embedded pages, grids freestyle y/o grids que se van a mostrar posteriormente en la pantalla. En este caso para poder visualizar las propiedades hay que seleccionar la tabla donde se encuentran los atributos/variables. En el ejemplo presentado arriba queremos mostrar alguna información de los clientes. El atributo CountryFlag se ha incluido en la Transacción “Country” para almacenar la foto de la bandera de cada país (es un atributo de tipo Blob). Pero no queremos mostrar la información como lo haríamos en un grid estándar, con cada elemento de información en una columna distinta del grid. Aquí queremos mostrar la foto y debajo el identificador y nombre del país. En el comportamiento de las variables dentro de un grid Free Style quedan de ingreso si existe un For each line o For each line in <grid> dentro de algún evento, o si se asocia un evento a cualquier control de la fila. Este comportamiento puede modificarse, agregando la regla noaccept o cambiando la propiedad Read Only. Lo cual veremos más adelante. http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6058 81 Funcionalidades de los grids 82 Principales funcionalidades de los grids • En GeneXus X, los grids en Web Panels cuentan con las siguientes principales funcionalidades: • Refresh automático • Ordenamiento automático de las columnas • Paginado automático 83 Grids Refresh automático Un Grid con tabla base puede cargarse en forma automática una vez que los filtros relacionados son ejecutados, dependiendo del valor de la propiedad Automatic Refresh. Valores posibles: • When variables in conditions change (Default value) • No Ver información más completa de este tema en nuestro Wiki: http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6744 84 Grids Refresh automático When variables in conditions change: el grid carga automáticamente sin necesidad de hacer clic. Ejemplo: Grid de productos Dependiendo del tipo de datos del filtro, y del control Web utilizado para filtrar, la condición será aplicada cuando se está ingresando o al abandonar el campo. En el caso de filtros en controles edit, para tipo de datos Character, son aplicados cuando el usuario los va digitando. Para tipo de datos Date, DateTime y Numeric, las condiciones se evalúan cuando se abandona el campo. En el caso de filtros combo boxes, dynamic combos, las condiciones son evaluadas cuando se abandona el campo. Para Check boxes y Radio buttons, las condiciones son evaluadas cuando el valor es cambiado. El refresh automático se logra con Ajax, minimizando el tránsito entre el browser y el servidor, viajando solamente la condición de filtro. 85 Grids Refresh provocado por el usuario Si la propiedad Automatic Refresh está en NO, para que el contenido del grid se refresque luego de cambiar los filtros, el usuario debe realizar una acción. • Presionar la tecla Enter (si el grid tiene tabla base) • Hacer clic en un botón o en una imagen asociados al evento Refresh, o asociado a un evento de usuario que invoque a un Refresh en forma explícita o implícita (un evento que ejecuta en el server, ejecuta un refresh implícito) Si el grid es con tabla base: •Los cambios en las variables de los filtros se detectan automáticamente. •Al presionar la tecla Enter, se dispara el Refresh de la página (no el código del evento Enter, aunque esté programado). •Al hacer clic en un botón o en una imagen asociados a un evento de usuario, inmediatamente después de cambiar el valor de una variable de las conditions del grid, se ejecuta este evento e inmediatamente a continuación el Refresh de la página. Si el evento fuera el Enter, este evento NO se ejecuta. Si el grid es sin tabla base: •Los cambios en las variables de los filtros NO se detectan automáticamente •El usuario debe hacer clic en un botón o en una imagen asociados a un evento Refresh o a un evento de usuario que invoque a un Refresh. 86 Grids Refresh provocado por el usuario Ejemplo: Grid sin tabla base 87 Grids Ordenamiento automático de las columnas • hacer clic sobre el título de la columna: Esta funcionalidad es válida para grids en Transacciones y en Web Panels. Se ordena la página del grid cargada, por lo que no compite con el Order programado a nivel del grid. 88 Grids Paginado automático GeneXus realiza un paginado automático si la propiedad Rows del grid tiene un valor distinto de cero. Inserta automáticamente los botones de paginado Cuáles botones son insertados depende de la cantidad de registros a mostrar y la cantidad de líneas del grid. Ejemplo: Si se está en la primera página se muestran sólo los botones > y >> http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6744 89 Grids Conditions a nivel del Grid Ejemplo: Mostrar los clientes que cumplen condiciones: Obsérvese cómo en la ventana de propiedades del control Grid, aparece una de nombre ‘Conditions’. Presionando en la flecha del combo se abrirá un editor para especificar las condiciones booleanas que deberán cumplir los registros para ser cargados como líneas del grid. Es por esa razón que se han agregado las variables &CustomerName y &CountryName al form del web panel, de manera tal que el usuario pueda ingresar allí valores que operen como filtros sobre los datos a mostrar. En nuestro caso, hemos establecido filtros con el operador like. Obsérvese que las condiciones (separadas con “;”) equivalen a las que aparecían en las cláusulas where de un for each (o grupo repetitivo de data provider). De la misma manera, por cuestiones de optimización, puede determinarse, al igual que se hacía en un for each, criterio de ordenamiento de la tabla a recorrerse, como se muestra arriba en el ejemplo. Nota: Asimismo, igual que en un procedimiento, no sólo pueden establecerse condiciones locales al grid (for each), sino también generales, mediante el selector Conditions. Esto tendrá sentido cuando se tenga más de un grid (for each), para no tener que repetir la misma condición cada vez. 90 Grids en Web Panels • Por defecto todas las variables de un grid son Read-Only • For each line [in grid] o cualquier evento sobre las líneas o columnas modifica el valor por defecto y todas las variables del grid pasan a ser de entrada. Para que algunas sean de salida: Propiedad: Read Only Cómo trabajar con grids en Web Panels? A continuación se detalla la forma de trabajo con grids en Web Panels. ¿Cómo desplegar datos? Por defecto toda variable que está dentro de un grid se despliega en ejecución como texto, es decir que son únicamente de lectura y por consiguiente no pueden ser modificadas. Los atributos siempre aparecen como read only en los grids de los web panels. ¿Cómo aceptar datos? Es posible aceptar datos en las variables de un grid dependiendo de la programación de los eventos existentes en el objeto. Si: 1. dentro de un evento del Web Panel se está utilizando el comando For each line o For each line in <grid>, ó 2. existe algún control en el grid con un evento clic asociado, entonces todas las variables que están dentro del grid pasan a ser de ingreso. Es posible indicar en este caso cuáles son las variables que no van a poder ser modificadas utilizando la regla noaccept() o modificando la propiedad Read Only de la variable dentro del grid. 91 Grids en Web Panels • ¿Cómo asociar eventos a una línea? • Grid Estándar: cualquier variable character readonly, o una variable bitmap que esté asociada a un evento. • Grid Free Style: cualquier control dentro del grid que tenga algún evento asociado. • ¿Cómo Seleccionar líneas? • Selección individual: Propiedad Allowselection con el valor “True” Selección múltiple: variable checkbox en las líneas, y utilizar un For each line. ¿Cómo asociar eventos a una línea? Es posible asociar un evento a cualquier variable o atributo que pertenezca al grid. Se consigue de dos maneras distintas: 1. Editando las propiedades del control, y definiendo un evento de usuario en la propiedad OnClicEvent 2. En la sección de Eventos programando: Event nombreControl.click … Endevent Con esta última alternativa no tendremos que definir un evento de usuario, sino que estaremos programando el evento click. ¿Cómo seleccionar líneas? Para ello, se accede a las propiedades del grid haciendo clic en el botón derecho sobre el control grid y se configura la propiedad AllowSelection con el valor ‘True’. Al hacerlo se habilitan tres propiedades más, que permiten especificar SelectionColor: el color que tendrá la línea cuando el usuario la seleccione (haciendo clic con el mouse sobre la misma); AllowHovering: la posibilidad de que cambie el color de las líneas cuando el usuario se desplaza con el mouse sobre ellas, y HoveringColor: el color que tendrá una línea cuando el mouse pasa sobre ella. http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6093 92 Grids en Web Panels ¿Cómo implementar un Trabajar con? • Procesamiento de las líneas del grid por selección simple: imagen, combo box, allow selection, allow hovering… Acciones sobre el País seleccionado 93 Grids en Web Panels ¿Cómo implementar un Trabajar con? • Procesamiento de las líneas del grid por selección múltiple: check box, con For each line... 94 Web Panels Paginado de Grids • Se dispone de métodos asociados al control Grid, los que aplican cuando la propiedad ‘Rows’ del grid tiene un valor diferente de cero. • Aplica a grids estándar, free style y también cuando los grids están anidados. Tanto por temas de usabilidad, de performance o de tamaño de la página HTML generada, puede ser conveniente desplegar los resultados en un grid de tamaño fijo y permitir con botones de movimiento la navegación entre las páginas de los mismos. Nos referimos a esto como paginación del grid. 95 Web Panels Paginado de Grids • Métodos: • • • • • FirstPage NextPage PreviousPage Lastpage GoToPage Solamente aplica si es Con Tabla Base • Propiedades: • RecordCount • PageCount Ejemplo: Event ‘FirstPage’ MyGrid.FirstPage() Endevent Event Following.Click &err = MyGrid.NextPage() if &err = 2 Message.Caption = ‘You already are in the last page’ endif Endevent Event Back.click &err = MyGrid.PreviousPage() if &err = 2 Message.Caption = ‘You already are in the first page’ endif Endevent Event Last.click MyGrid.LastPage() Endevent Por detalles del uso de dichos métodos, consultar: http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6064 96 Grids en Web Panels Múltiples grids – Grids paralelos GeneXus determina una tabla base asociada a cada grid. GeneXus no busca ni establece relaciones entre ellas. Cuando un Web Panel contiene más de un grid en su form, GeneXus no determina una única tabla base asociada al Web Panel, sino una tabla base asociada a cada grid. Atributos que participan en la determinación de la tabla base de cada grid: • Los incluidos en el grid (se tienen en cuenta tanto los atributos visibles como los no visibles) • Los referenciados en Order y Conditions locales al grid Los atributos de la parte fija del Web Panel no participan en la determinación de la tabla base de ninguno de ellos, pero deberán pertenecer a la tabla extendida de alguno (para que sea posible inferir sus valores). De no respetarse esto, al especificar al Web Panel, se mostrará en el listado de navegación resultante, un warning advirtiendo de esta situación. Los atributos utilizados en los eventos del Web Panel tampoco participan en la determinación de la tabla base de ninguno de los grids. Los atributos que se incluyan en los eventos fuera de comandos for each, deberán pertenecer a la tabla extendida de alguno de los grids (al igual que los de la parte fija). 97 Ejemplo: Dado que el Web Panel “View Customers And Suppliers” tiene más de un grid en su form, GeneXus no determinará una tabla base asociada al Web Panel, sino que determinará una tabla base para cada grid. En este ejemplo, no hay definidos ni Order ni Conditions para ninguno de los grids, por lo tanto GeneXus sólo tendrá en cuenta los atributos incluidos en cada grid para determinar sus tablas bases. La tabla base del grid que se encuentra arriba en el form será: CUSTOMER y la tabla base del grid que se encuentra abajo en el form será: SUPPLIER. Es importante resaltar que GeneXus determina la tabla base de cada grid pero no busca ni establece relaciones entre las mismas. Si bien GeneXus no establece relaciones entre las tablas bases de los grids, el analista podrá definirlas explícitamente. Primero estudiaremos los eventos en Web Panels con más de un grid, y a continuación veremos cómo definir cargas relacionadas. Consideraciones acerca de los grids paralelos: Acerca de condiciones de filtro • Es posible especificar condiciones de filtro tanto a nivel global como a nivel de cada grid. • Para cada grid se tendrán en cuenta las condiciones globales y las condiciones locales (es decir: condiciones globales and condiciones locales). • Las globales nunca participan de la determinación de la tabla base No es posible nombrar a un atributo o variable de un grid Ejemplo: GrdCountries.CountryId / GrdCustomers.CountryId Sí es posible referirse a CountryId, codificar sus propiedades, eventos y métodos Igualmente no se recomienda tener el mismo atributo / variable en más de un grid, ya que las codificaciones afectarían a todos. 98 Web Panels Grids paralelos – Eventos y carga • • • • • Un Refresh global No se relacionan las cargas Refresh independiente de grids. Evento Load de cada grid Secuencia de Carga: Refresh <Grid Control <Grid <Grid <Grid <Grid Control <Grid <Grid <Grid Name1>.Refresh Control Name1>.Load Control Name1>.Load Control Name1>.Load Name2>.Refresh Control Name2>.Load Control Name2>.Load Control Name2>.Load N veces si GridControlName1 Tiene tabla base. Sino 1. N veces si GridControlName2 Tiene tabla base. Sino 1. En Web Panels con más de un grid, existe un evento Refresh global y un evento Refresh particular para cada grid. El evento Load, no existe global sino sólo a nivel de cada grid. Los eventos Refresh y Load a nivel de grids, deben referenciar al grid usando la siguiente nomenclatura: Event <Grid Control Name>.<Refresh | Load> .... EndEvent Por ejemplo, si en el Web Panel “View Suppliers And Customers”, los nombres de los grids son SuppliersGrd y CustomersGrd respectivamente, para codificar los eventos Refresh y Load a nivel de los grids, la sintaxis deberá ser: Event SuppliersGrd.Refresh .... EndEvent Event SuppliersGrd.Load .... EndEvent Event CustomersGrd.Refresh .... EndEvent Event CustomersGrd.Load .... EndEvent 99 Además de estos eventos a nivel de los grids, estará el evento Refresh global: Event Refresh .... EndEvent La carga de los grids en un Web Panel se realiza para cada grid de forma independiente. Es decir, aún si los datos que se muestran en ambos grids están relacionados, el especificador no relaciona las cargas. La carga asociada a los grids de un Web Panel incluye el evento Refresh, o sea que la secuencia de carga de un objeto con 2 grids es como se muestra arriba. La ejecución del método Refresh de cualquier grid solo se dispara par refrescar dicho grid. El orden en que se cargan los grids es como aparecen en el form: de arriba hacia abajo y de izquierda a derecha. De esa manera, cada uno de los grids se cargará con los datos correspondientes. 100 Web Panels Grids paralelos – Comandos • Load: La sintaxis sigue siendo Load, pero debe estar incluido dentro del evento load asociado al grid que se está queriendo cargar. Su uso es análogo al caso de un grid (sin tabla base). • Event Grid1.Load .... Load Endevent • For each line: Debe incluir una referencia al grid de la siguiente forma: • For each line IN <Grid Control Name> 101 Web Panels Múltiples grids – Cargas relacionadas Propiedad AllowSelection = True Condiciones Event Enter &CountryId = CountryId EndEvent // Enter Ejemplo: Web Panel que muestre en un grid todos los países (GrdCountries), y cada vez que el usuario seleccione un país, que se carguen sus clientes en un segundo grid (GrdCustomers). 102 Grids anidados Consisten en: un grid Free Style al que se le inserta dentro de una celda otro grid. • Cada grid puede ser Free Style o estándar, pero si es estándar no puede tener ninguno anidado. • Pueden anidarse grids en varios niveles. Determinación de Tabla base • Los grids anidados cumplen con las mismas reglas de relacionamiento que For Eachs anidados, GeneXus determina la tabla base de cada grid. Disparo de Eventos • Cada grid mantiene sus eventos load y refresh particulares • Cada vez que se ejecuta el comando Load en un grid con anidaciones, se llama al evento Refresh y Load de cada hijo. Grids anidados Los grids anidados consisten en un grid Free Style al que se puede insertar dentro de una celda otro grid. Cada grid puede ser un Free Style o un grid estándar, aunque si es estándar no puede tener ninguno anidado. Puede haber grids anidados de varios niveles y puede haber también paralelos. Puede decirse que se está definiendo un árbol en donde cada nodo es un grid. Los grids comunes solo pueden ser hojas del árbol de anidación. Por ejemplo, se quiere tener un Web Panel que muestre los poveedores de servicios, pero indentados por categoría: Hoteles Hotel Colonia Hotel Oceanía Transport Alfa Travel OtherWorld Travel ... Para ello se define un grid Free Style con la categoría y dentro de este se inserta otro grid con los poveedores de servicios (podría ser un grid estándar o Free Style). 103 Determinación de tablas bases Los grids anidados cumplen las mismas reglas de relacionamiento que si fueran For Eachs anidados. Por lo tanto, GeneXus determina la tabla base de cada grid (no son por completo independientes: en la determinación de la tabla base del anidado influirá la del principal). Luego, a partir de esas determinaciones, define las navegaciones que realizará para cada grid. La lógica de los grids dependerá de las relaciones que encuentre entre las tablas determinadas. Si no tiene tabla base, se deben cargar los datos con el comando Load. Disparo de Eventos Cada grid mantiene sus eventos load y refresh particulares. Cada vez que se ejecuta el comando Load en un grid con anidaciones, se llama al evento Refresh y load de cada hijo. http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?6062 104 Web Panels Grid Free Style Ejemplo: Grids anidados. Desplegar todos los países con sus respectivos clientes, y cantidad de clientes. Trn Country { Grid1: Free Style. CountryId* CountryName Grid2: estándar CountryFlag } Trn Customer Tabla base Grid1: COUNTRY { CustomerId* CustomerName Tabla base Grid2: CUSTOMER CustomerAddress CountryId CountryName } 105 Web Panels Grid Free Style (Ejemplo: Continuación) Propiedades Grid Free Style 106