Você está na página 1de 44

1 MANIPULAO DO BANCO DE

DADOS

Abertura do Banco de Dados e suas tabelas


Adicionar
Navegao
Alterao
Consulta
Excluso

1.1 CRIANDO JANELAS


Precisamos criar inicialmente um formulrio para cadastrar mercadoria e depois
outro formulrio para cadastrar o cliente. Vamos usar o que j aprendemos anteriormente:
Crie um novo projeto e para o formulrio nomeio-o frmEstoque. O Caption ser
Controle de Estoque.
Neste formulrio vamos criar os menus que iro acessar nossas bases de dados. Veja
como ficar:

No menu "Project" do Visual Basic click na opo "AddForm" para inserirmos um


novo formulrio em nosso projeto. Ser o formulrio para cadastramento de mercadoria.

Neste novo formulrio altere o Caption para Cadastro de Mercadoria e o Name


para frmCadMercadoria. Vamos montar esta interface, depois abriremos outros Form
para Cliente e Vendas.
Coloque um frame, 4 labels e 4 caixa de texto com os Names: txtCdigo,
txtDescrio, txtQuantidade e txtValor.
Coloque tambm 7 botes de comando no formulrio como na. Para nomea-los use
os Captions de cada um prefixado com cmd:
Importante: Coloque a propriedade TabIndex do Boto "cmdIncluir " como "0"
para que ele seja o primeiro a possuir o foco quando entrar na janela.
Para rodar este programa e ver o resultado ser necessrio ligar este formulrio ao
menu mnuMercadoria. Para fazer isto vamos at o menu localizado no frmEstoque, click no
Cadastro para abrir as opes. D dois clickes na opo Mercadoria que uma janela de
codificao ser aberta. Digite:

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:

O Comando Unload retira a janela informada da memria e da tela, voltando a


execuo do programa para a janela anterior, que no nosso caso o menu principal.
Agora estamos prontos para comear a codificar o nosso Banco de Dados.

1.1.1 Abrindo um banco de dados


Uma vez que vamos trabalhar com manipulao de dados, temos que verificar se o
Visual Basic est apto para fazer esta manipulao. Os servios necessrios para executar
essas funes esto em uma DLL do Microsoft DAO 3.5 Object Library. Para que nosso
programa leia essa DLL temos que ir at o menu Project/References e selecionar esta
DLL:

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.

O Objeto Recordset a representao lgica de uma tabela. Usaremos este objeto


para manipular todos os dados da tabela. Veja as principais propriedades de um Recordset
(somente manipulados na codificao do programa):
Sintxe: NomeDoRecordSet.Propriedade
AbsolutePosition : Indica o numero do registro corrente da tabela em uso.
BOF : Retorna True quando a tabela chegou ao inicio e False quando esta em outro
ponto.
DateCreated : Retorna a data de criao da tabela manipulada pelo Recordset.
EOF : Retorna True quando a tabela chegou ao fim e False quando esta em outro
ponto.
Index : Especificamos o nome do ndice que ser associado a tabela.
NoMatch : Retorna True se uma pesquisa efetuada dentro da tabela foi bemsucedida.
PercentPosition : Retorna um percentual referente a posio que a tabela se
encontra com comparao com o total de registros da tabela.
RecordCount : Retorna a quantidade de registro que uma tabela possui.
Os principais mtodos usamos pelo Recordset:
AddNew : Prepara a tabela para receber um novo registro.
Close : Fecha a tabela, e conseqentemente o objeto recordset.
Delete : Remove a registro atual da tabela.
Edit : Prepara a tabela para que o registro corrente seja alterado.
FindFirst <Condio> : Procura o primeiro registro dentro da tabela que satisfaa a
condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot).
FindLast <Condio> : Procura o ultimo registro dentro da tabela que satisfaa a
condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot).
FindNext <Condio > : Procura o prximo registro dentro da tabela que satisfaa
a condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot).
FindPrevious <Condio> : Procura o registro anterior dentro da tabela que
satisfaa a condio estabelecida (Somente para objeto Recordset tipo dynaset ou
snapshot).
MoveFirst : Move a tabela para o primeiro registro.
MoveLast : Move a tabela para o ultimo registro.
MoveNext : Move a tabela para o seguinte seguinte.
MovePrevious : Move a tabela para o registro anterior.
Seek <Operador de Comparao>,<Item a Procurar> : Localiza um registro
dentro da tabela. A tabela tem que estar indexada. (Somente para objeto Recordset tipo
table)
Update : Grava as alteraes e incluses na tabela.
O prximo passo ser abrir o banco de dados e abrir a tabela de mercadoria. Para
fazer isto selecione o formulrio frmCadMercadoria e abra a janela de codificao dele
criando um evento chamado FORM_LOAD. Este evento chamado sempre que este
formulrio chamado pelo Windows.

Associamos a varivel BancoDeDados ao mtodo OpenDatabase, que vai


realmente abrir o arquivo na prtica. Uma vez aberto ao arquivo, sempre que fizermos
referncia a ele usaremos a varivel BancoDeDados.
Na abertura do arquivo usados o Objeto App.Path que retorna o nome do diretrio
corrente, onde esta localizado o arquivo pretendido. Depois concatenamos este diretrio
com o nome do arquivo a ser aberto.
Para abrir a tabela usamos o mtodo OpenRecordSet, e como argumento
informamos o nome da tabela a ser aberta e a constante dbOpenTable que informa que o
RecordSet a ser aberto do tipo tabela.
Note que necessrio antes do mtodo OpenRecordSet usar o nome do objeto
Database BancoDeDados, pois, dentro da hierarquia, a tabela esta dentro do Banco de
Dados.
Fizemos tudo isto para deixar disponvel para uso o banco de dados Estoque e sua
tabela Mercadoria.

1.1.2 Abrindo um indice

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.

Usamos a propriedade Index para TBMercadoria e determinamos que o ndice


corrente ser IndCdigo.

1.1.3 Fechando um banco de dados

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.

Para fecharmos com segurana um banco de dados usamos o Evento do objeto


Formulrio chamado Unload. Este evento chamado sempre que o formulrio retirado da
tela (e da memria). Note que este evento o contrrio do evento Load, que lido quando o
formulrio colocado na tela.
Porque no podemos fechar os arquivos de Banco de Dados no evento click do
boto Sair?
Por que o usurio pode querer inventar de sair deste formulrio usando outros
recursos do Windows que no seja o boto sair, como a opo Fechar do Control Box, AltF4, etc. Para no correr risco colocamos o fechamento no evento Unload.

Fechamos primeiro a tabela Mercadoria representada pela varivel TBMercadoria e


depois o banco de dados Estoque representada pela varivel BancoDeDados. Ambas
usaram o mtodo Close.

1.1.4 Cuidados especiais

Algo que extremamente importante no desenvolvimento de qualquer programa


tentar prever o mximo possivel de erros que o usurio pode cometer e tentar previni-los.
Imagine a situao: o usurio esta no meio de uma incluso e resolver apertar a
tecla excluir ou alterar, sendo que nem terminou a incluso. Ou ento esta numa alterao e
resolve apertar o boto alterar novamente. Para podermos tentar cercar esses erros usamos a
propriedade Enabled nos botes.
Quando o usurio estiver numa incluso somente os botes Gravar e Cancelar deve
estar habilitado. Ou seja, ou o usurio confirma o que esta fazendo ou cancela. Se esta
numa alterao a mesma coisa ocorre. E assim por diante. Para fazermos isto temos que
usar o Enabled em cada boto como veremos abaixo:

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.

Na alterao o mtodo semelhando a incluso. Durante a alterao o usurio s


ter liberado para ele os botes "Gravar" e "Sair".

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.

1.1.5 Funes de apoio


