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)
lblNumeroRegistros.Text = "Clientes Cadastrados: " & cmd.ExecuteScalar.ToString Catch ex As ExceptionMsgBox( "Erro ao calcular numero de registros. Erro : " & ex.Message) Finallycon.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.ClickIf txtProcuraClientePorNome.Text.Trim.Length > 1 Then
lstbClientes.DataSource = da.GetDataByNome( "%" & txtProcuraClientePorNome.Text & "%")lstbClientes.DisplayMember = "nome"lstbClientes.ValueMember = "clienteID"lstbClientes.Refresh() ElseErrorProvider1.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
dr.Read() ClienteIDTextBox.Text = dr( "clienteID").ToStringNomeTextBox.Text = dr( "nome").ToStringEnderecoTextBox.Text = dr( "endereco").ToStringCidadeTextBox.Text = dr( "cidade").ToStringEstadoTextBox.Text = dr( "estado").ToStringCepTextBox.Text = dr( "cep").ToStringTelefoneTextBox.Text = dr( "telefone").ToStringEmailTextBox.Text = dr( "email").ToStringsexoTextBox.Text() = dr( "sexo").ToStringNascimentoDateTimePicker.Text = dr( "nascimento").ToStringEnd If Catch ex As Exception MsgBox( "Erro ao obter dados dos clientes. Erro : " & ex.Message) Finallycon.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