Escolar Documentos
Profissional Documentos
Cultura Documentos
Note que para resolver este problema preciso calcular trs fatorias. Ora, j vimos um
procedimento para calcular fatoriais. No bastaria escrever trs vezes o cdigo dentro do
procedimento de combinao?
No nada produtivo ter que rescrever o mesmo algoritmo vrias vezes. O que
podemos fazer fazer com que o procedimento de combinao chame o procedimento de
fatorial todas as vezes que for necessrio.
Qualquer procedimento pode chamar outro procedimento apenas colocando-se o nome
do procedimento como se fosse uma instruo do VBA.
Sub Combinacao()
.
.
Fatorial
.
End Sub
Esquematicamente, a chamada de um procedimento por outro funciona assim:
Entretanto, o procedimento Fatorial exige que um valor seja informado. No caso,
informamos o valor com a funo InputBox do VBA. O procedimento Fatorial tambm
fornece a resposta por meio da funo MsgBox. Da forma como o procedimento foi escrito
ele um procedimento completo e independente.
Microsoft Access Avanado
31
Para que o procedimento de combinao possa utilizar o procedimento Fatorial, de
forma a ambos funcionarem em conjunto, devemos modificar o procedimento Fatorial.
A primeira coisa a fazer retirar a funo InputBox do procedimento Fatorial. O
nmero para o qual se deseja calcular o fatorial deve ser passado como um argumento.
3.6.1. Passagem de Argumentos
Os parnteses frente do nome do procedimento servem para receber argumentos
vindos de outro procedimento que o chamou. Argumentos so variveis que recebero
valores, constituindo-se assim a entrada de dados para o procedimento.
Sub Fatorial(lngNumero As Long)
Dim dblFatorial As Double
Dim lngContador As Long
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 varivel 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
O outro problema do procedimento Fatorial que o resultado escrito na tela e no
pode ser usado pelo procedimento Combinacao. Devemos, portanto, transformar o
procedimento Fatorial de Sub para Function, de forma que ele possa retornar o resultado para
o procedimento que o chamou.
3.6.2. Retorno de Valor
Somente procedimentos do tipo Function podem retornar valor para o procedimento
que o chamou.
Para retornar um valor, usa-se o prprio nome do procedimento para retornar o valor.
Como procedimento do tipo Function retornam valor, eles precisam ter um tipo definido.
Microsoft Access Avanado
32
Function Fatorial(lngNumero As Long) As Double
Dim dblFatorial As Double
Dim lngContador As Long
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 no uma varivel e sim o nome do procedimento.
1 o valor a ser retornado. Note tambm que o procedimento Fatorial, que agora do tipo
Function, tem o mesmo tipo de dado que a varivel dblFatorial.
Agora, o procedimento Combinacao pode chamar a function Fatorial e armazenar o
valor de retorna em uma de suas variveis.
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
N = InputBox("Entre com o valor de N")
P = InputBox("Entre com o valor de P")
dblFatN = Fatorial(N)
dblFatP = Fatorial(P)
dblFatNP = Fatorial(N - P)
dblResultado = dblFatN / (dblFatP * dblFatNP)
MsgBox dblResultado
End Sub
O procedimento Combinacao um cdigo completo, mas dependente da existncia do
procedimento Fatorial. O procedimento Combinacao pode ser executado com F5, mas o
procedimento Fatorial no pode mais, por depender da passagem de um argumento.
Como a combinao um cdigo de uso geral, podemos transform-lo tambm em
uma funo, para que outro procedimento o chame. Neste caso, so necessrios dois
argumentos.
Function Combinacao(intN As Integer, intP As Integer) As Double
Dim dblFatN As Double
Dim dblFatP As Double
Dim dblFatNP As Double
dblFatN = Fatorial(intN)
dblFatP = Fatorial(intP)
Microsoft Access Avanado
33
dblFatNP = Fatorial(intN - intP)
Combinacao = dblFatN / (dblFatP * dblFatNP)
End Sub
Podemos testar a funo Combinacao chamando-a de um outro procedimento, pois,
agora que ela recebe argumentos, ela no pode mais ser executada com F5.
Sub TestaCombinacao()
Dim N As Integer, P As Integer
N = 3
P = 2
MsgBox Combinacao(N,P)
End Sub
3.6.3. Passagem de Argumentos por Valor e por Referncia
Os argumentos passados de um procedimento para outro podem ser por valor ou por
referncia.
A passagem por valor indica que a varivel enviada e a varivel definida como
argumento so duas posies de memria distintas. Elas podem at ter os mesmos nomes.
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2(X)
MsgBox X ' Ainda ser escrito 10
End Sub
Sub Teste2(X As Integer)
MsgBox X ' Ser escrito 10
X = 20
MsgBox X ' Ser escrito 20
End Sub
No exemplo acima, a varivel X do procedimento Teste1 contm o valor 10, e
passado como argumento para o procedimento Teste2. Em Teste2, o valor alterado para 20,
mas esta varivel no tem nada a ver com o X de Teste1. Apenas o valor de X em Teste1 foi
passado para a varivel X de Teste2. Ao retornar para Teste1, a varivel X continua a ter o
valor original.
Em suma, a passagem de argumentos por valor equivale a copiar o valor para outra
varivel.
Na passagem por referncia, as alteraes na alterao do argumento afetam o
contedo da varivel que foi passada como argumento. Na passagem por referncia, o
endereo de memria que passado para o procedimento. Assim, ambas as variveis so na
realidade a mesma varivel, mesmo que tenham nomes distintos
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2 X
MsgBox X ' Ser escrito 20
End Sub
Microsoft Access Avanado
34
Sub Teste2(ByRef G As Integer)
MsgBox G ' Ser escrito 10
G = 20
MsgBox G ' Ser escrito 20
End Sub
As palavras-chave ByRef e ByVal definem o tipo de passagem de argumento. O
padro no VBA ByRef, ou seja, se voc no especificar nada, assume a passagem por
referncia.
Entretanto, ByVal e ByRef sozinhos no garantem que os argumentos sejam passados
por valor e pro referncia, respectivamente. O modo de chamada tambm define o tipo de
passagem.
Se na chamada do procedimento os argumentos forem passados entre parnteses,
ento a passagem por valor, independentemente de ByRef e ByVal.
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2(X) ' Os parnteses definem que a passagem por valor
MsgBox X ' Ser escrito 10
End Sub
Sub Teste2(ByRef G As Integer)
MsgBox G ' Ser escrito 10
G = 20
MsgBox G ' Ser escrito 20
End Sub
Se na chamada do procedimento os argumentos no forem passados entre parnteses,
ento o tipo de passagem ser definido por ByRef e ByVal. Lembrando que ByRef o padro
do VBA.
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2 X ' O tipo de passagem depender de ByRef ou ByVal
MsgBox X ' Ser escrito 10
End Sub
Sub Teste2(ByVal G As Integer)
MsgBox G ' Ser escrito 10
G = 20
MsgBox G ' Ser escrito 20
End Sub
* * * * *
Microsoft Access Avanado
35
4. MDULO DE CLASSE EM FORMULRIO/RELATRIO
Cada formulrio e relatrio pode conter apenas um mdulo. Este mdulo do tipo
mdulo de classe. Este mdulo no aparece como um objeto na guia de Mdulos, pois fica
embutido no formulrio/relatrio. Por isso, ele era chamado Code Behind Form.
Os procedimentos esto relacionados a eventos do formulrio, do relatrio ou dos
controles do formulrio (controles de relatrio no geram evento). Os procedimentos so
criados no modo estrutura do formulrio/relatrio. No modo estrutura, com um objeto
selecionado, por exemplo o boto de comando cmdOk, na guia Eventos da janela de
propriedades seleciona-se o evento ao qual o procedimento estar associado. O evento pode
chamar uma macro ou um procedimento em cdigo VBA.
Escolhendo [Procedimento de evento] e clicando-se no boto do Construtor de
Cdigo, uma janela de mdulo, semelhante a uma janela de mdulo padro, ir se abrir.
O nome do procedimento gerado automaticamente. Ele formado pelo nome do
objeto e pelo evento, separado por um sublinhado ( _ ). Por exemplo, para o controle
cmdCancel e evento Clicar o nome do procedimento cmdCancel_Click.
Um cdigo comum associado ao clicar sobre o boto Cancel o do fechamento do
formulrio corrente.
Private Sub cmdCancel_Click(Cancel As Integer)
Microsoft Access Avanado
36
DoCmd.Close
End Sub
O procedimento de mdulo de formulrio ou de relatrio s executado quando o
evento do objeto associado ao procedimento ocorrer.
Como os procedimentos de evento recebem o nome do controle e do evento,
extremamente recomendvel no usar os nomes padro fornecido pelo Access (Texto1,
Comando2, ect). Deve-se nomear os controles com um nome significativo na guia Outra da
janela de Propriedades.
Algumas das caractersticas vistas no mdulo padro se aplicam tambm no mdulo
de classe, dentre elas: Compilao, execuo passo-a-passo, ponto de interrupo e inspeo
de variveis.
4.1. Colees e Objetos de Formulrio/Relatrio
Formulrios, relatrios e controles so objetos do Access e, portanto, possuem
propriedades, mtodos e eventos. As propriedades e os eventos so acessveis no modo
estrutura do formulrio/relatrio, na janela de Propriedades. Alterando-se as propriedades no
modo estrutura, os valores tornam-se estticos. Por exemplo, se se define a Legenda do
formulrio como Menu Principal, ela s pode ser alterada novamente no modo estrutura
NOTA: Controles de relatrios no possuem eventos.
Via programao, podemos ter acesso s propriedades dos objetos. Os valores das
propriedades podem ser alterados dinamicamente, durante a execuo do cdigo. A
programao permite tambm que os mtodos dos objetos sejam invocados, algo que no
possvel no modo estrutura.
Todos os formulrios do banco de dados formam a coleo de formulrios. Todos os
relatrios do banco de dados formam a coleo de relatrios. Uma coleo um objeto que
contm objetos de um mesmo tipo. Eis as colees do Access.
Coleo Descrio
Forms Coleo de formulrios abertos
Reports Coleo de relatrios abertos
Controls Coleo de controles em formulrios ou relatrios abertos
Modules Coleo de mdulos padro e mdulose de classe (inclusive mdulos de classe
de formulrio e de relatrio)
A hierarquia completa dos objetos do Access mostrada na figura abaixo:
Microsoft Access Avanado
37
Por ser um objeto, cada coleo possui tambm propriedades e mtodos.
Para referenciar um objeto especfico de uma coleo, pode-se usar quatro formas
diferentes:
Coleo(nmero do item)
Coleo(Nome do item)
Coleo![Nome do item]
Coleo.Item(nmero do item]
A primeira e a ltima forma tm a desvantagem de ter que saber qual o nmero do
item dentro da coleo. Se existem vrios formulrios num banco de dados, cada um deles
recebe um nmero sequencial, comeando do zero (0). Na ltima forma, Item uma
propriedade da coleo.
As duas outras formas so mais compreeensveis e mais fceis de usar porque j
sabemos o nome do item.
Por exemplo, para referir a um formulrio especfico chamado frmPedidos, use a
expresso:
Forms![frmPedidos] ou Forms(frmPedidos)
Para referir-se a um relatrios chamado rptLista_de_Produtos, use a expresso:
Reports![rptLista_de_Produtos] ou Reports(rptLista_de_Produtos)
Para referir-se a um controle chamado txtPreoUnitrio, no formulrio frmPedidos,
use a expresso:
Forms![frmPedidos]![txtPreoUnitrio]
Microsoft Access Avanado
38
Se o cdigo estiver sendo escrito atrs do formulrio frmPedidos, no necessrio
referir-se a ele mesmo como Forms![frmPedidos], mas simplesmente como Me!. Assim, a
referncia ao controle txtPreoUnitrio pode ser simplificado para Me![txtPreoUnitrio].
NOTA: O objeto Form referencia formulrios abertos. Formulrios fechados so
referenciados pelo objeto Document da hierarquia de objetos do DAO Data Access Objects.
4.2. Propriedades e Mtodos
Se em vez de querer acessar um controle do formulrio voc quiser acessar suas
propriedades ou invocar seus mtodos, use a expresso:
Forms![frmPedidos].Caption
ou simplesmente
Me.Caption
Para acessar uma propriedade de um controle ou invocar um de seus mtodos, use a
expresso:
Forms![frmPedidos]![txtPreoUnitrio].BackColor
ou simplemente
Me![txtPreoUnitrio].BackColor
O caracter ! usado para indicar que o prximo elemento um item definido pelo
usurio e o ponto indica que o prximo elemento uma propriedade ou mtodo. Voc pode
usar o ponto para substituir a !, se quiser. Portanto, Forms![frmPedidos] equivale a
Forms.[frmPedidos].
Ao escrever um cdigo VBA, se a opo Listar membros automaticamente do editor
de cdigo estivar acionada, ser exibida uma lista das propriedades e mtodos do objeto e os
controles do objeto.
Algumas propriedades so somente para leitura, isto , voc no 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.
Mtodo
Propriedade
Controle
Microsoft Access Avanado
39
Todas as propriedades visveis na janela de propriedades na estrutura de um
formulrio so acessveis via programao. Entretanto, existem vrias propriedades que so
acessveis somente no modo programado e no podem ser acessados no modo estrtutura. Por
exemplo, a propriedade Hwnd de um formulrio est disponvel somente no modo
programado.
4.3. Coleo padro e propriedade padro
Um objeto pode conter colees. Um objeto formulrio, por exemplo, contm a
coleo Controls. rigor, a referncia a um controle de um formulrio deveria ser:
Forms![frmPedidos].Controls![txtPreoUnitrio]
Mas como a coleo Controls a coleo padro do objeto Form, no necessrio
mencion-lo.
Os objetos possuem vrias propriedades, mas uma delas a propriedade padro. Por
exemplo, o controle caixa de texto possui a propriedade Text (o contedo da caixa de texto)
como padro. Assim, pode-se omitir esta propriedade.
Forms![frmPedidos]![txtPreoUnitrio].Text = 3.00
equivale a
Forms![frmPedidos]![txtPreoUnitrio] = 3.00
4.4. Propriedades de Coleo
As colees Forms, Reports e Controls possuem apenas propriedades, mas no
mtodos. As propriedades so:
Application Retorna o objeto Application, no caso, o Microsoft Access. Somente
leitura. Como o retorno um objeto, deve ser usado como Set obj =
object.Application
Sub ApplicationProperty( )
Dim obj As Object
Set obj = Forms.Application ' Retorna o objeto
Microsoft Access
End Sub
Count Retorna a quantidade de objetos da coleo. Somente leitura.
Sub CountProperty( )
Dim intForms As Integer
IntForms = Forms.Count
End Sub
Item Retorna o objeto em uma determinada posio ou ndice dentro da coleo.
Somente leitura.
Sub ItemProperty( )
Dim obj As Object
Microsoft Access Avanado
40
Set obj = Forms.Item(0) ' Retorna o primeiro objeto
form aberto
End Sub
Parent Retorna o objeto superior. Somente leitura. Como o retorno um objeto,
deve ser usado como Set obj = object.Parent.
Sub ApplicationProperty( )
Dim obj As Object
Set obj = Me.Controls(txtCodigo).Parent ' Retorna o
objeto form atual
End Sub
4.5. Sees de Formulrio/Relatrio
As sees dos formulrios e relatrios so objetos, da mesma forma que controles. As
sees possuem propriedades e eventos, mas no mtodos.
Deve-se tomar cuidado, pois, assim como os controles, o nome destes objetos dado
automaticamente pelo Access, entretanto, no se justifica alter-los. Na verso em ingls, os
nomes padro so: FormHeader, FormFooter, Detail, PageHeader e PageFooter.
As propriedades e mtodos das sees podem ser acessadas via programao,
entretanto, as sees PageHeader e PageFooter de relatrios no possuem propriedades nem
eventos que possam ser acessados via programao.
4.6. Eventos de Formulrio
Eis alguns dos eventos de formulrio para os quais pode-se definir cdigo:
Evento Descrio
NoAtual (OnCurrent) O evento NoAtual ocorre quando o foco movido para um registro,
tornando-o o registro atual, ou quando o formulrio aberto ou atualizado
ou quando sua consulta repetida.
O Microsoft Access executa a macro ou procedimento de evento Current
antes de o primeiro ou prximo registro ser exibido.
Ao executar uma macro ou procedimento de evento quando ocorre o evento
Current de um formulrio, possvel exibir uma mensagem ou sincronizar
registros em um outro formulrio relacionado ao registro atual. Por
exemplo, quando o registro de um cliente torna-se o atual, voc pode exibir
o pedido anterior do cliente. Quando o registro de um fornecedor torna-se o
atual, possvel exibir os produtos fabricados pelo fornecedor em um
formulrio Fornecedores. Voc tambm pode efetuar clculos com base no
registro atual ou alterar o formulrio em resposta aos dados desse registro.
Microsoft Access Avanado
41
Se a sua macro ou procedimento de evento executar uma ao
IrParaControle ou IrParaRegistro ou o mtodo correspondente do objeto
DoCmd em resposta a um evento Open, ocorrer o evento Current.
O evento Current tambm ocorre quando voc atualiza um formulrio ou
repete a tabela ou consulta base do formulrio por exemplo, quando
voc clica em Remover Filtro/Classificao no menu Registros ou utiliza a
ao RepetirConsulta em uma macro ou o mtodo Requery em cdigo do
Visual Basic.
Quando voc abre um formulrio pela primeira vez, os eventos ocorrem na
ordem a seguir:
Open Load Resize Activate Current
Antes de Inserir (BeforeInsert) Ocorre quando o usurio digita o primeiro caractere de um novo registro,
mas antes de realmente o registro ser gravado. A ordem dos eventos :
BeforeInsert BeforeUpdate AfterUpdate AfterInsert
Aps Inserir (AfterInsert) Ocorre quando o registro passa a ser um novo registro.
Antes de Atualizar
(BeforeUpdate)
Ocorre quando o usurio atualiza o registro
Aps Atualizar (AfterUpdate) Ocorre quando o registro atualizado
Ao Excluir (OnDelete) Ocorre quando o usurio tecla DEL em um ou mais registros.
Confirmar Antes de Excluir
(BeforeDelConfirm)
Ocorre antes de o registro ser efetivametne excludo, quando o MS Access
apresenta a mensagem de confirmao da excluso
Aps Confirmar Excluso
(AfterDelConfirm)
Ocorre aps a confirmao da excluso do registro.
Ao Abrir (OnOpen) Ocorre ao abrir o formulrio. A ordem dos eventos :
Open Load Resize Activate Current
Ao Carregar (OnLoad) Ocorre aps o formulrio ser aberto e carregar os dados para exibio.
Ao Redimensionar (OnResize) Ocorre ao redimensionar a janela do formulrio.
Ao Descarregar (OnUnload) Ocorre antes de o formulrio ser fechado, mas antes de ele ser removido da
tela. A ordem dos eventos :
Unload Deactivate Close
Ao Fechar (OnClose) Ocorre ao fechar o formulrio.
Ao Ativar (OnActivate) Ocorre quando a janela torna-se ativa, mas antes dela receber foco.
Ao Desativar (OnDeactivate) Ocorre antes de a janela perder o foco.
Ao Receber Foco (OnGotFocus) Ocorre aps a janela se tornar ativa.
Ao Perder Foco (OnLostFocus) Ocorre ao perde o foco da janela.
Ao Clicar (OnClick) Ocorre ao clicar o boto esquerdo do mouse sobre o formulrio.
Microsoft Access Avanado
42
5. ELEMENTOS DE PROGRAMAO
Como qualquer outra linguagem de programao, o VBA implementa:
Variveis (simples e compostas)
Constantes
Vetores e matrizes
Comentrios
Instrues de controle de estrutura de repetio
Instrues de controle de estrutura condicional
Instrues de entrada
Instrues de sada
Funes
O VBA permite ainda utilizar-se de objetos e colees do prprio MS Access
(Application, Forms/Form, Reports/Report, Controls/Control, Modules/Module, Screen e
DoCmd) ou de outras aplicaes que suportem a automao (como os aplicativos do MS
Office) ou de controles ActiveX (atualmente chamados de COM Component Object
Model).
5.1. VARIVEIS
Varivel um local da memria RAM do computador que armazena um valor at que
um novo valor seja armazenado ou at que a rotina se encerre. A posio de memria
referida por um identificador, que nada mais que um nome que aponta para o endereo de
memria.
5.1.1. Declarao
Em algoritmo, a declarao das variveis segue a sintaxe:
Declare nome_da_varivel tipo
Onde, declare uma instruo, nome_da_varivel o nome que referencia a posio
de memria onde ser armazenada um dado e tipo o tipo de dado, podendo ser literal,
numrico ou lgico.
No VBA, a principal instruo para declarao de variveis a Dim, seguindo a
sintaxe:
Dim {nome_da_varivel} As {tipo}
Os tipos de dados aceitos no VBA so:
Microsoft Access Avanado
43
Tipo de dados Tamanho de
Armazename
nto
Intervalo
Byte 1 byte 0 a 255
Boolean 2 bytes True ou False
Integer 2 bytes -32.768 a 32.767
Long(inteiro longo) 4 bytes -2.147.483.648 a 2.147.483.647
Single (vrgula flutuante de
preciso simples)
4 bytes -3,402823E38 a -1,401298E-45 para
valores negativos; 1,401298E-45 a
3,402823E38 para valores positivos
Double (vrgula flutuante
de preciso dupla)
8 bytes -1,769313486232E308 a -
4,94065645841247E-324 para valores
negativos; 4,94065645841247E-324 a
1,769313486232E308 para valores
positivos
Currency (inteiro escalado) 8 bytes -922.337.203.685.477,5808 a
922.337.203.685.477,5807
Decimal 14 bytes +/-
79.228.162.514.264.337.593.543.950.335
sem ponto decimal; +/-
7,9228162514264337593543950335 com
28 casas decimais direita; o menor
nmero diferente de zero +/-
0,0000000000000000000000000001.
Date 8 bytes De 1 de Janeiro de 100 at 31 de
Dezembro de 9999
Object 4 bytes Qualquer referncia a Object
String (comprimento da
varivel)
10 bytes +
comprimento
da seqncia
de caracteres
De 0 at aproximadamente 2 bilhes
String(comprimento fixo) Comprimento
da seqncia
de caracteres
De 1 at aproximadamente 65.400
Variant(com nmeros) 16 bytes Qualquer valor numrico at o intervalo de
um Double
Variant(com caracteres) 22 bytes +
comprimento
da seqncia
de caracteres
O mesmo intervalo que String de
comprimento varivel
Definido pelo usurio
(usando Type)
Nmero
requerido por
elementos
O intervalo de cada elemento o mesmo
que o intervalo do seu tipo de dados.
Microsoft Access Avanado
44
Recomenda-se que os nomes das variveis sigam o padro de nomenclatura LNC (ver
Apndice A). Os nomes de variveis, assim como o de constantes e procedimentos:
Podem ter at 255 caracteres.
Precisam comear com uma letra.
Podem incluir letras, nmeros ou caracteres sublinhados (_).
No podem incluir caracteres de pontuao ou espaos.
No 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 instrues (como If e Loop), funes (como Len e Abs), operadores
(como Or e Mod), palavras-chave, clusulas SQL e propriedades e mtodos de objetos.
Exemplos:
Dim strNomeEmpregado As String
Dim intIdade As Integer
Dim dblValorFatura As Double
5.1.2. Atribuio de valores variveis
Em algoritmo, a atribuio de valor a uma varivel :
nome_da_varivel {valor}
No VBA, a atribuio feita pelo sinal =.
Exemplos:
strNomeEmpregado = CARLOS KOGA
intIdade = 25
curPreco = 45.76
Se o tipo da varivel for um objeto, a atribuio deve ser precedida pela instruo Set.
Dim dbsBanco As Database ' Objeto Database do DAO
Set dbsBanco = DBEngine.WorkSpaces(0).Databases(0)
O valor atribudo tem que ser coerente com o tipo de dado da varivel. Assim, se
intIdade do tipo inteiro, ocorrer um erro se for atribudo um valor fracionrio ou um valor
fora do intervalo de valores permitidos.
intIdade = 25.5 ' Erro! O tipo inteiro
intNmeroNatural = 32768 ' Erro! O valor maior que 32767
Microsoft Access Avanado
45
5.2. CONSTANTES
As constantes podem ser de trs tipos:
Constantes simblicas, que voc cria utilizando a instruo Const e utiliza em mdulos.
Constantes intrnsecas, que fazem parte do Microsoft Access ou de uma biblioteca
referenciada.
Constantes definidas pelo sistema: True, False e Null.
5.2.1. Constantes Simblicas
Freqentemente, voc ter que utilizar os mesmos valores repetidamente no seu
cdigo ou descobrir que o cdigo depende de certos nmeros que no tm significado bvio.
Nesses casos, voc pode tornar o cdigo bem mais fcil de ler e de manter utilizando
constantes simblicas (tambm chamadas de constantes definidas pelo usurio), que permitem
que voc utilize um nome significativo no lugar de um nmero ou seqncia.
Uma vez que voc tenha criado uma constante utilizando a instruo Const, voc no
poder modific-la ou atribuir um novo valor a ela. Voc no pode tambm criar uma
constante que tenha o mesmo nome que uma constante intrnseca.
Os exemplos a seguir mostram algumas das maneiras pelas quais voc pode utilizar a
instruo Const para declarar constantes numricas e de seqncia:
Const conPI = 3.14159265 ' Pi igual a este nmero.
Const conPI2 = conPI * 2 ' Uma constante para criar outra.
Const conVerso = "Verso 7.0" ' Uma constante de seqncia.
5.2.2. Constantes Intrnsecas
Alm das constantes que voc declara com a instruo Const, o Microsoft Access
declara automaticamente vrias constantes intrnsecas e oferece acesso s constantes do VBA
e s constantes de objetos referenciados no cdigo.
Qualquer constante intrnseca pode ser utilizada em uma macro ou no Visual Basic.
Essas constantes esto disponveis o tempo todo.
As constantes intrnsecas tm um prefixo de duas letras identificando a biblioteca de
objetos que define a constante. As constantes da biblioteca Microsoft Access so iniciadas
com "ac"; as constantes da biblioteca DAO so iniciadas com "db" e as constantes da
biblioteca VBA so iniciadas com "vb". Por exemplo:
acForm
dbAppendOnly
vbCurrency
Microsoft Access Avanado
46
Observao: Como os valores representados pelas constantes intrnsecas podero ser
alterados em verses futuras do Microsoft Access, voc deve utilizar as constantes em vez de
seus valores reais.
Voc pode utilizar constantes intrnsecas sempre que puder utilizar constantes
simblicas, inclusive em expresses. O exemplo a seguir mostra como voc poderia utilizar a
constante intrnseca vbCurrency para determinar se varNm do tipo Variant para a qual a
funo VarType retorna 6 (tipo Currency):
Dim varNm As Variant
If VarType(varNm) = vbCurrency Then
Debug.Print "varNm contm dados do tipo Currency."
Else
Debug.Print "varNm no contm dados do tipo Currency."
End If
Existem vrias categorias de constantes intrnsecas. Para ver uma lista de constantes
intrnsecas em uma determina categoria. Consulte no Help do Access os tpicos abaixo:
As constantes de ao (do objeto DoCmd)
As constantes DAO (Data Access Object)
As constantes de procedimento de evento
As constantes de Cdigo de Tecla
As constantes diversas
As constantes do mtodo RunCommand (constituem um subconjunto das constantes de
ao)
As constantes de segurana
As constantes do Visual Basic
As constantes da funo VarType
5.2.3. Constantes Definidas pelo Sistema
As constantes definidas pelo sistema so os valores lgicos True e False e a ausncia
de valor Null. Assim como as constrantes intrnsecas, elas tambm no precisam ser
declaradas com a instruo Const.
Voc pode usar estas constantes em qualquer lugar do Access, tais como em consultas,
macros, variveis e propriedades de objetos.
Microsoft Access Avanado
47
5.3. VETORES E MATRIZES
As matrizes suportam de 1 at 60 dimenses. A matriz de apenas uma dimenso
chamada de vetor.
A declarao das dimenses e dos intervalos de cada dimenso feita com a instruo
Dim, seguindo a sintaxe:
Dim nomedavarivel([ [LimiteInferior To] [LimiteSuperior] [,LimiteInferior To] Limite
Superior] ....] ) As tipo
' Matriz de uma dimenso (vetor) com 5 elementos
Dim intMatriz1( 1 To 5) As Integer
' Matriz de duas dimenses. A primeira com 10 e a segunda com 6 elementos
' O tamanho da string de cada elemento varivel.
Dim strMatriz2( 1 To 10, 1 To 6) as String
' Matriz de 3 dimenses. O nmero de elementos depende da instruo Option
Base na seo de declaraes. O tamanho da string de cada elemento 50.
Dim strMatriz3( 5, 4 , 3) As String * 50
Se o limite inferior de uma dimenso no for explicitada, assume o valor padro
declarado pela instruo Option Base. Option Base colocada na seo de declaraes do
mdulo. Se Option Base for omitido, o limite inferior 0. Para iniciar em 1, declara-se Option
Base 1. Para explicitar o incio em 0, declara-se Option Base 0.
Uma das caractersticas do VBA a declarao de matrizes dinmicas, ou seja, o
intervalo dos subscritos e o nmero de dimenses podem ser alterados conforme a
necessidade que surgir durante o processamento.
Matriz dinmica declarada sem especificar as dimenses, nem limites.
Dim intDinamica() As Integer
O redimensionamento feito instruo Redim.
Redim intDinamica( 1 To 5, 1 To 10)
Redim intDinamica(8, 7, 4)
Voc pode tambm declarar uma matriz dinmica 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 no se pode alterar o nmero de dimenses.
Redim A( ) As Integer ' Erro
Redim B(5, 2) As Integer ' OK
Redim B(3, 1) ' Ok
Redim B(5, 6, 10) ' Erro
Redim B(100) ' Erro
Redim B(100, 100) ' Ok
Microsoft Access Avanado
48
5.4. TIPOS DEFINIDOS PELO USURIO
A instruo Type define um tipo de dado a partir dos tipos bsicos. 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
Dim MeuRegistro As RegistroDePessoal
MeuRegistro.strMatricula = 80106650
MeuRegistro.strNome = CARLOS KOGA
MeuRegistro.dtaDataNasc = #06/10/1964#
5.5. ESTRUTURA DE REPETIO
O VBA possui as seguintes instrues de repetio:
For...Next
Do...Loop
While...Wend
For Each...Next
5.5.1. For..Next
A estrutura For...Next suportada por vrias linguagens, e no apresenta diferenas. A
sua sintaxe :
For {contador} = {incio}To {fim} [Step {passo}]
[instrues]
[Exit For]
[instrues]
Next [contador]
Microsoft Access Avanado
49
5.5.2. Do..Loop
A estrutura Do...Loop implementa uma repetio enquanto uma condio for
verdadeira (while) ou at uma condio se tornar verdadeira (until). Tambm implementa as
sadas tanto de incio quanto de final.
Na repetio enquanto uma condio for verdadeira, acrescenta-se a clusula WHILE
{condio} aps o DO (se for sada no incio) ou aps o LOOP (se for sada no final).
Sub WhileSadaNoIncio()
contador = 0
meuNmero = 20
Do While meuNmero > 10
meuNmero = meuNmero - 1
contador = contador + 1
Loop
MsgBox "O loop concluiu " & contador & " repeties."
End Sub
Sub WhileSadaNoFinal()
contador = 0
meuNmero = 9
Do
meuNmero = meuNmero - 1
contador = contador + 1
Loop While meuNmero > 10
MsgBox "O loop concluiu " & contador & " repeties."
End Sub
Na repetio at que uma condio se torne verdadeira, acrescenta-se o UNTIL
{condio} aps o DO (se for sada no incio) ou aps o LOOP (se for sada no final).
Sub UntilSadaNoIncio()
contador = 0
meuNmero = 20
Do Until meuNmero = 10
meuNmero = meuNmero - 1
contador = contador + 1
Loop
MsgBox "O loop concluiu " & contador & " repeties."
End Sub
Sub UntilSadaNoFinal()
contador = 0
meuNmero = 1
Do
meuNmero = meuNmero + 1
contador = contador + 1
Loop Until meuNmero = 10
MsgBox "O loop concluiu " & contador & " repeties."
End Sub
Microsoft Access Avanado
50
A sada da repetio pode ser forada com a instruo Exit Do.
intContador = 0
Do While True
intContador = intContador + 1
if intContador > 10 Then
Exit Do
Endif
Loop
5.5.3. While..Wend
A estrutura While...Wend implementa somente a repetio enquanto uma condio for
verdadeira e no admite sada forada. Pontanto, melhor substitu-la pela Do...Loop.
While {condio}
[instrues]
Wend
5.5.4. For Each..Next
A instruo For Each...Next uma variao do For..Next especfica para elementos
dentro de matrizes ou de colees de objetos.
Dim varNomesMeses As Variant
Dim strMes As String
varNomesMeses = Array("Janeiro", "Fevereiro", "Maro", "Abril", _
"Maio", "Junho", "Julho", "Agosto", _
"Setembro", "Outubro", "Novembro", "Dezembro")
For Each strMes In varNomesMeses
Debug.Print strMes
Next
Neste outro exemplo, a coleo TableDefs possui vrios objetos do tipo TableDef.
Cada objeto de definio de tabela possui a propriedade Name. A instruo For Each...Next
pode ser usada para listar todas as tabelas do banco de dados corrente.
Dim tdfsTabelas As TableDefs
Dim tdfTabela As TableDef
Set tbfsTabelas = CurrentDb.TableDefs
For Each tdfTabela In tdfsTabelas
Debug.Print tdfTabela.Name
Next
Microsoft Access Avanado
51
Uma construo similar pode ser obtida com somente a instruo For...Next.
Dim tdfsTabelas As TableDefs
Dim tdfTabela As TableDef
Dim intContador As Integer
Set tbfsTabelas = CurrentDb.TableDefs
For intContador = 0 To tbfsTabelas.Count
Debug.Print tdfTabela(intContador).Name
Next
5.6. ESTRUTURA CONDICIONAL
If...Then...Else
Select Case
On...Goto
On..GoSub
As instrues On..Goto e On..GoSub no sero mostradas porque Select Case pode
substitu-las, gerando um cdigo mais estruturado e flexvel.
5.6.1. If...Then...Else
A estrutura condicional mais simples :
If { condio } Then
[ instrues]
End If
Uma estrutura composta contm a clusula Else:
If { condio } Then
[ instrues]
Else
[ instrues]
End If
A instruo IF..Then..Else admite ElseIfs aninhados.
If { condio } Then
[ instrues]
Microsoft Access Avanado
52
Elseif { condio 2} Then
[ instrues]
Elseif { condio 3} Then
[ instrues]
Elseif { condio 4} Then
[ instrues]
Else
[ instrues]
End If
Dim Nmero, Dgitos, MinhaSeqncia
Nmero = 53 ' Inicializa a varivel.
If Nmero < 10 Then
Dgitos = 1
ElseIf Nmero < 100 Then
' A condio avalia como True, ento a prxima instruo executada.
Dgitos = 2
Else
Dgitos = 3
End If
5.6.2. Select Case
O Select Case semelhante aos ElseIfs aninhados.
Select Case expressodeteste
[Case listadeexpresses-n
[instrues-n]] ...
[Case Else
[instrueselse]]
End Select
Dim Nmero As Integer
Nmero = 8 ' Inicializa a varivel.
Select Case Nmero ' Avalia Nmero.
Case 1 To 5 ' Nmero entre 1 e 5.
Debug.Print "Entre 1 e 5"
' A seguinte a nica clusula Case que avalia como True.
Case 6, 7, 8 ' Nmero entre 6 e 8.
Debug.Print "Entre 6 e 8"
Case Is > 8 And Nmero < 11 ' Nmero 9 ou 10.
Debug.Print "Maior que 8"
Case Else ' Outros valores.
Debug.Print "No entre 1 e 10"
End Select
Microsoft Access Avanado
53
5.7. ENTRADA E SADA DE DADOS
Para fazer a leitura de dados via teclado em algoritmo voc usa a instruo Leia . Em
Clipper usa-se o comando @..GET para a sua implementao. Para a sada, o algoritmo usa a
instruo Escreva, a qual implementada no Clipper com @..SAY.
No Clipper, tanto para entrada de dados quanto para a sada, usam-se os dois
comandos para construir uma tela para posicionar os campos na tela, de forma a criar uma
interface agradvel e compreensvel. No Access, h uma maneira mais fcil de efetuar a
entrada e sada de dados, sem programao: o objeto formulrio.
Tomemos por exemplo a funo Extenso( ), cujo cdigo apresentado mais adiante. A
maioria das funes requer argumentos de entrada, neste caso, um valor monetrio. Como
toda funo, esta retorna o valor por extenso do valor informado. Tanto o argumento (entrada)
quanto o retorno da funo (sada) podem ser colocados em um formulrio.
O exemplo a seguir um formulrio simples, sem nenhuma fonte de dados. Por isso,
em suas propriedades esto desativados o seletor de registros, os botes de navegao e as
barras de rolagem.
H dois controles caixa de texto: txtValor e txtExtenso. O primeiro um controle no
acoplado, que receber um valor monetrio, e, por isso, est formatado com o tipo Moeda. O
segundo um controle calculado que contm o dado Extenso([txtValor]). Quando este
receber o foco, chamar a funo, levando o argumento txtValor e retornar uma string com o
valor por extenso.
Microsoft Access Avanado
54
Este exemplo simples mostra claramente que um formulrio pode ser usado como
entrada e sada, substituindo com vantagens os tradicionais comando de entrada via teclado e
de sada na tela.
5.7.1. Funes do VBA para entrada e sada
s vezes voc no quer usar um formulrio para entrada e sada de dados. Voc quer
usar instrues no VBA para receber um nico campo e enviar uma mensagem na tela. Para
isto h a funo InputBox e a funo/instruo MsgBox.
Dim curValor As Currency
curValor = InputBox("Entre com o valor", "Valor monetrio")
MsgBox Extenso(curValor), vbOKOnly, "Valor por Extenso"
A execuo deste fragmento de cdigo resulta em duas janelas, mostradas abaixo.
Microsoft Access Avanado
55
Se se quer capturar a resposta do usurio, usa-se a funo MsgBox em vez da
instruo. A sintaxe a mesma, somente acrescenta-se a varivel que receber a resposta.
intResposta = MsgBox(Extenso(curValor), vbOKOnly, "Valor por Extenso")
InputBox e MsgBox no so sofisticados quanto um formulrio. InputBox no pode
consistir um dado, usando por exemplo, um cdigo VBA em mdulo de formulrio, nem
formatar (usando a propriedade Formato do controle Caixa de Texto).
5.7.2. Outros dispositivos de entrada e sada
Nem sempre a entrada de dados via teclado. Pode ser via leitura de arquivo. A
entrada e gravao de dados em formato de tabela so tratados no tpico Acesso a Dados,
mais adiante. A leitura de dados de arquivos seqenciais, randmicos e binrios ser vista
tambm em outro tpico (Acesso a Arquivos e Impressora).
Da mesma forma, a sada nem sempre a tela de vdeo. O tpico Acesso a Arquivos e
Impressora mostrar como direcionar a sada para arquivos em disco ou para a impressora
local.
H um outro local para onde a sada pode ser direcionada: a Janela Depurar. Esta
janela recebe a sada, a qual visualizada quando a janela aberta. A janela depurar serve
testar e depurar a lgica de um programa.
A sada para a janela depurar feita pelo objeto Debug, do VBA, utilizando-se seu
nico mtodo: o Print. A janela depurar aberta com Control-G.
Dim curValor As Currency
curValor = InputBox("Entre com o valor", "Valor monetrio")
Debug.Print Extenso(curValor)
Microsoft Access Avanado
56
5.8. COMENTRIOS
Um comentrio so textos no executveis, ou seja, no so entendidos como um
cdigo de programao. Comentrios servem para documentar e esclarecer uma rotina
complexas.
Uma linha de cdigo torna-se um comentrio se ela vier precedida de uma aspa
simples. No necessrio que toda a linha seja um comentrio; voc acrescentar um
comentrio aps uma instruo.
' Toda esta linha um comentrio.
MsgBox "Teste" ' A partir daqui tudo que for escrito comentrio.
Todo comentrio escrito na cor verde por padro. Voc pode alterar a cor nas opes
do MS Access.
5.9. FUNES
O MS Access possui um rol muito grande de funes prontas. Como voc j deve
saber, uma funo uma rotina que retorna um valor quando chamada. A funo pode
receber nenhum, um ou mais argumentos de entrada. A lista de argumentos passada entre
parnteses aps o nome da funo. A funo retorna somente um valor de um determinado
tipo, e portanto, toda chamada de funo deve ser atribuda a uma varivel. Exemplos:
Dim dtaDataDeHoje As Date
Dim intAscii As Integer
dtaData = Date()
intAscii = Char(A)
Existem funes do Visual Basic for Applications, do DAO Data Access Object e
funes agregadas SQL. Apesar de todas poderem ser usadas no cdigo VBA de uma
aplicao em MS Access, importante saber a origem das funes, pois voc no pode us-
las em qualquer aplicativo. Por exemplo, se a funo do DAO, voc s pode chamar a
funo de estiver com o objeto DAO carregado. As funes do VBA podem ser usadas em
qualquer aplicao VBA, seja no MS Access, no MS Excel, MS Word, no MS PowerPoint ou
no MS Project.
As funes do VBA so classificadas segundo o finalidade. Os grupamentos so:
Funes literais
Funes matemticas
Funes financeiras
Funes de data
Funes de converso
Voc no deve confundir funo com instruo. Normalmente, as instrues so da
cor azul e as funes aparecem na cor preta.
Funes do VBA podem ser usadas na construo de expresses SQL. Por exemplo:
Microsoft Access Avanado
57
Dim strSql As String
strSql = "SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, "
strSql = strSql + "DateDiff('d', [DataDoPedido], [DataDeEntrega] As Prazo "
strSql = strSql + "FROM Pedidos"
Me.RecordSource = strSql
Consulte a ajuda do MS Access para saber mais sobre funes.
5.10. ESCOPO DE IDENTIFICADORES
O escopo refere-se a disponibilidade dos identificadores (variveis, constantes e
procedimentos) para uso por outros procedimentos. O escopo definido quando se declara os
identificadores.
Existem dois nveis de escopo e dois de visibilidade que determinam onde e quando
um identificador reconhecido (visvel),
Nveis de escopo
Nvel de procedimento
Nivel de mdulo
Nveis de visibilidade
Private
Public
Escopo Private Public
Nvel de procedimento Todas as variveis e
contantes declaradas em nvel
de procedimento so Private,
ou seja, somente podem ser
acessadas dentro do
procedimento em que foram
declaradas. Estas variveis
so tambm chamadas
variveis locais
Sub Teste( )
Dim intK As Integer
No se aplica.
Nvel de mdulo Todas as variveis e
constantes declaradas na
seo de Declaraes podem
ser acessadas por todos os
procedimentos daquele
mdulo.
Todas as variveis e
constantes declaradas com a
instruo Public na seo de
Declaraes de um mdulo
podem ser acessadas por
qualquer procedimento do
banco de dado.
Microsoft Access Avanado
58
Option Compare Database
Option Explicit
Dim intK As Integer
Option Compare Database
Option Explicit
Public intK As Integer
Quanto aos identificadores de procedimento, o escopo .
Tipo de mdulo Escopo
Mdulo de formulrio/relatrio Todos os procedimentos so Private, mesmo
que sejam usadas as instrues Private ou
Public. Isto tem lgica, j que so
procedimentos de evento, os quais devem
responder a somente os eventos dos objetos
formulrio, relatrio ou controle.
Mdulo padro Todos os procedimentos so Public, a no ser
que seja colocada a instruo Private antes da
declarao do procedimento.
Private Sub Teste()
5.11. OBJETO DoCmd
O objeto DoCmd exclusivo do MS Access , portanto, voc s pode utiliz-lo em
programao VBA dentro do MS Access . Este objeto no possui nenhuma propriedade nem
eventos, somente mtodos. Os mtodos executam aes do MS Access, tais como abrir um
formulrio, executar uma macro, alterar o formato do cursor, etc.
Muitos dos mtodos do objeto DoCmd requerem argumentos, alguns obrigatrios,
outros opcionais.
Consulte a ajuda do MS Access para saber os mais sobre o objeto DoCmd.
Microsoft Access Avanado
59
6. LINGUAGEM SQL
As consultas criadas na guia Consultas da janela de Banco de Dados nada mais so
que instrues em linguagem SQL. A SQL Structured Query Language (Linguagem
Estruturada de Consulta) foi desenvolvida pela IBM em meados da dcada de 10 e
padronizada pela ANSI (o padro SQL ANSI-92). Fornecedores de software de banco de
dados costumam ter variaes do padro ANSI. A SQL do Microsoft SQL Server o
Transact-SQL e o da Oracle o PL/SQL. O Access utiliza uma variao 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 criao de consultas no MS Access facilitada pela existncia do modo Estrutura,
uma espcie de editor grfico que torna a tarefa mais intuitiva e fcil.
Voc pode criar consultas no modo SQL, escrevendo diretamente as instrues SQL.
Se voc no 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
boto Abrir da janela de Banco de Dados. O termo executar mais apropriado que abrir. Via
programao, a consulta pode ser executada pelo mtodo OpenQuery do objeto DoCmd.
Microsoft Access Avanado
60
A compreenso da linguagem SQL permite desenvolver aplicaes sofisticadas. Na
realidade, voc pode construir uma aplicao inteira sem nenhuma consulta ter sido criada na
guia Consultas, porque:
A propriedade Origem do Registro (RecordSource) de formulrios e relatrios pode ter
como valor uma tabela ou uma instruo SQL (criada pelo construtor de consultas),
definidos em tempo de desenvolvimento (no modo Estrutura).
O valor propriedade Origem do Registro de formulrios e relatrios pode ser construdo
em tempo de execuo, passado-o na forma de uma expresso SQL para a propriedade
RecordSource do formulrio ou relatrio.
Voc pode substituir consultas de ao por expresses SQL criadas em tempo de
execuo e execut-las pelo mtodo RunSQL do objeto DoCmd.
Voc pode construir expresses SQL em tempo de execuo e visualizar os dados por
meio de um formulrio de consulta.
Voc pode construir expresses SQL em tempo de execuo e acessar os dados pelo
mtodo OpenRecordset do objeto Database do DAO.
Alm do mais, o conhecimento da linguagem SQL imprescindvel para a criao de
consultas especficas SQL (Unio, Passagem e Definio de dados) e til para desenvolver
programas para acessar dados em bancos de dados cliente/servidor como o MS SQL Server e
Oracle.
6.1. EXPRESSO SQL
Uma expresso SQL uma cadeia de caracteres (string) contendo instrues SQL.
Sendo uma cadeia de caracteres, voc pode constru-la em tempo de desenvolvimento ou de
execuo e atribu-la a uma varivel do tipo String. A varivel pode ser usada como
argumento ou ser atribuda propriedade RecordSource de relatrio ou formulrio. Veja
alguns exemplos de expresso SQL.
Dim strSql As String
strSql = "DELET * FROM [Detalhes do Pedido]"
DoCmd.RunSql strSql
Dim strSql As String
Dim intNumeroPedido As Integer
IntNumeroPedido = InputBox("Qual o nmero do pedido?")
strSql = "SELECT NmeroDoPedido, CdigoDoCliente, DataDoPedido, "
strSql = strSql & "DataDeEntrega, DataDeEnvio "
strSql = strSql & "FROM Pedidos WHERE NmeroDoPedido " & intNumeroPedido
Me.RecordSource = strSql
No primeiro exemplo, a expresso atribuda varivel strSql e passada como
argumento do mtodo RunSql do objeto DoCmd. Trata-se de uma consulta de ao que
excluir todos os registros da tabela Detalhes do Pedido. O nome da tabela est entre
colchetes porque possui espaos em seu nome.
No segundo exemplo, uma expresso construda com o nmero do pedido sendo
informado em tempo de execuo. A expresso ento atribuda propriedade RecordSource
do formulrio/relatrio ao qual o mdulo de classe pertence. Note os espaos no final de cada
atribuio de valor varivel strSql. Isto necessrio para que a sintaxe da instruo SQL
seja correta, seno ocorreria uma expresso como DataDeEntrega, DataDeEnvioFROM, o que
causaria um erro em tempo de execuo.
Microsoft Access Avanado
61
Apesar de mais trabalhoso, o uso de expresses SQL em programao em vez de criar
consultas na guia Consultas mais seguro. Suponha que voc cie uma consulta de ao que
exclua todos os registros de uma tabela. Qualquer pessoa pode abrir o banco de dados e
execut-la.
claro que voc poderia evitar isto definindo permisso em nvel de usurio. De
qualquer forma, usar expresses SQL em programao dar mais flexibilidade e segurana a
sua aplicao.
NOTA: Toda sintaxe das expresses SQL em ingls, no importa o idioma que voc esteja
usando, inclusive nomes de funes e formato de data.
6.2. INSTRUES BSICAS SQL
No se pretende aqui ensinar a linguagem SQL, mas sim passar noes, restritamente
do Microsoft Jet Database Engine SQL.
NOTA: Se voc for programar no MS Visual Basic para acessar banco de dados do MS SQL
Server, deve usar a sintaxe do Transact-SQL.
A maneira mais fcil de se criar expresses SQL construir a consulta na guia
Consultas, alternar para o modo SQL, selecionar todo o texto, copiar e colar no mdulo para
contruir a expresso.
As consultas so agrupadas segundo a sua finalidade. Ao construir uma consulta pelo
modo Estrutura, tem-se 4 tipos bsicos: Seleo, Atualizao, Excluso, Acrscimo e Criao
de tabela.
O quadro a seguir mostra quais instrues SQL caracterizam cada tipo de consulta:
Tipo de consulta Instruo SQL caracterstica
Consulta seleo SELECT
Consulta atualizao UPDATE
Consulta de excluso DELETE
Consulta acrscimo INSERT INTO
Consulta criao de tabela SELECT INTO
6.2.1. Consulta Seleo
A consulta seleo a mais comum de todas. Ela retorna um conjunto de dados vindos
de uma ou mais tabelas relacionadas. Quando se programa, este conjunto no visvel como
no modo Folha de Dados, mas fica na memria do computador para ser acessado. Os dados
tambm no podem ser alterados como ocorre no modo Folha de Dados, a no ser que voc
execute mtodos de insero, atualizao ou excluso do objeto RecordSet.
A consulta seleo possui clusulas e caractersticas especficas deste tipo de consulta
e tambm outras comuns aos demais tipos. Veremos aqui algumas das clusulas e
caractersticas comuns mais detalhadamente para poupar mais explicaes nas consultas
seguintes.
A sintaxe bsica da consulta seleo comea com a instruo SELECT. Sua forma
mais simples :
Microsoft Access Avanado
62
SELECT {listadecampos |*} FROM {tabela}
Esta instruo retorna os campos selecionados em listadecampos ou todos os campos
se voc utilizar o *. Todos os registros da tabela especificada por tabela so recuperados
porque no h uma clusula de critrio. Os campos so recuperados na ordem em que eles
foram escritos na listadecampos. Os campos so separados por vrgulas. Exemplos:
SELECT * FROM Pedidos
Esta instruo retorna todos os campos e todos os registros da tabela Pedidos.
SELECT CdigoDoProduto, NomeDoProduto, CdigoDoFornecedor FROM Produtos
Esta instruo retorna trs campos e todos os registros da tabela Produtos.
A sintaxe completa :
SELECT [predicado] { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressodetabela [, ...] [IN bancodedadosexterno]
[WHERE {critrioswhere} ]
[GROUP BY campo1 [, campo2] [,campoN... ] ]
[HAVING {critrioshaving} ]
[ORDER BY campo1 [ASC|DESC] [, campo2 [ASC|DESC] ] [,campoN [ASC|DESC] ... ] ]
[WITH OWNERACCESS OPTION]
A instruo SELECT extrai as colunas (campos) escolhidas, selecionando as linhas
(registros) que atendam aos critrios da clusula WHERE e classifica (ORDER BY) em orde
crescente (ASC, que o padro) ou decrescente (DESC) ou agrupa (GROUP BY) as linhas
resultantes na ordem especificada.
A clusula WITH OWNERACCS OPTION significa que o usurio que est
executando a consulta possui as mesmas permisses que o criador da consulta. Isto tem
sentido em um ambiente multi-usurio em que se definir segurana em nvel de usurio.
Os argumentos da instruo so:
Argumento Descrio
Predicado Um dos predicados a seguir: ALL, DISTINCT, DISTINCTROW
ou TOP. Voc utiliza o atributo para restringir o nmero de
registros retornados. Se nenhum for especificado, o padro ser
ALL.
* Especifica que todos os campos da tabela ou tabelas especificadas
esto selecionados.
Tabela O nome da tabela contendo os campos a partir dos quais os
registros so selecionados. um argumento opcional. Voc s
precisa defin-lo caso suas tabelas possuam o mesmo nome de
campo, como o caso do campo PreoUnitrio, que consta das
tabelas Produto e Detalhes do Pedido do banco de dados
Northwind. Produto.PreoUnitrio, [Detalhes do
Pedido].PreoUnitrio
campo1, campo2,
campoN
a lista de campos a ser recuperada. Se voc incluir mais de um
campo, eles sero recuperados na ordem listada.
O campo pode ser uma expresso literal, matemtica ou lgica.
Os nomes dos campos so usados nas clusula ORDER BY para
Microsoft Access Avanado
63
definir a ordem de classificao e na clusula GROUP BY para
definir os grupamentos.
alias1, alias2, aliasN Os nomes a serem utilizados como cabealhos de coluna em lugar
dos nomes originais de coluna em tabela. Se omitido, assume o
valor da propriedade Legenda na estrutura da tabela. Caso a
propriedade Legenda esteja em branco, assume o nome do campo.
Se um dos campos for uma expresso e no for definido um alias,
assumido Expr1, Expr2, Expr3 e assim por diante.
Voc no pode usar alias nas clausulas ORDER BY nem em
GROUP BY.
Expressodetabela O nome da tabela ou relacionamento de tabelas contendo os dados
que voc deseja recuperar.
Bancodedadosexterno O nome do banco de dados que contm as tabelas em
expressodetabela se elas no estiverem no banco de dados atual.
Critrioswhere uma expresso lgica que filtra os registros que atendam ao
critrio definido na expresso.
Critrioshaving uma expresso lgica que filtra os registros aps eles terem sidos
agrupados. A clusula HAVING deve obrigatoriamente vir com a
clusula GROPU BY.
Nomes de campos ou de tabelas ou de alias que possuam espaos devem vir entre
colchetes. Exemplo:
SELECT CD_Matric AS Matrcula, [Nome do empregado] AS Nome FROM [Cadstro de
Pessoal]
6.2.1.1. Argumento Predicado
O argumento predicado assume valores que so palavras reservadas da linguagem
SQL. Os predicados podem ser as seguintes palavras reservadas:
PREDICADO FINALIDADE
ALL Indica que sero selecionados todos os registros que atendam aos critrios da seleo.
assumido se nenhum predicado for utilizado.
DISTINCT Omite registros que contm dados duplicados em campos selecionados.
DISTINCTROW Omite dados com base em registros inteiramente duplicados e no somente campos
duplicados.
TOP n
[PERCENT]
Retorna um nmero fixo de registros que ficam na parte superior ou inferior de um intervalo
especificado por uma clusula ORDER BY.
Para enteder o predicado, considere as tabelas:
CLIENTES
ID_CLIENTE NOME SOBRENOME DT_NASC CARGO
1 JOSE SANTOS 06/07/1956 001
2 PAULO VIANNA 07/09/1952 002
3 SIMONE CASTRO 10/11/1965 001
4 CARLOS SANTOS 21/01/1960 001
5 PENELOPE CHARMOSA 07/09/1952 002
Microsoft Access Avanado
64
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 no ter efeito porque h mais
de um campo selecionado.
SELECT DISTINCT Clientes.* FROM Clientes
PREDICADO DISTINCTROW
A consulta a seguir retornar todos os registros da tabela Clientes, exceto o cliente Paulo
Vianna.
SELECT DISTINCTROW Clientes.*
FROM Clientes INNER JOIN Pedidos
ON Clientes.ID_CLIENTE = Pedidos.ID_CLIENTE
Se o predicado DISTINCTROW no fosse usado, apareceriam mltiplas linhas para os clientes
com mais de um pedido.
Esta consulta a seguir no sofre o efeito de DISTINCTROW pois no existem registros repetidos,
j que NR_PEDIDO tem valor distinto em cada valor.
SELECT DISTINCTROW Clientes.*, Pedidos.NR_PEDIDO
FROM Clientes INNER JOIN Pedidos
ON Clientes.ID_CLIENTE = Pedidos.ID_CLIENTE
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"
Microsoft Access Avanado
65
ORDER BY DT_NASC
A consulta a seguir retornar os nomes de 2% dos clientes mais idosos, cujo cargo 001.
SELECT TOP 2 NOME
FROM Clientes
WHERE CARGO ="001"
ORDER BY DT_NASC
O predicado TOP no distingue valores iguais. Portanto, a consulta a seguir retornar
dois registros e no somente um.
SELECT TOP 1 NOME
FROM Clientes
WHERE CARGO = "002"
ORDER BY DT_NASC
6.2.1.2. Expresses na lista de campos
Em qualquer dialeto da SQL possvel usar expresses literais, matemticas ou
lgicas como se fosse um campo de uma tabela. Por exemplo:
SELECT CdigoDoProduto, PreoUnitrio, Quantidade, Desconto,
((PreoUnitrio * Quantidade) (PreoUnitrio * Quantidade * Desconto)) AS
Subtotal
FROM [Detalhes do Pedido]
No existe um campo subtotal na tabele Detalhes do Pedido. Ele o alias da expresso
que calcula o subtotal de um item do pedido. Quando se usa expresso nas lista de campos,
ela se chama campo calculado.
Linguagens SQL como o Microsoft SQL Server possui funes prprias da linguagem
as quais podem ser usadas para criar campos calculados. A diferena do Microsoft Jet
Database Engine SQL que voc pode usar funes do prprio Microsoft Jet Database
Engine SQL, funes do VBA e funes definidas pelo usurio para criar campos calculados.
O Microsoft Jet Database Engine SQL possui a funo agregada Avg() para calcular a
mdia de um valor.
SELECT Avg(PreoUnitrio) AS [Mdia de preos] FROM Produtos
O Microsoft Jet Database Engine SQL no possui a funo WeekDay(), que do
VBA. Mas voc pode us-la em expresses SQL que sero executadas no MS Access ou no
MS Visual Basic.
SELECT WeekDay(DataDoPedido) AS [Dia da semana] FROM Pedidos
Procedimentos do tipo Function, criadas em mdulo padro e com visibilidade Public,
podem ser usadas na contruo de campos calculados. Veja este exemplo:
SELECT NomeDoProduto, Fatura(Quantidade, PreoUnitrio) AS Valor
FROM [Detalhes do Pedido]
O cdigo do procedimento Fatura fica alojado no mdulo padro.
Function Fatura(Qtd, PreoUnit) As Currency
Microsoft Access Avanado
66
If Qtd < 5 Then ' No tem desconto
Fatura = Qtd * PreoUnit
Else ' Tem desconto de 10% sobre a fatura
Fatura = (Qtd * PreoUnit) * 0.90
End If
End Function
6.2.1.3. Argumento Expressodetabela
O argumento de tabela pode ser apenas o nome de uma tabela, como no exemplo:
SELECT * FROM Produtos
Entretanto, ela pode ser composta por mais de uma tabela, como no exemplo:
SELECT NmeroDoPedido, NomeDoProduto, [Detalhes do Pedido].PreoUnitrio,
Quantidade
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
No caso anterior, as tabelas Produtos e Detalhes do Pedido esto relacionadas pelo
campo CdigoDoProduto, que constam nas duas tabelas. Relembrando a modelagem de
dados, a cardinalidade entre Produtos e Detalhes do Pedido uma-para-muitos.
CdigoDoProduto na tabela Produtos chave primria (primary key) enquanto
CdigoDoProduto na tabela Detalhes do Pedido chave estrangeira (foreing key).
A clusula INNER JOIN especifica que h um relacionamento entre as tabelas, do tipo
de associao 1. No modo estrutura, o tipo de associao definido na caixa de dilogo
mostrada a seguir.
Os tipos de associaes so:
Tipo de
associao
Clusula SQL Descrio Representao
do conjunto
1 INNER JOIN Inclui somente os registros
cujos valores dos campos
relacionados so iguais. Isto
quer dizer que retorna
somente os dados da
interseo entre as duas
Microsoft Access Avanado
67
tabelas
2 LEFT JOIN Inclui todos os registros da
tabela esquerda e somente
os registros da tabela
direita quando os valores dos
campos relacionados forem
iguais.
3 RIGHT JOIN Inclui todos os registros da
tabela direita e somente os
registros da tabela esquerda
quando os valores dos
campos relacionados forem
iguais.
Dizer qual tabela est direita e qual est esquerda depende da ordem em que elas
so escritas na expresso. 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 so 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 no tem efetio quando se usa
INNER JOIN.
INNER JON, LEFT JOIN e RIGHT JOIN simplesmente diz quais tabelas e os tipos de
associaes existentes entre elas, mas no define quais os campos relacionados. Aps escrever
os nomes das tabelas e o tipo de associao, acrescenta-se a clusula ON seguido dos campos
relacionados. No exemplo a seguir, as tabelas so relacionados pelo campo CdigoDoProduto
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
Note que como os nomes dos campos so iguais nas duas tabelas, necessrio colocar
o nome da tabela antes dos nomes dos campos, separados por ponto.
Normalmente o operador de comparao o =. Mas voc pode usar >, >=, <., <= ou
<>. No comum usar operadores que no seja o =, mas se voc us-los, o modo Estrutura
no consegue exibir este relacionamento.
Casos os relacionamento seja com dois ou mais campos, voc deve usar o operador
lgico AND.
SELECT *
FROM Table1 INNER JOIN Table2
ON (Table1.B = Table2.B) AND (Table1.A = Table2.A)
Voc pode mais de duas tabelas relacionadas. O modo de contruo o mesmo.
SELECT *
FROM Produtos INNER JOIN (Pedidos INNER JOIN [Detalhes do Pedido]
ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido)
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
Microsoft Access Avanado
68
Note o uso de parnteses na juno entre Pedidos e Detalhes do Pedido. Somente
depois desta juno feita a juno com Produtos.
6.2.1.4. Tabelas em banco de dados externos
Como voc viu na introduo deste cursos, dados e processos residem em arquivos
diferentes. Voc pode construir uma consulta ou uma expresso SQL para acess-los sem ter
que vincular tabelas.
Isto possvel com a clusula IN do SQL.
SELECT * FROM Clientes INNER JOIN Pedidos
ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente
IN "D:\CursosOffice\AccessBasico\NW.mdb"
No caso, as duas tabelas devem estar no mesmo banco de dados. Voc no 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 captulo sobe acesso a banco de dados h a lista completa dos argumentos para a
clusula IN.
SELECT * from Customers
IN "" [Excel 8.0; DATABASE=C:\Book1.xls]
Para melhor desempenho, use tabelas vinculadas em vez da clusula IN.
6.2.1.5. Clusula Where
Enquanto o argumento listadecampos restringe quais campos devem ser recuperados,
a clusula WHERE restringue quais linhas devem ser recuperadas. A cluslua WHERE define
uma expresso lgica sob a qual cada registro validado. Se atender condio imposta pela
expresso lgica, o registro recuperado, caso contrrio desprezado.
Operadores lgicos
A expresso lgica pode conter os um ou mais dos seguintes operadores relacionais:
= (igual)
< (menor)
<= (menor ou igual)
> (maior)
>= (maior ou igual)
<> (diferente)
Os operandos podem ser campos, campos calculados ou constantes que, se forem do
mesmo tipo de dados, podem ser comparados com um dos operadores relacionais.
No Microsoft Jet Database Engine SQL no se admite variveis na expresso lgica.
Se voc utilizar uma varivel e criar a consulta, esta ser assumida como um parmetro da
consulta. Se tentar usar varivel em expresso SQL, tal colocao acarretar em erro em
tempo de execuo.
Microsoft Access Avanado
69
Voc pode usar variveis em expresso SQL por meio de um artifcio, como mostrado
abaixo.
Dim strSql As String
Dim intNumeroPedido As Integer
IntNumeroPedido = InputBox("Qual o nmero do pedido?")
strSql = "SELECT NmeroDoPedido, CdigoDoCliente, DataDoPedido, "
strSql = strSql & "DataDeEntrega, DataDeEnvio "
strSql = strSql & "FROM Pedidos WHERE NmeroDoPedido " & intNumeroPedido
A consulta a seguir recuperar todos os campos da tabela Produtos, retornando
somente os registros cujo valor unitrio (campo PreoUnitrio) seja maior que 10.
SELECT * FROM Produtos WHERE PreoUnitrio > 10
Note que a comparao entre um campo e uma constante. Apesar de o campo ser do
tipo moeda (currency) o valor da constante no contm o smbolo da unidade monetria R$.
Operadores lgicos
Se for necessrio fazer mais comparaes, voc pode utilizar-se dos operadores
lgicos AND, OR e NOT. A comparao se faz entre dois operandos de cada vez. Voc no
pode ter uma expresso do tipo A > B > C. Ela deve ser escrita da forma A > B AND B > C
SELECT * FROM Produtos WHERE PreoUnitrio > 10 AND NOT Descontinuado
Operadores IN, BETWEEN e LIKE
Alm dos operadores relacionais e dos operadores lgicos, voc pode operadores IN,
BETWEEN e LIKE
IN significa contido em um conjunto discreto de valores. Por exemplo, In (A+,
B+, O+, AB+) especifica um critrio que seleciona somente os de tipo sangneo RH
positivo. No confunda o operador IN com a instruo IN.
SELECT * FROM [Detalhes do Pedido]
WHERE CdigoDoProduto IN(14,24,48,55)
Between filtra os valores que esto dentro de um conjunto contnuo 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#
Like permite um comparao parcial de string, conforme a mscara de comparao.
Pode-se usara caracteres especiais na mscara.
Caracter Funo Mscara Retorna
* Retorna caracteres
mltiplos
o*o
*ab*
*ANA
k*
ovo, Ocaso, osso, OTELO
abc, Abdomem, cabea
Fabiana, cana, CABANA
Katana, kibe, kamikaze
? Retorna carater simples o?o Oco, ovo, OMO
# Retorna dgito simples MI# Mi6, mi2, MI0
[] Retorna intervalo de
valores
b[a-m] Ba, bb, BC, BJ, bf
Microsoft Access Avanado
70
[!] Retorna valores fora do
intervalo
b[!a-m]
A[!0-9]
bx, BW, BV
AA, A$, ac, A+
SELECT * FROM Clientes
WHERE NomeDoContato LIKE "mar*"
Outras expresses
A expresso lgica da clusula WHERE pode conter ainda as constantes definidas
pelo sistema True e False, expresses (como Is Null), funes do VBA e funes definidas
pelo usurio.
SELECT * FROM Funcionarios
WHERE False
SELECT * FROM Pedidos
WHERE DateDiff("d, DataDoPedido, DataDeEntrega) > 5
SELECT NomeDaEmpresa
FROM Clientes LEFT JOIN Pedidos
ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente
WHERE NmeroDoPedido Is Null
6.2.1.6. Funes agregadas SQL
Funces agregadas SQL efetuam clculos com um conjunto de registros, retornando
valores sumarizados. Por exemplo, se voc quiser saber o valor total dos pedidos, ter de usar
a funo agregada SUM. Voc no saber o valor de cada pedido, mas sim a soma de todos os
registros de pedidos.
As funes agregadas so:
FUNO FINALIDADE
AVG (Mdia) Calcula a mdia aritmtica de um conjunto de valores contidos em um campo especificado
em uma consulta.
COUNT (Contar) Calcula o nmero de registros que retornam de uma consulta.
MAX (Mx) Retorna o valor mximo de um conjunto de valores contidos em um campo especificado em
uma consulta
MIN (Mn) Retorna o valor mnimo de um conjunto de valores contidos em um campo especificado em
uma consulta.
STDEV,
STDEVP (Desv)
Retorna a estimativa do desvio padro de uma populao ou de uma amostra de uma
populao representada como um conjunto de valores contidos em um campo especificado
em uma consulta.
SUM (Soma) Retorna a soma de um conjunto de valores contidos em um campo especificado em uma
consulta.
VAR, VARP
(Var)
Retorna as estimativas da varincia de uma populao ou de uma amostra da populao
representada como um conjunto de valores contidos em um campo especificado em uma
consulta.
FIRST
(Primeiro)
Retorna o primeiro registro de um conjunto de registros retornado por uma consulta.
LAST (ltimo) Retorna o primeiro registro de um conjunto de registros retornado por uma consulta.
Exemplos:
SELECT COUNT(*) AS [Qtd Itens] FROM [Detalhes do Pedido]
Microsoft Access Avanado
71
SELECT MIN(DateDiff("d, DataDoPedido, DataDeEntrega)) AS [Prazo mnimo],
AVG(DateDiff("d, DataDoPedido, DataDeEntrega)) AS [Prazo Mdio],
MAX(DateDiff("d, DataDoPedido, DataDeEntrega)) AS [Prazo Mximo]
FROM Pedidos
6.2.1.7. Clusulas GROUP BY e HAVING
As clusulas GROUP BY e HAVING so usadas em conjunto com as funes
agregadas SQL.
GROUP BY agrupa os registros por um ou mais campos. Por exemplo, se voc quiser
saber o prazo mdio de entrega de cada pedido, deve agrupar pelo campo do
NmeroDoPedido
SELECT Pedidos.NmeroDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
GROUP BY Pedidos.NmeroDoPedido
Todos os campos que aparecerem na lista de campos devem obrigatoriamente ser um
campo de agrupamento ou alvo de uma funo SQL. A consulta abaixo falhar porque
DataDoPedido no faz parte de GROUP BY nem de uma funo agregada.
SELECT NmeroDoPedido, DataDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
GROUP BY NmeroDoPedido
A clusula HAVING semelhante ao WHERE, porm atua sobre os registros
retornados. O exemplo abaixo primeiramente calcula a mdia e depois filtra os registros cujas
mdias sejam maior que 20.
SELECT NmeroDoPedido, DataDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
GROUP BY NmeroDoPedido
HAVING Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) > 20
A clusula WHERE atua antes da agregao. No exemplo abaixo, a clusula WHERE
primeiramente filtra somente os pedidos do ano 1996, depois calculada a mdia e a clusula
HAVING filtra os que ultrapassaram a mdia de 20 dias.
SELECT NmeroDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
WHERE Year(DataDoPedido) = 1996
GROUP BY NmeroDoPedido
HAVING Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) > 20
6.2.2. Consulta de atualizao
A consulta de atualizao no retorna nenhum conjunto de registros, mas sim atualiza
um ou mais campos de uma tabela ou mais tabelas.
UPDATE {expressodetabela}
SET campo1 = valor1 [, campo2 = valor2] [, campoN = valorN]
Microsoft Access Avanado
72
[WHERE {condioWhere}]
No exemplo abaixo, os campos Via e Quantidade so atulizados. Os campos so de
tabelas distintas. A atualizao afeta somente os itens de produtos descontinuados.
UPDATE Produtos INNER JOIN (
Pedidos INNER JOIN [Detalhes do Pedido]
ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido )
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
SET Pedidos.Via = 1, [Detalhes do Pedido].Quantidade = 6
WHERE Descontinuado
6.2.3. Consulta de excluso
A consulta de excluso elimina os registros de uma nica tabela. Se voc no definir
uma condio na clusula WHERE, todos os registros sero excludos. A tabela de onde o
registros forem excludos pode estar relacionada a outras tabelas.
DELETE [tabela.*]
FROM {expressodetabela}
[WHERE {condioWhere}]
Para excluir registros de uma nica tabela, sem relacionamento, a sintaxe :
DELETE * FROM {tabela}
Caso haja tabelas relacionadas, voc deve especificar o nome da tabela de onde osz
registros devem ser excludos. Exemplo:
DELETE [Detalhes do Pedido].*
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
WHERE Descontinuado
Se a tabela possuir integridade referencial do tipo resctrict, os registros no sero
excludos. Se a integridade for do tipo cascade, os registros da tabela relacionada tambm
sero excludos.
6.2.4. Consulta acrscimo
Voc pode inserir um nico registro em uma tabela ou vrios registros provenientes de
uma seleo em outra tabela.
Para um nico registro, a sintaxe :
INSERT INTO {tabela} [(campo1, campo2, campoN, ...)]
VALUES (valor1, valor2, valorN, ...)
A identificao da lista de campos opcional. Se voc no a defnir, os valores sero
inseridos na mesma ordem em que os campos foram criados no modo Estrutura da tabela.
INSERT INTO Table1
VALUES ("0033", "PEG SUE", 2, "SP")
Microsoft Access Avanado
73
Se definir a lista de campos, cada valor estar associado ao campo na ordem em que
foram digitados na instruo INSERT.
INSERT INTO Table1 (EstadoCivil, UF, Nome, Matricula)
VALUES ( 1, "MG", "CARLOS KOGA","0021")
Se voc no especificar todos os campos da tabela, o campo omitido assumir o valor
padro ou nulo, caso as propriedades Valor padro e Requerido estejam configurados na
estrutura da tabela. Suponha que os campos EstadoCivil possua a propriedade Requerido=No
e UF possui a propriedade Valor Padro = MG. As instrues abaixo inseriro dois
registros com o campo EstadoCivil como nulo e UF com MG.
INSERT INTO Table1 (Matricula, Nome)
VALUES ("0021", "CARLOS KOGA")
INSERT INTO Table1
VALUES ("0033", "PEG SUE")
Voc pode explicitamente inserir nulo usando a constante NULL.
INSERT INTO Table1
VALUES ("0033", "PEG SUE", NULL)
A insero deve respeitar todas as restries da tabela, tais como unicidade de chave
primria, integridade referrencial, valor requerido, regra de validao, 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
6.2.5. Consulta de criao de tabela
Microsoft Access Avanado
74
7. FORMULRIOS AVANADOS
Os formulrios podem ser usados como:
Formulrio de manuteno de tabelas
Caixa de dilogo
Formulrio de consulta
Caixa de mensagem
Formulrios de manuteno de tabelas podem ser criadas facilmente pelo Assistente
de Formulrio. Tais formulrios, criados por Assistentes, so simples e carecem de
aprimoramento. Via programao, podemos aperfeio-las, incluindo cdigo de validao de
dados, controle de fluxo, botes de navegao personalizados, botes para incluso de novos
registros, para excluso de registros, para alterao de dados e para pesquisa.
7.1. FORMULRIO DE MANUTENO DE TABELAS
Um formulrio simples, criado pelo Assistente de Formulrio ou diretamente pelo
modo estrutura, possui uma fonte de dados - a propriedade Origem do registro
(RecordSource), e controles acoplados que se referem a cada um dos campos da origem do
registro. Controles acoplados possuem o nome do campo na propriedade Origem do controle
(ControlSource).
Os controles podem ser de diversos tipos, dependendo da caracterstica do dado que o
campo contm, como por exemplo caixa de texto, caixa de combinao, caixa de verificao,
caixa de grupo, etc.
Voc pode ter tambm controles calculados, cuja propriedade Origem do controle
contm uma expresso.
A navegao de registros, isto , o avano e retrocesso de registros pelo formulrio,
feita pelos Botes de navegao (NavigationButtons). Os botes de navegao incluem a
operao de incluso de novos registros
As operaes de filtragem, excluso e pesquisa de registros e impresso do formulrio
so realizadas pela barra de menus ou pela barra de ferramentas.
Note que todas as operaes citadas acontecem a partir de uma nica tela. No h um
formulrio especfico para consulta, outro incluso e outro para edio (alterao e excluso).
Isto leva pergunta: Qual a melhor forma de construir formulrios de manuteno de
tabelas?. A resposta sempre Depende.
7.1.1. Botes de Navegao Personalizados
Em vez de usar os botes de navegao do formulrio, voc pode criar botes
personalizados para navegar pelos registros. Basta criar botes de comando e vincular a
cdigo VBA. A propriedade Botes de navegao do formulrio definida como No.
Microsoft Access Avanado
75
Private Sub cmdFirstRecord_Click()
DoCmd.RunCommand acCmdRecordsGoToFirst
End Sub
Private Sub cmdPreviousRecord_Click()
On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToPrevious
End Sub
Private Sub cmdNextRecord_Click()
On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToNext
End Sub
Private Sub cmdLastRecord_Click()
DoCmd.RunCommand acCmdRecordsGoToLast
End Sub
O boto de comando cmdPreviousRecord possui a linha On Error Resume Next para
que no ocorra erro ao tentar retroceder um registro quando se est no primeiro registro. O
boto de comando cmdPreviousRecord possui a linha On Error Resume Next para que no
ocorra erro ao tentar avanar um registro quando se est no ltimo registro.
H um erro de comportamento neste formulrio. A navegao deveria ocorrer somente
com os botes personalizados. Entretanto, a tecla Tab, alm de mudar de campo, muda de
registro quando se encontra no ltimo campo. Para desabilitar esta caractersitca, altere a
propriedade de formulrio Ciclo (Cycle) para Registro corrente (Current Record).
Outro problema que cmdNextRecord adiciona um registro ao tentar avanar alm do
ltimo registro. Para resolver isto, altere a propriedade de formulrio Permitir adio (Allow
Additions) para No.
Microsoft Access Avanado
76
7.2. CAIXA DE DILOGO
Uma caixa de dilogo serve para captar dados que sero enviados como parmetros de
procedimento, consulta, relatrio ou outro formulrio.
Antes de explicar como enviar parmetros, voc deve definir as propriedades de um
formulrio para desempenhar o papel de caixa de dilogo:
Propriedade do formulrio Valor
Guia Formato (Format)
Legenda (Caption) O ttulo da caixa de dilogo
Modo padro (Default View) Formulrio simples (Single form)
Modos permitidos (Views Allowed) Formulrio (Form)
Barras de rolagem (Scroll bars) Nenhuma (Neither)
Seletores de registro(Record Selectors) No (No)
Botes de navegao (Navigation Buttons) No (No)
Linhas divisrias (Dividing Lines) No (No)
AutoCentralizar (Auto Center) Sim (Yes)
Estilo da vorda (Border Style) Dilogo (Dialog)
Botes Min Max (Min Max Buttons) Nenhum (None)
Guia Dados (Data)
Origem do registro (RecordSource) Vazio
Uma caixa de dilogo ter dois botes de comando: Um para prosseguir (Ok) e outro
para fechar a caixa de dilogo (Fechar). Normalmente, as propriedades e eventos dos botes
de comando so:
Propriedade Valor
Legenda (Caption) &Ok
Nome (Name) cmdOk
Padro (Default) Sim (Yes)
AoClicar (Onclick) Chamada especfica (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 so no acopladas e recebem os valores que
sero passados como parmetros para proicedimentos, consultas parametrizadas, relatrios e
formulrios.
Microsoft Access Avanado
77
7.2.1. Passagem De Parmetros Para Procedimento
Esta a tcnica mais simples. O procedimento chamado pelo formulrio pode ser Sub
ou Function definido em mdulo atrs do formulrio (mdulo de classe de formulrio) ou em
mdulo padro. O evento AoClicar do boto 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
7.2.2. Passagem De Parmetros Para Consulta Parametrizada
As consultas parametrizadas possuem critrio dinnico, ou seja, o valor do critrio de
filtragem da consulta informado quando da execuo da consulta. Por exemplo, a consulta
seleo, cujo cdigo SQL mostrado a seguir, pedir o valor do parmetro [Qual o nmero do
pedido] por meio de uma caixa de dilogo simples.
SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente,
Pedidos.DataDoPedido
FROM Pedidos
WHERE Pedidos.NmeroDoPedido = [Qual o nmero do pedido];
Esta no uma forma elegante de passar parmetros para consulta, pois para cada
parmetro da consulta ser aberta uma caixa de dilogo. Estas caixas de dilogo de consulta
parametrizada no validam nenhum dado informado pelo usurio.
A soluo criar um formulrio do tipo caixa de dilogo que receber todos os
parmetros de uma s vez e o boto Ok acionar a consulta. Os parmetros podem ser
formatados e/ou validados pelo formulrio antes de ser enviado para a consulta, garantindo
que o usurio informe parmetros vlidos para a consulta.
Para demonstrar a soluo da consulta do exemplo acima, construiremos uma caixa de
dilogo chamada frmDlg_Consulta_Pedido. Ela conter os botes cmdOk e cmdFechar, como
visto anteriormente. A caixa de texto txtNumeroPedido no acoplada e o seu valor ser
passado como parmetro para a consulta qryConsulta_Pedido.
Microsoft Access Avanado
78
O boto cmdOk conter o seguinte cdigo VBA associado ao evento AoClicar
Private Sub cmdOk_Click()
DoCmd.OpenQuery "qryConsulta_Pedido"
End Sub
A consulta qryConsulta_Pedido ter o seguinte cdigo SQL.
SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente,
Pedidos.DataDoPedido
FROM Pedidos
WHERE Pedidos.NmeroDoPedido =
Forms![frmDlg_Consulta_Pedido].txtNumeroPedido;
A consulta funciona porque o formulrio est aberto e seus controles podem ser
acessados por outros objetos do Access.
Esta tcnica til para aplicativos em que a segurana no um ponto importante.
Note que a janela folha de dados da consulta, caso seja uma consulta seleo ou referncia
cruzada, aberta, permitindo que o usurio possa alterar a estrutura, modificar os dados ou
excluir registros. A tcnica de tela de consulta, como veremos mais adiante, resolve estes
problemas.
7.2.3. Passagem De Parmetros Para Relatrio
s vezes precisamos de relatrios mais flexveis, 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 seleo).
Uma alternativa de soluo criar uma consulta parametrizada, passando parmetros
pelo formulrio. O relatrio ento se basear nesta consulta.
Por exemplo, o formulrio frmDlg_Relatorio_Pedido contm as caixas de texto no
acopladas txtDataInicial e txtDataFinal. Estes controles so parmetros para a consulta
qryRelatorio_Pedido.
Microsoft Access Avanado
79
A consulta qryRelatorio_Pedido possui o cdigo SQL.
SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente,
Pedidos.DataDoPedido
FROM Pedidos
WHERE Pedidos.DataDoPedido BETWEEN
Forms![frmDlg_Relatorio_Pedido].txtDataInicial AND
Forms![frmDlg_Relatorio_Pedido].txtDataFinal;
O relatrio rptRelatorio_Pedido baseado na consulta qryRelatorio_Pedido, ou seja, a
sua propriedade Origem do registro (RecordSource) qryRelatorio_Pedido.
O boto cmdOk do formulrio frmDlg_Relatorio_Pedido contm o cdigo VBA
associado ao evento AoClicar.
Private Sub cmdOk_Click()
DoCmd.OpenReport "rptRelatorio_Pedido", acViewPreview
End Sub
Esta tcnica difcil de ser administrada devido interao de trs objetos do Access
(um formulrio, uma consulta e um relatrio). Quanto mais objetos o banco de dados possui,
maior a complexidade e mais difcil sua manuteno. Alm disso, esta tcnica restringe-se a
filtrar a origem do registro utilizando uma consulta parametrizada.
Uma outra tcnica mais elaborada baseia-se na possibilidade de acessar controles de
formulrios que esto abertos. Controles de formulrios abertos possuem visibilidade public,
ou seja, eles so acessveis em qualquer parte do Access. por isso que consultas
parametrizadas funcionam.
Uma caixa de dilogo para abrir relatrios podem construir uma expresso SQL em
tempo de execuo, armazen-la em uma caixa de texto oculta e ser usada como parmetro
para um relatrio. 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 manuteno. Alm disso, outros parmetros podem direcionar o
comportamento do relatrio, tal como definir a ordem de classificao, incluir mensagem ad-
hoc no relatrio, ocultar/exibir sees do relatrios, dentre outras possibilidades.
Para demonstrar esta tcnica, usaremos o mesmo exemplo acima.
O formulrio frmDlg_Relatorio_Pedido conter adicionalmente uma caixa de texto
txtSql, com estas propriedades configuradas:
Propriedade Valor
Visivel (Visible) Sim (Yes)
Parada de tabulao (Tab Stop) No (No)
Microsoft Access Avanado
80
O boto cmdOk conter o cdigo VBA associado ao evento AoClicar:
Private Sub cmdOk_Click()
Dim strSql As String
Dim strDataInicial As String
Dim strDataFinal As String
strDataInicial = Me.txtDataInicial
strDataFinal = Me.txtDataFinal
strSql = "SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente, "
strSql = strSql + "Pedidos.DataDoPedido "
strSql = strSql + "FROM Pedidos "
strSql = strSql + "WHERE Pedidos.DataDoPedido BETWEEN #"
strSql = strSql + strDataInicial + "# AND #" + strDataFinal + "#"
Me.txtSql = strSql
DoCmd.OpenReport "rptRelatorio_Pedido", acViewPreview
End Sub
O relatrio rptRelatorio_Pedido ter a propriedade Origem do registro
(RecordSource) vazia e o seguinte cdigo associado ao evento AoAbrir.
Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = Forms![frmDlg_Relatorio_Pedido].txtSql
End Sub
Usando esta tcnica, podemos modificar outras propriedades do relatrio em tempo de
execuo, usando parmetros da caixa de dilogo. O prximo exemplo acrescenta a opo de
ordem de classificao dos dados do relatrio. Uma caixa de grupo permite escolher se a
ordem ser por Nmero do pedido ou por Cdigo do cliente. Lembre-se que a clusula
ORDER BY da origem do registro no afeta a classificao do relatrio.
A propriedade que define a ordem de classificao dos dados no relatrio
GroupLevel. Um relatrio pode ter at 10 nveis de grupo. Assim, a propriedade GroupLevel
funciona como um vetor de 10 elementos. GroupLevel(0) o primeiro nvel de grupo.
GroupLevel possui as propriedades:
Propriedade Valor
Microsoft Access Avanado
81
ControlSource Campo ou expresso pelo qual os dados sero classificados
GroupOn Agrupamento dos dados. O padro agrupar por cada valor.
GroupInterval O intervalo pelo qual os dados so agrupados. O padro 1 (intervalo para cada valor)
KeepTogether Mantm ou no o grupo na mesma pgina quando impresso. O padro 0 (no
mantm na mesma pgina)
SortOrder False para ascendente (padro), True para descendente
O evento AoAbrir do relatrio rptRelatorio_Pedido conter o cdigo:
Private Sub Report_Open(Cancel As Integer)
Dim bytOpcao As Byte
Me.RecordSource = Forms![frmDlg_Relatorio_Pedido].txtSql
bytOpcao = Forms!frmDlg_Relatorio_Pedido.grpClassificacao
If bytOpcao = 1 Then
Me.GroupLevel(0).ControlSource = "NmeroDoPedido"
Else
Me.GroupLevel(0).ControlSource = "CdigoDoCliente"
End If
End Sub
7.2.4. Passagem De Parmetros Para Formulrio
A passagem de parmetros de um formulrio para outro pode usar a mesma tcnica de
passagem de parmetros para relatrio, mostrada acima. Entretanto, formulrios podem
receber parmetros de outra forma.
O objeto DoCmd possui o mtodo OpenForm, cuja sintaxe :
DoCmd.OpenForm formname[, view][, filtername][, wherecondition][, datamode][, windowmode][, openargs]
Argumento Descrio
formname O nome do formulrio a ser aberto.
view Uma das seguintes constantes intrnsecas:
acDesign
acFormDS
acNormal (padro)
acPreview
acNormal abre o formulrio no modo formulrio. Se voc deixar
em branco, assume o padro.
filtername Uma expresso que o nome de uma consulta vlida no banco de
dados. Pode ser tambm uma expresso SQL.
wherecondition Uma expresso de at 32768 caracteres para critrio de filtragem.
A sintaxe a mesma para a clusula WHERE da linguagem SQL,
exceto que no preciso colocar a palavra WHERE.
datamode Uma das seguintes constantes intrnsecas:
acFormAdd
acFormEdit
acFormPropertySettings (padro)
acFormReadOnly
Microsoft Access Avanado
82
Se voc deixar em branco, assume o padro, que abrir o
formulrio de acordo com o modos atribudo nas propriedades
Permitir edio (AllowEdits), Permitir excluso (AllowDeletions),
Permitir adio (AllowAdditions) e Entrada de dados
(DataEntry).
windowmode Uma das seguintes constantes intrnsecas:
acDialog
acHidden
acIcon
acWindowNormal (padro)
Se voc deixar em branco, assume o padro.
openargs Uma expresso literal passada como argumento.
Os argumentos filtername e wherecondition compem a propriedade Filtro (Filter) do
formulrio. Se voc especificar ambas, o valor da propriedade Filtro ser uma expresso
lgica com as duas condies ligadas pelo operador lgico AND.
Por exemplo, se filtername for definido como:
"SELECT Clientes.* FROM Clientes WHERE Left([CdigoDoCliente],1)='A'"
a propriedade Filtro ter o valor:
(Left([CdigoDoCliente],1)='A')
Se alm de filtername for especificado wherecondition como:
"Cidade = 'Mxico D.F.'"
a propriedade Filtro ter o valor:
(Cidade = 'Mxico D.F.') AND (Left([CdigoDoCliente],1)='A')
Voc pode construir um filtro em tempo de execuo usando os argumentos filtername
e wherecondition. Por exemplo, suponha que o formulrio frmClientes apresente todos os
registros da tabela Clientes do banco de dados Northwind. Voc deseja consultar/editar
somente os registros dos clientes de uma cidade especificada em uma caixa de dilogo
frmDlg_Formulario_Clientes. O procedimento de evento AoClicar do boto cmdOk da caixa
de dilogo conter este cdigo:
Private Sub cmdOk_Click()
Dim strCidade As String
Dim strWhereCondition As String
strCidade = Me.txtCidade ' uma caixa de texto no acoplada
strWhereCondition = "Cidade = '" + strCidade + "'"
DoCmd.OpenForm "frmClientes", , , strWhereCondition
End Sub
Uma outra forma de passar parmetros de um formulrio para outro usar o
argumento openargs do DoCmd. openargs um texto que pode ser capturado no formulrio
especificado em formname usando a propriedade de formulrio OpenArgs. Esta propriedade
deve estar em um cdigo dentro do procedimento de evento AoAbrir do formulrio que ser
aberto por DoCmd.
Microsoft Access Avanado
83
Suponha que voc tenha que abrir o formulrio frmClientes e queira posicionar no
registro referente ao cliente ANTON. Construa um procedimento que abra o formulrio
frmClientes, passando ANTON como argumento. Aqui, o procedimento chama-se
AbreCliente.
Sub AbreCliente()
DoCmd.OpenForm "frmClientes", , , , , , "ANTON"
End Sub
O procedimento de evento AoAbrir do formulrio frmClientes conter o cdigo:
Private Sub Form_Open(Cancel As Integer)
Dim strCliente As String
Dim rstCopia As Recordset
If Not IsNull(Me.OpenArgs) Then
strCliente = Me.OpenArgs
Set rstCopia = Me.RecordsetClone
rstCopia.FindFirst "CdigoDoCliente= '" + strCliente + "'"
If Not rstCopia.NoMatch Then
Me.Bookmark = rstCopia.Bookmark
End If
End If
End Sub
A propriedade RecordsetClone do formulrio cria uma cpia da origem do registro
(propriedade RecordSource do formulrio) e armazena na varivel rstCopia. usado o
mtodo FindFirst para localizar o cliente ANTON, valor este capturado pela propriedade
OpenArgs do formulrio. A propriedade NoMatch do objeto recordset (veja Acesso a Banco
de Dados) indica se o registro foi localizado ou no. Caso seja localizado, a propriedade
Bookmark posiciona o registro correto para ser exibido no formulrio frmClientes.
7.3. FORMULRIO DE CONSULTA
Abrir uma consulta criada na guia Consulta da janela Banco de Dados a maneira
mais simples de visualizar dados. Entretanto, o modo Folha de Dados de uma consulta possui
uma apresentao pobre. Na realidade, o modo Folha de Dados no s para consulta, pois
permite que o usurio apague ou altere dados.
Microsoft Access Avanado
84
Usar formulrio e sub-formulrio uma boa alternativa para se visualizar dados
somente para leitura.
O primeiro passo criar um subformulrio para a apresentar os detalhes. As principais
propriedades do subformulrio so:
Propriedade Valor
Nome SubfrmDetalhes_Pedido
Origem do Registro SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, [Detalhes do
Pedido].PreoUnitrio, [Detalhes do
Pedido].Quantidade, [Detalhes do Pedido].Desconto,
([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade]
AS SubTotal
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto;
Modo Padro Formulrios contnuos
Microsoft Access Avanado
85
Barras de Rolagem Somente vertical
Seletor de Registros No
Botes de Navegao No
Permitir edies No
Permitir excluses No
Permitir adies No
O formulrio principal conter o subformulrio, entretanto, no haver vnculo entre
eles, ou seja, no h um campo que relacione os valores do formulrio e do subformulrio. A
propriedade Origem do Registro (RecordSource) do subformulrio ser definido via
programao.
Pode haver um ou mais caixas de texto ou caixa de combinao no acoplados, cujos
valores sero o filtro para a apresentao dos registros no subformulrio. Por esta razo no
necessrio haver vinculao entre formulrio e subformulrio. Neste exemplo, o filtro feito
pela caixa de combinao cboNumeroPedido. Este valor ser usado na construo da
expresso SQL que ser a Origem do Registro do subformulrio. A instruo SQL criada ao
abrir o formulrio, ao clicar no boto Buscar e ao clicar o boto Limpar.
A instruo SQL no evento AoAbrir a mesma no evento AoClicar. Constri-se a
instruo tal qual foi feito no subformulrio, mas acrescenta-se a clusula WHERE False
para no apresentar nenhum registro.
Private Sub Form_Open(Cancel As Integer)
Dim strSql As String
strSql = "SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreoUnitrio , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto where false"
Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
Me.subfrmDetalhes_Pedido.Requery
Me.txtTotal = 0
Me.txtRegistros = 0
End Sub
Na linha de instruo Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
atribudo o valor da propriedade Origem do Registro do subformulrio. Na linha seguinte
utilizado o mtodo Requery para que o subformulrio re-execute a instruo SQL.
O evento AoClicar possui um cdigo semelhante, apenas h o acrscimo da inibio
do boto Exportar XLS e a limpeza do valor na caixa de combinao cboNumeroPedido.
Private Sub cmdLimpar_Click()
Dim strSql As String
Microsoft Access Avanado
86
strSql = "SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreoUnitrio , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto 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
O boto Buscar que realiza a busca dos registros a serem apresentados no
subformulrio. No exemplo, foram includas duas funcionalidades opcionais: clcular o valor
do pedido e a quantidade de itens a serem apresentados nas caixas de texto txtTotal e
txtRegistros e criar uma consulta para que os dados sejam exportados para o MS Excel.
Note que o boto Exportar XLS somente habilitado (propriedade Enabled) aps a
criao da consulta qryExportXLSTemp
Private Sub cmdBuscar_Click()
Dim rst As Recordset
Dim strSql As String
Dim intNumPedido As Variant
Dim curTotal As Currency
Dim dblQtdRegistros As Double
Dim qdf As QueryDef
' Cria a expresso SQL para que o subformulrio apresente os dados
intNumPedido = Me.cboNumeroPedido
strSql = "SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreoUnitrio , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto "
strSql = strSql + "WHERE [Detalhes do Pedido].NmeroDoPedido = " &
intNumPedido
Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
' Totaliza o valor do pedido
curTotal = 0
dblQtdRegistros = 0
Set rst = Me.subfrmDetalhes_Pedido.Form.RecordsetClone
Do While Not rst.EOF
curTotal = curTotal + rst("Subtotal")
dblQtdRegistros = dblQtdRegistros + 1
rst.MoveNext
Loop
Microsoft Access Avanado
87
rst.Close
Me.txtTotal = curTotal
Me.txtRegistros = dblQtdRegistros
' Cria uma consulta para ser exportada para o MS Excel
On Error Resume Next
CurrentDb.QueryDefs.Delete "qryExportXLSTemp"
Set qdf = CurrentDb.CreateQueryDef("qryExportXLSTemp", strSql)
Me.cmdExportToExcel.Enabled = True
End Sub
Como o boto Buscar cria uma consulta, a qryExportXLSTemp, em tempo de
execuo, podemos aproveit-la para exportar os dados para o Excel pelo mtodo
TransferSpreadsheet do objeto DoCmd.
Existe uma funo definida pelo usurio chamada CaixaDialogo_Save que ser
explicada mais adiante.
Private Sub cmdExportToExcel_Click()
Dim strFileName As String
strFileName = CaixaDialogo_Save("Salvar dados para MS Excel ", CurDir, _
"Microsoft Excel" + Chr$(0) + "*.xls" + Chr$(0), _
"Pedidos", "*.xls")
If strFileName = "" Then
MsgBox "Informe o nome do arquivo!"
Else
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel, _
"qryExportXLSTemp", strFileName
End If
End Sub
Finalmente, o boto Fechar possui o cdigo mais simples.
Private Sub cmdFechar_Click()
DoCmd.Close
End Sub
7.4. CAIXA DE MENSAGEM
O modo mais simples de se ter caixas de mensagem usar a intruo MsgBox ou a
funo MsgBox( ). O inconveniente disto estas caixas de mensagem sempre acarreta uma
pausa na execuo do programa, pois voc deve clicar em pelo menos um dos botes da
caixa.
Voc pode usar uma formulrio somente com mensagens, sem nenhum boto de
comando. Isto til, por exemplo, para exibir uma mensagem AGUARDE enquanto um
processamento longo executado.
Tipicamente um formulrio para ser usado como caixa de mensagem possui as
propriedades:
Propriedade Valor
Modo padro Formulrio simples
Modos permitidos Formulrio
Barras de rolagem Nenhum
Microsoft Access Avanado
88
Seletores de registro No
Botes de navegao No
Auto centralizar Sim
Estilo da borda Fino
Caixa de controle No
Botes Min e Max Ambos desativados
Boto fechar No
O cdigo para apresentar a caixa de mensagem deve ter as seguintes instrues:
DoCmd.OpenForm "nome_do_formulrio"
DoEvents
.
.
DoCmd.Close acForm, "nome_do_formulrio"
A primeira linha do cdigo abre o formulrio no modo formulrio. OpenForm um
mtodo do objeto DoCmd. A segunda contm a funo DoEvents que passa o controle para o
sistema operacional, permitindo que a janela seja exibida. Se no for colocada DoEvents, a
tela ficar congelada e nada ser exibido. A ltima instruo fecha o formulrio.
Microsoft Access Avanado
89
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 mtodos que lhe permitem realizar
todas as operaes necessrias para gerenciar tal sistema, incluindo recursos para criar banco
de dados, definir tabelas, campos e ndices, establecer relaes entre tabelas, navegar e
consultar o banco de dados, e assim por diante.
O Jet Engine traduz estas operaes de objetos de acesso a dados em operaes fsicas
sobre os prprios arquivos de banco de dados, tratando toda a mecnica da interface com os
diferentes bancos de dados suportados.
O Visual Basic, por meio do DAO e do Jet Engine reconhece trs categorias de bancos
de dados:
Bancos de dados nativos
So os bancos que utilizam o formato do Microsoft Access. Eles so criados e manipulados
diretamente pelo Jet Engine, e oferecem a mxima flexibilidade e velocidade.
Bancos de dados externos
So os bancos ISAM (Indexed Sequential Access Method), nos quais esto includos os
formatos dBase III, dBase IV, Btrieve, FoxPro, Paradox, arquivos texto, planilhas Excel e
planilhas Lotus 1-2-3.
Bancos de dados ODBC
So bancos de dados cliente/servidor que atendem ao padro ODBC, tais como o MS SQL
Server e o Oracle.
Existem outros mtodos de acesso a banco de dados que no utilizam o Jet Engine.
Somente para citar:
ODBCDirect
RDO e RDC
Chamada API do OBDC
ADO (ActiveX Data Objects)
8.1. Hierarquia do Objetos DAO
Para usar os objetos de acesso a dados, necessrio conhecer o modelo DAO.
Microsoft Access Avanado
90
No topo da hierarquia est o mecanismo de banco de dados do Jet Engine,
representado pelo objeto DBEngine. Ele o nico objeto que no est contido em nada.
Abaixo dele est uma coleo Workspaces (colees so usadas no plural dos objetos que ela
contm). A nica finalidade das colees conter outros objetos do mesmo tipo.
8.2. Sintaxe para Referenciar Objetos em Coleo
Os membros de uma coleo, isto , os objetos, podem ser acessados por um nmero
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 so identificados por um caminho completo das colees
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)
Alm do nmero ndice, usa-se uma referncia explcita do nome do objeto dentro da
coleo. Por exemplo, um campo CdigoDoLivro um objeto field dentro de uma coleo
Fields. Se ele for o primeiro campo, ele pode ser referenciado por:
Fields(0)
Ou
Fields(CdigoDoLivro)
Microsoft Access Avanado
91
8.3. Coleo Padro
A maior parte dos objetos de acesso a dados possui uma coleo padro. Por exemplo,
a coleo padro de recordset Fields. Isto permite omitir a coleo da sintaxe.
intCodigo = rst!CdigoDoLivro Obtm o valor do campo CdigoDoLivro
Que equivalente a:
intCodigo = rst.Fields!CdigoDoLivro
Ou :
intCodigo = rst.Fields(CdigoDoLivro)
Ou ainda :
intCodigo = rst.Fields(0)
Note que intCodigo uma varivel do tipo inteiro que armazena o valor do objeto e
no o objeto. Valor umas das propriedades do objeto.
8.4. Referncia a Objetos por meio de Variveis
Cada objeto pode (e s vezes deve) ser atribudo uma varivel do mesmo tipo do
objeto.
Dim wks As Workspace
Dim dbs As Database
Set wks = DBEngine.Workspaces(0)
Set dbs = wks.Databases(0)
Se quiser, pode economizar algumas linhas de cdigo com esta sintaxe:
Dim dbs As Database
Set dbs = DBEngine.Workspaces(0).Databases(0)
Neste caso especfico, a economia pode ser maior se se usar a funo CurrentDb para
retornar o banco de dados atual.
O uso de variveis simplifica a referncia a objetos nas mais baixas nveis da
hierarquia do DAO.
8.5. Propriedades e Mtodos
Microsoft Access Avanado
92
Um dos princpios da orientao a objeto manter dados e procedimentos de um
objeto dentro do prprio objeto. Os dados dos objetos so chamados de propriedades
enquanto que os procedimentos chamam-se mtodos.
Usando variveis para referenciar os objetos, torna-se prtica a programao orientada
a objetos.
Para entender os conceitos acima, vamos usar os objetos recordset e field. Um
Recordset o conjunto de registros retornado por uma tabela, por uma consulta que retorne
registros (seja esta uma consulta previamente criada na guia de Consultas da janela de Banco
de Dados ou criada em tempo de execuo, atravs de comandos SQL). Um field o prprio
campo da tabela.
Para obter um objeto recordset, usa-se o mtodo OpenRecordset do objeto database.
O objeto ento atribudo uma varivel, declarada anteriormente como do tipo Recordset.
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset(Tabela1)
Abrir um recordset semelhante ao comando USE do Clipper.
Como visto, o objeto field referido por um ndice base-zero ou explicitamente pelo
nome do campo. O objeto field pode ser atribudo uma varivel declarada como do tipo
Field.
Dim fldCampo1 As Field
Set fldCampo1 = rst.Fields(CdigoDoLivro)
Para obter o valor deste objeto, usa-se a propriedade Value.
intCampo = fldCampo1.Value
intCampo uma varivel do tipo inteiro que armazena o valor do objeto e no 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(CdigoDoLivro)
Para obter os valores dos campos para os demais registros, usa-se o mtodo MoveNext
do objeto recordset. Pode-se, assim, percorrer sequencialmente todo o recordset.
rst.MoveNext
Este mtodo semelhante ao SKIP do Clipper.
A leitura sequencial do recordset ir terminar quando se chegar ao seu fim. A
propriedade EOF do objeto recordset.
Para entender os mtodos e propriedades vistos at agora, veja uma analogia com o
Clipper
Microsoft Access Avanado
93
OPERAO CLIPPER VISUAL BASIC
COLEO/
OBJETO
PROPRIEDADE/MTODO
Abrir arquivo de dados USE
{arquivo}
Database OpenRecordset( {recordset} )
Mover ponteiro de
registro para frente
SKIP Recordset MoveNext
Mover ponteiro de
registro para trs
SKIP 1 Recordset MovePrevious
Ir para o primeiro
registro
GoTop() Recordset MoveFirst
Ir para o ltimo registro GoBottom() Recordset MoveLast
Saltar n registros para
frente ou para trs
SKIP [ n] Recordset Move [ n]
Testar fim de arquivo Eof() Recordset EOF
Testar incio de arquivo Bof() Recordset BOF
Obter o valor de um
campo
{nome do
campo}
Fields
Field
Recordset
Fields({ndice}) ou
Fields( {nome do campo} ) ou
Fields!{nome do campo})
Value
!{nome do campo}
Fechar arquivo de
dados
CLOSE Recordset Close
8.6. Acesso a Banco de Dados Access
Vamos tomar como exemplo os conjuntos de registros abaixo para escrever um cdigo
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 Tpicos,
o terceiro consulta seleo qryLivros_versus_Tpicos e o quarto uma consulta gerada em
tempo de execuo, atravs da expresso SQL:
SELECT Tpicos.Tpico, Count(Livros.CdigoDoLivro) AS
Quantidade FROM Tpicos RIGHT JOIN Livros ON
Tpicos.CdigoDoTpico = Livros.CdigoDoTpico
GROUP BY Tpicos.Tpico;
Tabela: Livros
Cdigo do Livro Ttulo Cdigo do Tpico Nome do Editor Preo 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 Tcnicas de Tai Chi 4 Editora Ramona R$25,95
Microsoft Access Avanado
94
5 Minha Famlia 5 Publicaes R$17,95
Os campos da tabela Livros so: CdigoDoLivro, Ttulo, CdigoDoTpico,
NomeDoEditor, e PreoDoPedido
Tabela: Tpicos
Cdigo do Tpico Tpico
1 Negcios
2 Psicologia
3 Cincia
4 Sade
5 Fico
6 Romance
7 Tcnico
Os campos da tabela Tpicos so: CdigoDoTpico e Tpico
Consulta seleo: qryLivros_versus_Tpicos
Ttulo Tpico
Planejando Sua Carreira Negcios
Tcnicas de Tai Chi Sade
Dirk Luchte Fico
Minha Famlia Fico
Diamantes Romance
Consulta seleo com funo agregada
Tpico Quantidade
Fico 2
Negcios 1
Romance 1
1
Comecemos por fazer uma leitura sequencial de cada registro da tabela Livros,
listando os contedos dos campos Ttulo e NomeDoEditor.
O primeiro passo, ento criar um objeto database que contenha o banco de dados
atual.
' Declara um ojeto database (banco de dados)
Dim dbsBancoAtual As Database
' Atribui o banco atual ao objeto database
Set dbsBancoAtual = DBEngine.Workspaces(0).Databases(0)
O banco de dados atual pode ser referido simplesmente por:
Microsoft Access Avanado
95
Set dbsBancoAtual = CurrentDb
Um objeto recordset tem que ser aberto no banco de dados atual. Assim, vamos
declarar um objeto recordset e usar o mtodo OpenRecordset do objeto database.
' Declara um ojeto database (banco de dados)
Dim dbsBancoAtual As Database
' Declara um ojeto recordset
Dim rstTabela As Recordset
' Atribui o banco atual ao objeto database
Set dbsBancoAtual = DBEngine.Workspaces(0).Databases(0)
' Abre o recordset e o atribui ao objeto recordset
Set rstTabela = dbsBancoAtual.OpenRecordset(Livros)
Para pegar um determinado campo, poderamos criar um objeto Field para cada o
campo, uma para Ttulo e outro para o campo NomeDoEditor, mas em vez disto vamos pegar
o valor do prprio objeto Field, explicitando o nome do campo dentro da coleo Fields.
rstTabela.Fields(Ttulo)
rstTabela.Fields(NomeDoEditor)
O nome do objeto Field deve ser o nome do campo e no a sua legenda. Por isso , est
escrito NomeDoEditor e no Nome do Editor.
Falta ainda criar uma estrutura de repetio do VBA que percorra todo o recordset.
Vamos usar o Do...Loop, com a condio While (enquanto) verificando o fim do de arquivo.
O fim de arquivo pode ser obtido pela propriedade EOF do objeto recordset. A navegao
pelos registros feita pelo mtodo MoveNext do objeto recordset.
' Declara um ojeto database (banco de dados)
Dim dbsBancoAtual As Database
' Declara um ojeto recordset
Dim rstTabela As Recordset
' Atribui o banco atual ao objeto database
Set dbsBancoAtual = DBEngine.Workspaces(0).Databases(0)
' Abre o recordset e o atribui ao objeto recordset
Set rstTabela = dbsBancoAtual.OpenRecordset(Livros)
Do While Not rstTabela.EOF
Debug.Print rstTabela.Fields(Ttulo) & - & _
rstTabela.Fields(NomeDoEditor)
rstTabela.MoveNext
Loop
rst.Close
A janela depurar conter os seguintes dados:
Microsoft Access Avanado
96
8.7. Acesso a Bancos de Dados Externos
No exemplo anterior a origem dos dados uma tabela (vinculada ou no) do banco de
dados corrente, ou seja, do banco de dados onde o programa est sendo executado. Em certos
casos necessrio obter dados (ou objetos) que esto em outros bancos de dados Access ou de
banco de dados ISAM ou ODBC.
H duas maneiras de acessar os dados externos: Vinculao e Abertura direta das
tabelas
8.7.1. Vinculao de Tabelas Externas
Para acessar dados de banco de dados externos, via programao, a forma mais fcil
vincular as tabelas externas (atravs do Menu Arquivo|Obter Dados Externos|Vincular) e
acess-las normalmente pelo mtodo OpenRecordset do Database corrente, pois elas fazem
parte do banco de dados corrente.
O problema da vinculao que o Access no sabe se o arquivo de origem est onde
deveria estar. Portanto, ou se faz a vinculao toda vez que o aplicativo for aberto, ou se
verifica se o vinculo est ativo e o refaz se necessrio.
Banco de Dados Corrente
(MDB)
ARQ3.XLS
(Excel 95)
ARQ2.DBF
(dBase 3 )
ARQ1.MDB
ODBC
(SQL Server)
Microsoft Access Avanado
97
Fazer a vinculao via programao exige o conhecimento de outros objetos,
propriedades e mtodos da DAO.
Toda tabela, seja prpria do banco de dados ou vinculada, um objeto TableDef
(definio de tabela). Ento, fazer uma vinculao significa criar um objeto TableDef e
configurar suas propriedades (Connect e TableSourceName) para apontar para o arquivo a ser
vinculado. Aps criada a TableDef, ela acrescentada coleo TableDefs do objeto
Database.
Sub VinculaBancosExternos()
Dim dbs As Database
Dim tdf As TableDef
Set dbs = CurrentDb
Cria o objeto TableDef
Set tdf = dbs.CreateTableDef(Clientes)
Define o tipo de banco de dados que est conectando e a localizao
(path)
tdf.Connect = dBASE III; DATABASE=C:\Tabelas
Define o nome da tabela (sem o sufixo, dbf, no caso)
tdf.SourceTableName = Clientes
Acrescenta o objeto TableDef coleo TableDefs
dbs.TableDefs.Append tdf
End Sub
A propriedade Connect possui dois argumentos: o Especificador e a Origem
(antecedido pela palavra DATABASE=), separadas por um ponto e virgula. Abaixo esto os
valores para este dois argumentos para os tipos de banco de dados:
Tipo de banco de dados Especificador Origem
Banco de dados Access [banco de dados]; Unidade de
disco:\caminho\nome do
arquivo.mdb
dBASE III dBASE III; Unidade de disco:\caminho
dBASE IV dBASE IV; Unidade de disco:\caminho
DBASE 5 dBASE 5.0; Unidade de disco:\caminho
Paradox 3.x Paradox 3.x; Unidade de disco:\caminho
Paradox 4.x Paradox 4.x; Unidade de disco:\caminho
Paradox 5.x Paradox 5.x; Unidade de disco:\caminho
FoxPro 2.0 FoxPro 2.0; Unidade de disco:\caminho
FoxPro 2.5 FoxPro 2.5; Unidade de disco:\caminho
FoxPro 2.6 FoxPro 2.6; Unidade de disco:\caminho
Excel 3.0 Excel 3.0; Unidade de
disco:\caminho\nome do
arquivo.xls
Excel 4.0 Excel 4.0; Unidade de
disco:\caminho\nome do
arquivo.xls
Microsoft Access Avanado
98
Excel 5.0 ou Excel 95 Excel ; Unidade de
disco:\caminho\nome do
arquivo.xls
Excel Excel 8.0; Unidade de
disco:\caminho\nome do
arquivo.xls
HTML Import HTML Import; Unidade de
disco:\caminho\nome do
arquivo
HTML Export HTML Export; Unidade de disco:\caminho
Text Text; Unidade de disco:\caminho
ODBC ODBC;DATABASE=bancode
dados;UID=usurio;
PWD=senha;DSN=
nomedafontededados;[LOGIN
TIMEOUT=segundos;]
Nenhum
Exchange Exchange;
MAPILEVEL=caminhodapast
a; [TABLETYPE={ 0 | 1
}];[PROFILE=perfil;][PWD=
senha;][DATABASE=bancod
edados;]
Unidade de disco:\caminho.mdb
Quando se usa tabelas vinculadas no aplicativo, interessante refazer os vnculos no
incio da da aplicao. Ora, se as tabelas j esto vinculadas, a criao de um novo TableDef
vai duplicar as tabelas existentes. Alm disso, a vinculao pode falhar se as tabelas no
estiverem no local certo. O exemplo abaixo mostra como refazer os vnculos, reportando na
tela se o processo funcionou ou no.
Function VinculaTabelas()
Dim tbfs As TableDefs
Dim tbf As TableDef
Dim strMsg As String
Dim CRLF As String
CRLF = Chr(13) & Chr(10)
Set tbfs = CurrentDb.TableDefs 'Coleo de tabelas
On Error Resume Next
tbfs.Delete "Pessoal"
tbfs.Delete "Cargo"
tbfs.Delete "Funcao"
Err.Clear 'Limpa o erro anterior, se houver
DoCmd.OpenForm "Histrico de Eventos"
Err.Clear
Set tbf = CurrentDb.CreateTableDef("Pessoal")
tbf.Connect = "dBASE III; DATABASE=C:\Tabelas\"
tbf.SourceTableName = "Pessoal"
If Err.Number <> 0 Then
Forms![Histrico de Eventos].txtMsg = _
Microsoft Access Avanado
99
Forms![Histrico de Eventos].txtMsg & "Erro ao vincular Pessoal" &
CRLF
Else
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Vinculou Pessoal" & CRLF
tbfs.Append tbf
End If
Err.Clear
Set tbf = CurrentDb.CreateTableDef("Cargo")
tbf.Connect = "dBASE III; DATABASE=C:\Tabelas\"
tbf.SourceTableName = "Cargo"
If Err.Number <> 0 Then
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Erro ao vincular Cargo" &
CRLF
Else
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Vinculou Cargo" & CRLF
tbfs.Append tbf
End If
Err.Clear
Set tbf = CurrentDb.CreateTableDef("Funcao")
tbf.Connect = "dBASE III; DATABASE=C:\Tabelas\"
tbf.SourceTableName = "Funcao"
If Err.Number <> 0 Then
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Erro ao vincular Funcao" &
CRLF
Else
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Vinculou Funcao" & CRLF
tbfs.Append tbf
End If
Err.Clear
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "--------------------------" & CRLF
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsgtrMsg & "Fim da vinculao"
End Function
A execuo desta funo vinvula as tabelas e mostra o formulrio Histrico de
Eventos com o resultado do processamento, como mostra a figura a seguir.
Microsoft Access Avanado
100
8.7.2. Abertura Direta de Tabelas Externas
Com uma tabela vinculada, alm de poder abrir um recordset via programa, voc pode
abr-la normalmente no modo folha de dados ou ainda criar consultas, formulrios e
relatrios com base na tabela.
Se o seu caso simplesmente abrir uma tabela externa via programao, no h
motivo para vincul-la. Basta abr-la diretamente.
Para abrir diretamente as tabelas, sem vinculao, lembre-se que cada arquivo externo
um objeto Database. Portanto, basta declarar as variveis deste tipo, na quantidade
necessria. Vamos supor que alm do banco corrente, queira-se objetos de outros trs bancos
Access.
Dim dbsCorrente As Database
Dim dbsArq1 As Database
Dim dbsArq2 As Database
Dim dbsArq3 As Database
Para abrir o banco corrente pode-se usar a funo CurrentDb ou toda a referncia de
seus objetos pais DBEngine.Workspaces(0).Database(0).
Para abrir bancos de dados externos, usa-se o mtodo OpenDatabase do objeto
Workspace, cuja sintaxe :
Set bancodedados = [workspace.]OpenDatabase(Banco[, Exclusivo[, ReadOnly[, Origem]]])
Banco o nome do banco de dados a ser aberto, incluindo o seu path.
Exclusivo um valor lgico (True ou False que indica se o banco ser aberto em modo
exclusivo.
ReadOnly um valor lgico (True ou False) que indica se o banco ser aberto somente
para leitura.
Origem um string de parmetros para abrir o banco de dados.
Microsoft Access Avanado
101
Set dbsCorrente = CurrentDb
Set dbsArq1 = DBEngine.Workspaces(0).OpenDatabase(C:\Tabelas\Arq1.mdb)
Set dbsArq2 = DBEngine.Workspaces(0).OpenDatabase(C:\Sistemas\Arq2.mdb)
Set dbsArq3 = DBEngine.Workspaces(0).OpenDatabase(C:\Arq3.mdb)
Com a abertura de vrios 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 mtodo OpenDatabase, e Recordset, do mtodo
OpenRecordset, tm valores especficos para cada tipo de banco de dados. Abaixo esto os
valores para alguns dos mais comuns tipos de banco de dados:
Tipo Banco Origem Recordset
Access Path e nome do banco de
dados.
Ex.:
C:\Tabelas\TB_Org.mdb
Usurio e senha (se
necessrios).
Ex.:
UID=Admin;PWD=senha
Nome da tabela.
Ex.: Cidades
DBase III Path
Ex.:
\\SMG0002\Sistemas
D:\Dados
Tipo do banco de dados.
dBASE III;
Nome do arquivo,
sem o sufixo .dbf.
Ex.: Cliente
Excel Path e nome do arquivo.
Ex.:
C:\Temp\Clientes.xls
Verso do Excel.
Excel 4.0;
Excel 5.0;
Excel 8.0;
Intervalo das clulas
ou nome do intervalo.
Ex.:
Plan1$A1:B5
Custos
Fox Pro Path
Ex.:
\\SMG0003\Arqs
Verso do Fox Pro.
FoxPro 2.0;
FoxPro 2.6;
FoxPro 3.0;
Nome do arquivo sem
o sufixo.
Ex.: Carros
1) Exemplo de acesso direto a arquivo dBase III, situado em um recurso de rede.
Set dbsDBase = DBEngine.Workspaces(0).OpenDatabase(\\SMG0006\Tabelas, _
False, False, dBASE III;)
Set rst = dbsDBase.OpenRecordset(Orgao)
2) Exemplo de acesso direto a arquivo FoxPro 2.0
Set dbsFoxPro2 = DBEngine.Workspaces(0).OpenDatabase(C:\, _
False, False, FoxPro 2.0;)
Set rst = dbsFoxPro2.OpenRecordset(Clientes)
3) Exemplo de acesso direto a arquivo Excel
Microsoft Access Avanado
102
Set dbsExcel = DBEngine.Workspaces(0).OpenDatabase(C:\Sheets\Venda.xls, _
False, False, Excel 8.0;)
Set rst = dbsExcel.OpenRecordset(Plan3$A1:F7)
Microsoft Access Avanado
103
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 seqenciais e randmicos. Apesar disso, o Access no
eliminou este tipo de acesso.
No tem muito sentido apresentar o acesso a dados em arquivos, uma vez que a
maioria das necessidades atendida por banco de dados. Porm pode-se usar o acesso a
arquivos para outros fins, tal como direcionar a sada para disco ou diretamente para a porta
da impressora local.
Uma utilidade para a gravao da sada em disco a monitorao, atravs 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 no se
encontrava mais no disco. Com certeza, este erro ser tratado por uma rotina de erro (ver
tpico Tratamento de Erro) que gerar uma caixa de mensagem na tela. Porm a mensagem
apresentada ao operador, que esqueceu-se de anot-la. Se esta mensagem for tambm 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 relatrio para
disco, em formato ASCII, para ser impresso em uma impressora matricial em modo texto.
Dim rst As Recordset
Dim strNome As String * 35
Set rst = CurrentDb.OpenRecordset("Pessoal")
Open "C:\SAIDA.TXT" For Output As #1
Do While Not rst.EOF
LSet strNome = rst.Fields("NM_EMPREG")
Print #1, rst.Fields("CD_MATRIC") & " ";
Print #1, strNome;
Print #1, rst.Fields("CD_CARGO") & " ";
Print #1, rst.Fields("CD_ORGAO")
rst.MoveNext
Loop
Close #1
rst.Close
O resultado deste cdigo, o arquivo SAIDA.TXT, pode ser aberto no Notepad. Numa
sesso DOS, este arquivo pode ser enviado para uma impressora matricial em modo texto
(type saida.txt > prn: ). Isto significa que a impresso ser rpida, pois no usa as fontes do
Windows.
Microsoft Access Avanado
104
Em vez de direcionar a sada para um arquivo ASCII, pode-se enviar a sada
diretamente para a porta da impressora local. Isto equivale no Clipper a Set Print On e o
comando ?.
Dim rst As Recordset
Dim strNome As String * 35
Set rst = CurrentDb.OpenRecordset("Pessoal")
Open "Lpt1:" For Output As #1
' Liga o modo condensado em impressoras padro Epson
Print #1, Chr(15)
Do While Not rst.EOF
LSet strNome = rst.Fields("NM_EMPREG")
Print #1, rst.Fields("CD_MATRIC") & " ";
Print #1, strNome;
Print #1, rst.Fields("CD_CARGO") & " ";
Print #1, rst.Fields("CD_ORGAO")
rst.MoveNext
Loop
Close #1
rst.Close
Microsoft Access Avanado
105
10. TRATAMENTO DE ERRO
H trs tipos de erros.
Erro lgico
Erro em tempo de compilao
Erro em tempo de execuo
Erro lgico quando o aplicativo no funciona como se esperava. Por exemplo,
esquecer-se de zerar um contador leva a um erro lgico. Este tipo de erro s pode ser
corrigido pelo prprio programador.
Erros em tempo de compilao ocorrem como resultado da construo incorreta de
cdigo. Voc pode ter esquecido de balancear pares de instrues (como If e End If ou For e
Next) ou pode ter cometido um erro de programao que viola as regras do Visual Basic
(como um erro de ortografia, omisso de um separador ou um erro de digitao).
Erros em tempo de compilao tambm incluem erros de sintaxe, que so erros de
gramtica ou pontuao. Isso inclui parnteses mal emparelhados ou um nmero incorreto de
argumentos passados para uma funo.
Erro em tempo de compilao ocorre tambm quando se usam funes definidas pelo
usurio que no existem ou esto fora do escopo, quando se usam objetos de uma biblioteca
no referenciada (ver Referncia a Biblioteca de Objetos mais adiante) e quando de usa
variveis no declaradas (desde que Option Explicit esteja ativada).
O erro por falta de referncia a objetos nem sempre pode ser verificado antes de
executar o programa, pois um objeto pode ser criado em tempo de execuo (ver Automao
mais adiante) e no h como o Access verificar se as propriedades e mtodos so suportados
pelo objeto. Neste caso, um erro em tempo de execuo.
Para verificar a existncia de erro de compilao, execute Compilar mdulos
carregados no menu Depurar de uma janela de mdulo.
Erro em tempo de execuo algo inesperado que ocorre quando o programa est
sendo executado. Por exemplo, tentar abrir um banco de dados em modo exclusivo quando
um outro usurio j o fez ou dividir um nmero por uma varivel que contm zero.
Normalmente, um erro em tempo de execuo suspende o programa. Na suspenso, a
janela de mdulo 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.
Microsoft Access Avanado
106
Esta situao no boa, no s porque o programa falha, mas porque o usurio tem
acesso ao cdigo fonte do programa (lembre-se que o Access no um compilador que gera
um programa executvel).
O erro em tempo de execuo pode ser tratado dentro do prprio 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 execuo implementado com a instruo On
Error. Esta instruo permite duas formas de tratamento:
Desviar o programa para uma rotina de tratamento de erro
Prosseguir a execuo na linha posterior ao do erro
10.1. Desvio para rotina de tratamento de erro
Para o primeiro caso usa-se On Error GoTo rtulo, onde rtulo uma marca para
fragmento de cdigo dentro do prprio procedimento. Este cdigo pode:
Tratar o erro e terminar o programa
Tratar o erro e voltar execuo na mesma linha do erro
Tratar o erro e voltar execuo na linha seguinte linha de erro
Tratar o erro e desviar a execuo para outro rtulo.
A rotina de tratamento de erro faz uso do objeto Err, que tem duas propriedades
importantes> o nmero do erro (Number) e a sua descrio (Description).
10.1.1. Tratar o erro e terminar o programa
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 cdigo de tratamento de erro, no
rtulo Trata_Erro, no seja executado em situao sem erro. Note tambm, que aps reportar
o erro, o programa segue o fluxo normal e pra, j que encontra End Sub.
10.1.2. Tratar o erro e voltar execuo na mesma linha do erro
Sub VoltaNaLinhaDoErro()
On Error GoTo Corrige_Erro
Microsoft Access Avanado
107
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 situao de erro e retornar o fluxo de programa na
mesma linha onde o erro ocorreu.
10.1.3. Tratar o erro e voltar execuo na linha seguinte linha de erro
Sub VoltaNaProximaLinha()
Dim blnArquivoExiste As Boolean
On Error GoTo Corrige_Erro
blnArquivoExiste = True
Open c:\teste.txt For Input As #1
If blnArquivoExiste
MsgBox Preparando para ler arquivo C:\teste.txt
Else
MsgBox O arquivo C:\teste.txt no existe!
End If
Exit Sub
Corrige_Erro:
If Err.Number = 53 File not found
Resume Next
End If
End Sub
10.1.4. Tratar o erro e desviar a execuo para outro rtulo.
Sub DesviaParaUmRotulo()
On Error GoTo Corrige_Erro
Open c:\teste.txt For Input As #1
Exit Sub
Fim:
MsgBox O arquivo C:\teste.txt no existe. & _
Irei cri-lo vazio para as prximas execues!
Open c:\teste.txt For Output As #1
Close #1
Exit Sub
Microsoft Access Avanado
108
Corrige_Erro:
If Err.Number = 53 ' File not found
Resume Fim
End If
End Sub
10.1.5. Prosseguir o programa aps erro
Para prosseguir o programa normalmente aps a ocorrncia de um erro usa-se On
Error Resume Next. Isto til quando o erro no compromete a lgica do programa e pode
ser ignorado. Por exemplo, quando for apagar tabela vinculada (significa desfazer o vnculo),
a falta dela j estiver apagada no um erro grave e pode ser ignorado.
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 aps a sua
ocorrncia, sem desviar para um rtulo.
Sub TrataErroImediatamente()
Dim obj As Object
On Error Resume Next
Set obj = CreateObject("Outlook.Application")
If Err.Number <> 0 Then
' Err.Number 429
' Err.Description ActiveX component cant create object
MsgBox "No foi possvel criar o objeto Outlook"
Else
.
.
End If
End Sub
10.1.6. Evento Erro
A instruo On Error pode ser usada em mdulo padro e mdulo de classe. Em
mdulo de classe h uma outra maneira de interceptar error: o evento On Error (Ao Ocorrer
Erro, em portugus) dos objetos formulrio e relatrio.
O evento On Error detecta somente os erros do Jet Engine e no erros do VBA. Se um
campo que no aceita nulo receber um nulo ser gerado um evento de erro, porque um erro
do Jet Engine. Se o cdigo tentar uma diviso por zero, o erro no interceptado pelo evento
On Erro, porque um erro do VBA. Neste caso, tem que se usar a instruo On Error.
Microsoft Access Avanado
109
10.2. Depurao do Programa
vezes ocorre um erro persistente, difcil de ser solucionado, para o qual so
necessrios executar o programa passo-a-passo, interromper o programa para verificar o
contedo das variveis e prosseguir o programa a partir da interrupo.
Para parar o programa em pontos crticos, podem ser colocados um ou mais Pontos de
Interrupo (tecla F9 pe e tira pontos de interrupo). Nestes pontos o programa
interrompido e a janela do mdulo aberta. Pode-se ento prosseguir com a tecla F8, para
executar o programa passo-a-passo ou F5 para continuar normalmente at outro ponto de
interrupo ou at o fim do programa.
Durante a interrupo, pode-se abrir a janela Depurar (Control G) e verificar o valor
das variveis ou executar um comando interativamente, inclusive alterando o valor de
algumas variveis.
Na figura acima, a linha marcada com um crculo um ponto de interrupo e a linha
marcada com seta a linha atualmente executada. Na janela Depurar (Debug Windows, em
ingls) foi dado o comando ? xlsSheet.Application, o qual retornou Microsoft Excel (que o
nome do objeto pai).
Aps depurar o programa, no se esquea de limpar todos os pontos de interrupo.
Microsoft Access Avanado
110
Microsoft Access Avanado
111
11. AUTOMAO
A automao (antigamente chamada de Automao OLE) um recurso do COM
(Component Object Model), um padro da indstria de informtica utilizado pelos aplicativos
para expor os seus objetos a ferramentas de desenvolvimento, linguagens de macro e a outros
aplicativos que suportam automao. Por exemplo, um aplicativo de planilha pode expor uma
planilha, grfico, clula ou intervalo de clulas como diferentes tipos de objetos. Um
processador de textos pode expor objetos como um aplicativo, um documento, um pargrafo,
uma frase, um indicador ou uma seleo.
Quando um aplicativo suporta automao, os objetos expostos por ele podem ser
acessados pelo Visual Basic. Para manipular esses objetos no Visual Basic, execute mtodos
sobre o objeto ou obtenha e defina as propriedades do objeto. Por exemplo, voc pode criar
um objeto de automao nomeado MyObj e gravar o cdigo apresentado a seguir para acess-
lo:
MyObj.Insert "Oi, mundo." ' Insere um texto.
MyObj.Bold = True ' Formata o texto.
MyObj.SaveAs "C:\PROCTXT\DOCS\OBJTEST.DOC" ' Grava o objeto.
Os objetos que que expem suas funcionalidades chamado pela Microsoft de
ActiveX. O termo ActiveX engloba tambm os controles OLE, antigamente chamados de
componentes OCX (isto porque os arquivos tm a terminao .ocx). Atualmente, o termo
ActiveX tem sido substitudo por COM Component Object Model.
H dois tipos de elementos na automao:
Os servidores de automao, que podem ser controlados porque suas funcionalidades so
expostas e podem ser acessadas por outras aplicaes. Exemplos de servidores de
automao: todos os softwares do Microsoft Office, Schedule+ e o Project.
Os controladores de automao, que podem controlar servidores de automao atravs de
cdigo de programao, acessando a funcionalidade exposta pelos servidores de
automao. Exemplos de controladores: MS Visual Basic, MS Visual C++, MS FoxPro e
o VBA (que est embutido no Access, Excel, Word e Project).
A automao permite extrair o que h de melhor dos softwares especialistas e integr-
los. Por exemplo, pode-se usar o Access, especializado em banco de dados, para processar
dados de vendas e export-los para uma planilha do Excel. O Excel, especializado em grfico,
pode gerar um grfico de barras, mostrando a evoluo das vendas. Este grfico pode ser
exportado para um relatrio trimestral de vendas, que est digitado no Word. Todo este
processo poderia ser manual, usando-se os recursos de copiar e colar. A automao faz tudo
isto com um simples disparo de um cdigo em VBA.
Para usar a automao, no entanto, necessrio conhecer os objetos, propriedades e
mtodos de cada um dos aplicativos envolvidos, sem contar com o conhecimento da
linguagem de programao Visual Basic.
No VBA existem duas funes chaves para realizar a automao. GetObject() e
CreateObject().
GetObjetc() obtm um objeto ActiveX de uma determinada classe de objetos. Sua
sintaxe e argumentos so:
Microsoft Access Avanado
112
GetObject([pathname] [, class])
Pathname Opcional; Variant (String). Indica o caminho completo e nome do arquivo que
contm o objeto a ser recuperado. Se pathname for omitido, class passa a ser
obrigatrio.
class Opcional; Variant (String). Uma seqncia de caracteres que representa a classe
do objeto.
O argumento class utiliza a sintaxe nomedoaplic.tipodeobjeto e possui partes a seguir:
Parte Descrio
nomedoaplic Obrigatria; Variant (String). Nome do aplicativo que fornece o objeto.
tipodeobjeto Obrigatria; Variant (String). Tipo ou classe do objeto a ser criado.
O objeto retornado por GetObject atribudo a uma varivel do mesmo tipo,
possibilitando invocar seus mtodos e acessar suas propriedades. O exemplo abaixo obtm
um objeto Application do Word. A propriedade Visible setada para que a janela do
aplicativo aparece na tela. usado o mtodo Open, da coleo Documents, para abrir um
documento existente.
Dim wrd As Object
Set wrd = GetObject(, "Word.Application")
wrd.Visible = True
wrd.Documents.Open "C:\Meus Documentos\Temp.doc"
Set wrd = Nothing
CreateObject() cria e retorna a referncia de um objeto ActiveX da classe especificada
em seu argumento. O argumento obrigatrio e o mesmo argumento [class] da funo
GetObject().
11.1. Automao com o Microsoft Word
Microsoft Access Avanado
113
Hierarquia dos Objetos do Microsoft Word
O exemplo abaixo cria um novo objeto Application do Word. usado o mtodo
TypeText, do objeto Selection, para inserir um texto. O documento salvo e o aplicativo
encerrado. A referncia ao objeto encerrada atribuindo-se Nothing varivel.
Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
objWord.Documents.Add
objWord.Selection.TypeText Text:="Carlos Koga"
objWord.ActiveDocument.SaveAs FileName:="C:\Koga.doc"
objWord.Quit
Set objWord = Nothing
11.2. Automao com o Microsoft Excel
Hierarquia do Objetos do Microsoft Excel
Microsoft Access Avanado
114
Detalhamento do Objeto Worksheets
Microsoft Access Avanado
115
Detalhamento do Objeto Charts
Detalhamento do Objeto Chartgroups
Microsoft Access Avanado
116
Normalmente, ao abrir o Excel no Windows, abre-se automaticamente um novo
Workbook (Pasta de Trabalho, em portugus) chamado Book1 (Pasta1, em portugus) com
trs Worksheets (planilhas) denominados Sheet1, Sheet2, Sheet3 (em portugus, so Plan1,
Plan2 e Plan3, respectivamente). Cada Worksheet possui vrias clulas, referenciadas por
coordenadas de colunas de A a IV e linhas de 1 a 65536.
Este so os principais objetos do Excel. O prprio Excel, o Workbook, o Worksheet e
o Range (que so as clulas), nesta ordem de hierarquia.
O objeto de mais alto nvel o Application. Ele representa o prprio programa Excel.
No modo programado, o objeto Application no possui de imediato nenhum
Workbook (Pasta de Trabalho, em portugus) e, consequentemente, nenhum Worksheet
(planilha) e nenhum Range.
O Excel pode abrir um ou mais workbooks. Workbooks (no plural) uma coleo de
objetos Workbook (no singular). Um objeto workbook um arquivo .XLS. Note que na
hierarquia de objetos, Workbooks est abaixo do objeto Application. Note tambm que a
legenda do modelo est errada, pois indica que Workbook apenas objeto. Na realidade
coleo e objeto.
Um workbook possui um ou mais Worksheets. Worksheets (no plural) uma coleo
de objetos Worksheet (no singular). Note que no modelo de objetos Worksheet est abaixo de
Workbook.
Cada worksheet (planilha) contm clulas, que so os objetos Range (intervalo). A
clula A1 referenciada por Range(A1). As clulas de A1 a C5 so referenciadas por
Range(A1:C5).
Microsoft Access Avanado
117
Para criar uma instncia do objeto Excel, usa-se a funo CreateObject() do VBA.
Exemplo:
Sub InstanciaExcel()
Dim xls As Excel.Application
' Cria uma instncia do objeto Excel
Set xls = CreateObject(Excel.Application)
' Propriedade para tornar o objeto visvel
xls.Visible = True
MsgBox Clique em OK para fechar o Excel
' Mtodo para fechar o Excel
xls.Quit
Set xls = Nothing ' Libera memria
End Sub
O procedimento acima abre o Excel e o fecha ao clicar OK na caixa de mensagem.
A figura abaixo a repersentao visual do objeto Excel.Application. Perceba que ele
no contm nenhum objeto Workbook ainda.
Microsoft Access Avanado
118
Para termos uma janela do Excel com um workbook, temos que acrescentar uma linha
de cdigo, invocando o mtodo Add da coleo Workbooks.
Sub InstanciaExcel()
Dim xls As Excel.Application
' Cria uma instncia do objeto Excel
Set xls = CreateObject(Excel.Application)
' Propriedade para tornar o objeto visvel
xls.Visible = True
' Cria um workbook novo.
' Por default, ele se chama Book1 e possui trs worksheets
xls.WorkBooks.Add
MsgBox Clique em OK para fechar o Excel
' Mtodo para fechar o Excel
xls.Quit
Set xls = Nothing ' Libera memria
End Sub
O objeto Excel.Application tem agora um objeto Workbook. Logo a sua coleo
Workbooks contm apenas um objeto Workbook, chamado Book1.
Para referenciar um objeto Workbook dentro da coleo, usa-se um ndice ou o seu
nome dentro de parnteses.
xls.Workbooks(1) ou
xls.Workbooks(Book1)
Microsoft Access Avanado
119
Note que a referncia deve seguir a hierarquia dos objetos. Primeiro Application,
seguida de Workbooks.
Sub InstanciaExcel()
Dim xls As Excel.Application
' Cria uma instncia do objeto Excel
Set xls = CreateObject("Excel.Application")
' Propriedade para tornar o objeto visvel
xls.Visible = True
' Cria um workbook novo.
' Por default, ele se chama Book1 e possui trs worksheets
xls.Workbooks.Add
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"
MsgBox "Clique em OK para fechar o Excel"
' Salva o workbook como Teste.xls
xls.Workbooks(1).SaveAs "C:\Teste.xls"
' Mtodo para fechar o Excel
xls.Quit
Set xls = Nothing
End Sub
O exemplo a seguir mostra como ler cada registro de um recordset do Access,
gravando cada campo em uma clula.
Dim xlsPlan As Object
Dim rstPessoal As Recordset
Din lngLine As Long
Set xlsPlan = CreateObject("Excel.Sheet")
Set rstPessoal = CurrentDb.OpenRecordset("qryRelacaoDePessoal")
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
Microsoft Access Avanado
120
xlsPlan um objeto Workbook. A propriedade Application retorna o objeto
Application, que possui a propriedade Cells.
Outro exemplo mais sofisticado gerar e imprimir um grfico de barras tridimensional do
Excel a partir de uma consulta referncia cruzada do Access.
REGIAO PROD A PROD B PROD C
LESTE 111 54 78
NORTE 245 200 114
OESTE 99 34 48
SUL 210 348 442
Dim xls As Object
Dim rst As Recordset
Dim intLinha As Integer, intColuna As Integer
Set rst = CurrentDb.OpenRecordset(qryConsumo por Produto e Por Regiao)
Set xls = CreateObject("Excel.application")
xls.Workbooks.Add
' Insere na linha 1 os cabealhos de cada coluna
For intColuna = 1 to rst.Fields.Count
xls.Cells(1, intColuna) = rst.Fields(intColuna 1).Name
Next
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 colees Workbooks e Charts.
Microsoft Access Avanado
121
11.3. Automao com Microsoft Project 95
Hierarquia dos Objetos do Microsoft Project 95 (verso 4.1)
A utilidade da automao com o Microsoft Project mostrada no exemplo a seguir. Uma
tabela do Access contm os eventos de cursos a serem realizados. Cada evento tem as datas de
incio e de trmino, o que no permite uma visualizao fcil de todos os eventos
programados num perodo de tempo. O Project possui o grfico de Gantt, como mostrado
abaixo, que torna a grade de eventos.
O cdigo a seguir possibilita inserir os dados dos eventos de cursos em um arquivo do Project
e imprimir o grfico de Gantt, automaticamente.
Dim prjApp As Object
Dim prjProj As Object
Microsoft Access Avanado
122
Dim rst As Recordset
Dim intI As Integer
Set rst = CurrentDb.OpenRecordset("Cursos")
Set prjApp = CreateObject("MSProject.Application")
prjApp.filenew
Set prjProj = prjApp.projects(1)
intI = 1
Do While Not rst.EOF
prjProj.tasks.Add rst.Fields("Evento")
prjProj.tasks(intI).start = rst.Fields("DataInicio")
prjProj.tasks(intI).finish = rst.Fields("DataTermino")
rst.MoveNext
intI = intI + 1
Loop
prjApp.FileSaveas "C:\Temp\cursos.mpp"
prjApp.fileprint 1, 1, False, False, 1, Null, Null, True, False, False
prjApp.Quit
11.4. Automao com Schedule+ 7.0
Microsoft Access Avanado
123
Hierarquia dos Objetos do Schedule+ 7.0
O exemplo a seguir mostra como criar um novo compromisso (Almoo), que iniciar-
se- na data/hora do sistema operacional e durar 1 hora. Este exemplo pode ser aperfeioado,
integrando a automao com o Project, para criar compromissos para o instrutor do curso.
Dim objSch As Object
Dim objApontamento As Object
Set objSch = CreateObject(SchedulePlus.Application)
objSch.Logon
objSch.ScheduleSelected.Activate
Set objApontamento = objSch.ScheduleSelected.SingleAppointments.New
objApontamento.SetProperties Text:= Almoo, _
Start:=Now(), End:= Now() + Format(01:00)
objSch.Logoff
11.5. REFERNCIA BIBLIOTECA DE OBJETOS
Para acessar objetos, propriedades, mtodos e constantes intrnsecas de outros
softwares, preciso que as referncias aos arquivos de acesso a objetos estejam
estabelecidas.
Uma aplicao Access tpica faz referncia a trs bibliotecas de objetos:
Arquivo de acesso a objetos do Access (tais como formulrios e relatrios) e constantes
do Access (referncia obrigatria).
Arquivo de acesso a objetos (todos os comandos e constantes) do VBA (referncia
obrigatria).
Arquivo de acesso a objetos de dados - DAO (referncia necessria apenas se for acessar
dados).
Microsoft Access Avanado
124
Os arquivos que permitem o acesso a objetos do Access so:
Arquivo Nome Descrio
Msaccess.tlb Microsoft Access for Windows 95 Para o Access 95 (verso 7.0),
em portugus
Msacc8.olb Microsoft Access 8.0 Object Library Para o Access (verso 8.0) em
ingls
Msacc8.tlb Microsoft Access 8.0 Object Library Para o Access (verso 8.0) em
portugus
O arquivo que permite o acesso a objetos do VBA :
Arquivo Nome Descrio
Ven2232.olb Visual Basic for Applications Para a verso 2.2, em ingls
Os arquivos que permitem o acesso a objetos da DAO so:
Arquivo Nome Descrio
Dao350.dll Microsoft DAO 3.5 Object Library Para a verso 3.5
Dao3021.dll Microsoft DAO 3.0 Object Library Para a verso 3.0
Dao2532.tlb Microsoft DAO 2.5/3.0 Compatibility
Library
Para compatibilidade das verses
2.5 e 3.0
Dao2535 Microsoft DAO 2.5/3.5 Compatibility
Library
Para compatibilidade das verses
2.5 e 3.5
Os arquivos que permitem acesso a objetos dos aplicativos Microsoft so:
Arquivo Nome Descrio
Sp7en32.olb Microsoft Schedule+ 7.0 Object Library Para a verso em ingls
Xl5en32.olb Biblioteca de objetos do Microsoft Excel
5.0
Para a verso 5.0 em portugus,
com sintaxe de comandos em
ingls
Xl5pt32.olb Biblioteca de objetos do Microsoft Excel
5.0
Para a verso 5.0 em portugus,
com sintaxe de comandos em
portugus
Excel8.olb Microsoft Excel 8.0 Object Library Para a verso em ingls
Pj4en32.olb Microsoft Project 4.1Object Library Para a verso 95 em ingls
Msword8.olb Microsoft Word 8.0 Object Library Para a verso em portugus, com
sintaxe de comandos em ingls
Graph8.olb Microsoft Graph 8.0 Object Library Para a verso em ingls
Grptb50.olb Biblioteca de objetos do Microsoft
Graph 5.0
Para a verso em portugus
As referncias so estabelecidas no menu Ferramentas|Referncias..., a partir de
uma janela de mdulo aberta.
Microsoft Access Avanado
125
Se estiver faltando alguma referncia na lista de bibliotecas disponveis, acione o
boto Procurar e localize o arquivo necessrio.
importante saber qual as verses dos objetos voc est referenciando, pois em cada
uma h mudanas de sintaxes e at objetos, propriedades e mtodos novos ou de
comportamento diferente. Por isto, um aplicativo que funciona perfeitamente em um
computador pode no funcionar em outro.
A referncia s bibliotecas de objetos ajuda no tempo de codificao do programa,
pois os objetos, propriedades e mtodos ficam visveis na janela Object Browser (acionada
pela tecla F2). Veja na figura a seguir as propriedades e mtodos do objeto reaPlotagem da
biblioteca do Excel 5.0 com a sintaxe em portugus.
Microsoft Access Avanado
126
12. CHAMADA API DO WINDOWS 95
A API (Application Programming Interface) do Windows consiste de um conjunto de
bibliotecas de vnculo dinmico (DLLs) ou arquivo de recursos (EXEs) contendo
procedimentos relacionados ao sistema operacional que incluem funes, mensagens,
estruturas de dados, tipos de dados e instrues que voc pode usar na criao 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 instruo Declare. Voc pode ento
cham-los como faria com qualquer outro procedimento.
A instruo Declare possui a seguinte sintaxe:
[Public | Private ] Declare Function|Sub nome Lib "nomedabibliot" [Alias "nomedoalias" ]
[([listadeargumento])][As tipo]
A sintaxe da instruo Declare tem estas partes:
Parte Descrio
Public Usada para declarar procedimentos que esto disponveis em todos os
outros procedimentos em todos os mdulos.
Private Usada para declarar procedimentos que esto disponveis apenas
dentro do mdulo onde a declarao feita.
Sub Indica que o procedimento no retorna um valor.
Function Indica que o procedimento retorna um valor que pode ser usado numa
expresso.
nome Qualquer nome de procedimento vlido.
Lib Indica que uma DLL ou recurso de cdigo contm o procedimento que
est sendo declarado. A clusula Lib obrigatria para todas as
declaraes.
nomedabibliot Nome da DLL ou do recurso de cdigo que contm o procedimento
declarado.
Alias Indica que o procedimento que est sendo chamado tem um outro
nome na DLL ou est num recurso de cdigo do Macintosh. til
quando o nome do procedimento externo igual ao da palavra-chave.
Alias tambm pode ser usado quando um procedimento DLL tem o
mesmo nome de uma varivel ou constante pblica ou qualquer outro
procedimento no mesmo escopo. Alias tambm til se a conveno
de nomenclatura da DLL no permitir algum caractere no nome do
procedimento.
nomedoalias Nome do procedimento na DLL ou recurso do cdigo.
listadeargumento Lista de variveis que representam argumentos que so passados ao
procedimento quando ela chamada.
tipo Tipo de dados do valor retornado por um procedimento Function; pode
ser Byte, Boolean, Integer, Long, Currency, Single, Double, Date,
String (apenas de tamanho flexvel), Object, Variant, um tipo definido
pelo usurio ou um tipo de objeto.
O argumento listadeargumento tem a sintaxe e partes abaixo:
Microsoft Access Avanado
127
[Optional][ByVal | ByRef][ParamArray] nomedavariv[( )][As tipo]
Parte Descrio
Optional Indica que um argumento no obrigatrio. Se usada, todos os
argumentos subseqentes na listadeargumento devem ser opcionais e
declarados pelo uso da palavra-chave Optional. Todos os argumentos
Optional devem ser Variant. Optional no 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 referncia.
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 nmero arbitrrio de
argumentos. No pode ser usada com ByVal, ByRef ou Optional.
nomedavariv Nome da varivel que representa o argumento que est sendo passado
ao procedimento; segue convenes de nomenclatura padro de
varivel.
tipo Tipo de dados do argumento passado ao procedimento; pode ser Byte,
Boolean, Integer, Long, Currency, Single, Double, Date, String
(apenas de comprimento flexvel), Object, Variant, um tipo definido
pelo usurio ou um tipo de objeto.
Para usar a API, simplesmente saber a sintaxe no 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
Quanto aos itens 1 a 3, h uma relao gravada em um banco de dados
(Win32API.mdb) que contm as funes do WinAPI. Eis algumas delas:
Funo Declarao
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
ame
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
GetSaveFileN
ame
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias
"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long
Observao importante: As declaraes das funes devem ser escritas seguindo fielmente a
tabela acima. Os nomes so sensveis caixa.
Microsoft Access Avanado
128
As funes Beep e CharLower no 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
Declare Function CharLower Lib "user32" Alias "CharLowerA" _
(ByVal lpsz As String) As String
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
Entretanto, as funes GetOpenFileName e GetSaveFileName, assim como a maioria
das funes API, necessitam de documentao quanto estrutura e os valores dos
argumentos. Por exemplo, OPENFILENAME uma estrutura de dados definida pelo usurio
que contm os seguintes elementos.
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
Microsoft Access Avanado
129
Os exemplos dessas duas funes, apresentados adiante, s foram possveis graas ao
aplicativo Solutions, que acompanha o Access .
A funo GetOpenFileName abre uma caixa de dilogo do tipo Abrir, retornando um valor
lgico que indica se o usurio clicou no boto Abrir (true) ou no Cancelar (false). O nome do
arquivo armazenado no elemento lpstrFile de OPENFILENAME.
Option Compare Database
Option Explicit
Declare Function GetOpenFileName Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean
Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Boolean
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As Long
nMaxCustrFilter 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 Integer
lpstrDefExt As String
lCustrData As Long
lpfnHook As Long
lpTemplateName As Long
End Type
Function CaixaDialogo_Open( )
Dim of As OPENFILENAME
Dim blnAbriu As Boolean ' Verifica se o usurio abriu ou cancelou.
' Poderia ser o retorno da funo.
Dim strTitulo as String ' Ttulo da caixa de dilog. Poderia ser um
' argumento
Dim strFiltro As String ' Filtro para o tipo de arquivo. Tambm
' poderia ser um argumento
Dim strDirInicial As String Diretrio inicial. Idem
strTitulo = Abrir banco de dados
strFiltro = Banco de dados Access & Chr(0) & _
*.mdb & Chr(0) & Chr(0)
strDirInicial = C:\
of.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
Microsoft Access Avanado
130
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)
MsgBox blnAbriu True se clicou em Abrir. False se clicou em Cancelar
If blnAbriu Then
MsgBox of.lpstrFile Nome do arquivo escolhido
End If
End Function
Function CaixaDialogo_Save( )
Dim of As OPENFILENAME
Dim blnSalvou As Boolean ' Verifica se o usurio salvou ou cancelou.
' Poderia ser o retorno da funo.
Dim strTitulo As String ' Ttulo da caixa de dilog. Poderia ser um
' argumento
Dim strFiltro As String ' Filtro para o tipo de arquivo. Tambm
' poderia ser um argumento
Dim strDirInicial As String 'Diretrio inicial. Idem
Dim strNomeArq As String 'Nome sugerido para salvar. Idem
Dim strExtensaoDefault As String ' Extenso default. Idem
strTitulo = "Salvar banco de dados"
strFiltro = "Text files " & Chr(0) & "*.txt" & Chr(0) & Chr(0)
strDirInicial = "C:\"
strNomeArq = "Teste2"
strExtensaoDefault = "txt"
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)
Microsoft Access Avanado
131
MsgBox blnSalvou 'True se clicou em Salvar. False se clicou em Cancelar
If blnSalvou Then
MsgBox of.lpstrFile ' Nome do arquivo escolhido
End If
End Function
Estas funes no realizam operaes de abertura/salvamento de arquivo, mas
simplesmente abrem caixas de dilogo para se selecionar os arquivos.
Microsoft Access Avanado
132
13. SEGURANA
Antes de construir um aplicativo Access, voc deve ter em mente que nveis de
segurana que o aplicativo deve atender. mais construir um aplicativo com a segurana j
definida desde o incio que defin-la aps o aplicativo estiver pronto.
A segurana visa proteger os dados contra leitura de informaes confidenciais,
alterao indevida, incluso e excluso de registros por pessoa no autorizada. A segurana
protege tambm a estrutura dos objetos e o acesso ao cdigo-fonte dos mdulos.
Existem vrias formas de segurana:
Senha de banco de dados: a forma mais simples de proteger um banco de dados. Uma
vez definida a senha, uma caixa de dilogo solicita a entrada da senha. Todos os dados e
estruturas so acessveis por quem informar a senha correta.
Criao de arquivo MDE: Cria uma cpia do banco de dados, com extenso .MDE, o que
torna impossvel visualizar, criar ou alterar cdigo VBA. Impede tambm a criao e
alterao de formulrios e relatrios.
Criptografia: Torna a leitura dos dados impossvel atravs de um processador de texto ou
outra ferramenta de acesso a disco. Abrindo o banco de dados no prprio Access, a
criptografia imperceptvel, a no ser a perda de desempenho de 10 a 15%.
Segurana em nvel de usurio: Define permisses de leitura, gravao e alterao de
estrutura por objeto e usurio (ou grupo de usurios). a forma mais completa de
segurana.
Voc pode combinar utilizar todas as formas de segurana em um mesmo aplicativo.
13.1. SENHA DE BANCO DE DADOS
13.1.1. DEFININDO UMA SENHA PARA O BANCO DE DADOS
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, faa uma cpia de segurana do banco de dados que voc
quer proteger.
2) Se voc trabalha em rede, assegure-se que ningum mais esteja com o banco de dados em
uso.
3) Abra o banco de dados no modo exclusivo. Na caixa de dilogo Abrir, acionada pelo
menu Arquivo|Abrir banco de dados, h uma caixa de verificao Exclusivo.
4) A senha para um banco de dados feita pelo menu Ferramentas|Segurana|Definir
senha do banco de dados. Ao acionar o menu, ser aberta a seguinte caixa de dilogo.
Digite a senha, confirme e clique Ok
Microsoft Access Avanado
133
Observaes:
Voc pode definir uma senha de at 14 caracteres, entre letras, nmeros e caracteres
especiais. A senha sensvel a letras maisculas e minsculas.
Guarde a senha e a cpia de segurana do banco de dados em lugar seguro, pois em caso
de esquecimento, impossvel descobr-la.
Se voc pretende replicar seu banco de dados, no configure senha de banco de dados,
pois a replicao no funciona em banco de dados protegidos por senha.
13.1.2. ABRINDO UM BANCO DE DADOS PROTEGIDO POR SENHA
Ao abrir um banco de dados protegido por senha, uma caixa de dilogo solicitar a
senha.
Caso a senha esteja correta, o banco de dados aberto normalmente, com acesso a
todos os dados e objetos.
13.1.3. REMOVENDO SENHA DE BANCO DE DADOS
Aps 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 situao normal.
Num banco de dados protegido por senha, o menu Ferramentas|Segurana|Definir
senha do banco de dados passa a ser Ferramentas|Segurana|Desproteger senha do
banco de dados. Ao acionar este menu, ser pedida novamente a senha e o banco de dados
ento desprotegido.
13.1.4. DEFININDO SENHA POR CDIGO VBA
Microsoft Access Avanado
134
Voc pode definir uma senha do banco de dados por cdigo VBA, utilizando os
objetos do DAO. O mtodo para definir a senha NewPassword do objeto Database. O
cdigo no pode ser escrito no mesmo banco de dados o qual se deseja proteger.
Sub SetDBPassword()
' Declara a varivel do objeto database.
Dim dbs As Database
' Abre o banco de dados em modo exclusivo.
Set dbs = OpenDatabase("C:\bd1.mdb", True)
' Define a senha e fecha o banco de dados.
dbs.NewPassword "","topsecret"
dbs.Close
End Sub
13.1.5. ABRINDO UM BANCO DE DADOS PROTEGIDO VIA CDIGO VBA
Para abrir um banco de dados protegido via cdigo VBA, utilize o mtodo
OpenDatabase.
Sub OpenProtectedDB()
' Declara a varivel do objeto database.
Dim dbs As Database
' Abre o banco de dados protegido em modo compartilhado.
Set dbs = OpenDatabase("C:\bd1.mdb", False, False, ";pwd=topsecret")
End Sub
13.1.6. ALTERANDO A SENHA VIA CDIGO VBA
Voc pode tambm alterar a senha via cdigo usando o mtodo NewPassword do
objeto Database. O cdigo no pode ser escrito no mesmo banco de dados o qual se deseja
trocar a senha.
Sub ChangeDBPassword()
' Declara a varivel do objeto database.
Dim dbs As Database
' Abre o banco de dados em modo exclusivo.
Set dbs = OpenDatabase("C:\bd1.mdb", True, False, ";pwd=topsecret"))
' Define a senha e fecha o banco de dados.
dbs.NewPassword "topsecret", "novasenha"
dbs.Close
End Sub
Microsoft Access Avanado
135
13.2. CRIAO DE ARQUIVO MDE
Voc pode criar um arquivo de extenso .MDE a partir de um arquivo .MDB. No
preciso que o banco de dados .MDB esteja em uso.
Num arquivo MDE todas as estruturas de formulrios, relatrios e mdulos ficam
ocultas e inacessveis. Voc no pode criar novos formulrios, relatrios e mdulos, nem
exportar estes objetos, nem importar estes objetos de outros banco de dados .MDE.
Entretanto, tabelas, consultas e macros permanecem acessveis e podem ser importados e
exportados.
Se voc alterar seu banco de dados original, deve criar novamente um arquivo .MDE.
Mantenha sempre uma cpia de segurana do banco de dados original, pois no possvel
desfazer um arquivo .MDE.
Arquivos MDE so ideais para a distribuio da sua aplicao front-end, isto , um
banco de dados de extenso MDE possui as consultas, formulrios, relatrios, macros e
mdulos que acessam outros bancos de dados que contm as tabelas.
Aplicativo
Tabelas
Tabelas
Tabelas
Arquivos .MDB
Arquivo .MDE
Para criar um arquivo MDE, siga os passos:
1) Antes de criar um arquivo .MDE, faa uma cpia de segurana do banco de dados
original.
2) Se voc trabalha em rede, assegure-se que ningum mais esteja com o banco de dados em
uso.
3) Acione o menu Ferramentas|Utilitrios de banco de dados|Criar arquivo MDE
4) Na caixa de dilogo Salvar banco de dados como MDE, escolha o banco de dados
original e clique no boto Criar MDE.
5) Na caixa de dilogo Salvar como MDE, escolha o nome do novo arquivo e clique no
boto Criar.
Se o banco de dados original fizer referncia a outros bancos de dados MDB ou banco
de dados de suplemento (.MDA), estes devem tambm ser convertidos para MDE, na ordem
em que eles so 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.
Microsoft Access Avanado
136
Para um bom nvel de segurana, defina senhas para o banco de dados do aplicativo
(extenso MDE) e para cada banco de dados de tabelas (extenso MDB). Dentro do cdigo do
aplicativo, vincule as tabelas necessrias via cdigo VBA, passando a senha. Como o cdigo
do aplicativo ficar inacessvel, a senha ficar a salvo no cdigo. Desta forma, as tabelas
tambm ficam protegidas contra alterao de estrutura, j que tabelas vinculadas no podem
ter suas estruturas alteradas.
Eis um cdigo 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
Set dbs = CurrentDb
Set tdfs = dbs.TableDefs
Set tdf = dbs.CreateTableDef("Order Linked")
tdf.Connect = ";database=c:\bd1.mdb; pwd=topsecret"
tdf.SourceTableName = "Order"
tdfs.Append tdf
End Sub
Nesta configurao, os dados das tabelas ainda ficam vulnerveis alterao, assim
como as estruturas das consultas. Os dados somente podem ser protegidos com a segurana
em nvel de usurio. Quanto as consultas, voc pode minimizar o problema com as seguintes
recomendaes:
1) Define a propriedade Origem do Registro de formulrios e relatrios como uma tabela ou
uma consulta SQL (chamando o Construtor de Consulta ou passando a expresso SQL
diretamente).
2) Defina consultas de ao em cdigo VBA, construindo consultas com expresses em SQL
e utilizando o mtodo RunSQL objeto DoCmd.
3) Abra consultas que retorna folha de dados em sub-formulrios. Defina consultas seleo
ou referncia cruzada em cdigo VBA, construindo consultas com expresses em SQL e
passando a expresso como propriedade RecordSource do subformulrio.
Eis um exemplo de consulta de ao definida em cdigo VBA.
Sub DeleteCliente()
Dim strSql As String
strSql = "DELETE * FROM Clientes"
DoCmd.RunSQL (strSql)
End Sub
Eis um exemplo de como passar uma consulta de ao para um subformulrio.
Private Sub cmdAbrir_Click( )
Microsoft Access Avanado
137
Dim strSql as String
strSql = "SELECT * FROM [Detalhes do Pedido]"
Me![subfrmDetalhe].Form.RecordSource = strSql
Me![subfrmDetalhe].Requery
End Sub
13.3. CRIPTOGRAFIA DE BANCO DE DADOS
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 algum abrir um banco de dados diretamente pelo Access, a
criptografia no tem efeito nenhum.
Note a ao abrir o banco de dados Northwind.mdb, pelo Wordpad, dados podem ser
lidos.
No arquivo criptografado, todos os dados ficam ilegveis.
Microsoft Access Avanado
138
A criptografia um processo reversvel. Voc pode criptografar um banco de dados e
depois decriptograf-lo.
13.3.1. CRIANDO UM ARQUIVO CRITPTOGRAFADO
1) Abra o MS Access.
2) Certifique-se que o arquivo a ser criptografado no esteja em uso.
3) No menu Ferramentas|Seguraa escolha Criptografar/decriptografar banco de
dados..
4) Na caixa de dilogo Criptografar/Decriptografar banco de dados, selecione um
arquivo no criptografado e clique Ok.
5) Na caixa de dilogo Criptografar banco de dados, informe o novo nome do arquivo e
clique Salvar.
13.3.2. REVERTENDO A CRITPTOGRAFIA
1) Abra o MS Access.
2) Certifique-se que o arquivo a ser decriptografado no esteja em uso.
3) No menu Ferramentas|Seguraa escolha Criptografar/decriptografar banco de
dados..
4) Na caixa de dilogo Criptografar/Decriptografar banco de dados, selecione um
arquivo criptografado e clique Ok.
5) Na caixa de dilogo Descriptografar banco de dados, informe o novo nome do
arquivo e clique Salvar.
13.3.2. CRIPTOGRAFIA POR CDIGO VBA
Use o mdodo CompactDatabase do objeto DBEngine para criptografar outro banco
de dados.
Sub EncryptDb()
DBEngine.CompactDatabase "C:\bd1.mdb", "C:\db1Cripto.mdb", _
dbLangGeneral, dbEncrypt
End Sub
13.4. SEGURANA EM NVEL DE USURIO
A segurana em nvel de usurio o modo mais flexvel e seguro de proteger um
banco de dados. Com ele, para cada objeto, pode-se definir permisses de:
abrir/executar (para formulrio, relatrio e macro)
leitura de dados (para tabela e consulta),
insero de dados (para tabela e consulta),
excluso de dados (para tabela e consulta),
alterao de dados (para tabela e consulta),
visualizao de estrutura,
Microsoft Access Avanado
139
alterao de estrutura e
administrao.
Ainda pode-se definir permisses para o banco de dados:
Abrir/executar,
Abrir exclusivo e
Administrao
As permisses so definidas para cada usurio (chamada permisso explcita) ou para
grupo de usurios (chamada permisso implcita). Neste ltimo caso, os usurios membros do
grupo herdam as permissses do grupo. As definies das permisses ficam armazenadas em
um arquivo de informao de grupo de trabalho, de extenso .MDW.
Por padro, o arquivo de informao de grupo de trabalho o SYSTEM.MDW e
existem dois grupos pr-definidos:
Administradores (Admins, na verso em ingls)
Usuarios (Users, na verso em ingls)
Existe ainda um usurio pr-definido, o Adminsitrador (Admin, na verso em ingls)
que pertence a ambos os grupos pr-definidos.
O arquivo de informao de grupo de trabalho pode ser associado a todos os bancos de
dados ou a apenas um especificamente. O segundo mtodo o mais adequado, pois voc
define segurana por aplicativo.
Ao definir segurana em nvel de usurio, ao abrir o banco de dados ser apresentada
uma caixa de dilogo de Logon para que seja informado o nome do usurio e a senha. Se o
usurio e a senha estiverem corretos, o banco de dados aberto e permitir que o usurio
execute somente as tarefas definidas nas permisses.
As permisses sobre os objetos podem ser alteradas:
Por membros do grupo Administradores.
Pelo proprietrio do objeto.
Por usurios que tenha permisso Administrao sobre o objeto.
13.4.1. PROPRIEDADE SOBRE O BANCO DE DADOS E OBJETOS
Por padro, o usurio Administrador o proprietrio do banco de dados e de todos os
objetos nele contidos. Proprietrio o usurio que criou o objeto. Na segurana em nvel de
usurio no possvel retirar a permisso de usurios criarem objetos. Criando-se um arquivo
MDE, pode-se evitar que novos formulrios, relatrios e mdulos sejam criados. Via
programao, pode-se retirar permisses de usurios de criarem novas tabelas e consultas e
novos banco de dados, mas no se pode retirar permisso de criar formulrios, relatrios,
macros e mdulos.
13.4.2. IMPLEMENTANDO SEGURANA EM NVEL DE USURIO
Microsoft Access Avanado
140
Crie um novo arquivo de informao de grupo de trabalho.
1) Clique no atalho para o Administrador de grupo de trabalho do MS Access. Surgir a
caixa de dilogo a seguir:
2) O arquivo SYSTEM.MDW o arquivo padro de informao de grupo de trabalho.
Clique no boto Criar.
3) Surgir uma caixa de dilogo para definir o proprietrio do grupo de trabalho. Guarde
bem as informaes, incluindo se as letras esto em maisculas ou minsculas.
4) Ao clicar OK, surgir uma caixa de dilogo para o nome e localizao do novo arquivo de
informao de grupo de trabalho.
Microsoft Access Avanado
141
5) Ao clicar OK, uma caixa de dilog surgir confirmando o novo arquivo de informao de
grupo de trabalho. Ao abrir o Access, todos os bancos de dados utilizaro o novo arquivo
para a segurana em nvel de usurio.
Observao: Voc pode pensar em simplesmente criar um arquivo MDW a partir de uma
cpia do system.mdw. Este mtodo no funciona, pois cada arquivo tem uma identificao
nica, formada pelo Nome, Empresa e Cdigo do grupo de trabalho.
Crie um usurio proprietrio e administrador
1) Inicie o Access, sem abrir ou criar nenhum banco de dados. Acione o menu
Ferramentas|Segurana|Contas de usurio e grupo
2) Na caixa de dilogo Contas de usurio e grupo, crie um novo usurio que ser o
proprietrio e administrador do banco de dados de seu aplicativo e inclua-o no grupo
Administradores. Usaremos para exemplo o usurio Master.
Microsoft Access Avanado
142
3) Na caixa de combinao Nome, selecione o usurio Administrador e retire-o do grupo
Administradores.
4) Na guia Alterar senha de logon, informe uma senha para o usurio Administrador. Isto
far com que uma caixa de dilogo de logon aparea ao abrir o Access.
5) Clique no boto OK e saia do Access.
6) Abra novamente o Access. Surgir a caixa de logon. Informe o novo usurio, no caso
Master. A senha no foi definida ainda e portanto, pode clicar OK.
7) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo, selecione a guia
Alterar senha de logon, informe uma senha para o usurio Master. Clique Ok.
Observao: Se voc no retirar o usurio Administrador do grupo Administradores, qualquer
um poder acessar seu banco de dados usando o arquivo padro system.mdw. O usurio
Administrador permanece no grupo Usurios e no pode ser retirado desde grupo.
Criar um banco de dados novo sem permisses de usurio
1) Crie um banco de dados novo. O usurio Master ser o proprietrio do banco de dados. O
grupo Administradores e Usuarios tero todas as permisses sobre todos os objetos e
sobre o banco de dados novo.
2) Acione o menu Ferramentas|Segurana|Permisses para usurio e grupo.
Microsoft Access Avanado
143
3) Mude para listar Grupos e selecione o grupo Usurios. Na caixa de combinao Tipo de
objeto, altere para banco de dados, retire todas as pemisses e clique no boto Aplicar.
4) Na caixa de combinao Tipo de objeto, altere para cada tipo de objeto e retire todas as
pemisses. Clique no boto Aplicar antes de mudar de tipo de objeto.
5) Clique Ok.
Observao: Se voc no retirar as permisses do grupo Usurios, qualquer um poder
acessar seu banco de dados usando o arquivo padro system.mdw e o usurio Administrador,
pois ele ainda permanece ao grupo Usurios.
Defina um grupo de usurios para seu aplicativo
1) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo
2) Na guia Grupos, crie um novo grupo de usurio do seu aplicativo, por exemplo Usuarios
do sistema. Clique Ok.
3) Acione o menu Ferramentas|Segurana|Permisses para usurio e grupo.
4) Mude para listar Grupos e selecione o grupo Usuarios do sistema . Na caixa de
combinao Tipo de objeto, altere para banco de dados, marque somente a permisso
Abrir/Executar e clique no boto Aplicar.
5) Na caixa de combinao Tipo de objeto, altere para cada tipo de objeto e escolha as
permisses desejadas. De um modo geral, os usurios no devem ter permisso de
Modificar estrutura e Administrador. Clique no boto Aplicar antes de mudar de tipo de
objeto.
6) Clique Ok.
7) Se alguns usurio tiverem nveis de permisso diferentes, crie novos grupos de usurios e
marque as pemisses desejadas.
Crie usurios e associe aos grupos
1) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo
2) Crie novos usurios e adicione ao grupo Usuarios do sistema. Todo novo usurio
automaticamente faz parte do grupo Usurios e no pode ser removido dele. Os usurios
herdaro as permisses do grupo ao qual pertencem.
3) Se outro usurio precisar ter o poder de administrar o banco de dados, inclua-o no grupo
Administradores.
4) Todos os usurios no tero senha. Voc deve abrir o Access e efetuar o logon com cada
usurio e definir uma senha. Acione o menu Ferramentas|Segurana|Contas de usurio
e grupo, selecione a guia Alterar senha de logon, informe uma senha para o usurio
atual.
Eliminado a caixa de logon
1) Efetue o logon como Administrador.
2) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo, selecione a guia
Alterar senha de logon, informe a senha atual e mantenha a caixa Nova senha e Confirmar
em branco. Clique OK.
Observao: Ao retirar a senha do usurio Administrador, o Access no mais pedir senha de
logon, e todos os usurios se logaro como Administrador. Como este usurio no tem
Microsoft Access Avanado
144
nenhuma permisso, ele nada poder fazer, a no ser que o grupo Usurios tenha alguma
permisso. Voc pode definir algumas permisses bsicas para o usurio Administrador.
No aconselhvel eliminar a senha do usurio Administrador.
Definindo um arquivo de informao de grupo de trabalho para um aplicativo
1) Acione o Administrador de grupo de trabalho e associe o arquivo original
(SYSTEM.MDW). Isto far com que o Access use o arquivo original mas no permitir o
acesso aos bancos de dados protegidos.
2) Crie um atalho que chame o Access e passe os parmetros de linha de comando.
C:\Arquivos de programas\Microsoft Office\Office\MSAccess.exe C:\bd1.mdb /wrkgrp C:\sistemax.mdw
13.4.2. LOGON POR CDIGO VBA
Ao definir segurana em nvel de usurio, voc pode ter uma complicao com
cdigos escritos sem levar em conta esta segurana. Uma operao que normalmente
funcionava antes pode no funcionar mais depois de configurada a segurana. Um caso tpico
a abertura De uma tabela pelo mtodo OpenRecordset do objeto Database. Normalmente o
cdigo :
Sub AbreTabela()
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Categorias")
End Sub
Caso o usurio atual no tenha permisso sobre a tabela Categorias, o cdigo falhar.
Se voc no quer dar permisso ao usurio para acessar a tabela, preciso abrir o
banco de dados, via cdigo, com uma conta de um usurio que tenha as permisses
necessrias.
Sub AbreTabela()
Dim wks As Workspace
Dim dbs As Database
Dim rst As Recordset
Set wks = DBEngine.CreateWorkspace("NewWork", "master", "topsecret")
Set dbs = wks.OpenDatabase(CurrentDb.Name)
Set rst = dbs.OpenRecordset("Categorias")
End Sub
Observao: No modo programado, os grupos Administradores e Usurios so referidos como
Admins e Users, respectivamente, e o usurio Administrador Admin, independentemente se
o Access em portugus ou ingls.
Microsoft Access Avanado
145
13.4.3. TROCA DE SENHA VIA CDIGO VBA
Para os usurios mudarem a sua senha, precisam ter acesso ao menu
Ferramentas|Segurana|Contas de usurio e grupoEntretanto, em uma aplicao no
interessante que os usurios tenham acesso a menus. Para resolvere esta situao, pode-se
criar um cdigo VBA para eles mesmos alterem suas senhas, sem ter acesso ao menu.
Sub ChangePassword()
Dim wks As Workspace
Set wks = DBEngine.Workspaces(0)
wks.Users("Teste").NewPassword "senhaantiga", "novasenha"
End Sub
O usurio no precisa ser administrador para alterar sua prpria senha. Porm, eles
no conseguem alterar senha de usurios do grupo Administradores, nem conseguem alterar
sus prpria senha caso esqueam a senha atual.
No exemplo acima, foi alterada a senha do usurio Teste. Uma melhoria do cdigo
seria criar uma caixa de dilogo que obtivesse o nome do usurio atual. O nome do usurio
atual pode ser obtido pela funo CurrentUser().
Private Sub cmdFechar_Click()
DoCmd.Close
End Sub
Private Sub cmdOk_Click()
Dim wks As Workspace
Set wks = DBEngine.Workspaces(0)
If Me.txtNovaSenha <> Me.txtConfirmar Then
MsgBox "Nova senha no confere!"
Exit Sub
End If
On Error Resume Next
wks.Users(CurrentUser()).NewPassword Me.txtSenhaAtual, Me.txtNovaSenha
If Err.Number <> 0 Then
MsgBox "No foi possvel alterar a senha. Confira a sua senha
atual!"
Microsoft Access Avanado
146
End If
End Sub
Private Sub Form_Open(Cancel As Integer)
Me.txtUsuario = CurrentUser()
Me.txtSenhaAtual.SetFocus
End Sub
13.4.4. RETIRAR PEMISSO DE CRIAR NOVOS BANCOS DE DADOS
Quando um usurio efetua o logon no Access, possvel ele fechar o database do
aplicativo e criar um novo banco de dados. Via programao possvel retirar esta permisso.
A permisso de criar banco de dados est no objeto Container, especificamente o
container Databases, do arquivo de informao de grupo de trabalho. Deve-se portanto abrir
este arquivo e configurar a propriedade Permissions do container Databases.
Para acrescentar uma permisso s j existentes, faz-se uma operao Or. Para
remover permisso, faz-se uma operao And Not. As operaes so feitas com as
permisses atuais e uma constante intrseca das Constantes de Segurana. No caso de criao
de banco de dados, a constante a dbSecDBCreate.
Sub Deny_DBCreate()
Dim dbs As Database, ctr As Container, strMDW
' Recupera o caminho e o nome do arquivo de grupo de trabalho
strMDW = DBEngine.SystemDB
Set dbs = DBEngine(0).OpenDatabase(strMDW)
Set ctr = dbs.Containers!Databases
ctr.Username = "Users" ' Grupo Usurios
ctr.Permissions = ctr.Permissions And Not dbSecDbCreate
End Sub
13.4.5. RETIRAR PEMISSO DE CRIAR NOVAS TABELAS E CONSULTAS
As permisses para criar tabelas e consultas ficam so definidas no objeto Container,
especificamente no container Tables, do banco de dados protegido (.MDB). A propriedade
Permissions deste container deve sofrer a operao And Not dbSecCreate.
Sub Deny_Create_TableQuery()
Dim dbs As Database, ctr As Container
Set dbs = CurrentDb()
Set ctr = dbs.Containers!Tables
ctr.Username = "Users" ' Grupo Usurios
ctr.Permissions = ctr.Permissions And Not dbSecCreate
End Sub
ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT
147
ANEXO A - CONVENO DE NOMES PARA
DESENVOLVIMENTO DE APLICAES COM PRODUTOS
MICROSOFT
A Microsoft adota a Leszynski Naming Conventions - LNC, tambm conhecida como notao
hngara, 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 (mdulos de classe do Visual Basic)
Constants (constantes)
Form controls (controles de formulrios do Visual Basic e do Access)
Forms (formulrios do VB e do Access)
Modules (mdulos do VB e Access)
Procedures (procedimentos do VB e Access)
Queries and views (consultas do Access e SQL)
Report controls (controles de relatrio do Access)
Reports (relatrios do Access)
Security objects (objetos de segurana 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 usurio do VB e Access)
Variables (variveis)
A estrutura da LNC baseia-se em uma tag (etiqueta) antes do nome do objeto (por
exemplo, frmLogin). A sintaxe :
[prefixo(s)] {tag} {Nome} [Qualificador] [Sufixo]
Os elementos entre colchetes so opcionais.
O prefixo e a tag so escritos sempre em letras minsculas. O nome e o qualificador
so escritos em letras maisculas e minsculas. O sufixo pode ser escrito tanto em letras
maisculas quanto minsculas.
Exemplos:
Nome do objeto Prefixo Tag Nome Qualificador Sufixo
qryVendasReopABR qry Vendas Reop ABR
frmSobre frm Sobre
sdtmVigCtr s dtm Vig Ctr
plngAcumulado p lng Acumulado
ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT
148
MICROSOFT ACCESS
Hierarquia dos objetos do Access
Tags para objetos da janela de banco de dados do ACCESS
Objeto Tag
Formulrio (form) frm
Macro mcr
Mdulo (module) bas
Consulta (query) qry
Relatrio (report) rpt
Tabela (table) (*) tbl
(*) As tabelas no usaro prefixo nem tags, somente o Nome.
Tags para objetos controles do ACCESS
Controle Tag
Bound object frame (moldura de objeto acoplado) frb
Chart cht
Check box (caixa de verificao) chk
Combo box (caixa de combinao) cbo
Command button (boto de comando) cmd
Custom control (controle personalizado) ocx
Image (imagem) img
Label (rtulo) lbl
Line (linha) lin
List box (caixa de listagem) lst
Option button (boto de opo) opt
Option group (grupo de opo) grp
Page break (quebra de pgina) brk
Rectangle (retngulo) shp
Section (seo) sec
Subform/Subreport (subformulrio/subrelatrio) sub
Text box (caixa de texto) txt
Toggle button (boto alternar) tgl
Unbound object frame (moldura de objeto no acoplado) fru
ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT
149
Tags para variveis 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
DATA ACCESS OBJECTS - DAO
Hierarquia dos objetos DAO para Microsoft Jet Workspaces
ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT
150
Hierarquia dos objetos DAO para ODBCDirect Workspaces
Tags para Data Access Objects - DAO
Objeto Tag (ACCESS) Tag (VB)
Connection con
Connections cons
Conteiner ctr
Conteiners ctrs
Database dbs db
Databases dbss
DBEngine dbe
Document doc
Documents docs
Error err
Errors errs
Field fld
Fields flds
Group grp
Groups grps
Index idx
Indexes idxs
Parameter prm
Parameters prms
Properties prps
Property prp
QueryDef qdf qry
QueryDefs qdfs
RecordSet rst rec
RecordSets rsts
Relation rel
Relations rels
TableDef tdf tbd
TableDefs tdfs
User usr
Users usrs
Workspace wrk wsp
Workspaces wrks
ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT
151
MICROSOFT VISUAL BASIC 5.0
Tags para controles do Visual Basic
Controle Tag
3D Panel pnl
Animated button ani
Check box chk
Combo box, drop-down list box cbo
Command button cmd
Common dialog dlg
Communications com
Control (usado em procedures
quando o tipo indefinido)
ctr
Data control dat
Data-bound combo box dbcbo
Data-bound grid dbgrd
Data-bound list box dblst
Directory list box dir
Drive list box drv
File list box fil
Form frm
Frame fra
Gauge gau
Graph gra
Grid grd
Horizontal scroll bar hsb
Image img
Key status key
Label lbl
Line lin
List box lst
MAPI message mpm
MAPI session mps
MCI mci
MDI child form mdi
Menu mnu
MS Flex grid msg
MS Tab mst
OLE ole
Outline out
Pen BEdit bed
Pen HEdit hed
Pen ink ink
Picture pic
Picture clip clp
Report rpt
Shape shp
Spin spn
Text box txt
Timer tmr
UpDown upd
Vertical scroll bar vsb
Slider sld
ImageList ils
TreeView tre
Toolbar tlb
TabStrip tab
StatusBar sta
ListView lvw
ProgressBar prg
RichTextBox rtf
MICROSOFT VISUAL BASIC FOR APPLICATION - VBA
Tags para variveis do Visual Basic for Application
Tipo de varivel Tag
(VBA)
Tag
(VB)
Boolean (lgico) bln
Byte byt
Collection object - col
Conditional Compilation Constant ccc -
Currency (moeda) cur
Date (data) dtm
Double (dupla preciso) dbl
Error err
Integer (inteiro) int
Long (inteiro longo) lng
Object obj
Single (inteiro simples) sng
String (caracter) str
User-Define Type typ udt
Variant var vnt