Para que nosso programa de cadastro tenha um cdigo mais limpo e de fcil
entendimento vamos criar algumas funes que sero teis em nossa programao.
Para criar essas funes chame a janela de codificao, selecione TOOLS no menu
principal do Visual Basic, e escolha a opo Add Procedure...

Nomeia a funo que estamos criando de AtualizaCampos, coloque do tipo


Function e o Scope (abrangncia) Private. Com isto, estamos criando uma funo que
poder ser usada somente no formulrio corrente.
Ao clicar em Ok ser aberta uma janela de codificao para podermos digitar o que
a funo ira conter:

A finalidade desta funo inserir o contedo existente nas caixas de textos do


formulrio para dentro dos campos da tabela de mercadoria.
Com isto, sempre que precisarmos gravar os dados que o usurio digitou no
formulrio para dentro de seus respectivos campos na tabela usamos a funo
AtualizaCampos.
Repita o processo para criar agora a funo AtualizaFormulrio:

Note que o AtualizaFormulrio faz o caminho inverso: Descarrega os dados


existente na tabela de seus respectivos campos para dentro das caixas de texto existente no
formulrio.
Por fim, vamos criar uma funo para limpar as caixas de texto. D o nome de
LimpaFormulrio:

Vamos usar esta funo sempre que precisarmos que as caixas de texto fiquem
vazias.

1.2 ADICIONANDO DADOS


Antes de comearmos a fazer a codificao para o boto Incluir, a fim de preparar
nosso formulrio para manipular a tabela de Mercadoria, vamos fazer uma modificao nas
propriedades MaxLength das caixas de texto: todas devem possuir o mesmo valor da
propriedade Size usada para os campos na tabela. Usamos isto para no deixar que um
usurio coloque um nome com 40 caracteres num campo que foi definido para receber 30
caracteres.
Outra modificao ser efetuada no evento Form_Load do formulrio
frmCadMercadoria:

Quando uma tabela aberta o Visual Basic se posiciona no primeiro registro


existente dentro dela. Entretanto, quando ainda no existe nada digitado dentro da tabela,
conseqentemente no existir nenhum registro para se posicionar. Neste caso o fim de
arquivo encontrado logo na abertura da tabela.
A propriedade EOF quem informa se o fim de arquivo esta ativo ou no. Se EOF
for True (verdadeiro) significa que a tabela chegou ao fim de arquivo, se for False, significa
que a tabela esta posicionada em algum registro em algum lugar.
Recapitulando: A propriedade EOF retorna True se a posio do registro atual for
posterior ao ltimo registro da tabela, ou seja, se o fim do arquivo for localizado, e False se
a posio do registro atual for no ltimo registro ou anterior a ele.
O Visual Basic possui tambm a propriedade BOF para informar se o inicio do
arquivo foi encontrado.
A propriedade BOF retorna True se a posio do registro atual for anterior ao
primeiro registro e False se a posio do registro atual estiver no primeiro registro ou for
posterior a ele.
Os valores de retorno das propriedades BOF e EOF so determinados pela
localizao do indicador do registro atual.
Podemos usar as propriedades BOF e EOF para determinar se um objeto Recordset
contm registros ou se voc foi alm dos limites de um objeto Recordset ao percorrer seus
registros.
Perceba que somente se EOF for False que atualizamos o formulrio, pois caso
contrrio, no poderamos atualizar o formulrio pois no haveria dados a serem
atualizados.
O primeiro boto que vamos codificar o incluir. Ele funcionar da seguinte forma:
Quando clicarmos nele as caixas de textos sero limpas e o mtodo AddNew ser acionado.
Este mtodo usado para avisar tabela que alguns dados sero includos.
Depois de usar o AddNew temos que atualizar os campos, ou seja, passar tudo que
foi digitado nas caixas de texto para seus respectivos campos dentro da tabela
TBMercadoria. Fazendo isto usamos o mtodo Updated para efetuar a gravao
propriamente dita e atualizar a tabela com os novos campos.
Veja um exemplo:

TBMercadoria.AddNew

