120387983 programando em vba

96
 1 Sumário 1. ORIENTAÇÃO A EVENTOS...............................................................................................................2  1.1. ORDEM DE EXECUÇÃO DOS EVENTOS....................................................................................3  2. NORMAS DE NOMENCLATURA......................................................................................................5  2.1. JANELA DE CÓDIGO ..................................................................................................................... 6  3. VARIÁVEIS............................................................................................................................................7  3.1. DECLARAÇÃO DE VARIÁVEIS...................................................................................................7  3.2. OPERADORES...............................................................................................................................11  3.2.4. PRECEDÊNCIAS ........................................................................................................................ 11  4. ESTRUTURAS DE PROGRAMAÇÃO.............................................................................................12  4.1. COMANDOS CONDICIONAIS .................................................................................................... 12  4.2. COMANDOS DE LAÇ OS CONDICIONAIS ................................................................................ 13  5.1. ACESSO RANDÔMICO ................................................................................................................ 15  5.2. ACESSO SEQUENCIAL................................................................................................................18  5.3. ACESSO BINÁRIO........................................................................................................................20  6. PROCEDIMENTOS - FUNÇÕES E SUBROTINAS........................................................................25  6.1. ARG UMENTOS BYVAL E BYREF ............................................................................................. 26  6.2. ARGUMENTOS OPCIONAIS ....................................................................................................... 27  7. UTILIZAÇÃO 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 MANIPULAÇÃO DE DADOS ....................................................................... 35  9.2.1. INSTRUÇÃO CREATE TABLE.................................................................................................40  9.2.2. INSTRUÇÃO CREATE INDEX ................................................................................................. 40  9.2.3. INSTRUÇÃO DROP TABLE OU DROP INDEX ....................................................................... 41  9.2.4. INSTRUÇÃO ALTER TABLE....................................................................................................41  9.2.5. CLÁUSULA CONSTRAINT.......................................................................................................42  9.3. FUNÇÕES AGREGADAS ............................................................................................................. 42  10. TÉCNICAS DE PESQUISA DE DADOS.........................................................................................43  10.1. MÉTODO FIND............................................................................................................................45  10.2. MÉTODO SEEK...........................................................................................................................47  11. INTEGRANDO COM O OFFICE 2000...........................................................................................50  11.1 FUNÇÕES CREATEOBJECT E GETOBJ ECT ............................................................................ 51  11.2. INSTANCIANDO O MICROSOFT WORD ................................................................................ 52  11.3. INSTANCIANDO O MICROSOFT EXCEL................................................................................53  11.4. INSTANCIANDO O MICROSOFT ACCESS ............................................................................. 55  12. EXERCÍCIOS PROPOSTOS............................................................................................................57  ANEXO 1 ........................................................... ....................................................................................... 59  ANEXO 2 ........................................................... ....................................................................................... 73  

Upload: ptalvaro

Post on 15-Oct-2015

437 views

Category:

Documents


19 download

