VB 2005 - Acesso e manutenção de dados II


Em meu primeiro artigo VB 2005 - Acesso e manutenção de dados para iniciantes meu objetivo foi mostrar como criar uma aplicação bem básica para Cadastro de clientes de forma que os que estão iniciando no VB .NET possam acompanhar.

Não é por que você esta iniciando que terá que usar somente os assistentes para criação de aplicações. Você pode usá-los, e , em certa ocasiões é até recomendável fazê-lo mas geralmente eles nunca vão fazer o trabalho melhor do que você.

Desde modo no primeiro artigo eu apresentei o problema , criei um projeto no VB 2005 Express , criei o banco de dados e a tabela , defini a string de conexão e no momento de usar o assistente preferi mostrar como você mesmo pode tomar as rédeas da aplicação e criar o código necessário para realizar as tarefas de inclui, alterar , excluir e consultar dados.

Então apenas para relembrar chegamos ao ponto de criar o formulário da aplicação conforme o leiaute abaixo:

O que pretendemos é o seguinte:

- Quando a aplicação for iniciada será apresentando o formulário conforme a figura acima. Não iremos carregar a ListBox com os nomes dos clientes. Poderíamos fazer isso sem problemas mas não vamos fazê-lo por um questão de desempenho, pois se o cadastro possuir 100 registros o desempenho será mas se o cadastro tiver 100.000 o desempenho será bem menor. Deste modo eu estou disponibilizando uma caixa de texto e um botão de comando acima da ListBox para que o usuário efetue uma busca na base de dados e assim eu só vou trazer os registros referentes aos critérios realizados nesta busca.

Assim o usuário poderá solicitar um nome parcial e serão trazidos todos os clientes que atendem ao critério. Veja abaixo o exemplo onde o usuário digitou as letras Jo e clicou no botão de busca . Foram encontrados somente dois clientes cujo nome continham as palavras Jo e eles foram exibidos no ListBox. Atendemos ao cliente e a aplicação ficou bem rápida na do formulário.

Quando o usuário selecionar um cliente os dados serão exibidos nos controles a direita para que o usuário tenha uma visão geral do cliente. Note que o código do cliente - ClienteId - não é passível de alteração e não esta acessível.

Desta forma o usuário poderá , após selecionar o cliente , incluir, alterar e excluir um registro da tabela. Vamos agora mostrar como fizemos a implementação destas funcionalidades.

No evento Load do formulário da aplicação chamamos a rotina  calculaNumeroRegistros() que irá calcular quantos registros existem gravados na tabela Clientes.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   calculaNumeroRegistros()

End Sub

A rotina possui o seguinte código:

Private Sub calculaNumeroRegistros()
 

Dim strConn As String = My.Settings.CadastroConnectionString.ToString()

Dim strSQL As String = "Select Count(*) From Clientes"


'define objeto connection e command

Dim con As New SqlConnection(strConn)

Dim cmd As New SqlCommand(strSQL, con)


con.Open()
 

Try

   lblNumeroRegistros.Text = "Clientes Cadastrados: " & cmd.ExecuteScalar.ToString

Catch ex As Exception

   MsgBox("Erro ao calcular numero de registros. Erro : " & ex.Message)

Finally

   con.Close()

End Try

End Sub

Esta rotina funciona assim:

Isso é tudo.

Agora vejamos como é feita a consulta aos clientes

No evento Click da caixa de texto txtProcuraClientePorNome.text temos o seguinte código:

Private Sub btnProcuraClientePorNome_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcuraClientePorNome.Click
 

If txtProcuraClientePorNome.Text.Trim.Length > 1 Then


     ErrorProvider1.SetError(txtProcuraClientePorNome,
"")


      
Dim da As CadastroDataSetTableAdapters.ClientesTableAdapter = New CadastroDataSetTableAdapters.ClientesTableAdapter
 

     lstbClientes.DataSource = da.GetDataByNome("%" & txtProcuraClientePorNome.Text & "%")

     lstbClientes.DisplayMember = "nome"

     lstbClientes.ValueMember = "clienteID"

     lstbClientes.Refresh()

Else

     ErrorProvider1.SetError(txtProcuraClientePorNome, "Informe o nome do cliente com no mínimo 2 caracteres...")

End If

End Sub

Nesta rotina temos:

Nesta altura preciso mostrar como foi criada a consulta GetDataByNome().

- Clicamos no dataset - CadastroDataSet.xsd;
- Clicamos com o botão direito do mouse sobre o ClientesTableAdapter e selecionamos a opção Add Query;
- Na janela Choose a Command Type , marcamos Use SQL Statements;
- Na janela Choose a Query Type , marcamos SELECT Whichs returns rows;
- A seguir na janela Specify a SELECT statement definimos a instrução SQL : SELECT clienteID, nome FROM Clientes WHERE (nome LIKE @Param)

- Definimos o nome da consulta como GetDataByNome conforme abaixo:

Agora quando o usuário clicar em um dos clientes apresentados na ListBox seus dados serão apresentados no formulário.

Para isso usamos o evento SelectedIndexChanged do controle ListBox e incluímos o seguinte código neste evento;

Private Sub lstbClientes_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstbClientes.SelectedIndexChanged

If (lstbClientes.SelectedValue.ToString() <> "System.Data.DataRowView") Then
     carregaClientes(
CInt(Me.lstbClientes.SelectedValue))
End If

End Sub

A rotina carregaClientes é quem irá obter os dados do cliente e exibir nos controles do formulário. Seu código é o seguinte:

Private Sub carregaClientes(ByVal clienteID As Integer)
 

Dim strConn As String = My.Settings.CadastroConnectionString.ToString()

Dim strSQL As String = "Select * from Clientes Where clienteID = " & clienteID

Dim dr As SqlDataReader


'define objeto connection e command

Dim con As New SqlConnection(strConn)

Dim cmd As New SqlCommand(strSQL, con)


Try

   con.Open()

   dr = cmd.ExecuteReader


    If (dr.HasRows) Then

       dr.Read()
 

        ClienteIDTextBox.Text = dr("clienteID").ToString

        NomeTextBox.Text = dr("nome").ToString

        EnderecoTextBox.Text = dr("endereco").ToString

        CidadeTextBox.Text = dr("cidade").ToString

        EstadoTextBox.Text = dr("estado").ToString

        CepTextBox.Text = dr("cep").ToString

        TelefoneTextBox.Text = dr("telefone").ToString

        EmailTextBox.Text = dr("email").ToString

        sexoTextBox.Text() = dr("sexo").ToString

        NascimentoDateTimePicker.Text = dr("nascimento").ToString

    End If

Catch ex As Exception

    MsgBox("Erro ao obter dados dos clientes. Erro : " & ex.Message)

Finally

   con.Close()

End Try

End Sub

Vejamos a seguir o código para as operações de incluir, Alterar e excluir:

- Incluir

O código para incluir dados na tabela deve ser inserido no evento Click do botão de comando Incluir:

 Private Sub btnIncluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIncluir.Click
        Dim msg As String = ""
        Dim sql As String = ""
        Dim strConn As String = My.Settings.CadastroConnectionString.ToString()
        If btnIncluir.Text = "Incluir" Then
            btnIncluir.Text = "Salvar"
            lstbClientes.Enabled = False
            limpaControles(Me)
            NomeTextBox.Focus()
        ElseIf btnIncluir.Text = "Salvar" Then
            If valida() Then
                sql = "INSERT INTO Clientes (nome, endereco, cidade, estado, cep, telefone, email, sexo, nascimento) VALUES('" _
                                            + NomeTextBox.Text + "','" _
                                            + EnderecoTextBox.Text + "','" _
                                            + CidadeTextBox.Text + "','" _
                                            + EstadoTextBox.Text + "','" _
                                            + CepTextBox.Text + "','" _
                                            + TelefoneTextBox.Text + "','" _
                                            + EmailTextBox.Text + "','" _
                                            + sexoTextBox.Text + "','" _
                                            + NascimentoDateTimePicker.Text + "')"
                Dim con As New SqlConnection(strConn)
                Dim cmd As New SqlCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Cliente incluido com sucesso.")
                    btnIncluir.Text = "Incluir"
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
                lstbClientes.Enabled = True
            Else
                MsgBox("Dados incompletos.")
                lstbClientes.Enabled = True
                btnIncluir.Text = "Incluir"
            End If
        End If
    End Sub

 

