|
|
|
|
|
Dicas
|
|
Visual Basic (Banco de Dados)
|
|
|
Título da Dica: Incluir em Banco de Dados e consultar atraves de um Listbox conforme nome for digitado
|
|
|
|
Postada em 1/9/2004 por geronimo
Fonte livro Editora Erika: Coloque em um form o seguinte 7 textbox 10 commandButton e um listBox Renomei um commandbutton7 como Nome_Completo_BTn os demais controles pode deixar com o nome gerado pelo VB depois coloque este codigo no form:
'Define uma variável global como 'sendo do tipo Database. A variável 'Agenda será utilizada para indicar o 'nome e o caminho (drive e diretório) 'do arquivo de banco de dados. No nosso 'caso, utilizaremos o arquivo alunos.mdb 'localizado em c:\livro.vb\alunos\ o qual 'possui duas tabelas (Nomes e Notas) Public Arquivo As Database 'Define variáveis globais como 'sendo do tipo Recordset. 'Os Recordsets Notas e Nomes serão 'utilizados para abrir as tebelas 'Nomes e Notas. Já o Recorset Alunos 'será utilizado para a pesquisa em 'SQL envolvendo as duas tabelas mencionadas. Public Nomes As Recordset Public Notas As Recordset Public Alunos As Recordset Function Atualiza_Campos() 'Para cada campo da tabela é verificado 'o valor do campo. Caso o valor seja 'maior do que zero, a caixa de texto 'apresenta o conteúdo do campo especificado 'entre parenteses. Se o valor não for maior 'do que zero, o conteúdo da caixa de texto 'é "zerado". Embora a tabela originalmente 'utilizada não apresente campos nulos ou vazios 'é interessante manter esse teste para o caso 'da tabela ser modificada. 'Como estamos relacionando as duas tabelas pelo 'número do aluno (vide consulta em SQL), 'é necessário especificar de qual tabela estaremos 'extraindo o número de cada alunos apresentado. 'Por isso, utilizamos Text1.Text = Alunos (0) , 'sendo que Alunos (0) representa o primeiro campo '(numero)da tabela. If Alunos(0).Value > 0 Then Text1.Text = Alunos(0) Else Text1.Text = "" End If 'Para os demais campos seguimos o 'procedimento normal. If Alunos("Nota").Value > 0 Then Text2.Text = Alunos("Nota") Else Text2.Text = "" End If If Alunos("Serie").Value > 0 Then Text3.Text = Alunos("Serie") Else Text3.Text = "" End If If Alunos("Nome").Value > 0 Then Text4.Text = Alunos("Nome") Else Text4.Text = "" End If End Function Function Limpa_Campos() 'Esta função limpa o conteúdo 'das caixas de texto utilizadas. Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = ""
End Function
Private Sub Command1_Click() Dim Mensagem As String Dim Consulta_SQL As String Dim Resultado As String Dim Contador As Integer, Total_encontrado As Integer
Contador = 0 Total_encontrado = 0
List1.Clear
Consulta_SQL = Text7.Text Set Alunos = Arquivo.OpenRecordset(Consulta_SQL, dbOpenSnapshot)
Limpa_Campos
Total_encontrado = Alunos.RecordCount
Text6.Text = Total_encontrado
If Total_encontrado > 1 Then List1.ToolTipText = "Clique em um dos nomes " + _ "disponíveis para verificar dados completos." Else List1.ToolTipText = "Nenhum nome disponível." End If
Do If Alunos.AbsolutePosition > -1 Then List1.AddItem (Alunos("nome")) Contador = Contador + 1 Alunos.MoveNext End If Loop Until Contador >= Total_encontrado
End Sub
Private Sub Command10_Click()
'Vai para o último registro válido Alunos.MoveLast Atualiza_Campos
End Sub
Private Sub Command2_Click()
Text7.Text = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Serie >= 1 AND " _ + "Nomes.Numero = Notas.Numero " _ + "ORDER BY Serie;" End Sub
Private Sub Command3_Click()
Text7.Text = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nomes.Numero >= 10 " _ + "AND Nomes.Numero = Notas.Numero " _ + "ORDER BY Serie;"
End Sub
Private Sub Command4_Click()
Text7.Text = "SELECT * " _ + "FROM Nomes, Notas" _ + "WHERE Nomes.Numero >= 10 " _ + "AND Nomes.Numero = Notas.Numero " _ + "ORDER BY Nome;" End Sub
Private Sub Command5_Click() 'Finaliza o programa. End End Sub
Private Sub Command6_Click() 'Nos leva ao primeiro registro 'da tabela consulta realizada 'pelo Recordset Alunos. Alunos.MoveFirst 'Chama a função que 'atualiza os campos '(ou conteúdo das 'caixas de texto) Atualiza_Campos End Sub
Private Sub Command8_Click() 'Nos leva ao registro anterior da 'tabela consulta realizada 'pelo Recordset Alunos. Alunos.MovePrevious 'Testa se atingimos um ponto antes 'do início dos registros. BOF significa 'Beginning Of File, que pode ser traduzido 'por Antes do Arquivo. Ao atingirmos essa 'posição, não poderemos atualizar os campos, 'dessa forma, utilizamos MoveFirst para ir 'ao primeiro (First) registro válido. If Alunos.BOF Then Alunos.MoveFirst End If 'Caso tentássemos atualizar os campos (caixas 'do tipo texto)sem a verificação anterior e 'estivéssemos em BOF, o programa daría erro. 'A seguir, é chamada a função para atualização 'dos campos. Atualiza_Campos End Sub
Private Sub Command9_Click()
'Vamos para o próximo registro da 'consulta especifica no Recordset Alunos. Alunos.MoveNext 'Verificamos se foi atingido o final 'do arquivo (EOF que significa 'End Of File e pode ser traduzido 'exatamente como Final de Arquivo). 'Caso essa posição tenha sido atingida, 'vamos para o último registro válido, 'utilizando MoveLast. If Alunos.EOF Then Alunos.MoveLast End If 'O próximo comando executa a rotina que 'atualiza as caixas de texto do formulário 'com o conteúdo do registro atual resultante 'de uma das operações anteriores (MoveNext ou 'MoveLast). Caso seja atingido a posição EOF 'e fosse solicitada a atualização dos campos, 'o programa acusaria um erro, pois o registro 'não seria válido. Com o teste anterior, 'fica contornado o problema, sendo apresentado 'um registro válido. Atualiza_Campos
End Sub
Private Sub Form_Load()
Dim Relacionamento As String 'Quando o formulário é carregado, o arquivo 'c:\livro.vb\alunos\alunos.mdb é lido e 'amarrado à variável Arquivo, conforme indicado 'a seguir. Essa variável foi declarada em 'General - Declarations. Set Arquivo = OpenDatabase(App.Path & "\alunos.MDB", False)
'Após a abertura do arquivo, vamos abrir as tabelas 'Nome e Notas, associando-as aos Recordsets Nomes e 'Notas, declarados em General - Declarations. Set Nomes = Arquivo.OpenRecordset("Nomes", dbOpenDynaset) Set Notas = Arquivo.OpenRecordset("Notas", dbOpenDynaset)
'Monta a pesquisa SQL e relacionamento entre as duas tabelas. 'Ele pode ser traduzido da seguinte maneira 'SELECIONE todos os campos (representado pelo asterístico) 'LOCALIZADOS NAS TABELAS Nomes e Notas 'ONDE o campo numero (tabela nomes)=campo numero (tabela notas) Relacionamento = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nomes.Numero = Notas.Numero;"
'É aberto um novo Recorset com a pesquisa montada 'em Relacionamento. Note que Relacionamento é apenas 'uma String que armazena as instruções em SQL. Caso 'desejássemos, poderíamos substituir a variável 'Relacionamento (apresentada a seguir) pela própria 'consulta. Dessa forma, o comando a seguir ficaria 'com uma estrutura similar à essa: 'Set Alunos = Arquivo.OpenRecordset("SELECT * ...." Set Alunos = Arquivo.OpenRecordset(Relacionamento, dbOpenDynaset)
'Levamos as duas tabelas para o 'primeiro registro utilizando o 'MoveFirst, mostrado a seguir. Alunos.MoveFirst
Atualiza_Campos
Text7.Text = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Serie >= 2 " _ + "AND Nomes.Numero = Notas.Numero " _ + "ORDER BY Nome;" End Sub
Private Sub List1_Click() 'Faz a pesquisa por Nome no Banco de 'Dados utilizando SQL.
'Inicialmente, o usuário deverá especificar 'as primeiras letras (ou a primeira parte 'do nome a ser pesquisado), como por exemplo 'Ma, na caixa de texto localizada 'logo abaixo da caixa de texto (Text5.Text). 'Uma vez digitada alguma coisa nessa caixa de 'texto, uma rotina específica será executada para 'verificar todos os nomes que possuem, em seu 'início, as letras especificadas. Os nomes que 'atendem a essa pesquisa serão apresentado no 'ListBox. Caso o usuário deseje verificar 'outras informações sobre um determinado aluno 'apresentado no ListBox, basta clicar sobre esse 'nome que a rotina apresentada a seguir será executada.
'Declara as variáveis utilizadas. Dim Dado As String, Mensagem As String Dim Consulta_SQL As String Dim Resultado As String Dim Registro As Long 'Pesquisa o nome selecionado (List1.Text) 'atribuindo-o à variável Dado. Dado = List1.Text
'Monta o comando SQL e o armazena na String Consulta_SQL. 'Note que o relacionamento é mantido com à utilização de 'AND Nomes.Numero = Notas.Numero Consulta_SQL = "SELECT * FROM Nomes, Notas WHERE Nome = '" _ + Dado + "' AND Nomes.Numero = Notas.Numero;" 'O Recordset Alunos recebe o resultado da 'pesquisa SQL montada em Consulta_SQL . Set Alunos = Arquivo.OpenRecordset(Consulta_SQL, dbOpenSnapshot)
'Caso a propriedade AbsolutePosition seja maior do que -1 'isso indica que a pesquisa encontrou o nome especificado. 'Para indicar o valor de AbsolutePosition, montamos a mensagem 'a seguir e a exibimos em um MsgBox, independente do seu valor. 'Para apresentar a mensagem, basta retirar o termo 'Rem (de Remark ou comentário) Rem Mensagem = "Posição retornada por Pesquisa.AbsolutePosition = " + _ Str(Alunos.AbsolutePosition) 'Para apresentar a mensagem, basta retirar o termo 'Rem (de Remark ou comentário) Rem Resultado = MsgBox(Mensagem, vbInformation) 'Limpa as caixas de texto, 'executando a função a seguir Limpa_Campos
'Agora, testamos o valor da propriedade AbsolutePosition 'a qual nos indica o sucesso ou não da pesquisa, conforme 'comentado anteriormente. If Alunos.AbsolutePosition > -1 Then 'Mostramos o nome encontrado Mensagem = "Nome encontrado: " + Alunos("nome") Resultado = MsgBox(Mensagem, vbInformation) Atualiza_Campos Else
Resultado = MsgBox("Nome não encontrado.", vbInformation) End If
'Os comandos apresentados a seguir restauram 'o controle para a pesquisa feita originalmente 'no Form Load. Caso não utilizássemos essas 'instruções, uma vez apresentado o nome do 'aluno e seus dados, nós não conseguríamos 'navegar da mesma forma com os botões 'Primeiro Anterior Próximo e Último. Veja 'como procedemos:
'Verificamos o número do aluno e 'ançamos esse resultado na variável 'Registro (conforme mostrado a seguir). 'Esse valor será utilizado mais adiante 'para reposicionar o registro atual. Registro = Alunos(0)
'Informamos o número desse registro Resultado = MsgBox(Registro, vbInformation) 'Montamos o mesmo relacionamento 'feito no Form Load. Relacionamento = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nomes.Numero = Notas.Numero;"
'Remontamos o Recorset Alunos, para que a 'navegação pelos botões funcione normalmente. Set Alunos = Arquivo.OpenRecordset(Relacionamento, dbOpenDynaset)
'Como o número dos alunos é crescente, 'esse número (do aluno) praticamente 'corresponde ao número do registro. 'A única diferença é que os registro 'no banco de dados iniciam com zero 'e o primeiro aluno da tabela recebe 'o número 1 (um). Dessa forma, o registro '0 corresponde ao aluno 1, o registro 1 'corresponde ao aluno 2 e assim por diante. 'Por isso ao diminuirmos 1 da variável Registro, 'estaremos obtendo sua posição na tabela. Registro = Registro - 1
'Finalmente, movemos a pesquisa Alunos para 'o valor indicado pela variável Registro que, 'conforme mencionado, representa a posição 'do nome encontrado. Alunos.Move Registro
End Sub
Private Sub Nome_Completo_Btn_Click() 'Faz a pesquisa por Nome no Banco de Dados 'utilizando uma estrutura SQL. 'Se não localizar o registro, mostra 'a mensagem de "Não Existe".
Dim Dado As String, Mensagem As String Dim Consulta_SQL As String Dim Resultado As String Dim Registro As Long 'Verifica o númro do aluno 'atualmente apresentado na tela Registro = Alunos(0)
'Solicita o nome completo a ser pesquisado. Dado = InputBox("Informe o Nome Completo")
'Monta o comando SQL e o armazena na String Consulta_SQL Consulta_SQL = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nome = '" + Dado + "' " _ + "AND Nomes.Numero = Notas.Numero;" 'Montamos um novo Recorset com a consulta 'desejada e o 'atribuímos à variável 'Alunos (declarada em General - Declarations). Set Alunos = Arquivo.OpenRecordset(Consulta_SQL, dbOpenSnapshot)
'Caso a propriedade AbsolutePosition seja maior do que -1 'isso indica que a pesquisa encontrou o nome especificado. 'Para indicar o valor de AbsolutePosition, montamos a mensagem 'a seguir e a exibimos em um MsgBox, independente do seu valor. Mensagem = "Posição retornada por Pesquisa.AbsolutePosition = " + _ Str(Alunos.AbsolutePosition) Resultado = MsgBox(Mensagem, vbInformation) 'Limpa as caixas de texto, 'executando a função a seguir Limpa_Campos
'Agora, testamos o valor da propriedade AbsolutePosition 'a qual nos indica o sucesso ou não da pesquisa, conforme 'comentado anteriormente. If Alunos.AbsolutePosition > -1 Then 'Mostramos o nome encontrado Mensagem = "Nome encontrado: " + Alunos("nome") Resultado = MsgBox(Mensagem, vbInformation) 'Caso o nome especificado tenha sido encontrado, 'verificamos o número desse aluno. Esse número 'será utilizado posteriormente para apresentar 'os dados desse aluno na tela e preservar a 'possibilidade de navegação. Registro = Alunos(0)
'Atualizamos os campos na tela. Atualiza_Campos Else
Resultado = MsgBox("Nome não encontrado.", vbInformation) End If
'Montamos o mesmo relacionamento 'feito no Form Load. Relacionamento = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nomes.Numero = Notas.Numero;"
'Remontamos o Recorset Alunos, para que a 'navegação pelos botões funcione normalmente. Set Alunos = Arquivo.OpenRecordset(Relacionamento, dbOpenDynaset)
'Utilizamos o valor do registro para 'posicionar a tabela no registro encontrado 'ou no registro original (antes da pesquisa ser 'efetuada) caso o nome especificado não tenha 'sido encontrado. Nessa tabela, o aluno número 1 'possui registro 0, o aluno número 2 possui registro '1 e assim por diante (os registro iniciam em 0 'enquanto o número dos alunos iniciam em 1). Com a 'operação mostrada a seguir, a partir do número 'do aluno, descobrimos o seu registro na tabela. Registro = Registro - 1
'Posicionamos a tabela no registro correspondente 'ao nome encontrado ou no registro ativo antes 'da pesquisa, caso nenhhum nome tenha sido encontrado. Alunos.Move Registro
'Atualizamos os campos. Atualiza_Campos
End Sub
Private Sub Text1_Change()
End Sub
Private Sub Text5_Change() 'Faz a pesquisa por Nome no Banco de Dados 'utilizando SQL. Note que essa procedure é 'executada quando alguma alteração ocorre na 'caixa de texto (quando o usuário digita 'alguma coisa). O texto disponível nessa caixa 'de texto é utilizado na pesquisa SQL, 'verificando os nomes que começam com as letras 'digtadas. Os nomes encontrados são apresentados 'em um ListBox. Por exemplo, podemos pesquisar 'todos os nomes que começam com José ou com Jo . 'Nesse sgundo caso, serão apresentados nomes tais 'como José, João, Joana, etc. Ao clicar sobre um nome 'no ListBox, serão apresentados os dados referentes a 'ao aluno selecionado.
'Declaramos as variáveis utilizadas. Dim Dado As String, Mensagem As String Dim Consulta_SQL As String Dim Resultado As String Dim Contador As Integer, Total_encontrado As Integer '"Zeramos" as variáveis utilizadas 'para colocar os nomes encontrados 'dentro do ListBox. Contador = 0 Total_encontrado = 0 'Limpamos o ListBox. List1.Clear
'O nome (ou o início dele) a ser 'pesquisado é atribído à variável Dado. Dado = Text5.Text
'Monta o comando SQL e o armazena na String Consulta_SQL. 'Veja que após o nome pesquisado é colocado um asterístico 'Dado + "*'", para indicar que podem existir outras letras 'além das especificadas. Consulta_SQL = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nome LIKE '" _ + Dado + "*'" _ + "AND Nomes.Numero = Notas.Numero " _ + "ORDER BY Nome;" 'A variável Alunos (definida como sendo do tipo Recordset 'em General - Declarations) recebe o resultado da pesquisa 'SQL montada em Consulta_SQL . ' Set Alunos = Arquivo.OpenRecordset(Consulta_SQL, dbOpenSnapshot)
'Limpa as caixas de texto, 'executando a função a seguir. Limpa_Campos
'Agora, testamos o valor da propriedade AbsolutePosition 'a qual nos indica o sucesso ou não da pesquisa, conforme 'comentado anteriormente.
'Verificamos o total de alunos encontrados. Total_encontrado = Alunos.RecordCount
'Em seguida, apresentamos esse 'total na caixa de texto Text6. Text6.Text = Total_encontrado
'Alteramos o ToolTip (aquela barra amarela 'com algum texto explicativo, a qual é 'apresentada quando passamos com o mouse sobre 'um objeto - botão, caixa de texto, listbox. etc.
If Total_encontrado > 1 Then 'Caso tenha sido encontrado algum aluno, 'ajustamos o seguinte ToolTip. List1.ToolTipText = "Clique em um dos nomes " + _ "disponíveis para verificar dados completos." Else 'Entretanto, caso a pesquisa não encontre 'pelo menos um aluno com o nome especificado, 'alteramos o ToolTip para o seguinte texto: List1.ToolTipText = "Nenhum nome disponível." End If
'O loop Do...Until, utilizado a seguir, 'coloca os nomes encontrado no ListBox. Do 'É feito um teste para verificar a posição 'absoluta do registro que será mostrado. 'Esse teste é apenas uma precaução para que 'não se tente mostrar um registro inexistente. If Alunos.AbsolutePosition > -1 Then 'Adiciona o nome encontrado no ListBox. List1.AddItem (Alunos("nome")) 'A variável Contador (zerada no início desta 'procedure) é incrementada. Ela está sendo 'utilizada para contar o total de registros 'apresentados aos usuários. Contador = Contador + 1 'Como a pesquisa SQL foi ordenada por Nome '(veja o trecho final da instrução SQL ORDER BY Nome;) 'agora vamos para o próximo registro, 'utilizando a instrução MoveNext. Alunos.MoveNext End If 'O loop Do...Loop Until é executado enquanto o 'Contador for menor ou igual ao total de resgistros 'encontrados (utilizando a variável Total_encontrado) Loop Until Contador >= Total_encontrado 'Vamos reajustar o Recordeset Alunos, para que 'a navegação pelos botoões novamente seja possível. Relacionamento = "SELECT * " _ + "FROM Nomes, Notas " _ + "WHERE Nomes.Numero = Notas.Numero;"
'Remontamos o Recorset Alunos, para que a 'navegação pelos botões funcione normalmente. Set Alunos = Arquivo.OpenRecordset(Relacionamento, dbOpenDynaset)
'Finalmente, movemos a pesquisa Alunos para 'o primeiro registro válido. Alunos.MoveFirst
Atualiza_Campos
End Sub
|
|
|
|
|