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.
*OperacionID
EmpresaID
OperacionImporte
y quiero listar todas las Operaciones de Empresas Activas, usando Data Selectors.
Tengo 2 opciones:
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
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
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.