PuntoExe Tools Manual de Uso – Volumen 7 Migraciones Win a Web INTRODUCCIÓN Este Volumen 7 del Manual de Uso de las PXTools es la transcripción del séptimo de los siete videos que contienen la versión ampliada del Curso de Entrenamiento dictado por el Ing. Juan Marcelo Bustamante (autor de las PXTools) a un grupo de nuevos usuarios de esta herramienta, a fines de 2007. Todas las referencias internas para la ubicación de sus contenidos temáticos o imágenes remiten al momento en que fueron abordados o mostrados en la grabación original, de modo de poder ampliar en ella cualquier asunto que pueda haber perdido claridad en la transcripción. Los títulos de cada tema hacen referencia expresa al video y momento de la reproducción en el formato: V Nº | HH:MM:SS (HoraHora:MinutoMinuto:SegundoSegundo) de modo que el índice de cada volumen permite ubicar los temas en el propio documento o en el correspondiente video indistintamente. Las imágenes se identifican con una combinación de video y momento de la reproducción en el formato: VH:MM:SS (VideoHora:MinutoMinuto:SegundoSegundo) para que puedan ser referenciadas en cualquiera de los volúmenes del manual. Con el fin de minimizar el peso de estos documentos en su versión digital, todas las imágenes contenidas tienen baja resolución, por lo que se recomienda regular el nivel de Zoom del visualizador antes de proceder a su lectura. Página 1 de 44 INDICE TEMA Gestión de Proyectos - Categorización WorkWith Sencillos WorkWith Complejos Transacciones Sencillas Transacciones Complejas Objetos de Consulta Parameter Request Reportes o Procedimientos a PDF sencillos Reportes o Procedimientos a PDF complejos Procedimientos con llamadas a Interfaz gráfica Prompts Pantallas Composer Gestión de Proyectos - Temas a considerar Preparación de ambiente de trabajo Carga de datos para Testeo Diseño gráfico Montaje del Diseño gráfico Cierre de versión y entrega de Kb Testing Gestión de Proyectos - Administración Kbs Metodología AdminG Gestión de Proyectos – Roles del Proyecto Programadores Gerente de Proyecto Encargado de Cuenta Gestión de Proyectos - Método de Testeo Cuello de Botella en Consolidación Implementación alternativa Actualización de Kbs por cada Versión Gestión de Proyectos - SAC/ Work Arounds Evaluación de SACs reportados Prompts ToolTipText Inserción de Datos Agregar Tabla y Clave Foránea asociada Campos editables en Grids Página 2 de 44 UBICACIÓN Pg. V 7 00:00:00 4 V 7 00:01:27 4 V 7 00:03:15 5 V 7 00:05:30 6 V 7 00:05:45 6 V 7 00:09:18 7 V 7 00:11:05 7 V 7 00:11:57 7 V 7 00:12:48 8 V 7 00:15:24 8 9 V 7 00:16:29 9 V 7 00:21:12 10 V 7 00:21:30 10 V 7 00:23:39 11 V 7 00:24:13 11 V 7 00:24:43 11 V 7 00:25:06 11 V 7 00:25:35 12 V 7 00:27:35 15 V 7 00:27:49 15 V 7 00:28:34 15 V 7 00:32:50 17 V 7 00:33:09 17 V 7 00:33:09 17 V 7 00:41:06 18 V 7 00:42:15 19 V 7 00:42:55 19 V 7 00:44:38 19 V 7 00:58:08 24 V 7 01:03:11 25 V 7 01:12:00 25 V 7 01:14:15 25 V 7 01:17:55 27 V 7 01:19:17 28 V 7 01:20:40 28 V 7 01:21:52 30 Parámetros char y Reglas que se disparan con Ajax Asignar Texto a un TextBlock mediante proc. Ajax View Composer Level1 ANEXOS ANEXO 1 – Categorización de Objetos ANEXO 2 – Guía de diseño Página 3 de 44 V7 V7 V7 V7 V7 01:23:54 01:24:38 01:25:28 01:28:04 01:29:34 31 31 32 32 33 34 34 36 Gestión de Proyectos - Categorización V7 00:00:00 El objeto de este capítulo es comentarles a ustedes la experiencia que hemos tenido nosotros en Gestión de Proyectos y plantearles cuales son los asuntos que hay que tomar en cuenta para el desarrollo de un Proyecto en el que intervengan muchos programadores. Vamos entonces a tratar de mostrar los distintos procesos que se deben cumplir desde la fase de arranque hasta la fase final de entrega del producto. Lo primero importante cuando arrancamos un Proyecto es hacer un estimativo de los tiempos que vamos a requerir para llevarlo a cabo. Sea un Proyecto de migración o de desarrollo de un nuevo sistema va a ser necesario analizar a fondo las tareas que lo componen para tener una idea de la duración del mismo. Para esto es importante saber cuál es la complejidad de la KB a migrar o desarrollar y para ello es necesario categorizar los Objetos que la componen en función de ciertas características que permitan adelantar las dificultades y facilidades que se van a encontrar en el proceso. Después veremos que cada categoría está básicamente previendo un tiempo de desarrollo. Lo que vamos a ver ahora es cuál es el criterio que seguimos para particionar la KB a migrar o desarrollar, a efectos de su evaluación. Contamos con un documento que agregamos como ANEXO 1 a este manual, que contiene la información acerca de la “Categorización de Objetos” y vamos a explicar ahora cada una de las categorías que la integran. WorkWith Sencillos V7 00:01:27 La primera categoría comprende aquellos Objetos que por su estructura constituyen los típicos “WorkWith” de GeneXus. Esta clasificación no es excluyente, puede ser que una KB tenga su lógica particular y haya que hacer una apertura mayor para determinados Objetos, pero en este primer grupo incluimos los que llamamos “WorkWith Sencillos”, que se definen en el documento de la siguiente manera: “En general el desarrollo de una instancia de Pattern consta de la generación de un Work With y una Transacción en conjunto. En tal caso la estimación de tiempos de desarrollo de este tipo de objetos se realiza en conjunto. A los efectos de la estimación en forma separada se realizará una simple partición de los tiempos a la mitad.” Por lo general, lo que nosotros programamos cuando desarrollamos una Instancia son dos Objetos: El WorkWith y la Transacción. Más allá de esto cuando categorizamos los Objetos tratamos de separarlos, porque nos pueden surgir determinados problemas sobre cada uno individualmente, sin perjuicio de que el programador, en la Instancia, va a trabajar sobre la Transacción y el WorkWith (eventualmente más de uno aunque esto no sea lo habitual) a la vez. Lo que caracteriza a los WorkWith Sencillos es que se trata de simples tuplas de una Tabla, donde se muestran columnas, donde existe una Tabla Base y no hay mayores inconvenientes. Página 4 de 44 WorkWith Complejos V7 00:03:15 Cuando hablamos de WorkWith Complejos, acá lo que estamos tratando de definir es alguna complejidad adicional. Por ejemplo, ya no hay una Tabla Base, está recorriendo Tablas Extendidas, o ya se empieza a definir un Event Load y hay algún tema puntual que resolver que lo transforma en un WorkWith Complejo, aunque por lo general los WorkWith no lo sean. En el sistema GCI (Gestión contable Integral) al que nos hemos referido en varias oportunidades anteriormente, cuando tuvimos que implementar el “Trabajar con Transacciones del Presupuestal” ya teníamos el tema del “Insert Variables”: que implicaba agregar lógica al “WorkWith” original porque desde este Work Panel se pasaba a un Selector de tipo de Transacción y ahora tenemos que saber que esto debe ir unificado con el WorkWith para tratar de minimizar la cantidad de pantallas. En Win cuando se ponía Insert se pasaba a una pantallita que pedía seleccionar el tipo de Transacción deseada en una Grilla y después se pasaba a la Transacción correspondiente en modo Insert. Toda esta lógica hubo que pasarla a este WokWith que se transformó en algo más complejo. También en este caso teníamos muchas acciones que dependían de ciertas condiciones y había que desaparecerlas de su columna, como vemos en la figura anterior. Todo esto hace que ya no se trate de un WorkWith de Tabla Base sino de una Tabla más compleja, tiene mucha manipulación, manejo de Múltiples Órdenes, en fin, este tipo de WorkWith corresponde a la categoría de Complejos. Página 5 de 44 También debemos mencionar el caso en que tenemos manipulación de variables editables en la Grilla. Es otro caso a tomar en cuenta aunque tengamos soluciones al respecto, como el ForceGridLoad que vimos en V 2 | 01:34:54 para solucionar la recuperación de datos de las variables editables del Trabajar Con. No obstante sabemos que si tenemos Trabajar Con para el manejo, por ejemplo de Cancelación de Documentos que vimos en esa misma oportunidad, tales Objetos deberían estar categorizados como complejos. Transacciones Sencillas V7 00:05:30 Lo mismo hicimos con las Transacciones, donde también hay que categorizarlas en Sencillas y Complejas. Cuando estamos hablando de Transacciones Sencillas, básicamente nos referimos a todas aquellas que no son Complejas, dado que éstas últimas son más fáciles de identificar. Transacciones Complejas V7 00:05:45 Transacciones Complejas son, por ejemplo, aquellas que tengan más de 20 Reglas. Este límite lo hemos puesto por experiencia: Cuando trabajamos con Transacciones con muchas Reglas, al migrarlas a Web podemos empezar a tener problemas derivados de la combinación de ellas. Cuando empiezan a coexistir muchas Reglas aparecen problemas, todos solucionables, sólo que como sabemos, en el ambiente transaccional y aún más en Web, tenemos que acomodarnos a lo que GeneXus nos da, que a veces no coincide con lo que necesitamos para evitarlos. Reglas que funcionan bien en Win, en Web no funcionan y tenemos que buscar alguna alternativa para poder mantenerlas y eso nos lleva tiempo. Tiempo para empezar a probar soluciones, sobre todo si no tenemos experiencia en migraciones Win a Web y tenemos que empezar a darnos cuenta de cómo funciona la lógica y cuál es el inconveniente. Otra particularidad que hace a la Transacción Compleja es que tenga muchas Reglas After Attribute. Si hay mucha interactividad con este tipo de Reglas es factible que podamos tener algún problemita con la Transacción, especialmente cuando las dependencias de After Attribute se interrelacionan éste es un buen motivo para categorizarla como Compleja Por último también deben considerarse Complejas aquellas Transacciones que en la lógica del proceso terminan llamando a otras Transacciones. Y más cuando antes las contemplábamos como UTLs y ahora sabemos que ya no pueden ser más UTLs, de modo que probablemente la lógica tenga que cambiar. Debemos categorizarlas como Complejas porque probablemente en esos casos tengamos que hacer modificaciones. Recordemos que en Web la UTL no se puede trasladar entre distintos Objetos. No podemos poner en una Transacción el “Commit” en no, pues si lo hacemos, cuando pasamos al otro Objeto se hace el Rollback automático. No existe la lógica que sí existe en Win de usar una única UTL entre distintos Objetos GeneXus. Más allá de este tema de la UTL también está el tema de si en el After Trn estamos invocando a una o más interfaces gráficas porque aquí entramos en lo que vimos en V 2 | 01:45:20 acerca del Controller para el caso de que sea Página 6 de 44 una sola invocación a interfaz gráfica, o al efecto de Controller que hicimos con un procedimiento, la lógica procedural para simular las “n” llamadas para ver de donde se retorna que vimos en V 4 | 01:11:27, pues si tenemos en el After Trn más de una invocación a interfaz gráfica, ese After Trn lo tenemos que pasar a un procedimiento de este tipo que se maneje como Controller. Y, otra vez, eso nos va a llevar tiempo, adaptar toda esa lógica y programar el Controller, de modo que también en estos casos debería categorizarse la Transacción como Compleja. Objetos de Consulta V7 00:09:18 Después tenemos los Objetos de Consultas que son aquellos Trabajar Con que se usan para visualizar datos. No tienen por objetivo el mantenimiento de la Tabla a través del Insert, Update y Delete sino el de mostrar datos como resultado de una consulta. En estos casos se arma una estructura de navegación entre las Tablas para recorrer visualmente. Por lo general estos tipos de Objetos de Consulta tienen un Event Load bastante complejos, ya no es recorrer una Tablita sino que hay que incorporarle a las columnas de la Grillas elementos complejos que resultan de analizar otras Tablas y extraer nuevos datos, en fin, las consultas pueden tener lógicas complicadas. Para diferenciar si pasa a la categoría de Consultas complejas o sencillas utilizaremos los mismos criterios que la categorización vistos en los WorkWith. Parameter Request V7 00:11:05 En esta Categoría debemos incluir todos aquellos Objetos que van a ser resueltos mediante el Pattern ParameterRequest. En el documento mencionado nos referimos a ellos del siguiente modo: “Este patrón presenta una variante con respecto al Work With. Así por ejemplo, este patrón toma como Objeto referencia un Reporte o Procedimiento en vez de una Transacción. Para la estimación de Tiempo asumimos que las funcionalidades requeridas para la generación automática de la instancia están implementadas en el Pattern. Si así no fuera, siempre es posible reprogramar el Pattern para incorporarlas.” Se trata de aquellos Web Panels a través de los cuales pedimos datos tabulares en pantalla e invocamos o retornamos a Objetos GeneXus o simplemente para mostrar datos en forma tabular. En la gran mayoría de los casos son pantallas que no manejan grillas aunque el Pattern soporte grilla para casos muy especiales. Las variantes para diferenciar Parameter Request sencillos o complejos suelen presentarse en función de la cantidad de datos que se piden en pantalla o si la lógica de validación de los datos ingresados complica la programación. Reportes o Procedimientos a PDF sencillos V7 00:11:57 Esta es una Categoría muy básica. Cuando tenemos este tipo de Objetos para migrar, hay que declarar que el Reporte es “Main” para poder Página 7 de 44 compilarlo y que el Call Protocol es HTTP para poder declararlo y además hay que crear la Regla Output para que diga PDF. Estas son las tres cosas que hay que hacer para un Reporte, no tiene mayor ciencia, es más, la estimación es muy pequeña en tiempo al extremo que se estima por cada diez Objetos a migrar, pero de todas maneras hay que modificarlos y por lo tanto deben ser tomados en cuenta. Reportes o Procedimientos a PDF complejos V7 00:12:48 Específicamente se aplica a aquellos Reportes o Procedimientos que tengan salida a interfaz gráfica, no a procedimientos que sean internos. Acá estamos contemplando específicamente Reportes o Procedimientos que reciban Arrays por parámetro. En Win le pasábamos un Array, el Reporte lo recibía, después recorría una Tabla Base y al Array lo tomaba en cuenta en algún momento. El problema es que los Arrays por parámetro no se pueden pasar en la URL. Como el Reporte lo tenemos que declarar como “Main”, Call Protocol HTTP, cuando se invoca al Reporte, se invoca en la URL del Navegador, donde se pasan los parámetros del Reporte y no es posible representar Arrays como un parámetro de la URL. Esto nos obliga a utilizar mecanismos alternativos, que en este caso consiste en definir una estructura de SDT que represente los valores del Array o de los Arrays. Puede tratarse de un conjunto de Arrays que representen un Estructurado, nos ha pasado de tener que trabajar con tres o cuatro Arrays pero donde los índices de los Arrays son comunes a todos ellos. Entonces el Parameter Request que es el que normalmente debe cargar los Arrays o de alguna manera instanciarlos, después de hacerlo se deben recorrer esos Arrays y cargar el SDT, luego grabar el SDT en la Web Session, por ejemplo, con las rutinas de AcSUV que mostramos en V 4 | 00:08:18. Después en el Reporte hacer lo inverso, quitar el Array del parámetro, recibir el SDT de la Web Session, recorrer el SDT e instanciar los Arrays. Esto es lo que normalmente hacemos, no tocamos el Reporte, sólo actuamos sobre el punto de contacto, tanto en la invocación como en la recepción para instanciar los Arrays y mantener la lógica que se estaba manejando. Pero esto lleva un poco de tiempo, hay que armar los SDT, hay que ver la lógica, hay que ver en qué momento invocarlo, pasar la sesión, entonces obviamente es un tiempo bastante mayor que para la categoría anterior. Procedimientos con llamadas a Interfaz gráfica V7 00:15:24 Este caso es un poco parecido al que vimos en el último punto de las Transacciones Complejas, cuando encontramos lógicas de procedimientos que terminan llamando a interfaces gráficas y por este solo hecho constituyen casos que se deben categorizar por separado. Se trata de implementar una de las lógicas más complicadas que se pueden presentar en proyectos de migración, porque si bien proveemos herramientas para ayudar, la lógica para implementar la solución real del controlador tiene que ser elaborada en cada caso particular. Página 8 de 44 Muchas veces no sólo se trata de migrar un procedimiento a un Controller tipo Web Panel sino ver si estamos en el lugar adecuado para llamar al Web Panel en función del momento en que se estaba invocando a este procedimiento, lo que genera bastante demora en el proceso de migración. Prompts Después tenemos los Prompts. Por lo general estos tipos de Objetos no resultan en lógica de programación compleja ya que se limitan a recorrer las Tablas Bases del sistema y por lo tanto son categorizados como sencillos. De todas maneras hay excepciones y para diferenciar si pasa a la categoría de Prompts complejos utilizaremos los mismos criterios que la categorización vistos en los WorkWith. Pantallas Composer V7 00:16:29 A veces nos resulta difícil explicar esta categoría a clientes que no conocen los PXPatterns porque refiere a aquellas pantallas que por su extrema complejidad deban ser resueltas mediante un Composer, tal como vimos en V 1 | 00:43:38. Para se realistas en los tiempos, lo que habría que estimar es individualmente cada componente que lo integra. Si tenemos en un Composer dos Grillas, seguro vamos a tener que hacer dos WorkWith y habrá que determinar si cada uno de ellos es sencillo, complejo, en fin, habrá que analizar su lógica por separado, más allá del Composer en sí que también habrá que categorizar. Normalmente lo que se debe es hacer una estimación real de Instancias que haya que programar y en este caso, a un Composer hay que subdividirlo en cada una de las lógicas para resolver cada sección de la pantalla. Generalmente, cuando decidimos programar un WorkWith con estructura muy compleja mediante un Composer, el problema aquí se presenta cuando debemos empezar a separar código que teníamos unificado. Teníamos un solo Event Load en el Work Panel original y tenemos que transformarlo en dos, tres, cuatro o cinco Events Load dependiendo de la cantidad de componentes que tenga la pantalla. Luego el problema no es armar la Grilla o armar el Parameter Request que por lo general son muy sencillos y la lógica es bastante simple de implementar. Lo que es más complicado es separar el Event Load principal en los distintos Events Load que tenemos que implementar individualmente y eso seguramente nos va a insumir tiempos de desarrollo. Hasta aquí todo lo relativo a la Categorización. Esta es la categorización básica que nosotros hacemos, sin perjuicio de que cada sistema debe ser analizado especialmente para detectar particularidades con las que nos hemos encontrado en algunos casos. Por ejemplo en algunos clientes nos hemos encontrado que en la versión Win hacían llamadas a dlls o rutinas externas en programadas en el lenguaje final a soportar o invocaciones a código embebido del lenguaje a través de los comandos: DBASE, VB JAVA o NET. Bueno, eso va a haber que contemplarlo aparte, analizar cuantas llamadas hay porque se debe considerar, primero ver que hacía cada una de esas dlls o rutinas o Página 9 de 44 código embebido para después determinar que tendríamos que hacer en la versión Web y todo esto puede llevarnos mucho más tiempo que en una migración convencional. De modo que debemos dedicar un poco de tiempo a analizar donde pueden estar estos problemas, más allá de esta categorización que permite estimar grosso modo los tiempos de migración de la mayor parte de los Objetos del Sistema. Pero en todo caso recuerden que sólo se trata de una estimación inicial y nosotros nunca cotizamos el Outsourcing en función de ella sino en función de las horas reales aplicadas al trabajo. Máxime cuando en general esta categorización la realiza el propio cliente que es quien mejor conoce su KB y por lo tanto puede cometer menos errores de evaluación. Sin perjuicio podemos decir que esta categorización, cuando está bien hecha, permite una estimación de los tiempos del proyecto bastante real y por lo general tenemos una desviación inferior al 20 % respecto a la planificación inicial, que es muy aceptable para este tipo de desarrollos. También digamos que en alguna oportunidad una tarea no llevó mucho más tiempo que el esperado, pero esto se compensó con otras que finalizaron antes de lo previsto y esa es la gracia de esta metodología que hasta ahora no nos ha defraudado. Gestión de Proyectos - Temas a considerar V7 00:21:12 También hay otros temas que hay que tomar en cuenta cuando estimamos un proyecto y vamos a pasar a ver los más destacables aunque la lista no sea exhaustiva. Preparación de ambiente de trabajo V7 00:21:30 Recuerden que cuando estamos trabajando con Patterns cada programador tiene que tener su KB. Y armar esa lógica de KBs en nuestro caso es más complicado aún porque a los clientes lo que nosotros ofrecemos es la seguridad de que los programadores están trabajando en un ambiente protegido y ningún programador tiene la KB completa. Cuando recibimos la KB de un cliente, lo que hacemos es transformar todos los Objetos en Objetos Privados y armamos la KB de los programadores con todos los Objetos Privados de modo que no puede abrir ningún Objeto, más allá de que GeneXus en todos los casos permita abrir el Form de los Objetos con interfaz. Obviamente a partir de que se le asignen tareas, el programador va a empezar a pedir los Objetos involucrados es forma desprotegida para poder trabajar sobre ellos. De modo que en nuestro caso requerimos un tiempo para preparar el ambiente de trabajo con estas características para cada programador que integre el equipo de desarrollo. En ese tiempo debemos pasar todos los Objetos a Privados y esto no lo hacemos uno a uno sino que generamos un XPZ externo, lo modificamos y consolidamos de nuevo, eso nos genera los Objetos Privados que después distribuimos con copyright. Además, como metodología de trabajo, nosotros trabajamos en un ambiente centralizado, utilizamos un Terminal Server para el ambiente de desarrollo, eso nos ayuda bastante a tener localizados los problemas y no Página 10 de 44 depender tanto de los programadores sino que el administrador y gerente del proyecto es el que hace esa preparación del ambiente, por tanto esto está bastante focalizado con independencia del hardware que tiene cada integrante del equipo. Carga de datos para Testeo V7 00:23:39 Cuando brindamos nuestros servicios de Outsourcing al cliente, por lo general no contamos con las Bases de Datos del sistema a migrar, situación distinta a la que se presenta cuando el cliente realiza la migración con sus propios programadores que van a poder apuntar a la Base de Datos que se esté usando en la versión Win. Por lo tanto nosotros tenemos que hacer la carga de datos para armar una Base de Datos coherente donde poder hacer un testeo básico del desarrollo. Diseño gráfico V7 00:24:13 Al diseño gráfico también hay que tomarlo en cuenta dentro de los trabajos extra programación. Seguramente se van a requerir los servicios de un diseñador gráfico, dado que como sabemos, en Web hay una lógica visual distinta que aporta mucho al lucimiento de la aplicación y en ocasiones el aspecto visual importa tanto o más que el funcional. Contamos con un documento que agregamos como ANEXO 2 a este manual, que contiene la información acerca de los requerimientos de la “Interfaz Gráfica de Usuario” y que les va a servir como guía para solicitar la especificación del diseño gráfico de la aplicación. Montaje del Diseño gráfico V7 00:24:43 Luego que el diseñador realiza la especificación del diseño gráfico es necesario proceder al montaje. Un poco todo lo visto en el volumen anterior está orientado a esto, a que conozcan cómo montar el diseño, cómo definir las Clases de cada elemento, cómo aplicar las directivas del diseñador. Esto también lleva su tiempo que debe ser tomado en cuenta. Cierre de versión y entrega de Kb V7 00:25:06 Este es otro proceso que puede ser necesario realizar con alguna frecuencia a partir de cierto grado de desarrollo del proyecto, para ir entregando subsecuentes builds a los validadores finales de la aplicación. Recuerden que estamos trabajando sobre KBs distribuidas, entonces hay que volver a centralizar la información en una sola KB, volver a regenerar todas las Instancias, verificar que los procedimientos que hayan sido modificados vuelvan al consolidado, en fin, hay un proceso de cierre de versión que incluso requiere un nuevo proceso de testing primario. Página 11 de 44 Testing V7 00:25:35 Nosotros manejamos tres niveles de testeo. Un Testeo primario que es el que realiza el propio programador a partir de la pantalla Win que está migrando ejecutando ambas versiones del programa y verificando que se comportan en forma similar. Como acabamos de ver, al cerrar la versión se debe reiterar el Testing primario para asegurar que no se han introducido errores al regenerar todas las Instancias. Después y antes del Testeo final siempre a cargo del cliente, realizamos un Testeo secundario más exhaustivo que está a cargo de una persona que tenga conocimiento del sistema y que conozca las variantes de comportamiento que debe soportar la lógica del programa en función de las distintas condiciones de acceso a cada pantalla. Como estamos desarrollando en Web tenemos muchas ventajas porque podemos habilitar el acceso de los propios validadores desde donde se encuentren para que puedan realizar este Testeo secundario. Si bien los tiempos del Testeo primario están incluidos en las tareas de programación y cierre de versión, este segundo nivel de testeo también requiere un tiempo que debe ser estimado y tomado en cuenta al evaluar el proyecto. Todas las etapas que hemos visto hasta ahora para el armado de un proyecto de migración deben ser documentadas de algún modo y nosotros usamos las facilidades que nos brinda el programa Excel para hacerlo. Cuando hacemos una Categorización de Objetos a migrar, es recomendable no manejar sólo cantidades sino declarar explícitamente qué Objetos están en cada categoría y documentar esto en una planilla como ésta: Página 12 de 44 donde podemos ver como títulos de cada columna (recuadro rojo) las distintas categorías que hemos propuesto para particionar la KB a migrar o desarrollar. Debajo (recuadro azul) podemos ver el nombre de cada uno de los Objetos que fueron ubicados en cada categoría. Los colores de fondo en las celdas responden al estado en que se encuentran los Objetos durante el proceso de desarrollo. Mediante los diferentes “Tics” podemos ir viendo rápidamente cuáles y cuántos están migrados, qué promedio llevamos migrado en cada Categoría (recuadro verde), etc., para llevar un control de la evolución. De modo que el trabajo de categorización de Objetos debería resultar en algo de este estilo. Organizar el trabajo de este modo le sirve además al Gerente de Proyecto para la asignación de tareas a los programadores. Si hubiera más de un módulo en el sistema es recomendable asignar un “Libro” a cada módulo, de modo que la recorrida de cada lista constituya una secuencia coherente trabajo para un mismo programador. Luego tenemos otra planilla para la estimación de todos los tiempos del proyecto, que en el primer “Libro” resume los totales por Categoría que vienen de la que acabamos de ver: Ya están precargados los tiempos promedio que no lleva la migración de cada tipo de Objeto, con lo que se obtienen los parciales y un subtotal general. También se prevé un “Libro” para documentar los tiempos de algún SubProyecto que se pueda requerir: Por ejemplo, hemos tenido casos de clientes que para ciertas Tablas Base se manejaba directamente la transacción como elemento de recorrida entre los registros del sistema. En este caso esa funcionalidad no está soportada por el Pattern por lo que hay dos soluciones al respecto: Tomar en cuenta en la categorización que una Transacción implementará un WorkWith relacionado o agregar un subproyecto para realizar el soporte de recorrida de Página 13 de 44 registros en la propia Transacción. Para este último caso seremos nosotros los que estimaremos el soporte de dicha funcionalidad en los Patterns. Otro ejemplo es el tema de la Impresión Batch, si aplica, debe ser evaluado con sus propios tiempos de desarrollo. En nuestra versión de esta planilla tenemos un “Libro” adicional para documentar el desarrollo de nuevas funcionalidades en los Patterns y luego tenemos un “Libro” que resume todos los tiempos de los anteriores y que corresponde propiamente al proyecto de migración: Página 14 de 44 donde incluimos ahora sí, todas las otras tareas extra programación que forman parte del mismo y que acabamos de mencionar. Todos estos tiempos deben ser estimados y de esta planilla surge la cantidad de programadores que requiere el proyecto a partir de la que sugiere (recuadro) como resultado del tiempo de duración ingresado y el total de horas a cumplir. El último “Libro” contiene el Estimativo de Inversión resultante de todo lo anterior. Gestión de Proyectos - Administración Kbs V7 00:27:35 En este tema lo que cuentan son los requerimientos de los Patterns acerca de la manipulación de una KB, acerca de los cuales algo ya hemos visto. Metodología V7 00:27:49 Acá nosotros no podemos seguir la metodología que de pronto muchos de ustedes aplican, que consiste en mantener una KB centralizada y que todos los programadores trabajen sobre la KB centralizada en los distintos modelos de Prototipo o Producción. Esto no lo podemos hacer así porque cuando nosotros trabajamos sobre los Pattern estos bloquean la KB en Modo Diseño. Es como si entráramos en Modo Diseño lo que descarta la posibilidad de trabajar todos sobre una KB centralizada. AdminG V7 00:28:34 De modo que en lo que llamamos Preparación de Ambiente de Trabajo lo que hacemos es preparar una KB para cada programador y cuando comenzamos a prestar servicios de Outsourcing nos dimos cuenta que iba a Página 15 de 44 ser necesario disponer de algún programa que nos administrara la información distribuida a los programadores. Yo les comentaba a algunos de ustedes que el proceso de trabajar con Instancias no es el problema principal porque cada uno tiene su Instancia, la genera, la prueba en su ambiente local y esto no ofrece inconvenientes. El problema se presenta cuando empezamos a manipular Objetos “por debajo”, por ejemplo, Procedimientos que son llamados por las Transacciones. En Web, como norma general que deberían aplicar en todos los casos, toda vez que una Regla de una Transacción invoque a un Procedimiento, deberían declararle a ese Procedimiento específicamente los valores de “In” y de “Out”, porque es casi indispensable hacer esto para que funcionen bien todas las reglas de Ajax. GeneXus tiene que saber que tiene que llamar, que tiene que invocar y que tiene que devolver para que funcionen bien las invocaciones. Cuando llamamos con UDPs, no hay problema, más o menos GeneXus ya sabe que lo único que se devuelve es lo que está antes de la UDP, pero cuando llamamos con” Call” es importante saber qué se pasa y qué se devuelve. El SVT AdminG es un sistema que nos permite administrar la KB, básicamente trabajamos en un modelo consolidado, hay una KB consolidada y después una KB para cada programador que en principio tiene los Objetos protegidos, lo que es ideal porque obliga al programador a pedir el Objeto con el que va a trabajar para poderlo manipular. Entonces el programador tiene que pedir un Procedimiento y por esto imaginen que en el AdminG el concepto es el de manejo de una Bandeja de Entrada, en el que cada programador tiene los programas que pidió. Después, de acuerdo con esta lógica, simplemente va a devolver ese Objeto una vez que haya terminado con él y se puede establecer que automáticamente pase por un Administrador de KBs. En nuestro caso siempre pasa por un Administrador de KB para que vea si lo que está devolviendo es correcto, mismo para después hacer el control de especificación, generación, compilación y todo lo demás. Este sistema ofrece múltiples funcionalidades que vamos a mencionar pero no vamos a ver en detalle como: • Consulta de Programas: Uno podría consultar por un programa que no lo ve, o que no lo tiene actualizado y se puede consultar en la KB centralizada sin tener que abrir esa KB para permitir que muchos puedan estar consultándola, • Pedido de Programas, como ya vimos o, • Pedido de Actualización, • Pedido Múltiple, para modificar muchos Objetos a la vez, • Creación Múltiple para crear muchos Objetos a la vez declarando su creación. Cuando trabajamos con muchos Objetos el tema de la nomenclatura es importante y AdminG controla que cuando un programador solicita crear un Procedimiento, ese Procedimiento al consolidar no se sobre escriba con el de otra KB de otro programador que de pronto también lo está creando. Se trata de controlar la unicidad de los programas que se están creando, • Soporte de Anulaciones y • Devoluciones de programas a la KB centralizada o entregar a otros programadores versiones que se están desarrollando. Página 16 de 44 Gestión de Proyectos – Roles del Proyecto V7 00:32:50 También debemos hablar de cómo manejar la estructura jerárquica dentro de un equipo de desarrollo y que relación hay entre los diferentes roles. Cada proyecto se atiende con una estructura celular básica con pocos niveles dentro. Programadores V7 00:33:09 Integran un grupo colaborativo tratando de especializar a cada profesional con este rol en los distintos subsistemas del aplicativo a migrar. Gerente de Proyecto V7 00:33:09 Uno para cada sistema y en lo posible un solo sistema para cada profesional con este rol. Una cosa es migrar un sistema con distintos módulos y otra cosa en migrar dos sistemas con lógicas e implementaciones distintas. Las tareas del Gerente de Proyectos son variadas y entre ellas encontramos: • Análisis de posibles situaciones a contemplar cuando se trata de migrar una KB, evaluar dónde están los posibles problemas, cómo solucionarlos, en fin, la idea es darle lo más aceitado posible al programador el proceso de migración, de modo que su tarea sea como la de un integrante de una línea de montaje en los tiempos de Henry Ford: Entra Objeto, proceso, prueba y siguiente Objeto. Este es el único modo de lograr que los tiempos del proyecto se cumplan. • Delegar tareas, esto es asignar tareas a cada programador tratando de especializar su trabajo en función de los distintos módulos que contenga el sistema a migrar, de modo que pueda familiarizarse con la lógica del subsistema que tiene a cargo en un régimen de complejidad creciente a partir de la migración de sus Tablas Base. • Otra tarea del Gerente de Proyecto es la concerniente a su rol de KB Manager. Más allá de que el AdminG nos administre la KB, este rol sigue existiendo. Se trata de otorgar los Objetos solicitados o aceptar las devoluciones de los programadores, evaluar si anduvo bien la consolidación, en una tarea que es bastante monótona pero que requiere ser estricto porque, nos ha pasado por ejemplo, que en un Procedimiento se requiere manejar algún Subtipo de un elemento de la Tabla Extendida y como ese Subtipo el programador no lo tiene, crea un grupo en su KB. Ahora, este grupo tiene que estar asociado a alguna Transacción, de modo que si el programador devuelve sólo el Procedimiento, en la KB Centralizada este grupo no está asociado a ninguna Transacción y esto nos va a generar problemas en el ambiente del Consolidado. Esto se resuelve siendo muy riguroso con las consolidaciones de los Objetos, ver en cada Procedimiento que se está consolidando los posibles Warings que se generan, es una tarea muy tediosa pero hay que hacerla. Página 17 de 44 • • Por otro lado el Gerente de Proyecto es un Tutor y por tanto debe conocer la forma de programar con las herramientas que estamos utilizando: Las Pxtools y las otras herramientas de gestión que requiera el proyecto, de modo de poder asesorar al programador o al tester en cualquier situación que se presente. En nuestro caso el Gerente de Proyecto también presta servicios de Soporte el Cliente en aquellos problemas que suelen presentarse en la etapa de validación. Ocurre que puede haber un problema en una pantalla que no deba ser derivado directamente al programador sino que debe ser abordado desde un punto de vista más general, pues el requerimiento puede estar afectando las reglas estructurales de la aplicación en su versión Web, cambios que deben ser analizados con el cliente antes de bajar el requerimiento a la tarea de programación. No siempre es así pero de todos modos tales requerimientos deben ser evaluados en todos los casos por el Gerente de Proyecto. Encargado de Cuenta V7 00:41:06 Se trata del integrante del equipo que se ocupa hacer el seguimiento del proyecto y de mantener informado al cliente acerca de la evolución del mismo. Es una tarea que requiere documentar mediante informes semanales el estado cada tarea, medir los desvíos y permitir evaluar la marcha del proyecto a fin de poder introducir posibles ajustes. Página 18 de 44 Gestión de Proyectos - Método de Testeo V7 00:42:15 El Testeo del desarrollo es todo un tema y nosotros vamos a explicar una metodología que estamos usando y vamos a ver que esta metodología inclusive nos ayudó a determinar cuál era el mejor generador de GeneXus a utilizar en nuestro trabajo. Hoy día nos hemos especializado en el uso de Java porque Java nos brinda cierto soporte o ciertas facilidades para esta metodología que estamos usando para el Testeo. Vamos a explicar un poco cuál es el problema. Como vimos, el centro del proyecto en realidad es el Gerente y el problema se presenta en el día a día. Cuando un programador migra una pantalla, la rutina que debe seguir es entregarla al KB Manager para que la consolide, para que la incluya en el Consolidado y para que la genere en el Consolidado. Ese debería ser el proceso habitual. V7 Cuello de Botella en Consolidación 00:42:55 Como vimos, el centro del proyecto en realidad es el Gerente y el problema se presenta en el día a día. Cuando un programador migra una pantalla, la rutina que debe seguir es entregarla al KB Manager para que la consolide, para que la incluya en el Consolidado y para que la genere en el Consolidado. Ese debería ser el proceso habitual. El problema es que si esa metodología la usamos en un ambiente en el que tenemos cuatro o cinco programadores trabajando en el mismo proyecto, el rol de KB Manager ocuparía todo el tiempo del Gerente de Proyecto que quedaría dedicado exclusivamente para eso sin poder atender sus otras tareas. Sería necesario quitarle esta tarea y adjudicársela a un nuevo integrante con el rol exclusivo de KB Manager y en nuestro caso esa variante sería muy costosa y difícil de trasladar al precio del servicio. De modo que tuvimos que procurar la manera de sortear este “Cuello de Botella”. Es una situación que genera un cuello de botella en el proceso de industrialización del desarrollo, para ver la migración en términos de cadena productiva. V7 Implementación alternativa 00:44:38 Debimos entonces buscar una metodología alternativa, lo que nos llevó a evaluar la situación del siguiente modo: P1 P2 P3 C 70:45:22 Haciendo de cuenta que hay tres programadores, tenemos una KB “P1”, “P2” y “P3” para cada uno de ellos y una KB consolidada “C”. Página 19 de 44 P1 P2 P3 C 70:45:37 El proceso normal, estando cada KB en su estado de actualización correcto, es que cada programador vaya pidiendo los Objetos (flechas rojas) que requiere para hacer su parte de la migración, conforme a la tarea asignada por el Gerente de Proyecto. P1 P2 P3 C A 70:46:10 Modelo de Testing El cuello de botella se presenta cuando todos ellos comienzan a devolver Objetos (flechas azules) y en ese punto (óvalo verde) el KB Manager tiene que estar consolidando todos esos Objetos. El KB Manager tiene que estar recepcionando continuamente todos esos Objetos para pasarlos a una Página Web (figura violeta) que sea un ambiente de testing. Vamos a representar ahora otra situación que resulta preferible para el desarrollo del proyecto. En primer lugar cada KB debería tener su propio ambiente de Testing local: A A P1 A P2 P3 C A 70:46:30 Página 20 de 44 Modelo de Testing Cada programador tendría que tener su propia versión Web local (figuras naranja) para poder probar individualmente la aplicación que está migrando. Es lo que nosotros llamamos hacer el testeo primario, hacer una mínima prueba de buen funcionamiento. El problema es que no podemos pedir a un tester o validador secundario que vaya probando cada Objeto en los distintos lugares. Si estamos trabajando con Notebooks, o sea, no con Terminal Server, estamos en ambientes separados, inclusive podríamos estar en redes separadas y el tester podría no tener acceso a estos ambientes locales de cada programador. Entonces, es necesario pasar a un Sitio Web, a una Webapp en donde esté centralizada la información. Por eso el tema de pasarlo a la KB Consolidada donde nos encontramos otra vez con el problema del KB Manager. Para resolverlo, lo que nosotros implementamos fue lo siguiente: A A P1 A P2 P3 C A 70:47:59 Modelo de Testing La KB “C” que tiene un Modelo de Testing apunta a un Servidor Web que está en la red y lo que hacemos es que cada programador tenga también un Modelo de Prototipo que apunte al mismo repositorio (flechas marrones). El Modelo de Testing está en un Servidor Web y lo que hacemos es que cada programador tenga en su ambiente un Modelo de Prototipo Local vamos a llamar y un modelo de prototipo común a todos, que nosotros llamamos Modelo de Testing. De modo que lo que establecemos es que cada KB de cada programador tenga dos Modelos de Prototipo, uno Local y uno de Testing, con lo que logramos solucionar este problema del cuello de botella, porque cada programador cuando termina de generar sobre su Modelo Local lo que hace es pasar al Modelo de Testing y sube los Objetos que compiló, los Objetos que generó los sube al Modelo de Testing. Obviamente este modelo tiene que estar en una red para que puedan subir los Objetos. Vamos a ver también que esta metodología que estamos usando tiene ciertos inconvenientes que hay que tomar en cuenta y tiene una gran ventaja que consiste en eliminar este cuello de botella. El KB Manager deja de ser crucial para esta representación porque cada programador apunta en su KB a ese directorio de Webapp y por lo tanto sube todas las Clases a ese directorio. Página 21 de 44 Y al tester le podemos decir que tiene un solo lugar para acceder al sistema que estemos migrando, que es esa Webapp que está relacionada con el Consolidado también. ¿Cuáles son los inconvenientes que se pueden señalar? En primer lugar, esto nos determinó que el generador que teníamos que usar es el generador Java, porque cuando trabajamos con proyectos de PuntoNet, GeneXus, cuando generamos un nuevo Objeto, en otro objeto que se llama WebConfig nos genera todas las interdependencias. En un proyectito que se llama WebConfig se le informa al Internet Information Server qué DLLs tiene que tomar para referenciar y eso es lo que puede cargar en memoria, de modo que lo único que puede referenciar de DLLs externas es lo que está allí indicado. El problema es que si estamos trabajando con KBs separadas, cada KB va a armar su proyecto para los Objetos que cada programador tiene y no va a haber un proyecto general. En su momento no profundizamos más en la tecnología PuntoNet para ver si había alguna posibilidad de que en vez de que GeneXus sobrescribiera el proyecto, que fuera agregando sin sobrescribir el WebConfig original porque teníamos el problema de que en esa KB centralizada sólo iban a quedar las referencias a las DLLs de la última KB que subió Objetos al Servidor. Esto así provocaría muchas pérdidas de referencias a DLLs que terminarían siendo Procedimientos o Web Panels de otros programadores en el sistema. En el caso de Java la referencia es directa, o sea, hay una relación directa entre la URL cuando se invoca a cualquier cosa debajo del directorio de servlets, se va a buscar un .class con ese nombre. En este caso no se requiere de un proyecto centralizado que administre la ubicación de las referencias, simplemente se va a buscar al directorio “clases” el nombre que viene solicitado arriba y si no lo encuentra da un error directamente y esto nos permitió mandar a ese repositorio todas las “clases” de todas las KBs sin mayores inconvenientes. Aunque sí hay un segundo inconveniente referido a esta KB de Testeo (violeta en la figura) que pasamos a señalar. Por ejemplo, en V 7 | 00:28:34 dijimos que una de las cosas que deberían hacer toda vez que una Regla de una Transacción invoque a un Procedimiento, es declararle a ese Procedimiento explícitamente los valores de “In” y de “Out”. En los lenguajes tradicionales Java, PuntoNet, cuando se declara un método que recibe un parámetro se puede declarar un segundo método con el mismo nombre siempre que tenga parámetros distintos. Tienen que tener o tipos distintos de parámetros, o Reglas de “In” y de “Out” distintas de parámetros, o directamente tipos de datos, uno recibe un “In”, el mismo método recibe un String y los dos métodos son válidos. El lenguaje sabe que si llamamos al método y le paso una variable de tipo “In” va a atender el método que está relacionado con la variable de tipo “In” y en el otro caso atiende el otro. Se trata de poder usar el mismo nombre de método con múltiples definiciones. Esto es muy común cuando acostumbramos que los últimos parámetros, cuando no se pasan se tomen por defecto. Por ejemplo, si decimos Substring que arranque del cinco y si no definimos el lenght se sabe que es hasta el final. Página 22 de 44 En realidad estamos declarando un método string que en un caso tiene un solo parámetro y en el otro caso tiene los dos. Normalmente el primero llama al segundo con el lenght hasta el total de la variable que está recibiendo. Esto es típicamente para lo que sirve: Poder declarar menos parámetros e instanciar algunos otros por defecto. En GeneXus, cada objeto que nosotros generamos termina utilizando un método que se llama “Execute” y para GeneXus hay un solo método que debe existir como “Execute”. El problema es que justamente, cuando declaramos parámetros de “In” y de “Out” estamos cambiando el método “Execute”. Al método “Execute” le estamos haciendo declarar variables de “In” y de “Out”. Entonces lo que nos puede pasar y muy a menudo pasa cuando estamos trabajando con un repositorio de Testing de estas características, es que viene un programador, que tiene que migrar una Transacción que trabaja sobre un Procedimiento básico (que por ejemplo “Devuelvo Empresa”), y decide declarar correctamente los parámetros de “In” y de “Out” y declara a la empresa como de “Out”. Pero es probable que este Procedimiento se use en muchas otras Reglas de Transacciones, muchos otros lugares donde la empresa hasta ahora era de “In” y “Out” si no se declaraba explícitamente. Entonces lo que va a pasar es que cuando este programador haya modificado el Procedimiento y lo suba al servidor, obviamente va a sobrescribir la clase que ya existía y va a quedar el método sólo con el “In” y “Out”. Y cuando otro Web Panel u otra Transacción que ya teníamos generados y compilados, que estaba llamando al método “Devuelvo Empresa” con empresa de “In” y “Out”, el error que nos va a dar es “No existe método asociado…” porque no encuentra el método. No es que no exista el Objeto, aunque el mensaje no es del todo claro y parecería que no lo encuentra, lo que muchas veces nos desconcierta porque podemos ver que la clase sí está. Lo que ocurre es que para Java, en realidad lo que no se encontró es el método que se acomode a los parámetros declarados en ese Objeto. Como GeneXus genera un solo método asociado al “Execute”, al sobrescribirlo el método anterior dejó de estar y el error que nos da es que no existe el método, pese a que la clase sí está. Este es un problema que debemos tomar en cuenta porque se nos puede presentar muy a menudo en la KB de Testeo con este tipo de Objetos comunes a todo el sistema y constituye la mayor desventaja que podemos encontrar en el uso de esta metodología que estamos aplicando. En algunos casos lo que hemos hecho es tratar de detectar un núcleo, no un núcleo en la terminología de GeneXus que refiere a Tablas Base, sino un núcleo de programación que detectara aquellos Procedimientos (por lo general son Procedimientos) que son utilizados en muchos lugares de la KB y a ese núcleo lo tratamos de tener controlado de alguna manera. En esos casos lo que hay que identificar es a los Objetos del núcleo y replicarlos todos a cada uno de los programadores, para que, si uno de ellos modifica un Procedimiento de estos, entonces lo distribuya y solicite al resto de los programadores su consolidación para evitar el error anotado al principio. Queda claro que este Modelo de Testing es para un Testeo secundario que tampoco es un Testeo final que corresponde al tercer nivel de testeo del que hablamos en V 7 | 00:25:35. Página 23 de 44 V7 Actualización de Kbs por cada Versión 00:58:08 Cuando nosotros hacemos un Cierre de Versión, obviamente nuestro modelo no es el Modelo de Testing sino un Modelo de Producción: A A P1 A P2 P3 C A Modelo de Testing A 70:58:20 Modelo de Producción que debe ser generado sólo por la KB consolidada “C” (figura gris). Este modelo se va cargando en forma distribuida desde todas las KBs de los programadores y el último modelo que es el de Producción debería estar administrado solamente por esta KB. El proceso normal es que el Gerente de Proyecto, a determinada altura del desarrollo haga lo que llamamos un “Cierre de Versión”, obligue a los programadores a entregar todo lo que tienen desarrollado hasta ese momento, entonces sí, realice las funciones que le caben al KB Manager de realizar todas las consolidaciones, evaluar todas las inconsistencias que se puedan presentar, especificar todos los Objetos de la KB Consolidada y generar sobre un Modelo de Producción que debería volver a ser testeado con un Testing primario para asegurar que no se han introducido errores al regenerar todas las Instancias. De este modo el Modelo de Producción debería ser un modelo mucho más estable que el Modelo de Testing y es el que ya se entrega por lo general al cliente. Obviamente entregar el Modelo de Testing al cliente es extremadamente riesgoso y poco recomendable, aunque en algún caso lo hayamos tenido que hacer por un tema de tiempos frente a un cliente muy ansioso. Lo que ocurre es que el pasar por el Consolidado lleva su tiempo porque probablemente tengamos que devolver muchos Objetos, atender problemas de requerimientos del cliente, implementar funcionalidades nuevas, en fin, a nosotros realizar un Cierre de Versión nos lleva aproximadamente tres días y si estamos trabajando con un modelo medio nuevo para el equipo de desarrollo nos puede llevar hasta una semana de trabajo. De modo que deben tener en cuenta que el Cierre de Versión requiere un tiempo para hacerse correctamente. Página 24 de 44 Lo que también tenemos que tener en cuenta es que por lo general cuando hacemos un Cierre de Versión deberíamos redistribuir la versión de la KB Consolidada a los programadores. Sería muy recomendable que si hacemos un Cierre de Versión la KB que tenemos Consolidada sea la nueva KB que todos los programadores deban tener actualizada para cubrirnos de todos esos problemas que de pronto en Testing no los tuvimos en cuenta y saltan puntualmente al cerrar la versión, por ejemplo en aquella pantalla que habíamos migrado y que ahora daría error porque el Procedimiento que se reutilizó está con parámetros de “In” y “Out” y nunca se volvió a probar. Este tipo de problemas se solucionan si procedemos a redistribuir la KB a los programadores con la versión cerrada cada vez que se genera. Al respecto, nosotros aún no la hemos utilizado porque es muy reciente, pero ahora el AdminG provee una funcionalidad para que cuando un programador entrega un Procedimiento al Consolidado y el KB Manager lo autoriza, en la noche replicar ese Objeto consolidado a todas las KBs distribuidas al resto de los programadores. Esto se resuelve a nivel de XPZs muy pequeños con los cambios ocurridos día a día en la KB Consolidada. Gestión de Proyectos - SAC/ Work Arounds V7 01:03:11 Ahora lo que vamos a mostrar son algunos SACs que nos han surgido en GeneXus a nosotros para que los tengan en cuenta si se les presenta alguna situación similar en sus desarrollos. Evaluación de SACs reportados V7 01:12:00 Para esta oportunidad les he seleccionado algunos mails que documentan ciertos SACs reportados por nosotros a GeneXus. A veces es complicado reportar bugs de GeneXus porque por lo general nos van a pedir el armado de una KB de Prueba que reproduzca el error y eso no siempre es posible en términos prácticos. Incluso nosotros tenemos algunos bugs para los que no hemos podido aún armar esa KB de Prueba. Sobre todo cuando los problemas son coyunturales de una pantalla determinada y obviamente no vamos a mandar una KB de un cliente. Nosotros además como metodología tratamos de no hacer esto ni siquiera con nuestras propias KBs y en el único caso que entregamos una Transacción con todas sus dependencias a Artech es cuando nos lo pide el cliente. Por este motivo muchas veces tenemos que conformarnos con un “Work Around” que es lo que queremos compartir con ustedes. Estos SACs que les voy a mostrar corresponden al Upgrade 2 de Java, hoy estamos en el Upgrade 3, de modo que algunos pueden haber sido resueltos, otros no, pero en todo caso es bueno que los conozcan. Prompts V7 01:14:15 Vamos a comenzar con el error que detectamos cuando se llamaba a un Prompt usando la misma variable en otro Prompt: Página 25 de 44 Tenemos entonces dos Reglas de Prompts a dos Prompts distintos (recuadro rojo) y estamos involucrando una misma variable (recuadros azules). En este caso uno de los dos Prompts no va a tener cargado el hipervínculo con la “manito” para abrir la ventana. Esta solución que plantean ellos es para el peor de los casos. Se trata de ver si se puede no pasar la misma variable sino otra variable que tenga el mismo valor que la anterior pero que GeneXus las tome como temas distintos. Nuevamente caemos en el tema de que para que funcione el Prompt la variable tendría que estar en pantalla como vimos al tratar el “InvisibleAttribute” de la figura 60:30:26. Y aquí ellos están planteando de modificar el código fuente (recuadro verde), cosa que no es recomendable porque si generamos la Transacción de nuevo vamos a pasarle por arriba a esta corrección. Lo que sí se puede hacer es lo que hemos hecho en algún caso que es en el Event Start, forzar el Link de un Prompt con el Javascript que llamaría al Prompt. De modo que debería declararse la propiedad “Forced”, que genera un control en pantalla y después en el Event Start de la Transacción puedo poner “.link=XX” y hardcodeamos el Link para obligar a que lo genere. Por lo general van a tener que ver otro Prompt para ver cómo se está generando el Javascript que se llama Javascript: <nombre del Prompt>” y después viene algo así como lo que recuadramos en violeta en la figura anterior: “documents.form[0].” y el nombre de la variable (si tiene un “subguión” es una variable y si no lo tiene es un atributo), todo en mayúscula. De ben tener cuidado porque en GeneXus la expresión “[0]” no la pueden poner así porque Página 26 de 44 les da un error (lo considera un elemento interno y reservado), de modo que tienen que separarlo en tres caracteres: “[“+”0”+”]”. En el Work Around no toman esta precaución porque se propone modificar el fuente directamente, lo que como vimos no es nada recomendable. Alguna vez nos han preguntado porqué no la aplicamos por defecto, si tenemos la propiedad “Forced” en los Prompts que es la opción más fuerte para obligar a que el Prompt funcione. Pero lo que pasa es que en algunos casos no ocurre esto y se da que poniendo la propiedad “Forced” en el Prompt éste no funciona y si le sacamos la propiedad “Forced” sí funciona. De modo que lo recomendable cuando se define un Prompt es probar con el Prompt común (sin “Forced”) y si vemos que no funciona o que no tiene el comportamiento que nosotros queremos aplicarle la propiedad “Forced” que nos obliga a que esté asociado a la variable. Recuerden que les dije que con esta propiedad en “True” estamos obligando a que el Prompt sólo esté asociado a la variable donde se está declarando el Prompt. ToolTipText V7 01:17:55 Esto es una realidad: En la 9.0 el ToolTipText no funciona en columnas, pero como ya hemos visto en PXPatterns sí lo pueden aplicar. Más allá de que la propiedad ToolTip de GeneXus no funcione, las PXTools logran implementarlo incorporando una lógica bastante rebuscada dentro de la Grilla donde no se utiliza la variable que está asociada al ToolTip sino que se crea otra variable a la que se le mete un código HTML para poder representar al ToolTip de modo que funcione en Web con la 9.0. Es una forma bastante complicada la forma de resolver este problema del ToolTip pero es una alternativa para resolver algo que en GeneXus no funciona. Para nosotros que trabajamos sobre la Instancia todo este Work Around es transparente, el ToolTip sí funciona aunque a GeneXus no le funcione la propiedad ToolTip. Página 27 de 44 Inserción de Datos V7 01:19:17 Para la Inserción de Datos en la 9.0 hay que tener en cuenta que si estamos trabajando con una tupla y queremos meter un contenido de una Variable en un Atributo y ese contenido es más largo que lo que el Atributo soporta, entonces nos va a dar error GeneXus. Antes, hasta la 8.0 no nos daba error, nos truncaba el valor, pero ahora nos da error. Directamente traslada el error de la Base de Datos y no trunca automáticamente. Decidieron que la acción de truncamiento debería se una opción del programador de determinar como truncar este contenido que hasta ahora se truncaba al final. Si les pasa esto y tenían un contenido de la Variable más larga que lo soportado por el Atributo les va a saltar un error al aplicar la sentencia. Agregar Tabla y Clave Foránea asociada V7 01:20:40 Se han presentado bastantes problemas con el hecho de que GeneXus en la 9.0 hace un control mucho más estricto del tema de las Claves Foráneas en las Reorganizaciones. Es bastante extensa la forma y el Work Around de este SAC que les conviene leer con atención en la figura siguiente: Página 28 de 44 Página 29 de 44 El hecho es que si nosotros creamos una Tabla y creamos además una Clave Foránea en otra Tabla que ya existía, obligatoriamente hay que poner el “Allow Null” de la columna de ese Atributo en “Yes” para que genere el Nulo realmente porque si no. para GeneXus es una pérdida de integridad. Hay una referencia como Clave Foránea a una Tabla nueva y la Tabla nueva, como no va a tener registros nunca va a poder apuntar a nada. Entonces, hay bastantes controles de este tipo en las Reorg que va a haber que tomar en cuenta y descubrimos algún Bug que se reportó en este Incidente que ahora yo no recuerdo muy bien el detalle y es bastante complicado ver la simbología por lo que les recomiendo leer. Campos editables en Grids V7 01:21:52 Este problema viene de anteriores versiones de GeneXus y la mostramos simplemente para que se acuerden si se les presenta durante el desarrollo. Se presenta cuando nosotros trabajamos con Variables editables en Grillas, en los WorkWith no nos pasa pero sí nos puede pasar muy a menudo en los ParameterRequest, que también tiene este soporte de Grillas para pedir algún dato o para mostrar algún dato. Si definen Variables editables en la Grilla del ParameterRequest y van a probar rápidamente como se ve, en general esa Variable, que la definen editable, no está editable. Eso es porque hasta que no pongamos un Evento que tenga un “For Each Line” que esté haciendo una recorrida para tomar en cuenta el dato editable de la Grilla, no va a dejar editable la Variable. Este es un comportamiento que viene creo desde la 6.0, que siempre fue así pero tomen en cuenta que si en un ParameterRequest ponen una Grilla con una Variable editable y no ponen en ningún Evento de ninguna Acción, en el Previous Code un “For Each Line”, no les va a quedar editable la Variable. En este Incidente lo que sugerimos es que por lo menos haya un Warning. En el Web Panel, si tenemos una Variable editable en la Grilla y especificamos el Web Panel, debería por lo menos darnos un Warning advirtiendo que tenemos una Variable editable pero no va a quedar editable Página 30 de 44 porque no pusimos una Regla For Each Line, para detectar el problema en un tiempo anterior al de ejecución. Parámetros char y Reglas que se disparan con Ajax V7 01:23:54 Este es otro Bug que supuestamente está resuelto en el Upgrade 3. Si se manipulaban llamados a UDPs o Calls a Procedimientos con Variables VarChar o Character más largas de por ejemplo 500 caracteres no funcionaba la Regla. Supuestamente esto ya quedó resuelto y en el Upgrade 3 ya estaría funcionando. Asignar Texto a un TextBlock mediante proc. Ajax Página 31 de 44 V7 01:24:38 Aquí se estaba reportando que no funcionaba una Regla tipo TextBlock.caption=udp (PProc01) if after (b) en el caso de que quisiéramos hacer algo, mostrar algún contenido que se cargaba dinámicamente por una UDP. Había algún Work Around que creo consistía en grabar el contenido en una Variable y después se le pasaba al TextBlock.caption para no hacer la asignación directa con la UDP, entonces funcionaba. View V7 01:25:28 El otro tema interesante que tienen que tomar en cuenta es el del View donde si están trabajando con un Tab y tienen una Acción que dispara un Evento, les puede pasar que cuando cliquean la Acción no hace nada, es como si no se ejecutara la Acción y si la debaguean y ven que esto llama a un Procedimiento que graba algo, el Procedimiento nunca se dispara. El problema se presenta porque el View siempre está pensado para representar un Registro, estamos viendo un Registro padre y elementos subordinados en los Tabs o elementos tabulares en el General del View. Lo que no debería pasar es que cuando tenemos Tabla Base, el For Each que programamos para instanciar ese Registro del View esté involucrando de alguna manera a más de un Registro. Si el Registro que está instanciando el Fixed Data del View está en las Conditions y el parámetro que se recibe no es la totalidad de la Clave de la tupla y se está recorriendo más de una tupla en el instanciamiento del Fixed Data, visualmente es probable que se vea el último Registro de esas tuplas, pero en esa lógica en el Event Load se están cargando los componentes de los Tabs y ahí se genera un problema con GeneXus porque obviamente como se instancian en el Event Load múltiples tuplas y en cada tupla se está haciendo la carga del componente del Tab, se produce un error de disparo de eventos dentro de los componentes. No estamos hablando de los View tradicionales de los que se generan cuando armamos la Instancia a partir de una Transacción y eso nos va a instanciar la Clave de la tupla. Nos referimos a los casos en que programamos una consulta y decidimos definir un View “a mano”, o que recibe Variables e instanciamos el “For Each” “a mano”. O se tiene Tabla Base pero en las Conditions del View tenemos que instanciar cada una de las propiedades que nos determinan la tupla. Entonces es muy importante que cuando definan un View tengan en cuenta de que siempre deben estar instanciando un solo Registro en la Tabla que estén recorriendo. Composer V7 01:28:04 En el Composer pasa algo similar aunque no tiene por qué tener las características del View. Por ejemplo, les puede pasar de que tengan un Composer y en el Composer tienen un WorkWith y en el WorkWith tienen una Acción también, no del tipo Link sino del tipo de Acción que dispara un Evento de la Acción y la Acción no se les dispara. Página 32 de 44 Es algo parecido a lo del View, pero cuando disparo el Evento de la Acción es como que no hace nada, como que se queda en la pantalla y no termina ejecutando nada. Esto se debe a un Bug de GeneXus que hemos detectado y no hemos podido todavía reproducirlo en una KB de Prueba para entregárselo a Artech a efecto de que lo solucione. Lo que sí encontramos es un Work Around que aún no sabemos por qué funciona, pero si les ocurre, simplemente en el Componente anterior (un Componente más arriba del que estamos declarando) definan un Componente y no llamen a nada. Si definen un Componente que no llama a ningún Objeto GeneXus se les va a solucionar el problema en la mayoría de los casos. No pregunten porqué, pero luego de bastantes pruebas y errores hemos detectado que teniendo un Componente vacío arriba se soluciona el problema y la Acción se empieza a disparar. Level1 V7 01:29:34 Recientemente nos ha ocurrido otro caso: Tenemos un Level 1 en una Transacción, una Grilla y estamos haciendo una Regla After Attribute del primer elemento de la Grilla, de la primera columna de la Grilla y detectamos que por defecto si hacemos eso, dependiendo de la lógica del After Attribute y de cómo estemos invocando, a veces, no se nos dispara el Ajax, no se dispara la Regla. Pudimos observar que si íbamos y volvíamos del campo y volvíamos a ir para adelante ahí sí se disparaba pero en el arranque no se disparaba. Finalmente descubrimos que la propiedad EnhableHistory de GeneXus, que es una propiedad que cuando estamos escribiendo en el campo Edit habilita la sugerencia de las últimas escrituras que hicimos sobre el campo (no confundir con el Suggest que vimos en la figura 30:12:40), esta propiedad nos generaba problemas con las Reglas After Attribute. Entonces, para este caso concreto se habilitó la misma propiedad EnhableHistory en el Atributo, para poder deshabilitarla, en algún caso que hubiera que solucionar el Bug que tiene GeneXus. Tuvimos que agregar una propiedad para poder solucionar el problema sacando el EnhableHistory, que es una lógica de Javascript que GeneXus implementa con el navegador y que obviamente alguna cosa hacía que impedía funcionar correctamente la Regla de Ajax. Página 33 de 44 ANEXOS ANEXO 1 – Categorización de Objetos OBJETOS WORK WITH SENCILLOS (PATTERN WORK WITH). En general el desarrollo de una instancia de Pattern consta de la generación de un Work With y una Transacción en conjunto. En tal caso la estimación de tiempos de desarrollo de este tipo de objetos se realiza en conjunto. A los efectos de la estimación en forma separada se realizará una simple partición de los tiempos a la mitad. Lo que caracteriza a los WorkWith Sencillos es que se trata de simples tuplas de una Tabla, donde se muestran columnas, donde existe una Tabla Base y no hay mayores inconvenientes. OBJETOS WORK WITH COMPLEJOS (PATTERN WORK WITH). Valen aquí las mismas consideraciones hechas en la tarea anterior en cuanto a que la estimación de tiempos de desarrollo de este tipo de objetos se realiza en conjunto. A los efectos de la estimación en forma separada se realizará una simple partición de los tiempos a la mitad. Cuando hablamos de WorkWith Complejos, acá lo que estamos tratando de definir es alguna complejidad adicional. Por ejemplo, ya no hay una Tabla Base, está recorriendo Tablas Extendidas, o ya se empieza a definir un Event Load y hay algún tema puntual que resolver que lo transforma en un WorkWith Complejo TRANSACCIONES SENCILLAS (PATTERN WORK WITH). Valen aquí las mismas consideraciones hechas en la tarea anterior en cuanto a que la estimación de tiempos de desarrollo de este tipo de objetos se realiza en conjunto. A los efectos de la estimación en forma separada se realizará una simple partición de los tiempos a la mitad. El desarrollo del Formulario de las Transacciones será soportado por los propios Patterns. Podrá ser necesario ajustar el comportamiento, lo que podría requerir modificaciones a la misma. TRANSACCIONES COMPLEJAS (PATTERN WORK WITH). Se consideran transacciones complejas aquellas que: • Contengan gran cantidad de reglas (más de 20). • Contengan reglas con mucha actividad “Client Side Validation” (por ejemplo: reglas after(attribute)) • Transacciones que salten a otros objetos con interfaz gráfica (UTL con un conjunto de Transacciones y Work Panels) El desarrollo de los Objetos de Complejidad alta requerirían usar recursos avanzados del Pattern como el controlador de salto programable, conditions en acciones, soporte de subrutinas y otros, cuando no modificar directamente el código para solucionar los problemas que se presentan en la Web. Página 34 de 44 OBJETOS PARA CONSULTAS (PATTERN WORK WITH). Para la estimación de Tiempo asumimos que las funcionalidades requeridas para la generación automática de la instancia están implementadas en el Pattern. Si así no fuera, siempre es posible reprogramar el Pattern para incorporarlas. OBJETOS DE CARGA DE PARÁMETROS DE REPORTES O PROCEDIMIENTOS (PATTERN PARAMETER REQUEST) Este patrón presenta una variante con respecto al Work With ya que por lo general son ingresos o visualización de datos tabulares sin manejo de grilla. En el caso de que sea para ingreso de datos puede invocar o retornar a otro Objeto GeneXus (por ejemplo objetos que instancien datos para invocar a un reporte). Para la estimación de Tiempo asumimos que las funcionalidades requeridas para la generación automática de la instancia están implementadas en el Pattern. Si así no fuera, siempre es posible reprogramar el Pattern para incorporarlas. OBJETOS REPORTES O PROCEDIMIENTOS A PDF SENCILLOS En estos casos se asumirá que la adaptación de los reportes a PDF constará de la inclusión de la regla output y de la definición de tipografía estándar para no afectar el diseño original en texto. Por otro lado se estimará la cantidad de reportes que pueden tener vectores o arrays como parámetros lo que insumirá mayor tiempo que el resto. OBJETOS REPORTES O PROCEDIMIENTOS A PDF COMPLEJOS Aquí se estimará la cantidad de reportes o procedimientos con salida a pantalla que pueden tener vectores o arrays en los parámetros los que insumirán mayor tiempo que el resto. Para estos casos será necesario implementar estructuras de SDT que se carguen en los objetos invocadores de estos reportes o procedimientos y sean almacenadas en la Web Session. Los reportes tomarán esas estructuras almacenadas y recargarán los vectores o array para no afectar la programación. PROCEDIMIENTOS CON INVOCACIÓN A INTERFACES GRÁFICAS Más allá de que GeneXus en la 9.0 soporta este efecto cuando se invoca a una sola interfaz gráfica, no siempre en todos los casos es aplicable y existen metodologías en los PXPatterns para resolver estos problemas (Insert Variables). OBJETOS COMPOSER Cuando nos encontramos objetos que contienen múltiples grillas o elementos complejos en la pantalla sería del caso separa la estimación en cada elemento que vaya a representar un patrón PX Composer incluyendo también el propio objeto Componer. Página 35 de 44 ANEXO 2 – Guía de diseño Interfaz Gráfica de Usuario Guía de diseño para Programadores. Interfaz Gráfica de Usuario OBJETIVO Cuando una aplicación debe implementarse en plataforma Web, a los clásicos requerimientos de la interfaz gráfica de usuario en cuanto a ser funcionalmente intuitiva se le suman los propios de un medio que tiene sus propias reglas. Es importante la forma como se establece el diálogo con el usuario de modo de hacerlo fluido, ordenado y directo. Debe regularse la cantidad de información que se despliega en pantalla de modo que su carga no sea interminable ni su navegación excesiva para ejecutar una acción. Las interfaces gráficas de usuario de este tipo de aplicaciones deben ayudar a éste a utilizar las herramientas disponibles, guiándolo a través de los procesos y evitando al mínimo los posibles errores. Todo el diseño debe estar al servicio de su objetivo primordial: ayudar al usuario en la operación del sistema del modo más intuitivo posible. Por eso la preferencia por los diseños armónicos, los colores no estridentes en combinaciones adecuadas y equilibradas. Por eso la necesidad de tener en cuenta las interfaces a las que está acostumbrado el usuario y tratar de emular ciertas formas de presentar las acciones que realiza (por lo menos las más frecuentes). Algunos puntos a tener presente para diseñar una Interfaz Gráfica de Usuario: Estructura simple y adaptable a todos los programas. Mayoría de colores planos, o con degradé simples fácilmente realizables con los temas de GeneXus. Paleta de colores basada en colores descansados, con la ayuda de contrastes para lograr destaques en puntos importantes de la pantalla. sistema de iconos que resalten sobre la estructura básica manteniendo el equilibrio cromático; se leen como parte de un sistema pero conservan su individualidad para su mejor reconocimiento por parte del usuario. Guía de diseño para Programadores. Página 36 de 44 2 Interfaz Gráfica de Usuario ÍNDICE Introducción -------------------------------------------------------------------- Pag. 3 Aspecto General de Pantallas -------------------------------------------- Pag. 4 Página Principal --------------------------------------------------------------- Pag. 5 Sectores: ubicación de elementos, colores, tipografías . Área de Contenidos---------------------------------------------------- Pag. 6 Lineamientos Generales---------------------------------------------- Pag. 7 Título de la Sección---------------------------------------------------- Pag. 8 Área de Datos----------------------------------------------------------- Pag. 9 Espacio de Código----------------------------------------------------- Pag. 10 Linea de Mensajes----------------------------------------------------- Pag. 10 Elementos generales Grillas de datos-------------------------------------------------- Pag. 11-12 Botones ------------------------------------------------------------ Pag. 13 Pestañas (Tabs)------------------------------------------------- Pag. 14 Resent Link------------------------------------------------------- Pag. 15 Pop ups ------------------------------------------------------------ Pag. 16 Iconos -------------------------------------------------------------- Pag. 17 INTRODUCCIÓN Este documento es un modelo de Guía de Interfaz Gráfica de Usuario. Como tal, contiene las especificaciones que permiten determinar todos los comportamientos gráficos de las pantallas de diálogo del sistema, las cuales deben ser personalizadas para cada aplicación. Por este motivo los valores indicados encolor rojo corresponden al diseño propuesto como ejemplo, pero pueden ser cambiados a gusto del diseñador. En su carácter de Guía para la programación contiene algunos elementos definidos estrictamente y otros mediante reglas que determinan un comportamiento común pero se adaptan a las necesidades de cada programa. 3 Guía de diseño para Programadores. Interfaz Gráfica de Usuario ASPECTO GENERAL DE PANTALLAS Guía de diseño para Programadores. Página 37 de 44 4 Interfaz Gráfica de Usuario PAGINA PRINCIPAL Siguiendo un diseño establecido pero que puede ser modificado hemos dividido la pantalla en 4 sectores: Cabezal, Menú Principar, Área de Contenidos y Pie. En particular la Barra de Menús no tiene por qué estar a la izquierda ni ser vertical. Perfectamente puede ser horizontal y ubicarse debajo del Cabezal, por ejemplo. Con el fin de no condicionar aquellas áreas que son de libre diseño sólo vamos a ocuparnos en este documento del área de contenidos. 5 Guía de diseño para Programadores. Interfaz Gráfica de Usuario ÁREA CONTENIDOS Se deben especificar aquí las políticas generales de diseño para esta área de la Interfaz Gráfica de Usuario (GUI). Es el objetivo mostrar una pantalla con la mayor cantidad de elementos que puedan ser requeridos para resolver todas las alternativas de un programa. Guía de diseño para Programadores. Página 38 de 44 6 Interfaz Gráfica de Usuario 16px 4px LINEAMIENTOS GENERALES. Lineamientos Generales Todos los elementos gráficos que sirvan de fondo a elementos del área de contenidos estarán a 4px del borde del área de menús. Todos los textos, tablas o íconos del área de contenidos se ubicarán a16px del borde del área de menús. Ningún elemento podrá tocar los bordes del área de contenidos. La Fuente usada para todos los textos de la aplicación esla Verdana. El color de fondo para el área de contenidos es:R 222 G 223 B 231 Con preferencia se usará para los textos el formato Mayúscula/Minúscula evitando en lo posible las frases y/o palabras Todas en Mayúscula. 7 Guía de diseño para Programadores. TÍTULO DE LA SECCIÓN O MODULO: La primera línea se reserva para el Título de la Sección o Módulo con que se está trabajando. El fondo tiene una altura de 22px y ocupa todo el ancho del área de contenidos. Formato del Título cuando sea necesario contar con un subtítulo interno a los datos, se utilizará el mismo formato que el subtítulo general. Altura del Fondo: 22px Color del Fondo: R 247 G 215 B 132 Texto: Verdana Regular 14pts. Color: R 49 G 97 B 148 Caja: Mayúscula/Minúscula SubTítulo Sólo para cuando la pantalla lo tiene, se reserva un espacio de22px de altura para el SubTítulo Formato del SubTítulo Texto: Verdana Bold 10pts. Color: R 49 G 97 B 148 Caja: Mayúscula/Minúscula Espacio para íconos y/o botones Sin Fondo. Altura 30px Los íconos (17px x 17px c/u ) se alinean a la izquierda y los botones de texto 20px ( de alto ) a la derecha. Esta zona se reserva (cuando sea necesario) para íconos y/o botones que sean opciones de la pantalla activa. Guía de diseño para Programadores. Página 39 de 44 8 Interfaz Gráfica de Usuario AREA DE DATOS Reservada para el ingreso y muestra de Datos, Grillas, Botones de acción, Tabs, etc., relativos al proceso que se está corriendo. El Área de Datos ocupa el mismo lugar en todas las pantallas, pero la ubicación relativa de los elementos que contiene depende de la información que se presente. Todos sus elementos se alinearán siempre a la izquierda. Para mostrar información dinámica (mensajes de error ) no se utilizará ventana pop up sino su despliegue en la parte inferior del Área de Datos. Para mostrar información de ayuda para el ingreso de datos a un campo (prompts), se utilizará una ventana pop up que es llamada desde un ícono especial (para todo el sistema) que se ubica a la derecha de dicho campo. Los subtítulos que agrupan cierta información tendrán el mismo formato que los subtítulos generales. Formato de SubTítulos: Fuente: Verdana regular para datos y bold para subtítulos. tamaño: 8 pts. para datos y 10 para subtítulos. Color: negro. Caja: Mayúscula/Minúscula. 9 Guía de diseño para Programadores. Interfaz Gráfica de Usuario Espacio de Código y Botones A la izquierda se escribe el código del objeto GeneXus de manera de facilitar el soporte técnico. A la derecha se ubican los botones de acciones. Formato del Código del Objeto: Fuente: Verdana regular. Tamaño: 7 pts. Color: R 153 G 153 B 153 HTrTPC01 Línea de Mensajes Código y Botones Mensajes En la última línea se colocarán los mensajes de alerta, error e información que la aplicación dé al usuario. Formato de Mensajes: Fuente: Verdana regular. Tamaño: 9 pts. Color: negro. Caja: Mayúscula/Minúscula. Guía de diseño para Programadores. Página 40 de 44 10 Interfaz Gráfica de Usuario ELEMENTOS Grilla de Datos Colores: Fondos: fajas de 20 px. de alto blancas y R 214 G 223 B 231. Sin filetes. Empezando con blanco. 11 Guía de diseño para Programadores. Interfaz Gráfica de Usuario Títulos de columnas Fuente: Verdana bold. Tamaño: 8 pts. Color: blanco. Caja: Mayúscula/Minúscula. Color de Fondo: R 0 G 73 B 115. Altura de Fondo: 20 px. Sin filete. División entre las Columnas: filete de 2px. de ancho del color de fondo (R 214 G 247 B 255). Datos de grilla Fuente: Verdana regular. Tamaño: 8pts. Color: negro. Alineación: izquierda (excluyendo cifras que requieran alineación en puntuación o derecha). Caja: Mayúscula/Minúscula (siempre que sea posible). Los títulos y los datos estarán alineados y separados del borde aproximadamente 5px. Paginación de grilla de datos La ubicación de la paginación se adapta a los estándares de generación de patterns de GeneXus: arriba de la grilla a la izquierda. Los botones serán los siguientes: (se incluyen archivos). Guía de diseño para Programadores. Página 41 de 44 12 Interfaz Gráfica de Usuario BOTONES Espacio de Código y Botones A la izquierda se escribe el código del objeto GeneXus de manera de facilitar el soporte técnico. A la derecha se ubican los botones de acciones. Formato del Código del Objeto: Fuente: Verdana regular. tamaño: 7 pts. Color: R 153 G 153 B 153 Línea de Mensajes En la última línea se colocarán los mensajes de alerta, error e información que la aplicación dé al usuario. Formato de Mensajes: Fuente: Verdana regular. Tamaño: 9 pts. Color: negro. Caja: Mayúscula/Minúscula. Botones Se establece una serie de botones comunes a la aplicación que, en caso que aparezcan todos, deberán mantener el orden establecido por defecto de GeneXus: Confirmar, Eliminar, Salir, Ayuda. (Ver Gráfico). El resto de los botones de opciones y acciones específicas de la aplicación posee las mismas características formales y su orden debe ser establecido. Todos los botones tienen 20 px. de altura y ancho variable según el texto interior. Se recomienda que la diferencia entre el ancho del botón y el del texto esté entre 24 y 40 px. en total (12 y 20 px. de cada lado). Los textos largos tendrán menos “botón sobrante” que los textos cortos. Se deberá dejar un espacio entre botón y botón equivalente a 8 a 10 px. aproximadamente. El texto del interior tendrá, en todos los casos, el siguiente formato: Fuente: Verdana bold. Tamaño: 9 pts. Color: R 49 G 48 B 41. Alineación: centrada. Caja: Mayúscula/Minúscula. La serie de botones comunes se entregan como imágenes con texto incluido. Para el resto de los botones se contará con tres archivos que forman el fondo (dos extre mos y un medio) y las especificaciones vistas del formato de texto. 13 Guía de diseño para Programadores. Interfaz Gráfica de Usuario PESTAÑAS (TABS) Pestañas (Tabs en Patterns) El texto interior de los Tabs tendrá, en todos los casos, el siguiente formato: Fuente: Verdana bold. Tamaño: 9 pts. Color: R 107 G 105 B 107. Color Activada: R 49 G 48 B 41. Alineación: centrada. Caja: Mayúscula/Minúscula. Para los Tabs se contará con diez archivos con las partes necesarias para formar el fondo y las especificaciones vistas del formato de texto. El fondo de la zona activa será del mismo color que la parte inferior del Tab seleccionado: R 239 G 239 B 239. Guía de diseño para Programadores. Página 42 de 44 14 Interfaz Gráfica de Usuario Recent Link Link a pattern padre: debajo del título y a la derecha (dentro del pattern). Fuente: Verdana bold. Tamaño: 8 pts. Color: R 49 G 97 B 148. Caja: Mayúscula/Minúscula. Paginación e Íconos de la Grilla Los botones de paginación se ubicarán a la izquierda y los iconos referentes a la pestaña seleccionada a la derecha. 15 Guía de diseño para Programadores. Interfaz Gráfica de Usuario POP UPS. El color de fondo de las pop ups es: R 231 G 231 B 231. Las especificaciones de texto son las mismas ya detalladas para pantallas normales. Guía de diseño para Programadores. Página 43 de 44 16 Interfaz Gráfica de Usuario ICONOS Presentamos aquí los iconos generales de la aplicación y los iconos específicos de las pantalla que son comunes a todas las aplicaciones. Iconos Comunes 17x17 px Subir Archivo a Servidor ORDEN PREESTABLECIDO Ver Archivo Subido Escanear Exportar Hoja de Calculo Exportar a Editor de Texto Imprimir Graficar ICONOS COMPLEMENTARIOS Aplicar Filtros / Actualizar Datos A la derecha del Ultimo Filtro Buscar Agregar Nuevo en Grilla Arriba de la Grilla a la Derecha ICONOS GRILLAS 17x17 px Editar Guía de diseño para Programadores. Primer Lugar de la Grilla Eliminar Segundo Lugar de la Grilla Copiar Tercer Lugar de la Grilla 17 P untoE xe Consultores www.puntoexe.com.uy 409-29-76 / 401-76-64 Juan D. Jackson 1286 Montevideo - Uruguay Página 44 de 44