Escolar Documentos
Profissional Documentos
Cultura Documentos
INDICE
1. INTRODUÇÃO ....................................................................................................................6
1.1. ARQUITETURA DE UMA APLICAÇÃO MS ACCESS...............................................7
EXERCÍCIOS DE FIXAÇÃO – INTRODUÇÃO ............ERRO! INDICADOR NÃO DEFINIDO.
2. PROGRAMAÇÃO NO MS ACCESS ................................................................................9
2.1. MACRO X MÓDULO ..........................................................................................................9
2.2. MÓDULOS .......................................................................................................................11
2.3. QUANDO USAR PROGRAMAÇÃO ......................................................................................12
2.4. MÓDULO PADRÃO ...........................................................................................................13
2.5. MÓDULO DE CLASSE EM FORMULÁRIOS E RELATÓRIOS ...................................................13
2.6. MÓDULO DE CLASSE .......................................................................................................14
2.7. SEÇÃO DE DECLARAÇÕES ................................................................................................15
2.8. SEÇÃO DE PROCEDIMENTOS ............................................................................................15
2.9. O EDITOR DE CÓDIGO ......................................................................................................16
2.9.1. Cores de código ......................................................................................................17
2.9.2. Opções de codificação............................................................................................17
2.9.3. Configurações da janela.........................................................................................18
2.10. JANELAS DO EDITOR DE CÓDIGO DO ACCESS .................................................................18
2.10.1. Janela de Código ..................................................................................................19
2.10.2. Janela Depurar.....................................................................................................19
2.10.3. Janela Pesquisador de Objetos ............................................................................21
PRÁTICA 2 – PROGRAMAÇÃO NO MS ACCESS ..........................................................23
EXERCÍCIO 1 – Criando um módulo padrão..................................................................23
EXERCÍCIO 2 – Criando um módulo de classe em formulário.......................................23
EXERCÍCIOS DE FIXAÇÃO – PROGRAMAÇÃO NO MS ACCESS .. ERRO! INDICADOR
NÃO DEFINIDO.
Reprodução proibida
Microsoft© Access Avançado
INDICE
Reprodução proibida
Microsoft© Access Avançado
INDICE
Reprodução proibida
Microsoft© Access Avançado
INDICE
13. SEGURANÇA.................................................................................................................132
13.1. SENHA DE BANCO DE DADOS ............................................................................132
13.1.1. DEFININDO UMA SENHA PARA O BANCO DE DADOS .............................132
13.1.2. ABRINDO UM BANCO DE DADOS PROTEGIDO POR SENHA....................133
13.1.3. REMOVENDO SENHA DE BANCO DE DADOS .............................................133
13.1.4. DEFININDO SENHA POR CÓDIGO VBA........................................................133
13.1.5. ABRINDO UM BANCO DE DADOS PROTEGIDO VIA CÓDIGO VBA..........134
13.1.6. ALTERANDO A SENHA VIA CÓDIGO VBA.....................................................134
13.2. CRIAÇÃO DE ARQUIVO MDE ..............................................................................135
13.3. CRIPTOGRAFIA DE BANCO DE DADOS.............................................................137
13.3.1. CRIANDO UM ARQUIVO CRITPTOGRAFADO..............................................138
13.3.2. REVERTENDO A CRITPTOGRAFIA ................................................................138
13.3.2. CRIPTOGRAFIA POR CÓDIGO VBA...............................................................138
13.4. SEGURANÇA EM NÍVEL DE USUÁRIO...............................................................138
13.4.1. PROPRIEDADE SOBRE O BANCO DE DADOS E OBJETOS ........................139
13.4.2. IMPLEMENTANDO SEGURANÇA EM NÍVEL DE USUÁRIO........................139
13.4.2. LOGON POR CÓDIGO VBA .............................................................................144
13.4.3. TROCA DE SENHA VIA CÓDIGO VBA............................................................144
13.4.4. RETIRAR PEMISSÃO DE CRIAR NOVOS BANCOS DE DADOS ...................146
13.4.5. RETIRAR PEMISSÃO DE CRIAR NOVAS TABELAS E CONSULTAS.............146
ANEXO A - CONVENÇÃO DE NOMES PARA DESENVOLVIMENTO DE
APLICAÇÕES COM PRODUTOS MICROSOFT ..........................................................147
MICROSOFT ACCESS .....................................................................................................148
Hierarquia dos objetos do Access ..................................................................................148
Tags para objetos da janela de banco de dados do ACCESS ........................................148
Tags para objetos controles do ACCESS .......................................................................148
Tags para variáveis do ACCESS ....................................................................................149
DATA ACCESS OBJECTS - DAO....................................................................................149
Hierarquia dos objetos DAO para Microsoft Jet Workspaces.......................................149
Hierarquia dos objetos DAO para ODBCDirect Workspaces .......................................150
Tags para Data Access Objects - DAO ..........................................................................150
MICROSOFT VISUAL BASIC 5.0 ...................................................................................151
Tags para controles do Visual Basic..............................................................................151
MICROSOFT VISUAL BASIC FOR APPLICATION - VBA ..........................................151
Tags para variáveis do Visual Basic for Application.....................................................151
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
6
Microsoft© Access Avançado
Vários softwares não Microsoft também suportam o VBScript para automatizar tarefas.
7
Microsoft© Access Avançado
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á.
8
Microsoft© Access Avançado
2. PROGRAMAÇÃO NO MS ACCESS
9
Microsoft© Access Avançado
10
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).
Aceita letras maiúsculas e minúsculas indistintamente.
Não pode conter espaços no início do nome
11
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.
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).
12
Microsoft© Access Avançado
2.4. Módulo padrão
Usa-se código em módulo padrão para criar procedimentos globais, isto é, aqueles que
serão usados por todo o aplicativo. Por exemplo, uma função para transformar um número em
extenso pode ser chamada em qualquer do aplicativo..
Os procedimentos armazenados em Módulo Padrão são do tipo Function (aquele que
retorna um valor, por exemplo o fatorial de um número) ou Sub (aquele que não retorna
valor, por exemplo, uma rotina para tratar e imprimir mensagens de erro na tela).
Uma janela de código em módulo padrão possui as características mostradas abaixo.
13
Microsoft© Access Avançado
14
Microsoft© Access Avançado
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.
16
Microsoft© Access Avançado
2.9.1. Cores de código
Por padrão, todo o texto do código é escrito usando a fonte Courier New tamanho 10.
A cor depende do tipo do texto. A cor é definida para o primeiro plano, para o segundo plano
e para o indicador de margem. Indicador margem é um ícone que aparece na margem
esquerda (margin indicator) do código, que serve para fornecer dicas visuais durante a
edição ou execução do código.
Os valores padrão para as opções de Caixa de texto, primeiro plano, segundo plano e
indicador são:
Área de texto 1o plano 2º plano Indicador
Texto normal Preta Branca
Texto de seleção Preta Azul
Texto de erro de sintaxe Vermelha Branca
Texto de ponto de execução Preta Amarela Amarela
Texto de ponto de interrupção Branca Marron Marron
Texto de comentário Verde Branca
Texto de palavra-chave Azul Branca
Texto de identificador Preta Branca
Texto de indicador Preta Branca Azul claro
Texto de retorno de chamada Preta Branca Verde claro
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.
17
Microsoft© Access Avançado
Verificação de sintaxe automática — Determina se o Visual Basic deve verificar
automaticamente a sintaxe correta depois que você inserir uma linha de código.
Solicitar declaração de variável — Determina se declarações de variável explícitas são
exigidas nos módulos. Esta seleção adiciona a instrução Option Explicit às declarações
gerais de todo módulo novo.
Compilar ao ser solicitado — Determina se um projeto está totalmente compilado antes
que ele seja iniciado ou se o código está compilado conforme o necessário, permitindo
que o aplicativo inicie logo.
Listar membros automaticamente — Exibe uma lista que contém informações que
concluiriam logicamente a instrução no ponto de inserção atual. Exemplo.
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:
18
Microsoft© Access Avançado
19
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.
20
Microsoft© Access Avançado
Expandir/reduzir informações hierárquicas.
Redimensionar cabeçalhos de coluna.
Editar valores in loco.
Para executar uma expressão, use o sinal ? seguido da expressão desejada. Por
exemplo, o comando abaixo irá calcular o número inteiro de uma divisão.
? Int(345/7)
21
Microsoft© Access Avançado
elemento específico, visualizar suas definições, obter ajuda sobre ele ou colá-lo em um
módulo.
*****
22
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, "teste"
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]
23
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
Escreva "Não há solução"
Fim Se
Fim algoritmo
24
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.
Option Compare Database
Option Explicit
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
25
Microsoft© Access Avançado
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”.
26
Microsoft© Access Avançado
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.
27
Microsoft© Access Avançado
28
Microsoft© Access Avançado
29
Microsoft© Access Avançado
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()
.
.
Fatorial
.
End Sub
Esquematicamente, a chamada de um procedimento por outro funciona assim:
30
Microsoft© Access Avançado
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
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
31
Microsoft© Access Avançado
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
Dim dblFatP As Double
Dim dblFatNP As Double
Dim dblResultado As Double
dblFatN = Fatorial(N)
dblFatP = Fatorial(P)
dblFatNP = Fatorial(N - P)
dblFatN = Fatorial(intN)
dblFatP = Fatorial(intP)
32
Microsoft© Access Avançado
dblFatNP = Fatorial(intN - intP)
33
Microsoft© Access Avançado
*****
34
Microsoft© Access Avançado
35
Microsoft© Access Avançado
DoCmd.Close
End Sub
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)
36
Microsoft© Access Avançado
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]
37
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.
38
Microsoft© Access Avançado
Mas como a coleção Controls é a coleção padrão do objeto Form, não é necessário
mencioná-lo.
Os objetos possuem várias propriedades, mas uma delas é a propriedade padrão. Por
exemplo, o controle caixa de texto possui a propriedade Text (o conteúdo da caixa de texto)
como padrão. Assim, pode-se omitir esta propriedade.
Forms![frmPedidos]![txtPreçoUnitário].Text = 3.00
equivale a
Forms![frmPedidos]![txtPreçoUnitário] = 3.00
39
Microsoft© Access Avançado
Eis alguns dos eventos de formulário para os quais pode-se definir código:
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.
40
Microsoft© Access Avançado
41
Microsoft© Access Avançado
5. ELEMENTOS DE PROGRAMAÇÃO
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
42
Microsoft© Access Avançado
43
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:
• Podem ter até 255 caracteres.
• Precisam começar com uma letra.
• Podem incluir letras, números ou caracteres sublinhados (_).
• Não podem incluir caracteres de pontuação ou espaços.
• Não podem ser uma palavra reservada do Visual Basic.
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.
44
Microsoft© Access Avançado
5.2. CONSTANTES
Além das constantes que você declara com a instrução Const, o Microsoft Access
declara automaticamente várias constantes intrínsecas e oferece acesso às constantes do VBA
e às constantes de objetos referenciados no código.
Qualquer constante intrínseca pode ser utilizada em uma macro ou no Visual Basic.
Essas constantes estão disponíveis o tempo todo.
As constantes intrínsecas têm um prefixo de duas letras identificando a biblioteca de
objetos que define a constante. As constantes da biblioteca Microsoft Access são iniciadas
com "ac"; as constantes da biblioteca DAO são iniciadas com "db" e as constantes da
biblioteca VBA são iniciadas com "vb". Por exemplo:
acForm
dbAppendOnly
vbCurrency
45
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.
46
Microsoft© Access Avançado
Se o limite inferior de uma dimensão não for explicitada, assume o valor padrão
declarado pela instrução Option Base. Option Base é colocada na seção de declarações do
módulo. Se Option Base for omitido, o limite inferior é 0. Para iniciar em 1, declara-se Option
Base 1. Para explicitar o início em 0, declara-se Option Base 0.
Uma das características do VBA é a declaração de matrizes dinâmicas, ou seja, o
intervalo dos subscritos e o número de dimensões podem ser alterados conforme a
necessidade que surgir durante o processamento.
Matriz dinâmica é declarada sem especificar as dimensões, nem limites.
Você pode também declarar uma matriz dinâmica com Redim, mas neste caso, exige-
se que os subscritos tenham sido definidos. Este tipo de matriz pode ter seus intervalos
alterados (para maior ou menor), mas não se pode alterar o número de dimensões.
47
Microsoft© Access Avançado
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#
5.5.1. For..Next
48
Microsoft© Access Avançado
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."
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
49
Microsoft© Access Avançado
intContador = 0
Do While True
intContador = intContador + 1
if intContador > 10 Then
Exit Do
Endif
Loop
5.5.3. While..Wend
While {condição}
[instruções]
Wend
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.
50
Microsoft© Access Avançado
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
If { condição } Then
[ instruções]
End If
If { condição } Then
[ instruções]
Else
[ instruções]
End If
If { condição } Then
[ instruções]
51
Microsoft© Access Avançado
52
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.
53
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.
54
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.
55
Microsoft© Access Avançado
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.
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:
56
Microsoft© Access Avançado
Níveis de escopo
• Nível de procedimento
• Nivel de módulo
Níveis de visibilidade
• Private
• Public
Sub Teste( )
Dim intK As Integer
57
Microsoft© Access Avançado
58
Microsoft© Access Avançado
6. LINGUAGEM SQL
As consultas criadas na guia Consultas da janela de Banco de Dados nada mais são
que instruções em linguagem SQL. A SQL – Structured Query Language (Linguagem
Estruturada de Consulta) foi desenvolvida pela IBM em meados da década de 10 e
padronizada pela ANSI (o padrão SQL ANSI-92). Fornecedores de software de banco de
dados costumam ter variações do padrão ANSI. A SQL do Microsoft SQL Server é o
Transact-SQL e o da Oracle é o PL/SQL. O Access utiliza uma variação da SQL ANSI,
chamada Microsoft Jet Database Engine SQL.
O Microsoft Jet Database Engine SQL é suportado no Microsoft Access e no
Microsoft Visual Basic.
A criação de consultas no MS Access é facilitada pela existência do modo Estrutura,
uma espécie de editor gráfico que torna a tarefa mais intuitiva e fácil.
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.
59
Microsoft© Access Avançado
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.
61
Microsoft© Access Avançado
SELECT {listadecampos |*} FROM {tabela}
Esta instrução retorna os campos selecionados em listadecampos ou todos os campos
se você utilizar o *. Todos os registros da tabela especificada por tabela são recuperados
porque não há uma cláusula de critério. Os campos são recuperados na ordem em que eles
foram escritos na listadecampos. Os campos são separados por vírgulas. Exemplos:
SELECT * FROM Pedidos
Esta instrução retorna todos os campos e todos os registros da tabela Pedidos.
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]
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]
63
Microsoft© Access Avançado
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
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"
64
Microsoft© Access Avançado
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
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
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)
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]
68
Microsoft© Access Avançado
Você pode usar variáveis em expressão SQL por meio de um artifício, como mostrado
abaixo.
Dim strSql As String
Dim intNumeroPedido As Integer
IntNumeroPedido = InputBox("Qual o número do pedido?")
strSql = "SELECT NúmeroDoPedido, CódigoDoCliente, DataDoPedido, "
strSql = strSql & "DataDeEntrega, DataDeEnvio "
strSql = strSql & "FROM Pedidos WHERE NúmeroDoPedido " & intNumeroPedido
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#
69
Microsoft© Access Avançado
[!] Retorna valores fora do b[!a-m] bx, BW, BV
intervalo A[!0-9] AA, A$, ac, A+
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]
70
Microsoft© Access Avançado
SELECT MIN(DateDiff("d”, DataDoPedido, DataDeEntrega)) AS [Prazo mínimo],
AVG(DateDiff("d”, DataDoPedido, DataDeEntrega)) AS [Prazo Médio],
MAX(DateDiff("d”, DataDoPedido, DataDeEntrega)) AS [Prazo Máximo]
FROM Pedidos
Caso haja tabelas relacionadas, você deve especificar o nome da tabela de onde osz
registros devem ser excluídos. Exemplo:
DELETE [Detalhes do Pedido].*
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CódigoDoProduto = [Detalhes do Pedido].CódigoDoProduto
WHERE Descontinuado
Se a tabela possuir integridade referencial do tipo resctrict, os registros não serão
excluídos. Se a integridade for do tipo cascade, os registros da tabela relacionada também
serão excluídos.
72
Microsoft© Access Avançado
Se definir a lista de campos, cada valor estará associado ao campo na ordem em que
foram digitados na instrução INSERT.
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”.
INSERT INTO Table1 (Matricula, Nome)
VALUES ("0021", "CARLOS KOGA")
A inserção deve respeitar todas as restrições da tabela, tais como unicidade de chave
primária, integridade referrencial, valor requerido, regra de validação, tamanho do campo e
compatibilidade de tipo de dados.
Você pode inserir registros em uma tabela com registros provenientes de outras
tabelas.
INSERT INTO {tabela} IN bancodedadosexterno
(campo1, campo2, campoN, . . .)
SELECT argumentosSelect
73
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
74
Microsoft© Access Avançado
75
Microsoft© Access Avançado
7.2. CAIXA DE DIÁLOGO
Uma caixa de diálogo serve para captar dados que serão enviados como parâmetros de
procedimento, consulta, relatório ou outro formulário.
Antes de explicar como enviar parâmetros, você deve definir as propriedades de um
formulário para desempenhar o papel de caixa de diálogo:
Propriedade do formulário Valor
Guia Formato (Format)
Legenda (Caption) O título da caixa de diálogo
Modo padrão (Default View) Formulário simples (Single form)
Modos permitidos (Views Allowed) Formulário (Form)
Barras de rolagem (Scroll bars) Nenhuma (Neither)
Seletores de registro(Record Selectors) Não (No)
Botões de navegação (Navigation Buttons) Não (No)
Linhas divisórias (Dividing Lines) Não (No)
AutoCentralizar (Auto Center) Sim (Yes)
Estilo da vorda (Border Style) Diálogo (Dialog)
Botões Min Max (Min Max Buttons) Nenhum (None)
Guia Dados (Data)
Origem do registro (RecordSource) Vazio
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
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.
76
Microsoft© Access Avançado
7.2.1. Passagem De Parâmetros Para Procedimento
Esta é a técnica mais simples. O procedimento chamado pelo formulário pode ser Sub
ou Function definido em módulo atrás do formulário (módulo de classe de formulário) ou em
módulo padrão. O evento AoClicar do botão cmdOk fará a chamada do procedimento
enviando o valor do controle como argumento do procedimento.
Private Sub cmdOk_Click()
Dim curValor As Currency
Dim strExtenso As String
curValor = Me.txtValor
strExtenso = Extenso(curValor)
End Sub
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
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.
77
Microsoft© Access Avançado
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.
Às vezes precisamos de relatórios mais flexíveis, como por exemplo, emitir os pedidos
feitos entre duas datas. Precisamos passar a data inicial e a data final para a origem dos dados
(normalmente uma consulta seleção).
Uma alternativa de solução é criar uma consulta parametrizada, passando parâmetros
pelo formulário. O relatório então se baseará nesta consulta.
Por exemplo, o formulário frmDlg_Relatorio_Pedido contém as caixas de texto não
acopladas txtDataInicial e txtDataFinal. Estes controles são parâmetros para a consulta
qryRelatorio_Pedido.
78
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
Visivel (Visible) Sim (Yes)
Parada de tabulação (Tab Stop) Não (No)
79
Microsoft© Access Avançado
strDataInicial = Me.txtDataInicial
strDataFinal = Me.txtDataFinal
Me.txtSql = strSql
DoCmd.OpenReport "rptRelatorio_Pedido", acViewPreview
End Sub
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
82
Microsoft© Access Avançado
Suponha que você tenha que abrir o formulário frmClientes e queira posicionar no
registro referente ao cliente ANTON. Construa um procedimento que abra o formulário
frmClientes, passando “ANTON” como argumento. Aqui, o procedimento chama-se
AbreCliente.
Sub AbreCliente()
DoCmd.OpenForm "frmClientes", , , , , , "ANTON"
End Sub
83
Microsoft© Access Avançado
85
Microsoft© Access Avançado
strSql = "SELECT [Detalhes do Pedido].NúmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreçoUnitário , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreçoUnitário]-[Detalhes do
Pedido].[PreçoUnitário]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CódigoDoProduto = [Detalhes do
Pedido].CódigoDoProduto WHERE False"
Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
Me.subfrmDetalhes_Pedido.Requery
Me.txtTotal = 0
Me.txtRegistros = 0
Me.cboNumeroPedido = ""
Me.cmdExportToExcel.Enabled = False
End Sub
88
Microsoft© Access Avançado
8. ACESSO A BANCO DE DADOS
O acesso a banco de dados no Access usa o modelo DAO – Data Access Object e o
mecanismo Jet (Jet Engine).
O DAO é um conjunto de classes de objetos que modela a estrutura de um sistema de
banco de dado relacional. Eles oferecem propriedades e métodos que lhe permitem realizar
todas as operações necessárias para gerenciar tal sistema, incluindo recursos para criar banco
de dados, definir tabelas, campos e índices, establecer relações entre tabelas, navegar e
consultar o banco de dados, e assim por diante.
O Jet Engine traduz estas operações de objetos de acesso a dados em operações físicas
sobre os próprios arquivos de banco de dados, tratando toda a mecânica da interface com os
diferentes bancos de dados suportados.
O Visual Basic, por meio do DAO e do Jet Engine reconhece três categorias de bancos
de dados:
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)
89
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”)
90
Microsoft© Access Avançado
8.3. Coleção Padrão
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.
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.
91
Microsoft© Access Avançado
Um dos princípios da orientação a objeto é manter dados e procedimentos de um
objeto dentro do próprio objeto. Os dados dos objetos são chamados de propriedades
enquanto que os procedimentos chamam-se métodos.
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
92
Microsoft© Access Avançado
Field Value
Recordset !{nome do campo}
Fechar arquivo de CLOSE Recordset Close
dados
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
93
Microsoft© Access Avançado
5 Minha Família 5 Publicações R$17,95
Tabela: Tópicos
Código do Tópico Tópico
1 Negócios
2 Psicologia
3 Ciência
4 Saúde
5 Ficção
6 Romance
7 Técnico
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.
94
Microsoft© Access Avançado
Set dbsBancoAtual = CurrentDb
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.
95
Microsoft© Access Avançado
No exemplo anterior a origem dos dados é uma tabela (vinculada ou não) do banco de
dados corrente, ou seja, do banco de dados onde o programa está sendo executado. Em certos
casos é necessário obter dados (ou objetos) que estão em outros bancos de dados Access ou de
banco de dados ISAM ou ODBC.
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.
96
Microsoft© Access Avançado
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
Function VinculaTabelas()
Dim tbfs As TableDefs
Dim tbf As TableDef
Dim strMsg As String
Dim CRLF As String
tbfs.Delete "Pessoal"
tbfs.Delete "Cargo"
tbfs.Delete "Funcao"
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
99
Microsoft© Access Avançado
Com uma tabela vinculada, além de poder abrir um recordset via programa, você pode
abrí-la normalmente no modo folha de dados ou ainda criar consultas, formulários e
relatórios com base na tabela.
Se o seu caso é simplesmente abrir uma tabela externa via programação, não há
motivo para vinculá-la. Basta abrí-la diretamente.
Para abrir diretamente as tabelas, sem vinculação, lembre-se que cada arquivo externo
é um objeto Database. Portanto, basta declarar as variáveis deste tipo, na quantidade
necessária. Vamos supor que além do banco corrente, queira-se objetos de outros três bancos
Access.
Para abrir o banco corrente pode-se usar a função CurrentDb ou toda a referência de
seus objetos pais DBEngine.Workspaces(0).Database(0).
Para abrir bancos de dados externos, usa-se o método OpenDatabase do objeto
Workspace, cuja sintaxe é:
100
Microsoft© Access Avançado
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:
101
Microsoft© Access Avançado
Set dbsExcel = DBEngine.Workspaces(0).OpenDatabase(“C:\Sheets\Venda.xls”, _
False, False, “Excel 8.0;”)
Set rst = dbsExcel.OpenRecordset(“Plan3$A1:F7”)
102
Microsoft© Access Avançado
9. ACESSO A ARQUIVOS E IMPRESSORA
O acesso a banco de dados Access, ISAM ou ODBC, via DAO e Jet Engine, substitui
o tradicional acesso a arquivos seqüenciais e randômicos. Apesar disso, o Access não
eliminou este tipo de acesso.
Não tem muito sentido apresentar o acesso a dados em arquivos, uma vez que a
maioria das necessidades é atendida por banco de dados. Porém pode-se usar o acesso a
arquivos para outros fins, tal como direcionar a saída para disco ou diretamente para a porta
da impressora local.
Uma utilidade para a gravação da saída em disco é a monitoração, através de log em
arquivo texto, de alguns acontecimentos importantes que ocorreu no aplicativo, tal como um
erro fatal. Por exemplo, o aplicativo falhou ao tentar abrir um banco de dados .mdb que não se
encontrava mais no disco. Com certeza, este erro será tratado por uma rotina de erro (ver
tópico Tratamento de Erro) que gerará uma caixa de mensagem na tela. Porém a mensagem é
apresentada ao operador, que esqueceu-se de anotá-la. Se esta mensagem for também gravada
para o disco , o programador pode posteriormente abrir o arquivo e identificar o erro e em que
linha de programa ele ocorreu.
Para mostrar o acesso a arquivo, mostrarei um exemplo que gerará um relatório para
disco, em formato ASCII, para ser impresso em uma impressora matricial em modo texto.
Close #1
rst.Close
O resultado deste código, o arquivo SAIDA.TXT, pode ser aberto no Notepad. Numa
sessão DOS, este arquivo pode ser enviado para uma impressora matricial em modo texto
(type saida.txt > prn: ). Isto significa que a impressão será rápida, pois não usa as fontes do
Windows.
103
Microsoft© Access Avançado
Close #1
rst.Close
104
Microsoft© Access Avançado
10. TRATAMENTO DE ERRO
Há três tipos de erros.
• Erro lógico
• Erro em tempo de compilação
• Erro em tempo de execução
Erro lógico é quando o aplicativo não funciona como se esperava. Por exemplo,
esquecer-se de zerar um contador leva a um erro lógico. Este tipo de erro só pode ser
corrigido pelo próprio programador.
Erros em tempo de compilação ocorrem como resultado da construção incorreta de
código. Você pode ter esquecido de balancear pares de instruções (como If e End If ou For e
Next) ou pode ter cometido um erro de programação que viola as regras do Visual Basic
(como um erro de ortografia, omissão de um separador ou um erro de digitação).
Erros em tempo de compilação também incluem erros de sintaxe, que são erros de
gramática ou pontuação. Isso inclui parênteses mal emparelhados ou um número incorreto de
argumentos passados para uma função.
Erro em tempo de compilação ocorre também quando se usam funções definidas pelo
usuário que não existem ou estão fora do escopo, quando se usam objetos de uma biblioteca
não referenciada (ver Referência a Biblioteca de Objetos mais adiante) e quando de usa
variáveis não declaradas (desde que Option Explicit esteja ativada).
O erro por falta de referência a objetos nem sempre pode ser verificado antes de
executar o programa, pois um objeto pode ser criado em tempo de execução (ver Automação
mais adiante) e não há como o Access verificar se as propriedades e métodos são suportados
pelo objeto. Neste caso, é um erro em tempo de execução.
Para verificar a existência de erro de compilação, execute Compilar módulos
carregados no menu Depurar de uma janela de módulo.
Erro em tempo de execução é algo inesperado que ocorre quando o programa está
sendo executado. Por exemplo, tentar abrir um banco de dados em modo exclusivo quando
um outro usuário já o fez ou dividir um número por uma variável que contém zero.
Normalmente, um erro em tempo de execução suspende o programa. Na suspensão, a
janela de módulo é a aberta, a linha onde ocorreu o erro fica iluminada e mensagem de erro
aparece para se optar por depurar o programa ou encerrá-lo.
105
Microsoft© Access Avançado
Esta situação não é boa, não só porque o programa falha, mas porque o usuário tem
acesso ao código fonte do programa (lembre-se que o Access não é um compilador que gera
um programa executável).
O erro em tempo de execução pode ser tratado dentro do próprio programa,
melhorando a forma como o programa seja abortado, ou, conforme a gravidade do erro, até
mesmo corrigindo o erro e impedindo que o programa seja interrompido.
O tratamento de erro em tempo de execução é implementado com a instrução On
Error. Esta instrução permite duas formas de tratamento:
• Desviar o programa para uma rotina de tratamento de erro
• Prosseguir a execução na linha posterior ao do erro
Para o primeiro caso usa-se On Error GoTo rótulo, onde rótulo é uma marca para
fragmento de código dentro do próprio procedimento. Este código pode:
• Tratar o erro e terminar o programa
• Tratar o erro e voltar à execução na mesma linha do erro
• Tratar o erro e voltar à execução na linha seguinte à linha de erro
• Tratar o erro e desviar a execução para outro rótulo.
A rotina de tratamento de erro faz uso do objeto Err, que tem duas propriedades
importantes> o número do erro (Number) e a sua descrição (Description).
Sub MostraErro()
On Error GoTo Trata_Erro
Open “c:\teste.txt” For Input As #1
Close #1
Exit Sub
Trata_Erro:
‘ Erro 53 File not found
MsgBox Err.Number & “- “ & Err.Description
End Sub
Note que foi preciso colocar Exit Sub para que o código de tratamento de erro, no
rótulo Trata_Erro, não seja executado em situação sem erro. Note também, que após reportar
o erro, o programa segue o fluxo normal e pára, já que encontra End Sub.
Sub VoltaNaLinhaDoErro()
On Error GoTo Corrige_Erro
106
Microsoft© Access Avançado
Open “c:\teste.txt” For Output As #1
Kill “c:\teste.txt”
Exit Sub
Corrige_Erro:
If Err.Number = 55 ‘ File alredy open
Close #1
Resume
End If
End Sub
Neste caso o erro ocorre porque tenta-se apagar um arquivo que ainda está aberto. A
rotina de tratamento de erro pode corrigir a situação de erro e retornar o fluxo de programa na
mesma linha onde o erro ocorreu.
Sub VoltaNaProximaLinha()
Dim blnArquivoExiste As Boolean
Corrige_Erro:
If Err.Number = 53 ‘ File not found
Resume Next
End If
End Sub
Sub DesviaParaUmRotulo()
On Error GoTo Corrige_Erro
Fim:
MsgBox “O arquivo C:\teste.txt não existe. ” & _
“Irei criá-lo vazio para as próximas execuções!”
Open “c:\teste.txt” For Output As #1
Close #1
Exit Sub
107
Microsoft© Access Avançado
Corrige_Erro:
If Err.Number = 53 ' File not found
Resume Fim
End If
End Sub
Sub DesvinculaTabelas()
On Error Resume Next
CurrentDb.TableDefs(“Pessoal”).Delete
CurrentDb.TableDefs(“Cargo”).Delete
CurrentDb.TableDefs(“Funcao”).Delete
End Sub
On Error Resume Next pode ser usado para tratar o erro imediatamente após a sua
ocorrência, sem desviar para um rótulo.
Sub TrataErroImediatamente()
Dim obj As Object
End Sub
108
Microsoft© Access Avançado
À vezes ocorre um erro persistente, difícil de ser solucionado, para o qual são
necessários executar o programa passo-a-passo, interromper o programa para verificar o
conteúdo das variáveis e prosseguir o programa a partir da interrupção.
Para parar o programa em pontos críticos, podem ser colocados um ou mais Pontos de
Interrupção (tecla F9 põe e tira pontos de interrupção). Nestes pontos o programa é
interrompido e a janela do módulo é aberta. Pode-se então prosseguir com a tecla F8, para
executar o programa passo-a-passo ou F5 para continuar normalmente até outro ponto de
interrupção ou até o fim do programa.
Durante a interrupção, pode-se abrir a janela Depurar (Control G) e verificar o valor
das variáveis ou executar um comando interativamente, inclusive alterando o valor de
algumas variáveis.
109
Microsoft© Access Avançado
110
Microsoft© Access Avançado
11. AUTOMAÇÃO
A automação (antigamente chamada de Automação OLE) é um recurso do COM
(Component Object Model), um padrão da indústria de informática utilizado pelos aplicativos
para expor os seus objetos a ferramentas de desenvolvimento, linguagens de macro e a outros
aplicativos que suportam automação. Por exemplo, um aplicativo de planilha pode expor uma
planilha, gráfico, célula ou intervalo de células— como diferentes tipos de objetos. Um
processador de textos pode expor objetos como um aplicativo, um documento, um parágrafo,
uma frase, um indicador ou uma seleção.
Quando um aplicativo suporta automação, os objetos expostos por ele podem ser
acessados pelo Visual Basic. Para manipular esses objetos no Visual Basic, execute métodos
sobre o objeto ou obtenha e defina as propriedades do objeto. Por exemplo, você pode criar
um objeto de automação nomeado MyObj e gravar o código apresentado a seguir para acessá-
lo:
GetObject([pathname] [, class])
Pathname Opcional; Variant (String). Indica o caminho completo e nome do arquivo que
contém o objeto a ser recuperado. Se pathname for omitido, class passa a ser
obrigatório.
class Opcional; Variant (String). Uma seqüência de caracteres que representa a classe
do objeto.
Parte Descrição
nomedoaplic Obrigatória; Variant (String). Nome do aplicativo que fornece o objeto.
tipodeobjeto Obrigatória; Variant (String). Tipo ou classe do objeto a ser criado.
112
Microsoft© Access Avançado
Hierarquia dos Objetos do Microsoft Word
113
Microsoft© Access Avançado
114
Microsoft© Access Avançado
115
Microsoft© Access Avançado
116
Microsoft© Access Avançado
Para criar uma instância do objeto Excel, usa-se a função CreateObject() do VBA.
Exemplo:
Sub InstanciaExcel()
Dim xls As Excel.Application
Para termos uma janela do Excel com um workbook, temos que acrescentar uma linha
de código, invocando o método Add da coleção Workbooks.
Sub InstanciaExcel()
Dim xls As Excel.Application
xls.Workbooks(1) ou
xls.Workbooks(“Book1”)
118
Microsoft© Access Avançado
Note que a referência deve seguir a hierarquia dos objetos. Primeiro Application,
seguida de Workbooks.
Sub InstanciaExcel()
Dim xls As Excel.Application
xls.Workbooks(1).Worksheets(1).Range("A1") = 4
xls.Workbooks(1).Worksheets(1).Range("B1") = 6
xls.Workbooks(1).Worksheets(1).Range("C1") = "=A1 + B1"
lngLine = 1
Do While Not rstPessoal.EOF
xlsPlan.Application.Cells(lngLine, 1) = rstPessoal.Fields(“Matricula”)
xlsPlan.Application.Cells(lngLine, 2) = rstPessoal.Fields(“Nome”)
xlsPlan.Application.Cells(lngLine, 3) = rstPessoal.Fields(“CodOrgao”)
xlsPlan.Application.Cells(lngLine, 4) = rstPessoal.Fields(“CodCargo”)
xlsPlan.Application.Cells(lngLine, 5) = rstPessoal.Fields(“CodFuncao”)
rstPessoal.MoveNext
lngLine = lngLine + 1
Loop
xlsPlan.SaveAs ("C:\Pessoal.xls")
rstPessoal.Close
Set xlsPlan = Nothing
119
Microsoft© Access Avançado
intLinha = 2
Do While Not rst.EOF
' Insere os valores de cada coluna
For intColuna = 1 to rst.Fields.Count
xls.Cells(intLinha,intColuna) = rst.Fields(intColuna – 1)
Next
intLinha = intLinha + 1
rst.MoveNext
Loop
xls.Range("A1:D5").Select
xls.Charts.Add
xls.ActiveChart.ChartType = -4100
xls.ActiveChart.SetSourceData xls.Worksheets("Plan1").range("A1:D5"), 2
xls.ActiveChart.Location 1
With xls.ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Consumo por Regiao"
.Axes(1).HasTitle = True
.Axes(1).AxisTitle.Characters.Text = "Produtos"
.Axes(3).HasTitle = True
.Axes(3).AxisTitle.Characters.Text = "Regiao"
.Axes(2).HasTitle = False
End With
xls.ActiveWindow.SelectedSheets.PrintOut Copies:=1
Neste exemplo, xls é um objeto Application, que possui as propriedades Cells, Range (retorna
o objeto Range), ActiveChart (que retorna o objeto Chart atual) e ActiveWindow (que
retorna o objeto Window atual) e as coleções Workbooks e Charts.
120
Microsoft© Access Avançado
O código a seguir possibilita inserir os dados dos eventos de cursos em um arquivo do Project
e imprimir o gráfico de Gantt, automaticamente.
121
Microsoft© Access Avançado
Dim rst As Recordset
Dim intI As Integer
prjApp.filenew
prjApp.FileSaveas "C:\Temp\cursos.mpp"
prjApp.fileprint 1, 1, False, False, 1, Null, Null, True, False, False
prjApp.Quit
122
Microsoft© Access Avançado
Hierarquia dos Objetos do Schedule+ 7.0
O exemplo a seguir mostra como criar um novo compromisso (Almoço), que iniciar-
se-á na data/hora do sistema operacional e durará 1 hora. Este exemplo pode ser aperfeiçoado,
integrando a automação com o Project, para criar compromissos para o instrutor do curso.
123
Microsoft© Access Avançado
124
Microsoft© Access Avançado
125
Microsoft© Access Avançado
12. CHAMADA À API DO WINDOWS 95
A API (Application Programming Interface) do Windows consiste de um conjunto de
bibliotecas de vínculo dinâmico (DLLs) ou arquivo de recursos (EXEs) contendo
procedimentos relacionados ao sistema operacional que incluem funções, mensagens,
estruturas de dados, tipos de dados e instruções que você pode usar na criação de aplicativos a
serem executados sob o Windows 95. Para chamar esses procedimentos a partir do Visual
Basic, você precisa primeiro declará-los usando uma instrução Declare. Você pode então
chamá-los como faria com qualquer outro procedimento.
A instrução Declare possui a seguinte sintaxe:
126
Microsoft© Access Avançado
Parte Descrição
Optional Indica que um argumento não é obrigatório. Se usada, todos os
argumentos subseqüentes na listadeargumento devem ser opcionais e
declarados pelo uso da palavra-chave Optional. Todos os argumentos
Optional devem ser Variant. Optional não poderá ser usada por
nenhum argumento se ParamArray for usada.
ByVal Indica que o argumento é passado por valor.
ByRef Indica que o argumento é passado por referência.
ParamArray Usada apenas pelo último argumento em listadeargumento para indicar
que o argumento final é uma matriz Optional de elementos Variant. A
palavra-chave ParamArray permite fornecer um número arbitrário de
argumentos. Não pode ser usada com ByVal, ByRef ou Optional.
nomedavariáv Nome da variável que representa o argumento que está sendo passado
ao procedimento; segue convenções de nomenclatura padrão de
variável.
tipo Tipo de dados do argumento passado ao procedimento; pode ser Byte,
Boolean, Integer, Long, Currency, Single, Double, Date, String
(apenas de comprimento flexível), Object, Variant, um tipo definido
pelo usuário ou um tipo de objeto.
Para usar a API, simplesmente saber a sintaxe não significa muito. É preciso saber:
• os nomes dos procedimentos embutidos
• em quais arquivos de biblioteca os procedimentos se encontram
• quais os argumentos devem ser passados
• quais os valores que os argumentos devem receber
Função Declaração
Beep Declare Function Beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As
Long, ByVal dwDuration As Long) As Long
CharLower Declare Function CharLower Lib "user32" Alias "CharLowerA" (ByVal lpsz
As String) As String
GetOpenFileN Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
ame "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
GetSaveFileN Declare Function GetSaveFileName Lib "comdlg32.dll" Alias
ame "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Observação importante: As declarações das funções devem ser escritas seguindo fielmente a
tabela acima. Os nomes são sensíveis à caixa.
127
Microsoft© Access Avançado
As funções Beep e CharLower não apresentam problema para identificar os valores
que os argumentos devem receber. Os exemplos abaixo demonstram isto.
Option Explicit
Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, _
ByVal dwDuration As Long) As Long
Function Som()
Dim lngSom As Long
lngSom = Beep(500, 200)
lngSom = Beep(370, 100)
End Function
Function CaixaBaixa()
Dim str as String
str = CharLower(“CAIXA ALTA”)
MsgBox str
End Function
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As
128
Microsoft© Access Avançado
Os exemplos dessas duas funções, apresentados adiante, só foram possíveis graças ao
aplicativo Solutions, que acompanha o Access .
A função GetOpenFileName abre uma caixa de diálogo do tipo “Abrir”, retornando um valor
lógico que indica se o usuário clicou no botão Abrir (true) ou no Cancelar (false). O nome do
arquivo é armazenado no elemento lpstrFile de OPENFILENAME.
Function CaixaDialogo_Open( )
Dim of As OPENFILENAME
Dim blnAbriu As Boolean ' Verifica se o usuário abriu ou cancelou.
' Poderia ser o retorno da função.
Dim strTitulo as String ' Título da caixa de diálog. Poderia ser um
' argumento
Dim strFiltro As String ' Filtro para o tipo de arquivo. Também
' poderia ser um argumento
Dim strDirInicial As String ´Diretório inicial. Idem
of.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
129
Microsoft© Access Avançado
of.lCustrData = 0
of.lpstrFilter = strFiltro
of.nFilterIndex = 0
of.lpstrFile = String$(512, 0)
of.nMaxFile = 511
of.lpstrFileTitle = String$(512, 0)
of.nMaxFileTitle = 511
of.lpstrTitle = "Teste"
of.lpstrInitialDir = strDirInicial
of.lpstrDefExt = ""
of.flags = 0
of.lStructSize = Len(of)
blnAbriu = GetOpenFileName(of)
Function CaixaDialogo_Save( )
Dim of As OPENFILENAME
Dim blnSalvou As Boolean ' Verifica se o usuário salvou ou cancelou.
' Poderia ser o retorno da função.
Dim strTitulo As String ' Título da caixa de diálog. Poderia ser um
' argumento
Dim strFiltro As String ' Filtro para o tipo de arquivo. Também
' poderia ser um argumento
Dim strDirInicial As String 'Diretório inicial. Idem
Dim strNomeArq As String 'Nome sugerido para salvar. Idem
Dim strExtensaoDefault As String ' Extensão default. Idem
of.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
of.lCustrData = 0
of.lpstrFilter = strFiltro
of.nFilterIndex = 0
of.lpstrFile = strNomeArq & String$(512 - Len(strNomeArq), 0)
of.nMaxFile = 511
of.lpstrFileTitle = String$(512, 0)
of.nMaxFileTitle = 511
of.lpstrTitle = strTitulo
of.lpstrInitialDir = strDirInicial
of.lpstrDefExt = "txt"
of.flags = 0
of.lStructSize = Len(of)
blnSalvou = GetSaveFileName(of)
130
Microsoft© Access Avançado
End Function
131
Microsoft© Access Avançado
13. SEGURANÇA
Antes de construir um aplicativo Access, você deve ter em mente que níveis de
segurança que o aplicativo deve atender. É mais construir um aplicativo com a segurança já
definida desde o início que definí-la após o aplicativo estiver pronto.
A segurança visa proteger os dados contra leitura de informações confidenciais,
alteração indevida, inclusão e exclusão de registros por pessoa não autorizada. A segurança
protege também a estrutura dos objetos e o acesso ao código-fonte dos módulos.
Existem várias formas de segurança:
Senha de banco de dados: É a forma mais simples de proteger um banco de dados. Uma
vez definida a senha, uma caixa de diálogo solicita a entrada da senha. Todos os dados e
estruturas são acessíveis por quem informar a senha correta.
Criação de arquivo MDE: Cria uma cópia do banco de dados, com extensão .MDE, o que
torna impossível visualizar, criar ou alterar código VBA. Impede também a criação e
alteração de formulários e relatórios.
Criptografia: Torna a leitura dos dados impossível através de um processador de texto ou
outra ferramenta de acesso a disco. Abrindo o banco de dados no próprio Access, a
criptografia é imperceptível, a não ser a perda de desempenho de 10 a 15%.
Segurança em nível de usuário: Define permissões de leitura, gravação e alteração de
estrutura por objeto e usuário (ou grupo de usuários). É a forma mais completa de
segurança.
Para definir uma senha para o banco de dados, o arquivo MDB que você quer proteger
deve estar em uso.
1) Antes de definir uma senha, faça uma cópia de segurança do banco de dados que você
quer proteger.
2) Se você trabalha em rede, assegure-se que ninguém mais esteja com o banco de dados em
uso.
3) Abra o banco de dados no modo exclusivo. Na caixa de diálogo Abrir, acionada pelo
menu Arquivo|Abrir banco de dados…, há uma caixa de verificação Exclusivo.
4) A senha para um banco de dados é feita pelo menu Ferramentas|Segurança|Definir
senha do banco de dados…. Ao acionar o menu, será aberta a seguinte caixa de diálogo.
Digite a senha, confirme e clique Ok
132
Microsoft© Access Avançado
Observações:
Você pode definir uma senha de até 14 caracteres, entre letras, números e caracteres
especiais. A senha é sensível a letras maiúsculas e minúsculas.
Guarde a senha e a cópia de segurança do banco de dados em lugar seguro, pois em caso
de esquecimento, é impossível descobrí-la.
Se você pretende replicar seu banco de dados, não configure senha de banco de dados,
pois a replicação não funciona em banco de dados protegidos por senha.
Ao abrir um banco de dados protegido por senha, uma caixa de diálogo solicitará a
senha.
Caso a senha esteja correta, o banco de dados é aberto normalmente, com acesso a
todos os dados e objetos.
Após ter aberto o banco de dados com a senha correta e no modo exclusivo, você pode
remover a senha e voltar o banco de dados à situação normal.
Num banco de dados protegido por senha, o menu Ferramentas|Segurança|Definir
senha do banco de dados… passa a ser Ferramentas|Segurança|Desproteger senha do
banco de dados…. Ao acionar este menu, será pedida novamente a senha e o banco de dados
é então desprotegido.
133
Microsoft© Access Avançado
Você pode definir uma senha do banco de dados por código VBA, utilizando os
objetos do DAO. O método para definir a senha é NewPassword do objeto Database. O
código não pode ser escrito no mesmo banco de dados o qual se deseja proteger.
Sub SetDBPassword()
' Declara a variável do objeto database.
Dim dbs As Database
Para abrir um banco de dados protegido via código VBA, utilize o método
OpenDatabase.
Sub OpenProtectedDB()
' Declara a variável do objeto database.
Dim dbs As Database
End Sub
Você pode também alterar a senha via código usando o método NewPassword do
objeto Database. O código não pode ser escrito no mesmo banco de dados o qual se deseja
trocar a senha.
Sub ChangeDBPassword()
' Declara a variável do objeto database.
Dim dbs As Database
134
Microsoft© Access Avançado
Você pode criar um arquivo de extensão .MDE a partir de um arquivo .MDB. Não é
preciso que o banco de dados .MDB esteja em uso.
Num arquivo MDE todas as estruturas de formulários, relatórios e módulos ficam
ocultas e inacessíveis. Você não pode criar novos formulários, relatórios e módulos, nem
exportar estes objetos, nem importar estes objetos de outros banco de dados .MDE.
Entretanto, tabelas, consultas e macros permanecem acessíveis e podem ser importados e
exportados.
Se você alterar seu banco de dados original, deve criar novamente um arquivo .MDE.
Mantenha sempre uma cópia de segurança do banco de dados original, pois não é possível
desfazer um arquivo .MDE.
Arquivos MDE são ideais para a distribuição da sua aplicação front-end, isto é, um
banco de dados de extensão MDE possui as consultas, formulários, relatórios, macros e
módulos que acessam outros bancos de dados que contêm as tabelas.
Arquivos .MDB
Aplicativo Tabelas
Tabelas
1) Antes de criar um arquivo .MDE, faça uma cópia de segurança do banco de dados
original.
2) Se você trabalha em rede, assegure-se que ninguém mais esteja com o banco de dados em
uso.
3) Acione o menu Ferramentas|Utilitários de banco de dados|Criar arquivo MDE …
4) Na caixa de diálogo “Salvar banco de dados como MDE”, escolha o banco de dados
original e clique no botão Criar MDE.
5) Na caixa de diálogo “Salvar como MDE”, escolha o nome do novo arquivo e clique no
botão Criar.
Se o banco de dados original fizer referência a outros bancos de dados MDB ou banco
de dados de suplemento (.MDA), estes devem também ser convertidos para MDE, na ordem
em que eles são referenciados. Por exemplo, se o seu banco de dados db3.mdb referencia
db2.mdb que por sua vez referencia db1.mda, a ordem deve ser db1.dba, db2.mdb e db3.mdb.
135
Microsoft© Access Avançado
Para um bom nível de segurança, defina senhas para o banco de dados do aplicativo
(extensão MDE) e para cada banco de dados de tabelas (extensão MDB). Dentro do código do
aplicativo, vincule as tabelas necessárias via código VBA, passando a senha. Como o código
do aplicativo ficará inacessível, a senha ficará a salvo no código. Desta forma, as tabelas
também ficam protegidas contra alteração de estrutura, já que tabelas vinculadas não podem
ter suas estruturas alteradas.
Eis um código VBA para vincular uma tabela de uma banco de dados protegido por
senha.
Sub LinkTable()
Dim dbs As Database
Dim tdfs As TableDefs
Dim tdf As TableDef
End Sub
Nesta configuração, os dados das tabelas ainda ficam vulneráveis à alteração, assim
como as estruturas das consultas. Os dados somente podem ser protegidos com a segurança
em nível de usuário. Quanto as consultas, você pode minimizar o problema com as seguintes
recomendações:
Sub DeleteCliente()
Dim strSql As String
A criptografia protege o banco de dados contra acesso a seus dados via um editor de
texto ou outra ferramenta de acesso a disco. Ela deve ser usada juntamente com a senha de
banco de dados, pois se alguém abrir um banco de dados diretamente pelo Access, a
criptografia não tem efeito nenhum.
Note a ao abrir o banco de dados Northwind.mdb, pelo Wordpad, dados podem ser
lidos.
137
Microsoft© Access Avançado
A criptografia é um processo reversível. Você pode criptografar um banco de dados e
depois decriptografá-lo.
Sub EncryptDb()
DBEngine.CompactDatabase "C:\bd1.mdb", "C:\db1Cripto.mdb", _
dbLangGeneral, dbEncrypt
End Sub
As permissões são definidas para cada usuário (chamada permissão explícita) ou para
grupo de usuários (chamada permissão implícita). Neste último caso, os usuários membros do
grupo herdam as permisssões do grupo. As definições das permissões ficam armazenadas em
um arquivo de informação de grupo de trabalho, de extensão .MDW.
Por padrão, o arquivo de informação de grupo de trabalho é o SYSTEM.MDW e
existem dois grupos pré-definidos:
Administradores (Admins, na versão em inglês)
Usuarios (Users, na versão em inglês)
139
Microsoft© Access Avançado
Crie um novo arquivo de informação de grupo de trabalho.
1) Clique no atalho para o “Administrador de grupo de trabalho do MS Access”. Surgirá a
caixa de diálogo a seguir:
3) Surgirá uma caixa de diálogo para definir o proprietário do grupo de trabalho. Guarde
bem as informações, incluindo se as letras estão em maiúsculas ou minúsculas.
4) Ao clicar OK, surgirá uma caixa de diálogo para o nome e localização do novo arquivo de
informação de grupo de trabalho.
140
Microsoft© Access Avançado
5) Ao clicar OK, uma caixa de diálog surgirá confirmando o novo arquivo de informação de
grupo de trabalho. Ao abrir o Access, todos os bancos de dados utilizarão o novo arquivo
para a segurança em nível de usuário.
Observação: Você pode pensar em simplesmente criar um arquivo MDW a partir de uma
cópia do system.mdw. Este método não funciona, pois cada arquivo tem uma identificação
única, formada pelo Nome, Empresa e Código do grupo de trabalho.
141
Microsoft© Access Avançado
142
Microsoft© Access Avançado
3) Mude para listar Grupos e selecione o grupo Usuários. Na caixa de combinação Tipo de
objeto, altere para “banco de dados”, retire todas as pemissões e clique no botão Aplicar.
4) Na caixa de combinação Tipo de objeto, altere para cada tipo de objeto e retire todas as
pemissões. Clique no botão Aplicar antes de mudar de tipo de objeto.
5) Clique Ok.
Observação: Ao retirar a senha do usuário Administrador, o Access não mais pedirá senha de
logon, e todos os usuários se logarão como Administrador. Como este usuário não tem
143
Microsoft© Access Avançado
nenhuma permissão, ele nada poderá fazer, a não ser que o grupo Usuários tenha alguma
permissão. Você pode definir algumas permissões básicas para o usuário Administrador.
Não é aconselhável eliminar a senha do usuário Administrador.
Ao definir segurança em nível de usuário, você pode ter uma complicação com
códigos escritos sem levar em conta esta segurança. Uma operação que normalmente
funcionava antes pode não funcionar mais depois de configurada a segurança. Um caso típico
é a abertura De uma tabela pelo método OpenRecordset do objeto Database. Normalmente o
código é:
Sub AbreTabela()
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Categorias")
End Sub
Caso o usuário atual não tenha permissão sobre a tabela Categorias, o código falhará.
Se você não quer dar permissão ao usuário para acessar a tabela, é preciso abrir o
banco de dados, via código, com uma conta de um usuário que tenha as permissões
necessárias.
Sub AbreTabela()
Dim wks As Workspace
Dim dbs As Database
Dim rst As Recordset
144
Microsoft© Access Avançado
13.4.3. TROCA DE SENHA VIA CÓDIGO VBA
Sub ChangePassword()
Dim wks As Workspace
Set wks = DBEngine.Workspaces(0)
O usuário não precisa ser administrador para alterar sua própria senha. Porém, eles
não conseguem alterar senha de usuários do grupo Administradores, nem conseguem alterar
sus própria senha caso esqueçam a senha atual.
No exemplo acima, foi alterada a senha do usuário Teste. Uma melhoria do código
seria criar uma caixa de diálogo que obtivesse o nome do usuário atual. O nome do usuário
atual pode ser obtido pela função CurrentUser().
Sub Deny_DBCreate()
Dim dbs As Database, ctr As Container, strMDW
As permissões para criar tabelas e consultas ficam são definidas no objeto Container,
especificamente no container Tables, do banco de dados protegido (.MDB). A propriedade
Permissions deste container deve sofrer a operação And Not dbSecCreate.
Sub Deny_Create_TableQuery()
Dim dbs As Database, ctr As Container
146
ANEXO A - CONVENÇÃO DE NOMES PARA DESENVOLVIMENTO DE APLICAÇÕES COM
PRODUTOS MICROSOFT
ANEXO A - CONVENÇÃO DE NOMES PARA
DESENVOLVIMENTO DE APLICAÇÕES COM PRODUTOS
MICROSOFT
A Microsoft adota a Leszynski Naming Conventions - LNC, também conhecida como notação
húngara, para nomear objetos dos produtos MS Office (Access, Excel, Word, Outlook e
PowerPoint), MS Project, MS BackOffice (SQL Server, Exchange Server, System
Management Server, Internet Information Server e SNA Server) e MS Visual Studio (Visual
Basic, Visual FoxPro, Visual C++ e Visual InterDev). Estes objetos englobam:
• Class modules (módulos de classe do Visual Basic)
• Constants (constantes)
• Form controls (controles de formulários do Visual Basic e do Access)
• Forms (formulários do VB e do Access)
• Modules (módulos do VB e Access)
• Procedures (procedimentos do VB e Access)
• Queries and views (consultas do Access e SQL)
• Report controls (controles de relatório do Access)
• Reports (relatórios do Access)
• Security objects (objetos de segurança do Access)
• Stored procedures (procedimentos armazenados do SQL)
• Table fields (campos de tabelas do Access)
• Tables (tabelas do Access)
• Triggers (gatilhos do SQL)
• User-defined types (tipos definidos pelo usuário do VB e Access)
• Variables (variáveis)
A estrutura da LNC baseia-se em uma tag (etiqueta) antes do nome do objeto (por
exemplo, frmLogin). A sintaxe é:
Exemplos:
147
ANEXO A - CONVENÇÃO DE NOMES PARA DESENVOLVIMENTO DE APLICAÇÕES COM
PRODUTOS MICROSOFT
MICROSOFT ACCESS
Objeto Tag
Formulário (form) frm
Macro mcr
Módulo (module) bas
Consulta (query) qry
Relatório (report) rpt
Tabela (table) (*) tbl
Controle Tag
Bound object frame (moldura de objeto acoplado) frb
Chart cht
Check box (caixa de verificação) chk
Combo box (caixa de combinação) cbo
Command button (botão de comando) cmd
Custom control (controle personalizado) ocx
Image (imagem) img
Label (rótulo) lbl
Line (linha) lin
List box (caixa de listagem) lst
Option button (botão de opção) opt
Option group (grupo de opção) grp
Page break (quebra de página) brk
Rectangle (retângulo) shp
Section (seção) sec
Subform/Subreport (subformulário/subrelatório) sub
Text box (caixa de texto) txt
Toggle button (botão alternar) tgl
Unbound object frame (moldura de objeto não acoplado) fru
148
ANEXO A - CONVENÇÃO DE NOMES PARA DESENVOLVIMENTO DE APLICAÇÕES COM
PRODUTOS MICROSOFT
Tags para variáveis do ACCESS
Objeto Tag
Application app
Collection col
Control ctl
Controls ctls
CustomControl ocx
CustomControlinReport ocx
Debug n/a
DoCmd doo
Err n/a
Form frm
Forms frms
GroupLevel lvl
Report rpt
Reports rpts
Screen scn
Section sec
149
ANEXO A - CONVENÇÃO DE NOMES PARA DESENVOLVIMENTO DE APLICAÇÕES COM
PRODUTOS MICROSOFT
Hierarquia dos objetos DAO para ODBCDirect Workspaces
150
ANEXO A - CONVENÇÃO DE NOMES PARA DESENVOLVIMENTO DE APLICAÇÕES COM
PRODUTOS MICROSOFT
151