52913633 access 2000 programacao em vba

Upload: clefferson

Post on 07-Jul-2015

863 views

Category:

Documents


3 download

TRANSCRIPT

Sumrio1. ORIENTAO A EVENTOS...............................................................................................................2 1.1. ORDEM DE EXECUO DOS EVENTOS....................................................................................3 2. NORMAS DE NOMENCLATURA......................................................................................................5 2.1. JANELA DE CDIGO .....................................................................................................................6 3. VARIVEIS............................................................................................................................................7 3.1. DECLARAO DE VARIVEIS ...................................................................................................7 3.2. OPERADORES...............................................................................................................................11 3.2.4. PRECEDNCIAS ........................................................................................................................11 4. ESTRUTURAS DE PROGRAMAO .............................................................................................12 4.1. COMANDOS CONDICIONAIS ....................................................................................................12 4.2. COMANDOS DE LAOS CONDICIONAIS ................................................................................13 5.1. ACESSO RANDMICO ................................................................................................................15 5.2. ACESSO SEQUENCIAL................................................................................................................18 5.3. ACESSO BINRIO ........................................................................................................................20 6. PROCEDIMENTOS - FUNES E SUBROTINAS........................................................................25 6.1. ARGUMENTOS BYVAL E BYREF .............................................................................................26 6.2. ARGUMENTOS OPCIONAIS .......................................................................................................27 7. UTILIZAO DE OBJETOS DO ACCESS.....................................................................................28 7.1. OBJETO DOCMD ..........................................................................................................................28 7.2. OBJETO SCREEN..........................................................................................................................28 8. TRATAMENTO DE ERROS..............................................................................................................29 9. LINGUAGEM SQL.............................................................................................................................35 9.1. LINGUAGEM DE MANIPULAO DE DADOS .......................................................................35 9.2.1. INSTRUO CREATE TABLE .................................................................................................40 9.2.2. INSTRUO CREATE INDEX .................................................................................................40 9.2.3. INSTRUO DROP TABLE OU DROP INDEX .......................................................................41 9.2.4. INSTRUO ALTER TABLE....................................................................................................41 9.2.5. CLUSULA CONSTRAINT.......................................................................................................42 9.3. FUNES AGREGADAS .............................................................................................................42 10. TCNICAS DE PESQUISA DE DADOS.........................................................................................43 10.1. MTODO FIND............................................................................................................................45 10.2. MTODO SEEK ...........................................................................................................................47 11. INTEGRANDO COM O OFFICE 2000...........................................................................................50 11.1 FUNES CREATEOBJECT E GETOBJECT ............................................................................51 11.2. INSTANCIANDO O MICROSOFT WORD ................................................................................52 11.3. INSTANCIANDO O MICROSOFT EXCEL................................................................................53 11.4. INSTANCIANDO O MICROSOFT ACCESS .............................................................................55 12. EXERCCIOS PROPOSTOS............................................................................................................57 ANEXO 1 ..................................................................................................................................................59 ANEXO 2 ..................................................................................................................................................73

1

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

1. ORIENTAO A EVENTOSUm evento uma ao especfica que ocorre sobre e/ou com um determinado objeto. O Access pode responder a vrios eventos simultaneamente, como por exemplo: cliques de mouse, alteraes em dados, abertura ou fechamento de formulrios e muitos outros. Os eventos so, geralmente, o resultado de uma ao do usurio. Podemos criar a nossa prpria resposta a um evento atravs de um procedimento de evento ou de uma macro. Quando voc cria um procedimento de evento para um objeto, o Microsoft Access adiciona um modelo de procedimento de evento nomeado para o evento do objeto formulrio ou o objeto relatrio. Tudo o que voc precisa fazer adicionar o cdigo que responda s aes quando ocorrer(em) o(s) evento(s) para o formulrio ou relatrio. Abaixo a lista de eventos disponveis em ordem alfabtica: Evento Activate AfterDelConfirm AfterInsert AfterUpdate ApplyFilter BeforeDelConfirm BeforeInsert BeforeUpdate Change Click Close Current DblClick Deactivate Delete Enter Error Exit Filter Format GotFocus Initialize ItemAdded ItemRemoved KeyDown KeyPress KeyUp Load LostFocus MouseDown MouseMove MouseUp NoData NotInList Open Page Print Resize 2 Propriedade do Evento Ao Ativar Aps Confirmar Excluso Aps Inserir Aps Atualizar Ao Aplicar Filtro Antes De Confirmar Excluso Antes De Inserir Antes De Atualizar Ao Alterar Ao Clicar Ao Fechar No Atual Ao Clicar Duas Vezes Ao Desativar Ao Excluir Ao Entrar Ao Ocorrer Erro Ao Sair Ao Filtrar Ao Formatar Ao Receber Foco nenhuma nenhuma nenhuma Ao Apertar Tecla Ao Pressionar Tecla Ao Liberar Tecla Ao Carregar Ao Perder Foco Ao Apertar Mouse Ao Mover Mouse Ao Liberar Mouse Se Nenhum Dado Se No Estiver Na Lista Ao Abrir Na Pgina Ao Imprimir Ao Redimensionar

ACCESS 2000 PROGRAMAO EM VBA Evento Retreat Terminate Timer Unload Updated Propriedade do Evento Ao Retirar nenhuma No Cronmetro Ao Descarregar Ao Atualizar

SENAC-RS

Tabela 1 - Eventos

Uma nica ao pode acionar vrios eventos que ocorrem em uma seqncia especfica, visto que a execuo do Visual Basic se d de modo assncrono, ou seja, o processador pode executar diversas tarefas simultaneamente todas elas independentes umas das outras, sem necessariamente uma ter que encerrar para iniciar outra, ou uma ficar aguardando a outra. Portanto, muito importante saber em que ordem os eventos acontecem, porque isso pode afetar a sua execuo.

1.1. ORDEM DE EXECUO DOS EVENTOSMovendo o foco para um controle: Enter (Ao entrar) GotFocus (Ao receber foco) Abrindo um formulrio: Open (Ao abrir) Activate (Ao ativar) Current (No atual) (Ao entrar) GotFocus (Ao receber foco) Abandonando um controle num formulrio: Exit (Ao sair) LostFocus (Ao perder foco) Movendo o foco para um outro controle: Exit (Ao sair) LostFocus (Ao perder foco) (Ao receber foco) Fechando um formulrio: Exit (Ao sair) LostFocus (Ao perder foco) Deactivate (Ao desativar) Close (Ao fechar) Enter (Ao entrar) GotFocus Enter

Unload (Ao descarregar)

Alterando e atualizando dados em um controle: BeforeUpdate (Antes de atualizar) AfterUpdate (Depois de atualizar) Exit (Ao sair) LostFocus (Ao perder foco) Alterando o contedo de uma caixa de texto Change (Ao alterar) BeforeUpdate (Antes de atualizar) (Depois de atualizar) Pressionando uma tecla em uma caixa de texto: KeyDown (Ao apertar tecla) KeyPress (Ao pressionar tecla) (Ao alterar) KeyUp (Ao liberar tecla) AfterUpdate

Change

3

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Excluindo um registro: Delete (Ao excluir) BeforeDelConfirm (Confirmar antes de excluir) AfterDelConfirm (Aps confirmar excluso) Criando um novo registro: Current (No atual) Enter (Ao entrar) GotFocus (Ao receber foco) BeforeInsert (Antes de inserir) AfterInsert (Depois de inserir) Abrindo um formulrio: Open (Ao abrir) Load (Ao carregar) Activate (Ao ativar) Current (No atual) Fechando um formulrio: Unload (Ao descarregar) Resize (Ao redimensionar)

Deactivate (Ao desativar)

Close (Ao fechar)

Clicando em um outro controle: No primeiro controle: Exit (Ao sair) LostFocus (Ao perder foco) No segundo controle: Enter (Ao entrar) GotFocus (Ao receber foco) MouseDown (Ao apertar mouse) MouseUp (Ao liberar mouse) Click (Ao clicar) Imprimindo ou visualizando um relatrio: Open (Ao abrir) Activate (Ao ativar) Format (Ao formatar) (Ao imprimir) Close (Ao fechar) Deactivate (Ao desativar) Print

Sempre que manipulamos os objetos do Access devemos saber que eles esto abaixo do objeto Application, que se refere ao aplicativo ativo de banco de dados, conforme demonstra o esquema abaixo:

Figura 1 - Objeto Application

Este objeto contm todas as colees e objetos do Microsoft Access, incluindo a coleo de formulrios (Forms), a coleo de relatrios (Reports), a coleo de mdulos (Modules), a coleo de referncias (References), o objeto de tela (Screen) e o objeto de executar aes (DoCmd). Voc pode utilizar o objeto Application para aplicar definies de propriedades ou mtodos a todo o aplicativo do Microsoft Access. Um exemplo seria utilizar o mtodo SetOption do objeto Application para definir uma das opes do banco de dados, selecionar a caixa de Barra de Status na guia Exibir da janela de dilogo Opes do menu Ferramentas. Application.SetOption "Mostrar Barra de Status", True

4

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

2. NORMAS DE NOMENCLATURAVoc deve sempre se preocupar com a documentao e a padronizao de variveis, controles e objetos e do sistema como um todo, para que se tenha um aplicativo com uma programao bem legvel e que o processo de manuteno seja o mais fcil e eficiente possvel. Portanto, adotaremos a referncia da LNC - Leszinsky Naming Conventions e a RNC - Reddick Naming Conventions. Estas normas para nomenclatura so utilizadas internacionalmente, chamadas de notaes hngaras, e fornecem um mtodo capaz de tornar compreensvel o significado de cada objeto ao qual o cdigo faz referncia. De forma bem simples demonstraremos o seu emprego: [prefixo][marca](nome_do_componente)[sufixo] Ex.: gstrNome_Cliente - varivel tipo global, cujo contedo um string e armazena a informao do Nome do Cliente. Abaixo as tabelas com as principais caractersticas destas convenes: PREFIXO s l g a i MARCA byt f int lng sng dbl cur dtm obj str var MARCA app chk cbo cmd ctl ocx frm img lbl lst bas/mdl opt TIPO DE OBJETO Varivel local esttica Varivel local ao mdulo Varivel global ou pblica Matriz (array) ndice de matriz ou coleoTabela 2 - Prefixos para variveis

TIPO DE VARIVEL Byte Boolean Integer Long Single Double Currency Date Object String VariantTabela 3 - Marcas para variveis

TIPO DE CONTROLE Application Check Box Combo Box Command Button Control Collection Control Customized Form Image Control Label List Box Module Option Button

5

ACCESS 2000 PROGRAMAO EM VBA MARCA rpt txt MARCA Min First Last Lim Max Cnt TIPO DE CONTROLE Report Text Box

SENAC-RS

Tabela 4 - Marcas para controles e objetos

TIPO DE SUFIXO O menor elemento retornado O primeiro elemento retornado O ltimo elemento retornado O limite superior dos elementos utilizados O maior elemento retornado Para campos do tipo AutonumeraoTabela 5 - Marcas para sufixos

2.1. JANELA DE CDIGOInicia, pra ou redefine a execuo do cdigo Exibe a janela depurar Exibe o explorador de objetos Exibe a janela de inspeo de variveis

Ativa/Desativa pontos de interrupp Seleciona desejado Insere mdulo ou procedimento na rea de cdigo o objeto Seleciona o procedimento, mtodo ou evento do objeto.

rea de cdigo onde escrevemos os comandos em VBA.

