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 o Cdigo do Cliente a ser consultado") TBCliente.Seek "=", ProcuraCdCliente If TBCliente.NoMatch = True Then MsgBox ("Cliente no cadastrado!") TBCliente.MovePrevious End If AtualizaFormulrio 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

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