Manipulação do Banco de Dados via DAO

Embed Size (px)

Citation preview

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    1/44

    1 MANIPULAO DO BANCO DE

    DADOS

    Abertura do Banco de Dados e suas tabelas

    Adicionar

    Navegao

    Alterao

    Consulta

    Excluso

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    2/44

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    3/44

    1.1 CRIANDOJANELAS

    Precisamos criar inicialmente um formulrio para cadastrar mercadoria e depoisoutro 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 serControle de Estoque.

    Neste formulrio vamos criar os menus que iro acessar nossas bases de dados. Vejacomo ficar:

    No menu "Project" do Visual Basic click na opo "AddForm" para inserirmos umnovo formulrio em nosso projeto. Ser o formulrio para cadastramento de mercadoria.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    4/44

    Neste novo formulrio altere o Caption para Cadastro de Mercadoria e o Namepara frmCadMercadoria. Vamos montar esta interface, depois abriremos outros Formpara 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 useos 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 aomenu mnuMercadoria. Para fazer isto vamos at o menu localizado no frmEstoque, click noCadastro para abrir as opes. D dois clickes na opo Mercadoria que uma janela decodificao ser aberta. Digite:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    5/44

    O Mtodo Show abre um novo formulrio a partir de outro, e usamos ele para abriro formulrio frmCadMercadoria.

    Vamos aproveitar e codificar a opo Sair do menu tambm. D dois clicks nele edigite:

    Este simples comando END encerra toda a aplicao fechando todas as janelasque podem estar abertas.

    Para completar este raciocnio, vamos at o formulrio frmCadMercadoria e para oboto cmdSair vamos fazer a seguinte codificao:

    O Comando Unload retira a janela informada da memria e da tela, voltando aexecuo 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 oVisual Basic est apto para fazer esta manipulao. Os servios necessrios para executaressas funes esto em uma DLL do Microsoft DAO 3.5 Object Library. Para que nossoprograma leia essa DLL temos que ir at o menu Project/References e selecionar estaDLL:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    6/44

    Se este ajuste no for feito e um objeto de banco de dados for declarado, o VisualBasic gerar um erro. A biblioteca DAO (Data Access Objects) fornece um conjunto deobjetos 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 tipoTabela. Uma servir para fazer referncia ao nome e caminho do Banco de Dados como umtodo, 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 doformulrio. Variveis criadas ali possuem abrangncia em todo o formulrio. Se criarmosela dentro de alguma outra rotina (ou vento) a abrangncia destas variveis sero somentedentro da prpria rotina.

    A varivel BancoDeDados do tipo Database pois ela sempre ter em seu contedoo nome do banco de dados que ser aberto. Depois criamos uma varivel para a tabela deMercadoria de nome TBMercadoria.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    7/44

    O Objeto Recordset a representao lgica de uma tabela. Usaremos este objetopara manipular todos os dados da tabela. Veja as principais propriedades de um Recordset(somente manipulados na codificao do programa):

    Sintxe:NomeDoRecordSet.PropriedadeAbsolutePosition : Indica o numero do registro corrente da tabela em uso.

    BOF : Retorna True quando a tabela chegou ao inicio e False quando esta em outroponto.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 bem-

    sucedida.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 : Procura o primeiro registro dentro da tabela que satisfaa a

    condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot).FindLast : Procura o ultimo registro dentro da tabela que satisfaa a

    condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot).FindNext : Procura o prximo registro dentro da tabela que satisfaa

    a condio estabelecida (Somente para objeto Recordset tipo dynaset ou snapshot).FindPrevious : Procura o registro anterior dentro da tabela que

    satisfaa a condio estabelecida (Somente para objeto Recordset tipo dynaset ousnapshot).

    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 , : Localiza um registro

    dentro da tabela. A tabela tem que estar indexada. (Somente para objeto Recordset tipotable)

    Update : Grava as alteraes e incluses na tabela.

    O prximo passo ser abrir o banco de dados e abrir a tabela de mercadoria. Parafazer isto selecione o formulrio frmCadMercadoria e abra a janela de codificao delecriando um evento chamado FORM_LOAD. Este evento chamado sempre que esteformulrio chamado pelo Windows.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    8/44

    Associamos a varivel BancoDeDados ao mtodo OpenDatabase, que vairealmente abrir o arquivo na prtica. Uma vez aberto ao arquivo, sempre que fizermosreferncia a ele usaremos a varivel BancoDeDados.

    Na abertura do arquivo usados o Objeto App.Path que retorna o nome do diretriocorrente, onde esta localizado o arquivo pretendido. Depois concatenamos este diretriocom o nome do arquivo a ser aberto.

    Para abrir a tabela usamos o mtodo OpenRecordSet, e como argumentoinformamos o nome da tabela a ser aberta e a constante dbOpenTableque informa que oRecordSet 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 deDados.

    Fizemos tudo isto para deixar disponvel para uso o banco de dados Estoque e suatabela Mercadoria.

    1.1.2 Abrindo um indice

    Prximo passo abrir o ndice que esta tabela ir trabalhar. Este ndice necessriopara 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 oIndCdigo e possui como chave de indexao ocampo 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 quesairmos de um programa ou formulrio. Arquivos abertos perigoso e pode trazerresultados indesejveis.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    9/44

    Para fecharmos com segurana um banco de dados usamos o Evento do objetoFormulrio chamado Unload. Este evento chamado sempre que o formulrio retirado datela (e da memria). Note que este evento o contrrio do evento Load, que lido quando oformulrio 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 outrosrecursos do Windows que no seja o boto sair, como a opo Fechar do Control Box, Alt-F4, etc. Para no correr risco colocamos o fechamento no evento Unload.

    Fechamos primeiro a tabela Mercadoria representada pela varivel TBMercadoria edepois o banco de dados Estoque representada pela varivel BancoDeDados. Ambasusaram 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 atecla excluir ou alterar, sendo que nem terminou a incluso. Ou ento esta numa alterao eresolve 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 deveestar habilitado. Ou seja, ou o usurio confirma o que esta fazendo ou cancela. Se estanuma alterao a mesma coisa ocorre. E assim por diante. Para fazermos isto temos queusar o Enabled em cada boto como veremos abaixo:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    10/44

    Fazendo isto quando o usurio apertar o boto incluir, os botes que ele no podepressionar enquanto no concluir a incluso ficaro desabilitados. Deve-se fazer isto paratodos os botes.

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

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

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    11/44

    No evento click do boto gravar habilite todos novamente. Com exceo do prprioboto 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 cadastrode mercadoria. Desabilitamos tambm o Frame, pois assim todos os objetos contidodentro 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 querfazer.

    Uma formatao para as caixas de texto que receber numeros bem vindo para darum aspecto visual mais interessante.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    12/44

    Criamos uma formatao para as caixas de texto no evento LostFocuspara quandoo usurio terminar de digitar o valor se ajustar.

    Habilitamos a tecla Enter criando um evento KeyPress no formulario. No esquecerde habilitar a propriedade KeyPreview.

    1.1.5 Funes de apoioPara 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...

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    13/44

    Nomeia a funo que estamos criando de AtualizaCampos, coloque do tipo Functione o Scope (abrangncia) Private. Com isto, estamos criando uma funo que poder serusada 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 doformulrio para dentro dos campos da tabela de mercadoria.

    Com isto, sempre que precisarmos gravar os dados que o usurio digitou noformulrio para dentro de seus respectivos campos na tabela usamos a funoAtualizaCampos.

    Repita o processo para criar agora a funo AtualizaFormulrio:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    14/44

    Note que o AtualizaFormulrio faz o caminho inverso: Descarrega os dadosexistente na tabela de seus respectivos campos para dentro das caixas de texto existente noformulrio.

    Por fim, vamos criar uma funo para limpar as caixas de texto. D o nome deLimpaFormulrio:

    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 prepararnosso formulrio para manipular a tabela de Mercadoria, vamos fazer uma modificao naspropriedades MaxLength das caixas de texto: todas devem possuir o mesmo valor dapropriedade Size usada para os campos na tabela. Usamos isto para no deixar que umusurio coloque um nome com 40 caracteres num campo que foi definido para receber 30caracteres.

    Outra modificao ser efetuada no evento Form_Load do formulrio

    frmCadMercadoria:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    15/44

    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 dearquivo encontrado logo na abertura da tabela.

    A propriedade EOF quem informa se o fim de arquivo esta ativo ou no. Se EOFfor True (verdadeiro) significa que a tabela chegou ao fim de arquivo, se for False, significaque a tabela esta posicionada em algum registro em algum lugar.

    Recapitulando: A propriedade EOF retorna True se a posio do registro atual forposterior ao ltimo registro da tabela, ou seja, se o fim do arquivo for localizado, e False sea 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 doarquivo foi encontrado.

    A propriedade BOF retorna True se a posio do registro atual for anterior aoprimeiro registro e False se a posio do registro atual estiver no primeiro registro ou forposterior a ele.

    Os valores de retorno das propriedades BOF e EOF so determinados pelalocalizao do indicador do registro atual.

    Podemos usar as propriedades BOF e EOF para determinar se um objeto Recordsetcontm registros ou se voc foi alm dos limites de um objeto Recordset ao percorrer seusregistros.

    Perceba que somente se EOF for False que atualizamos o formulrio, pois casocontrrio, no poderamos atualizar o formulrio pois no haveria dados a serematualizados.

    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 quefoi digitado nas caixas de texto para seus respectivos campos dentro da tabelaTBMercadoria. Fazendo isto usamos o mtodo Updated para efetuar a gravaopropriamente dita e atualizar a tabela com os novos campos.

    Veja um exemplo:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    16/44

    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 comAddNew e termina com Updated Neste exemplo colocamos expresses string para sereminseridas 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 doscampos da tabela.

    Isto uma forma simplificada de fazer incluso de dados. Mas ns vamos usar umforma mais complexa:

    Veja o que foi feito: Sempre que o usurio clicar neste boto o programa limpa oformulrio 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

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    17/44

    foco passado para o caixa de texto txtCdigo pois a primeira que deve ser digitada pelousurio

    Ainda no aplicamos o mtodo AddNew pois ainda no sabemos se o usurio vaiincluir 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. Seestiver porque a incluso foi acionada.

    O programa procura o cdigo digitado. Se ele existir sera dado um aviso ao usuarioe o processo de incluso ser cancelado, caso contrrio (ou seja, se o cdigo no existirdentro da tabela) o mtodo AddNew chamado a fim de preparar a tabela para receber umnovo registro.

    Pronto, a janela j esta preparada para receber os dados. Mas agora falta fazer a codificaopara o boto Gravar.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    18/44

    Atualizamos os campos da tabela com os dados digitado nas caixas de textose 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 prximosexerccios.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 deincluso que poder ficar habilitado.A maneira mas usual de saber se a tabela esta vazia ou no atravs da propriedadeRecordCount que infoma quantos registros existem gravados dentro da tabela.

    1.3 PRXIMOE ANTERIOR

    Estes botes sero usados o usurio passear pela tabela, verificando os dados detodos os registros cadastrados na ordem especificada pelo Index.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    19/44

    O boto Prximo ir mostrar na tela o prximo registro existente. Note que parafazer este movimento usamos a propriedade MoveNext (mova para o prximo), depoisfazermos um teste com a propriedade EOF para verificar se foi movido para o ultimoregistro 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 primeiroregistro 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 EOFser 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 atualusando a propriedade Index. Se voc no configurar o ndice atual, a ordem de registrosretornados ser indefinida.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    20/44

    1.4 ALTERAO

    Para alterao vamos fazer algo semelhante ao que fizemos na incluso. A diferenaficar numa propriedade nova para ns que EDIT. Esta propriedade abre a tabela para queo dado que esta sendo alterado seja editado.

    Note que no liberamos a caixa de texto txtCdigo para alterao, pois sendo ela achave de ndice, no pode ser alterada. Quando necessitar de alterao no cdigo, ele deveser excludo e includo novamente.

    1.5 CONSULTAPara 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 determinadavarivel.

    Ento criamos uma varivel de nome ProcuraCdigo e usamos ela para receber oque o usurio digitar.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    21/44

    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 satisfaaos 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 procuraque este mtodo fara. Podemos usar = ,, =, etcO 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 Seekfalhar em localizar um registro correspondente, apropriedade NoMatch configurada como True e o registro atual indefinido.

    Se comparao for igual (=), maior ou igual a (>=) ou maior do que (>), o Seekcomea a pesquisa no incio do ndice. Se comparao for maior do que (

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    22/44

    1.6 EXCLUSO

    Quando se ai deletar algo bom solicitar ao usurio uma confirmao, pois adeleo acidental pode causar resultados catastrficos. Ento bom que o usurio tenhacerteza do que esta fazendo.

    Quando usamos a propriedadeDelete o registro atual (aquele que esta aparecendono 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_clickque a rotina que usamos quando oboto anterior acionado.

    Fazemos isto para posicionar a tabela no registro anterior ao que foi deletado emostr-lo na tela. Desta forma a tela no fica vazia.

    Em nosso programa podemos localizar um registro com a consulta ou atravs dosbotes Anterior e Prximo. Localizando podemos clicar no boto Excluir que o registrodesaparece.

    1.7 CONSIDERAESFINAIS

    Pronto. Esta finalizado este formulrio frmCadMercadoria. Agora usando estesmesmos processos usados aqui programe o Cadastro de Cliente. As vendas um poucodiferente 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 mercadoriase esta comprando. Estas informaes so coletadas em suas respectivas tabelas. Masvamos aprender a codific-la aps terminarmos com os Clientes.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    23/44

    1.8 CADASTRODECLIENTES

    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

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    24/44

    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 = FalsecmdSair.Enabled = True

    Frame1.Enabled = False

    txtCdCliente.Enabled = True

    AtualizaCampos

    TBCliente.Update

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    25/44

    End Sub

    Private Sub cmdIncluir_Click()

    cmdIncluir.Enabled = FalsecmdAlterar.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 ThenSendKeys ("{TAB}")

    KeyAscii = 0

    End If

    End Sub

    Private Sub Form_Load()

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    26/44

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

    Set TBCliente = BancoDeDados.OpenRecordset("Cliente", dbOpenTable)

    TBCliente.Index = "IndCdigo"

    cmdGravar.Enabled = FalseFrame1.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 = FalsecmdSair.Enabled = True

    Frame1.Enabled = False

    Else

    TBCliente.AddNew

    End If

    End Sub

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    27/44

    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 LANAMENTODAS VENDAS

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    28/44

    A criao do formulrio ser como no exemplo acima; ou seja, comparando com osanteriores, 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 vamosnome-lo para lblDescrio, e o segundo ter o nome do cliente, e vamos nome-lo paralblNomeCliente.

    Para esta tabela necessrio criar um ndice em que a chave de procura seja oCdigo da Mercadoria e o Cdigo do Cliente. Usamos para isto o Visual Data Manager:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    29/44

    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 acessarestas tabelas e capturar somente a descrio da mercadoria e nome do cliente, temossomente 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 tabelade vendas e buscar a descrio daquele cdigo em outra tabela. Para fazer isto todas astabelas envolvidas devem ser abertas, assim como seus ndices, pois ser atravs do ndiceque 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 ndicepara 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 procuraser feita por ele.

    Para podermos ento codificarmos o formulrio que ter acesso aos dados da tabelade vendas, vamos criar as variveis que sero usadas para lidar com o banco de dados e astabelas:

    Criamos uma varivel para cada tabela que ser aberta. Precisamos agora criar umevento Form_Load para abrir todas essas tabelas.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    30/44

    Veja que abrimos todas as trs tabelas que sero usadas neste formulrio, e abrimostambm todos os ndices relativo a cada uma.

    As nossas funes auxiliares sofrero alguma mudana pois acrescentamos emnosso formulrio dois labels, e um conter a descrio da mercadoria e outro o nome docliente.

    Note que quando formos atualizar o formulrio ser necessrio apresentar nos doislabels os dados contido em outras tabelas, por isto necessrio colocar um Seekpara cadaitem a ser procurado. Quando o usurio, por exemplo, aperta o boto "Avanar" o programaavana um registro na tabela de Vendas e usa os cdigos contidos nela para tentar localizarsuas respectivas descries e nome do cliente.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    31/44

    Para facilitar nosso trabalho, criamos aqui uma funo CancelaDigitao que tempor finalidade anular o que o usurio estiver fazendo, voltar os botes e framepara seuestado natural. Usaremos esta funo quando o usurio digitar algum cdigo invlido.

    Com as funes prontas, vamos completar a codificao do Form_Load, poisapenas abrimos as tabelas, precisamos agora verificar se a tabela de vendas est vazia, edesabilita o boto "Gravar" e o frame:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    32/44

    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 adescrio da mercadoria quando o usurio digitar o cdigo correspondente. Ou seja, numaincluso, quando o usurio digitar o cdigo da mercadoria que foi vendida, o programa terque acessar a tabela de Mercadoria, procurar o cdigo que o usurio acabou de digitar, etrazer de l a descrio daquele cdigo.

    Este trabalho todo podemos fazer no evento LostFocus da caixa de texto. Por queeste evento? Porque esta procura ser feita DEPOIS que o usurio digitar o cdigo e passarpara 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 detexto txtCdigo e outro para txtCdCliente:

    Usamos o SEEKpara efetuar uma procura dentro da tabela TBMercadoria.O que ir procurar?Ir procurar o cdigo digitado na caixa de texto txtCdigo.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    33/44

    Se NoMatch for igual a True sinal que no existe nenhuma mercadoria cadastradacom o cdigo digitado. Ento uma mensagem ser mostrada na tela: Mercadoria nocadastrada.

    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 existemcadastradas para o usurio escolher uma, ou algo assim. Mas para resumir nosso exemplodeixaremos assim.

    Se o cdigo digitado na caixa de texto for encontrado ento a descrio inseridadentro 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 outrosprogramas:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    34/44

    A alterao segue os padres anteriores, lembrando que nesta tabela de vendas nopodemos alterar o Cdigo da Mercadoria e o Cdigo do Cliente, pois ambos fazem parte dachave do ndice da tabela. Se necessitar alterar o cdigo, exclua e inclua novamente:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    35/44

    A excluso tambm semelhante aos anteriores:

    Os botes Anterior e Prximo devem fazer uma pesquisa na tabela de Mercadoria eClientes para atualizar os labels, a fim de que aparea a descrio da mercadoria e o nomedo cliente:

    Perceba que esta rotina move a tabela de vendas para o registro anterior, e depois aochamar a funo AtualizaFormulrio faz uma procura dentro da tabela de mercadoria edepois dentro da tabela de clientes usando como chave de busca o contedo existentedentro da tabela de vendas.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    36/44

    D uma conferida em seu cdigo fonte agora:

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    37/44

    Option Explicit

    Dim BancoDeDados As Database

    Dim TBVendas As Recordset

    Dim TBMercadoria As Recordset

    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

    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 ThenTBVendas.Delete

    cmdAnterior_Click

    End If

    End Sub

    Private Sub cmdGravar_Click()

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    38/44

    cmdIncluir.Enabled = True

    cmdAlterar.Enabled = True

    cmdConsultar.Enabled = True

    cmdExcluir.Enabled = True

    cmdAnterior.Enabled = TruecmdProximo.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

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    39/44

    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.CloneTBCliente.Close

    BancoDeDados.Close

    End Sub

    Private Function AtualizaCampos()

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    40/44

    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

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    41/44

    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 = TruecmdExcluir.Enabled = True

    cmdAnterior.Enabled = True

    cmdProximo.Enabled = True

    cmdGravar.Enabled = False

    cmdSair.Enabled = True

    Frame1.Enabled = False

    End Function

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    42/44

    Deixamos o boto Consulta de fora propositadamente. Vamos voltar nele nosprximos captulos.

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    43/44

  • 8/14/2019 Manipulao do Banco de Dados via DAO

    44/44