Como Crear y Usar un DataProvider

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.

  1. Crear el objeto: Ve a New Object -> Structured Data Type.

  2. Nombre ejemplo: SDT_Factura (Es buena práctica ponerle el prefijo SDT_ para identificarlo rápido).

  3. 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)
    
  4. Propiedades clave del SDT:

    • No hay que tocar mucho más, solo asegúrate de que el nivel Item tenga 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.

  1. Crear el objeto: Ve a New Object -> Data Provider.

  2. Nombre sugerido: DP_ObtenerFactura (Prefijo DP_ y un verbo que indique la acción).

  3. 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).

  4. Rules (Pestaña Rules): Para que el DP sepa qué factura buscar, le pasamos el ID por parámetro:

    Fragmento de código

     
    parm(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í:

Fragmento de código

 
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).

  1. Definir Variables en el Web Panel:

    • &Factura -> Basada en el tipo de dato SDT_Factura.

    • &FacturaId -> Numeric (el ID de la factura que querés buscar).

  2. Código en la pestaña Events:

Fragmento de código

 
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
Deja un comentario 0

Your email address will not be published. Campos requeridos marcados *