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

Efetuar busca de cadastros no bd e jogar em um controle apropriado


ƒ Edu ƒ

Pergunta

Pessoal, gostaria de saber qual o controle apropriado para exibir uma lista de cadastros armazenada em um BD Access durante uma busca?

Seria uma busca de alunos, e quero exibir no resultado somente Nome, Matricula, RG e alguns dados principais, mas não sei qual o controle utilizo, pois é a primeira vez que tenho esta necessidade.

Li sobre o DataGrid, mas pelo que entendi, tenho que usar outro controle junto chamado "Data", mas este é desnecessário à minha necessidade.

Pensei em um controle que eu apenas efetuo a busca, coloco os dados do aluno no controle através de um additem ou algo parecido... O que vocês me sugerem?

Abraços.

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

O DataGrid mesmo, eu mesmo gosto muito, todos meus programas uso DataGrid e não precisa de outro controle vinculado a ele não.

faz assim:

No general declarations, declare o command e o recordset:

Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset
Agora crie uma sub para preencher o Datagrid, depois chama ela no Load do Form pra ficar mais arrumado, exemplo:
Private Sub preenche_grid()  'sub para preencher o grid

With cmd
    .ActiveConnection = cnn 'nome da sua conexão
    .CommandType = adCmdText
    .CommandText = "select Nome, matricula, rg from tabela_alunos"   'seleciona os dados da tabela que quer ver no grid
    Set rs = .Execute
End With
With rs
    Set DataGrid1.DataSource = rs    'aqui já lança os dados no Datagrid
End With
    
End Sub
Pronto! agora é só chamar esta sub no load do form assim:
Private Sub Form_Load()

preenche_grid

End Sub

Link para o comentário
Compartilhar em outros sites

  • 0
O DataGrid mesmo, eu mesmo gosto muito, todos meus programas uso DataGrid e não precisa de outro controle vinculado a ele não.

faz assim:

No general declarations, declare o command e o recordset:

Dim cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

Uma dúvida... Eu posso declarar esse command e esse outro rs no mesmo modulo que eu utilizei para as conexões do BD? Se sim, só teria que alterar o nome desse recordset ai né, ou posso utilizar 1 recordset para as duas funções?

Em relação ao Grid... Na tela de busca de alunos, caso o usuário escola o critério de busca por "Nome", e havendo vários alunos com o mesmo nome, o resultado deve ser exibido no Grid só que, o usuário precisará dar um click duplo no aluno desejado para exibir o cadastro por completo em outro form. O Grid tem essa função de click para exibir os dados em outro form?

Desde já, agradeço pelo esclarecimento.

Abraço.

Editado por ƒ Edu ƒ
Link para o comentário
Compartilhar em outros sites

  • 0

"Eu posso declarar esse command e esse outro rs no mesmo modulo que eu utilizei para as conexões do BD?"

Com certeza Edu, pode declara-los no modulo e utiliza-los no Form

"ou posso utilizar 1 recordset para as duas funções?"

Qual a outra função que você se refere? lembrando que um recordset é uma consulta, ou seja, imagine como uma tabela pronta que você esta visualizando dados, caso essa outra função não tenha a ver com a visualização destes mesmos dados, então deve usar outro Recordset sim

"Na tela de busca de alunos, caso o usuário escola o critério de busca por "Nome", e havendo vários alunos com o mesmo nome, o resultado deve ser exibido no Grid só que, o usuário precisará dar um click duplo no aluno desejado para exibir o cadastro por completo em outro form. O Grid tem essa função de click para exibir os dados em outro form? "

Com certeza EDU! isso é o que eu mais faço quando uso o DataGrid

Se já conseguio fazer os dados aparecerem no Datagrid me diz que a gente passa para a proxima etapa, beleza?

Link para o comentário
Compartilhar em outros sites

  • 0
Se já conseguio fazer os dados aparecerem no Datagrid me diz que a gente passa para a proxima etapa, beleza?

