PIENSOPIENSO - Que objetos tienen variables N(16)? (Posibles soluciones)
En PIENSOPIENSO - Que objetos tienen variables N(16)? planteaba uno de los problemas que se nos presento en las últimas semanas que creo que es típico de quienes desarrollan y mantienen aplicaciones con GeneXus.
La solución que nosotros hicimos fue:
1) Usando KBQuery consultar la tabla Variable para ver los objetos que tienen variables N(16)
Esto se hace corriendo el KBQuery y haciendo la consulta
select * from variable where MdlId=1 and VarTyp=4 and VarLen=16 and VarDec=0
MdlId=1 //Modelo de diseño
Vartyp=4 //Variable Numerica
VarLen=16 //Largo de la variable
VarDec=0 //Posiciones decimales de la variable.
Si la KB es grande (tiene muchos objetos) y tenemos muchas variables por objeto, la consulta puede demorar bastante. En nuestro caso, demoro menos de 5 minutos.
Salvamos el resultado de esta consulta en un archivo CVS (separado por comas) para procesarlo posteriormente.
Esta consulta, tiene la contra que devuelve únicamente los ObjId, o sea los identificadores internos de los objetos.
Para poder conocer el nombre de los mismos se puede hacer la consulta en KBQuery con la consulta
Select * from objects where MdlId=1
Esta consulta devuelve todos los objetos del modelo de diseño y salvando el resultado en otro archivo CVS.
Para lograr el nombre de los objetos lo que hicimos fue cargar ambos archivos en Excel y haciendo una planilla que busque el nombre de los objetos en la hoja de objetos, se puede obtener fácilmente la lista definitiva de objetos, que en nuestro caso fueron menos de 100. Luego estos objetos fueron revisados uno a uno, para ver cuales necesitaban correcciones.
Si hubiese sido mayor la cantidad de objetos, podríamos haber generado una lista de todos los objetos que acceden a la tabla VIAJES con el GXObjectsFromTable
y salvar dicha lista como un GXL y luego quedarse con los objetos comunes de ambas listas.
Otras soluciones:
2) Distribuir todos los objetos, abrir el xpz y salvar como XML.
Buscar en el XML las expresiones regulares que busquen:
GXObject *< /Name >
y
> 16< /Length >
> 0< /Decimals >
NO es trivial lograr expresiones regulares que busquen por strings que tengan símbolos ">" y "<".
Marcos hizo una vez un utilitario llamado BuscoEnDistribute que lo que hace es buscar en el xml y lista los objetos que tenga un string especifico.
3) Hacer un utilitario con GXPublic que lea todos los objetos de la KB que para cada uno de ellos busque las variables, listando las que nos interesan.
La solucion de David, esta muy buena también.
Bueno, seguramente se me escapen algunas otras soluciones mas elegantes.... Si alguien tiene alguna y quiere hacerla publica, estaría buenísimo para ir incrementando el conocimiento colectivo.
PD: Si fuera una KB en GeneXus X, tomaría los fuentes del KBDoctor, y modificaría el programa que revisa las variables no usadas en los objetos, para que liste todas las que tengan variables N(16).
La solución que nosotros hicimos fue:
1) Usando KBQuery consultar la tabla Variable para ver los objetos que tienen variables N(16)
Esto se hace corriendo el KBQuery y haciendo la consulta
select * from variable where MdlId=1 and VarTyp=4 and VarLen=16 and VarDec=0
MdlId=1 //Modelo de diseño
Vartyp=4 //Variable Numerica
VarLen=16 //Largo de la variable
VarDec=0 //Posiciones decimales de la variable.
Si la KB es grande (tiene muchos objetos) y tenemos muchas variables por objeto, la consulta puede demorar bastante. En nuestro caso, demoro menos de 5 minutos.
Salvamos el resultado de esta consulta en un archivo CVS (separado por comas) para procesarlo posteriormente.
Esta consulta, tiene la contra que devuelve únicamente los ObjId, o sea los identificadores internos de los objetos.
Para poder conocer el nombre de los mismos se puede hacer la consulta en KBQuery con la consulta
Select * from objects where MdlId=1
Esta consulta devuelve todos los objetos del modelo de diseño y salvando el resultado en otro archivo CVS.
Para lograr el nombre de los objetos lo que hicimos fue cargar ambos archivos en Excel y haciendo una planilla que busque el nombre de los objetos en la hoja de objetos, se puede obtener fácilmente la lista definitiva de objetos, que en nuestro caso fueron menos de 100. Luego estos objetos fueron revisados uno a uno, para ver cuales necesitaban correcciones.
Si hubiese sido mayor la cantidad de objetos, podríamos haber generado una lista de todos los objetos que acceden a la tabla VIAJES con el GXObjectsFromTable
y salvar dicha lista como un GXL y luego quedarse con los objetos comunes de ambas listas.
Otras soluciones:
2) Distribuir todos los objetos, abrir el xpz y salvar como XML.
Buscar en el XML las expresiones regulares que busquen:
GXObject *< /Name >
y
> 16< /Length >
> 0< /Decimals >
NO es trivial lograr expresiones regulares que busquen por strings que tengan símbolos ">" y "<".
Marcos hizo una vez un utilitario llamado BuscoEnDistribute que lo que hace es buscar en el xml y lista los objetos que tenga un string especifico.
3) Hacer un utilitario con GXPublic que lea todos los objetos de la KB que para cada uno de ellos busque las variables, listando las que nos interesan.
La solucion de David, esta muy buena también.
Bueno, seguramente se me escapen algunas otras soluciones mas elegantes.... Si alguien tiene alguna y quiere hacerla publica, estaría buenísimo para ir incrementando el conocimiento colectivo.
PD: Si fuera una KB en GeneXus X, tomaría los fuentes del KBDoctor, y modificaría el programa que revisa las variables no usadas en los objetos, para que liste todas las que tengan variables N(16).
Comentarios
Publicar un comentario
1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.