Uso de DataBinding

Maestro - Detalle: Empleados - Órdenes 

Fecha: 03/Jul/2005 (30 de Junio de 2005)
Autor: Ing. Fernando Luque Sánchez   -  DCE 4 Estrellas

[email protected]

 

Sres. Desarrolladores, en esta ocasión mi aporte intenta orientar en el uso de la propiedad  DataBinding, la cual contiene información sobre una expresión de enlace a datos usando tecnología RAD (Rapid Application Developer). Esta clase no se puede heredar.

Información adicional de RAD en los siguientes enlaces:
http://www.linux.org.pe/ldd2005/ldd2005-php5_xul-clever-flores.pdf
http://www.ldc.usb.ve/~vtheok/cursos/ci3711/apuntes/99-01-14/Info/Modelo RAD.htm
http://buscador.hispavista.es/rad/

Los controles que con regularidad se utilizan en aplicaciones  Windows así como en aplicaciones Web tienen la propiedad DataBinding, es necesario configurar la propiedad de cada control que contendrá en enlace a los datos, luego para administrar esta se debe utilizar la propiedad BindingContext de la clase contenedora. Al usar el BindingContext obtiene el BindingManagerBase que mantiene sincronizados todos los controles enlazados al mismo origen de datos, se puede utilizar la propiedad Position del BindingManagerBase para especificar el elemento actualmente seleccionado de una lista.

Por ejemplo, para enlazar una caja de texto con el campo FirsName de la Tabla Empleados (dtEmpleados) contenida en una DataSet previamente definido utilizo la siguiente instrucción:

txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName")

Luego para administrar por ejemplo la posición actual o lo que es lo mismo el registro activo se utiliza la siguiente instrucción:

Me.BindingContext(dtEmpleados).Position = 0

Note en la instrucción anterior que se utiliza ña propiedad BindingContext del formulario, como lo dicho en líneas arriba, la propiedad Position va a mantener sincronizados todos los controles enlazados al DataTable dtEmpleados.

 NUESTRO EJEMPLO

El ejemplo muestra un formulario donde aparecen los Empleados (Tabla Employees), el Total de sus ventas, las Órdenes Registradas (Tabla Oders) por el Empleado y el Detalle de las mismas (Tabla Order Details). La Base de datos es Northwind.

Se ha utilizado un  SQLDataAdapter, definido mediante código, para generar los comandos SQL se ha utilizado un SQLCommandBuilder, luego al SQLDataAdapter cambiamos el SQLCommand Select para poder llenar los DataTables.

Las órdenes Select para nuestro ejemplo son las siguientes:

1. Para poder llenar el DataTable de Órdenes:

/*ID de la Orden, Total, Id Empleado, la Fecha y el Nombre de la Compañía*/

SELECT od.OrderID, SUM(CONVERT(money, (od.UnitPrice * od.Quantity) * (1 - od.Discount) / 100) * 100) 
      AS Total, o.EmployeeID, o.OrderDate, c.CompanyName
      FROM [Order Details] od 
      INNER JOIN Orders o 
      ON od.OrderID = o.OrderID
      INNER JOIN Customers c 
      ON o.CustomerID = c.CustomerID
      GROUP BY od.OrderID, o.EmployeeID, o.OrderDate, c.CompanyName

2. Para llenar Total de las ventas creamos un DataTable con el Id del Empleado y el valor total de las Órdenes.

/*ID del Empleado y el Total de sus ventas*/
SELECT e.employeeid, sum(UnitPrice * Quantity) 
      As SalesToDate 
      FROM [order details] od 
      INNER JOIN orders o 
             ON o.orderid = od.orderid 
                  INNER JOIN employees e 
                  ON e.employeeid = o.employeeid
      GROUP BY e.employeeid

3. Para llenar el DataTable de Detalle de las órdenes:

