viernes, 24 de abril de 2015

Como eliminar el warning: spc0208: No triggered actions

Me han preguntado un par de veces como hacer para eliminar el warning spc0028: Not Triggered Action, que puede aparecer en objetos GeneXus.

Este mensaje no hace mas que hacer visible un problema que se tenia en programas GeneXus desde hace muchas versiones, pero en las ultimas versión, se hizo mucho mas facil de detectar pues sale un mensaje al especificar el objeto. Dicho mensaje, presenta algunas dificultades para su eliminación.

La primera dificultad, es que algunos no entienden el significado del aviso, que significa que alguna regla o formula no puede ser evaluada por GeneXus. El motivo de esto, es porque no tiene los elementos necesarios para evaluarla y por lo tanto no la considera en la generación del código de ese objeto.

Esto trae como consecuencia que alguna de las reglas que pusimos en nuestros programas no sera tenida en cuenta y el motivo puede ser un error de programación o un cambio que afecto la forma en que se disparan las reglas.

Desde mi punto de vista, seria mejor que el mensaje fuera

"Some rules/formulas can't be evaluated o generated"

La segunda dificultad es poder identificar cual es la formula o regla que no se está disparando.
Si tenemos una navegación no detallada, no se ven cuales son las reglas que no se disparan y no se puede ver el detalle.
La forma de ver una navegación detallada era sencilla en GeneXus 9.0, pero pasó a ser un poco mas compleja en GeneXus X.

Hay que elegir Tool / Options / Build / Detailed Navigation y ponerlo en TRUE.

En la navegación detallada, es fácil encontrar cual es la regla o formula que no se puede evaluar, pero no siempre es tan fácil encontrar el motivo por el cual no puede dispararse. Conviene empezar a ver si no hay variables que no estén inicializadas o atributos que no pueden ser inferidos.

jueves, 9 de abril de 2015

HOW TO: Como recuperar un objeto borrado en una KB de GeneXus Server

Tengo una KB local conectada a GXServer. Quiero recuperar un objeto que fue borrado ANTES de crear mi KB, por lo que el objeto nunca exitio en mi KB local.

Como hago para recuperarlo ?

Lo primero que tengo que hacer es identificar en que COMMIT fue borrado dicho objeto y esto se logra a traves del dialogo de Team Development / History


Luego se le hace Revert a dicho commit que nos lleva a una pantalla que permite recuperar dicho objeto.


Una vez que se recupera, lo tenemos disponible en nuestra KB local y debemos hacer un Commit para subirlo nuevamente al server, para que este disponible para todos los integrantes del grupo de trabajo.

Es un TIP muy sencillo, pero como me lo han preguntado varias veces es bueno dejarlo documentado.

miércoles, 25 de marzo de 2015

Documentación, ejemplos y Genexus Server

Una queja generalizada de los usuarios GeneXus es que no es fácil encontrar como se usan determinadas funcionalidades. Si bien la documentación ha mejorado muchísimo en los  últimos años y tenemos un WIKI que tiene mucha documentación, hay muchos usuarios que recién comienzan que no encuentran ejemplos de como usar determinados comandos.

El problema que he visto, es que si bien saben que existe determinada funcionalidad, no tienen ejemplos completos que muestren como usarla.

