Como Crear y Usar un DataProvider
Paso 1: Crear y configurar el SDT
Primero necesitamos el “molde” donde el Data Provider va a volcar la información.
-
Crear el objeto: Ve a New Object -> Structured Data Type.
-
Nombre ejemplo:
SDT_Factura(Es buena práctica ponerle el prefijoSDT_para identificarlo rápido). -
Estructura: Este ejemplo esta hecho con una estructura de una cabecera y luego un subnivel collecion. Fíjate cómo la raíz contiene campos sueltos y luego un subnivel que agrupa las líneas:
SDT_Factura ├── FacturaId (Numeric) ├── FacturaFecha (Date) ├── ClienteNombre (Character) └── SDT_FacturaItem (Acá haces clic derecho -> 'Is Collection': True) ├── ProductoId (Numeric) ├── ProductoNombre (Character) └── LineaCantidad (Numeric) -
Propiedades clave del SDT:
-
No hay que tocar mucho más, solo asegúrate de que el nivel
Itemtenga el tilde en la columna de colección o la propiedad Is Collection = True.
-
Paso 2: Crear y configurar el Data Provider
Ahora creamos el motor que va a llenar ese SDT.
-
Crear el objeto: Ve a New Object -> Data Provider.
-
Nombre sugerido:
DP_ObtenerFactura(PrefijoDP_y un verbo que indique la acción). -
Propiedades CLAVE del Data Provider:
-
Output:
SDT_Factura(Esto es vital: le dice al DP qué tipo de dato debe devolver. Al poner esto, GeneXus te puede autocompletar la estructura en el código). -
Collection:
False(Porque queremos devolver UNA sola factura que adentro tiene líneas, no una lista de facturas).
-
-
Rules (Pestaña Rules): Para que el DP sepa qué factura buscar, le pasamos el ID por parámetro:
Fragmento de códigoparm(in:&FacturaId);
Paso 3: Escribir el código del Data Provider
Ve a la pestaña Source del Data Provider. La sintaxis es declarativa. Asumiendo que tenés las transacciones Factura y su nivel Facturaitem en la base de datos, el código queda así:
SDT_Factura
Where FacturaId = &FacturaId // Filtro para la cabecera
{
// 1. Cargamos la "estructura normal" (Cabecera)
FacturaId = FacturaId
FacturaFecha = FacturaFecha
ClienteNombre = ClienteNombre
// 2. Cargamos el subnivel que es Colección (Líneas)
Lineas
{
// 'Item' es el nombre del nivel en el SDT.
// 'Input' le dice qué tabla recorrer (GeneXus lo suele inferir, pero es buena práctica ponerlo)
SDT_Factura Input FacturaLinea
{
ProductoId = ProductoId
ProductoNombre = ProductoNombre
LineaCantidad = FacturaLineaCantidad
}
}
}
Nota: Fíjate que no hay ningún For Each. GeneXus automáticamente hace un For Each implícito de la cabecera por el Where FacturaId = &FacturaId, y otro For Each anidado para cargar cada Item de las líneas de esa factura.
Paso 4: Llamar al Data Provider desde un Web Panel
Ahora vamos a consumir ese Data Provider, por ejemplo, en el evento Start o Enter de un Web Panel (como podría ser un paso de tu Wizard).
-
Definir Variables en el Web Panel:
-
&Factura-> Basada en el tipo de datoSDT_Factura. -
&FacturaId-> Numeric (el ID de la factura que querés buscar).
-
-
Código en la pestaña Events:
Event 'CargarDatos'
// Supongamos que queremos cargar la factura número 10
&FacturaId = 10
// Llamada mágica: La variable SDT recibe el resultado del DP directamente
&Factura = DP_ObtenerFactura(&FacturaId)
// A partir de acá, ya tenés la variable &Factura cargada en memoria.
// Podés usarla para mostrarla en pantalla, guardarla en Session, o recorrerla:
Msg("El cliente es: " + &Factura.ClienteNombre)
// Ejemplo de cómo recorrer la colección que devolvió el DP
For &Linea in &Factura.SDT_Facturaitem Msg("Producto: " + &Linea.ProductoNombre + " - Cantidad: " + &Linea.LineaCantidad.ToString()) EndFor EndEvent