Figura 2 - Janela de Cdigo do VBA

Visualiza somente um todos procedimentos janela

ou da

6

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

3. VARIVEIS 3.1. DECLARAO DE VARIVEISA declarao de nomes de variveis no obrigatria no Visual Basic, mas recomendada, pois com esta precauo evitam-se erros de digitao e atribuio de valores. Variveis so estruturas onde armazenamos qualquer tipo de informao e que sero utilizadas no nosso cdigo. Na criao do nome da varivel, devemos seguir as seguintes regras: Comece o nome com uma letra, aps pode conter letras e/ou nmeros; O nome deve conter apenas letras, nmeros e o caracter underscore (sublinhado). Caracteres de pontuao, acentuao e espaos no devem ser utilizados; O nome no deve exceder 40 caracteres. No podem ser utilizadas palavras reservadas do Access, como por exemplo, as propriedades Nome(Name) e Valor(Value) dos objetos. TIPO Byte Boolean Integer Long Single Double Currency Date Object String Variant Userdefined DESCRIO 1 byte 2 bytes Inteiro de 2 bytes Inteiro de 4 bytes Nmero de Ponto Flutuante de 4 bytes LIMITE

0 a 255 True ou False -32.768 at 32.767 -2.147.483.648 at 2.147.483.647 -3,402823E38 at -1,401298E-45 para valores negativos 1,401298E-45 at 3,402823E38 para valores positivos Nmero de Ponto -1,797693E308 a -4,940656E-324 para Flutuante de 8 bytes valores negativos; 4,940656E-324 at 1,797693E308 para valores positivos Ponto Decimal fixo -922.337.203.685.477,5808 at com 8 bytes 922.337.203.685.477,5807 8 bytes 1 de janeiro de 100 at 31 de dezembro de 9999 4 bytes Qualquer referncia a Objeto String de caracteres 1 a 65.400 aproximadamente 16 a 22 bytes Qualquer tipo de dado Nmero Requerido Cada elemento obedece seu tipoTabela 6 - Tipos Fundamentais de Variveis

Quando voc declara uma varivel dentro de uma procedimento ou funo, apenas o cdigo contido neste procedimento pode acessar ou trocar o valor desta varivel, significando que o escopo ou alcance daquela varivel restrito ou local quele procedimento. s vezes, voc pode necessitar usar a varivel com um alcance maior, de forma que o seu contedo esteja disponvel para todas os procedimentos contidos dentro de um formulrio, ou mesmo que ela possa ser visto por todos os mdulos em todos os formulrios de uma aplicao. O Visual Basic permite que voc especifique o escopo ou alcance de uma varivel dependendo da forma que voc a declarar.

7

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

3.1.1. DECLARAO IMPLCITA DE VARIVEISVoc no precisa declarar uma varivel antes de us-la. Por exemplo, voc pode escrever uma funo como abaixo: Function ValidaData(Data) dtmData = Data If isdate(Data) Then ValidaData = True Else ValidaData = False Endif .... .... End Function Voc no tem que declarar dtmData antes de us-lo na funo. O Visual Basic automaticamente cria uma varivel com o seu nome, de forma que voc pode us-lo como se houvesse explicitamente declarado a varivel. Ao mesmo tempo que este procedimento conveniente , ele tambm pode levar a erros em seu cdigo se voc escrever uma varivel de forma errada.

3.1.2. DECLARAO EXPLCITA DE VARIVEISPara evitar o problema de variveis escritas de forma errada , voc pode estipular que o Visual Basic ir sempre gerar uma mensagem de erro quando encontrar um nome no previamente declarado explicitamente como uma varivel. Para fazer isto, coloque a sentena abaixo na seo Declarations do formulrio ou do mdulo de cdigo, conforme mostra a figura :

Esta instruo obriga declarao de variveis.

a

Figura 3 - Janela de Mdulo

8

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

3.1.3. DECLARAO DE CONSTANTESUtilizada quando um valor ou um sring repete-se constantemente dentro do cdigo com o propsito de aumentar a legibilidade do cdigo e facilidade de modificao de seu contedo. Sintaxe: [Public] Const nome_constante = expresso Exemplos: Const PI=3.141592654 Public Const MAX_REG=20 Const NEW_MAX_REG = MAX_REG * 3 Tipos de variveis definidos pelo usurio (estruturas) : Voc pode criar tipos de variveis definidos pelo usurio com o uso sentena TYPE, que deve ser colocada na seo de declaraes de um mdulo cdigo. Um tipo criado pelo usurio sempre visto de forma global dentro cdigo, apesar de que as variveis declaradas com este tipo possam ser globais locais as funes ou aos mdulos do formulrio. Abaixo criamos um tipo definido pelo usurio que guarda as informaes um usurio. Type RegUsuario Cod As Integer Nome As String Cargo As String Salario As Currency End Type Voc pode declarar uma varivel global ou local ou a nvel de mdulo com o tipo RegUsuario. Dim Cadastro As RegUsuario Podemos atribuir valores aos elementos da varivel desta maneira: RegUsuario.Cod = "0001" RegUsuario.Nome = "Patricia Santos" RegUsuario.Cargo = "Recepcionista" RegUsuario.Salario = "1800" da de do ou de

3.1.4. DECLARAO DE ARRAYSDe uma maneira bem simplificada, os Arrays so conjuntos de variveis de memria agrupadas com um mesmo nome, sendo que cada uma destas variveis completamente distinta uma da outra. Neste caso, o que diferencia um elemento do outro a sua posio relativa dentro do array. Imagine que o seu programa utiliza trs variveis de memria para armazenar os preos de produtos concorrentes com os fabricados pela sua empresa. Neste caso, voc poderia resolver o problema atravs da seguinte maneira: Dim Preco1 As Single, Preco2 As Single, Preco3 As Single Preco1 = txtPrecoConc1.Text Preco2 = txtPrecoConc2.Text Preco3 = txtPrecoConc3.Text

9

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Vamos, ento utilizar a estrutura de array para armazenar estas informaes: Dim Preco(3) As Single Preco(1) = txtPrecoConc1.Text Preco(2) = txtPrecoConc2.Text Preco(3) = txtPrecoConc3.Text Note que cada uma destas variveis completamente independente das outras, exceto pelo fato de todas possurem o mesmo nome comum. Quaisquer alteraes feitas em um elemento do array no so refletidas nos demais componentes. Neste caso, voc pode referenciar cada elemento do array atravs de seu nome e sua posio relativa: Valor = Preco(2) * 1.25 Vamos declarar um array para que possamos utiliz-lo com no exemplo anterior: Dim NomeVar[ ([Dimenso]) ][As Tipo] Onde: NomeVar : o nome do array que voc deseja criar. Este nome segue as mesmas regras da criao de variveis. Dimenso : a dimenso da varivel Array. Voc pode declarar o elemento inicial e final do array atravs da seguinte sintaxe: [Inicial To] Final Tipo : Segue as mesmas regras de tipos de dados. Voc no precisa declarar o limite inferior do array, somente o extremo superior. Quando voc no declara o limite inferior, o Visual Basic segue o padro estabelecido pela declarao Option Base. Em outras palavras, se voc no incluir a declarao Option Base em suas procedures, o limite inferior do array sempre ser, por default, o valor ZERO. Caso esta opo esteja declarada como Option Base 1, o limite inferior do array ser o nmero 1. Se utilizarmos o comando Dim Preco(4) para criarmos um array, ele conter quatro elementos, sendo que podemos acess-los nas posies de 0 a 3. Se voc tentar referenciar o elemento Preco(4) estar tentando referenciar o quinto elemento do array, sendo que ele no existe! Observaes: Voc tambm pode utilizar o comando Dim para declarar um Array dinmico, isto , sem dimenso definida. Neste caso, o seu array seria declarado da seguinte forma: Dim TempoEmpresa() As Integer Este recurso til quando voc no sabe ao certo quantos elementos iro compor seu array, mas j quer deix-lo declarado em seu cdigo. Depois para dimension-lo, usa-se o comando Redim. Outro ponto a ser considerado que voc pode criar um array sem definir o tipo de dados que ele conter. Todos os seus elementos sero do tipo de dados Variant (cada um dos seus elementos ter 16 bytes de tamanho). A sintaxe do comando Redim praticamente idntica do comando Dim: Redim [Preserve] NomeVar(dimenso) [As Tipo] Onde: Preserve: Mantm todos os dados existentes no array que est sendo redimensionado. 10

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

3.2. OPERADORESComo voc j deve estar imaginando, operadores so sinais grficos que indicam determinadas operaes a serem realizadas, e se dividem em quatro categorias distintas: Operadores Aritmticos

Operadores de Comparao Operadores de Concatenao Operadores Lgicos

utilizados para a realizao de clculos matemticos. utilizados em expresses para comparardois ou mais valores existentes.

utilizados para a combinao de strings. realizam operaes lgicas entre dois ou mais valores existentes.

3.2.1. OPERADORES ARITMTICOSSo utilizados para operaes matemticas entre dados numricos:

+ * / ^ \

Soma de dois nmeros quaisquer. Subtrai dois nmeros quaisquer ou indica que um determinado nmero negativo. Multiplica dois nmeros quaisquer. Divide dois nmeros quaisquer. Eleva um dado nmero a uma potncia qualquer. Divide dois nmeros e retorna um valor inteiro.

3.2.2. OPERADORES DE COMPARAOEstes operadores servem para indicar uma operao de comparao entre dois ou mais valores ou expresses existentes. Aps avaliar a expresso que contm este tipo de operador , o VB retornar o valor True caso a comparao seja verdadeira ou o valor False, caso a comparao no se verifique. Temos, ento: =, e =

3.2.3. OPERADORES LGICOSEste tipo de operador utilizado para testar logicamente duas ou mais expresses ou variveis de memria, baseando-se na lgebra booleana. Temos, ento: NOT, AND e OR

3.2.4. PRECEDNCIASQuando uma expresso composta por vrios operadores existem regras para indicar sua prioridade de execuo. Para evitarmos que se encontre um valor diferente para uma mesma expresso, o VBA adota a seguinte ordem no momento de avaliar uma expresso:

11

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Operadores Aritmticos

Operadores de Comparao

Operadores Lgicos

Imagine encontrar a seguinte expresso:

7 * 3 > 16 ^ 2 And 200 / 4 = 3 * 12A mesma seria avaliada da seguinte forma

7*3 1

> 16 ^ 2 2 5

And

200 / 4 3

=

3 * 12 4

7

6

4. ESTRUTURAS DE PROGRAMAO 4.1. COMANDOS CONDICIONAISAs sentenas que controlam decises condicionais para executar uma ou mais instrues. A instruo avalia a expresso contida na condio, se verdadeiro realiza os comando do bloco Then e se for falsa o do bloco Else. Podemos, tambm, utilizarmos outra estrutura de teste no uso de mltiplas instrues.

If condio Then comando If condio Then comando1 comando2 Else comando3 comando4 End If If condio1 Then comando1 comando2 ElseIf condio2 Then comando3 Else comando4 End If IIf(condio,clusula Ento,clusula Seno) Select Case expresso Case item1 bloco_de_comandos1 Case item2 bloco_de_comandos2 Case Else bloco_de_comandosX End Select12

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Cada item de teste uma lista de um ou mais valores. Se houver mais de um valor, eles estaro separados por vrgulas. Cada bloco de comandos contm um comando, mais de um comando ou nenhum comando. Se mais de um Case coincide com a expresso testada, apenas o bloco de comandos associado com o primeiro Case coincidente ser executado. O Visual Basic executar comandos no bloco Case Else (que opcional) se nenhum dos valores na lista de itens coincidir com a expresso de teste.

