Escolar Documentos
Profissional Documentos
Cultura Documentos
Luis Abreu
ndice
Introduo ......................................................................................................................... 3
Captulo 1...................................................................................................................... 4
VBA no Access 2000................................................................................................ 4
Controlo de fluxo .................................................................................................... 11
Captulo 2.................................................................................................................... 17
Os objectos intrnsecos do Access .......................................................................... 17
Captulo 3.................................................................................................................... 22
Utilizando os objectos de dados do Access (ActiveX Data Objects) ..................... 22
Captulo 4.................................................................................................................... 26
Tratamento de erros ................................................................................................ 26
Captulo 5.................................................................................................................... 28
A aplicao Sub-MovieCentral............................................................................... 28
Introduo
O que contm este documento
Este documento tem por principal objectivo ilustrar algumas das capacidades que
Microsoft Access fornece, incidindo sobre aspectos pouco focados ao longo das aulas
prticas (recorde-se que ao longo das aulas foi dado grande nfase ao desenvolvimento
de base de dados utilizando os vrios assistentes fornecidos pela aplicao). O principal
objectivo deste documento introduzir o VBA como meio auxiliar de desenvolvimento
de aplicaes.
Captulo 1
O Access suporta o VBA desde a verso Access 95. O VBA, tambm conhecido por
Visual Basic for Applications 1 , uma linguagem de programao, baseada em
objectos 2 , que pode ser utilizada pelos vrios componentes (programas) do Microsoft
Office.
O objectivo desta seco apresentar, de uma forma bastante rpida, algumas das
caractersticas do VBA.
Utilizao de mdulos
A programao VBA em Access sempre feita em mdulos. Existem trs tipos de
mdulos 3 :
tipo formulrio;
tipo relatrio;
tipo stadalone (que passaremos a designar por mdulos e possuem um
separador prprio no Access que designado de...Mdulos).
Todo o cdigo VBA tem obrigatoriamente de estar contido num destes mdulos. As
funes relacionadas com os formulrios devem ser escritas nos mdulos tipo
formulrio (cada formulrio criado no Access dispe sempre de um mdulo tipo
formulrio associado); por sua vez, todo o cdigo relativo aos relatrios deve ser
armazenado num mdulo do tipo relatrio (cada formulrio possui sempre,
semelhana dos formulrios, de um mdulo tipo relatrio associado); por outro lado, o
cdigo genrico (no relacionado directamente com um formulrio ou relatrio) deve
ser sempre escrito em mdulos tipo standalone.
Mdulos tipo formulrio
Para exemplificar os vrios tipos de mdulos, vamos apresentar alguns exemplos
simples. Antes de comear a escrever cdigo num formulrio, necessrio ter em
ateno as diferenas existentes no modo de visionamento de um formulrio:
modo de desenho;
modo datagrid;
1
A verso actual do VBA (6) coincide com a verso 6 do Visual Basic. A Microsoft props-se a manter
ambas as linguagens sincronizadas.
2
A opinio do autor deste documento diverge da grande maioria dos restantes autores. Muitas vezes o
Access apresentado como sendo uma linguagem orientada a objectos. Isto no corresponde realidade!
O paradigma da orientao a objectos permite a criao de classes (grupo de objectos com as mesmas
caractersticas), a utilizao de tcnicas como o polimorfismo, encapsulamento, etc. Tal no possvel em
VBA ( praticamente impossvel criar classes em VB!). Exemplos de linguagens orientadas a objectos:
C++ (ora a est uma linguagem do agrado do autor), Java, C#, etc.
3
Estes termos so da autoria do autor, no sendo por isso designaes exactas.
modo formulrio.
Bem, vamos analisar um pouco melhor o que foi feito. Assim, o primeira aspecto a ter
em ateno reside no facto dos botes terem uma caption (texto que apresentado ao
utilizador que se encontra escrito no boto) e um nome (id que serve para identificar o
boto no formulrio). Alis refira-se que todos os elementos que constituem um
formulrio (designados de objectos ou controlos) tm sempre um nome, servindo esse
nome para identificar o controlo no formulrio ( atravs desse nome que podemos
mudar as propriedades de um determinado controlo do formulrio utilizando VBA).
Convm tambm analisarmos um pouco melhor a janela do editor do VBA (o chamado
IDE):
Este exemplo encontra-se nos ficheiros de cdigo com o nome de cap1_1.mdb nos ficheiros que
acompanham este manual.
Conforme possvel ver na figura, o IDE est dividido em vrias zonas. Por cima do
cdigo temos uma zona importante que contm duas caixas de combinao: a primeira
contm o nome do controlo actual; a segunda contm o nome do evento seleccionado.
Ambos estes parmetros so controlados pela posio do cursor na pgina. Tambm
servem para navegarmos rapidamente para a funo pretendida, ou at mesmo
acrescentar uma nova funo.
At agora temos falado de funes e eventos, dando at a ideia de que s podemos ter
funes que servem para processar eventos. Contudo podemos ter funes
independentes, que so evocadas por determinados eventos (mais informao nas
prximas pginas).
Outro conceito que tem sido referido constantemente, e que importa aprofundar um
pouco mais, o de evento. O evento assume um papel muito importante na
programao em VBA. Pode-se mesmo dizer que a programao em VBA eventdriven, ou seja, todas as aces desempenhadas propagam-se sob a forma de eventos,
podendo ento o programador processar o evento (processar no mais do que associar
um conjunto de instrues a um determinado evento). Os eventos existentes so muitos,
e podem ser despoletados por um controlo existente num formulrio, ou at mesmo pelo
prprio formulrio (por exemplo, quando um formulrio aberto, disparado o evento
onload). Como vimos (atravs do exemplo anterior) uma das formas que temos de
processar eventos atravs das opes propriedades ( a que podemos aceder,
seleccionando um controlo e clicando com o boto direito sobre este).
A programao em mdulo tipo relatrio praticamente idntica do tipo
formulrio, pelo que no vamos efectuar qualquer tipo de referncia especfica a
esse tipo de mdulo.
Declarao de variveis
medida que a complexidade aumenta, torna-se necessrio armazenar informao de
forma temporria; nestes casos podemos recorrer s variveis. A criao de variveis
pressupe trs questes importantes:
tempo de vida da varivel;
nome da varivel;
tipo da varivel.
O tempo de vida da varivel designado de scope. Para alm do scope, uma varivel
sempre caracterizada pela visibilidade. As variveis podem ser locais (no interior de
funes ou do mdulo) ou globais (disponveis em qualquer local da aplicao). As
variveis globais so sempre declaradas nos mdulos5 , tendo apenas a particularidade de
serem declaradas com uma visibilidade pblica (utilizando portanto o qualificador
Public). A declarao de variveis segue a seguinte sintaxe:
visibilidade nome_variavel As tipo_variavel
Exemplos de variveis:
Private var1 As String
Public var2 As Integer
A visibilidade pode ser de dois tipos:
pblica (Public);
privada(Private ou Dim).
A declarao de variveis pblicas apenas tem efeito a nvel de variveis declaradas a
nvel global nos vrios mdulos 6 . Se uma varivel for declarada como pblica num
mdulo, ento possvel aceder ao seu valor (leitura ou escrita) a partir de qualquer
funo (o ficheiro cap1_3.mdb apresenta exemplo da utilizao de uma varivel local ao
mdulo do formulrio - esta varivel passava a ser global se tivesse sido declarada como
Public).
A partir de agora o termo mdulo passa a designar os mdulos do tipo standalone. Se uma varivel for
declarada globalmente no mdulo de um formulrio, ento necessrio referenci -la antes de a puder
utilizar (informaes adicionais na parte de programao de objectos).
6
Uma vez que uma varivel declarada no interior de uma funo s existe quando a funo for executada,
ento no h qualquer vantagem em declarar uma varivel como pblica no interior de uma funo.
Falta apenas referir uma ltima opo que possvel aplicar declarao de variveis:
Static. O qualificador Static pode ser aplicado a variveis no interior de funes,
fazendo com que as variveis se portem como variveis declaradas a nvel do mdulo.
Contudo s podem ser acedidas no interior da funo 7 . Exemplo:
Static usr as String
Declarao de funes
Uma funo no mais do que um conjunto de instrues que esto agrupadas sob um
nome, bastando apenas evocar o nome da funo para executar todas essas instrues.
Existem dois tipos principais de funes:
procedimentos: assim designados por no retornarem qualquer valor;
funes: retornam sempre um resultado.
Os procedimentos so sempre declarados utilizado a seguinte sintaxe:
Public Sub Nome_Procedimento( parmetros )
mais codigo
End Sub
Por sua vez as funes seguem a seguinte sintaxe
Public Function Nome_Funo ( parmetros ) As Tipo_Valor_Retorno
mais cdigo
End Function
J agora chama-se a ateno para o facto de os comentrios serem feitos em VB
utilizando o smbolo .
Repare-se que a visibilidade de um funo (se s est disponvel no mdulo, ou ento,
se se encontra disponvel em toda a aplicao) tambm ela qualificada pelos dois
termos Public e Private (portanto, de forma semelhante s variveis). A qualificao dos
procedimentos e das funes no obrigatria, sendo que quando no utilizado
nenhum qualificador, o qualificador Public
automaticamente atribudo ao
procedimento. Tambm possvel atribuir o qualificador Static a um procedimento ou
funo. A qualificao de uma funo (ou um procedimento) de static converte
automaticamente todas as variveis em variveis estticas.
Utilizao de parmetros
Para melhor percebe-se o funcionamento das variveis estticas (static) h que perceber o que acontece
normalmente a uma varivel. Quando uma varivel declarada no inicio de uma funo, essa varivel
existe at ao fim da funo (at chegar ao End Sub ou End Function). Ao chegar ao fim da funo, a
memria libertada, e o eventual valor que a varivel continha perdido. Por sua vez, as variveis
estticas no so destrudas quando se chega ao fim da funo. Da prxima vez que a funo for
executada, a varivel esttica contm o valor que tinha no fim da ltima execuo da funo.
End Sub
Parmetros Opcionais
Tambm possvel termos parmetro opcionais. Os parmetros opcionais so sempre
declarados no fim da lista de parmetro de uma funo. Para tornar um parmetro de
opcional, basta apenas declar- lo como sendo do tipo Variant. Para ver se o parmetro
foi introduzido basta utilizar a funo IsMissing() 8 .
Function Salutation(strFirst as String, strLast as String, _
Optional varSalutation as Variant) as String
If IsMissing(varSalutation) Then
Salutation = strFirst & " " & strLast
Else
Salutation = varSalutation & " " & strFirst & " " & StrLast
End If
End Function
O simbolo & responsvel por efectuar a concatenao das duas strings. Tambm
possvel passar n parmetros opcionais. Para tal temos de qualificar a varivel de
ParamArray.
Public Function Concat(ParamArray avarArray() as Variant) as String
End Function
8
Repare -se na diferena de processos para evocar uma subrotina: no caso dos procedimentos, basta
escrever o nome da subrotina (ex: soma a, b procedimento soma com dois parmetros); no caso das
funes, temos de introduzir parntesis (ex: c = soma( a, b ) ).
Como podemos ver, o parmetro inicializado com a varivel. Qual o valor da varivel
aps a execuo da funo SquareInt (recorde-se que o valor do parmetro mudou
dentro da funo)? Neste caso o valor da varivel X no alterado de 10 para 100
(ficheiro cap1_4.mdb). De facto, os parmetros so passados (por defeito) por valor
(estamos a falar dos tipos primitivos do access, como por exemplo o integer; no caso
dos objectos, a passagem feita por referncia). Existe uma outra opo (por referncia)
caso em que os parmetros trabalham directamente sobre o valor. Podemos especificar o
tipo de parmetro atravs de dois termos reservados:
ByRef: parmetro por referncia;
ByVal: parmetro por valor.
Exemplo da utilizao destes qualificadores:
Sub Test( ByRef par1 as String, ByVal par2 as String )
End Sub
Como j foi dito, os parmetros por referncia trabalham directamente sobre o valor de
uma varivel. Da que tenhamos que ter o cuidado de ao evocar a funo, ter em ateno
que um parmetro por referncia tem de estar sempre relacionado com uma varivel (lvalue) e nunca com um valor constante (r-value). O exemplo seguinte tenta evocar o
procedimento apresentado no pargrafo anterior:
Dim var as String
cdigo....
exemplo da correcta utilizao
Test var, String 2
forma incorrecta
Test String1, String2
Controlo de fluxo
Tal como em todas as linguagens de alto nvel, existem dois tipos de estruturas de
controlo de fluxo:
estruturas de deciso: permitem tomar decises;
estruturas de repetio: permitem repetir um conjunto de instrues.
Os principais dois tipos de estrutura de deciso so o if e o select. Tm a seguinte
sintaxe (uma vez que os alunos inscritos esto matriculados em TLP, apenas
apresentamos a sintaxe sem indicar quaisquer exemplos da utilizao deste tipo de
estruturas, pois apenas esta (sintaxe) a diferena existente entre as estruturas de
controlo de fluxo do VBA e as do C ou do Pascal) :
If condio then
Bloco de intrues
Else
Bloco de instrues
End If
Select Case condio
Case valor1
' Process valor1
Case valor2
' Process valor2
Case Else
' All other days.
End Select
Por sua vez, existem trs tipos de estruturas de repetio: do...loop, for....next e for
each...next. A sintaxe de cada um das estruturas a seguinte:
Do While | Until condition
statements
Exit Do
statements
Loop
Do
statements
Exit Do
statements
Loop While | Until condition
Neste caso estamos a falar dos chamados r-values, que so valores constantes e no de constantes
definidas pelo utilizador. Exemplos de r-values: 10 (exemplo de um inteiro), test (exemplo de uma
string), etc.
Objectos existentes
Como j foi referido, a programao VBA baseada em objectos. Praticamente tudo
um objecto. Os objectos tm propriedades e mtodos que so expostos (pblicos). O
Object Browser permite ver as propriedades/mtodos expostos por um objecto. Para
aceder ao object browser, basta carregar na tecla F2 no IDE do VBA.
Se for necessrio, podemos recorrer a objectos exteriores. Por exemplo, pode ser
necessrio integrar o word numa base de dados, utilizando para construir relatrios
escritos. Para tal basta indicarmos ao Access que desejamos utilizar esse(s) objecto(s)
atravs da opo Referncias no menu Ferramentas do IDE de VBA.
As propriedades de um objecto
Para se aceder s propriedades de um objecto basta fazer o seguinte:
Nome_objecto.propriedade
Por exemplo, se tivermos uma edit box com o nome de edit, ento podemos aceder a
propriedade value da seguinte maneira: edit.Value. Existem algumas propriedades que
so s de leitura, outras de escrita e ainda outras que suportam ambas as operaes.
Muitos objectos fornecem uma propriedade por defeito. Nesse caso no necessrio
indicar a propriedade. Por exemplo, as edit boxes apresentam o Value como propriedade
por defeito. Por isso podemos utilizar (aproveitando o exemplo anterior) edit como
sinnimo de edit.Value. Todos os objectos tm uma propriedade por defeito (ou melhor,
quase todos, uma vez que isso depende da maneira como o objecto foi implementado).
Existe uma forma de aceder a vrias propriedades de um objecto em simultneo. Para
tal utilizamos o With. Exemplo (supondo que temos uma edit box com o nome de
text1):
With text1
.Backcolor = 0
.Width = 200
.Height = 400
End With
Os mtodos de um objecto
Da mesma forma que podemos aceder s propriedades de um objecto, tambm
possvel aceder aos mtodos de um objecto. Um mtodo uma subrotina pblica, e por
isso semelhante a uma funo ou procedimento. A nica diferena reside no facto de
termos de qualificar o nome do mtodo pelo nome do objecto. Exemplo:
Objecto.metodo
Mais uma vez necessrio ter em ateno que as funes tm obrigatoriamente de ser
evocadas utilizando parntesis, enquanto que os procedimentos no devem ser evocados
com parntesis. Os exemplos seguintes ilustram a diferena:
Object.metodo procedimento
Object.metodo() funo
Tambm possvel evocar mtodos de objectos com parmetros (alis como era de
esperar!). O exemplo seguinte mostra como (para funes e para procedimentos):
Object.metodo( 10, 20 ) funo
Object.metodo 10, 20 procedimento
Podemos utilizar os parmetros com nome numa situao em que temos parmetros
opcionais e no queremos ter o trabalho de andar a escrever virgulas. Por exemplo,
suponhamos que temos uma funo com cinco parmetros, e que s queremos passar
valores para o primeiro e para o ltimo parmetro. Neste caso a utilizao de parmetros
por nome facilita e ajuda a melhor documentar o cdigo.
MsgBox txtName
No exemplo anterior a utilizao da instruo Set torna txtName numa referncia.
Assim, ambas as variveis apontam para o mesmo endereo de memria. Da que a
mensagem apresentada ao utilizador seja Joe. O ficheiro cap1_6.mdb apresenta alguns
exemplos de programao de objectos. S mais uma observao: a utilizao do set fazse sempre que seja necessrio utilizar objectos! (como no exemplo anterior)
Coleces
O VBA rico em coleces. Podemos considerar que as coleces consistem num
conjunto de objectos relacionados. Por exemplo, uma base de dados contm um
conjunto (coleco) de tabelas, que por sua vez contm um conjunto de ndices. Por
outro lado, existe tambm um conjunto de consultas, um conjunto de formulrios, etc.
Se atentarmos nos formulrios, podemos tambm afirmar que eles so constitudos por
um conjunto de controlos (editboxes, buttons, checkboxes, etc).
O ficheiro cap1_7.mdb mostra como se pode aceder a algumas das coleces existentes
no Access. Suponhamos que apenas queremos imprimir o valor das edit boxes. Como j
vimos, temos de utilizar a propriedade Value. Contudo, o seguinte cdigo no
suficiente:
Dim c as control
For each c in me!controls
Msgbox c.value
Next
Bem, o problema reside no facto de nem todos os controlos terem uma propriedade
chamada value (recorde-se que as labels que acompanham as edit boxes so tambm
controlos). A soluo mais correcta ser ento a seguinte:
For Each ctlCurrentIn Me.Controls
' Process the control ctlCurrent
If ctlCurrent.ControlType = acTextBox Then
ctlCurrent.Left = Me!txtLocation
End If
Next
A propriedade controltype permite aferir qual o tipo de controlo actual. Para uma
descriminao mais pormenorizada sobre os objectos e respectivas propriedades
aconselhvel a consulta do manual de VBA que acompanha o Access. J agora refira-se
que o termo reservado Me refere-se ao objecto actual: neste caso ao formulrio.
Captulo 2
utilizamos o new;
utilizamos uma referncia para uma coleco que j exista (utilizando o termo
reservado set, tal como foi feito no captulo anterior).
Exemplo:
criar nova coleco
If col1 Is Nothing Then Set col1 = New Collection
utilizar referncia para uma coleco j existente - por exemplo col2
set col1 = col2
O ficheiro cap2_1.mdb apresenta um conjunto de exemplos que ilustram o
manuseamento de arrays e de coleces (com particular nfase nas coleces).
O objecto Application
O objecto Application suporta vrios mtodos, propriedades e coleces que permitem
efectuar. Por exemplo, se quisermos sair da aplicao podemos utilizar o mtodo quit.
Este mtodo aceita um parmetro opcional que permite especificar como proceder em
relao a eventuais operaes que no tenham sido gravadas. As hipteses so as
seguintes:
acPrompt;
acSave;
acExit.
Exemplo da utilizao do mtodo: Application.Quit acPrompt
O Access 2000 apresenta dois novos objectos que permitem um fcil acesso s
coleces intrnsecas do Access: Tabelas, Consultas, Relatrios, etc. O objecto
CurrentData permite aceder s seguinte coleces:
AllTables;
AllQueries;
AllViews;
Etc.
Por sua vez, o objecto CurrentProject apresenta as seguintes coleces:
AllForms;
AllReports;
AllMacros;
AllModules;
Estes objectos apresentam ainda mais alguma coleces que no iremos referir. Para
mais informaes deve ser consultado o manual do Access. Estas coleces contm
objectos do tipo AccessObject, que apresenta as seguintes caractersticas:
Name: nome do objecto como aparece na janela da base de dados;
FullName: caminho completo para a pagina de acesso de dados;
IsLoaded: indica se objecto est ou no aberto;
Type: indica o tipo do objecto (retorna uma constante do tipo acObjectType);
Properties: coleco de propriedades definidas para objecto em questo (apenas
aplicvel a objectos obtidos a partir das coleces do CurrentProject).
Forms!frmExample.Caption = "MyForm"
Exit_cmdMyButton_Click:
Exit Sub
Err_cmdMyButton_Click:
If Err = 2450 Then
' Form not open
DoCmd.OpenForm "frmExample"
Resume
Else
MsgBox "Error: " & Err.Description
Resume Exit_cmdMyButton_Click
End If
End Sub
A rotina anterior introduz o chamado error handling, ou seja o
lugar, proceder abertura do formulrio atravs da instruo
DoCmd.OpenForm frmExample". A instruo resume serve para tratamento
do erro. A primeira instruo informa o procedimento que em caso de
erro deve prosseguir para a linha com a label Err_cmdMyButton_Click.
Essa linha verifica em primeiro lugar o cdigo do erro (utilizando
para tal o objecto Err do VBA). Neste caso, se o erro for o 2450,
ento temos de, em primeiro indicar ao Access que aps o processamento
da rotina de erro deve ser retomado o cdigo responsvel pelo erro (ou
seja, deve ser retomada a execuo do programa na linha que originou o
erro). Por sua vez a mensagem Resume Exit_cmdMyButton_Click serve para
indica
que
o
Access
deve
retomar
o
cdigo
na
linha
Exit_cmdMyButton_Click.
Captulo 3
Utilizando os objectos de dados do Access (ActiveX Data Objects)
O principal objectivo deste captulo introduzir o ADO (ActiveX Data Objects). Estes
objectos vieram substituir o DAO (Data Access Objects) como meio preferencial de
aceder base de dados por forma a inserir, eliminar e modificar informao.
Actualmente o Access suporta ambas as tecnologias. Contudo, a partir da verso 2000 a
Microsoft encoraja a utilizao do ADO como meio de acesso aos dados armazenados
na base de dados 10 .
O ADO o mtodo standard para aceder a base de dados. Comeou por ser utilizado
pelos programadores de VB para acederem base de dados, uma vez que no
conseguiam utilizar o OLE DB para esse efeito.
Modelos de objectos do ADO
A tecnologia ADO suporta vrios modelos 11 de objectos, que se subdividem em:
ActiveX Data Objects (ADODB) que permite a criao de recordsets e o
processamento de erros;
ADO Extensions (ADOX), que permite modificar a estrutura da base de dados (
a nvel da criao/modificao de tabelas
Jet and Replication Objects (JRO), que permite trabalhar com o motor da base
de dados (JET) e com a replicao da base de dados.
Este modelos de objectos encontram-se, apesar de separados, relacionados. Iremos
apenas estudar o modelo ADODB, utilizado na manipulao da informao que se
encontra armazenada na base de dados.
10
O DAO possui o seu prprio modelo para aceder informao. Aconselha-se os interessados em
aprenderem a utilizar o DAO para recorrerem ao manual do VBA.
11
De facto, ao contrrio do DAO, que apenas apresenta um modelo, o ADO apresenta vrios modelos de
objectos independentes.
O modelo ADODB
A figura seguinte tenta mostrar os principais objectos que compem o modelo de
objectos ADODB:
nos a essa base de dados para manipularmos a informao). Neste caso a seguinte
instruo suficiente para assegurar a correcta configurao da ligao (ou seja, para
assegurar a correcta obteno do objecto connection):
utilizar o namespace ADODB para nos referirmos
o conceito de namespace um conceito mais avanado
que serva para identificar um conjunto de nomes (evitar conflitos)
Dim conLocal as ADODB.Connection
utilizar o objecto CurrentProject e a sua propriedade Connection para estabelecer a
ligao
set conLocal = CurrentProject.Connection
A ligao a outra base de dados um pouco mais complexa e apresentada apenas para
satisfazer a curiosidade (uma vez que no ir ser utilizada ao longo do manual):
Sub DisplayAnotherConnection()
Dim cnnNet As New ADODB.Connection
cnnNet.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Books\PwrPrg2000\AppCD\Examples\VideoDat.mdb"
cnnNet.Close
End Sub
Repare-se que neste segundo caso foi necessrio criar um objecto do tipo pretendido
utilizando para tal a instruo NEW (recorde-se que os objectos tm que ser sempre
inicializados atravs do NEW ou do SET). Outro aspecto importante reside no facto de,
no segundo excerto de cdigo, ser necessrio abrir a ligao base de dados.
Aps estabelecida a ligao, costume procedermos a uma de duas operaes:
obter dados que se encontram nas tabelas;
inserir/modificar/eliminar dados que se encontrem nas tabelas.
O objecto Recordset
Para obtermos dados provenientes das tabelas temos de utilizar o objecto Recordset.
Este objecto responsvel por guardar a informao proveniente da execuo de uma
instruo SQL12 . Aqui apenas analisamos o objecto recordset como forma de obter
informao; contudo, ele tambm pode ser utilizado para modificar/acrescentar
informao.
O cdigo seguinte ilustra como poderamos obter todas os registos de uma tabela
chamada tblMoviesTitles:
12
O SQL a linguagem utilizada para acedermos a base de dados. A instruo SELECT responsvel
por seleccionar um conjunto de registos de uma ou mais tabelas que verifiquem uma determinada
condio.
Como estamos a ver, o cdigo bastante simples! S temos que seguir a seguinte
sintaxe:
Recordset.Open string_sql, connection_object, cursor_type, locking_method
A string de sql uma string que contm as instrues que se pretendem executar sobre a
base de dados. O objecto Connection necessrio para assegurar uma ligao base de
dados (s aps estabelecida a ligao que podemos executar as instrues
pretendidas). O CursorType define a maneira como o nosso recordset deve-se portar:
adOpenKeyset: possvel actualizar os dados do recordset, no sendo contudo
visiveis as alteraes que outros utilizadores podem estar a efectuar;
adOpenStatic: recordset s de leitura (deve ser utilizado em situaes de
consulta); pode-se navegar em ambos os registos;
adOpenForwardOnly: igual ao anterior, com a particularidade de a navegao
ser s num sentido.
O LockingMethod est relacionada com as medidas de segurana que devem tomadas
aquando da execuo de determinadas operaes sobre o recordset. As opes possveis
so as seguintes:
adLockOptimistic: tranca os recordsets apenas quando so modificados e
gravados;
adLockPessimistic: tranca o receordset aquando da edio (alterao) dos
valores;
apLockReadOnly: trancar o recordset.
Existem alguns conselhos teis que devem ser seguidos:
para a construo das strings SQL devemos utilizar as vistas de consultas. As
consultas no so mais do que instrues SQL. Da que a maneira mais fcil de
construirmos as consultas passa pela utilizao deste editor; em seguida,
mudamos para a vista de sql e simplesmente copiamos a instruo de SQL;
a melhor opo para o Locking method a adLockOptimistic (uma vez que
apenas vamos utilizar os recordsets para obter informao).
Como vimos, os recordsets obtm dados de uma (ou mais) tabela(s). Assim, muito
provvel que algumas instrues retornem recordsets vazios, ou seja, sem nenhum
registo. Antes de explicarmos como podemos proceder a essa validao temos de
introduzir dois novos conceitos: EOF e BOF.
A propriedade EOF (s de leitura) retorna true (verdadeiro) se estivermos antes do
primeiro registo do recordset; por sua vez, a propriedade BOF retorna true se estivermos
depois do ltimo registo da base de dados. Logo, podemos utilizar a seguinte expresso
para verificarmos se temos um recordset vazio:
If rec.EOF and rec.BOF then
temos um recordset vazio
end if
Por outro lado, se o recordset no estiver vazio, bvio que podemos querer percorrer
os vrios valores do recordset. Para percorremos os valores do recordset podemos
utilizar a seguinte estratgia:
Set cnnLocal = CurrentProject.Connection
string sql pede todos os valores da a utilizao do *
em que o campo ReleaseDate seja igual a 02/01/99 o Access
obriga a utilizao do # para especificar a data
Como podemos ver, possvel aceder coleco dos campos retornados por um
recordset atravs da coleco Fields, que contm objectos do tipo Field. Como a
propriedade Fields a propriedade por defeito do objecto recordset, ento para
acedermos ao campo Nome de um recordset (suponhamos que j obtivemos o recordset,
e que um dos campos se chama Nome) podemos utilizar qualquer uma das seguinte
linhas:
supor que temos um recordset rec
e que o recordset j foi inicializado
rec.Fields.Item(Nome)
ou
rec.Item(Nome)
ainda podemos simplificar mais se tivermos em ateno que a propriedade Item
a propriedade por defeito do objecto Fields
por isso podemos ter ainda o seguinte:
rec(Nome)
O ficheiro cap2_3 apresenta uma base de dados com trs formulrios. Um formulrio
permite introduzir os dados; outro permite ver os dados existentes; e o terceiro permite
eliminar os dados. Foi utilizada programao VBA nos trs casos para mostrar como
possvel construir uma base de dados recorrendo somente a VBA. Repare-se ainda na
utilizao das regras de validao e respectivo texto de validao como meio auxiliar de
proceder verificao de certas restries (se quisssemos podamos ter utilizado
cdigo para efectuar esta validao).
Captulo 4
Tratamento de erros
Como do conhecimento geral, no h nenhum programa que possa considerar-se
imune a erros. Seno vejamos o exemplo do Windows 13 : quem que nunca se deparou
com um dos famosos ecrs azuis (BSOD- blue screen of death)?
Quando ocorre um erro, o Access mostra-nos uma mensagem de erro. Esta mensagem
geralmente permite- nos efectuar a depurao. Isto bom quando estamos em
13
14
Para alm desta, existe ainda a on error goto 0, que obriga o access a mostrar o dilogo
que vimos no inicio do captulo. Portanto j vimos como detectar e tratar o erro. Falta
apenas vermos como identificar o erro!
O objecto Err
Quando acontece um erro, o Access procede ao armazenamento desse erro numa
varivel designada de Err. Pode-se mesmo afirmar que o Err contm o erro mais recente
detectado pelo Access. O objecto Err apresenta vrias propriedades, das quais se
destacam as seguintes:
Description: descrio do erro ocorrido;
Number: nmero do erro ocorrido;
Este objecto tambm apresenta alguns mtodos:
Clear: permite limpar o ltimo erro
Raise: permite criar um erro (pode ser til no caso de querermos construir os
nosso prprios erros).
Para mais informaes sobre estes tpicos deve ser consultada a ajuda on- line do
Access.
Captulo 5
A aplicao Sub-MovieCentral
A aplicao Sub-MovieCentral um projecto do autor deste livro que foi adaptado para
Microsoft Access. O objectivo desta aplicao permitir armazenar os dados relativos
aos filmes que eventualmente um utilizador possa possuir (ficheiro code.mdb). No caso
desta aplicao, foram apresentados os seguintes requisitos:
manter uma lista actualizada de filmes;
deve ser possvel proceder a operaes de manuteno da base de dados:
adicionar, modificar e eliminar registos;
deve ser possvel ma nter vrios dados relacionados com os filmes, dos quais se
destacam os seguintes:
o nome actores;
o nome realizadores;
o nome do filme;
o link para a pgina oficial do filme.
Assim, e aps efectuado o necessrio processo de obteno de requisitos, chegou-se ao
seguinte modelo relacional:
Esta aplicao apresenta vrios exemplos relacionados com aspectos que podem ser
utilizados no access:
barras de menus;
barras de ferramentas;
macros;
painis;
splash screens;
cdigo VBA;
etc.
O cdigo referente a este programa encontra-se no ficheiro code.mdb. A figura seguinte
ilustra o aspecto da aplicao:
Voltando ao formulrio principal, temos de referir que o evento de click num formulrio
foi tratado em todos os formulrios que se encontram nas tabs do formulrio principal.
Cada um destes formulrios contm uma varivel que, em cada instante, possui a
posio seleccionada dentro do formulrio (uma vez que todos os formulrios
apresentam um conjunto de registos recordset e um recordselector que guarda a
posio actual nessa lista de registos ento basta saber qual a posio do
recordselector, e depois obter o ID do elemento que se encontra nessa posio; o nico
pormenor digno de destaque o recordset associado ao formulrio (pode ser obtido
atravs da propriedade recordset): um recordset do tipo DAO e no do tipo ADO por
isso que foi necessrio acrescentar uma referncia ao DAO).
Chama-se tambm a ateno para o facto de todos os formulrios terem sido alterados
(modificaram-se vrias propriedades de forma a obter o resultado pretendido).
Construram-se vrias barras de ferramentas, uma para cada sub- formulrio (contido em
cada uma das pginas do tab control). Cada uma destas barras foi associada a um
formulrio e recorreu-se a VBA para processar o evento onchange do tab control, pois
em cada instante s deveria estar presente a barra de ferramentas associada ao
formulrio que est seleccionado (e tal s possvel utilizando cdigo VBA ou ento
macros; neste caso optou-se por utilizar cdigo VBA. Quer as barras de ferramentas,
quer a barra de menus recorrem a macros para executar as aces. Algumas macros
servem apenas para juntar as opes do menu ao cdigo VBA correspondente (ex.: tab1,
tab2, etc, etc ). As restantes executam as aces contidas nas macros
(total_movies_preview, etc). Para terminar os aspectos relacionados com as macros,
refira-se ainda que quando queremos executar cdigo VBA (que est contido num
mdulo) atravs de uma macro temos de colocar esse cdigo numa funo ( e nunca
num procedimento).
Esta aplicao pretende apenas demonstrar como que se pode construir (de uma forma
simples) uma base de dados utilizando o Access. Claro que ficaram vrios aspectos por
implementar, como por exemplo a construo de um relatrio associado ao formulrio
Add_Movies que trata da adio/alterao dos dados de um filme. Apesar destas faltas,
pensa-se que a aplicao ilustra de forma significativa algumas das capacidades do
access.