... y en Concepto vamos a participar con dos proyectos.
Por más información, ver el Petroglifo.
... y en Concepto vamos a participar con dos proyectos.
Por más información, ver el Petroglifo.
Hoy me encontré con un problema, que con GeneXus no tiene una solución fácil. En una aplicación full web con GeneXus 9.0, tengo un proceso que puede demorar varios minutos, y mientras el proceso corre en el servidor, no hay forma de que el usuario se entere de lo que está haciendo.
En la versión original, lo que tenía era un web panel, que hacía un call a un procedimiento, y cuando el procedimiento terminaba, llamaba a otro web panel. Algo así:
Event 'Accion'
call(PProcesa)
call(HMuestraResultado)
EndEvent
El problema con esta arquitectura es que por más que ponga mensajes en el evento, no se van a mostrar hasta que haya terminado de procesar.
Arquitectura de la solución
La solución fue llamar al procedimiento usando el comando submit, con lo que el procedimiento queda ejecutándose, pero el control vuelve de inmediato al web panel.
El código queda entonces así:
Event 'Accion'
submit(PProcesa, '')
call(HMuestraProgreso)
EndEvent
Además, se implementaron dos procedimientos, uno que devuelve la cantidad a procesar y otro que devuelve la cantidad que fueron procesados hasta el momento.
El web panel MuestraProgreso, invoca a estos dos procedimientos en el evento Start, de forma de saber el porcentaje de avance, y muestra un mensaje "Procesados n de N". Este web panel hace un refresh automático cada 3 segundos, de forma de ir mostrando el progreso. Veamos el código.
Event Start
&Total = udp(PCantidadTotal)
&Procesados = udp(PCantidadProcesados)
if &Procesados >= &Total
call(HMuestraResultado)
else
Form.MetaEquiv.AddItem('refresh', '3')
tbkMensaje.Caption = 'Procesados ' + trim(str(&Procesados, 9, 0)) + ' de ' + trim(str(&Total, 9, 0)) + '.'
do 'Progress bar'
endif
EndEvent // Start
El refresh automático se hace colocando un tag HMTL en el cabezal de la página, en el código es la línea con:
Form.MetaEquiv.AddItem('refresh', '3')
Mostrando una barra de progreso
Para mostrar la barra de progreso (progress bar) se necesita un poco más de código HTML. Hay muchas formas de hacerlo, en este caso elegí usar una tabla con varias celdas que se van pintando de algún color a medida que avanza.
Sub 'Progress bar'
&pbDivisiones = 100
&pbAvance = round(&Procesados * &pbDivisiones / &Total, 0)
tbkProgressBar.Caption = '<table id="ProgressBar" cellpadding="0" cellspacing="0" style="width:100%;" border="1" rules="none"><tr>'
for &i = 1 to &pbDivisiones
if &i <= &pbAvance
&style = ' style="BACKGROUND-COLOR: #005B5B"'
else
&style = ''
endif
tbkProgressBar.Caption += '<td' + &style + '>&nbps;</td>'
endfor
tbkProgressBar.Caption += '</tr></table>'
EndSub // 'Progress bar'
El control tbkProgressBar es un text block que se encuentra en el web form del web panel, y que tiene la propiedad Format = HTML.
El resto de la subrutina se debería poder usar tal cual, sin hacerle modificaciones.
Ahora que Google compró FeedBurner, hicieron más fácil la integración con Blogger: FeedBurner Integration for Blogspot Blogs
Antes se podía hacer, pero daba un poco más de trabajo. Había que editar el fuente de la plantilla del Blog. Ahora simplemente es poner el link al feed en un campo.
SAC 20452- No se considera condiciones explícitas (where) para buscar el mejor Order/índice.Hasta ahora GeneXus suponía que el DBMS elige el índice que usa para resolver la consulta solo tomando en cuenta la cláusula "order", cuando en realidad la mayoría de las veces se basa en el contenido de la clausula "where".
En 5 Alternative Ways to Browse Amazon, se muestran cinco aplicaciones que permiten navegar por Amazon con distintas formas de visualizar la información.
Me gustaron LivePlasma y Tuneglue, tienen buenas formas de ver los elementos relacionados.
Estuve leyendo un artículo muy interesante de Alex Faaborg (Mozilla Labs) sobre The Graphical Keyboard User Interface, donde hace algunos comentarios interesantes sobre el uso de comandos de texto en interfases gráficas, en particular, algunas ideas que tiene para Firefox 3.
También hace referencia a un artículo que está muy interesante titulado Command Line for the Common Man: The Command Line Comeback.
Yo uso bastante la línea de comando de Windows para varias cosas (abrir archivos, copiar, mapear discos, etc). Obviamente no digo que hay que usar solo línea de comandos, pero hay cosas que son más rápidas o más fáciles de hacer con un comando que con una GUI. Sobre todo más rápido...
Hay otras aplicaciones que uso donde para realizar un acción se escribe un comando de texto.
Bookmarks en Firefox, con la extensión de del.icio.us. del.icio.us es un sitio que permite almacenar una lista de links, la extensión agrega mis links como una lista de favoritos en Firefox. En vez de usar una estructura de carpetas para almacenar los bookmarks, tengo una lista plana y un campo de texto, donde al digitar una letra se va filtrando. Digitando 4 o 5 letras, llego fácilmente al link que quiero.
Slickrun es una aplicación que agrega un campo de texto que flota sobre la pantalla, donde se pueden escribir comandos, por ejemplo, para buscar una palabra en el diccionario de la Real Academia Española (ojo, este comando no viene por defecto...). En lugar de abrir el navegador, buscar el link correspondiente, esperar que se cargue la página, ingresar la palabra en el cuadro de texto correspondiente, y presionar un botón, simplemente escribo "rae" en Slickrun, se abre otra ventana con un cuadro de texto, escribo la palabra, y doy Enter. Mucho más fácil :)
En GeneXus, por ejemplo para abrir un objeto. En una KB con más de 6.000 objetos como tenemos en Concepto, acordarse del folder de cada uno es imposible. El dialogo para abrir un objeto escribiendo una parte del nombre o de la descripción, es mucho más práctico.
Las aplicaciones generadas con GeneXus a partir de 9.0, tienen la posibilidad de ingresar valores mediante la descripción, y con una lista de opciones gracias al suggest. Hay que ver si los usuarios se acostumbran a esta forma de usar las aplicaciones, yo creo que hay casos en que es mucho más práctico que un prompt o un combo.
GXOpen es un muy buen sitio para compartir proyectos entre los miembros de la comunidad GeneXus, pero tiene una limitante que creo que es muy importante: el proyecto consiste de un solo archivo donde tiene que estar todo.
Sería muy bueno poder tener distintos archivos asociados a una versión de un determinado proyecto. Por ejemplo, deberían poder subirse los fuentes por un lado, los archivos binarios en el caso que haya, la documentación, screenshots, etc. Y todo debería forma parte de una determinada versión.
Además, si bajo un proyecto y quiero hacerle algún cambio, cuando lo vuelvo a publicar tengo que volver a subir todo el proyecto, sin importar el tamaño del cambio que haya hecho.
Para otros lenguajes de programación hay buenas herramientas para publicar distintas versiones de los fuentes, pero con GX es más difícil, porque los objetos de la KB no son archivos que se puedan subir a un repositorio.
KBManager es el proyecto de grado (de la Facultad de Ingeniería) de Federico Alvarez, Diego Crutas y Daniel Latorres, que entre otras cosas tiene la capacidad de almacenar en un repositorio centralizado las distintas versiones de los objetos de una KB. Es exactamente lo que le falta a GXOpen.
La solución es simple y efectiva: si yo parto de una determinada versión y hago un cambio en algún objeto, puedo subir mediante un XPZ los objetos modificados al repositorio centralizado, donde se procesa y almacena el XPZ de cada uno de los objetos. Del repositorio puedo obtener la última versión de un objeto o de toda la KB, y puedo fácilmente obtener también una versión anterior.
Creo que sería muy bueno contar con una funcionalidad similar a esta en GXOpen...
Además el KBManager permite hacer otras cosas, como por ejemplo comparar dos versiones de un objeto, crear consultas sobre los objetos, marcar objetos como que pertenecen al mismo "bug fix", etc., pero esto ya sería "funcionalidad avanzada" para lo que se necesita en GXOpen.