Então Macedo... Nem consegui ainda fazer com que os dados sejam exibidos no DBGrid.

To usando o código que me passaram aqui:

Public Sub Preenche_Grid()

With cmd

.ActiveConnection = bd 'Esta linha é destacada quando o erro é apresentado

.CommandType = adCmdText

.CommandText = "select Nome, matricula, rg from tbaluno"

Set rs = .Execute

End With

With rs

Set DBGrid1.DataSource = rs

End With

End Sub

Declarei isto em um módulo, estou chamando esta sub no evento load do form onde está o DBGrid1, mas ai ele me retorna o seguinte erro:

Run-time error '91

Object variable or With block variable not set

No topo do módulo tenho declarado as seguintes variáveis:

Global bd As New ADODB.Connection

Global rs As ADODB.Recordset

Global cmd As ADODB.Command

O que será que está errado?

Link para o comentário
Compartilhar em outros sites

  • 0

Ainda não consegui fazer funcionar...

Preciso usar este código aqui, porque o outro não cabe à minha necessidade:

Private Sub Preencher_Grid()

strbusca = TxtBusca

Abrir_Banco

sql = "select codaluno,nomealuno from tbaluno where nomealuno= '" & strbusca & "'"

Set rs = New ADODB.Recordset

rs.CursorLocation = adUseClient

rs.Open sql, bd, adOpenStatic, adLockOptimistic

If Not rs.EOF Then

Set Grid1.DataSource = rs

Grid1.MarqueeStyle = dbgHighlightRowRaiseCell

Grid1.Columns.Item(0).Caption = "Cod"

Grid1.Columns.Item(0).Width = 600

Grid1.Columns.Item(1).Caption = "Aluno"

Else

MsgBox "Aluno não encontrado", vbInformation, "Aviso"

End If

rs.Close

Set rs = Nothing

End Sub

O DataGrid só deverá ser preenchido quando eu efetuar uma busca por nome, e no DataGrid só deve aparecer os alunos de nome solicitado na busca. Caso o aluno buscado não exista, a mensagem deve ser apresentada informando isto.

Não consegui adaptar o outro código para isto, eu vejo nos tutoriais, o código pra preencher um grid é tão simples, mas comigo não funciona. Em outros projetos que vejo na net, os caras colocam apenas "Set DataGrid.DataSource = Rs" e o grid é preenchido, eu sou muito zicado mesmo. :blush:

Link para o comentário
Compartilhar em outros sites

  • 0

Então... O código ta assim:

Esta sub ta declarada no general do form de busca.

Private Sub Preencher_Grid()
strbusca = TxtBusca   
    BD_Conexao.Abrir_Banco
    sql = "select codaluno,nomealuno from tbaluno"
    sql = sql & " where tbaluno.nomealuno like '" & strbusca & "%'"
    Set rs = New ADODB.Recordset
    rs.Open sql, bd, adOpenStatic, adLockOptimistic
  
    If Not (rs.EOF and rs.BOF) Then
        Set Grid1.DataSource = rs
        Grid1.Columns.Item(0).Caption = "Mat."
        Grid1.Columns.Item(0).Width = 650
        Grid1.Columns.Item(1).Caption = "Aluno"
    Else
        MsgBox "Aluno não encontrado", vbInformation, "Aviso"
    End If
  
        rs.Close
        Set rs = Nothing
End Sub
A sub está absolutamente correta conforme a orientação que tive aqui e em outro forum, o problema é o seguinte: Este é o botão de busca. Se eu usar SELECT CASE ou qualquer outra tomada de decisão para ler o critério de busca selecionado pelo usuário, a sub Preencher_Grid não funciona, simplesmente os dados não aparecem no Grid. Não apresenta nenhum erro, são não preenche o grid.
Private Sub cmdBuscar_Click()
strbusca = TxtBusca

