Características de GeneXus que vale la pena conocer: Dynamic Transaction (UNION)

Problema: Tengo una tabla de Operaciones, que tienen movimientos que son generados por otras operaciones, como pueden ser DUA, Líneas de Duas, Conocimientos, Lineas y se pone como Referencia en la tabla de operaciones. 


Como hacer un "integridad referencial" desde una tabla a varias tablas?. 




En la tabla de Operaciones, voy a tener unos atributos, LuciaRefTpo y LuciaRefID, que tiene el tipo y el identificado de la referencia. 

Esto se puede crear como un Dynamic Transaction, que es una transaccion que se le




y se hace el Data Provider asociada a la transacción. 


Los atributos con que armo la referencia son los campos claves de las demas tablas. 

Va a generar una vista en la base de datos, que hace la UNION de la concatenacion de la tablas. 



Luego, puede usarse como una tabla normal, con integridad referencial que chequea contra todas las tablas, haciendo que no se puedan grabar Operaciones, que no tengan una referencia valida. 

Y también se puede usar como lectura: 

for each
    msg(format('%1 - %2 ',LuciaRefTipo,LuciaRefID),status)
endfor


y que va a usar una vista que lee la UNION todas las tablas y la salida va a ser: 

"D:\Models\gx16\KBEjemplo\CSharpModel\web\bin\referencias.alistreferencias.exe"
CGCON - 2-0-30190006-2589-20200103-1    
CGCON - 2-0-30190010-2589-20200107-1    
CGCON - 2-0-30190011-2589-20200107-1    
CGCON - 2-0-30190012-2589-20200107-1    
CGCON - 2-0-30190013-2589-20200107-1    
CGCON - 2-0-30190014-2589-20200107-1    
CGCON - 2-0-30190015-2589-20200107-1    
CGCON - 3-0-30190016-2589-20200108-1    
CGCON - 3-0-30190018-2589-20200108-1    
CGLIN - 2-0-30190006-2589-20200103-1-1
CGLIN - 2-0-30190010-2589-20200107-1-1
CGLIN - 2-0-30190011-2589-20200107-1-1
CGLIN - 2-0-30190012-2589-20200107-1-2
CGLIN - 2-0-30190013-2589-20200107-1-1
CGLIN - 2-0-30190014-2589-20200107-1-3
CGLIN - 2-0-30190015-2589-20200107-1-1
CGLIN - 3-0-30190016-2589-20200108-1-1
CGLIN - 3-0-30190018-2589-20200108-1-111
DUA - 001-2020-000001
DUA - 003-2020-000002
DUA - 004-2020-000003
DUA - 012-2020-000004
DUALIN - 001-2020-000001-0001
DUALIN - 001-2020-000001-0002
DUALIN - 001-2020-000001-0003
DUALIN - 003-2020-000002-0001
DUALIN - 003-2020-000002-0002
DUALIN - 004-2020-000003-0001
DUALIN - 004-2020-000003-0002

Es un caso bastante común, tener que hacer referencias a varias tablas, por ejemplo, que motiva un asiento contable (ventas, compras, transferencias, sueldos, etc) , reclamos o quejas y varios mas. 

Esta forma de modelarlo, queda mas claro el modelo y facilita el diseño de  las consultas. Para agregar un nuevo tipo de referencias, alcanza con modificar el Dataprovider y no hay que cambiar el resto de la programación. 

Comentarios

  1. Hola Enrique, gracias por tu variante.
    Yo estoy aplicandola donde pueda...
    Me parece GENIAL, una de las mejores cosas de los últimos tiempos.

    Abrazo y Felicidades,
    gab

    ResponderBorrar

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.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.