Desenvolvimento - Visual Basic .NET
Pequeno projeto de controle de pedidos de uma pizzaria em Visual Basic .Net - Parte 3
Terceiro artigo. Ao final, teremos um pequeno, porém importante projeto que servirá como base para o desenvolvimento de projetos maiores. É importante que você acompanhe as explicações de todas as partes do código. O objetivo desse material é ser uma referência básica para seus futuros projetos. O modelo de programação está bem baseado no VB6. Existem outros orientados a objeto. Não foi o intuito neste artigo explorá-lo.
por Marcos Roberto de MoraesNo artigo passado você pode codificar parte do formulário de clientes, ou seja, os códigos para os botões: incluir, alterar e excluir. Neste artigo será dada a seqüência no projeto, por meio da elaboração do formulário de pesquisa aos dados dos clientes.
A idéia é criar um formulário genérico de pesquisa, que poderá ser utilizado nas demais pesquisas das outras tabelas do projeto, como a de produtos, por exemplo.
Nota do autor: Nestes artigos, como disse antes, a intenção não é discutir as melhores práticas de programação, e sim, codificar um pequeno exemplo, que pode e deve ser melhorado pelo usuário que já possui algum conhecimento em VB. Críticas são bem vindas, mas ajudem-me respondendo às dúvidas dos leitores, o tempo tem sido meu inimigo por esses dias. J
Formulário de Pesquisa:
1) Inicialmente adicione um novo formulário ao seu projeto e mude o nome e a propriedade name para FrmConsultas. (FrmConsultas.vb).
2) Nesse formulário adicione os seguintes controles:
4) Alterne para o formulário de clientes, dê um duplo clique no botão (PESQUISAR) e inclua o código abaixo:
FrmConsultas.Text = "Clientes"
FrmConsultas.ShowDialog()
5) Ainda no formulário de clientes altere INCLUA o código abaixo no início do evento TxtCodigo_LostFocus( )
Private Sub TxtCodigo_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TxtCodigo.LostFocus
"código acrescentado
If TxtCodigo.Text = Nothing Then
Exit Sub
End If
"Primeiramente vamos buscar pelo código do cliente.
"Declare a variável de conexão
----
6) Volte ao formulário de consultas (FrmConsultas)
Antes de continuar o projeto, vou fazer apenas um comentário sobre o controle DataGridView que adicionamos e nomeamos como DgvResult.
Este controle na .Net Framework 2.0 substitui o antigo controle DataGrid e agora está mais flexível e extensível permitindo exibir e editar dados de forma tabular.
Ele exibirá os dados a partir de parâmetros passados pelo usuário do sistema. Mas para isso precisaremos estabelecer a conexão com o Banco de Dados e passarmos os parâmetros em uma Query SQL.
Bom. Vamos criar o código do evento Form_Load do formulário de consulta, pois como disse, esse é um formulário genérico que servirá para qualquer tabela. Neste caso é necessário saber, qual o formulário de origem que iniciou a pesquisa e passar o nome da tabela como parâmetro (EX: clientes, produtos, fornecedores, etc).
7) Código do Form_load( )
"Ativa a conexao
Dim cn As New SqlConnection(conexao)
If cn.State = ConnectionState.Closed Then
cn.Open()
End If
"Cria o objeto de comando
Dim cSql As New SqlCommand
"Passar os valores da query SQL, tipo do comando,
"conexao e executa o comando
cSql.CommandText = "SELECT * FROM " & Me.Text
cSql.CommandType = CommandType.Text
cSql.Connection = cn
cSql.ExecuteNonQuery()
"Declara um data adapter
Dim daAdaptador As New SqlDataAdapter
"Declara um dataset
Dim dsDataSet As New DataSet
"Passa o comando a ser executado pelo DataAdapter
daAdaptador.SelectCommand = cSql
"O DataAdapter faz a conexão com o banco de dados e
"carrega o DataSet e fecha a conexao.
daAdaptador.Fill(dsDataSet)
"Retorna o Dataset carregado para o DataGridView
DgvResult.AutoGenerateColumns = True
DgvResult.DataSource = dsDataSet.Tables(0) "Tables (0) Indica a única Tabela selecionada
"Preenchendo o ComboBox com os campos da Tabela
cmbCampo.Items.Clear()
Dim i As Integer
For i = 0 To dsDataSet.Tables(0).Columns.Count - 1
cmbCampo.Items.Add(dsDataSet.Tables(0).Columns(i).ColumnName)
Next
"fecha a conexão
cn.Close()
8) Adicione a chamada as bibliotecas necessárias no projeto antes da declaração da classe FrmConsultas. Abaixo:
Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
9) Copie a linha de conexão usada no formulário frmclientes para dentro da classe FrmConsultas. A linha abaixo representa o caminho da conexão com o banco, altere de acordo com a sua:
Dim conexao As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Pizza\Pizza.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
Comentários do Código do evento load
Primeiro ativou-se a conexão e abrimos o Banco de dados (cn.open( ) ).
Foi realizada uma série de comandos novos, que vou destacar um a um.
Inicialmente declaramos uma variável chamada cSql como uma nova instância da classe SqlCommand, responsável pela realização da consulta em sql ao Banco de Dados.
Depois declaramos uma variável chamada daAdaptador como uma nova instância da classe SqlDataAdapter, é nela que passamos a String Sql definida em cSql.
A variável dsDataSet do tipo DataSet é responsável pelo armazenamento temporário dos dados retornados pelo daAdaptador.
Por fim, para a exibição dos dados no grid, alteramos as propriedades AutoGenerateColumns e DataSource do DgvResult, para True e dsDataSet.Tables(0) respectivamente, esse último indica a única tabela retornada pelo daAdaptador carregada no DataSet.
Os próximos passos foram adicionar ao combo Campo (cmbCampo) os nomes das Colunas (campos) da tabela de clientes e finalmente fechamos a conexão.
Testando a Aplicação, até esse ponto:
Bom, agora precisamos adicionar os parâmetros na combo cmbParametro de acordo com o tipo de dado selecionado na tabela. Ou seja, se o usuário, por exemplo, escolher IdCliente, neste ponto a combo Parâmetro deverá receber parâmetros de pesquisa para números, como >, <, >=, <= ou =, já que o campo é numérico. Já se ele escolher NomeRazao, a combo de parâmetro deverá apresentar parâmetros de pesquisa de texto (string) como: começa com, termina em, tem a palavra, ou igual.
Para que isso seja possível programe o evento cmbCampo_SelectedIndexChanged ou seja, quando o usuário mudar o item na caixa combo Campo (cmbCampo) a rotina deverá verificar qual é o tipo de dados de acordo com o campo selecionado.
10) Primeiro logo abaixo do início da Classe FrmConsulta (linha abaixo da string conexão), defina a variável tipocampo conforme abaixo:
Dim tipocampo As System.Type
11) Código do Envento cmbCampo_SelectedIndexChanged ( )
Dim ds As New DataSet
tipocampo = Me.DgvResult.Columns(cmbCampo.SelectedIndex).ValueType
If (tipocampo.ToString = "System.Int16" Or _
tipocampo.ToString = "System.Int32" Or _
tipocampo.ToString = "System.Int64" Or _
tipocampo.ToString = "System.Decimal" Or _
tipocampo.ToString = "System.Single" Or _
tipocampo.ToString = "System.Double") Then
cmbParam.Items.Clear()
cmbParam.Items.Add("=")
cmbParam.Items.Add(">")
cmbParam.Items.Add(">=")
cmbParam.Items.Add("<")
cmbParam.Items.Add("<=")
cmbParam.Items.Add("<>")
End If
If tipoCampo.ToString = "System.String" Then
cmbParam.Items.Clear()
cmbParam.Items.Add("=")
cmbParam.Items.Add("Começa com")
cmbParam.Items.Add("Termina em")
cmbParam.Items.Add("Tem a palavra")
End If
Ests código utiliza a classe System.Type, que contém a coleção de tipos de dados do vb. O que foi feito acima é verificar se o tipo é numérico ou texto, para aplicarmos o filtro correto, você poderá melhor essa rotina acrescentando os tipos de dados que contiver em seu projeto, os quais não coloquei aqui no momento, por exemplo: tipo (data/hora).
Veja o exemplo assim que rodamos caso a escolha seja o campo NomeRazao.
9) Agora vamos ao código final. O código do Botão filtrar.
Dim campo As String = cmbCampo.Text
Dim parametro As String = cmbParam.Text
Dim valor As String = txtValor.Text
Dim tipo As String = tipoCampo.ToString
"Ativa a conexao
Dim cn As New SqlConnection(conexao)
If cn.State = ConnectionState.Closed Then
cn.Open()
End If
"Cria o objeto de comando
Dim cSql As New SqlCommand
"-------------------
"Para tipos Numéricos
If (tipo = "System.Int16" Or _
tipo = "System.Int32" Or _
tipo = "System.Int64" Or _
tipo = "System.Single" Or _
tipo = "System.Double" Or _
tipo = "System.Decimal") Then
"Passar os valores da query SQL, tipo do comando,
"conexao e executa o comando
cSql.CommandText = "SELECT * FROM " & Me.Text & " WHERE " _
& campo & " " & parametro & valor
End If
"-------------------
"Para tipos String
If tipo = "System.String" Then
"Verificar formulário origem pelo Text do FrmConsGenerica
If parametro = "Tem a palavra" Then
parametro = "Like "
valor = ""%" & valor & "%""
End If
If parametro = "=" Then
valor = """ & valor & """
End If
If parametro = "Começa com" Then
parametro = "Like "
valor = """ & valor & "%""
End If
If parametro = "Termina em" Then
parametro = "Like "
valor = ""%" & valor & """
End If
"Passar os valores da query SQL, tipo do comando,
"conexao e executa o comando
cSql.CommandText = "SELECT * FROM " & Me.Text & " WHERE " _
& campo & " " & parametro & valor
End If
cSql.CommandType = CommandType.Text
cSql.Connection = cn
cSql.ExecuteNonQuery()
"Declara um data adapter
Dim daAdaptador As New SqlDataAdapter
"Declara um dataset
Dim dsDataSet As New DataSet
"Passa o comando a ser executado pelo DataAdapter
daAdaptador.SelectCommand = cSql
"O DataAdapter faz a conexão com o banco de dados e
"carrega o DataSet e fecha a conexao.
daAdaptador.Fill(dsDataSet)
"Retorna o Dataset carregado para o DataGridView
DgvResult.AutoGenerateColumns = True
DgvResult.DataSource = dsDataSet.Tables(0) "Tables (0) Indica a única Tabela selecionada
Nota do professor: Esse artigo foi escrito com o objetivo de demonstrar uma prática de pesquisa em objeto tabela (clientes).
Como desafio: Agora programe a mesma pesquisa para o Formulário de Produtos. Qualquer dúvida me mande um e-mail. professormoraesARROBAgmail.com
Um abraço,
Marcos Roberto de Moraes
Mestrando em Educação
Especialista em Administração de Sistemas de Informação
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET