Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Com Botão "procurar"


Friedrich Nietzsche

Pergunta

Ola a todos!

Gostaria muito que alguém pudesse me ajudar, pois tenho que entregar este programa na próxima terça-feira.

Sou policial civil, me formei em um curso de VB em 1997 (porém esqueci de muita coisa), e estou terminando um programa de cadastro fotográfico de criminosos (Fichas Fotográficas). No banco de dados há as opções como Nome, Pai, Mãe, RG, Data de Nascimento, Foto, etc... um banquinho de dados completo. Ele já está todo programado e funcionando muito bem, mas estou desesperado, pois preciso elaborar um botão de "Pesquisa de Fichas", e não vejo meio de fazê-lo funcionar direito. Foram tantos erros diferentes em inúmeras tentativas diferentes de se utilizar diferentes métodos... que não há como eu postá-los.

A ajuda que peço é a seguinte: a criação de um botão que, quando faz a leitura de um critério digitado em um Text1.text (por exemplo), faria uma pesquisa. Ex.: Eu preciso saber quantas fichas (REGISTROS) existem com o nome "João", ou que contenham um termo ou uma seqüência de caracteres, como exemplo, parte do sobrenome, ex. "Silva", ou "Joa", ou "Jo", e visualizá-las uma após a outra após serem encontradas.

Eis os dados que estou utilizando:

frmMain : é o form principal em que os campos (fields) da tabela são apresentados, adicionados e editados

ImageLib : é o banco de dados

ImageLibrary : é o nome da Tabela

Nome : é o campo na tabela que contem a chave de index (nome do index = SecundaryKey)

Private Conn As Adodb.Connection

Private rs As Adodb.Recordset

Todo o procedimento de pesquisa está em um segundo Form (Form1). Após a informação de quantos registros existem com o filtro do critério digitado, é desejado visualisá-los em uma outra form (Form2).

Agradeço desde já a ajuda de vocês, pois esse fórum tem me ajudado muito com as informações nele postadas e dúvidas também nele esclarecidas.

Abraço a todos!

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

Você pode fazer algo como...

quantidade = Conn.Execute("SELECT Count(*) AS Quantidade FROM ImageLibrary WHERE nome LIKE '%" & nome & "%'").Fields("Quantidade").Value

set rsBusca = Conn.Execute("SELECT * FROM ImageLibrary WHERE nome LIKE '%" & nome & "%'")

set DataGrid1.DataSource = rsBusca

Label1.Caption = quantidade

... no segundo form. O exemplo acima supõe que você tenha uma DataGrid e uma Label presentes no form, e que na variável "nome" esteja a parte do nome a ser procurado.

Talvez você precise adaptar ou corrigir alguma coisa no código acima, mas acho que já dá pra ter uma idéia.

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado pela ajuda, Graymalkin!

Está ocorrendo um erro Variable not defined em rsbusca na "adaptação" que eu fiz. Poderia ver o código e fornecer mais algumas dicas?

Muito obrigado! :D

Dim quantidade As String

quantidade = Conn.Execute("SELECT Count(*) AS Quantidade FROM ImageLibrary WHERE Nome LIKE '%" & Text1.Text & "%'").Fields("Quantidade").Value

Set rsbusca = Conn.Execute("SELECT * FROM ImageLibrary WHERE nome LIKE '%" & Text1.Text & "%'")

Set DataGrid1.DataSource = rsbusca

Label1.Caption = quantidade

Link para o comentário
Compartilhar em outros sites

  • 0

Tem algum Option Explicit no General Declarations deste form? Ou em algum módulo? Se tiver, ou você tira ele ou vai precisar declarar todas as variáveis. No caso de declarar rsBusca você pode fazer...

dim rsBusca as ADODB.Recordset

... nesse seu código mesmo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Já consegui passar o código e definir a rsBusca, mas está surgindo um outro BUG nestas duas linhas de comando:

quantidade = Conn.Execute("SELECT Count(*) AS Quantidade FROM ImageLibrary WHERE Nome LIKE '%" & Text1.Text & "%'").Fields("Quantidade").Value

Set rsBusca = Conn.Execute("SELECT * FROM ImageLibrary WHERE nome LIKE '%" & Text1.Text & "%'")

O erro é(em tempo de execução): '91' Object variable or WITH block variable not set.

Não há Option Explicit no form ou em módulo, e já tentei declarar algumas variáveis para ver se funcionava, como por exemplo, seguindo o código já mencionado no outro post, a declaração de strText1, com strText1 = Trim$(Text1.Text) para ver se eram os espaços que causavam o erro, mas não sei se estou no caminho certo.

Alguma orientação sobre esse erro??

Obrigado pela paciência!

Link para o comentário
Compartilhar em outros sites

  • 0

Primeiramente, nesta linha:

quantidade = Conn.Execute("SELECT Count(*) AS Quantidade FROM ImageLibrary WHERE Nome LIKE '%" & Text1.Text & "%'").Fields("Quantidade").Value
Se desabilitar esta linha com um ' , o mesmo erro segue para a outra linha:
Set rsBusca = Conn.Execute("SELECT * FROM ImageLibrary WHERE nome LIKE '%" & Text1.Text & "%'")
Ps.: Consegui fazer a pesquisa funcionar mudando a abordagem; utilizei o ListView, contudo ainda não consegui fazer a contagem dos registros encontrados na ListView... e há outro problema que não consigo solucionar:
On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Nome LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!Nome)
   Lista.SubItems(1) = rs!Vulgo
   rs.MoveNext
Loop

Exit Sub

Como mostrado no código, além do Nome, deveria aparecer o Vulgo no ListView, mas só aparece o Nome.

Fico me perguntando o que estou esquecendo ou o que estou fazendo de errado...

Como opinião, devo insistir na abordagem do ListView ou retornar ao código anterior?

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

Sabia que estava esquecendo algo...

O sistema de busca exibe perfeitamente o conteúdo pesquisado, inclusive efetua a contagem de registros, e agora é necessário o seguinte: que quando selecionado um item no listview, após acionar o botão botpesquisar, o programa retorne ao frmMain exibindo o registro selecionado previamente (no listview).

O sistema de busca pode procurar um registro com o termo informado em Text1.text por Nome, Vulgo, Tatuagens e Endereço. Na listview, a primeira coluna é sempre ordenada pelo nome, e a segunda coluna pelos outros critérios.

Ex.: Quero procurar um registro em que a pessoa possua uma tatuagem tribal. Eu digito "tribal" e a pesquisa me retorna a listview que exibe, na primeira coluna, o nome da pessa, e na segunda coluna, a tatuagem que eu solicitei:

__________________________________

|João da Silva | Tribal no braço esquerdo|

|___________ |_____________________|

Agora, após eu selecionar este registro, preciso retornar ao frmMain e visualizar a ficha de "João da Silva", mas desconheço o comando apropriado.

O index da tabela ImageLibrary é = SecundaryKey.

Este é o código do from da busca (Form1):

Private Conn As ADODB.Connection
Private rs As ADODB.Recordset
Private Lista As ListItem

Private Sub botpesquisar_Click()

preenche_lista
Label2.Caption = lstmostra.ListItems.Count
If Label2.Caption = "0" Then
MsgBox "Nenhuma ficha foi encontrada com o critério selecionado.", vbOKOnly, "Resultado da Pesquisa"
End If
Text1.SetFocus

End Sub

Private Sub Command1_Click()
Unload Me
frmMain.Show
frmMain.Enabled = True
End Sub

Private Sub Form_Load()

frmMain.Enabled = False
    
    Set Conn = New ADODB.Connection
    Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
      "Data Source=" & App.Path & "\ImageLib.mdb"
    Conn.Open
        
    Set rs = New ADODB.Recordset
    rs.Open "ImageLibrary", Conn, adOpenKeyset, adLockPessimistic, adCmdTable
    
        
End Sub

Private Sub preenche_lista()


If Option1.Value = True Then

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Nome LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   rs.MoveNext
Loop

Exit Sub

End If

If Option2.Value = True Then

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Vulgo LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(1) = rs!Vulgo
   rs.MoveNext
Loop

Exit Sub

End If

If Option3.Value = True Then

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Tatuagens LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(1) = rs!Tatuagens
   rs.MoveNext
Loop

Exit Sub

End If


If Option4.Value = True Then

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Endereco LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(1) = rs!endereco
   rs.MoveNext
Loop

Exit Sub

End If

trataerro:
   MsgBox Err.Description, vbCritical, "Erro no sistema"



End Sub

Private Sub Form_Unload(Cancel As Integer)
  Set Lista = Nothing
  Set rs = Nothing
  Set Conn = Nothing
End Sub

Alguma sugestão?

Obrigado! :)

Link para o comentário
Compartilhar em outros sites

  • 0

Cada registro tem uma identificação única (como um código, um número, etc.)? Se sim, você poderia guardar essa identificação nos itens da ListView (na propriedade Tag de cada item) e depois resgatar essa chave para poder fazer a busca do registro e exibí-lo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ok... A identificação única de cada registro é o campo ID, em que é gerado automaticamente um número para cada registro adicionado.

O Index da minha tabela ImageLibrary é o campo Nome, e esse index é chamado de SecunadryKey.

No ListView eu adicionei a coluna ID, que lista a identificação única de cada registro, e achei a propriedade TAG à qual você fez menção, contudo, mesmo depois de eu ter pesquisado em várias fontes, não sei como "guardar" essa identificação ou, ao menos, criar o código que retorne ao frmMain e exiba o registro selecionado pelo ID na ListView. ;)

Poderia me ajudar com algumas informações mais específicas?

Obrigado mais uma vez!

Ps.: Esse é o novo código do meu form de pesquisa, o Form1:

Private Conn As ADODB.Connection
Private rs As ADODB.Recordset
Private Lista As ListItem

Private Sub botpesquisar_Click()

If Text1.Text = "" Then
MsgBox "Digite o conteúdo da pesquisa.", vbOKOnly, "Conteúdo da pesquisa em branco..."
Text1.SetFocus
Else
preenche_lista
Label2.Caption = lstmostra.ListItems.Count
If Label2.Caption = "0" Then
MsgBox "Nenhuma ficha foi encontrada com o conteúdo informado.", vbOKOnly, "Resultado da Pesquisa"
End If
Text1.SetFocus
End If

End Sub

Private Sub Command1_Click()
Unload Me
frmMain.Show
frmMain.Enabled = True
End Sub

Private Sub Command2_Click()

        
End Sub

Private Sub Form_Load()
        
frmMain.Enabled = False
    
    Set Conn = New ADODB.Connection
    Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
      "Data Source=" & App.Path & "\ImageLib.mdb"
    Conn.Open
        
    Set rs = New ADODB.Recordset
    rs.Open "ImageLibrary", Conn, adOpenKeyset, adLockPessimistic, adCmdTable
    
        
End Sub

Private Sub preenche_lista()

Dim col As ColumnHeader

If Option1.Value = True Then

lstmostra.ColumnHeaders.Item(2).Text = ""

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Nome LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(2) = rs!ID
   rs.MoveNext
Loop

Exit Sub

End If

If Option2.Value = True Then

lstmostra.ColumnHeaders.Item(2).Text = "Vulgo"

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Vulgo LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(1) = rs!Vulgo
   Lista.SubItems(2) = rs!ID
   rs.MoveNext
Loop

Exit Sub

End If

If Option3.Value = True Then

lstmostra.ColumnHeaders.Item(2).Text = "Tatuagens"

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Tatuagens LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(1) = rs!Tatuagens
   Lista.SubItems(2) = rs!ID
   rs.MoveNext
Loop

Exit Sub

End If


If Option4.Value = True Then

lstmostra.ColumnHeaders.Item(2).Text = "Endereço"

On Error Resume Next
rs.Close
On erro GoTo trataerro
 rs.Open "SELECT * FROM ImageLibrary WHERE Endereco LIKE '%" & Text1.Text & "%' ORDER BY Nome", Conn

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(1) = rs!endereco
   Lista.SubItems(2) = rs!ID
   rs.MoveNext
Loop

Exit Sub

End If

trataerro:
   MsgBox Err.Description, vbCritical, "Erro no sistema", , "Erro n.º 098547."



End Sub

Private Sub Form_Unload(Cancel As Integer)
  Set Lista = Nothing
  Set rs = Nothing
  Set Conn = Nothing
End Sub

O Botão de finalizar a pesquisa e retornar ao frmMain já com a exibição do registro selecionado pelo ID é o command2, o qual está em branco. :(

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui:

lstmostra.ListItems.Clear
Do While Not rs.EOF
   Set Lista = lstmostra.ListItems.Add(, , rs!nome)
   Lista.SubItems(2) = rs!endereco

   Lista.Tag = rs!ID

   rs.MoveNext
Loop
Depois se você fizer...
if not lstmostra.SelectedItem is nothing then
  msgbox lstmostra.SelectedItem.Tag
endif

... você vai ver o ID do item selecionado na lstmostra (que você pode usar para se referir ao registro no outro form).

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ok!!! Problema parcialmente resolvido! :D

Ainda não encontro o caminho para me referir ao registro no outro form.

Estou fazendo algo assim:

Private Sub Command2_Click()
Dim criterio As String
    
    If lstmostra.SelectedItem Is Nothing Then
        MsgBox "Não há uma ficha selecionada.", vbOKOnly, "Visualizar"

    Else
        
  criterio = "rs!ID = 'lstmostra.SelectedItem.Tag'"
  rs.Find criterio, 0, adSearchForward
    frmMain.Show
    frmMain.Enabled = True
    Unload Me
    
    End If

End Sub

O frmMain é carregado, contudo não mostra o registro que havia sido selecionado na listview.

Já estou quase desistindo... :( e é a única coisa que falta para finalizar o programa...

Alguma última dica?

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz a correção, mas não houve nenhuma alteração. O frmMain ainda não exibe o registro que deveria ser apontado após a seleção do critério.... Mas beleza. Vou ver se eu compro um material sobre VB e relembro alguma coisa. B)

Muito Obrigado pelas dicas!

Abraços!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz a correção, mas não houve nenhuma alteração. O frmMain ainda não exibe o registro que deveria ser apontado após a seleção do critério....

Neste seu form tem uma datagrid ou algo do tipo para mostrar os registros? Ou tem caixas de texto? Se só tiver estas últimas, você precisará preenchê-las manualmente já que você não está usando um controle data-bound (como o ADODC).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Confesso que estou empolgado agora que o programa está funcionando 100% como é suposto (com sua ajuda, claro)! :D

Ele começará a ser utilizado a partir de amanhã, e eu sei que, com o passar do tempo, alguns bugs podem aparecer.

Agora, de fato, tenho que relembrar o que um dia aprendi e também aprender coisas novas.

O que acha destes livros? Conhece?

(Desculpe fugir do tópico)

Este é para VB 2005...

Microsoft Visual Basic 2005 - Passo a Passo

Michael Halvorson

BOOKMAN COMPANHIA EDITORA

ISBN: 8536307196

VB6...

VISUAL BASIC 6 - APRENDA EM 21 DIAS

PERRY,GREG

EDITORA CAMPUS

ISBN: 853520394X

Abraços!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...