4.2. COMANDOS DE LAOS CONDICIONAISDo ... LoopUse o Do ... Loop para executar um bloco de comandos por um nmero indefinido de vezes. Existem variaes da sentena Do... , mais cada uma avalia uma condio numrica para determinar quando continuar a execuo. Assim como acontece com o If_Then a condio precisa resultar em um valor numrico que possa ser traduzido como True(-1) ou False (0). A estrutura abaixo executada enquanto a condio for True:

Do While condio bloco_de_comandos LoopOutra variao do Do...Loop executa primeiro os comandos e depois testa a condio. Esta variao garante pelo menos uma vez a execuo do bloco de comandos :

Do bloco_de_comandos Loop While condioAs duas variaes abaixo so analogas as anteriores , com a exceo de que elas ficam em loop enquanto a condio de teste Falsa. Executa zero ou mais vezes

Do Until condio bloco_de_comandos LoopExecuta pelo menos uma vez

OBSERVAO: Note bem que Do Until condio equivalente a instruo de Do While Not condio.

Do bloco_de_comandos Loop Until condio For ... NextEsta uma estrutura de repetio utilizada quando se sabe previamente o nmero de vezes que um bloco de comandos ser executado. O For...Next utiliza um contador que incrementado ou decrementado durante cada repetio. Sua sintaxe :

For contador = incio To final [ Step incremento ] comandos Next [ contador ]

13

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Os argumentos contador, inicio , final e incremento so todos numricos. O argumento incremento pode ser positivo ou negativo. Se incremento positivo, inicio deve ser menor ou igual a final. Se incremento negativo, inicio deve ser maior ou igual a final, para que os comandos sejam executados. Se o incremento no for informado ento ele ter seu valor assumido como 1. O comando Exit permite que voc abandone diretamente um bloco For..Next, Do...Loop, Sub procedure, ou Function procedure. Vejamos o exemplo:

For intInd = 1 To 100 strNome= txtNome_Cliente If strNome = "Mario Paranhos" Then Exit For End If Next intInd

OBSERVAO: Podemos utilizar estas sadas foradas: Exit Do Exit For Exit Function Exit Sub

Go To Faz com que o programa desvie incondicionalmente para um rtulo ou uma linha especificada dentro de uma procedure. No se recomenda utilizar este comando para programao estruturada, somente para desvio quando acontecer um erro. Sintaxe: Go To (rtulo | nmero de linha) Exemplo:

... On Error Go To Trata_Erro ... ... Trata_Erro: MsgBox Err.Description ... ... End Sub For Each elemento In elemento ... NextPermite que voc percorra os elementos de uma coleo ou matriz

Exemplo: Dim ctl as Control For Each ctl in Me If ctl.Name = vbText Then Debug.Print "Este Controle uma Caixa de Texto." Endif Next With objeto ... End WithEsta instruo permite que se referencie a vrias propriedades de um objeto de uma s vez. Exemplo:

With Me!txtNome .BackColor = 0 .Visible = True .Enabled = True End With

14

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

5. MANIPULAO DE ARQUIVOSUm arquivo nada mais do que uma srie de bytes relacionados e localizados em disco. Quando uma aplicao acessa um arquivo, necessrio fazer suposies sobre o tipo de dado que ser acessado (integer, single, ou outros tipos de dados). Existem trs tipos de acesso a arquivos: Randmico Seqencial Binrio

5.1. ACESSO RANDMICOUm arquivo aberto para acesso randmico composto de uma srie de registros de mesmo tamanho. Apesar de um registro precisar, necessariamente, corresponder a um nico tipo de dado, isto no representa muitas restries, uma vez que podemos utilizar o tipo de dado definido pelo usurio (Type). O acesso randmico possui muitas vantagens em acesso e tratamento de registros. Por outro lado, os dados dentro de um registro so geralmente, menores do que o tamanho reservado para eles, o que ocasiona um espao de disco perdido. Em um arquivo de acesso randmico, os bytes formam registros com estruturas idnticas, cada uma contendo um ou mais campos. Um registro com um nico campo corresponde a um nico tipo padro, como integer ou string de tamanho fixo. Um registro com mais de um campo corresponde a qualquer estrutura de dados definida pelo usurio. Em um arquivo aberto para acesso randmico, todos os registros precisam corresponder a um nico tipo. Antes de abrir um arquivo para acesso randmico, definimos o tipo de registro que o arquivo dever armazenar. No exemplo que ser tratado nesta seo, Agenda de Telefones, o tipo de registro declarado como um tipo definido pelo usurio e recebe o nome de Registro:

Figura 4 - Declarao de um Registro

Obs.: Dentro de um mdulo global podemos utilizar a declarao anterior com escopo Public ou Private, porm, dentro de formulrios, apenas o escopo Private aceito (e obrigatrio)

15

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Notamos que todos os strings so de tamanho fixo. Isto se torna necessrio uma vez que o registro precisa ter um comprimento pr-determinado e fixo. Notamos tambm que, se Nome possuir somente 10 caracteres, os 5 caracteres restantes so preenchidos com espaos em branco. Da mesma forma que se Nome for maior que 15, os caracteres a partir do 15 sero ignorados (truncados). Para abrir um arquivo de acesso randmico, utilizamos a sintaxe para a declarao Open

Open For Random As numero_arquivo Len = tamanho_registro Onde:Len = tamanho_registro, utilizamos para especificar o tamanho do registro. Se este valor for incorreto, o acesso ser inadequado e os dados inconsistentes.

Exemplo:

Figura 6 - Comando Open

Para editar um arquivo aberto por acesso randmico, devemos copiar os registros provenientes do arquivo para variveis, alter-las se necessrio e depois copi-las de volta para o arquivo. Lendo registros do arquivo: Devemos utilizar a declarao Get para copiar os registros para as variveis do programa. Para realizar esta tarefa utilizamos a seguinte sintaxe: Get NumArq, Posicao, Agenda Onde: NumArq - Varivel que contm o nmero utilizado para abrir o arquivo na declarao Open. Posio - Varivel que contm o nmero do registro a ser copiado do arquivo especificado. Agenda - Varivel do tipo Registro que receber o contedo do registro.

16

ACCESS 2000 PROGRAMAO EM VBA Gravando no arquivo

SENAC-RS

Devemos utilizar a declarao Put para copiar registros em arquivos de acesso randmico. Para adicionar um novo registro no final de um arquivo de acesso randmico, devemos utilizar a declarao Put mostrada no procedimento evento Insere_click a seguir. Notemos que a posio de insero uma a mais do que a ltima posio do arquivo. Por exemplo, se um arquivo possuir 8 registros, devemos inserir o novo registro na posio 9.

Figura 7 - Gravando Registro

Deletando Registros Podemos deletar um registro simplesmente limpando todos os seus campos, contudo, apesar de vazio, o registro ainda existiria no arquivo. Ou seja, nesta soluo criamos buracos no arquivo gerando espaos no disco perdidos e problemas em operaes seqenciais. A melhor maneira de deletar um registro copiar todos os registros posteriores a ele para uma posio anterior. Por exemplo, vamos supor que o registro 6 deve ser deletado de um arquivo que contenha 8 registros: Neste caso devemos copiar o registro 7 sobre o 6, que ser apagado, e o registro 8 devemos copiar sobre o registro 7, que agora o registro 6.

Figura 8 - Excluindo Registros

O procedimento Deleta_Click possui uma falha: A ltima iterao da malha For..Next copia o ltimo registro sobre o registro anterior a ele, deixando, contudo, o ltimo registro com duas cpias no arquivo - na penltima e ltima posio.

17

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Para remover uma das cpias deste registro duplicado devemos seguir os seguintes passos. Criar um novo arquivo Copiar todos os registros vlidos do arquivo original para o novo arquivo Fechar todos os arquivos abertos atravs da declarao Close Utilizar a declarao Kill para apagar o arquivo original do disco Utilizar a declarao Name para renomear o novo arquivo com o nome do arquivo original Abrir novamente o arquivo e atualizar o valor de suas variveis de controle.

5.2. ACESSO SEQUENCIALO acesso a arquivos de maneira seqencial, oferece melhores resultados quando o arquivo formado por um texto, como um arquivo criado por um editor de texto normal. Quando abrimos um arquivo para acesso seqencial, podemos realizar uma entre as trs operaes a seguir Ler caracteres do arquivo (Input) Gravar caracteres no comeo do arquivo (Output) Gravar caracteres no fim do arquivo (Append) Aps abrir o arquivo para uma das operaes anteriores, necessrio fechar o arquivo, atravs da declarao Close, antes de reabri-lo para uma outra operao. Para abrir um arquivo para acesso seqencial utilizamos a declarao Open com a seguinte sintaxe:

Open arquivo For [Input / Output / Append] As ArqNum [Len]=TamanhoBufferOBS.: Quando utilizamos Input, o arquivo j deve existir, caso contrrio o VB produzir um erro. Contudo, quando tentamos abrir um arquivo inexistente com Output ou Append, o VBA primeiramente cria o arquivo e depois o abre. Para editar um arquivo aberto por acesso seqencial, devemos copiar o contedo do arquivo para varivel, alter-las se necessrio e depois copi-las de volta para o arquivo. Para ler o contedo de um arquivo de texto, devemos abrir o arquivo para acesso seqencial atravs da declarao Input. Utilizamos em seguida as declaraes Line Input #, Input$, ou Input # para copiar o arquivo para as variveis do programa. Normalmente, todo o contedo de um arquivo texto lido de uma nica vez. Contudo, o VBA oferece algumas ferramentas que permitem ler e gravar arquivos seqenciais linha por linha.

18

ACCESS 2000 PROGRAMAO EM VBA Exemplo:

SENAC-RS

Figura 9 - Lendo Registros

O cdigo acima l o contedo de um arquivo at que a funo EOF retorne True, indicando que o fim de arquivo foi encontrado. A cada iterao do lao, a declarao Line Input# armazena uma nica linha do arquivo na varivel ProximaLinha. A declarao Line Input# reconhece o fim de uma linha de texto quando encontra a seqncia de caracteres nova linha e retorno do carro (linefeed e carriage return - vbCrLf). Contudo, estes caracteres no so lidos pela declarao, logo se quisermos armazenar esta seqncia de caracteres na varivel devemos proceder como no cdigo acima. Podemos utilizar a funo Input para copiar qualquer nmero de caracteres de um arquivo para uma varivel. Esta funo obedece a seguinte sintaxe: Input [$] (n,NumArq) Onde:

Input retorna um tipo de dado Variant e Input$ retorna uma String n; nmero de bytes (caracteres) a serem lidos NumArq: Nmero do arquivo definido para uso na declarao Open Para lermos um arquivo inteiro para uma varivel do programa de uma nica vez utilizamos o seguinte cdigo: LinhasDoArquivo = Input$(LOF(NumArq),NumArq) Onde LOF(NumArq) retorna o tamanho do arquivo em bytes, ou seja o nmero de caracteres do arquivo. OBS.: Ao contrrio da declarao Line Input#, a funo Input l os caracteres de nova linha e retorno de carro. O VBA tambm suporta a declarao Input #. Utilizamos esta declarao para ler uma lista de expresses numricas e/ou strings escritas em um arquivo com a declarao Write #

19

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Caixas de texto so freqentemente utilizadas em VB para exibir arquivos de texto. O tamanho mximo de um arquivo que pode ser editado 32K, o que o mximo valor que pode ser atribudo a uma caixa de texto de mltiplas linhas em VB. Portanto, antes de lermos um arquivo para uma caixa de texto, devemos verificar o tamanho do mesmo. Obs.: 32000 a aproximao grosseira para 32K. Uma aproximao mais precisa seria de 32*1024 = 32768 Escrever strings: Para armazenar o contedo de variveis em um arquivo de texto, devemos abri-lo com Output ou Append e utilizarmos a declarao Print #. Por exemplo, o cdigo a seguir copia todo o contedo de uma caixa de texto para um arquivo: Print #NumArq, Text1.Text O VBA tambm suporta a declarao Write #. Esta declarao permite que se escreva uma lista de expresses numricas e/ou strings em um arquivo. As expresses so separadas automaticamente por vrgulas, sendo que as expresses strings so colocadas entre aspas.

5.3. ACESSO BINRIOO acesso binrio permite uma flexibilidade muito maior para tratamento de arquivos, uma vez que os bytes neste tipo de arquivo podem representar qualquer tipo. Devemos utilizar acesso binrio quando desejarmos manter o arquivo com o menor tamanho possvel. Para abrir um arquivo para acesso binrio, devemos utilizar a seguinte sintaxe da declarao Open. Open Arquivo For Binary As NumArq Para entendermos melhor quando utilizar um arquivo de Acesso Binrio, vamos considerar um tipo de registro, Pessoa, utilizado para arquivos de acesso randmico. Este registro tpico descrito atravs da declarao Type...EndType:

Figura 10 - Declarao de Registro

20

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Neste exemplo so utilizados registros de tamanho fixo ( exigncia do acesso randmico ) para armazenar informaes sobre empregados de uma instituio. Todo registro neste arquivo ocupa 194 bytes (integer - 2bytes, double - 8bytes, Long - 4 bytes, 15,15,150), no importando o seu contedo. No campo Comentrios, a string Bom Trabalho ocupa o mesmo espao de disco que a string O empregado tem se mostrado um pouco indeciso quando colocado sobre presso. No aconselhado para cargos de gerncia. Pode acontecer tambm que 150 caracteres seja muito pouco para este campo Comentrios. Algumas vezes so necessrios cerca de 500 caracteres, contudo a mdia de 20 caracteres. Utilizando acesso randmico teramos que definir um tamanho do campo suficiente para armazenar a maior necessidade, ou seja 500 bytes. Com isto teramos em mdia 480 bytes no aproveitados por registro. Este tipo de problema pode ser evitado atravs do uso de arquivos com acesso binrio, uma vez que neste tipo de arquivo no necessrio a pr-definio do tamanho dos campos. Com isto o registro Pessoa pode assumir o seguinte aspecto:

Figura 11 - Declarao de Tipo de Dados

Cada registro Empregado armazena agora somente o nmero de bytes efetivamente utilizados. Isto, contudo, pode gerar um problema quando necessitamos determinar o tamanho de cada campo para efetivarmos a leitura dos dados. Uma boa maneira de solucionar este problema gravar um tipo de dado Integer, o qual informar o tamanho da string, no prprio arquivo antes de cada campo de tamanho varivel. Esta soluo tem um custo de espao em disco (2 bytes por string), porm, sem dvida, torna os registros Empregados, em mdia menores do que os utilizados em acesso randmico. O procedimento Escreve_um_Registro, descrito a seguir, grava um registro no arquivo de empregados:

21

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Figura 12 - Gravao de Registro

OBS.: Apesar do acesso binrio prover uma maior flexibilidade que o acesso randmico, requer mais cdigo para manipulao de operaes de I/O. A declarao Get, quando utilizada com variveis de tamanho fixo, ou de tamanho conhecido, l o nmero de bytes pr-determinados, mesmo que existam bytes no utilizados. Quando utilizamos a declarao Get para strings de tamanho varivel, lido somente o tamanho corrente(atual) da string. Considere o seguinte exemplo: Escola = "PEOPLE COMPUTAO" Get #1, , Escola ' String contm 17 caracteres ' L 17 bytes do arquivo #1 para a varivel escola

O procedimento Get_um_Registro, a seguir l os registros gravados pelo procedimento Escreve_Um_Registro visto anteriormente. Antes de lermos cada campo necessrio conhecermos o tamanho deste campo. Uma vez determinado o tamanho do campo utilizaremos a funo String$ para definir a varivel que receber os dados como uma varivel com o tamanho correto e inicialmente composta de espaos em branco.

22

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Figura 13 - Leitura de Registros (Get)

Uma outra maneira, mais simples, de realizarmos a mesma tarefa atravs da utilizao da declarao Input$. O procedimento Put_Um_Registro, ilustra a utilizao desta declarao:

Indiferente ao mtodo de acesso utilizado, importante manter a informao da localizao dos registros em um arquivo. Caso contrrio, ser preciso ler desde o comeo de um arquivo toda vez que for necessrio a recuperao de um dado, o que pode tornar uma aplicao consideravelmente lenta. 23

Figura 14 - Leitura de Registros (Input)

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

O acesso randmico tem alguma vantagem neste ponto, pois mantm as informaes da posio de seus registros baseado no tamanho dos mesmos e na posio do incio do arquivo. Tudo que precisamos fazer ento fornecer funo de escrita ou leitura o nmero do registro. Entretanto, isto somente til quando desejamos acessar no contedo de um de seus campos, como por exemplo o ltimo nome do empregado. Se estivermos utilizando acesso binrio, os dados sero localizados em lugares pr-estabelecidos, em alguns casos os dados binrios nem mesmo se encontram na forma de registros. Nestes casos necessrio o uso de algum mecanismo que manter, de alguma forma, informaes sobre a localizao dos registros no arquivo. Um destes mecanismos a tabela de localizao do arquivo (File Location table). Por exemplo, vamos supor que precisamos de um rpido acesso a qualquer dos registros dos empregados, e que utilizaremos o ltimo nome para localizar estes registros. Comearemos construindo um novo tipo de dado, e em seguida construiremos nossa tabela com base neste tipo.

Figura 15 - Tabela de Array

O cdigo acima cria uma tabela que pode ser utilizada para procurar um empregado pelo seu ltimo nome. A tabela fornece a localizao do comeo do registro especificado. Esta tabela pode ser lida ou criada a cada vez que o arquivo de empregados aberto. No devemos esquecer de atualizar esta tabela toda vez que o registro sofrer alguma alterao.

24

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

6. PROCEDIMENTOS - FUNES E SUBROTINASSo trechos de programa que executam uma determinada tarefa. A tarefa a ser realizada pode ou no retornar um parmetro (resultado). Quando retorna parmetro chamada de funo. As subrotinas no retornam parmetros. Em Visual Basic as funes e subrotinas so declaradas de maneira quase idntica. Sintaxe [Static][Private][Public] Function Nome_Funo[(Lista Argumentos)] [As Tipo] [Bloco de Declaraes] [Nome_Funo = expresso] [Exit Function] [Bloco de Declaraes] [Nome_Funo = expresso] End Function

[Static][Private][Public] Sub Nome_Sub[(Lista Argumentos)] [As Tipo] [Bloco de Declaraes] [Exit Sub] [Bloco de Declaraes] End Sub

As funes e subrotinas possuem as seguintes partes: Static: Indica que as variveis locais da procedure so preservadas entre as chamadas. As variveis declaradas fora da procedure no so afetadas pelo atributo Static, mesmo que sejam acessadas pela procedure. Private: Indica que a funo ou subrotina acessvel apenas por funes ou subrotinas do mesmo mdulo em que foi escrita. Public: Indica que a funo ou subrotina acessvel por todas funes ou subrotinas no importando o escopo em que foi escrita. Function/Sub: Marca o incio da funo / subrotina NomeFuno / NomeSub: Nome da funo/subrotina. No devem ter o mesmo nome de palavras reservadas, funes ou subrotinas j declaradas. Pode-se evitar conflitos com procedures de outros mdulos utilizando a palavra Private (desde que o nome no coincida com o de outra funo, subrotina ou varivel do mdulo onde est sendo declarada).

25

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Lista Argumentos: Lista de variveis, com os argumentos que so passados quando a funo ou subrotina chamada. A passagem de mltiplas variveis feita separando-as por vrgula. Os argumentos so passados de duas formas: por referncia(default) ou por valor. Na passagem por referncia passado um ponteiro do tipo far (32 bits). Na passagem por valor, passado o valor da prpria varivel. A palavra chave ByVal que faz com que o argumento seja passado por valor. O argumento Lista Argumentos tem a seguinte sintaxe: [ByVal]varivel[()] [As Type] [,[ByVal]varivel[()] [As Tipo]]... ByVal: Palavra reservada, indica que o tipo de passagem do argumento por valor. Varivel: Nome da varivel que representa o argumento. As Tipo: Define o tipo da varivel retornada pela funo. Pode ser utilizado o caracter de sufixo (#,$,%,etc...) BlocoDeDeclaraes: Qualquer grupo de declaraes executadas internamente ao corpo da funo ou subrotina. Expresso: Valor de retorno da funo. O valor retornado atribudo ao nome da funo. Se nenhum valor for atribudo funo ser sempre retornado 0 (se o tipo numrico) ou (se string) Exit Function / Sub : Provoca o encerramento imediato da funo ou subrotina. End Function / Sub: Marca o final da procedure.

6.1. ARGUMENTOS BYVAL E BYREFIndica que o argumento passado por valor e no por referncia (ByRef). Quando ByVal precede uma varivel de argumento numrico, o argumento convertido para o tipo numrico indicado em Declare (como Integer ou Long, por exemplo) antes de ser passado. Se precede uma string, o ponteiro passado para a procedure. Exemplo: Sub PesquisaFornecedor(Nome As Control, Indice As Integer) Static Fornecedor(4) As String Fornecedor(0) = "Antarctica" Fornecedor(1) = "Brahma" Fornecedor(2) = "Kaiser" Fornecedor(3) = "Skol" If TypeOf Control is LabelBox Then Nome.Caption = Fornecedor(Indice) ... End If End Sub OBS.: Como voc percebeu, a maneira default de passar parmetros no VBA sempre por referncia, j que nesse caso no necessrio a declarao explcita. Deve ser utilizado com muito cuidado, de modo a no alterar variveis acidentalmente. Por padro, utilize passagem de parmetros por valor, a menos que o outro mecanismo seja essencial.

26

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

6.2. ARGUMENTOS OPCIONAISQuando voc declara na definio de uma procedure que um parmetro opcional, o Visual Basic entende que quando o usurio fizer uma chamada a este procedimento, poder incluir ou no este argumento, sem que isto cause um erro de execuo. A maneira de declarar que um argumento opcional bastante simples. Basta incluir a palavra Optional antes do nome da varivel de memria que receber este argumento: Seguindo em nosso exemplo, a procedure CalculaMenorDez deve ter seus argumentos declarados da seguinte forma: Function CalculaMenorDez( Optional Valor, Optional Data) As Single Note que quando voc utilizar a opo optional para um argumento, todos os demais argumentos subseqentes devero ser opcionais tambm. Neste caso, voc dever incluir a palavra Optional na frente de cada um dos argumentos declarados em sua procedure. Para completarmos nosso exemplo vamos contar com a ajuda de uma nova funo, a IsMissing.

6.2.1. TESTANDO ARGUMENTOS NO PASSADOSEsta funo IsMissing opera de uma forma bastante simples, retornando um valor lgico True ou False, indicando se o argumento opcional foi passado ou no ao procedimento. Se o valor de retorno for True (IsMissing=True - Est faltando = Verdadeiro) o argumento no foi passado. Analogamente a resposta False indica que o procedimento recebeu o parmetro indicado. A sintaxe desta funo : IsMissing(Nome do Argumento) Onde o Nome do Argumento o nome da varivel declarada como opcional na definio da procedure, como Valor ou Data em nosso exemplo. Exemplo: Function CalculaMenorDez(Optional Valor, Optional Data) As Single If IsMissing(Valor) Then MsgBox("No recebi o parmetro Valor.") Else ValorSeguro = Valor * 1.01 Valor = ValorSeguro + 1 If IsMissing(Data) Then MsgBox("No recebi o parmetro Data.") Else MsgBox("OK. Recebi os parmetros.") End If CalculaMenorDez=Valor End If End Function

27

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

7. UTILIZAO DE OBJETOS DO ACCESS 7.1. OBJETO DOCMDVoc pode utilizar os mtodos do objeto DoCmd para executar aes do Microsoft Access a partir do Visual Basic para Aplicativos. Uma ao pode realizar tarefas como fechar janelas, abrir formulrios e definir o valor de controles. Este objeto pode executar todas as aes de macros disponveis e ainda o mtodo RunCommand que permite ativar qualquer uma das opes dos menus disponveis dentro do Access. Sintaxe: [Application.]DoCmd.Nome_Metodo [arg1, arg2, ...] Exemplo: Docmd.OpenForm "frmFuncionarios", acNormal Docmd.OpenReport "rptPedidos", acViewPreview A maioria dos mtodos deste objeto tm argumentos obrigatrios, e outros so opcionais. Se voc omitir os argumentos opcionais, eles assumiro os valores padro do mtodo. Por exemplo, o mtodo OpenForm utiliza sete argumentos, mas somente o primeiro argumento, o nome do formulrio, obrigatrio. O exemplo abaixo mostra como voc pode abrir o formulrio frmFuncionarios e somente exibir os funcionrios com o cargo de "Representante de Vendas". DoCmd.OpenForm "Funcionarios", , ,"[Cargo] = 'Representante de Vendas'"

7.2. OBJETO SCREENO objeto Screen se refere a determinado formulrio, relatrio ou controle, que tem atualmente o foco. Voc pode, por exemplo, utilizar o objeto Screen com a propriedade ActiveForm para referir-se ao formulrio na janela ativa sem conhecer o nome do formulrio. O exemplo abaixo exibe o nome do formulrio que est na janela ativa. MsgBox Screen.ActiveForm.Name O exemplo a seguir utiliza o objeto Screen para imprimir o nome do formulrio que est na janela ativa e o nome do controle ativo nesse formulrio. Dim frm As Form Dim ctl As Control ' Retorna objeto Form apontando para o formulrio ativo. Set frm = Screen.ActiveForm MsgBox frm.Nome & " o formulrio que tem o foco ativo." ' Retorna objeto Control apontando para o controle ativo. Set ctl = Screen.ActiveControl MsgBox ctl.Nome & " o controle que tem o foco ativo neste formulrio." Este objeto no torna ativo um formulrio, relatrio ou controle. Para tornlo ativo um formulrio, relatrio ou controle, voc deve utilizar o mtodo SelectObject do objeto DoCmd. O Access retorna um erro em tempo de execuo caso no encontre nenhum objeto ativo. Voc pode utilizar a propriedade ActiveForm juntamente com o objeto Screen para identificar ou referir-se ao formulrio que tem o foco. Se um subformulrio tiver o foco, A propriedade ActiveForm se refere ao formulrio principal.

28

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

8. TRATAMENTO DE ERROSNenhum programa a prova de erros. Logo, quando isto acontece, faz com que o programa seja inesperadamente interrompido, e se nenhuma rotina especfica existir para tratar esta ocorrncia, o programa ser finalizado. Existem trs tipos de erros que podem acontecer em um programa: Erros de sintaxe: Ocorrem quando se digita equivocadamente um comando, propriedade, o nome de um controle ou um mtodo do VBA. O compilador da linguagem identifica o erro e marca o erro em vermelho. Erros de lgica: So erros que produzem resultados imprecisos ou invlidos, quando criamos um sequncia de comandos incorretas. Este tipo de erro s o desenvolvedor pode corrigir. Erros inesperados: Ocorrem de modo inesperado, ou seja, o sistema tenta executar algum comando/operao no disponvel ou impossvel. . O compilador da linguagem identifica este erro e exibe uma mensagem. Abaixo algumas dicas para no termos problemas com os erros mais comuns: Usarmos sempre a opo Option Explicit para obrigar a declarao das variveis utilizadas; Sempre escreva o procedimento ou funo em uma folha de papel para depois transferir para o mdulo, utilize-se do portugus estruturado; Comente ao mximo o seu programa; Crie sempre uma rotina de tratamento de erros em seus mdulos. Os assistentes do Access, quando criam algum controle ou procedimento do evento, j introduzem no cdigo a rotina padro de tratamento de erros.

Zera o cdigo de erro retornado Descrio do cdigo de erro retornado

Valor do cdigo do erro retornado

Figura 16 - Mtodo Err (Erro)

29

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Existem trs instrues para gerenciarmos o erro: On Error GoTo nmero_da_linha | rtulo - Desvia o controle do programa para uma determinada linha ou um rtulo do seu cdigo. As instrues subsequentes ao ponto onde ocorreu o erro ficam interrompidas de executar at que a rotina de tratamento de erro determine o que fazer. On Error Resume Next - Sempre que ocorre um erro, aquela insturo no ser executada, e o programa continua a partir da prxima linha de comando, ou seja, no interrompe a execuo mesmo que temporariamente. On Erro GoTo 0 - Este comando desabilita o tratamento de erro gerenciado pela instruo On Error. Portanto, cuidado ao utilizar esta instruo! Sempre que ocorrer um erro o sistema gera um cdigo de erro, retornado atravs do objeto Err. Esta instruo tambm retorna a descrio da mensagem do erro provocado. Se o seu programa no gerar erro o objeto Err retornar o valor zero(0). J se ocorrer um erro o objeto Err atualiza as suas propriedades em tempo de execuo. Esta instruo contm informaes sobre os erros gerados e suas propriedades tm valores somente enquanto o tratamento de erros no desativado, seja por um Resume, seja pela finalizao do procedimento. Se voc desejar gerar um erro especfico, use os mtodos Clear e Raise, para esvaziar os valores atuais das propriedades e gerar um novo tipo de erro. Voc obtm informaes completas sobre o erro gerado inspecionando os valores das propriedades Number e Description do objeto. Sempre que necessrio, voc pode inspecionar a propriedade Number e, de posse do cdigo do erro, efetuar um tratamento especfico para cada caso. A propriedade Description extremamente til para o programador, pois evita que, em todos os pontos do programa, seja necessrio criar cdigo para exibir uma mensagem padro, porm deve-se levar em conta que a mensagem ser sempre exibida em ingls.

Esquematizando:Start On Error GoTo Label_X Ao 1 (Error) Resume Ao 2 Label_X: Error Handler Resume Resume Next

Ret_Erro:

Ao 3

End

30

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Abaixo a janela de cdigo onde podemos inspecionar o contedo de variveis, executar o procedimento passo a passo, ativar pontos de interrupo, exibir a janela iemdiata, entre outras:

Inserindo um ponto de interrupo.

Este menu de atalho mostrado quando se clica com o boto direito do mouse em qualquer lugar da rea de cdigo.Figura 17 - Depurando o cdigo

Se selecionarmos a varivel e posicionarmos o cursor sobre ela o VBA exibe uma legenda com o seu contedo atual, como mostra a figura acima, quando selecionamos o campo da tabela chamado "Valor Contratado" ele igual a 706293,9.

Na janela imediata ou depurar voc pode inspecionar o valor de qualquer varivel de sistema, do objeto ativo. Voc pode, em tempo de execuo, alterar o valor de uma varivel para realizar um teste ou alguma correo. 31

Figura 18 - Janela Imediata

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Existe uma funo MsgBox que serve para mostrar ao usurio uma mensagem de erro ou de aviso. Ela mostra a mensagem em uma caixa de dilogo; aguarda o usurio escolher um boto e retorna um valor indicando qual boto foi clicado pelo usurio. Esta funo possui 5 argumentos. O primeiro o prprio texto da mensagem que se quer exibir. O segundo o tipo de boto e o cone que se quer exibir. O terceiro o texto da barra de ttulo da janela da mensagem. O quarto o arquivo de ajuda associado mensagem de erro ou aviso. E o quinto argumento o contexto da ajuda dentro do arquivo. Sua sintaxe : MsgBox (prompt [, buttons ] [,title] [,helpfile, context]) Onde: Prompt: A mensagem que ser mostrada na janela de dilogo. O tamanho mximo de aproximadamente 1024 caracteres, dependendo da largura do caracter que est sendo usado. Voc pode separ-lo em vrias linhas usando caractere de retorno de carro Chr(13), ou um caracter nova linha Chr(10), ou uma combinao dos dois (Chr(13) & Chr(10)); Buttons: Uma soma de valores especificando o nmero e o tipo de botes que sero apresentados, o estilo do cone a ser usado, ou identificar o boto default. Se omitido, o valor default para os botes 0. Title: String que representa o ttulo da janela de dilogo. HelpFile: String que identifica o nome do arquivo de help a ser utilizado. Se Helpfile no for fornecido, o prximo argumento context tambm no dever ser. Context: Expresso numrica que indica qual o contexto de help dever ser apresentado.

Figura 19 - Comando MessageBox

32

ACCESS 2000 PROGRAMAO EM VBA Abaixo os valores vlidos para o argumento Buttons: Valor do boto vbOKOnly vbOkCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbdefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 vbApplicationModal vbSystemModal

SENAC-RS

O que ir mostrar Mostra apenas o boto OK. Mostra os botes Ok e Cancelar. Mostra os botes Abort, Retry e Ignore. Mostra os botes Yes, No e Cancel. Mostra os botes Yes e No. Mostra os botes Retry e Cancel. Exibe o cone Mensagem crtica. Exibe o cone Consulta de aviso. Exibe o cone Mensagem de aviso. Exibe o cone Mensagem de informao. O primeiro boto o padro. O segundo boto o padro. O terceiro boto o padro. O quarto boto o padro. Janela restrita do aplicativo; o usurio deve responder caixa de mensagem antes de continuar o trabalho no aplicativo atual. Janela restrita do sistema; todos os aplicativos so suspensos at que o usurio responda caixa de mensagem.Tabela 7 - Constantes do Boto

Exemplo: On Error GoTo Rotina_Erro ... ... ... Voc pode combinar cones e botes somando o valor das constantes.

Rotina_Erro: Select Case Err.Number Case 3022 MsgBox "Violao de Chave!", _ vbOKOnly + vbCritical, "Mensagem de Erro" Case 3314 MsgBox "Campo requerido no preenchido!", _ vbOKOnly + vbQuestion, "Mensagem de Aviso" Case Else MsgBox Err.Description End Select

33

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Figura 20 - Funo MessageBox

Abaixo os valores das constantes que esta funo pode retornar: CONSTANTE vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo VALOR 1 2 3 4 5 6 7 DESCRIO pressionado foi o pressionado foi o pressionado foi o pressionado foi o pressionado foi o pressionado foi o pressionado foi o

O O O O O O O

boto boto boto boto boto boto boto

OK. Cancelar. Abortar. Repetir. Ignorar. Sim. No.

Tabela 8 - Constantes da Funo

34

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

9. LINGUAGEM SQL a linguagem mais utilizada no gerenciamento de banco de dados. A Linguagem Estruturada de Consulta (Structured Query Language) uma liguagem de aplicao para banco de dados relacionais. Atravs da instruo SQL que o banco de dados retorna ou executa a ao sobre o conjunto de registros. Os comandos so, basicamente, divididos em linguagem de definio de dados (DDL) e linguagem de manipulao de dados (DML). Se voc quiser se aprimorar mais neste vasto conceito da linguagem SQL utilize o arquivo de help do prprio produto Access 2000, que o mecanisno do Jet Engine 3.5, que est no diretrio C:\Windows\System\JetSql35.hlp. Ex.: SELECT MAX([Preco]) AS [Maior_Preco] FROM Pedidos WHERE [Cod_Categoria] ="001" AND [Cidade] LIKE "Porto*" ORDER BY [Data_Pedido] Palavras-chaves: Comandos: Qualificadores: Clusulas: Operadores: Funes agregadas: SELECT ...FROM WHERE ORDER BY =, >, , LIKE ... MAX, MIN, COUNT...

9.1. LINGUAGEM DE MANIPULAO DE DADOSSo comandos que servem para recuperao dos dados, acrescentar, remover e atualizar os registros.

9.1.1. CONSULTA SELEOPara executar esta operao, o mecanismo de banco de dados procura a tabela ou tabelas especificadas, extrai as colunas escolhidas, seleciona as linhas que atendem aos critrios e classifica ou agrupa as linhas resultantes na ordem especificada. Voc pode utilizar um asterisco (*) para selecionar todos os campos em uma tabela. Se um nome de campo for includo em mais de uma tabela na clusula FROM, coloque antes dele o nome da tabela e o operador . (ponto). Se desejar um nome de campo diferente ou um nome no for sugerido pela expresso utilizada para gerar o campo, utilize a palavra reservada AS. Sintaxe: SELECT [atributo] { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]} FROM expressodetabela [, ...] [IN bancodedadosexterno] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] [WITH OWNERACCESS OPTION]

35

ACCESS 2000 PROGRAMAO EM VBA Exemplos: SELECT * FROM Funcionrios;

SENAC-RS

SELECT Funcionrios.Departamento, Supervisores.SupvNome FROM Funcionrios INNER JOIN Supervisores WHERE Funcionrios.Departamento = Supervisores.Departamento; SELECT DataDeNascimento AS Nascimento FROM Funcionrios; SELECT COUNT(CdigoDoFuncionrio) AS ContagemDePessoas FROM Funcionrios;

9.1.2. CONSULTA CRIAR TABELAVoc pode utilizar consultas criar tabela para arquivar registros, fazer cpias de backup das tabelas ou fazer cpias para exportar para um outro banco de dados, ou para usar como base para relatrios que exibem dados sobre um determinado perodo de tempo. Por exemplo, voc poderia produzir um relatrio de Vendas Mensais por Regio, executando a mesma consulta criar tabela todos os meses. Convm definir uma chave primria para a nova tabela. Quando voc cria a tabela, os campos na nova tabela herdam o tipo de dados e tamanho de campo de cada campo das tabelas base da consulta, mas nenhuma outra propriedade do campo ou da tabela transferida. Isso servir para no permitir a duplicao de registros quando da utilizao de uma nova consulta para acrescentar registros. Sintaxe: SELECT campo1[, campo2[, ...]] INTO novatabela [IN bancodedadosexterno] FROM origem Exemplos: SELECT Funcionrios.* INTO [Backup Func] FROM Funcionrios;

9.1.3. CONSULTA ACRSCIMOVoc pode usar esta consulta para adicionar registros a uma tabela. Nesse caso, o cdigo especifica o nome e o valor de cada campo do registro. Voc deve especificar cada um dos campos do registro ao qual ser atribudo um valor e um valor para aquele campo. Quando voc no especifica os campos, o valor padro ou Null inserido para colunas ausentes. Os registros so adicionados ao fim da tabela. Se a tabela de destino contiver uma chave primria, certifique-se de acrescentar valores exclusivos no-Null ao campo ou campos da chave primria; se no o fizer, o mecanismo de banco de dados no acrescentar os registros. Se voc acrescentar os registros a uma tabela com um campo AutoNumerao e quiser renumerar os registros acrescentados, no inclua esse campo. Inclua o campo AutoNumerao na consulta se quiser conservar os valores originais do campo.

36

ACCESS 2000 PROGRAMAO EM VBA Sintaxe:

SENAC-RS

