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 Moraes



No 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

Marcos Roberto de Moraes

Marcos Roberto de Moraes - Mestrando em Educação (UNISAL)
Especialista em Administração de Sist. Informação (UFLA)
Licenciado Pleno em Informática (UNIMEP)
Professor das Faculdades Santa Lúcia de SI, FATEC e ETEC de Mogi Mirim-SP