TBMercadoria("Cdigo") = 001

TBMercadoria("Descrio") = Cala Jeans


TBMercadoria("Quantidade") = 12
TBMercadoria("Valor") = 100
TBMercadoria.Updated

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.

Atualizamos os campos da tabela com os dados digitado nas caixas de textos


e depois chamamos o mtodo Update que far a gravao fisica dentro do banco de dados.

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.

1.3 PRXIMO E ANTERIOR

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:

Digitamos o cdigo que queremos procurar e ao clicar Ok a busca iniciada. Se no


encontrar uma mensagem ser apresentada:

1.6 EXCLUSO

Quando se ai deletar algo bom solicitar ao usurio uma confirmao, pois a


deleo acidental pode causar resultados catastrficos. Ento bom que o usurio tenha
certeza do que esta fazendo.
Quando usamos a propriedade Delete o registro atual (aquele que esta aparecendo
no vdeo) excludo da tabela.
Mas para a tela no ficar vazia (uma vez que aquele registro que estava l foi
eliminado) usamos a procedure cmdAnterior_click que a rotina que usamos quando o
boto anterior acionado.
Fazemos isto para posicionar a tabela no registro anterior ao que foi deletado e
mostr-lo na tela. Desta forma a tela no fica vazia.
Em nosso programa podemos localizar um registro com a consulta ou atravs dos
botes Anterior e Prximo. Localizando podemos clicar no boto Excluir que o registro
desaparece.

1.7 CONSIDERAES FINAIS


Pronto. Esta finalizado este formulrio frmCadMercadoria. Agora usando estes
mesmos processos usados aqui programe o Cadastro de Cliente. As vendas um pouco
diferente pois esta tabela depende da tabela de Mercadoria e da tabela de Clientes, ou seja,
necessrio, nas vendas, informar quem o cliente que esta comprando e qual mercadoria
se esta comprando. Estas informaes so coletadas em suas respectivas tabelas. Mas
vamos aprender a codific-la aps terminarmos com os Clientes.

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()

Set BancoDeDados = OpenDatabase(App.Path & "\Estoque.MDB")


Set TBCliente = BancoDeDados.OpenRecordset("Cliente", dbOpenTable)
TBCliente.Index = "IndCdigo"
cmdGravar.Enabled = False
Frame1.Enabled = False
If TBCliente.EOF = False Then
AtualizaFormulrio
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
TBCliente.Close
BancoDeDados.Close
End Sub

Private Sub txtCdCliente_LostFocus()


txtCdCliente.Text = Format(txtCdCliente.Text, "000")
TBCliente.Seek "=", txtCdCliente.Text
If TBCliente.NoMatch = False Then
MsgBox "Cliente j existente. Tente outro Cdigo"
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
Else
TBCliente.AddNew
End If
End Sub

Private Sub txtValor_LostFocus()


txtLimiteCrdito.Text = Format(txtLimiteCrdito.Text, "Standard")
End Sub

Private Function AtualizaCampos()


TBCliente("CdCliente") = txtCdCliente
TBCliente("Nome") = txtNome
TBCliente("LimiteCrdito") = txtLimiteCrdito
End Function
Private Function AtualizaFormulrio()
txtCdCliente = TBCliente("CdCliente")
txtNome = TBCliente("Nome")
txtLimiteCrdito.Text
=
Format(TBCliente("LimiteCrdito"),
"Standard")
End Function
Private Function LimpaFormulrio()
txtCdCliente = ""
txtNome = ""
txtLimiteCrdito = ""
End Function

1.9 LANAMENTO DAS VENDAS

A criao do formulrio ser como no exemplo acima; ou seja, comparando com os


anteriores, a diferena somente o acrscimo de dois labels que ficaro ao lado do cdigo
da mercadoria e do cliente. O primeiro label conter a descrio da mercadoria, e vamos
nome-lo para lblDescrio, e o segundo ter o nome do cliente, e vamos nome-lo para
lblNomeCliente.
Para esta tabela necessrio criar um ndice em que a chave de procura seja o
Cdigo da Mercadoria e o Cdigo do Cliente. Usamos para isto o Visual Data Manager:

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:

