Características de Genexus que vale la pena conocer: DataSelectors con USING o IN

Los Data Selectors con objetos GeneXus que permiten almacenar condiciones (WHERE) y formas de ordenar (ORDER BY) de forma que puedan ser reutilizados en varios objetos. 


Tienen varias ventajas: 
* El código queda mas fácil de leer y se escribe menos
* Encapsulan conceptos, como podría ser DOCUMENTO_ACTIVO (que tuviera un ESTADO <> 'ANU') y podria usarse en todos los lugares donde solo se necesitan los DOCUMENTOS no anulados. 
* Centralizan el código, por ejemplo, si se necesita cambiar el concepto de DOCUMENTO_ACTIVO, se cambia solo el data selector y todos los objetos que lo usan, van a ver reflejado el cambio en las condiciones. 

Una opción poco conocida de los data selector es que permiten usarse con USING (con lo cual agregan sus condiciones lo que se tenga el for each) o con IN, con el cual se hace una subconsulta para resolver la consulta. 

Por ejemplo, si tengo la tabla 
Empresa
*EmpresaID
EmpresaActiva

Defino un Data Selector EmpresasActivas con la condición


Operaciones
*OperacionID
EmpresaID
OperacionImporte

y quiero listar todas las Operaciones de Empresas Activas, usando Data Selectors. 

Tengo 2 opciones: 

1) CON USING




Esto genera un JOIN entre las dos tablas: 



que hace este join en SQL

SELECT T2.[EmpresaActiva], T1.[OperacionImporte], T1.[EmpresaID], T1.[OperacionesID] 
FROM ([Operaciones] T1 INNER JOIN [Empresas] T2 ON T2.[EmpresaID] = T1.[EmpresaID]) 
WHERE T2.[EmpresaActiva] = 1 
ORDER BY T1.[OperacionesID] 

2) Usando IN



que tiene la navegación



y genera el código SQL

SELECT [EmpresaID], [OperacionImporte], [OperacionesID] FROM [Operaciones] 
WHERE [EmpresaID] IN ( 
                      SELECT V2000.[EmpresaID] FROM (
                                                      SELECT [EmpresaID], [EmpresaActiva] FROM [Empresas] WHERE [EmpresaActiva] = 1
                                                    ) 
                      V2000                                                 
                     ) 
ORDER BY [OperacionesID] 

Se puede ver que como usando el mismo Data Selector y con la misma funcionalidad (los dos for each listan exactamente los mismos registros) se puede generar código SQL  bien diferente. 

Los Data Selectors se pueden usar en Grillas, en For Each, dentro de Data Providers. 

Extraer DataSelector desde condiciones WHERE


Para facilitar la creación de Data Selector a partir de código que ya existe, se pueden usar la lsiExtensiones y la opción (con el código del where/order seleccionado)

LsiExtensions / Code / Extract selected code to new Data Selector


y esto va a crear un nuevo objeto data selector con dicha condicion y con parametros. 

Los Data Selectors son objetos que deberia ser mas usados, pues son muy potentes. 

Comentarios

Entradas más populares de este blog

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

Aplicación monolítica o distribuida?

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