VB .NET -
Curso Prático ADO .NET - Desenvolvendo uma aplicação :
Definindo o código da Interface - X
Neste artigo do curso prático iremos definir o código do formulário de pesquisas.
O formulário de pesquisa permite aos clientes pesquisar a base de dados CiaFilmes. Para se conectar ao banco de dados a partir do formulário de pesquisa, vamos precisa usar o provedor .NET para o SQL Server e as classes da ADO .NET. Portanto temos que declarar os seguintes namespaces no início do formulário frmPesquisas.vb:
A seguir vemos o fluxo de utilização do formulário de Pesquisas - frmPesquisas:
![]() |
![]() |
No formulário de pesquisas iremos utilizar os seguintes funções:
O evento Load do formulário será executado antes de uma instância do formulário ser exibida. No formulário de pesquisas a função frmPesquisas_Load deverá receber código que executa as seguintes tarefas:
Portanto, quando o cliente abrir o formulário de pesquisa, a opção do filme estará selecionado na combobox, e o botão btnFazerPedido estará desativado. Abaixo vemos o código que implementa isso:
| Private Sub frmPesquisas_Load(sender As Object, e As EventArgs) Handles MyBase.Load cboPesquisarPor.SelectedIndex = 0 btnFazerPedido.Enabled = False End Sub |
A função btnProcurar_Click é executada quando o cliente clica no botão Procurar e primeiro ela verifica se o cliente inseriu um texto na caixa de texto 'Texto a Pesquisar', se ela estiver em branco uma mensagem será exibida ao cliente.
Com base no texto inserido e com o valor selecionado na combobox cboPesquisarPor criaremos uma consulta SQL que será executada e os resultados armazenados em um conjunto de dados.
Havendo resultados eles serão exibidos no controle ListView - lvResultadoPesquisa e o botão Fazer pedido será habilitado. Se não for encontrado nenhum resultado e o conjunto de dados estiver vazio iremos exibir uma mensagem ao cliente usando a classe MessageBox.
| Nota: A classe Messagebox exibe textos em uma caixa de diálogo e um conjunto de botões. Ela possui somente um método estático ; o método Show. Este método aceita 6 parâmetros principais diferentes e usar todos não é obrigatório. Podemos ter até 12 tipos de sobreposições para as várias combinações de parâmetros. |
Abaixo temos o código atribuido ao evento Click do botão Procurar:
Private Sub btnProcurar_Click(sender As Object, e As EventArgs) Handles btnProcurar.Click
'define os objetos ADO .NET para acessar e tratar as informações do banco de dados
Dim dsDts As DataSet
Dim sqlCon As New SqlConnection(strConexaoSQLServer)
Dim sqlAda As New SqlDataAdapter()
Dim sqlCmd As New SqlCommand()
'define a variavel para a consuulta SQL e para a seleção da opção de busca
Dim strConsulta As String
Dim selecao As Integer
'Declara uma variavel para contar o numero de registros obtidos
Dim intNumeroRegistros As Integer = 0
strConsulta = "SELECT DISTINCT a.FilmeId , b.AtorId, c.DiretorId, d.ProdutorId, a.Titulo, b.Nome AS Ator, c.Nome AS Diretor, d.Nome AS Produtor " _
+ "FROM Filmes a, Atores b, Diretores c, Produtores d, AtorFilme e " _
+ "WHERE a.FilmeId = e.FilmeId AND e.AtorId = b.AtorId AND a.DiretorId = c.DiretorId AND a.ProdutorId = d.ProdutorId"
Select Case cboPesquisarPor.SelectedIndex
Case 0 'filme
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta += " AND a.Titulo LIKE '" & txtTextoPesquisar.Text & "%'"
End If
selecao = 0
Case 1 'ator
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta += " AND (b.Nome LIKE '" & txtTextoPesquisar.Text & "%' OR b.Sobrenome LIKE '" & txtTextoPesquisar.Text & "%') "
End If
selecao = 1
Case 2 'diretor
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta += " AND (c.Nome LIKE '" & txtTextoPesquisar.Text & "%' OR c.Sobrenome LIKE '" & txtTextoPesquisar.Text & "%') "
End If
selecao = 2
Case 3 'produtor
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta += " AND d.Nome LIKE '" & txtTextoPesquisar.Text & "%'"
End If
selecao = 3
End Select
Try
'cria um novo dataset
dsDts = New DataSet()
'atribui o comando ao dataadapter
sqlAda.SelectCommand = sqlCmd
'atribui a string de consulta sql montada ao command
sqlAda.SelectCommand.CommandText = strConsulta
'executa a consulta
sqlAda.SelectCommand.Connection = sqlCon
'preenche a tabela Resultado no dataset com o resultado da consulta
sqlAda.Fill(dsDts, "Resultado")
'limpa o controle listview
lvResultadoPesquisa.Items.Clear()
'percorre os registros tabela obtida
For Each drLinha In dsDts.Tables("Resultado").Rows
'obtem as linhas e atribui a uma array de strings : Id do filme(0) , o titulo(4), ator(5), diretor(6) e produtor(7)
Dim strRegistrosResultado As String() = {drLinha(0), drLinha(4), drLinha(5), drLinha(6), drLinha(7)}
'exibe cada linha do array no controle listview
lvResultadoPesquisa.Items.Add(New ListViewItem(strRegistrosResultado))
'incrementa o contador de registros
intNumeroRegistros += 1
Next
'exibe mensagens conforme a seleção se não houver registros e habilita/desabilita botão de fazer pedido
If intNumeroRegistros = 0 Then
If (selecao = 0) Then
MessageBox.Show("O filme não foi localizado no acervo.", "Filme", MessageBoxButtons.OK, MessageBoxIcon.Information)
ElseIf (selecao = 1) Then
MessageBox.Show("Não foi encontrado nenhum filme para este Ator.", "Ator", MessageBoxButtons.OK, MessageBoxIcon.Information)
ElseIf (selecao = 2) Then
MessageBox.Show("Não foi encontrado nenhum filme para este Diretor.", "Diretor", MessageBoxButtons.OK, MessageBoxIcon.Information)
ElseIf (selecao = 3) Then
MessageBox.Show("Não foi encontrado nenhum filme para este Produtor.", "Produtor", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
btnFazerPedido.Enabled = False
Else
'habilita o botão para fazer o pedido
btnFazerPedido.Enabled = True
End If
Catch ex As Exception
MessageBox.Show("Erro : " & ex.Message)
Finally
'fecha e libera os recursos usados
sqlCon.Close()
sqlCon.Dispose()
sqlCmd.Dispose()
sqlAda.Dispose()
End Try
End Sub
|
O código acima monta uma string e consulta usando comandos SQL:
strConsulta
= "SELECT DISTINCT a.FilmeId , b.AtorId, c.DiretorId,
d.ProdutorId, a.Titulo, b.Nome AS Ator, c.Nome AS Diretor, d.Nome
AS Produtor " _
+
"FROM Filmes a, Atores b, Diretores c, Produtores d,
AtorFilme e " _
+
"WHERE a.FilmeId = e.FilmeId AND e.AtorId = b.AtorId AND
a.DiretorId = c.DiretorId AND a.ProdutorId = d.ProdutorId"
E dependendo da seleção de critério que o cliente escolheu a consulta é complementada usando o operador LIKE e o valor dos campos da respectiva tabela:
| A função LIKE que pode ser usada com a cláusula
WHERE sendo que ela retorna todas as linhas cujo conteúdo das colunas for igual ao literal passado na função. SELECT PubId, Name , State FROM Publishers WHERE State LIKE ('B%') O comando acima exibe todas as colunas indicadas da tabela Publishers onde a coluna state for iniciada com a letra B. Nota: Você deve usar o caractere % ao invés do asterístico (*). |
Usamos um Select / Case definindo o SelectIndex que como opção de seleção e concluímos a montagem da instrução SELECT conforme a opção selecionada:
Select Case
cboPesquisarPor.SelectedIndex
Case 0
'filme
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta
+= " AND a.Titulo LIKE '" & txtTextoPesquisar.Text
& "%'"
End If
selecao = 0
Case 1 'ator
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta
+= " AND (b.Nome LIKE '" & txtTextoPesquisar.Text
& "%' OR b.Sobrenome LIKE '" &
txtTextoPesquisar.Text & "%') "
End If
selecao = 1
Case 2
'diretor
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta
+= " AND (c.Nome LIKE '" & txtTextoPesquisar.Text
& "%' OR c.Sobrenome LIKE '" &
txtTextoPesquisar.Text & "%') "
End If
selecao = 2
Case 3 'produtor
If Not String.IsNullOrEmpty(txtTextoPesquisar.Text) Then
strConsulta
+= " AND d.Nome LIKE '" & txtTextoPesquisar.Text
& "%'"
End If
selecao = 3
End Select
Após a consulta percorremos o dataset gerado, extraímos as informações para cada registro e exibimos no controle ListView:
'percorre os
registros tabela obtida
For Each drLinha In dsDts.Tables("Resultado").Rows
'obtem as linhas
e atribui a uma array de strings : Id do filme(0) , o titulo(4),
ator(5), diretor(6) e produtor(7)
Dim strRegistrosResultado As String() = {drLinha(0),
drLinha(4), drLinha(5), drLinha(6), drLinha(7)}
'exibe cada
linha do array no controle listview
lvResultadoPesquisa.Items.Add(New
ListViewItem(strRegistrosResultado))
'incrementa o
contador de registros
intNumeroRegistros += 1
Next
Estamos usando um bloco Try/Catch/Finally para capturar possíveis erros e na cláusula Finally estamos liberando os recursos usados.
O bloco try-catch-finally é usado para envolver o código onde existe a possibilidade de uma exceção/erro ocorrer. Um bloco try-catch-finally é constituído das seguintes seções :
| Try 'Código que pode gerar(levantar) um erro. Catch 'Código para tratamento de erros. Finally 'Código de execução obrigatória. End Try |
Obs: O VB.NET ainda mantém , por questões de compatibilidade , a sintaxe : "On Error Goto" e você ainda pode usá-la mas prefira usar a estrutura try-catch.
Executando o projeto e realizando uma pesquisa usando somente o critério de busca sem informar um texto será exibido todos os registros que atendem o critério:
![]() |
Ao informar um texto a consulta será refinada filtrando as informações com base no texto informado:
![]() |
Definindo do botão Fazer Pedido.
A função btnFazerPedido_Click será executada quando o cliente seleciona um item do controle ListView e clica no botão Fazer Pedido.
O código desta função deve verificar se o cliente selecionou todos os registros exibidos no seu resultado da pesquisa. Se não houver itens selecionados será exibida uma mensagem ao cliente.
Se o usuário for um cliente registrado e estiver logado o formulário de Pedidos - frmPedidos - será exibido para que o cliente faça o seu pedido. Caso contrário ele terá que efetuar o login ou se registrar usando o formulário frmRegistros.
Abaixo vemos o código da associado ao evento Click do botão bntFazerPedido:
Private Sub btnFazerPedido_Click(sender As Object, e As EventArgs) Handles btnFazerPedido.Click
'conta quantos itens forma selecionados do listview
Dim intTotalSelecionadosContador As Integer = lvResultadoPesquisa.CheckedItems.Count
'se houve itens então obtém os valores dos itens e preenche a classe Filme
If intTotalSelecionadosContador > 0 Then
For Each item As ListViewItem In lvResultadoPesquisa.CheckedItems
filmesSelecionados.Add(New Filme() With
{.Id = item.SubItems(0).Text, .titulo = item.SubItems(1).Text, .ator = item.SubItems(2).Text, .diretor = item.SubItems(3).Text, .produtor = item.SubItems(4).Text})
Next
Else
MessageBox.Show("Você não selecionou nenhum filme." & vbCrLf
& "Por gentileza, selecione os filmes a partir da lista e clique no botão ""Fazer Pedido"" ! ", "Selecionar Filme", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
'Verifica se o cliente esta logado
If (String.IsNullOrEmpty(Geral.clienteLogin)) Then
MessageBox.Show("Você não realizou o login ou não é um cliente cadastrado." & vbCrLf & "Faça o logon ou registre-se para poder realizar pedidos.")
Return
Else
'cria uma instância do formulário de pedidos
oFrmPedidos = New frmPedidos
'invoca a função setFilmesSelecionados() passando a lista de filmes selecionados e a quantidade como parâmetro
oFrmPedidos.setFilmesSelecionados(filmesSelecionados, intTotalSelecionadosContador)
'exibe o formulário do pedido
oFrmPedidos.Show()
End If
End Sub
|
Entendendo o código:
Contamos quantos itens foram selecionados no controle ListView usando a propriedade Count na coleção CheckedItems.
Se houver pelo menos um item selecionado então vamos extrair os valores a partir do controle Listview percorrendo a coleção CheckedItems usando o um laço For Each:
For Each
item As ListViewItem In lvResultadoPesquisa.CheckedItems
filmesSelecionados.Add(New
Filme() With {.Id = item.SubItems(0).Text, .titulo =
item.SubItems(1).Text, .ator = item.SubItems(2).Text, .diretor =
item.SubItems(3).Text, .produtor = item.SubItems(4).Text})
Next
Nesta laço estamos preenchendo uma lista genérica de filmes com objetos da classe Filme.
A lista genérica do tipo Filme foi definida como estática no início do formulário : Public Shared filmesSelecionados As New List(Of Filme)
Esta usando a coleção List(Of T) que representa uma lista fortemente tipada de objetos que podem ser acessados através de um índice. Fornece os métodos Search, Sort e efetua a manipulação da lista. No nosso exemplo T seria a classe Filme.
Verificamos também se o cliente esta logado consultando a variável pública ClienteLogin definida no módulo Geral. No formulário de Login se o cliente se logar com sucesso essa variável receberá o login do usuário caso contrário ele estará vazia.
Para os clientes logados iremos abrir o formulário de pedidos usando o código abaixo:
'cria uma instância
do formulário de pedidos
oFrmPedidos
= New frmPedidos
'invoca a
função setFilmesSelecionados() passando a lista de filmes
selecionados e a quantidade como parâmetro
oFrmPedidos.setFilmesSelecionados(filmesSelecionados,
intTotalSelecionadosContador)
'exibe o
formulário do pedido
oFrmPedidos.Show()
Note que criamos uma instância da classe frmPedidos : oFrmPedidos = New frmPedidos
E atribuímos a coleção preenchida com os valores dos itens selecionados e o contador de itens ao método setFilmesSelecionados() do formulário frmPedidos.
A seguir abrimos e exibimos este formulário ao cliente: oFrmPedidos.Show()
Na próxima aula iremos criar o código do formulário de pedidos frmPedidos.
Referências: