VB.NET - Exibindo valores de tabelas relacionadas

Neste artigo você vai aprender como exibir em um datagrid valores de uma tabela filha relacionada com uma tabela pai.

Vai aprender também a calcular valores agregados e exibir os valores em colunas do datagrid.

 

Para você entender melhor vamos usar duas tabelas presentes no banco de dados Northwind.mdb , as tabelas : Orders e Orders Details.

 

tabela - Orders tabela - Order Details

 

Se você tem uma pequena noção sobre banco de dados relacionais vai perceber que existe um relacionamento entre as duas tabelas que pode ser feito pelo campo OrderId , abaixo estou exibindo o tipo de relacionamento existente : um para muitos:

 

Relacionamento entre a tabela Orders e Orders Details

Tipo - um-para-muitos

Para um pedido pode existir muitos detalhes de pedidos

campo de relacionamento - OrderId

 

Vamos criar um projeto no VS.NET do tipo Windows Application onde no formulário iremos usar um controle DataGrid para exibir o relacionamento Pai-Filho e os valores totalizados para cada linha do relacionamento.

 

Os passos que iremos efetuar para obter o resultado são:

 

1- Vamos criar um DataSet contendo a tabela Orders e Orders Details e vamos criar um relacionamento entre estas tabelas.

 

2- Em seguida vamos criar uma expressão que será incluída na tabela Orders Details para calcular o preço de cada linha.

 

3- Os valores agregados para o preço total do pedido e o número de linhas de Orders Details são incluidos na tabela Orders.

 

4- Ao final vinculamos a visão padrão da tabela Orders ao datagrid para exibir o resultado.

 

Você pode criar colunas agregadas em uma tabela para exibir informação sumário para um registro filho.

 

Quando um DataRelation existe entre uma tabela Pai e uma tabela Filha em um DataSet você pode fazer referencia a um registro da tabela filha usando o prefixo Child. para o nome da coluna na tabela filha.

 

No código abaixo usamos COUNT(Child.ProductID) para retornar o número de registros filhos de Order Details para o registro da tabela pai Order.

 

Os imports usado no projeto são:

 

Imports System

Imports System.Data

Imports System.Data.OleDb

 

Declaramos as seguintes variáveis no início do formulário:

 

' constantes para os nomes das tabelas

Private TABELA_PEDIDOS As [String] = "Orders"

Private TABELA_DETALHES_PEDIDOS As [String] = "OrderDetails"
 

' constante para o relacionamento

Private RELACAO_PEDIDOS_DETALHES_PEDIDOS As [String] = "relacao_Pedidos_DetalhesPedidos"
 

' constante para o campo

Private CAMPO_PEDIDOID As [String] = "OrderID"

 

O código do evento Click do botão de comando - Processar - é o seguinte :

 

 Private Sub btnProcessar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcessar.Click

        Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\teste\Northwind.mdb"
        Dim ds As New DataSet
        Dim da As OleDbDataAdapter

        ' preenche a tabela Order e a inclui no  DataSet
        da = New OleDbDataAdapter("SELECT * FROM Orders", conn)
        Dim orderTable As New DataTable(TABELA_PEDIDOS)
        da.Fill(orderTable)
        ds.Tables.Add(orderTable)

        ' preenche a tabela OrderDetails e a inclui no dataset
        da = New OleDbDataAdapter("SELECT * FROM [Order Details]", conn)
        Dim orderDetailTable As New DataTable(TABELA_DETALHES_PEDIDOS)
        da.Fill(orderDetailTable)
        ds.Tables.Add(orderDetailTable)
        ' cria um realcionamento entre as tabelas
        ds.Relations.Add(RELACAO_PEDIDOS_DETALHES_PEDIDOS, ds.Tables(TABELA_PEDIDOS).Columns(CAMPO_PEDIDOID), _ 
ds.Tables(TABELA_DETALHES_PEDIDOS).Columns(CAMPO_PEDIDOID), True)

        ' cria a expressão para calculo do total da linha
        orderDetailTable.Columns.Add("Total_Detalhe_Pedido", GetType([Decimal]), "(Quantity * UnitPrice) * (1-Discount)")
        ' cria os valores agregados de OrderDetails na tabela Pedido
        orderTable.Columns.Add("Detalhe_Pedido_Qtde", GetType(Integer), "COUNT(Child.ProductId)")
        orderTable.Columns.Add("Pedido_Total", GetType([Decimal]), "SUM(Child.Total_Detalhe_Pedido)")

        ' Vincula o dataset ao datagrid
        dgValores.DataSource = ds.DefaultViewManager
        'dgValores.DataSource = ds.Tables(TABELA_PEDIDOS)
        dgValores.DataMember = TABELA_PEDIDOS

    End Sub

 

 

Executando o projeto teremos o seguinte resultado:

 

Exibindo a tabela Orders e o relacionamento criado com a tabela Order Details
Calculando e exibindo os valores de cada linha da tabela Order Details

Pegue o projeto aqui : valoresAgregados.zip

Aguarde mais artigos VB.NET 


José Carlos Macoratti