/*Orden select para el Detalle de las órdenes Extrae:
ID de la Orden, Precio, Cantidad, Descuento, Nombre Producto
nombre de Categoía y Subtotal*/
SELECT od.OrderID, od.UnitPrice, od.Quantity, od.Discount, p.ProductName, c.CategoryName, (od.UnitPrice * od.Quantity)
      As SubTotal 
      FROM [order details] od 
      INNER JOIN Products p ON od.ProductID = p.ProductID 
      INNER JOIN Categories c ON c.CategoryID = p.CategoryID 
      ORDER BY od.OrderID

Las instrucciones Select anteriores puedes copiarlas al Query Analyzer de SQL Server usando la base de datos Northwind para ver los resultados, es obvio que todos los lectores conocen de la sintaxis y del uso de Transac SQL.

En el ejemplo se han incluído cuatro DataTable y tres Vistas, con las siguientes órdenes asigno los DataTables creados a variables y especifico el origen de las Vistas creadas.

    'Asignar los DataTables a las Variables definidas
        dtEmpleados = dsDatos.Tables("Empleados")
        dtOrdenes = dsDatos.Tables("Ordenes")
        dtVentas = dsDatos.Tables("Ventas")
        dtDetalle = dsDatos.Tables("Detalle")

          'Especificar las Vistas
        dvOrdenes = dtOrdenes.DefaultView
        dvVentas = dtDetalle.DefaultView
        dvDetalle = dtDetalle.DefaultView

Luego se agregan los DataBindings para los controles y conseguimos mantener enlazados y sincronizados los controles.

A continuación sigue código en Visual Basic:

El siguiente es una porción del código, intento mostrar la zona de declaraciones para que se den cuenta de los datos definidos:

Public Class frmPrincipal
    Inherits System.Windows.Forms.Form  

    'Definición de los elementos a utilizar la cadena de conexión
    Dim vcadenaCon As String = _
        "workstation id=HOME;packet size=4096;user id=fernnado; integrated security=SSPI;data source=(local);persist security info=False;initial catalog=Northwind"

    'El DataSet, las Tablas y las Vistas.
    Dim dsDatos As DataSet
    Dim dtEmpleados As DataTable
    Dim dtOrdenes As DataTable
    Dim dtDetalle As DataTable
    Dim dtVentas As DataTable

    'Las vistas
    Dim dvOrdenes As DataView
    Dim dvDetalle As DataView
    Dim dvVentas As DataView

    'El SQLDataAdapter
    Dim daDatos As SqlDataAdapter

.....

Al cargar el formulario se ejecuta lo siguiente:

Private Sub CargarForm(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
        'Crear y llenar el DataSet
        CrearDataSet()
        'Enlazar los controles al DataSet
        IniciarBinding()
        LlenarGridOrdenes()
        LlenarGridDetalle()
        MostrarRegistro()
       End Sub

El procedimiento para crear y añadir los DataBindings a los controles es como sigue:

Private Sub iniciarbinding()
        'Las cajas de texto
        txtNombre.DataBindings.Add("Text", dtEmpleados, "FirstName")
        txtId.DataBindings.Add("Text", dtEmpleados, "EmployeeID")
        txtApel.DataBindings.Add("Text", dtEmpleados, "LastName")
        txtDire.DataBindings.Add("Text", dtEmpleados, "Address")
        txtCiudad.DataBindings.Add("Text", dtEmpleados, "City")
        txtTotal.DataBindings.Add("Text", dtVentas, "TotalVentas")  

        'Controlador para actualizar los grids al cambiar el registro activo
        AddHandler Me.BindingContext(dtEmpleados).PositionChanged, AddressOf CambioPosicion
End Sub

Para que puedas ejecutar el ejemplo baja el código fuente al final del artículo y actualiza tu cadena de conexión, no te olvides de calificarme en PanoramaBox, si lo haces me das los puntos que me incentiva seguir publicando. Suerte a todos y A SEGUIR DESARROLLANDO....cualquier consulta por correo.

Ing. Fernando Luque Sánchez
CIP 61806
Trujillo - Perú


Espacios de nombres usados en el código de este artículo:

System.Data
System.Data.SQLClient


Fichero con el código de ejemplo: FernandoLuque_DataBindings.zip - Tamaño 10 KB


ir al índice