Compartir la base de datos de aplicación GeneXus (15).
Es común que las aplicaciones GeneXus tengan que compartir parte de la base de datos con otras herramientas.
Algunas de los utilitarios o herramientas que me he encontrado en diferentes instalaciones son:
* Generadores de Reportes
* Generadores de consultas de BI
* Herramientas de Auditoria
* Tablas dinamicas que lea directamente de la base de datos
* Aplicaciones de terceros que graban o leen alguna tabla del sistema.
Algunas de estas herramientas, soportan el uso de web services, con lo cual se pueden definir dicho servicios y publicarlos, con lo que la interfaz de la aplicación queda bien definida y conocida.
Cuando hacemos algun cambio en GeneXus, nos tenemos que asegurar de no cambiar si querer alguno de estos servicios y es relativamente facil hacerlo con un comparador de WSDL o REST.
Cuando las aplicaciones estan pensadas para usar directamente tablas en la base de datos, el problema es un poco mas complicado de resolver.
Formalizando el problema, seria mas o menos asi:
Tengo una KB que tiene una transaccion de Documentos y Lineas de Documentos. Se tiene una herramienta de BI, que crea cubos para estos documentos y permite analizar por producto, empresa, pais, etc.
Cuando hago un cambio en GeneXus, algunas veces las consultas dejan de funcionar porque se modifica la base de datos.
Solución 1: Crear una vista en la base de datos que haga el join entre Documentos y Lineas de Documentos y hacer que las consultas apunten a dicha View.
Esta solucion es buena, pero los desarrolladores Genexus siguen sin tener claro que existe algo externo que esta usando dichas tablas. Por ejemplo, si renombran la tabla Documentos a Docs, todo va a seguir funcionando bien en Genexus después de un build all, pero la vista va a quedar invalida o va a cancelar la reorganización.
Solución 2: Con GeneXus 15, tenemos la opción de hacer un vista con un Transaccion Dinamica (**)
Se debe definir un objeto Transaction común, y se le pone en las propiedades
Al salvar, aparece un nuevo objeto derivado de la transacción, que tiene el nombre de la transacción y un sufijo _DataProvider.
Los nombres de los atributos que usemos, tienen que ser diferentes al del resto de las transacciones y eso tiene como ventaja que podemos usarlo para mostrar nombres de campos mas entenibles por el usuario final y no los que se usan a la interna de la KB.
El DataProvider, tendrá que tener el mapeo entre las tablas reales y lo que queremos publicar.
API_DocumentosCollection
{
API_Documentos
{
DocumentosID = DocId
DocumentoFecha = DocFch
ProductoId = ProdId
ProductoNombre = ProdNom
EmpresaNombre = EmpNom
EmpresaId = EmpId
Cantidad = PrdCnt
PrecioUnitario = PrdPrcUni
ImporteLinea = PrdPrcLinea
}
}
De esta forma se le puede dar al usuario acceso a dicha vista para que accedan a la base de datos de forma controlado. Cuando se realiza una reorganización que cambia la vista, podemos
De esta forma los desarrolladores GeneXus tienen presente cuales son las tablas accedidas desde otras aplicaciones, lo cual permite detectar errores antes que se produzcan en producción.
** Dynamic Transaction es un nombre que no me gusta, pues no es representativo. No es ni dinámico, ni es una transacción de la base de datos. Me hubiese gustado mas aprovechar la oportunidad para dejar de usar el nombre de Transaction para este tipo de objetos.
Algunas de los utilitarios o herramientas que me he encontrado en diferentes instalaciones son:
* Generadores de Reportes
* Generadores de consultas de BI
* Herramientas de Auditoria
* Tablas dinamicas que lea directamente de la base de datos
* Aplicaciones de terceros que graban o leen alguna tabla del sistema.
Algunas de estas herramientas, soportan el uso de web services, con lo cual se pueden definir dicho servicios y publicarlos, con lo que la interfaz de la aplicación queda bien definida y conocida.
Cuando hacemos algun cambio en GeneXus, nos tenemos que asegurar de no cambiar si querer alguno de estos servicios y es relativamente facil hacerlo con un comparador de WSDL o REST.
Cuando las aplicaciones estan pensadas para usar directamente tablas en la base de datos, el problema es un poco mas complicado de resolver.
Formalizando el problema, seria mas o menos asi:
Tengo una KB que tiene una transaccion de Documentos y Lineas de Documentos. Se tiene una herramienta de BI, que crea cubos para estos documentos y permite analizar por producto, empresa, pais, etc.
Cuando hago un cambio en GeneXus, algunas veces las consultas dejan de funcionar porque se modifica la base de datos.
Solución 1: Crear una vista en la base de datos que haga el join entre Documentos y Lineas de Documentos y hacer que las consultas apunten a dicha View.
Esta solucion es buena, pero los desarrolladores Genexus siguen sin tener claro que existe algo externo que esta usando dichas tablas. Por ejemplo, si renombran la tabla Documentos a Docs, todo va a seguir funcionando bien en Genexus después de un build all, pero la vista va a quedar invalida o va a cancelar la reorganización.
Solución 2: Con GeneXus 15, tenemos la opción de hacer un vista con un Transaccion Dinamica (**)
Se debe definir un objeto Transaction común, y se le pone en las propiedades
Al salvar, aparece un nuevo objeto derivado de la transacción, que tiene el nombre de la transacción y un sufijo _DataProvider.
Los nombres de los atributos que usemos, tienen que ser diferentes al del resto de las transacciones y eso tiene como ventaja que podemos usarlo para mostrar nombres de campos mas entenibles por el usuario final y no los que se usan a la interna de la KB.
El DataProvider, tendrá que tener el mapeo entre las tablas reales y lo que queremos publicar.
API_DocumentosCollection
{
API_Documentos
{
DocumentosID = DocId
DocumentoFecha = DocFch
ProductoId = ProdId
ProductoNombre = ProdNom
EmpresaNombre = EmpNom
EmpresaId = EmpId
Cantidad = PrdCnt
PrecioUnitario = PrdPrcUni
ImporteLinea = PrdPrcLinea
}
}
y creó una vista
De esta forma se le puede dar al usuario acceso a dicha vista para que accedan a la base de datos de forma controlado. Cuando se realiza una reorganización que cambia la vista, podemos
De esta forma los desarrolladores GeneXus tienen presente cuales son las tablas accedidas desde otras aplicaciones, lo cual permite detectar errores antes que se produzcan en producción.
** Dynamic Transaction es un nombre que no me gusta, pues no es representativo. No es ni dinámico, ni es una transacción de la base de datos. Me hubiese gustado mas aprovechar la oportunidad para dejar de usar el nombre de Transaction para este tipo de objetos.
O sea que hace una reorg en la BD creando una vista??
ResponderBorrarSi hace una reorg y hace una vista.
BorrarEsto permite que los demas externos a GeneXus la usen y desde dentro de la aplicacion tenemos definido la interfaz entre la Genexus y el resto de las aplicaciones.
Parece una bobada, pero ordena mucho.
De mas esta decir que se pueden agregar sum(), avg() y diversas formulas, para poder tener acumulados.