NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!
UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI
Olá Pessoal,
Mais novidades para vocês. Dando continuidade aos conceitos do ADO.net para o acesso a dados, conheceremos o Dataset.
Podemos dizer que o Dataset é um banco de dados virtual, onde a estrutura é alocada em memória, o que permite uma melhor dinâmica no gerenciamento e controle de grande quantidade de dados.
Um único Dataset permite adicionar várias Tabelas. Estas tabelas podem vir de uma fonte de dados existente, como por exemplo, a tabela Clientes do banco de dados Northwind, ou pode ser criada através do próprio código. A nossa seqüência de tutoriais sobre Dataset irá abordar estes dois modos.
Objetivo : O objetivo deste tutorial é mostrar como construir uma aplicação com acesso a dados através do ADO.net e controle de dados através do Dataset.
Como vamos precisar de um banco de dados, iremos utilizar o Northwind com o Access.
Abra o WebMatrix e adicione um Datagrid instanciado como dgMaster e outro instanciado como dgDetalhes. Formate-o como desejar, veja:
Nesta aplicação exibiremos os pedidos no dgMaster e os detalhes destes pedidos, como os produtos que pertencem a cada pedido, serão exibidos no dgDetalhes. Para isto teremos que incluir um botão de seleção ao dgMaster. Selecione-o e na guia de propriedades clique no link Property Builder, como mostrado abaixo:
Vá na guia Columns, expanda as opções de Button Column, selecione o botão do tipo Select e clique no botão adicionar. No campo Header Text escreva “Detalhes”. No campo Text escreva apenas o sinal “+”. No Button type escolha o tipo PushButton. Veja como ficou:
Clique em Ok.
Agora já estamos prontos para adicionar o código da aplicação.
Importe as seguintes classes.
System.Data
System.Data.OleDB
Declare a variável global que servirá para armazenar a string de conexão.
Public banco as string=”Provider=Microsoft.Jet.OleDb.4.0;Data Source=” & Server.MapPath(“Northwind.mdb”)
A primeira rotina a ser criada é a rotina PopulaMaster, que vai popular o Datagrid dgMaster assim que a página for carregada. Acompanhe o código detalhado desta rotina.
Analisando o código acima:
Dim strSql as new System.Text.StringBuilder()
Uma das novidades é o objeto StringBuilder. Ele é utilizado para concatenar strings de grande comprimento, com menos processamento. Para adicionar strings a este objeto, utiliza-se o método Append.
Dim adp as new OleDbDataAdapter(strSql.ToString(),conn)
O trecho acima cria um objeto do tipo DataAdapter, que serve para conectar a fonte de dados, através da consulta SQL. Sempre que for preciso preencher um Dataset com uma fonte de dados já existente, é necessário utilizar o DataAdapter.
Dim ds as new Dataset()
Instancia um novo objeto do tipo Dataset
adp.Fill(ds,"Pedidos")
O método Fill, do DataAdapter, serve para associar a consulta SQL a uma novatabela do Dataset. Para isso, é necessário informar o Dataset a ser utilizado e o nome da tabela que armazenará a consulta.
dgMaster.DataKeyField="NúmeroDoPedido"
dgMaster.DataSource=ds.Tables("Pedidos")
dgMaster.DataBind()
A propriedade DataKeyField do Datagrid permite associar a chave-primária da consulta. Utilizamos esta propriedade sempre que precisarmos fazer consultas através de dados relacionados, como este caso
A propriedade DataSource está vinculada à tabela Pedidos, que pertence ao Dataset ds.
Por fim, o Datagrid é renderizado na página através do método DataBind
Agora, vamos ao código da rotina PopulaDetalhes, acompanhe:
O código acima é muito parecido com o anterior. Vamos destacar apenas a um trecho:
If dgMaster.SelectedIndex>-1 then
Nestre trecho verificamos se existe algum registro selecionado no dgMaster, caso contrário, o código que está abaixo não será executado.
Devemos dar atenção para um detalhe. Esta rotina deve receber um parâmetro que será Número do Pedido do registro selecionado no dgMaster. Para chamarmos esta rotina, faça o seguinte:
Selecione o Datagrid dgMaster. Na guia de Propriedades, clique no botão Eventos e dê um duplo clique no evento SelectedIndexChanged. Adicione o seguinte código a este evento:
PopulaDetalhes(dgMaster.DataKeys(dgMaster.SelectedIndex))
Nesta linha estamos chamando a rotina PopularDetalhes, passando como parâmetro a chave-primária do dgMaster. Para isto, é utilizado o método DataKeys que é um Array, onde o registro selecionado do dgMaster é identificado pelo método SelectedIndex.
O dgMaster irá apresentar uma lista muito grande de pedidos, logo vêm a necessidade de fazer a paginação. Para quem estava acostumado a trabalhar com ASP, PHP, etc... a paginação de dados é encarada como um desafio. Já no ASP.Net, este processo é muito simplificado, uma vez que o Datagrid já veio preparado para resolver problemas deste tipo.
Selecione novamente o dgMaster, clique no botão Eventos da guia de Propriedades, e clique duas vezes sobre o eventos PageIndexChanged
Adicione o seguinte código a este método:
dgMaster.CurrentPageIndex=e.NewPageIndex()
PopulaMaster()
Utilizando somente estas duas linhas é possível fazer a paginação. Muito simples, não?
Para finalizar, só precisamos chamar a rotina que irá popular o dgMaster:
Sub Page_Load(sender As Object, e As EventArgs)
If Not Page.IsPostBack then
PopulaMaster()
End if
End Sub
Pressione F5 para testar:
Funcionou, e muito bem!!!
Para que não fique nenhum dúvida, vou postar aqui o código na íntegra!
<%@ Page Language="VB" Debug="True" %>Sub PopulaMaster()
'Cria a conexão com o banco
Dim conn as new OleDbConnection(banco)
'String de consulta que sera enviada ao banco de dados
Dim strSql as new System.Text.StringBuilder()
With strSql
.append("Select Pedidos.NúmeroDoPedido,")
.append("Pedidos.DatadeEntrega,")
.append("Clientes.NomeDaEmpresa ")
.append("From Pedidos,Clientes ")
.append("Where Clientes.CódigodoCliente=Pedidos.CódigodoCliente ")
.append("Order by Pedidos.NúmeroDoPedido")
End With
' Adaptador de dados
Dim adp as new OleDbDataAdapter(strSql.ToString(),conn)
'Cria o Dataset
Dim ds as new Dataset()
'Cria uma tabela chamada "Pedidos" com os dados da consulta enviada através do Adapter.
Adp.Fill(ds,"Pedidos")
'Anexa a chave primária ao Datagrid dgMaster e popula-o com os dados da tabela criada.
dgMaster.DataKeyField="NúmeroDoPedido"
dgMaster.DataSource=ds.Tables("Pedidos")
dgMaster.DataBind()
End Sub
Sub PopulaDetalhes(NumPedido as integer)
'Verifica se há algum registro selecionado no dgMaster
If dgMaster.SelectedIndex>-1 Then
'Cria a conexão com a fonte de dados
Dim conn as new OleDbConnection(banco)
'Cria a string de consulta Sql
Dim strSql as new System.Text.StringBuilder()
With strSql
.append("Select Produtos.NomeDoProduto,")
.append("DetalhesDoPedido.PreçoUnitário,")
.append("DetalhesDoPedido.Quantidade ")
.append("From Produtos,DetalhesDoPedido ")
.append("Where DetalhesDoPedido.NúmeroDoPedido="& NumPedido & " ")
.append("and Produtos.CódigoDoProduto=DetalhesDoPedido.CódigoDoProduto")
End With
'Cria o DataAdapter
Dim adp as new OleDbDataAdapter(strSql.ToString(),conn)
'Cria o Dataset
Dim ds as new Dataset()
'Popula o Dataset
adp.Fill(ds,"Produtos")
'Popula o Datagrid dgDetalhes
dgDetalhes.DataSource=ds.Tables("Produtos")
dgDetalhes.DataBind()
End if
End Sub
Sub Page_Load(sender As Object, e As EventArgs)
'Carrega a rotina apenas na primeira vez em que a página for executada.
If Not Page.IsPostBack then
PopulaMaster()
End if
End Sub
Sub dgMaster_SelectedIndexChanged(sender As Object, e As EventArgs)
'carrega a rotina passando a chave-primária como parâmetro.
PopulaDetalhes(dgMaster.DataKeys(dgMaster.SelectedIndex))
End Sub
Sub dgMaster_PageIndexChanged(sender As Object, e As DataGridPageChangedEventArgs)
'Pagina o dgMAster
dgMaster.CurrentPageIndex=e.NewPageIndex()
'Carrega a rotina após a paginação
PopulaMaster()
End Sub
The End
Lano de Castro
“Se não se pode vencer pelo talento, vença pelo esforço!”