Neste código obtemos a conexão e através da instrução SQL INSERT INTO , incluímos os novos dados na tabela Clientes.

- Alterar

No evento Click do botão Alterar temos o código que altera dados da tabela através da instrução SQL UPDATE / SET;

Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click
        If lstbClientes.SelectedIndex <> -1 Then
            Dim sql As String = ""
            Dim strConn As String = My.Settings.CadastroConnectionString.ToString()
            If valida() Then
                sql = "UPDATE Clientes SET nome       = '" + NomeTextBox.Text _
                                      + "',endereco   = '" + EnderecoTextBox.Text _
                                      + "',cidade     ='" + CidadeTextBox.Text _
                                      + "',estado     = '" + EstadoTextBox.Text _
                                      + "',cep        = '" + CepTextBox.Text _
                                      + "',telefone   = '" + TelefoneTextBox.Text _
                                      + "',email      ='" + EmailTextBox.Text _
                                      + "',sexo       = '" + sexoTextBox.Text _
                                      + "',nascimento = '" + NascimentoDateTimePicker.Text + "'" _
                                      + " WHERE clienteID = " + lstbClientes.SelectedValue.ToString
                'define objeto connection e command
                Dim con As New SqlConnection(strConn)
                Dim cmd As New SqlCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Cliente alterado com sucesso.")
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                MsgBox("Dados incompletos")
            End If
        Else
            MsgBox("Selecione um cliente para alterar.")
        End If
    End Sub

 

 - Excluir

O código para excluir registros usando a instrução SQL DELETE FROM é mostrada a seguir;

Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click
        If lstbClientes.SelectedIndex <> -1 Then
            Dim sql As String = ""
            Dim strConn As String = My.Settings.CadastroConnectionString.ToString()
            If MsgBox("Confirma a exclusão do cliente de codigo igual a " + lstbClientes.SelectedValue.ToString, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
                sql = "DELETE FROM Clientes WHERE clienteID = " + lstbClientes.SelectedValue
                'define objeto connection e command
                Dim con As New SqlConnection(strConn)
                Dim cmd As New SqlCommand(sql, con)
                Try
                    con.Open()
                    cmd.ExecuteNonQuery()
                    MsgBox("Cliente excluído com sucesso.")
                    btnIncluir.Text = "Excluir"
                Catch ex As Exception
                    MsgBox("Não foi possível excluir o cliente." + vbCrLf + ex.Message)
                End Try
            End If
        Else
            MsgBox("Selecione um cliente para excluir.")
        End If
    End Sub

 

A rotina valida() que efetua a validação dos dados informados pelo usuário é mostrada abaixo:

Private Function valida() As Boolean

'verifica se algumas informações foram fornecidas

If NomeTextBox.Text = String.Empty Or EnderecoTextBox.Text = String.Empty Or CidadeTextBox.Text = String.Empty Or EstadoTextBox.Text = String.Empty Or CepTextBox.Text = String.Empty Then

     Return False

Else

     Return True

End If

End Function

Com isso você tem as funcionalidades básicas de manutenção de dados implementadas via código sem a utilização dos assistentes do Windows.

Se você chegou até aqui, compreendeu o que foi feito , e entendeu as rotinas envolvidas nas implementações das funcionalidades , podemos dizer que você evoluiu e deixou o estágio de dependência dos assistentes.

Podemos dizer então que atingimos a perfeição ,e, que a aplicação desenvolvida desta forma pode ser considerada robusta, fácil de manter e portar  ?

Sinceramente , estamos longe deste estágio ainda...

Sejamos sinceros , se formos um pouco mais exigentes com nosso código veremos que ele é prolixo, difícil de manter de portar e de entender e que vamos ter que melhorar para atingir um nível mais elevado de refinamento.

Embora você tenha evoluído eu lhe mostrarei um caminho mais perfeito no próximo artigo onde estaremos alterando nossa aplicação para trabalhar em camadas separando assim as regras de negócio e o acesso aos dados da camada de apresentação. Vamos remover o código dos formulários tornando-o mais enxuto.

Pegue a aplicação desse estágio aqui: Cadastro1.zip (sem a base de dados)

Até o próximo artigo ...

referências:


José Carlos Macoratti