Usamos o SEEK para efetuar uma procura dentro da tabela TBMercadoria.


O que ir procurar?
Ir procurar o cdigo digitado na caixa de texto txtCdigo.

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:

A incluso de registros dentro da tabela de vendas igual ao apresentado nos outros


programas:

A alterao segue os padres anteriores, lembrando que nesta tabela de vendas no


podemos alterar o Cdigo da Mercadoria e o Cdigo do Cliente, pois ambos fazem parte da
chave do ndice da tabela. Se necessitar alterar o cdigo, exclua e inclua novamente:

A excluso tambm semelhante aos anteriores:

Os botes Anterior e Prximo devem fazer uma pesquisa na tabela de Mercadoria e


Clientes para atualizar os labels, a fim de que aparea a descrio da mercadoria e o nome
do cliente:

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.

D uma conferida em seu cdigo fonte agora:

Option Explicit
Dim
Dim
Dim
Dim

BancoDeDados As Database
TBVendas As Recordset
TBMercadoria As Recordset
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
txtCdigo.Enabled = False
txtCdCliente.Enabled = False
txtQuantidadeVendida.SetFocus
TBVendas.Edit
End Sub
Private Sub cmdAnterior_Click()
TBVendas.MovePrevious
If TBVendas.BOF = True Then
TBVendas.MoveNext
End If
AtualizaFormulrio
End Sub
Private Sub cmdExcluir_Click()
If MsgBox("Confirma Excluso?", vbYesNo) = vbYes Then
TBVendas.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
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

Private Sub cmdSair_Click()


Unload frmLanamentoVendas
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()
Set BancoDeDados=OpenDatabase(App.Path & "\Estoque.MDB")
SetTBMercadoria=BancoDeDados.OpenRecordset"Mercadoria", dbOpenTable)
Set TBCliente=BancoDeDados.OpenRecordset("Cliente", dbOpenTable)
Set TBVendas=BancoDeDados.OpenRecordset("Vendas", dbOpenTable)
TBMercadoria.Index = "IndCdigo"
TBCliente.Index = "IndCdigo"
TBVendas.Index = "indClienteMercadoria"
cmdGravar.Enabled = False
Frame1.Enabled = False
If TBVendas.EOF = False Then
AtualizaFormulrio
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
TBVendas.Close
TBMercadoria.Clone
TBCliente.Close
BancoDeDados.Close
End Sub
Private Function AtualizaCampos()

TBVendas("Cdigo") = txtCdigo
TBVendas("CdCliente") = txtCdCliente
TBVendas("ValorVenda") = txtValorVenda
TBVendas("QuantidadeVendida") = txtQuantidadeVendida
End Function

Private Function LimpaFormulrio()


txtCdigo = ""
txtCdCliente = ""
txtValorVenda = ""
txtQuantidadeVendida = ""
lblDescrio.Caption = ""
lblNomeCliente.Caption = ""
End Function
Private Sub txtCdigo_LostFocus()
txtCdigo.Text = Format(txtCdigo.Text, "000")
TBMercadoria.Seek "=", txtCdigo
If TBMercadoria.NoMatch = True Then
MsgBox "Mercadoria no cadastrada. Operao Cancelada"
CancelaDigitao
Exit Sub
End If
lblDescrio = TBMercadoria("Descrio")
End Sub
Private Sub txtCdCliente_LostFocus()
txtCdCliente.Text = Format(txtCdCliente.Text, "000")
TBCliente.Seek "=", txtCdCliente
If TBCliente.NoMatch = True Then
MsgBox "Cliente no cadastrada. Operao Cancelada"
CancelaDigitao
Exit Sub

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

Deixamos o boto Consulta de fora propositadamente. Vamos voltar nele nos


prximos captulos.

Você também pode gostar