lunes, 27 de julio de 2015

Imagenes en este blog.

Dejaron de verse las imagenes de los post mas recientes del blog.
Estoy trabajando para lograr restituirlas..

miércoles, 22 de julio de 2015

Que hacer cuando un UPDATE de GeneXus Server falla.

Es una situación habitual, que cuando quiero hacer un UPDATE en una KB GeneXus que esta conectada a GeneXus Server, el mismo falle, dando errores.

Esto es común, cuando se modificaron muchos objetos en el server, por ejemplo, cuando alguien se va de vacaciones por un tiempo prolongado en una KB con mucha activadad.

Otra situacion comun, es cuando tengon en el server referencias que no son soportadas en la KB local, por ejemplo, si los objetos en el server hacen referencia a objetos Styles que ya no existen mas en mi KB local, que es migrada de version anteriores de GeneXus.

Otro motivo, es cuando borre objetos en mi KB local para realizar alguna prueba o limpieza y los objetos del UPDATE aun hacen referencia a algun objeto de estos.

Una "solución facil" para hacer en estos casos, es importar los cambios que vienen del server.

GeneXus Server no tiene la funcionalidad de hacer un export de objetos directamente desde la consola del mismo. Hice el pedido formal un par de veces a los responsables de GXServer para que se pueda hacer un XPZ desde la consola de GXServer, pero no he logrado convencer a los responsables del producto sobre la utilidad y necesidad de esta feature.

Para subsanar estos problemas y limitaciones, lo que suelo hacer es sacar el XPZ que genera en forma temporal en el proceso de UPDATE e importarlo.

Como detectar el xpz que se genera? 

Hay que revisar la ventana del OUTPUT en el Tab de Team Development hasta detectar la linea que dice:

Processing file 'C:\Users\ealmeida\AppData\Local\Temp\tmpC915.tmp'...
Por ejemplo:

Ese archivo de extensión tmp, tiene un export de los objetos modificados y puede ser importado de la siguiente forma.


Luego de hacer el import, conviene intentar nuevamente hacer el UPDATE y muchas veces el mismo se puede hacer sin problemas. 


jueves, 9 de julio de 2015

KBDoctor - Buscando navegaciones similares y nuevas funcionalidades

Cuando se realizan tareas de mantenimiento en KB que tienen varios años de desarrolladas, es conveniente empezar a usar nuevas funcionalidades de GeneXus. En particular, una cosa que es buena, es cambiar los objetos viejos para que empiecen a usar Data Providers y Data Selectors.

Para esto es fundamental encontrar cuales son las navegaciones "similares" para lograr encapsular ese conocimiento en dichos objetos.

La tarea de encontrar objetos con navegaciones parecidas es bastante compleja, para hacerla con GeneXus, por lo que decidí agregar una opción al KBDoctor, que facilite en algo la tarea.

La opción se llama "Find similar navigations", pero en realidad lo que hace es listar todos for each de las navegaciones GeneXus (los explícitos y los implícitos por el uso de atributos en los formularios).

Con este listado y ordenando por diferentes criterios (tablas, atributos usados, etc) se pueden luego encontrar aquellos objetos que me pueden interesar modificar para que empiecen a usar data selectors.

Por ejemplo, aplicado a la KB del WIKI de servidor publico de la Evolution 3, se listan varios objetos que navegan sobre las tablas PageLinks y WikiPage y hacen un join entre ambas.

En el listado se ponen cuales objetos son y en que evento y/o linea de código aparece esto.



Viendo el ejemplo marcado arriba del objeto HRelatedLinksPreview, se puede ver que efectivamente son dos for each "parecidos" y que podría encapsularse ese conocimiento en un procedure o hacer un data selector para mejorarlo.



 Esto lo hago procesando las navegaciones, y el formato en que se publican las navegaciones en GeneXus es interno y hay que deducirlo por ingeniería inversa, por lo que es muy proclive a errores de varios tipos. Lo que funciona para una KB, puede no funcionar para otra o también puede funcionar diferente con otros navegadores.  Es una funcionalidad que aun le falta trabajo pero así como esta puede ayudar a encontrar objetos candidatos a refactoring de una forma un poco mas fácil que sin esta opción.

También le agregue a todos los reportes del KBDoctor la posibilidad de ordenarlos por una columna, dándole un click al cabezal de la misma.

Ahora estoy trabajando en agregar algunas opciones nuevas:
* Listar todos los mains, que son llamados desde otros mains.
* Listar todos los objetos alcanzables desde un objeto elegido
* Listar todos los objetos (procedures o transacciones) que actualizan un determinado atributo/tabla.

Cuando la tenga listas, subo la version compatible con la Evolution 3.  Espero que sea esta semana.

jueves, 4 de junio de 2015

KBDoctor: Encontrando objetos candidatos para refactoring.

Desarrolle en el KBDoctor una opción para listar objetos candidatos a ser reprogramados o ajustados.

Los criterios que por ahora estoy buscando son:

* Objetos con nivel de anidación alto
Listo cuando se tienen mas de x niveles de if/do/for anidados. 

* Objetos con complejidad ciclomática alta
Calculo la complejidad ciclomatica simplificada del objeto y listo los que tengan una mayor a un rango dada. 

* Objetos con grandes bloques de código
 Apuntamos a no tener bloques de código de mas de 100 lineas de código. 
El bloque de código puede ser una subrutina, o bloques de IF/DO/FOR, etc. 
Lo que hago es una heurística, que puede tener algunos errores, pero sirve en muchos casos. 
El parseo de codigo GeneXus es tarea compleja, pues no tengo ni la gramatica completa y menos un BNF para procesarla. Estaria muy bueno que en proximas versiones del SDK de GeneXus se agregue algunos helpers para el manejo de codigo. Tal vez existan y yo no los he encontrado aun. 

* Objetos con muchos comentarios 
Cuando hay una proporción alta de comentarios frente a código, puede significar que hay código comentado y debería evitarse. 
Esto puede dar falsos positivos, pero al menos es bueno tenerlos controlados. 

Tengo pensado seguir agregando algunos criterios adicionales, al menos como indicadores, por ejemplo , que se listen cuantos objetos hacen referencia desde y hacia el objeto listado. 

Si alguien tiene algún otro indicador que quiera agregar y que sea implementable, me puede mandar un mail o poner un comentario y lo puedo agregar. 

Subi la version a Assembla y van a faltar unas semanas para que la suba al Marketplace, porque el armado de versiones para Ev2, y dos versiones para Ev3, me da bastante pereza.  



martes, 26 de mayo de 2015

View Last Navigation

Alejandro Rivoir hizo esta extension, para acercar las navegaciones a los objetos GeneXus. Para esto, define un nuevo tab en el editor de objetos, donde se puede ver la ultima navegacion sin tener que volver a especificar el objetos.


Esto es bueno para quienes desarrollan con Evolution 2. Aun no hay version para Evolution 3 y para la Salto, ya hay opciones para ver la navegacion sin tener que re-especificar el objeto.

Es una extensión recomendable.