Dr. Gavilan: Como borrar atributos no referenciados en KB GeneXus 7.0
Estimado Dr. Gavilan:
Le escribo pues tengo un "pequeño inconveniente".
En la empresa en la que estoy trabajando ahora el sistema principal aun se mantiene con GeneXus 7.0 (WIN, VFP, DB2). El problema que tenemos ahora es que estamos llegando al límite de 9999 atributos en la KB de producción y es necesario solucionar este tema urgentemente.
Mi idea es eliminar todos los atributos que no se estén usando en ninguna tabla para luego poder distribuir y consolidar todo en una nueva KB y así eliminar esos "huecos" para crear espacio para los nuevos atributos.
En definitiva, alguien tiene que ir atributo por atributo viendo si el mismo está siendo usado en algun lugar, eso no sería gran problema si no estuviéramos hablando de mas de 9900 atributos......
¿ y adivine quien salió sorteado para realizar tan interesante trabajo ?...... la respuesta parece mas que obvia......... son las desventajas de ser "El Nuevo".
Por eso escribo esta consulta, para saber si tiene alguna herramienta para hacer este trabajo un poco menos engorroso. No estoy muy contento con esta "divertida" tarea que me asignaron.
Desde ya les agradezco cualquier ayuda que me pueda brindar.
===================================================================
Estimadísimo bloglector:
Las opciones que tenes son
a) Desarrollar una aplicación con GXPublic que lea la tabla de atributos (Atribute) y luego revise si dicho atributo esta en alguna tabla (TblAtt). Si el atributo no esta en ninguna tabla, puede verse en que objeto esta siendo referenciado.
Si no esta referenciado en ningun lado, puede borrarse.
Si esta referenciado, puede tener alguna variable basada en ellos y debería ser cambiado y luego borrado.
Las opciones que tenes son
a) Desarrollar una aplicación con GXPublic que lea la tabla de atributos (Atribute) y luego revise si dicho atributo esta en alguna tabla (TblAtt). Si el atributo no esta en ninguna tabla, puede verse en que objeto esta siendo referenciado.
Si no esta referenciado en ningun lado, puede borrarse.
Si esta referenciado, puede tener alguna variable basada en ellos y debería ser cambiado y luego borrado.
b) Con GeneXus directamente.
0) Hacer un backup de la KB que se quiere arreglar (KBVieja)
1) Crear una KBNueva vacia con las mismas propiedades tanto en diseño
como en prototipo con la KB Vieja, exportando las propiedades.
2) Copiar el directorio kbdata de la KBVieja a la KBNueva (por si
tenes webservices y demas)
3) Distribuir todas las transacciones (solo las transacciones) desde
la KBVieja y la consolido en la KBNueva. Solucionar todos los errores
de consolidacion y normalizacion que den. Estos son los todos los
atributos que deberían usarse.
4) Comparar que la estructura de la base de datos, sea EXACTAMENTE
IGUAL entre la KBVieja y la KBNueva. Comparar nombres de tablas y
nombres de atributos. Para esto pueden usarse herramientas propias de la base de datos.
5) Desmarcar de KBVieja todos los objetos main no usados.
6) Distribuir todos los objetos main + add called de la KBVieja y
consolidarlos en la KBNueva. Corregir los errores de cosolidaciones en
la KBVieja y volver a distribuir los objetos modificados y volver a
consolidarlos. Los objetos que usen atributos que no existan, van a dar errores.
Con esto te quedarian solo los atributos que tienen tablas y los que son usados por los objetos.
1) Crear una KBNueva vacia con las mismas propiedades tanto en diseño
como en prototipo con la KB Vieja, exportando las propiedades.
2) Copiar el directorio kbdata de la KBVieja a la KBNueva (por si
tenes webservices y demas)
3) Distribuir todas las transacciones (solo las transacciones) desde
la KBVieja y la consolido en la KBNueva. Solucionar todos los errores
de consolidacion y normalizacion que den. Estos son los todos los
atributos que deberían usarse.
4) Comparar que la estructura de la base de datos, sea EXACTAMENTE
IGUAL entre la KBVieja y la KBNueva. Comparar nombres de tablas y
nombres de atributos. Para esto pueden usarse herramientas propias de la base de datos.
5) Desmarcar de KBVieja todos los objetos main no usados.
6) Distribuir todos los objetos main + add called de la KBVieja y
consolidarlos en la KBNueva. Corregir los errores de cosolidaciones en
la KBVieja y volver a distribuir los objetos modificados y volver a
consolidarlos. Los objetos que usen atributos que no existan, van a dar errores.
Con esto te quedarian solo los atributos que tienen tablas y los que son usados por los objetos.
Dr. Gavilan
Nota: Si la KB estuviera en GeneXus X, esto podría solucionarse en forma mas fácil con KBDoctor.
Estimado Dr:
ResponderBorrarEl problema de la opción b) es que al distribuir los objetos main + add called no se incluyen los objetos que son llamados mediante call dinamicos los cuales en mi caso son muchos y en muchos lugares distinto de mis sistema.
Sin duda la opción a) fue una gran ayuda haciendo el trabajo realmente sencillo. A sus comentarios yo agregaria
1) Checkear que no esten en ningun dataview.
2) Chequear que no esten en ningun grupo de subtipos. En caso de que ninguno de los atributos del grupo de subtipos se este usando, borrar el grupo de subtipos directamente.
3) para los atributos que no estan en ninguna tabla/transacción y que se esten referenciando en algun lugar, mostrar un reporte con el Atributo, tipo de objeto que lo referencia, Nombre del objeto que lo referencia, lugar donde se referencia.
Lamentablemente no logre eliminar informacion de la KB con GxPublic 7.5 que es la version con la que logré conectarme a la KB.
Saludos y gracias por su invalorable ayuda.
Estimadisimo Diego:
ResponderBorrarPara el manejo de calls dinamicos, muchas veces se cuentan con los programas que pueden ser llamados dinamicamente en algun tipo de metadata (tabla de la base de datos, archivo de configuracion, etc).
Con esta lista de programas, es facil hacer UN PROCEDURE, que los llame a todos, y marcar dicho procedimiento como main.
Muchas veces se le pone alguna condicion como
If &A = &A + 1
Call(Dinamico1)
Call(Dinamico2)
...
Endif
y se soluciona el problema que tenias.
Dicho programa tambien es util para compilar todos los programas que son invocados en forma dinamica desde GeneXus, aunque si tienen parametros pueden dar errores al linkeditar (depende del lenguaje que estes generando).
Gracias por sus aportes.
Porque no ir a Diseño / Advanced / Atribute, pararse en el primer atributo y darle con la flecha hacia abajo mirando cuando se "prende" el botón Remove.
ResponderBorrarCuando se prende ir un poco hacia atras y ver cual/cuales son los atributos a borrar.
No creo que te lleve mas de 1 hora.
Anonimo:
ResponderBorrarEs posible hacer lo que tu dices siempre y cuando el atributo no este referenciado por nadie.
Si algun objeto lo utiliza, no lo podes borrar.
Creo que el boton de Remove que se habilita cuando el Att no esta referenciado, fue en una version posterior a la 7.0 que fue implementado.
Enrique:
ResponderBorrarEn la version 7 ya está implementada dicha funcionalidad.
El tema es que de esa manera tenia que hacerlo uno por uno, no solamente eso, tengo KB de testing y KB de producción por lo cual lo tenia que hacer 2 veces.
Ademas era mucho mas divertido aprender a usar GXPublic para mi al menos, sin contar que con pequeños agregados pude obener de forma clara cierta información que necesitaba de la KB.
Saludos.