TRANSCRIPT

  • 1

    Sumrio

    1. 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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    2

    1. ORIENTAO A EVENTOS

    Um 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 Propriedade do Evento Activate Ao Ativar AfterDelConfirm Aps Confirmar Excluso AfterInsert Aps Inserir AfterUpdate Aps Atualizar ApplyFilter Ao Aplicar Filtro BeforeDelConfirm Antes De Confirmar Excluso BeforeInsert Antes De Inserir BeforeUpdate Antes De Atualizar Change Ao Alterar Click Ao Clicar Close Ao Fechar Current No Atual DblClick Ao Clicar Duas Vezes Deactivate Ao Desativar Delete Ao Excluir Enter Ao Entrar Error Ao Ocorrer Erro Exit Ao Sair Filter Ao Filtrar Format Ao Formatar GotFocus Ao Receber Foco Initialize nenhuma ItemAdded nenhuma ItemRemoved nenhuma KeyDown Ao Apertar Tecla KeyPress Ao Pressionar Tecla KeyUp Ao Liberar Tecla Load Ao Carregar LostFocus Ao Perder Foco MouseDown Ao Apertar Mouse MouseMove Ao Mover Mouse MouseUp Ao Liberar Mouse NoData Se Nenhum Dado NotInList Se No Estiver Na Lista Open Ao Abrir Page Na Pgina Print Ao Imprimir Resize Ao Redimensionar

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    3

    Evento Propriedade do Evento Retreat Ao Retirar Terminate nenhuma Timer No Cronmetro Unload Ao Descarregar Updated Ao Atualizar

    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 EVENTOS

    Movendo o foco para um controle:

    Enter (Ao entrar) GotFocus (Ao receber foco) Abrindo um formulrio:

    Open (Ao abrir) Activate (Ao ativar) Current (No atual) Enter (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) Enter (Ao entrar) GotFocus (Ao receber foco) Fechando um formulrio:

    Exit (Ao sair) LostFocus (Ao perder foco) Unload (Ao descarregar) Deactivate (Ao desativar) Close (Ao fechar)

    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) AfterUpdate (Depois de atualizar)

    Pressionando uma tecla em uma caixa de texto:

    KeyDown (Ao apertar tecla) KeyPress (Ao pressionar tecla) Change (Ao alterar) KeyUp (Ao liberar tecla)

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    4

    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) Resize (Ao redimensionar) Activate (Ao ativar) Current (No atual)

    Fechando um formulrio:

    Unload (Ao descarregar) 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) Print (Ao imprimir) Close (Ao fechar) Deactivate (Ao desativar)

    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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    5

    2. NORMAS DE NOMENCLATURA

    Voc 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 TIPO DE OBJETO s Varivel local esttica l Varivel local ao mdulo g Varivel global ou pblica a Matriz (array) i ndice de matriz ou coleo

    Tabela 2 - Prefixos para variveis

    MARCA TIPO DE VARIVEL byt Byte f Boolean

    int Integer lng Long sng Single dbl Double cur Currency dtm Date obj Object str String var Variant

    Tabela 3 - Marcas para variveis

    MARCA TIPO DE CONTROLE app Application chk Check Box cbo Combo Box cmd Command Button ctl Control Collection ocx Control Customized frm Form img Image Control lbl Label lst List Box

    bas/mdl Module opt Option Button

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    6

    MARCA TIPO DE CONTROLE rpt Report txt Text Box

    Tabela 4 - Marcas para controles e objetos

    MARCA TIPO DE SUFIXO Min O menor elemento retornado First O primeiro elemento retornado Last O ltimo elemento retornado Lim O limite superior dos elementos utilizados Max O maior elemento retornado Cnt Para campos do tipo Autonumerao

    Tabela 5 - Marcas para sufixos

    2.1. JANELA DE CDIGO

    Figura 2 - Janela de Cdigo do VBA

    rea de cdigo ondeescrevemos os comandos emVBA.

    Seleciona o objetodesejado Seleciona o procedimento,

    mtodo ou evento doobjeto.

    Exibe ajanela depurar

    Exibe oexplorador deobjetos

    Exibe a janelade inspeo devariveis

    Ativa/Desativa pontos deinterrupp

    Inicia, pra ouredefine a execuodo cdigo

    Insere mduloou procedimento na rea decdigo

    Visualiza somente um outodos procedimentos dajanela

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    7

    3. VARIVEIS

    3.1. DECLARAO DE VARIVEIS

    A 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: 9 Comece o nome com uma letra, aps pode conter letras e/ou nmeros; 9 O nome deve conter apenas letras, nmeros e o caracter underscore

    (sublinhado). Caracteres de pontuao, acentuao e espaos no devem ser utilizados;

    9 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 DESCRIO LIMITE

    Byte 1 byte 0 a 255 Boolean 2 bytes True ou False Integer Inteiro de 2 bytes -32.768 at 32.767 Long Inteiro de 4 bytes -2.147.483.648 at 2.147.483.647 Single Nmero de Ponto

    Flutuante de 4 bytes -3,402823E38 at -1,401298E-45 para valores negativos 1,401298E-45 at 3,402823E38 para valores positivos

    Double Nmero de Ponto Flutuante de 8 bytes

    -1,797693E308 a -4,940656E-324 para valores negativos; 4,940656E-324 at 1,797693E308 para valores positivos

    Currency Ponto Decimal fixo com 8 bytes

    -922.337.203.685.477,5808 at 922.337.203.685.477,5807

    Date 8 bytes 1 de janeiro de 100 at 31 de dezembro de 9999

    Object 4 bytes Qualquer referncia a Objeto String String de caracteres 1 a 65.400 aproximadamente Variant 16 a 22 bytes Qualquer tipo de dado User-defined

    Nmero Requerido Cada elemento obedece seu tipo

    Tabela 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    8

    3.1.1. DECLARAO IMPLCITA DE VARIVEIS Voc 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 VARIVEIS Para 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 :

    Figura 3 - Janela de Mdulo

    Esta instruo obriga adeclarao de variveis.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    9

    3.1.3. DECLARAO DE CONSTANTES Utilizada 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 da

    sentena TYPE, que deve ser colocada na seo de declaraes de um mdulo de cdigo. Um tipo criado pelo usurio sempre visto de forma global dentro do cdigo, apesar de que as variveis declaradas com este tipo possam ser globais ou locais as funes ou aos mdulos do formulrio.

    Abaixo criamos um tipo definido pelo usurio que guarda as informaes de 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"

    3.1.4. DECLARAO DE ARRAYS De 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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    10

    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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    11

    3.2. OPERADORES

    Como 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 utilizados para a realizao de clculos

    matemticos. Operadores de Comparao utilizados em expresses para comparar

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

    mais valores existentes.

    3.2.1. OPERADORES ARITMTICOS So 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 COMPARAO

    Estes 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 LGICOS Este 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. PRECEDNCIAS

    Quando 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:

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    12

    Operadores Aritmticos Operadores de Comparao Operadores Lgicos Imagine encontrar a seguinte expresso:

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

    4. ESTRUTURAS DE PROGRAMAO

    4.1. COMANDOS CONDICIONAIS

    As 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 Select

    7 * 3 > 16 ^ 2 And 200 / 4 = 3 * 12 1

    5

    2

    7

    3

    6

    4

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    13

    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 CONDICIONAIS

    Do ... Loop Use 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 Loop Outra 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 condio As 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 Loop Executa pelo menos uma vez Do bloco_de_comandos Loop Until condio For ... Next Esta 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 ]

    OBSERVAO: Note bem que Do Until condio

    equivalente a instruo de Do While Notcondio.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    14

    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 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 ... Next

    Permite 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 With Esta 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

    OBSERVAO: Podemos utilizar estas sadas foradas:

    Exit Do Exit For Exit Function Exit Sub

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    15

    5. MANIPULAO DE ARQUIVOS Um 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 RANDMICO

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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    16

    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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    17

    Gravando no arquivo 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    18

    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 SEQUENCIAL

    O 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]=TamanhoBuffer

    OBS.: 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    19

    Exemplo:

    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 #

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    20

    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 BINRIO

    O 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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    21

    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:

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    22

    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" ' String contm 17 caracteres Get #1, , Escola ' 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    23

    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:

    Figura 14 - Leitura de Registros (Input) 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    24

    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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    25

    6. PROCEDIMENTOS - FUNES E SUBROTINAS

    So 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

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

    [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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    26

    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 BYREF

    Indica 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    27

    6.2. ARGUMENTOS OPCIONAIS

    Quando 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 PASSADOS

    Esta 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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    28

    7. UTILIZAO DE OBJETOS DO ACCESS

    7.1. OBJETO DOCMD

    Voc 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 SCREEN

    O 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 torn-

    lo 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    29

    8. TRATAMENTO DE ERROS

    Nenhum 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.

    Figura 16 - Mtodo Err (Erro)

    Zera o cdigo de erro retornado

    Descrio do cdigo de erro retornado

    Valor do cdigo do erro retornado

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    30

    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:

    On Error GoTo Label_X

    Ao 1 (Error)

    Ao 2

    Ao 3 Ret_Erro:

    End

    Error Handler

    Label_X:

    Resume

    Resume Next

    Resume

    Start

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    31

    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:

    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.

    Figura 18 - Janela Imediata 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.

    Este menu de atalho mostrado quando seclica com o boto direito do mouse emqualquer lugar da rea de cdigo.

    Inserindo um pontode interrupo.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    32

    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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    33

    Abaixo os valores vlidos para o argumento Buttons:

    Valor do boto O que ir mostrar vbOKOnly Mostra apenas o boto OK. vbOkCancel Mostra os botes Ok e Cancelar. vbAbortRetryIgnore Mostra os botes Abort, Retry e Ignore. vbYesNoCancel Mostra os botes Yes, No e Cancel. vbYesNo Mostra os botes Yes e No. vbRetryCancel Mostra os botes Retry e Cancel. vbCritical Exibe o cone Mensagem crtica. vbQuestion Exibe o cone Consulta de aviso. vbExclamation Exibe o cone Mensagem de aviso. vbInformation Exibe o cone Mensagem de informao. vbdefaultButton1 O primeiro boto o padro. vbDefaultButton2 O segundo boto o padro. vbDefaultButton3 O terceiro boto o padro. vbDefaultButton4 O quarto boto o padro. vbApplicationModal Janela restrita do aplicativo; o usurio deve responder

    caixa de mensagem antes de continuar o trabalho no aplicativo atual.

    vbSystemModal 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 ... ... ... 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

    Voc pode combinar conese botes somando o valordas constantes.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    34

    Figura 20 - Funo MessageBox Abaixo os valores das constantes que esta funo pode retornar:

    CONSTANTE VALOR DESCRIO vbOK 1 O boto pressionado foi o OK. vbCancel 2 O boto pressionado foi o Cancelar. vbAbort 3 O boto pressionado foi o Abortar. vbRetry 4 O boto pressionado foi o Repetir. vbIgnore 5 O boto pressionado foi o Ignorar. vbYes 6 O boto pressionado foi o Sim. vbNo 7 O boto pressionado foi o No.

    Tabela 8 - Constantes da Funo

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    35

    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: SELECT ...FROM Qualificadores: WHERE Clusulas: ORDER BY Operadores: =, >, , LIKE ... Funes agregadas: MAX, MIN, COUNT...

    9.1. LINGUAGEM DE MANIPULAO DE DADOS

    So comandos que servem para recuperao dos dados, acrescentar, remover e atualizar os registros.

    9.1.1. CONSULTA SELEO Para 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]

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    36

    Exemplos: SELECT * FROM Funcionrios; 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 TABELA Voc 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 ACRSCIMO Voc 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    37

    Sintaxe: 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 ATUALIZAO Cria 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 EXCLUSO Cria 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';

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    38

    9.1.6. CONSULTA UNIO Cria 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 PARAMETERS Voc 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];

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    39

    Sintaxe: PARAMETERS nome tipodedados [, nome tipodedados [, ...]] Exemplo: PARAMETERS [Cargo do Funcionrio] Text

    SELECT Sobrenome, Nome, CdigoDoFuncionrio FROM Funcionrios WHERE Cargo =[Cargo do Funcionrio];

    9.1.8. OPERADOR "INNER JOIN" Combina registros de duas tabelas sempre que houver valores

    correspondentes em um campo comum a ambas. Sintaxe: ... FROM tabela1 INNER JOIN tabela2 ON tabela1.campo1 opercomp 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);

    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];

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    40

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

    9.2.1. INSTRUO CREATE TABLE

    Use 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 INDEX

    Para 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);"

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    41

    9.2.3. INSTRUO DROP TABLE ou DROP INDEX

    Exclui 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 TABLE

    Modifica 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)] [NOT NULL]

    [CONSTRAINT ndice] | CONSTRAINT ndicedemulticampos} | DROP {COLUMN campo I CONSTRAINT nomedondice} }

    Exemplo: ALTER TABLE Funcionrios ADD COLUMN Salrio CURRENCY;

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    42

    9.2.5. CLUSULA CONSTRAINT

    Uma 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 AGREGADAS

    Utilizando 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. MDIA Calcula 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. CONTAR Calcula o nmero de registros retornado por uma consulta.

    Sintaxe: Count(expr) SELECT Count (PasDeDestino) AS [Pedidos UK]

    FROM Pedidos WHERE PasDeDestino = 'UK';

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    43

    9.3.3. MNIMO e MXIMO Retornam o mnimo ou o mximo de um conjunto de valores contido em um

    campo especificado em uma consulta. Sintaxe: Min(expr) Max(expr) SELECT Min(Frete) AS [Frete Baixo], Max(Frete)AS [Frete Alto]

    FROM Pedidos WHERE PasDeDestino = 'UK';

    9.3.4 SOMA Retorna 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 DADOS

    O 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    44

    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

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    45

    10.1. MTODO FIND

    Localizam 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: conjuntoderegistros.{FindFirst | FindLast | FindNext | FindPrevious} critrios 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.

    Uma varivel de objeto que representaum objeto Recordset tipo dynaset ousnapshot existente.

    Um String usado para localizar o registro. como aclusula WHERE em uma instruo SQL, mas sem a palavraWHERE.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    46

    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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    47

    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 SEEK

    Localiza 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.

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    48

    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 (

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    49

    O exemplo a seguir cria um novo objeto Index em uma tabela Funcionrios. O novo ndice consiste em dois campos, Sobrenome e Nome. Em seguida, o procedimento utiliza o mtodo Seek para localizar um registro especfico.

    Sub Novondice() Dim dbs As Database, tdf As TableDef, idx As Index Dim fldSobrenome As Field, fldNome As Field, rst As Recordset ' Retorna referncia ao banco de dados atual. Set dbs = CurrentDb ' Retorna referncia tabela Funcionrios. Set tdf = dbs.TableDefs!Funcionrios ' Retorna o objeto Index que aponta para o novo ndice. Set idx = tdf.CreateIndex("NomeCompleto") ' Cria e acrescenta campos de ndice. Set fldSobrenome = idx.CreateField("Sobrenome", dbText)

    Set fldNome = idx.CreateField("Nome", dbText) idx.Fields.Append fldSobrenome idx.Fields.Append fldNome ' Acrescenta objeto Index. tdf.Indexes.Append idx tdf.Indexes.Refresh ' Abre objeto Recordset do tipo table. Set rst = dbs.OpenRecordset("Funcionrios") ' Faz do novo ndice o ndice atual. rst.Index = idx.Name ' Especifica registro a ser localizado. rst.Seek "=", "Fuller", "Andrew" If rst.NoMatch Then Debug.Print "A pesquisa no foi bem-sucedida!"

    Else Debug.Print "A pesquisa foi bem-sucedida." End If rst.Close Set dbs = Nothing End Sub

  • ACCESS 2000 PROGRAMAO EM VBA SENAC-RS

    50

    11. INTEGRANDO COM O OFFICE 2000

    O Visual Basic for Applications (VBA) a linguagem que lhe permite trabalhar com objetos no Office. O propsito da automao ActiveX permitir que um desenvolvedor use a funcionalidade de um aplicativo a partir de outro aplicativo. O pacote do Microsoft Office contm muitas funcionalidades. Por exemplo, se voc precisar permitir que um usurio crie uma mala-direta, por que tentar desenvolver sua prpria funo de mala-direta quando os processadores de texto j fazem isso? Da mesma forma, se voc precisa rodar um clculo financeiro como a amortizao de um