Professional Documents
Culture Documents
SUMÁRIO
1. INTRODUÇÃO .................................................................................................................. 10
1.1. ARQUITETURA DE UMA APLICAÇÃO MS ACCESS............................................. 11
2. PROGRAMAÇÃO NO MS ACCESS............................................................................... 13
2.1. MACRO X MÓDULO......................................................................................................... 13
2.2. MÓDULOS ....................................................................................................................... 15
2.3. QUANDO USAR PROGRAMAÇÃO ...................................................................................... 16
2.4. MÓDULO PADRÃO ........................................................................................................... 17
2.5. MÓDULO DE CLASSE EM FORMULÁRIOS E RELATÓRIOS ................................................... 17
2.6. MÓDULO DE CLASSE ....................................................................................................... 18
2.7. SEÇÃO DE DECLARAÇÕES ................................................................................................ 19
2.8. SEÇÃO DE PROCEDIMENTOS ............................................................................................ 20
2.9. O EDITOR DE CÓDIGO ...................................................................................................... 20
FIGURA 1: OPÇÕES DO EDITOR DE CÓDIGO DO ACCESS ..................................... 21
2.9.1. Cores de código ...................................................................................................... 21
2.9.2. Opções de codificação ............................................................................................ 22
2.9.3. Configurações da janela ......................................................................................... 23
2.10. JANELAS DO EDITOR DE CÓDIGO DO ACCESS ................................................................. 23
2.10.1. Janela de Código .................................................................................................. 23
2.10.2. Janela Depurar ..................................................................................................... 24
PRÁTICA 2 – PROGRAMAÇÃO NO MS ACCESS........................................................... 26
EXERCÍCIO 1 – Criando um módulo padrão .................................................................. 26
CRIE UM MÓDULO BASDEMONSTRACAO CONTENDO O PROCEDIMENTO
WELCOME. ............................................................................................................................. 26
EXERCÍCIO 2 – Criando um módulo de classe em formulário ....................................... 26
CRIE UM FORMULÁRIO CHAMADO FRMDEMONSTRACAO. ................................. 26
SENÃO .................................................................................................................................... 27
FIM SE..................................................................................................................................... 28
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
REPORTS![RPTLISTA_DE_PRODUTOS] OU
REPORTS(“RPTLISTA_DE_PRODUTOS”) ..................................................................... 42
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
FORMS![FRMPEDIDOS]![TXTPREÇOUNITÁRIO] ...................................................... 42
4.2. PROPRIEDADES E MÉTODOS ............................................................................................ 42
FORMS![FRMPEDIDOS].CAPTION ................................................................................. 42
ME.CAPTION ........................................................................................................................ 42
FORMS![FRMPEDIDOS]![TXTPREÇOUNITÁRIO].BACKCOLOR ........................... 42
ME![TXTPREÇOUNITÁRIO].BACKCOLOR .................................................................. 42
4.3. COLEÇÃO PADRÃO E PROPRIEDADE PADRÃO ................................................................... 43
FORMS![FRMPEDIDOS].CONTROLS![TXTPREÇOUNITÁRIO] ............................... 43
MEUREGISTRO.STRMATRICULA = “80106650”.......................................................... 50
5.5. ESTRUTURA DE REPETIÇÃO ................................................................................... 51
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
DO ............................................................................................................................................ 51
LOOP ....................................................................................................................................... 52
DO ............................................................................................................................................ 52
EXIT DO ................................................................................................................................. 52
ENDIF ...................................................................................................................................... 52
LOOP ....................................................................................................................................... 52
5.5.4. For Each..Next ........................................................................................................ 52
DIM VARNOMESMESES AS VARIANT .......................................................................... 52
NEXT ....................................................................................................................................... 52
NEXT ....................................................................................................................................... 53
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
NEXT ....................................................................................................................................... 53
5.6. ESTRUTURA CONDICIONAL ................................................................................... 53
IF...THEN...ELSE................................................................................................................... 53
5.6.1. If...Then...Else ......................................................................................................... 53
IF { CONDIÇÃO } THEN .................................................................................................... 53
END IF ..................................................................................................................................... 53
ELSE ........................................................................................................................................ 53
END IF ..................................................................................................................................... 53
ELSE ........................................................................................................................................ 54
END IF ..................................................................................................................................... 54
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
ELSE......................................................................................................................................... 82
END IF .................................................................................................................................... 82
7.2.4. Passagem De Parâmetros Para Formulário .......................................................... 82
7.3. FORMULÁRIO DE CONSULTA ................................................................................. 84
7.4. CAIXA DE MENSAGEM ............................................................................................. 88
8. ACESSO A BANCO DE DADOS ..................................................................................... 89
8.1. HIERARQUIA DO OBJETOS DAO ..................................................................................... 90
PARA USAR OS OBJETOS DE ACESSO A DADOS, É NECESSÁRIO CONHECER O
MODELO DAO. ..................................................................................................................... 90
8.2. SINTAXE PARA REFERENCIAR OBJETOS EM COLEÇÃO .................................................... 91
DBENGINE.WORKSPACES(0).DATABASES(0) ............................................................. 91
FIELDS(0) ............................................................................................................................... 91
OU ............................................................................................................................................ 91
FIELDS(“CÓDIGODOLIVRO”) ......................................................................................... 91
8.3. COLEÇÃO PADRÃO .......................................................................................................... 91
8.4. REFERÊNCIA A OBJETOS POR MEIO DE VARIÁVEIS .......................................................... 92
DIM WKS AS WORKSPACE .............................................................................................. 92
8.5. PROPRIEDADES E MÉTODOS ............................................................................................ 92
DIM RST AS RECORDSET ................................................................................................. 92
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
SET DBSDBASE =
DBENGINE.WORKSPACES(0).OPENDATABASE(“\\SMG0006\TABELAS”, _ ...... 101
Reprodução proibida
Microsoft© Access Avançado
SUMÁRIO
SET DBSEXCEL =
DBENGINE.WORKSPACES(0).OPENDATABASE(“C:\SHEETS\VENDA.XLS”, _ 102
Reprodução proibida
Microsoft© Access Avançado
1. INTRODUÇÃO
No MS Access, você armazena dados em tabelas e recupera informações por meio de
consultas, de forma interativa diretamente na janela de Banco de Dados. Esta forma de
trabalhar exige do usuário final um alto nível de conhecimento do MS Access.
Em vez de acessar diretamente as tabelas e consultas, você pode construir uma
interface com formulários e relatórios. No curso básico, você usa inicialmente os Assistentes
e depois pode construir os formulários e relatórios manualmente no modo Estrutura. Esta
forma de criar aplicativos atende a problemas simples de cadastramento e recuperação de
dados e exige que o usuário final tenha apena um conhecimento superficial do MS Access.
Com o tempo, você sente necessidade de o aplicativo dar maior controle no tratamento
dos dados e que a interface seja mais segura e simples de usar, não exigindo que o usuário
final tenha de saber o MS Access para operar o aplicativo. Torna-se necessário então
desenvolver aplicações usando programação dentro do MS Access.
Este curso ensinará a programação do MS Access , utilizando a linguagem Visual
Basic for Application – VBA, para que você desenvolva aplicativos completos no MS Access.
A Microsoft dispõe de três edições da linguagem Visual Basic:
Visual Basic - VB
Visual Basic for Application – VBA
Visual Basic Scripting – VBScript
Reprodução proibida
Microsoft© Access Avançado
MS Internet Explorer
Reprodução proibida
Microsoft© Access Avançado
Portanto, uma aplicação em Access deve considerar que os dados estão distribuídos e
em formatos distintos. Mesmo que seja uma aplicação simples, é uma boa prática separar
dados de processos.
O MS Access pode acessar dados em formatos dBase, texto, Excel, Paradox, FoxPro e
HTML via ISAM – Indexed Sequential Access Method e bancos de dados SQL Server,
Oracle e outros via ODBC – Open Database Connectivity. Para tanto, você deve ter instalado
os drivers apropriados no computador onde a aplicação rodará.
Como dados estão separados, o MS Access provê formas de acessá-lo:
Vinculação de tabela
Consulta de passagem (pass-through)
Expressão SQL com a cláusula IN.
Programação com DAO
Programação com ODBC-API
Programação com objetos de acesso a dados, como o RDO e ADO.
Reprodução proibida
Microsoft© Access Avançado
Provider apropriado para o formato desejado. A vantagem é que o ADO acessa diretamente a
fonte de dados, sem passar pelo mecanismo Jet nem por gerenciador ODBC. Não veremos o
ADO neste curso.
2. PROGRAMAÇÃO NO MS ACCESS
2.1. Macro x Módulo
No MS Access, o termo macro designa ações pré-definidas dispostas sequencialmente.
Para não-programadores, as macros podem ser usadas para operações simples, como abrir um
formulário ou relatório, executar uma consulta ou acionar um item de menu.
A chamada de macros por botões de comando em formulários e menus fornece ao
aplicativo uma interface com certo grau de controle de navegação pelas telas e automação.
Isto também restringe o acesso do usuário a recursos críticos do MS Access, tal como alterar
a estrutura de uma tabela, e não exige do usuário um alto nível de conhecimento sobre o MS
Access.
Você pode criar botões de comando em formulários e associar macros que realizam
ações pré-definidas. Por exemplo, o botão de comando cuja legenda é Cadastrar Livros
invoca a macro Macro1. Na Macro1 existe uma ação AbrirFormulário que abre o
formulário chamado frmCadastra_Livros.
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
2.2. Módulos
A programação no MS Access é feita nos módulos.
Um módulo é uma coleção de declarações e procedimentos armazenados
conjuntamente, formando uma unidade. As declarações são instruções que direcionam o
comportamento dos procedimentos em todo um módulo.Um procedimento é uma unidade de
código VBA que realiza uma operação específica. Por exemplo, o cálculo dos dígito
verificador do CPF é um procedimento e o cálculo do fatorial de um número é outro.
Os módulos podem estar alojados em três lugares:
Na guia Módulos da janela de Banco de Dados do MS Access. Nela existem dois tipos de
módulos: módulo padrão e módulo de classe.
Embutido em um formulário do Access. Contém módulo de classe.
Embutido em um relatório do Access. Contém módulo de classe.
Cada módulo na guia Módulos recebe um nome único dentro do aplicativo (no
mesmo arquivo .mdb). O nome deve seguir uma regra de nomenclatura:
Pode conter até 64 caracteres, entre letras e números
Aceita espaços e caracteres especiais, exceto ponto, exclamação, acento grave, colchetes e
caracteres de controle (código ASCII de 0 a 31).
Treinar – Cursos de Informática 3274-1222 15
Reprodução proibida
Microsoft© Access Avançado
É recomendável não usar espaços nem caracteres especiais e evitar nomes muito
longos. O Anexo A sugere uma convenção de nomes a ser adotada no desenvolvimento de
aplicativos com produtos Microsoft.
Os módulos de classe em formulários e relatórios não recebem nomes, pois são
gravados juntamente com o formulário ou relatório aos quais estão relacionados.
O código de um módulo é composto por:
Instruções, funções e palavras-chave do VBA
Nomes de variáveis, constantes ou procedimentos fornecidos pelo desenvolvedor
Instruções e cláusulas da linguagem SQL
Propriedades e métodos de objetos
Para criar funções definidas pelo usuário – UDF (User Defined Functions), por exemplo,
o cálculo dos dígitos verificadores do CGC.
Sempre que se necessitar de usar estruturas de repetição e condição complexa (do tipo Do
While e If...Then...Else).
Para substituir macros por código VBA equivalente. As macros ficam armazenadas em
pastas de macro (a quinta guia da janela Banco de Dados), mas podem ser chamadas de
qualquer parte do Access. Ás vezes pode ficar difícil entender o emaranhado de chamadas
a elas. Os módulos, por formarem uma unidade, são mais compreensíveis, podendo ainda
ser impressas. Assim, o aplicativo pode ser construído de forma modular e concisa,
melhorando assim a sua legibilidade e documentação.
Para manipular objetos de outros softwares, como o Word e Excel, através da automação.
Reprodução proibida
Microsoft© Access Avançado
Para realizar operações de DDE (troca dinâmica de dados), como por exemplo ler uma
tela do Plenus (um emulador de terminal Unisys TB-27).
Reprodução proibida
Microsoft© Access Avançado
Access 95, os módulos de classe só podem ser criados associados a formulários ou relatórios.
No Access , eles podem ser criados na guia de Módulos da janela de Banco de Dados.
Os procedimentos de evento em módulo de formulário respondem a eventos (tais
como o clicar do mouse) do próprio formulário, de suas seções (cabeçalho, detalhe, rodapé) e
dos controles. Os procedimentos de evento em módulo de relatório respondem a eventos do
próprio relatório e de suas seções somente.
Se se deseja que um evento em um formulário ou relatório acione um procedimento
Function ou Sub de um módulo padrão, é preciso que o procedimento de evento dentro do
módulo de formulário/relatório faça a chamada. O código abaixo é um procedimento de
evento ligado ao controle cmdOkButton que chama um procedimento Sub armazenado em
módulo padrão.
Reprodução proibida
Microsoft© Access Avançado
A programação de classes de objetos é mais efetiva no Visual Basic, pois você pode
construir um objeto totalmente encapsulado em um arquivo DLL, EXE ou OCX e pode usá-lo
em qualquer outra linguagem que suporte a arquitetura COM (Componente Object Model).
Com a opção Database, a comparação segue o que estiver definido nas opções do
Access (menu Ferramentas|Opções..., guia Geral, na caixa Nova Ordem de classificação do
banco de dados).
A instrução Option Explicit obriga que todas as variáveis sejam declaradas
explicitamente, ou seja, usando as instruções de declaração de variáveis (Dim, Redim,
Private, Public ou Static). É altamente recomendável que as variáveis sejam declaradas
explicitamente para que não haja conflitos de nomes de variáveis.
Treinar – Cursos de Informática 3274-1222 19
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Para cada valor de área de texto você pode especificar o tipo de fonte e o tamanho nas
caixas Fonte e Tamanho.
Os ícones de indicadores de margem são:
Ícone Nome do Indicador Descrição
de margem
Ponto de interrupção Indica que você definiu um ponto de interrupção usando o
comando Ativar/desativar ponto de interrupção no menu
Depurar. Você pode ativar/desativar o ponto de interrupção
colocando o ponteiro do mouse na região do indicador de
margem e clicando nele.
Linha de execução Indica a linha de código que será executada a seguir. Você
atual pode arrastar esse indicador de margem para um novo local
dentro de qualquer módulo de código em execução. Caso
arraste o indicador de margem da Linha de execução atual
para uma linha ou região inválida, nada acontecerá e o
indicador retornará para o local original.
Indicador Indica o local de um indicador definido usando o comando
Alternar indicador no menu Editar.
Marcador de Pilha de Indica as linhas que estão atualmente na pilha de chamadas. O
chamadas indicador Marcador de pilha de chamadas aparece apenas no
modo de interrupção.
Reprodução proibida
Microsoft© Access Avançado
Dicas de dados automáticas — Exibe o valor da variável sobre a qual o seu cursor está
posicionado. Disponível somente no modo de interrupção. Exemplo:
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Você pode alternar entre o painel Locais e o painel Inspecionar clicando na guia
Locais ou na guia Inspecionar da janela Depurar. O painel Imediato permanece visível,
independentemente de qual guia é clicada.
Reprodução proibida
Microsoft© Access Avançado
1. Abra o MS Access .
2. Crie um banco de dados vazio chamado dbWelcome.mdb.
3. Selecione a guia Módulos na janela de Banco de Dados.
4. Clique em Novo.
5. Digite o seguinte procedimento:
Sub Welcome()
MsgBox "Bem-vindo ao curso MS Access Avançado", vbOKOnly, "Treinar"
End Sub
Perceba como o Access diferencia cores para instruções e texto de usuário e como o editor de
código fornece dicas da sintaxe da instrução MsgBox.
Nome: cmdOK
Legenda: &Ok
Ao clicar: [Procedimento de Evento]
Reprodução proibida
Microsoft© Access Avançado
b ± b 2 − 4ac
x=
2a
O algorimo para implementar a fórmula de Báskara é:
Algoritmo Baskara
Declare a, b, c, Delta, x1, x2 numérico
Leia a
Leia b
Leia c
{Calcule Delta}
Delta ← b2 – 4 x a x c
Se Delta = 0 então
x1 ← -b ÷ 2 x a
Escreva x1
SenãoSe Delta > 0 então
x1 ← (-b + Delta ) ÷ (2 x a)
x2 ← (-b - Delta ) ÷ (2 x a)
Escreva x1
Escreva x2
Senão
Treinar – Cursos de Informática 3274-1222 27
Reprodução proibida
Microsoft© Access Avançado
Este algoritmo tem uma finalidade geral e portanto é adequado usar módulo padrão.
Módulos padrão são criados na guia Módulos da janela de Banco de Dados. Selecione a guia
Módulos na janela de Banco de Dados e clique no botão Novo. É aberta uma janela de código
para criação de procedimentos em módulo padrão.
Cada módulo pode conter um ou mais procedimentos do tipo Sub (procedimento sem
retorno de valor, ou simplesmente procedimento) e Function (procedimento com retorno de
valor, ou simplesmente, função).
Abaixo da seção de declarações, digite a palavra reservada Sub ou Function seguido
do nome do procedimento.
Após teclar Enter, uma seção de procedimento será criada, iniciando com a declaração
do procedimento e terminando com a palavra reservada End Sub ou End Function.
Sub MeuProcedimento()
[ instruções ]
End Sub
Function MinhaFuncao()
[ instruções ]
End Function
Na área entre a declaração do procedimento e o seu fim você deve digitar o seu código
VBA. Comece sempre com a declaração das variáveis e constantes que serão utilizados pelo
seu código.
Criemos um primeiro código para implementar o algoritmo de Báskara.
Sub Baskara()
Dim sngA As Single
Dim sngB As Single
Dim sngC As Single
Dim dblDelta As Double
Dim sngX1 As Single
Dim sngX2 As Single
Reprodução proibida
Microsoft© Access Avançado
MsgBox sngX1
ElseIf dblDelta > 0 Then
sngX1 = (-sngB + Sqr(dblDelta)) / (2 * sngA)
sngX1 = (-sngB - Sqr(dblDelta)) / (2 * sngA)
MsgBox sngX1
MsgBox sngX2
Else
MsgBox "Não há solução"
End If
End Sub
Reprodução proibida
Microsoft© Access Avançado
Option Explicit
Sub Teste()
Dim intNumero As Integer
intNumero = intDesconto * 42
MsgBox intNumero
End Sub
Ao compilar, será mostrada uma caixa de diálogo com o erro “Variável não definida”.
Ao clicar OK, a janela do código onde ocorreu o erro será aberta e o local do erro
ficará marcado.
Caso não haja erros de sintaxe, verifique erros de lógica, para que o programa não
trave o computador. Se tudo estiver correto, salve o módulo e forneça um nome. A gravação
do módulo é feita pelo menu Arquivo|Salvar.
Reprodução proibida
Microsoft© Access Avançado
estiver sendo executado. Ao editar o código, preste atenção neste ícone e lembre-se de
terminar a execução antes de fazer qualquer alteração em seu código ou na estrutura de
tabelas, consultas, formulários e relatórios.
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
pode estabelecer pontos de interrupção nas linhas em que você quer começar a execução
passo-a-passo.
Para isto, vá até a linha onde se deseja interromper a execução e tecle F9 ou o ícone
na barra de ferramentas ou acione o menu Depurar|Ativar/Desativar pontos de
interrupção. O indicador de margem apresentará o ícone e o texto da linha ficará na cor
marrom em segundo plano.
Ao executar o procedimento com F5, o código será executado completamente e parará
no ponto de interrupção. A partir daí, pode-se prosseguir com F8 para execução passo-a-passo
ou F5 para continuar a execução completa. Um novo F9 na linha do ponto de interrupção
desativará o ponto de interrupção.
Os pontos de interrupção servem para testar o aplicativo. Você deve lembrar de
desativar todos os pontos de interrupção antes de salvar o módulo (ou formulário ou relatório)
para ser distribuído. Pressionando Control+Shift+F9 desativa todos os pontos de interrupção
de todos os módulos, estejam estes salvos ou não.
n!
Cn, p =
p !(n − p)!
Note que para resolver este problema é preciso calcular três fatorias. Ora, já vimos um
procedimento para calcular fatoriais. Não bastaria escrever três vezes o código dentro do
procedimento de combinação?
Não é nada produtivo ter que rescrever o mesmo algoritmo várias vezes. O que
podemos fazer é fazer com que o procedimento de combinação chame o procedimento de
fatorial todas as vezes que for necessário.
Qualquer procedimento pode chamar outro procedimento apenas colocando-se o nome
do procedimento como se fosse uma instrução do VBA.
Sub Combinacao()
Reprodução proibida
Microsoft© Access Avançado
.
.
Fatorial
.
End Sub
Esquematicamente, a chamada de um procedimento por outro funciona assim:
dblFatorial = 1
lngContador = 2
If lngNumero = 0 Or lngNumero = 1 Then
MsgBox "O fatorial é 1"
Else
Do While lngContador <= lngNumero
dblFatorial = dblFatorial * lngContador
lngContador = lngContador + 1
Loop
MsgBox "O fatorial é " + str(dblFatorial)
End If
End Sub
Reprodução proibida
Microsoft© Access Avançado
Para um procedimento chamar outro passando argumentos, basta escrever o seu nome
e enviar a variável ou valor à frente do nome. No caso abaixo, o procedimento Combinacao
irá chamar o procedimento Fatorial, passando o valor 4 como argumento.
Sub Combinacao()
.
.
Fatorial(4)
.
End Sub
dblFatorial = 1
lngContador = 2
If lngNumero = 0 Or lngNumero = 1 Then
Fatorial = 1
Else
Do While lngContador <= lngNumero
dblFatorial = dblFatorial * lngContador
lngContador = lngContador + 1
Loop
Fatorial = dblFatorial
End If
End Sub
Note que em Fatorial = 1, Fatorial não é uma variável e sim o nome do procedimento.
1 é o valor a ser retornado. Note também que o procedimento Fatorial, que agora é do tipo
Function, tem o mesmo tipo de dado que a variável dblFatorial.
Agora, o procedimento Combinacao pode chamar a function Fatorial e armazenar o
valor de retorna em uma de suas variáveis.
Sub Combinacao()
Dim N As Integer
Dim P As Integer
Dim dblFatN As Double
Treinar – Cursos de Informática 3274-1222 35
Reprodução proibida
Microsoft© Access Avançado
dblFatN = Fatorial(N)
dblFatP = Fatorial(P)
dblFatNP = Fatorial(N - P)
dblFatN = Fatorial(intN)
dblFatP = Fatorial(intP)
dblFatNP = Fatorial(intN - intP)
Reprodução proibida
Microsoft© Access Avançado
X = 10
MsgBox X ' Será escrito 10
Teste2(X)
MsgBox X ' Ainda será escrito 10
End Sub
Reprodução proibida
Microsoft© Access Avançado
*****
1. Abra o MS Access .
2. Crie um banco de dados vazio chamado dbPratica3.mdb.
3. Selecione a guia Módulos na janela de Banco de Dados.
4. Clique em Novo.
5. Digite o seguinte procedimento:
Sub Fatorial()
Dim lngNumero As Long
Dim dblFatorial As Double
Dim lngContador As Long
Reprodução proibida
Microsoft© Access Avançado
lngContador = 2
If lngNumero = 0 Or lngNumero = 1 Then
MsgBox "O fatorial é 1"
Else
Do While lngContador <= lngNumero
dblFatorial = dblFatorial * lngContador
lngContador = lngContador + 1
Loop
MsgBox "O fatorial é " + str(dblFatorial)
End If
End Sub
? 2 * 50 + lngContador
15. Feche a janela de módulo e veja o nome do módulo basFatorial gravado na guia Módulos
da janela de Banco de Dados.
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Via programação, podemos ter acesso às propriedades dos objetos. Os valores das
propriedades podem ser alterados dinamicamente, durante a execução do código. A
programação permite também que os métodos dos objetos sejam invocados, algo que não é
possível no modo estrutura.
Todos os formulários do banco de dados formam a coleção de formulários. Todos os
relatórios do banco de dados formam a coleção de relatórios. Uma coleção é um objeto que
contém objetos de um mesmo tipo. Eis as coleções do Access.
Coleção Descrição
Forms Coleção de formulários abertos
Reports Coleção de relatórios abertos
Controls Coleção de controles em formulários ou relatórios abertos
Modules Coleção de módulos padrão e módulose de classe (inclusive módulos de classe
de formulário e de relatório)
Reprodução proibida
Microsoft© Access Avançado
Coleção![Nome do item]
Coleção.Item(número do item]
A primeira e a última forma têm a desvantagem de ter que saber qual o número do
item dentro da coleção. Se existem vários formulários num banco de dados, cada um deles
recebe um número sequencial, começando do zero (0). Na última forma, Item é uma
propriedade da coleção.
As duas outras formas são mais compreeensíveis e mais fáceis de usar porque já
sabemos o nome do item.
Por exemplo, para referir a um formulário específico chamado frmPedidos, use a
expressão:
Forms![frmPedidos] ou Forms(“frmPedidos”)
Para referir-se a um relatórios chamado rptLista_de_Produtos, use a expressão:
Reports![rptLista_de_Produtos] ou Reports(“rptLista_de_Produtos”)
Para referir-se a um controle chamado txtPreçoUnitário, no formulário frmPedidos,
use a expressão:
Forms![frmPedidos]![txtPreçoUnitário]
Se o código estiver sendo escrito atrás do formulário frmPedidos, não é necessário
referir-se a ele mesmo como Forms![frmPedidos], mas simplesmente como Me!. Assim, a
referência ao controle txtPreçoUnitário pode ser simplificado para Me![txtPreçoUnitário].
NOTA: O objeto Form referencia formulários abertos. Formulários fechados são
referenciados pelo objeto Document da hierarquia de objetos do DAO – Data Access Objects.
Reprodução proibida
Microsoft© Access Avançado
Propriedade
Método
Controle
Algumas propriedades são somente para leitura, isto é, você não pode alterar o seu
valor, somente recurá-lo. Por exemplo, a propriedade Name é tipicamente uma propriedade
para somente leitura, já que o nome é fornecido ao salvar a estrutura de um objeto.
Todas as propriedades visíveis na janela de propriedades na estrutura de um
formulário são acessíveis via programação. Entretanto, existem várias propriedades que são
acessíveis somente no modo programado e não podem ser acessados no modo estrtutura. Por
exemplo, a propriedade Hwnd de um formulário está disponível somente no modo
programado.
Reprodução proibida
Microsoft© Access Avançado
object.Application
Sub ApplicationProperty( )
Dim obj As Object
Set obj = Forms.Application ' Retorna o objeto
Microsoft Access
End Sub
Eis alguns dos eventos de formulário para os quais pode-se definir código:
Reprodução proibida
Microsoft© Access Avançado
Evento Descrição
NoAtual (OnCurrent) O evento NoAtual ocorre quando o foco é movido para um registro,
tornando-o o registro atual, ou quando o formulário é aberto ou atualizado
ou quando sua consulta é repetida.
Reprodução proibida
Microsoft© Access Avançado
5. ELEMENTOS DE PROGRAMAÇÃO
Como qualquer outra linguagem de programação, o VBA implementa:
• Variáveis (simples e compostas)
• Constantes
• Vetores e matrizes
• Comentários
• Instruções de controle de estrutura de repetição
• Instruções de controle de estrutura condicional
• Instruções de entrada
• Instruções de saída
• Funções
5.1. VARIÁVEIS
Variável é um local da memória RAM do computador que armazena um valor até que
um novo valor seja armazenado ou até que a rotina se encerre. A posição de memória é
referida por um identificador, que nada mais é que um nome que aponta para o endereço de
memória.
5.1.1. Declaração
Reprodução proibida
Microsoft© Access Avançado
Recomenda-se que os nomes das variáveis sigam o padrão de nomenclatura LNC (ver
Apêndice A). Os nomes de variáveis, assim como o de constantes e procedimentos:
Treinar – Cursos de Informática 3274-1222 47
Reprodução proibida
Microsoft© Access Avançado
Uma palavra reservada é uma palavra que o Visual Basic utiliza como parte de sua
linguagem. Isso inclui instruções (como If e Loop), funções (como Len e Abs), operadores
(como Or e Mod), palavras-chave, cláusulas SQL e propriedades e métodos de objetos.
Exemplos:
Dim strNomeEmpregado As String
Dim intIdade As Integer
Dim dblValorFatura As Double
Se o tipo da variável for um objeto, a atribuição deve ser precedida pela instrução Set.
O valor atribuído tem que ser coerente com o tipo de dado da variável. Assim, se
intIdade é do tipo inteiro, ocorrerá um erro se for atribuído um valor fracionário ou um valor
fora do intervalo de valores permitidos.
5.2. CONSTANTES
Reprodução proibida
Microsoft© Access Avançado
acForm
dbAppendOnly
vbCurrency
Reprodução proibida
Microsoft© Access Avançado
Existem várias categorias de constantes intrínsecas. Para ver uma lista de constantes
intrínsecas em uma determina categoria. Consulte no Help do Access os tópicos abaixo:
As constantes definidas pelo sistema são os valores lógicos True e False e a ausência
de valor Null. Assim como as constrantes intrínsecas, elas também não precisam ser
declaradas com a instrução Const.
Você pode usar estas constantes em qualquer lugar do Access, tais como em consultas,
macros, variáveis e propriedades de objetos.
A instrução Type define um tipo de dado a partir dos tipos básicos. Seu emprego
normalmente se aplica a um registro. Veja o exemplo.
Type RegistroDePessoal
strMatricula As String * 8
strNome As String * 35
strCodOrgao As String * 8
strCodCargo As String * 4
dtaDataNasc As Date
End Type
MeuRegistro.strMatricula = “80106650”
MeuRegistro.strNome = “CARLOS KOGA”
MeuRegistro.dtaDataNasc = #06/10/1964#
Reprodução proibida
Microsoft© Access Avançado
5.5.1. For..Next
5.5.2. Do..Loop
Sub WhileSaídaNoInício()
contador = 0
meuNúmero = 20
Do While meuNúmero > 10
meuNúmero = meuNúmero - 1
contador = contador + 1
Loop
MsgBox "O loop concluiu " & contador & " repetições."
End Sub
Sub WhileSaídaNoFinal()
contador = 0
meuNúmero = 9
Do
meuNúmero = meuNúmero - 1
contador = contador + 1
Loop While meuNúmero > 10
MsgBox "O loop concluiu " & contador & " repetições."
Reprodução proibida
Microsoft© Access Avançado
End Sub
Sub UntilSaídaNoInício()
contador = 0
meuNúmero = 20
Do Until meuNúmero = 10
meuNúmero = meuNúmero - 1
contador = contador + 1
Loop
MsgBox "O loop concluiu " & contador & " repetições."
End Sub
Sub UntilSaídaNoFinal()
contador = 0
meuNúmero = 1
Do
meuNúmero = meuNúmero + 1
contador = contador + 1
Loop Until meuNúmero = 10
MsgBox "O loop concluiu " & contador & " repetições."
End Sub
intContador = 0
Do While True
intContador = intContador + 1
if intContador > 10 Then
Exit Do
Endif
Loop
Reprodução proibida
Microsoft© Access Avançado
Neste outro exemplo, a coleção TableDefs possui vários objetos do tipo TableDef.
Cada objeto de definição de tabela possui a propriedade Name. A instrução For Each...Next
pode ser usada para listar todas as tabelas do banco de dados corrente.
Uma construção similar pode ser obtida com somente a instrução For...Next.
If...Then...Else
Select Case
On...Goto
On..GoSub
As instruções On..Goto e On..GoSub não serão mostradas porque Select Case pode
substituí-las, gerando um código mais estruturado e flexível.
5.6.1. If...Then...Else
A estrutura condicional mais simples é:
If { condição } Then
[ instruções]
End If
If { condição } Then
[ instruções]
Else
[ instruções]
End If
Reprodução proibida
Microsoft© Access Avançado
If { condição } Then
[ instruções]
Elseif { condição 2} Then
[ instruções]
Elseif { condição 3} Then
[ instruções]
Elseif { condição 4} Then
[ instruções]
Else
[ instruções]
End If
Reprodução proibida
Microsoft© Access Avançado
Para fazer a leitura de dados via teclado em algoritmo você usa a instrução Leia . Em
Clipper usa-se o comando @..GET para a sua implementação. Para a saída, o algoritmo usa a
instrução Escreva, a qual é implementada no Clipper com @..SAY.
No Clipper, tanto para entrada de dados quanto para a saída, usam-se os dois
comandos para construir uma tela para posicionar os campos na tela, de forma a criar uma
interface agradável e compreensível. No Access, há uma maneira mais fácil de efetuar a
entrada e saída de dados, sem programação: é o objeto formulário.
Tomemos por exemplo a função Extenso( ), cujo código é apresentado mais adiante. A
maioria das funções requer argumentos de entrada, neste caso, um valor monetário. Como
toda função, esta retorna o valor por extenso do valor informado. Tanto o argumento (entrada)
quanto o retorno da função (saída) podem ser colocados em um formulário.
O exemplo a seguir é um formulário simples, sem nenhuma fonte de dados. Por isso,
em suas propriedades estão desativados o seletor de registros, os botões de navegação e as
barras de rolagem.
Há dois controles caixa de texto: txtValor e txtExtenso. O primeiro é um controle não
acoplado, que receberá um valor monetário, e, por isso, está formatado com o tipo Moeda. O
segundo é um controle calculado que contém o dado Extenso([txtValor]). Quando este
receber o foco, chamará a função, levando o argumento txtValor e retornará uma string com o
valor por extenso.
Reprodução proibida
Microsoft© Access Avançado
Este exemplo simples mostra claramente que um formulário pode ser usado como
entrada e saída, substituindo com vantagens os tradicionais comando de entrada via teclado e
de saída na tela.
Às vezes você não quer usar um formulário para entrada e saída de dados. Você quer
usar instruções no VBA para receber um único campo e enviar uma mensagem na tela. Para
isto há a função InputBox e a função/instrução MsgBox.
Reprodução proibida
Microsoft© Access Avançado
InputBox e MsgBox não são sofisticados quanto um formulário. InputBox não pode
consistir um dado, usando por exemplo, um código VBA em módulo de formulário, nem
formatar (usando a propriedade Formato do controle Caixa de Texto).
Nem sempre a entrada de dados é via teclado. Pode ser via leitura de arquivo. A
entrada e gravação de dados em formato de tabela são tratados no tópico Acesso a Dados,
mais adiante. A leitura de dados de arquivos seqüenciais, randômicos e binários será vista
também em outro tópico (Acesso a Arquivos e Impressora).
Da mesma forma, a saída nem sempre é a tela de vídeo. O tópico Acesso a Arquivos e
Impressora mostrará como direcionar a saída para arquivos em disco ou para a impressora
local.
Há um outro local para onde a saída pode ser direcionada: a Janela Depurar. Esta
janela recebe a saída, a qual é visualizada quando a janela é aberta. A janela depurar serve
testar e depurar a lógica de um programa.
A saída para a janela depurar é feita pelo objeto Debug, do VBA, utilizando-se seu
único método: o Print. A janela depurar é aberta com Control-G.
5.8. COMENTÁRIOS
Um comentário são textos não executáveis, ou seja, não são entendidos como um
código de programação. Comentários servem para documentar e esclarecer uma rotina
complexas.
Reprodução proibida
Microsoft© Access Avançado
Uma linha de código torna-se um comentário se ela vier precedida de uma aspa
simples. Não é necessário que toda a linha seja um comentário; você acrescentar um
comentário após uma instrução.
' Toda esta linha é um comentário.
MsgBox "Teste" ' A partir daqui tudo que for escrito é comentário.
Todo comentário é escrito na cor verde por padrão. Você pode alterar a cor nas opções
do MS Access.
5.9. FUNÇÕES
O MS Access possui um rol muito grande de funções prontas. Como você já deve
saber, uma função é uma rotina que retorna um valor quando é chamada. A função pode
receber nenhum, um ou mais argumentos de entrada. A lista de argumentos é passada entre
parênteses após o nome da função. A função retorna somente um valor de um determinado
tipo, e portanto, toda chamada de função deve ser atribuída a uma variável. Exemplos:
Dim dtaDataDeHoje As Date
Dim intAscii As Integer
dtaData = Date()
intAscii = Char(“A”)
Existem funções do Visual Basic for Applications, do DAO – Data Access Object e
funções agregadas SQL. Apesar de todas poderem ser usadas no código VBA de uma
aplicação em MS Access, é importante saber a origem das funções, pois você não pode usá-
las em qualquer aplicativo. Por exemplo, se a função é do DAO, você só pode chamar a
função de estiver com o objeto DAO carregado. As funções do VBA podem ser usadas em
qualquer aplicação VBA, seja no MS Access, no MS Excel, MS Word, no MS PowerPoint ou
no MS Project.
As funções do VBA são classificadas segundo o finalidade. Os grupamentos são:
• Funções literais
• Funções matemáticas
• Funções financeiras
• Funções de data
• Funções de conversão
Você não deve confundir função com instrução. Normalmente, as instruções são da
cor azul e as funções aparecem na cor preta.
Funções do VBA podem ser usadas na construção de expressões SQL. Por exemplo:
Dim strSql As String
strSql = "SELECT NúmeroDoPedido, DataDoPedido, DataDeEntrega, "
strSql = strSql + "DateDiff('d', [DataDoPedido], [DataDeEntrega] As Prazo "
strSql = strSql + "FROM Pedidos"
Me.RecordSource = strSql
Consulte a ajuda do MS Access para saber mais sobre funções.
Reprodução proibida
Microsoft© Access Avançado
Níveis de visibilidade
• Private
• Public
Sub Teste( )
Dim intK As Integer
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Você pode criar consultas no modo SQL, escrevendo diretamente as instruções SQL.
Se você não tem conhecimento da linguagem SQL, poderá se familiarizar com ela criando
consultas no modo Estrutura e visualizando-a no modo SQL.
Tendo uma consulta criada na guia Consultas, você pode abrí-la interativamente pelo
botão Abrir da janela de Banco de Dados. O termo executar é mais apropriado que abrir. Via
programação, a consulta pode ser executada pelo método OpenQuery do objeto DoCmd.
A compreensão da linguagem SQL permite desenvolver aplicações sofisticadas. Na
realidade, você pode construir uma aplicação inteira sem nenhuma consulta ter sido criada na
guia Consultas, porque:
• A propriedade Origem do Registro (RecordSource) de formulários e relatórios pode ter
como valor uma tabela ou uma instrução SQL (criada pelo construtor de consultas),
definidos em tempo de desenvolvimento (no modo Estrutura).
• O valor propriedade Origem do Registro de formulários e relatórios pode ser construído
em tempo de execução, passado-o na forma de uma expressão SQL para a propriedade
RecordSource do formulário ou relatório.
• Você pode substituir consultas de ação por expressões SQL criadas em tempo de
execução e executá-las pelo método RunSQL do objeto DoCmd.
• Você pode construir expressões SQL em tempo de execução e visualizar os dados por
meio de um formulário de consulta.
• Você pode construir expressões SQL em tempo de execução e acessar os dados pelo
método OpenRecordset do objeto Database do DAO.
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
A sintaxe completa é:
SELECT [predicado] { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressãodetabela [, ...] [IN bancodedadosexterno]
[WHERE {critérioswhere} ]
[GROUP BY campo1 [, campo2] [,campoN... ] ]
[HAVING {critérioshaving} ]
[ORDER BY campo1 [ASC|DESC] [, campo2 [ASC|DESC] ] [,campoN [ASC|DESC] ... ] ]
[WITH OWNERACCESS OPTION]
Reprodução proibida
Microsoft© Access Avançado
crescente (ASC, que é o padrão) ou decrescente (DESC) ou agrupa (GROUP BY) as linhas
resultantes na ordem especificada.
A cláusula WITH OWNERACCS OPTION significa que o usuário que está
executando a consulta possui as mesmas permissões que o criador da consulta. Isto tem
sentido em um ambiente multi-usuário em que se definir segurança em nível de usuário.
Os argumentos da instrução são:
Argumento Descrição
Predicado Um dos predicados a seguir: ALL, DISTINCT, DISTINCTROW
ou TOP. Você utiliza o atributo para restringir o número de
registros retornados. Se nenhum for especificado, o padrão será
ALL.
* Especifica que todos os campos da tabela ou tabelas especificadas
estão selecionados.
Tabela O nome da tabela contendo os campos a partir dos quais os
registros são selecionados. É um argumento opcional. Você só
precisa definí-lo caso suas tabelas possuam o mesmo nome de
campo, como é o caso do campo PreçoUnitário, que consta das
tabelas Produto e Detalhes do Pedido do banco de dados
Northwind. Produto.PreçoUnitário, [Detalhes do
Pedido].PreçoUnitário
campo1, campo2, É a lista de campos a ser recuperada. Se você incluir mais de um
campoN campo, eles serão recuperados na ordem listada.
O campo pode ser uma expressão literal, matemática ou lógica.
Os nomes dos campos são usados nas cláusula ORDER BY para
definir a ordem de classificação e na cláusula GROUP BY para
definir os grupamentos.
alias1, alias2, aliasN Os nomes a serem utilizados como cabeçalhos de coluna em lugar
dos nomes originais de coluna em tabela. Se omitido, assume o
valor da propriedade Legenda na estrutura da tabela. Caso a
propriedade Legenda esteja em branco, assume o nome do campo.
Se um dos campos for uma expressão e não for definido um alias, é
assumido Expr1, Expr2, Expr3 e assim por diante.
Você não pode usar alias nas clausulas ORDER BY nem em
GROUP BY.
Expressãodetabela O nome da tabela ou relacionamento de tabelas contendo os dados
que você deseja recuperar.
Bancodedadosexterno O nome do banco de dados que contém as tabelas em
expressãodetabela se elas não estiverem no banco de dados atual.
Critérioswhere É uma expressão lógica que filtra os registros que atendam ao
critério definido na expressão.
Critérioshaving É uma expressão lógica que filtra os registros após eles terem sidos
agrupados. A cláusula HAVING deve obrigatoriamente vir com a
cláusula GROPU BY.
Reprodução proibida
Microsoft© Access Avançado
Nomes de campos ou de tabelas ou de alias que possuam espaços devem vir entre
colchetes. Exemplo:
SELECT CD_Matric AS Matrícula, [Nome do empregado] AS Nome FROM [Cadstro de
Pessoal]
PEDIDOS
NR_PEDIDO ID_CLIENTE DATA VALOR
1 1 01/01/98 500,00
2 4 02/01/98 100,00
3 5 02/01/98 30,00
4 5 03/01/98 15,00
5 3 04/01/98 60,00
6 3 10/01/98 90,00
7 1 01/01/98 120,00
PREDICADO ALL
A consulta a seguir retornará todos os registros da tabela Clientes.
SELECT ALL Clientes.* FROM Clientes
é equivalente a
SELECT Clientes.* FROM Clientes
PREDICADO DISTINCT
A consulta a seguir omitirá um dos registros cujo sobrenome é SANTOS.
SELECT DISTINCT Clientes.SOBRENOME FROM Clientes
Reprodução proibida
Microsoft© Access Avançado
A consulta a seguir retornará todos os registros, pois DISTINCT não terá efeito porque há mais
de um campo selecionado.
PREDICADO DISTINCTROW
A consulta a seguir retornará todos os registros da tabela Clientes, exceto o cliente Paulo
Vianna.
Se o predicado DISTINCTROW não fosse usado, apareceriam múltiplas linhas para os clientes
com mais de um pedido.
Esta consulta a seguir não sofre o efeito de DISTINCTROW pois não existem registros repetidos,
já que NR_PEDIDO tem valor distinto em cada valor.
PREDICADO TOP
A consulta a seguir retornará os nomes dos 2 clientes mais idosos cujos cargos é 001.
SELECT TOP 2 NOME
FROM Clientes
WHERE CARGO ="001"
ORDER BY DT_NASC
A consulta a seguir retornará os nomes de 2% dos clientes mais idosos, cujo cargo é 001.
O predicado TOP não distingue valores iguais. Portanto, a consulta a seguir retornará
dois registros e não somente um.
SELECT TOP 1 NOME
FROM Clientes
WHERE CARGO = "002"
ORDER BY DT_NASC
Reprodução proibida
Microsoft© Access Avançado
Não existe um campo subtotal na tabele Detalhes do Pedido. Ele é o alias da expressão
que calcula o subtotal de um item do pedido. Quando se usa expressão nas lista de campos,
ela se chama campo calculado.
Linguagens SQL como o Microsoft SQL Server possui funções próprias da linguagem
as quais podem ser usadas para criar campos calculados. A diferença do Microsoft Jet
Database Engine SQL é que você pode usar funções do próprio Microsoft Jet Database
Engine SQL, funções do VBA e funções definidas pelo usuário para criar campos calculados.
O Microsoft Jet Database Engine SQL possui a função agregada Avg() para calcular a
média de um valor.
SELECT Avg(PreçoUnitário) AS [Média de preços] FROM Produtos
O Microsoft Jet Database Engine SQL não possui a função WeekDay(), que é do
VBA. Mas você pode usá-la em expressões SQL que serão executadas no MS Access ou no
MS Visual Basic.
SELECT WeekDay(DataDoPedido) AS [Dia da semana] FROM Pedidos
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Dizer qual tabela está à direita e qual está à esquerda depende da ordem em que elas
são escritas na expressão. Se se quiser incluir todos os registros da tabela produtos, pode se
usar tanto LEFT JOIN quanto RIGHT JOIN, dependendo a ordem em que os nomes das
tabelas são escritas.
FROM Produtos LEFT JOIN [Detalhes do Pedido]
Isto equivale a:
FROM [Detalhes do Pedido] RIGHT JOIN Produtos
Naturalmente, a ordem da escrita dos nomes das tabelas não tem efetio quando se usa
INNER JOIN.
INNER JON, LEFT JOIN e RIGHT JOIN simplesmente diz quais tabelas e os tipos de
associações existentes entre elas, mas não define quais os campos relacionados. Após escrever
os nomes das tabelas e o tipo de associação, acrescenta-se a cláusula ON seguido dos campos
relacionados. No exemplo a seguir, as tabelas são relacionados pelo campo CódigoDoProduto
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CódigoDoProduto = [Detalhes do Pedido].CódigoDoProduto
Note que como os nomes dos campos são iguais nas duas tabelas, é necessário colocar
o nome da tabela antes dos nomes dos campos, separados por ponto.
Normalmente o operador de comparação é o =. Mas você pode usar >, >=, <., <= ou
<>. Não é comum usar operadores que não seja o =, mas se você usá-los, o modo Estrutura
não consegue exibir este relacionamento.
Casos os relacionamento seja com dois ou mais campos, você deve usar o operador
lógico AND.
SELECT *
FROM Table1 INNER JOIN Table2
ON (Table1.B = Table2.B) AND (Table1.A = Table2.A)
Reprodução proibida
Microsoft© Access Avançado
No caso, as duas tabelas devem estar no mesmo banco de dados. Você não pode
recuperar dados de tabelas em bancos de dados distintos.
Você pode acessar tabelas externas em formatos diferente, como Excel, Paradox ou
dBase. Você coloca duas aspas seguido dos argumentos Especificador e Origem do tipo de
arquivo. No capítulo sobe acesso a banco de dados há a lista completa dos argumentos para a
cláusula IN.
SELECT * from Customers
IN "" [Excel 8.0; DATABASE=C:\Book1.xls]
Reprodução proibida
Microsoft© Access Avançado
Between filtra os valores que estão dentro de um conjunto contínuo de valores. Por
exemplo, Between 1000 AND 5000 seleciona os registros cujo valor de um campo esteja
entre 1000 e 5000, inclusive.
SELECT * FROM Pedidos
WHERE DataDoPedido BETWEEN #01/31/95# AND #05/15/95#
Reprodução proibida
Microsoft© Access Avançado
Outras expressões
A expressão lógica da cláusula WHERE pode conter ainda as constantes definidas
pelo sistema True e False, expressões (como Is Null), funções do VBA e funções definidas
pelo usuário.
SELECT * FROM Funcionarios
WHERE False
SELECT NomeDaEmpresa
FROM Clientes LEFT JOIN Pedidos
ON Clientes.CódigoDoCliente = Pedidos.CódigoDoCliente
WHERE NúmeroDoPedido Is Null
Exemplos:
SELECT COUNT(*) AS [Qtd Itens] FROM [Detalhes do Pedido]
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Se você não especificar todos os campos da tabela, o campo omitido assumirá o valor
padrão ou nulo, caso as propriedades Valor padrão e Requerido estejam configurados na
estrutura da tabela. Suponha que os campos EstadoCivil possua a propriedade Requerido=Não
e UF possui a propriedade Valor Padrão = “MG”. As instruções abaixo inserirão dois
registros com o campo EstadoCivil como nulo e UF com “MG”.
Treinar – Cursos de Informática 3274-1222 74
Reprodução proibida
Microsoft© Access Avançado
7. FORMULÁRIOS AVANÇADOS
Os formulários podem ser usados como:
Formulário de manutenção de tabelas
Caixa de diálogo
Formulário de consulta
Caixa de mensagem
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Uma caixa de diálogo terá dois botões de comando: Um para prosseguir (Ok) e outro
para fechar a caixa de diálogo (Fechar). Normalmente, as propriedades e eventos dos botões
de comando são:
Propriedade Valor
Legenda (Caption) &Ok
Nome (Name) cmdOk
Padrão (Default) Sim (Yes)
AoClicar (Onclick) Chamada específica (Ver exemplos a seguir)
Propriedade Valor
Legenda (Caption) &Fechar
Nome (Name) cmdFechar
Cancelar (Cancel) Sim (Yes)
AoClicar (OnClick) Private Sub cmdFechar_Click()
DoCmd.Close
End Sub
Reprodução proibida
Microsoft© Access Avançado
Normalmente, controles caixas de texto são não acopladas e recebem os valores que
serão passados como parâmetros para proicedimentos, consultas parametrizadas, relatórios e
formulários.
Esta não é uma forma elegante de passar parâmetros para consulta, pois para cada
parâmetro da consulta será aberta uma caixa de diálogo. Estas caixas de diálogo de consulta
parametrizada não validam nenhum dado informado pelo usuário.
A solução é criar um formulário do tipo caixa de diálogo que receberá todos os
parâmetros de uma só vez e o botão Ok acionará a consulta. Os parâmetros podem ser
Treinar – Cursos de Informática 3274-1222 78
Reprodução proibida
Microsoft© Access Avançado
formatados e/ou validados pelo formulário antes de ser enviado para a consulta, garantindo
que o usuário informe parâmetros válidos para a consulta.
Para demonstrar a solução da consulta do exemplo acima, construiremos uma caixa de
diálogo chamada frmDlg_Consulta_Pedido. Ela conterá os botões cmdOk e cmdFechar, como
visto anteriormente. A caixa de texto txtNumeroPedido é não acoplada e o seu valor será
passado como parâmetro para a consulta qryConsulta_Pedido.
A consulta funciona porque o formulário está aberto e seus controles podem ser
acessados por outros objetos do Access.
Esta técnica é útil para aplicativos em que a segurança não é um ponto importante.
Note que a janela folha de dados da consulta, caso seja uma consulta seleção ou referência
cruzada, é aberta, permitindo que o usuário possa alterar a estrutura, modificar os dados ou
excluir registros. A técnica de tela de consulta, como veremos mais adiante, resolve estes
problemas.
Reprodução proibida
Microsoft© Access Avançado
Esta técnica é difícil de ser administrada devido à interação de três objetos do Access
(um formulário, uma consulta e um relatório). Quanto mais objetos o banco de dados possui,
maior a complexidade e mais difícil é sua manutenção. Além disso, esta técnica restringe-se a
filtrar a origem do registro utilizando uma consulta parametrizada.
Uma outra técnica mais elaborada baseia-se na possibilidade de acessar controles de
formulários que estão abertos. Controles de formulários abertos possuem visibilidade public,
ou seja, eles são acessíveis em qualquer parte do Access. É por isso que consultas
parametrizadas funcionam.
Uma caixa de diálogo para abrir relatórios podem construir uma expressão SQL em
tempo de execução, armazená-la em uma caixa de texto oculta e ser usada como parâmetro
para um relatório. Desta forma, elimina-se a necessidade de se construir um objeto consulta,
diminuindo-se a quantidade de objetos no banco de dados e, consequentemente, a
complexidade de manutenção. Além disso, outros parâmetros podem direcionar o
comportamento do relatório, tal como definir a ordem de classificação, incluir mensagem ad-
hoc no relatório, ocultar/exibir seções do relatórios, dentre outras possibilidades.
Para demonstrar esta técnica, usaremos o mesmo exemplo acima.
O formulário frmDlg_Relatorio_Pedido conterá adicionalmente uma caixa de texto
txtSql, com estas propriedades configuradas:
Propriedade Valor
Treinar – Cursos de Informática 3274-1222 80
Reprodução proibida
Microsoft© Access Avançado
strDataInicial = Me.txtDataInicial
strDataFinal = Me.txtDataFinal
Me.txtSql = strSql
DoCmd.OpenReport "rptRelatorio_Pedido", acViewPreview
End Sub
O relatório rptRelatorio_Pedido terá a propriedade Origem do registro
(RecordSource) vazia e o seguinte código associado ao evento AoAbrir.
Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = Forms![frmDlg_Relatorio_Pedido].txtSql
End Sub
Usando esta técnica, podemos modificar outras propriedades do relatório em tempo de
execução, usando parâmetros da caixa de diálogo. O próximo exemplo acrescenta a opção de
ordem de classificação dos dados do relatório. Uma caixa de grupo permite escolher se a
ordem será por Número do pedido ou por Código do cliente. Lembre-se que a cláusula
ORDER BY da origem do registro não afeta a classificação do relatório.
Reprodução proibida
Microsoft© Access Avançado
Propriedade Valor
ControlSource Campo ou expressão pelo qual os dados serão classificados
GroupOn Agrupamento dos dados. O padrão é agrupar por cada valor.
GroupInterval O intervalo pelo qual os dados são agrupados. O padrão é 1 (intervalo para cada valor)
KeepTogether Mantém ou não o grupo na mesma página quando é impresso. O padrão é 0 (não
mantém na mesma página)
SortOrder False para ascendente (padrão), True para descendente
Me.RecordSource = Forms![frmDlg_Relatorio_Pedido].txtSql
bytOpcao = Forms!frmDlg_Relatorio_Pedido.grpClassificacao
If bytOpcao = 1 Then
Me.GroupLevel(0).ControlSource = "NúmeroDoPedido"
Else
Me.GroupLevel(0).ControlSource = "CódigoDoCliente"
End If
End Sub
Argumento Descrição
formname O nome do formulário a ser aberto.
view Uma das seguintes constantes intrínsecas:
acDesign
acFormDS
acNormal (padrão)
acPreview
Reprodução proibida
Microsoft© Access Avançado
acFormPropertySettings (padrão)
acFormReadOnly
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Você pode usar uma formulário somente com mensagens, sem nenhum botão de
comando. Isto é útil, por exemplo, para exibir uma mensagem AGUARDE enquanto um
processamento longo é executado.
Tipicamente um formulário para ser usado como caixa de mensagem possui as
propriedades:
Propriedade Valor
Modo padrão Formulário simples
Modos permitidos Formulário
Barras de rolagem Nenhum
Seletores de registro Não
Botões de navegação Não
Auto centralizar Sim
Estilo da borda Fino
Caixa de controle Não
Botões Min e Max Ambos desativados
Botão fechar Não
Reprodução proibida
Microsoft© Access Avançado
Existem outros métodos de acesso a banco de dados que não utilizam o Jet Engine.
Somente para citar:
• ODBCDirect
• RDO e RDC
• Chamada à API do OBDC
• ADO (ActiveX Data Objects)
Reprodução proibida
Microsoft© Access Avançado
Os membros de uma coleção, isto é, os objetos, podem ser acessados por um número
índice base-zero. Assim, o primeiro workspace é o Workspaces(0), que é o workspace atual
(aquele que é criado quando você abre o Access). O primeiro database é o Databases(0), que é
o banco de dados atual (o arquivo mdb que está aberto).
Os objetos na hierarquia são identificados por um caminho completo das coleções
acumuladas a que pertencem, usando o ponto (.) para separá-los. Assim, o objeto database que
representa o arquivo mdb no qual você está trabalhando é referido como:
DBEngine.Workspaces(0).Databases(0)
Além do número índice, usa-se uma referência explícita do nome do objeto dentro da
coleção. Por exemplo, um campo CódigoDoLivro é um objeto field dentro de uma coleção
Fields. Se ele for o primeiro campo, ele pode ser referenciado por:
Fields(0)
Ou
Fields(“CódigoDoLivro”)
A maior parte dos objetos de acesso a dados possui uma coleção padrão. Por exemplo,
a coleção padrão de recordset é Fields. Isto permite omitir a coleção da sintaxe.
Que é equivalente a:
intCodigo = rst.Fields!CódigoDoLivro
Ou à:
intCodigo = rst.Fields(“CódigoDoLivro”)
Ou ainda à:
intCodigo = rst.Fields(0)
Note que intCodigo é uma variável do tipo inteiro que armazena o valor do objeto e
não o objeto. Valor é umas das propriedades do objeto.
Reprodução proibida
Microsoft© Access Avançado
Cada objeto pode (e ás vezes deve) ser atribuído à uma variável do mesmo tipo do
objeto.
Neste caso específico, a economia pode ser maior se se usar a função CurrentDb para
retornar o banco de dados atual.
O uso de variáveis simplifica a referência a objetos nas mais baixas níveis da
hierarquia do DAO.
Reprodução proibida
Microsoft© Access Avançado
intCampo = fldCampo1.Value
intCampo é uma variável do tipo inteiro que armazena o valor do objeto e não o
objeto, o qual já é referenciado por fldCampo1. Em vez de usar a propriedade Value, pode-se
simplesmente referenciar diretamente o objeto, omitindo-se a propriedade.
intCampo = rst.Fields(“CódigoDoLivro”)
Para obter os valores dos campos para os demais registros, usa-se o método MoveNext
do objeto recordset. Pode-se, assim, percorrer sequencialmente todo o recordset.
rst.MoveNext
Field Value
Treinar – Cursos de Informática 3274-1222 93
Reprodução proibida
Microsoft© Access Avançado
Vamos tomar como exemplo os conjuntos de registros abaixo para escrever um código
que percorra todos os registros de um recordset e imprima o valor de seus campos .
O primeiro conjunto de registro refere-se à tabela Livros, o segundo à tabela Tópicos,
o terceiro à consulta seleção qryLivros_versus_Tópicos e o quarto à uma consulta gerada em
tempo de execução, através da expressão SQL:
Tabela: Livros
Código do Livro Título Código do Tópico Nome do Editor Preço de
1 Dirk Luchte 5 GGG&G Editora R$23,50
2 Planejando Sua 1 Jean-Paul Deloria R$22,95
3 Diamantes 6 Editora Ramona R$9,95
4 Técnicas de Tai Chi 4 Editora Ramona R$25,95
5 Minha Família 5 Publicações R$17,95
Reprodução proibida
Microsoft© Access Avançado
Comecemos por fazer uma leitura sequencial de cada registro da tabela Livros,
listando os conteúdos dos campos Título e NomeDoEditor.
O primeiro passo, é então criar um objeto database que contenha o banco de dados
atual.
Um objeto recordset tem que ser aberto no banco de dados atual. Assim, vamos
declarar um objeto recordset e usar o método OpenRecordset do objeto database.
Para pegar um determinado campo, poderíamos criar um objeto Field para cada o
campo, uma para Título e outro para o campo NomeDoEditor, mas em vez disto vamos pegar
o valor do próprio objeto Field, explicitando o nome do campo dentro da coleção Fields.
rstTabela.Fields(“Título”)
rstTabela.Fields(“NomeDoEditor”)
O nome do objeto Field deve ser o nome do campo e não a sua legenda. Por isso , está
escrito NomeDoEditor e não Nome do Editor.
Falta ainda criar uma estrutura de repetição do VBA que percorra todo o recordset.
Vamos usar o Do...Loop, com a condição While (enquanto) verificando o fim do de arquivo.
O fim de arquivo pode ser obtido pela propriedade EOF do objeto recordset. A navegação
pelos registros é feita pelo método MoveNext do objeto recordset.
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
Para acessar dados de banco de dados externos, via programação, a forma mais fácil é
vincular as tabelas externas (através do Menu Arquivo|Obter Dados Externos|Vincular) e
acessá-las normalmente pelo método OpenRecordset do Database corrente, pois elas fazem
parte do banco de dados corrente.
O problema da vinculação é que o Access não sabe se o arquivo de origem está onde
deveria estar. Portanto, ou se faz a vinculação toda vez que o aplicativo for aberto, ou se
verifica se o vinculo está ativo e o refaz se necessário.
Fazer a vinculação via programação exige o conhecimento de outros objetos,
propriedades e métodos da DAO.
Sub VinculaBancosExternos()
Dim dbs As Database
Dim tdf As TableDef
End Sub
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida
Microsoft© Access Avançado
tbfs.Delete "Pessoal"
tbfs.Delete "Cargo"
tbfs.Delete "Funcao"
Reprodução proibida
Microsoft© Access Avançado
End If
Err.Clear
Forms![Histórico de Eventos].txtMsg = _
Forms![Histórico de Eventos].txtMsg & "--------------------------" & CRLF
Forms![Histórico de Eventos].txtMsg = _
Forms![Histórico de Eventos].txtMsgtrMsg & "Fim da vinculação"
End Function
A execução desta função vinvula as tabelas e mostra o formulário Histórico de
Reprodução proibida
Microsoft© Access Avançado
Exclusivo é um valor lógico (True ou False que indica se o banco será aberto em modo
exclusivo.
ReadOnly é um valor lógico (True ou False) que indica se o banco será aberto somente
para leitura.
Origem é um string de parâmetros para abrir o banco de dados.
Set dbsCorrente = CurrentDb
Set dbsArq1 = DBEngine.Workspaces(0).OpenDatabase(“C:\Tabelas\Arq1.mdb”)
Set dbsArq2 = DBEngine.Workspaces(0).OpenDatabase(“C:\Sistemas\Arq2.mdb”)
Set dbsArq3 = DBEngine.Workspaces(0).OpenDatabase(“C:\Arq3.mdb”)
Com a abertura de vários objetos Database, você tem acesso a todos os dados destes
bancos de dados (e a objetos, se for banco Access).
Os argumentos Banco e Origem, do método OpenDatabase, e Recordset, do método
OpenRecordset, têm valores específicos para cada tipo de banco de dados. Abaixo estão os
valores para alguns dos mais comuns tipos de banco de dados:
Reprodução proibida
Microsoft© Access Avançado
Reprodução proibida