If TxtBusca = "" Then
    MsgBox "Digite o dado para busca de acordo com o critério escolhido.", vbInformation, "Aviso"
    TxtBusca.SetFocus
Else

'Teste das opções de busca
Select Case Option1 Or Option2 Or Option3

Case Option1 = True
If Not IsNumeric(TxtBusca.Text) Then
  MsgBox "O dado informado não corresponde ao critério de busca utilizado.", vbInformation, "Aviso"
  TxtBusca.SetFocus
  Exit Sub
Else
    BD_Conexao.Abrir_Banco
    sql = "SELECT tbaluno.*, tbfiliacao.* "
    sql = sql & " FROM tbaluno INNER JOIN tbfiliacao ON tbaluno.codaluno = tbfiliacao.codaluno"
    sql = sql & " Where tbaluno.codaluno = " & strbusca & ""
        Set rs = New ADODB.Recordset
        rs.CursorLocation = adUseClient
        rs.Open sql, bd, adOpenStatic, adLockOptimistic
        Exibir_Aluno
        rs.Close
        Set rs = Nothing
        Fechar_Banco
End If

Case Option2 = True
    
    Preencher_Grid
    Fechar_Banco

Case Option3 = True
    
    Call Abrir_Banco
    sql = "SELECT tbaluno.*, tbfiliacao.* "
    sql = sql & " FROM tbaluno INNER JOIN tbfiliacao ON tbaluno.codaluno = tbfiliacao.codaluno"
    sql = sql & " Where tbaluno.rg = '" & strbusca & "'"
        Set rs = New ADODB.Recordset
        rs.CursorLocation = adUseClient
        rs.Open sql, bd, adOpenStatic, adLockOptimistic
    Exibir_Aluno
    rs.Close
    Set rs = Nothing
    Fechar_Banco
End Select
End If
End Sub
Já tentei com IF e também não funcionou. No módulo eu tenho declarado isso:
Global bd As New ADODB.Connection
Global rs As New ADODB.Recordset
Global cmd As New ADODB.Command


Public Sub Abrir_Banco()
    bd.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source =" & _
    App.Path & "\bd1.mdb"
    bd.CursorLocation = adUseClient
    bd.Open
End Sub


Public Sub Fechar_Banco()
    bd.Close
    Set bd = Nothing
End Sub

Será que não tem como fazer isso? Ou pelomenos deixar uma busca com 2 critérios, por matrícula ou nome, acho que isto não pode faltar neste programa.

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0

a mas você não pode fechar o RecordSet depois. quando você seta o RecordSet no DataGrid, o grid fica vinculado com o RecordSet. assim q você fechar o RecordSet ele não vai ter mais nada, por consequencia o grid tb não.

você não pode fechar o RecordSet e muito menos a conexao. só feche os dois na hora q você não precisar mais mostrar nd no grid.

Link para o comentário
Compartilhar em outros sites

  • 0
a mas você não pode fechar o RecordSet depois. quando você seta o RecordSet no DataGrid, o grid fica vinculado com o RecordSet. assim q você fechar o RecordSet ele não vai ter mais nada, por consequencia o grid tb não.

você não pode fechar o RecordSet e muito menos a conexao. só feche os dois na hora q você não precisar mais mostrar nd no grid.

Funcionoooooooooouuuuuuuuuuuuuuuuuu!!!

Valeu mesmo Kuroi! Eu já estava quase mudando o projeto.

Mas e agora como posso fazer para efetuar uma nova busca sem ter que fechar o form ou algo do tipo. Porque da forma que ficou, ele acusa que o objeto está aberto...

Link para o comentário
Compartilhar em outros sites

  • 0
Mas e agora como posso fazer para efetuar uma nova busca sem ter que fechar o form ou algo do tipo. Porque da forma que ficou, ele acusa que o objeto está aberto...

ai de um Close no RecordSet antes de abrir (antes da linha rs.Open sql, bd, adOpenStatic, adLockOptimistic).