Cuando me llega este tipo de consulta, trato de refererirlo a KB de ejemplo (People and Organizations, WIKI del servidor público de GXServer.
Para poder extraer el ejemplo que quieren, el usuario deber bajarse toda la KB y empezar a buscar donde esta la funcionalidad buscada, lo cual es bastante engorroso y generalmente no hacen.

Para subsanar esto, se me ocure que seria bueno contar con 3 cosas bastante sencillas.

Poder linkear el fuente u objetos desde un WIKI a GeneXus Server. 
Me gustaría que en el Wiki de la comunidad, se pudiera poner un link a un objeto en particular de una KB GeneXus y que se muestre el contenido del mismo.
Me gustaría poner  (es solo un ejemplo de sintaxis)

[[KBObject:(GXServer)/(webapp)/(KB)/(ObjectType)/(QualifiedName)/(ObjectPart)

y en un ejemplo concreto
[[KBObject:open.genexusserver.com/xev3/KBWiki5/DataProvider/KBToHTML/Source]]
lo que mostraria en el wiki un control como esto


Ademas de esto, tendría un botón para poder hacer un export de solo ese objeto.

Poder hacer un export de un único objeto o un conjunto de objetos desde GXServer. 
Esta es una funcionalidad que ya he pedido en otras oportunidades pero no he logrado convencer a los responsables de GXServer que esto es una funcionalidad que va a ser bastante usada.

Esto sirve para poder bajar un tema que me gusta de una KB, en la cual no estoy trabajando, sin tener que bajarme toda la KB. También me servirá para probar y corregir problemas en KB de colegas, sin tener que pasarme toda la KB o tener que bajarla.

KB de ejemplos 
Cada versión de GeneXus hoy tienen  tener una o mas KB de ejemplos con las funcionalidades de la versión. Deberíamos tener algunas mas que tengan la funcionalidades generales o mas viejas e ir adaptando la documentación existente a que apunte a las KB de ejemplos.

Me parece que con estos cambios (nada revolucionarios) se podría ayudar a los usuarios que comienzan a tener mas a mano ejemplos actualizados y funcionales de los comandos que quiera usar.

Las KB que están en los GXServer públicos tienen muchísimos ejemplos muy útiles, pero no los estamos sacando todo su valor.

viernes, 20 de marzo de 2015

Comparador de Objetos GeneXus

GeneXus provee varias funcionalidades de comparación entre objetos. Se puede comparar diferentes revisiones del mismo objeto, el mismo objeto en dos versiones dentro de la misma KB y también se puede comparar un objeto que voy a importar con el objeto que tengo en la KB.

Sin embargo, hay varios casos de uso que no se pueden resolver aun con estas herramientas, por ejemplo:
  • * Un modulo común, instalado en dos KB diferentes y quiero comparar las diferencias entre los módulos. 
  • * KB en dos versiones de GeneXus diferentes (por ej, Evo2 y Evo3)
  • * Comparar versiones, en KB grande, donde el comparador entre versiones de GeneXus demora tanto que se hace muy poco practico. 

Para esto, programé una nueva opción en el KBDoctor (version 11, que aun no publiqué) que permite seleccionar un conjunto de objetos y generar un archivo de texto con el contenido de cada uno de dichos objetos. Luego utilizo un comparador de archivos, para ver cuales son las diferencias.

Traté de hacerlo lo mas sencillo posible, de forma de que sea bastante rapido y me resultara util para compara dos KB grandes, una en Evo1 y otra en Evo3.

Esto va a generar un directorio con un archivo de texto por objeto seleccionado.

Por ahora, estoy poniendo el contenido de procedures, workpanels, webpanels, transacciones, atributos y tablas.  Me faltan agregar, data providers, data selectors, menu bar y algunos mas.

No pongo aun todo el contenido de los archivos, sino solo reglas, fuentes, eventos.
En el caso de los atributos, pongo el tipo de datos y también la formula en caso que lo sea.
En el caso de las tablas, estoy poniendo únicamente los atributos que la componen.
Esta version no va a comparar WinForms, WebForms, Themes y layout de reportes, porque aun no los estoy necesitando.

Un ejemplo de procedure es:


Luego puedo comparar con DiffDotNet el contenido de los directorios, uno generado en Evo1 y otro en Evo3 y veo las diferencias por archivos.


 También se puede usar cualquier comparador de directorios y de archivos para esta comparación, como pueden ser el Beyond Compare, WinMerge, etc.

Queda aun programar bastante para que quede bien, pero en el estado actual, ya me resulta util.


martes, 17 de marzo de 2015

Como eliminar referencias a objetos "To Be Defined"

Es bastante común que en las KB queden referencias a objetos "To Be Defined".  Esto es una situación normal, cuando se importan objetos que llaman a otros que no existen en la KB en la cual estamos importando. Cuando se crean o se importan estos objetos, las referencias se borran y todos contentos.

También es común, que queden objetos en la categoría/carpeta "To Be Defined", pero que no tienen ningún objeto que lo referencien, por lo que la solución anterior, no puede ser usada.

Un ejemplo de esto:
No es posible borrar estos objetos, por lo que para solucionar esto, lo que hago es crear un procedure con el texto


Call("POrgest")
Call("PRgAcBitácoras")

.....




con todos los objetos que están en To Be Defined, que quiero borrar.


Hay que salvar el objeto y luego, conviene comentar todas las llamadas y volver a salvar dicho objeto.

De esta forma, como la referencia que se está eliminando es la última, se borran dichos objetos fantasma.

UPDATE: Me preguntaron porque era necesario eliminar estas referencias. Yo lo hago pues luego de las migraciones controlo que no quede ninguna referencia no definida, no querida. Por eso es bueno poder eliminar aquellas que no tengan ninguna referencia.