Escolar Documentos
Profissional Documentos
Cultura Documentos
DADOS
O Mtodo Show abre um novo formulrio a partir de outro, e usamos ele para abrir
o formulrio frmCadMercadoria.
Vamos aproveitar e codificar a opo Sair do menu tambm. D dois clicks nele e
digite:
Este simples comando END encerra toda a aplicao fechando todas as janelas
que podem estar abertas.
Para completar este raciocnio, vamos at o formulrio frmCadMercadoria e para o
boto cmdSair vamos fazer a seguinte codificao:
Se este ajuste no for feito e um objeto de banco de dados for declarado, o Visual
Basic gerar um erro. A biblioteca DAO (Data Access Objects) fornece um conjunto de
objetos de programao que precisaremos usar para gerncia os Bancos de Dados.
Temos que criar agora duas variveis do tipo Banco de Dados e outra do tipo
Tabela. Uma servir para fazer referncia ao nome e caminho do Banco de Dados como um
todo, e a outra ir fazer referncia a uma tabela especifica.
Onde criar estas variveis?
No nosso exemplo temos que cri-las na seo General da janela de codificao do
formulrio. Variveis criadas ali possuem abrangncia em todo o formulrio. Se criarmos
ela dentro de alguma outra rotina (ou vento) a abrangncia destas variveis sero somente
dentro da prpria rotina.
A varivel BancoDeDados do tipo Database pois ela sempre ter em seu contedo
o nome do banco de dados que ser aberto. Depois criamos uma varivel para a tabela de
Mercadoria de nome TBMercadoria.
Prximo passo abrir o ndice que esta tabela ir trabalhar. Este ndice necessrio
para ordenar os dados que forem digitados num determinada ordem (no nosso caso a ordem
por cdigo) e fazer uma procura rpida pela chave de indexao.
O ndice da tabela Mercadoria o IndCdigo e possui como chave de indexao o
campo Cdigo.
extremamente importante Fechar todas tabelas e banco de dados toda vez que
sairmos de um programa ou formulrio. Arquivos abertos perigoso e pode trazer
resultados indesejveis.
Fazendo isto quando o usurio apertar o boto incluir, os botes que ele no pode
pressionar enquanto no concluir a incluso ficaro desabilitados. Deve-se fazer isto para
todos os botes.
No evento click do boto gravar habilite todos novamente. Com exceo do prprio
boto gravar que no pode ser habilitado ate que se incluia ou altere algo.
Outro detalhe que bom lembrar desabilitar o boto Gravar no evento
Form_Load para que esteja devidamente desabilitado quando entrar na janela de cadastro
de mercadoria. Desabilitamos tambm o Frame, pois assim todos os objetos contido
dentro dele sero tambm desabilitados. Fazemos isto para que o usurio no fique
"passeando" pelas caixas de texto sem definir antes (atravs dos botes) o que ele quer
fazer.
Uma formatao para as caixas de texto que receber numeros bem vindo para dar
um aspecto visual mais interessante.
Criamos uma formatao para as caixas de texto no evento LostFocus para quando
o usurio terminar de digitar o valor se ajustar.
Habilitamos a tecla Enter criando um evento KeyPress no formulario. No esquecer
de habilitar a propriedade KeyPreview.
Vamos usar esta funo sempre que precisarmos que as caixas de texto fiquem
vazias.
TBMercadoria.AddNew
TBMercadoria("Cdigo") = 001
Esta rotina o padro para incluso de dados.Repare que sempre inicia com
AddNew e termina com Updated Neste exemplo colocamos expresses string para serem
inseridas nos campos, mas poderiamos ter colocado variveis.
No nosso exemplo vamos colocar as caixas de texto. Ficaria assim:
TBMercadoria.AddNew
TBMercadoria("Cdigo") = txtCdigo
TBMercadoria("Descrio") = txtDescrio
TBMercadoria("Quantidade") = txtQuantidade
TBMercadoria("Valor") = txtValor
TBMercadoria.Updated
Desta forma o que o usurio digitar nas caixas de texto sero includos dentro dos
campos da tabela.
Isto uma forma simplificada de fazer incluso de dados. Mas ns vamos usar um
forma mais complexa:
Veja o que foi feito: Sempre que o usurio clicar neste boto o programa limpa o
formulrio para deixar as caixas de texto vazias para serem preenchidas com novos dados.
O Frame habilitado para que as caixas de texto possam ser manipuladas. Em seguida o
foco passado para o caixa de texto txtCdigo pois a primeira que deve ser digitada pelo
usurio
Ainda no aplicamos o mtodo AddNew pois ainda no sabemos se o usurio vai
incluir um cdigo vlido. Primeito o programa tem que analizar o cdigo que ele digitou,
verificar se ele realmente no existe para depois usar o mtodo AddNew. Fazemos isto no
evento LostFocus da Caixa de Texto txtCdigo.
Neste evento verificamos primeiramente se o boto CmdGravar esta habilitado. Se
estiver porque a incluso foi acionada.
O programa procura o cdigo digitado. Se ele existir sera dado um aviso ao usuario
e o processo de incluso ser cancelado, caso contrrio (ou seja, se o cdigo no existir
dentro da tabela) o mtodo AddNew chamado a fim de preparar a tabela para receber um
novo registro.
Pronto, a janela j esta preparada para receber os dados. Mas agora falta fazer a codificao
para o boto Gravar.
Tente incluir vrios dados na tabela para podermos us-los posteriormente nos
prximos exerccios.
Um recurso interessante que pode ser acrescentado desabilitar os botes de
Alterao, Consulta , Excluso, Anterior e Prximo quando a tabela estiver vazia,
pois se no houver nenhum registro, no vai haver nada para alterar, consultar,
excluir, etc. Somente o boto de incluso que poder ficar habilitado.
A maneira mas usual de saber se a tabela esta vazia ou no atravs da propriedade
RecordCount que infoma quantos registros existem gravados dentro da tabela.
Estes botes sero usados o usurio passear pela tabela, verificando os dados de
todos os registros cadastrados na ordem especificada pelo Index.
O boto Prximo ir mostrar na tela o prximo registro existente. Note que para
fazer este movimento usamos a propriedade MoveNext (mova para o prximo), depois
fazermos um teste com a propriedade EOF para verificar se foi movido para o ultimo
registro na tabela. Se estiver no ltimo, dali ele no pode passar pois no encontrar nada.
Encontrando ento o ultimo registro, se tentar passar dali a propriedade MovePrevious
(move para o anterior) acionado. Depois disto atualizamos o formulrio.
O boto Anterior possui a mesma lgica, mas invertemos as outras propriedades
para fazer agora o teste de inicio de arquivo. Ou seja, se o usurio estiver no primeiro
registro ele no poder voltar um registro, pois antes do primeiro no existira nada.
Se voc usar MoveNext quando o ltimo registro for o atual, a propriedade EOF
ser configurada para True e no haver registro atual. Se voc usar MoveNext novamente,
um erro ocorrer; EOF permanece True. Se recordset referir-se a um Recordset tipo table
(que o nosso caso), a movimentao segue o ndice atual. Voc pode definir o ndice atual
usando a propriedade Index. Se voc no configurar o ndice atual, a ordem de registros
retornados ser indefinida.
1.4 ALTERAO
Para alterao vamos fazer algo semelhante ao que fizemos na incluso. A diferena
ficar numa propriedade nova para ns que EDIT. Esta propriedade abre a tabela para que
o dado que esta sendo alterado seja editado.
Note que no liberamos a caixa de texto txtCdigo para alterao, pois sendo ela a
chave de ndice, no pode ser alterada. Quando necessitar de alterao no cdigo, ele deve
ser excludo e includo novamente.
1.5 CONSULTA
Para consulta vamos usar a funo INPUTBOX. Aprendemos a us-la nos captulos
anteriores. Ela solicita ao usurio a digitao de algum dado e armazena numa determinada
varivel.
Ento criamos uma varivel de nome ProcuraCdigo e usamos ela para receber o
que o usurio digitar.
Feito isto, usamos o mtodo Seek para efetuar uma procura dentro da tabela.
Seek: Localiza o registro de um objeto Recordset tipo table indexado que satisfaa
os critrios especificados para o ndice atual e torna esse registro o registro atual.
Aps o Seek colocamos um sinal de comparao para determinar o tipo de procura
que este mtodo fara. Podemos usar = ,<, >, <=, >=, etc
O mtodo Seek pesquisa os campos-chave especificados e localiza o primeiro
registro que satisfaa os critrios especificados na comparao dentro da chave de ndice.
Uma vez encontrado, esse registro torna-se o registro atual e a propriedade NoMatch
definida como False. Se o mtodo Seek falhar em localizar um registro correspondente, a
propriedade NoMatch configurada como True e o registro atual indefinido.
Se comparao for igual (=), maior ou igual a (>=) ou maior do que (>), o Seek
comea a pesquisa no incio do ndice. Se comparao for maior do que (<) ou maior ou
igual a (<=), o Seek comea a pesquisa no final do ndice e continua em direo ao incio a
menos que existam entradas de ndice duplicadas no final. Neste caso, Seek comea por
uma entrada arbitrria entre as entradas de ndice duplicadas no final do ndice.
Quando informamos uma chave para o mtodo Seek procurar, esta chave deve ser
no mesmo formato que o estabelecido no ndice do arquivo (index). Por exemplo: no
TBMercadoria a chave do ndice o Cdigo, ento o Seek somente faz a procura pelo
cdigo. No podemos pedir para procurar pela Descrio da mercadoria, pois para isto
deveria existir um ndice para descrio.
Em nosso exemplo se NoMatch for True (ou seja, se no encontrou nenhum
registro que seja igual ao contedo da varivel ProcuraCdigo) movemos para o registro
anterior e depois o formulrio atualizado. Fazemos isto pois quando uma procura no
bem sucedida a tabela posicionada no fim de arquivo, e como no existe nenhum registro
nesta posio, movimentamos para um registro antes, onde o ultimo registro includo se
encontra.
Quando clicarmos no boto Consultar uma janela como a que esta abaixo aparecer
no video:
1.6 EXCLUSO
1.8
CADASTRO DE CLIENTES
Option Explicit
Dim BancoDeDados As Database
Dim TBCliente As Recordset
Private Sub cmdAlterar_Click()
cmdIncluir.Enabled = False
cmdAlterar.Enabled = False
cmdConsultar.Enabled = False
cmdExcluir.Enabled = False
cmdAnterior.Enabled = False
cmdProximo.Enabled = False
cmdGravar.Enabled = True
cmdSair.Enabled = True
Frame1.Enabled = True
txtCdCliente.Enabled = False
txtNome.SetFocus
TBCliente.Edit
End Sub
Private Sub cmdAnterior_Click()
TBCliente.MovePrevious
If TBCliente.BOF = True Then
TBCliente.MoveNext
End If
AtualizaFormulrio
End Sub
Private Sub cmdConsultar_Click()
Dim ProcuraCdCliente As String
ProcuraCdCliente = InputBox("Digite
consultado")
TBCliente.Seek "=", ProcuraCdCliente
If TBCliente.NoMatch = True Then
MsgBox ("Cliente no cadastrado!")
TBCliente.MovePrevious
End If
AtualizaFormulrio
Cdigo
do
End Sub
Private Sub cmdExcluir_Click()
If MsgBox("Confirma Excluso?", vbYesNo) = vbYes Then
TBCliente.Delete
cmdAnterior_Click
End If
End Sub
Private Sub cmdGravar_Click()
cmdIncluir.Enabled = True
cmdAlterar.Enabled = True
cmdConsultar.Enabled = True
cmdExcluir.Enabled = True
cmdAnterior.Enabled = True
cmdProximo.Enabled = True
cmdGravar.Enabled = False
cmdSair.Enabled = True
Frame1.Enabled = False
txtCdCliente.Enabled = True
AtualizaCampos
TBCliente.Update
Cliente
ser
End Sub
Private Sub cmdIncluir_Click()
cmdIncluir.Enabled = False
cmdAlterar.Enabled = False
cmdConsultar.Enabled = False
cmdExcluir.Enabled = False
cmdAnterior.Enabled = False
cmdProximo.Enabled = False
cmdGravar.Enabled = True
cmdSair.Enabled = True
LimpaFormulrio
Frame1.Enabled = True
txtCdCliente.SetFocus
End Sub
Private Sub cmdProximo_Click()
TBCliente.MoveNext
If TBCliente.EOF = True Then
TBCliente.MovePrevious
End If
AtualizaFormulrio
End Sub
Private Sub cmdSair_Click()
Unload frmCadClientes
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
SendKeys ("{TAB}")
KeyAscii = 0
End If
End Sub
Private Sub Form_Load()
Note que esses dados no existem na tabela de Vendas. O que existe nesta tabela
somente o cdigo da mercadoria. A descrio esta em outra tabela (Mercadoria), assim
como o nome do cliente tambm esta em outra tabela (Cliente). Para podermos acessar
estas tabelas e capturar somente a descrio da mercadoria e nome do cliente, temos
somente um ponto de referncia, que o cdigo deles que existe na tabela de Vendas.
A lgica usada neste programa consiste em pegarmos o cdigo existente na tabela
de vendas e buscar a descrio daquele cdigo em outra tabela. Para fazer isto todas as
tabelas envolvidas devem ser abertas, assim como seus ndices, pois ser atravs do ndice
que a procura ser feita.
Exemplificando atravs da tabela de mercadoria:
Como na tabela de vendas existe o cdigo da mercadoria que foi vendida, e na
tabela de mercadoria existe a descrio da mercadoria para aquele cdigo, usamos o ndice
para procurar dentro da tabela de mercadoria, o cdigo existente dentro da tabela de vendas.
Isto possvel desde que a tabela de mercadoria esteja indexada pelo cdigo, pois a procura
ser feita por ele.
Para podermos ento codificarmos o formulrio que ter acesso aos dados da tabela
de vendas, vamos criar as variveis que sero usadas para lidar com o banco de dados e as
tabelas:
Criamos uma varivel para cada tabela que ser aberta. Precisamos agora criar um
evento Form_Load para abrir todas essas tabelas.
Veja que abrimos todas as trs tabelas que sero usadas neste formulrio, e abrimos
tambm todos os ndices relativo a cada uma.
As nossas funes auxiliares sofrero alguma mudana pois acrescentamos em
nosso formulrio dois labels, e um conter a descrio da mercadoria e outro o nome do
cliente.
Note que quando formos atualizar o formulrio ser necessrio apresentar nos dois
labels os dados contido em outras tabelas, por isto necessrio colocar um Seek para cada
item a ser procurado. Quando o usurio, por exemplo, aperta o boto "Avanar" o programa
avana um registro na tabela de Vendas e usa os cdigos contidos nela para tentar localizar
suas respectivas descries e nome do cliente.
Para facilitar nosso trabalho, criamos aqui uma funo CancelaDigitao que tem
por finalidade anular o que o usurio estiver fazendo, voltar os botes e frame para seu
estado natural. Usaremos esta funo quando o usurio digitar algum cdigo invlido.
Com as funes prontas, vamos completar a codificao do Form_Load, pois
apenas abrimos as tabelas, precisamos agora verificar se a tabela de vendas est vazia, e
desabilita o boto "Gravar" e o frame:
A incluso para esta tabela segue o estilo que usamos para os outros formulrios.
Existe somente uma diferena fundamental que o aparecimento do nome do cliente e a
descrio da mercadoria quando o usurio digitar o cdigo correspondente. Ou seja, numa
incluso, quando o usurio digitar o cdigo da mercadoria que foi vendida, o programa ter
que acessar a tabela de Mercadoria, procurar o cdigo que o usurio acabou de digitar, e
trazer de l a descrio daquele cdigo.
Este trabalho todo podemos fazer no evento LostFocus da caixa de texto. Por que
este evento? Porque esta procura ser feita DEPOIS que o usurio digitar o cdigo e passar
para a prxima caixa de texto (ou seja, quando o objeto perder o foco).
Ento, diante disto, precisamos criar dois evento LostFocus. Uma para a caixa de
texto txtCdigo e outro para txtCdCliente:
Se NoMatch for igual a True sinal que no existe nenhuma mercadoria cadastrada
com o cdigo digitado. Ento uma mensagem ser mostrada na tela: Mercadoria no
cadastrada.
Depois chamamos aquela funo que criamos chamada Cancela Digitao.
Logicamente que se quisermos incrementar ainda mais nosso programa poderamos fazer
com que o programa abrisse uma tela mostrando quais as mercadorias que existem
cadastradas para o usurio escolher uma, ou algo assim. Mas para resumir nosso exemplo
deixaremos assim.
Se o cdigo digitado na caixa de texto for encontrado ento a descrio inserida
dentro do label "lblDescrio" para que seja mostrada no formulrio.
Fazemos a mesma coisa com a evento LostFocus de txtCdCliente:
Perceba que esta rotina move a tabela de vendas para o registro anterior, e depois ao
chamar a funo AtualizaFormulrio faz uma procura dentro da tabela de mercadoria e
depois dentro da tabela de clientes usando como chave de busca o contedo existente
dentro da tabela de vendas.
Option Explicit
Dim
Dim
Dim
Dim
BancoDeDados As Database
TBVendas As Recordset
TBMercadoria As Recordset
TBCliente As Recordset
cmdIncluir.Enabled = True
cmdAlterar.Enabled = True
cmdConsultar.Enabled = True
cmdExcluir.Enabled = True
cmdAnterior.Enabled = True
cmdProximo.Enabled = True
cmdGravar.Enabled = False
cmdSair.Enabled = True
Frame1.Enabled = False
txtCdigo.Enabled = True
txtCdCliente.Enabled = True
AtualizaCampos
TBVendas.Update
End Sub
Private Sub cmdIncluir_Click()
cmdIncluir.Enabled = False
cmdAlterar.Enabled = False
cmdConsultar.Enabled = False
cmdExcluir.Enabled = False
cmdAnterior.Enabled = False
cmdProximo.Enabled = False
cmdGravar.Enabled = True
cmdSair.Enabled = True
LimpaFormulrio
Frame1.Enabled = True
txtCdigo.SetFocus
End Sub
Private Sub cmdProximo_Click()
TBVendas.MoveNext
If TBVendas.EOF = True Then
TBVendas.MovePrevious
End If
AtualizaFormulrio
End Sub
TBVendas("Cdigo") = txtCdigo
TBVendas("CdCliente") = txtCdCliente
TBVendas("ValorVenda") = txtValorVenda
TBVendas("QuantidadeVendida") = txtQuantidadeVendida
End Function
End If
lblNomeCliente = TBCliente("Nome")
TBVendas.Seek "=", txtCdCliente.Text, txtCdigo.Text
If TBVendas.NoMatch = False Then
MsgBox "Vendas j existente. Tente outro cdigo"
CancelaDigitao
Else
TBVendas.AddNew
End If
End Sub
Private Sub txtValorVenda_LostFocus()
txtValorVenda.Text = Format(txtValorVenda.Text, "Standard")
End Sub
Private Function AtualizaFormulrio()
txtCdigo = TBVendas("Cdigo")
txtCdCliente = TBVendas("CdCliente")
txtValorVenda = Format(TBVendas("ValorVenda"), "Standard")
txtQuantidadeVendida = TBVendas("QuantidadeVendida")
TBMercadoria.Seek "=", txtCdigo
TBCliente.Seek "=", txtCdCliente
lblDescrio = TBMercadoria("Descrio")
lblNomeCliente = TBCliente("Nome")
End Function
Private Function CancelaDigitao()
AtualizaFormulrio
cmdIncluir.Enabled = True
cmdAlterar.Enabled = True
cmdConsultar.Enabled = True
cmdExcluir.Enabled = True
cmdAnterior.Enabled = True
cmdProximo.Enabled = True
cmdGravar.Enabled = False
cmdSair.Enabled = True
Frame1.Enabled = False
End Function