ou simplesmente troque a linha rs.Open sql, bd, adOpenStatic, adLockOptimistic por Set rs = bd.Execute(sql)

Link para o comentário
Compartilhar em outros sites

  • 0
Mas e agora como posso fazer para efetuar uma nova busca sem ter que fechar o form ou algo do tipo. Porque da forma que ficou, ele acusa que o objeto está aberto...

ai de um Close no RecordSet antes de abrir (antes da linha rs.Open sql, bd, adOpenStatic, adLockOptimistic).

ou simplesmente troque a linha rs.Open sql, bd, adOpenStatic, adLockOptimistic por Set rs = bd.Execute(sql)

Eu tentei fazer isto, mas quando executo, logo na primeira busca já diz que o objeto está fechado. Ai eu fiz o seguinte, logo no início da sub do botão buscar, eu coloquei:

Set rs = Nothing
Set bd = Nothing

Não sei se fiz certo, mas se eu usasse o Rs.Close e bd.Close não rolava.

Link para o comentário
Compartilhar em outros sites

  • 0

Onde quer que eu posicione o "Rs.Close" antes da execução, ele me retorna o erro "Run Time Error ' 3704 ': Operação não permitida quando o objeto está fechado"

Private Sub Preencher_Grid()
strbusca = TxtBusca
    BD_Conexao.Abrir_Banco
    sql = "select codaluno,nomealuno from tbaluno"
    sql = sql & " where tbaluno.nomealuno like '" & strbusca & "%'"
    Rs.Close             'Se eu colocar o Rs.Close nesta linha, é apresentado o erro.
    Set rs = New ADODB.Recordset
    rs.Open sql, bd, adOpenStatic, adLockOptimistic
    
    If Not rs.EOF Then
        Set Grid1.DataSource = rs
        Grid1.Columns.Item(0).Caption = "Mat."
        Grid1.Columns.Item(0).Width = 650
        Grid1.Columns.Item(1).Caption = "Aluno"
    Else
        MsgBox "Aluno não encontrado", vbInformation, "Aviso"
    End If
End Sub
Private Sub Preencher_Grid()
strbusca = TxtBusca
    BD_Conexao.Abrir_Banco
    sql = "select codaluno,nomealuno from tbaluno"
    sql = sql & " where tbaluno.nomealuno like '" & strbusca & "%'"
    Rs.Close             'Se eu colocar o Rs.Close nesta linha, é apresentado o erro.
    Set rs = New ADODB.Recordset
    Rs.Close                         'Assim também da erro. 
    set rs = bd.Execute(sql)

    If Not rs.EOF Then
        Set Grid1.DataSource = rs
        Grid1.Columns.Item(0).Caption = "Mat."
        Grid1.Columns.Item(0).Width = 650
        Grid1.Columns.Item(1).Caption = "Aluno"
    Else
        MsgBox "Aluno não encontrado", vbInformation, "Aviso"
    End If
End Sub

Não importa o local onde eu coloque o Rs.Close, sempre vem o erro: Run Time Error ' 3704 ': Operação não permitida quando o objeto está fechado.

Se eu fizer o esquema de colocar o RS e o BD como Nothing no início do código no botão Buscar, ai não da erro, mas assim ele destroi os dois ao invés de fechar certo? Será que destruir os dois não é o mesmo que fechar e depois setar como Nothing?

Editado por ƒ Edu ƒ
Adicionar Tag CODE
Link para o comentário
Compartilhar em outros sites

  • 0
a ta é q da primeira vez ele já vai estar fechado então vai dar erro mesmo. tenta assim:

If Rs.State <> 0 Then Rs.Close
Muito bom Kuroi, mas tive que aplicar o mesmo raciocínio para o bd.Close, pois só fechando o RS ele ainda falava que o BD já estava aberto. Então eu fiz assim:
If (rs.State <> 0) and (bd.State <> 0) then
      Rs.Close
      bd.Close
End If

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...