INSERT INTO destino [IN bancodedadosexterno] [(campo1[, campo2[, ...]])] SELECT [origem.]campo1[, campo2[, ...] FROM expressodetabela INSERT INTO destino [(campo1[, campo2[, ...]])] VALUES (valor1[, valor2[, ...]) Exemplos: INSERT INTO Funcionrios (Nome,Sobrenome, Cargo) VALUES ('Pedro', 'Silva', 'Estagirio');

9.1.4. CONSULTA ATUALIZAOCria uma consulta que altera valores de campos em uma tabela especificada, com base em critrios especificados. Ela no gera um conjunto de resultados. Alm disso, depois de atualizar os registros usando uma consulta de atualizao, voc no poder desfazer a operao. Mantenha sempre cpias de backup dos dados. Se voc atualizar os registros errados, poder recuper-los a partir das cpias. Sintaxe: UPDATE tabela SET novovalor WHERE critrios; Exemplos: UPDATE Pedidos SET QuantiaDoPedido = QuantiaDoPedido * 1.1, Frete = Frete * 1.03 WHERE PasDeDestino = 'UK';

9.1.5. CONSULTA EXCLUSOCria uma consulta que remove os registros de uma ou mais tabelas relacionadas. No te a diferena entre excluir a tabela e os registros, se voc excluir a tabela a estrutura ser perdida. Em contrapartida, quando voc deleta os registros, somente os dados so excludos; a estrutura da tabela e todas as suas propriedades, como atributos de campo e ndices, permanecem intactos. A consulta excluso exclui registros inteiros, no somente os dados em campos especficos. Se voc quiser excluir valores de um campo especfico, crie uma consulta atualizao que altere os valores para Null. Depois de remover os registros utilizando uma consulta excluso, voc no poder desfazer a operao. Mantenha sempre cpias de backup dos dados. Assim, se voc excluir os registros errados, poder recuper-los a partir das cpias. Sintaxe: DELETE [tabela.*] FROM tabela WHERE critrios; Exemplos: DELETE * FROM Funcionrios WHERE Cargo = 'Estagirio';

37

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

9.1.6. CONSULTA UNIOCria uma consulta que combina os resultados de duas ou mais consultas ou tabelas independentes. Voc pode mesclar os resultados de duas ou mais consultas, tabelas e instrues SELECT, em qualquer combinao, em uma nica operao UNION. Como padro, nenhum registro duplicado retornado quando voc usa uma operao UNION; entretanto, voc pode incluir o atributo ALL para assegurar que todos os registros sejam retornados. Isso faz com que a execuo da consulta seja mais rpida. Todas as consultas em uma operao UNION devem solicitar o mesmo nmero de campos; contudo, os campos no devero ter o mesmo tamanho ou tipo de dados. Use apelidos somente na primeira instruo SELECT pois eles so ignorados em qualquer outra. Sintaxe: [TABLE] consulta1 UNION [ALL] [TABLE] consulta2 [UNION [ALL] [TABLE] consultan [... ]] Exemplo: TABLE [Novas Contas] UNION ALL SELECT * FROM Clientes WHERE QuantidadeDoPedido > 1000;

9.1.7. DECLARAO PARAMETERSVoc pode utilizar uma declarao PARAMETERS para criar uma consulta parmetro. Uma consulta parmetro pode ajudar a automatizar o processo de alterao dos critrios da consulta. Em uma consulta parmetro, o cdigo precisar fornecer os parmetros a cada vez que a consulta for executada. A declarao PARAMETERS opcional, se a declarao incluir mais de um parmetro, separe-os com vrgulas. O exemplo a seguir inclui dois parmetros: Sintaxe: PARAMETERS [Preo baixo] Currency, [Data inicial] DateTime; Voc pode usar nome, mas no tipo de dados em uma clusula WHERE ou HAVING. O exemplo a seguir espera que dois parmetros sejam fornecidos e, ento, aplica os critrios aos registros na tabela Pedidos: PARAMETERS [Preo baixo] Currency, [Data inicial] DateTime; SELECT NmeroDoPedido, QuantiaDoPedido FROM Pedidos WHERE QuantiaDoPedido > [Preo baixo] AND DataDoPedido >= [Data inicial];

38

ACCESS 2000 PROGRAMAO EM VBA Sintaxe: PARAMETERS nome tipodedados [, nome tipodedados [, ...]] Exemplo: PARAMETERS [Cargo do Funcionrio] Text SELECT Sobrenome, Nome, CdigoDoFuncionrio FROM Funcionrios WHERE Cargo =[Cargo do Funcionrio];

SENAC-RS

9.1.8. OPERADOR "INNER JOIN"Combina registros de duas tabelas correspondentes em um campo comum a ambas. Sintaxe: ... FROM tabela1 tabela2.campo2 Exemplo: SELECT DISTINCTROW (Nome & Chr(32) & Sobrenome) AS NomeCompleto FROM Funcionrios INNER Pedidos ON Pedidos.CdigoDoFuncionrio Funcionrios.CdigoDoFuncionrio GROUP BY (Nome & Chr(32) & Sobrenome); INNER JOIN tabela2 ON tabela1.campo1 opercomp sempre que houver valores

=

9.1.9. OPERADORES "LEFT JOIN" ou "RIGHT JOIN"Combina registros da tabela de origem quando usados em qualquer clusula FROM. Utilize uma operao LEFT JOIN para criar uma associao externa esquerda. As associaes externas esquerda incluem todos os registros da primeira (esquerda) de duas tabelas, mesmo que no haja valores correspondentes para os registros na segunda tabela (direita). Utilize uma operao RIGHT JOIN para criar uma associao externa direita. As associaes externas direita incluem todos os registros da segunda (direita) de duas tabelas, mesmo que no haja valores correspondentes para registros na primeira (esquerda) tabela. Sintaxe: ... FROM tabela1 [ LEFT | RIGHT ] JOIN tabela2 ON tabela1.campo1 opercomp tabela2.campo2 Exemplo: SELECT [Nome do Departamento], Nome & Chr(32) & Sobrenome AS Name FROM Departamentos LEFT JOIN Funcionrios ON Departamentos.[Cdigo Do Departamento] = Funcionrios.[Cdigo Do Departamento] ORDER BY [Nome do Departamento];

39

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

9.2. LINGUAGEM DE DEFINIO DE DADOSSo comandos que servem para definir a estrutura de tabelas, modificar as tabelas, alm de criar e excluir ndices

9.2.1. INSTRUO CREATE TABLEUse esta instruo para definir uma nova tabela e seus campos e restries de campo. Se NOT NULL for especificado para um campo, ento necessrio que os novos registros tenham dados vlidos naquele campo. Uma clusula CONSTRAINT estabelece vrias restries em um campo e pode ser utilizada para estabelecer a chave primria. Voc tambm pode utilizar a instruo CREATE INDEX para criar uma chave primria ou ndices adicionais em tabelas existentes. Voc pode utilizar NOT NULL em um campo nico ou dentro de uma clusula CONSTRAINT nomeada que se aplica a uma CONSTRAINT nomeada de campo nico ou de campos mltiplos. Contudo, voc pode aplicar a restrio NOT NULL somente uma vez a um campo, ou ocorrer um erro em tempo de execuo. Sintaxe: CREATE TABLE tabela (campo1 tipo [(tamanho)] [NOT NULL] [ndice1] [, campo2 tipo [(tamanho)] [NOT NULL] [ ndice2] [, ...]] [, CONSTRAINT ndicedemulticampos [, ...]]) Exemplo: CREATE TABLE EstaTabela (Nome TEXT, Sobrenome TEXT);

9.2.2. INSTRUO CREATE INDEXPara proibir valores duplicados no campo ou campos indexados de diferentes registros, use a palavra reservada UNIQUE. Na clusula WITH opcional, voc pode impor regras de validao de dados. Voc pode: Proibir entradas Null no campo ou campos indexados dos novos registros, utilizando a opo DISALLOW NULL. Impedir que registros com valores Null no campo ou campos indexados sejam includos no ndice utilizando a opo IGNORE NULL. Designar o campo ou campos indexados como a chave primria utilizando a palavra reservada PRIMARY. Isto significa que a chave exclusiva e, portanto, voc pode omitir a palavra reservada UNIQUE. Observao No use a palavra reservada PRIMARY ao criar um novo ndice numa tabela que j tenha uma chave primria; se voc o fizer, ocorrer um erro. Sintaxe: CREATE [ UNIQUE ] INDEX ndice ON tabela (campo [ASC|DESC][, campo [ASC|DESC], ...]) [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }] Exemplo: CREATE INDEX Novondice ON Funcionrios " _ & "(TelefoneResidencial, Ramal);"

40

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

9.2.3. INSTRUO DROP TABLE ou DROP INDEXExclui uma tabela existente de um banco de dados ou exclui um ndice existente de uma tabela. Voc deve fechar a tabela para poder exclu-la ou remover um ndice dela. Sintaxe: DROP {TABLE tabela | INDEX ndice ON tabela} Exemplo: DROP INDEX Novondice ON Funcionrios; DROP TABLE Funcionrios;"

9.2.4. INSTRUO ALTER TABLEModifica a estrutura de uma tabela depois de ter sido criada com a instruo CREATE TABLE. Atravs da instruo ALTER TABLE, voc pode alterar uma tabela existente de diversas maneiras. Voc pode: Utilizar ADD COLUMN para adicionar um novo campo tabela. Voc especifica o nome do campo, tipo de dados e (para campos Texto e Binrio) um tamanho opcional. Voc tambm pode definir um ndice no campo. Se voc especificar NOT NULL para um campo, ento os novos registros devero ter dados vlidos naquele campo. Utilizar ADD CONSTRAINT para adicionar um ndice de campos mltiplos. Utilizar DROP COLUMN para excluir um campo. Voc especifica somente o nome do campo. Utilizar DROP CONSTRAINT para excluir um ndice de campos mltiplos. Voc especifica somente o nome do ndice aps a palavra reservada CONSTRAINT. Sintaxe: ALTER TABLE tabela {ADD {COLUMN campo tipo[(tamanho)] [CONSTRAINT ndice] | CONSTRAINT ndicedemulticampos} | DROP {COLUMN campo I CONSTRAINT nomedondice} } [NOT NULL]

Exemplo: ALTER TABLE Funcionrios ADD COLUMN Salrio CURRENCY;

41

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

9.2.5. CLUSULA CONSTRAINTUma restrio semelhante a um ndice, embora tambm possa ser utilizada para estabelecer uma relao com uma outra tabela. Voc utiliza a clusula CONSTRAINT nas instrues ALTER TABLE e CREATE TABLE para criar ou excluir restries. H dois tipos de clusulas CONSTRAINT: um para criar uma restrio em um campo nico e outro para criar uma restrio em mais de um campo. Sintaxe: Restrio de campo nico: CONSTRAINT nome {PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES tabelaexterna [(campoexterno1, campoexterno2)]} Restrio de campos mltiplos: CONSTRAINT nome {PRIMARY KEY (primria1[, primria2 [, ...]]) | UNIQUE (exclusiva1[, exclusiva2 [, ...]]) | NOT NULL (nonulo1[, nonulo2 [, ...]]) | FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES tabelaexterna [(campoexterno1 [, campoexterno2 [, ...]])]} Exemplo: CREATE TABLE MinhaTabela (Nome TEXT, Sobrenome TEXT, DataNasc DATETIME, CONSTRAINT MinhaTabelaRestrio UNIQUE (Nome, Sobrenome, DataNasc));

9.3. FUNES AGREGADASUtilizando os SQL funes agregadas, voc pode determinar vrias estatsticas em conjuntos de valores. Voc pode utilizar estas funes em uma consulta e em expresses agregadas na propriedade SQL de um objeto QueryDef ou ao criar um objeto Recordset baseado em uma consulta SQL.

9.3.1. MDIACalcula a mdia aritmtica de um conjunto de valores contido em um campo especificado em uma consulta. Sintaxe: Avg(expr)

SELECT Avg(Frete) AS [Mdia do Frete] FROM Pedidos WHERE Frete > 100;

9.3.2. CONTARCalcula o nmero de registros retornado por uma consulta. Sintaxe: Count(expr)

SELECT Count (PasDeDestino) AS [Pedidos UK] FROM Pedidos WHERE PasDeDestino = 'UK';

42

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

9.3.3. MNIMO e MXIMORetornam o mnimo ou o mximo de um conjunto de valores contido em um campo especificado em uma consulta. Sintaxe: Max(expr) Min(expr)

SELECT Min(Frete) AS [Frete Baixo], Max(Frete)AS [Frete Alto] FROM Pedidos WHERE PasDeDestino = 'UK';

9.3.4 SOMARetorna a soma de um conjunto de valores contido em um campo especificado em uma consulta. Sintaxe: Sum(expr)

SELECT Sum(PreoUnitrio*Quantidade) AS [Total de Vendas UK] FROM Pedidos INNER JOIN [Detalhes do Pedido] ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido WHERE (PasDeDestino = 'UK');

10. TCNICAS DE PESQUISA DE DADOSO Objeto de Acesso a Dados (DAO) permite que voc manipule a estrutura do seu banco de dados e os dados nele contidos atravs dos objetos Recordset. A maioria das propriedades que podem ser definidas como objetos DAO so definidas pelo mecanismo de banco de dados Microsoft Jet 3.5. A maneira mais fcil e rpida de se fazer isso criar variveis de objeto que representem os diferentes objetos com os quais voc precisa trabalhar e referir-se elas no seu cdigo. Por exemplo, o cdigo a seguir cria um novo objeto TableDef (tabela) e define sua propriedade Name com o nome da tabela: Dim dbs As Database, tdf As TableDef Set dbs = CurrentDb Set tdf = dbs.CreateTableDef tdf.Name = "Contatos" Voc pode utilizar a propriedade RecordsetClone para referir-se ao objeto Recordset de um formulrio, especificado pela propriedade RecordSource do formulrio. O RecordsetClone uma cpia da consulta ou tabela base especificada pela propriedade RecordSource do formulrio. Se um formulrio estiver baseado em uma consulta, por exemplo, referir-se propriedade RecordsetClone equivale a criar um clone de um objeto Recordset utilizando a mesma consulta. Voc deve utilizar esta propriedade para navegar ou manipular os registros de um formulrio independente do prprio formulrio.

43

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Voc pode, por exemplo, utilizar a propriedade RecordsetClone quando desejar utilizar um mtodo, tal como o mtodo FindFirst, que no pode ser utilizado com formulrios. Quando um novo objeto Recordset aberto, o seu primeiro registro o registro atual. Ao utilizar um dos mtodos Find ou Move para tornar atual qualquer outro registro do Recordset, voc deve sincronizar o registro atual do objeto Recordset com o registro atual do formulrio atribuindo o valor da propriedade DAO Bookmark propriedade Bookmark do formulrio. Voc pode utilizar a propriedade RecordCount para contar o nmero de registros em um objeto Recordset. O exemplo a seguir mostra como voc pode combinar a propriedade RecordCount e a propriedade RecordsetClone para contar os registros em um formulrio: Forms!Pedidos.RecordsetClone.MoveLast MsgBox "Este formulrio contm " _ & Forms!Pedidos.RecordsetClone.RecordCount _ & " registros.", vbInformation, "Quantidade de Registros" O prximo exemplo utiliza a propriedade RecordsetClone e o objeto Recordset para sincronizar o registro de um conjunto de registros com o registro atual do formulrio. Quando o nome de uma empresa selecionado a partir de uma caixa de combinao, o mtodo FindFirst utilizado para localizar o registro dessa empresa e a propriedade DAO Bookmark do objeto Recordset atribuda propriedade Bookmark do formulrio fazendo com que este exiba o registro encontrado. Sub Cod_Empresa_AfterUpdate() Dim rst As Recordset Dim strLocalizar As String Set rst = Me.RecordsetClone strLocalizar = Str(Me!Cod_Empresa) rst.FindFirst " Cod_Empresa = " & strLocalizar If rst.NoMatch Then MsgBox "Esta empresa no foi localizada. Tente outro cdigo." Else Me.Bookmark = rst.Bookmark End If rst.Close End Sub

44

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

10.1. MTODO FINDLocalizam o primeiro registro, o ltimo registro, o registro anterior ou o prximo registro em um objeto Recordset tipo dynaset ou snapshot que satisfaa aos critrios especificados e torna esse registro o registro. Sintaxe: Um String usado para localizar o registro. como a clusula WHERE em uma instruo SQL, mas sem a palavra WHERE.

conjuntoderegistros.{FindFirst | FindLast | FindNext | FindPrevious} critrios Uma varivel de objeto que representa um objeto Recordset tipo dynaset ou snapshot existente. Se voc quiser incluir todos os registros na sua pesquisa - no apenas os que atendam a uma condio especfica - use o mtodo Move para se mover de registro para registro. Para localizar o registro em um Recordset tipo table, use o mtodo Seek. Se um registro que satisfaa aos critrios no for localizado, o ponteiro do registro atual ser desconhecido e a propriedade NoMatch definida como True. Se conjuntoderegistros contiver mais de um registro que satisfaa aos critrios, FindFirst localizar a primeira ocorrncia, FindNext localizar a prxima ocorrncia e assim por diante. Cada um dos mtodos Find localiza o registro, ou seja: FindFirst Encontra o primeiro registro; FindLast Encontra o ltimo registro; FindNext Encontra o prximo registro; FindPrevious Encontra o registro anterior. Sempre verifique o valor da propriedade NoMatch para determinar se a operao Find encontrou o registro desejado, se sim esta propriedade ser False. Se falhar, ela ser True e o registro atual no ser mostrado. Nesse caso, voc dever posicionar o ponteiro do registro atual de volta a um registro vlido.

45

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

O exemplo a seguir cria um objeto Recordset do tipo dynaset e, ento, utiliza o mtodo FindFirst para localizar o primeiro registro que satisfaz o critrio especificado. Em seguida, o procedimento localiza os demais registros que satisfazem o critrio. Sub LocalizarRegistro() Dim dbs As Database, rst As Recordset Dim strCritrio As String ' Retorna referncia ao banco de dados atual. Set dbs = CurrentDb ' Define critrio de localizao. strCritrio = "[PasDeDestino] = 'Reino Unido' And " _ & "[DataDoPedido] >= #01/01/2001#" ' Cria um objeto Recordset do tipo dynaset com base na tabela Pedidos. Set rst = dbs.OpenRecordset("Pedidos", dbOpenDynaset) ' Localiza o primeiro registro coincidente. rst.FindFirst strCritrio ' Verifica se o registro foi localizado. If rst.NoMatch Then MsgBox "Nenhum registro foi localizado." Else ' Localiza outros registros coincidentes. Do Until rst.NoMatch Debug.Print rst!PasDeDestino; " "; rst!DataDoPedido rst.FindNext strCritrio Loop End If rst.Close Set dbs = Nothing End Sub Propriedade Bookmark Define ou retorna um indicador que identifica com exclusividade o registro atual em um objeto Recordset. Quando voc cria ou abre um objeto Recordset, cada um de seus registros j possui um indicador exclusivo. Voc pode salvar o indicador do registro atual atribuindo o valor da propriedade Bookmark a uma varivel. Para retornar rapidamente a esse registro a qualquer momento depois de se mover para um registro diferente, defina a propriedade Bookmark do objeto Recordset com o valor daquela varivel. Para criar um indicador de um registro diferente do registro atual, mova para o registro desejado e atribua o valor da propriedade Bookmark a uma varivel String que identifique o registro. Se voc usar o mtodo Clone para criar uma cpia de um objeto Recordset, as configuraes da propriedade Bookmark do original e do objeto Recordset duplicado sero idnticas e podero ser utilizadas a qualquer instante. O valor da propriedade Bookmark no o mesmo que o nmero de um registro.

46

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

A seguir um exemplo onde inserimos uma parte do nome do contato a ser encontrado. Se o nome for encontrado, a propriedade Bookmark do formulrio ser definida com a propriedade Bookmark do objeto Recordset, o que move o registro atual do formulrio para o nome encontrado. Private Sub cmdLocalizarNomeDoContato_Click() Dim rst As Recordset, strCritrio As String strCritrio = "[NomeDoContato] Like '*" & InputBox("Digite algumas das & "primeiras letras do nome a ser localizado") & "*'" Set rst = Me.RecordsetClone rst.FindFirst strCritrio If rst.NoMatch Then MsgBox "Nenhum contato foi encontrado." Else Me.Bookmark = rst.Bookmark End If End Sub

"_

10.2. MTODO SEEKLocaliza o registro em um objeto Recordset tipo table indexado que satisfaa os critrios especificados para o ndice atual e faz dele o registro atual (somente espaos de trabalho do Microsoft Jet). Sintaxe conjuntoderegistros.Seek comparao, chave1, chave2...chave13 A sintaxe do mtodo Seek possui as seguintes partes: Parte Descrio conjuntoderegistros Uma varivel de objeto que representa um objeto Recordset tipo table que possui um ndice definido como especificado pela propriedade Index do objeto Recordset. comparao Uma das seguintes expresses de seqncia: . chave1, chave2...chave13 Um ou mais valores que correspondem aos campos no ndice atual do objeto Recordset, como especificado pela configurao da sua propriedade Index. Voc pode usar at 13 argumentos chave. Comentrios Voc deve definir o ndice atual com a propriedade Index antes de usar Seek. Se o ndice identificar um campo chave no-exclusivo, Seek localizar o primeiro registro que satisfizer os critrios. O mtodo Seek pesquisa pelos campos-chave especificados e localiza o primeiro registro que satisfaz os critrios especificados por comparao e chave1. Uma vez encontrado, ele torna esse registro no registro atual e define a propriedade NoMatch como False. Se o mtodo Seek no conseguir localizar uma correspondncia, a propriedade NoMatch ser definida como True e o registro atual ficar indefinido.

47

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Se comparao for igual a (=), maior ou igual a (>=), ou maior que (>), Seek comear no incio do ndice e pesquisar para frente. Se comparao for menor que (10,"MaiorqueDez","MenorqueDez") MaiorqueDez ' Teste =

Exemplo: INPUTBOX Categoria: Finalidade: Sintaxe:

Funes de Sistema Operacional Exibe uma caixa de dilogo para que o usurio possa digitar uma resposta qualquer. Aps escolher um dos botes disponveis, o VBA retorna o valor digitado. INPUTBOX(Prompt[, Title][,Default][,Xpos][,Ypos]) Prompt - Expresso string que ser exibida como mensagem na caixa de dilogo. O comprimento mximo da mensagem de 1024 caracteres. Voc pode quebrar a mensagem em vrias linhas utilizando a combinao de caracteres de retorno de carro CHR(13) e mudana de linha CHR(10), como em (CHR(13) & CHR(10)). Title - Expresso string que ser exibida na barra de ttulo da caixa de dilogo. Se voc omitir este argumento, o nome exibido na barra de ttulo ser o nome de sua aplicao. Default - Expresso string que ser retornada como default caso o usurio no digite nenhum dado na caixa de dilogo. Se voc omitir este argumento, a textbox da caixa de dilogo ser exibida vazia. Xpos - Expresso numrica que especifica em twips a distncia horizontal entre a borda esquerda da tela e da caixa de dilogo. Se voc omitir este argumento, a caixa de dilogo ser centralizada horizontalmente. Ypos - Expresso numrica que especifica em twips a distncia vertical entre a borda superior da caixa de dilogo e o topo da tela. Se voc omitir este argumento a caixa de dilogo ser centralizada verticalmente

Onde:

86

ACCESS 2000 PROGRAMAO EM VBA INSTR Categoria: Finalidade: Sintaxe:

SENAC-RS

Onde:

Exemplo:

Funes de Manipulao de Strings Retorna a posio da primeira ocorrncia de um string dentro de outro INSTR([Incio,]String1,String2[,Compare]) Incio - Expresso numrica que indica a posio inicial de cada busca. Se omitido, a busca comea desde a primeira posio. String1 - String onde feita a procura String2 - Expresso string que est sendo procurada Compare - Especifica o tipo de comparao a ser efetuado entre as strings. Teste = InStr("Casa","as") ' Teste = 2 Teste = InStr("Casamento","t") ' Teste = 8 Teste = InStr("Casa","z") ' Teste = 0

INT Categoria: Finalidade: Sintaxe: Onde: Exemplo: ISARRAY Categoria: Finalidade: Sintaxe: Onde: Exemplo: ISDATE Categoria: Finalidade: Sintaxe: Onde: Exemplo: ISEMPTY Categoria: Finalidade: Sintaxe: Onde: Exemplo: ISMISSING Categoria: Finalidade: Sintaxe: Onde: Funes Matemticas Retorna a parte inteira de um nmero INT(Nmero) Nmero - Qualquer expresso numrica vlida. Se nmero contm Null o valor de retorno ser Null tambm. Idntico funo Fix Funes de Verificao Retorna um valor Boolean indicando se uma determinada varivel um Array. ISARRAY(Varname) Varname - Qualquer varivel de memria Dim MeuArray(2) As Integer, Nome As String Teste = IsArray(Nome) Teste = IsArray(MeuArray) ' Teste = False ' Teste = True

Funes de Verificao Retorna um valor Boolean indicando se uma determinada expresso pode ser convertida para uma data. ISDATE(Expresso) Expresso - Qualquer data ou string que possa ser reconhecida como uma data ou hora vlida dtmDado = "23/06/2001" strMens = "Hoje" Teste = IsDate(dtmDado) ' Teste = True Teste = IsDate(strMens) ' Teste = False Funes de Verificao Retorna um valor Boolean indicando se uma determinada varivel foi inicializada ou no. ISEMPTY(Expresso) Expresso - Qualquer expresso numrica ou string que possa ser reconhecida como um nome de varivel. Teste = IsEmpty(dtmDado) ' Teste = True Dado = Null Teste = IsEmpty(dtmDado) ' Teste = False Funes de Verificao Retorna um valor Boolean indicando se um argumento opcional foi passado para uma procedure ou no. ISMISSING(NomeArgumento) NomeArgumento - Nome de um argumento opcional em uma procedure. Retorna um valor True se o argumento especificado no foi

87

ACCESS 2000 PROGRAMAO EM VBA passado funo, caso contrrio a resposta ser False. Sub ProcTeste (arg1 as String, arg2 as Integer, arg3 as String) ..... If IsMissing(arg2) Then MsgBox "Este argumento obrigatrio para o clculo." End If ..... End Sub

SENAC-RS

Exemplo:

ISNULL Categoria: Finalidade: Sintaxe: Onde:

Funes de Verificao Retorna um valor Boolean indicando se uma expresso contm dados invlidos (Null). ISNULL(Expresso) Expresso - Qualquer valor numrico ou expresso string. Se a expresso avaliada tiver dados invlidos (Null) a funo resultar em True, caso contrrio o valor retornado ser False. strDado = "" Teste = IsNull(strDado) ' Teste = False strDado = Null Teste = IsNull(strDado) ' Teste = True

Exemplo: ISNUMERIC Categoria: Finalidade: Sintaxe: Onde: Exemplo: strDado = "Cem" Teste = IsNumeric(strDado) LBOUND Categoria: Finalidade: Sintaxe: Onde: Exemplo: LCASE Categoria: Finalidade: Sintaxe: Onde: Exemplo: LEFT Categoria: Finalidade: Sintaxe: Onde: Funes de Manipulao de Strings Retorna o nmero especificado de caracteres a partir do lado esquerdo de uma string. LEFT(String, Comprimento) String - Expresso string da qual os caracteres sero retornados. ' Teste = False

Funes de Verificao Retorna um valor Boolean indicando se uma determinada expresso pode ser avaliada como numrica. ISNUMERIC(Expresso) Expresso - Qualquer valor numrico ou expresso string intDado = "100" Teste = IsNumeric(intDado) ' Teste = True

Funes de Array Retorna o menor elemento da dimenso especificada de um determinado array. LBOUND(Arrayname[, Dimenso]) Arrayname - Nome da varivel array Dimenso - Nmero que indica que a dimenso do array est sendo inspecionada. Utilize 1 para a primeira dimenso, 2 para a segunda e assim por diante. Dim Dado (5 to 10) Teste = LBound(Dado,1) ' Teste = 5 Funes de Manipulao de Strings Retorna uma string convertida para letras minsculas LCASE(string) String - Qualquer expresso string vlida. Somente as letras maisculas sero convertidas para minsculas. Os demais caracteres como letras minsculas, nmeros e sinais permanecem inalterados. Dado = "CAIXA ALTA" Teste = LCase(Dado) Teste = "caixa alta"

88

ACCESS 2000 PROGRAMAO EM VBA

SENAC-RS

Comprimento - Expresso numrica indicando quantos caracteres sero retornados. Se igual a 0, uma string de tamanho zero ser retornada. Se o comprimento for maior que o nmero de caracteres da string, toda ela ser retornada. Dado = "SENAC Informtica" Teste = Left(Dado,1) ' Teste = "S" Teste = Left(Dado,6) ' Teste = "SENAC " Teste = Left(Dado,10) ' Teste = "SENAC Info" Funes de Sistema Operacional Carrega uma imagem dentro de um objeto Form object, Controle PictureBox ou controle Image LOADPICTURE([StringExpression]) StringExpression - Nome do arquivo grfico a ser carregado. Alguns formatos de