... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$182,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Utilizando Classe no Access - Conclusão

Por: Plinio Mabesi
 

Após a longa jornada, na qual aprendemos a criar nossos próprios objetos, aplicando-os em nossos projetos baseados em Visual Basic for Applications, chega o momento da despedida. Com isso chega também a hora em que o desenvolvedor iniciará sua caminhada solitária rumo ao aperfeiçoamento de suas habilidades.

Como prosseguir? O que devo fazer agora? Como aprofundar e aprimorar o que foi aprendido? Onde buscar novos conhecimentos? Como me atualizar constantemente?

Este último artigo da série tentará responder algumas destas perguntas, com o intuito de abrir a sua mente e fornecer caminhos para que você possa seguir em frente.

Utilizando os Objetos do Sistema

Praticamente todos os itens em um software desenvolvido em Access são objetos. Sendo assim estes objetos podem ser acessados e trabalhados. Conhecendo seus métodos, propriedades e eventos fica bem mais fácil para o desenvolvedor aproveitar funcionalidades já existentes para construir seus aplicativos.

Entre os itens mais utilizados em um sistema Access/VBA estão o formulário e o relatório, com seus controles, o recordset e o objeto DoCmd. Além destes existem dezenas, ou centenas, de outros objetos que podem ser utilizados, mas estes são os exemplos mais comuns e mais simples disponíveis.

Você pode realizar qualquer tarefa com um formulário ou relatório, bem como dos controles existentes no mesmo, através de linhas de código. Para isto basta acessar o objeto. Estando em um módulo de um formulário ou relatório você pode acessar seus métodos e propriedades utilizando a palavra chave Me. Como exemplo, depois de alterarmos algum dado na fonte de origem de um formulário e desejarmos que as alterações sejam exibidas imediatamente para o usuário, basta realizarmos uma chamada ao método Requery do mesmo para que as informações sejam atualizadas. Neste caso fazemos a chamada diretamente, sem a necessidade de instanciar o objeto, assim:

  'Atualizando o conjunto
  'de registros do formulário
  Me.Requery

Caso seja necessário acessar um objeto formulário a partir de outro módulo devemos primeiro instanciá-lo, pois seus métodos e propriedades não estarão acessíveis antes disso.

  'Definindo a variável de objeto
  'para o formulário.
  Dim frmCliente As Form
  'Definindo a constante de twips
  'para cálculo de centímetros
  Const intTwips = 567
  
  'Atribuindo o formulário FCliente
  'à variável de objeto formulário
  Set frmCliente = Form_FCliente

  'Exibindo a legenda do formulário
  'através da propriedade Caption
  MsgBox frmCliente.Caption
  
  'Alterando a propriedade Permitir
  'Edição do formulário
  frmCliente.AllowEdits = False
  
  'Movendo o formulário para a posição de
  'esquerda a 10cm e superior a 5cm
  frmCliente.Move 10 * intTwips, 5 * intTwips

Para trabalhar com acesso aos dados armazenados nas tabelas podemos utilizar um objeto do tipo recordset. Veja o exemplo que permitiria buscar os registros da tabela Cliente e exibir o nome de cada cliente.

  'Definindo a variável para
  'consulta SQL
  Dim strSql As String
  'Definindo uma nova variável de objeto
  'recordset para conjunto de registros
  Dim rstCliente As New ADODB.Recordset
  
  'Montando a consulta SQL
  strSql = "Select * From Cliente"

  'Abrindo o recordset
  rstCliente.Open strSql, CurrentProject.Connection, adOpenStatic, adLockReadOnly

  'Exibindo o total de clientes
  MsgBox "Total de clientes: " & rstCliente.RecordCount
  
  'Exibindo o nome de cada um dos
  'clientes existentes no recordset
  While Not rst.EOF
    MsgBox "Nome do Cliente " & rstCliente.AbsolutePosition & ": " & _
    rstCliente("nomeCliente")
    rstCliente.MoveNext
  Wend
  
  'Fechando o recordset
  rstCliente.Close

Agora vamos supor que você tem um botão em cada um de seus formulários cuja função é habilitar a edição dos dados, pois criou todos os formulários bloqueados para edição. Enquanto a edição estiver liberada o formulário deverá mudar de cor para alertar o usuário que ele está em modo de edição. O código do seu botão seria parecido com este:

Sub btnLiberaEdicao_Click()

  'Definindo a cor da seção detalhe para amarelo
  Me.Section(acDetail).BackColor = vbYellow
  'Definindo a propriedade permitir edição = true
  Me.AllowEdits = True
  'Atribuindo uma legenda informando que o formulário
  'está liberado para edição
  Me.Caption = "Atenção: Edição Liberada"

End Sub

Este código funcionaria corretamente liberando o formulário. O problema é que você teria que colocá-lo em todos os botões de liberação de todos os formulários bloqueados. Como nós já aprendemos o conceito de reutilização queremos aplicá-lo aqui para evitar que qualquer alteração no código tenha que ser feita em mais de um lugar.

Então devemos criar um procedimento genérico que faça o trabalho independente do formulário a ser liberado, em um módulo qualquer, onde todo o projeto tenha acesso:

Sub editaFormulario(argForm As Form)

  'Definindo a cor da seção detalhe para amarelo
  argForm.Section(acDetail).BackColor = vbYellow
  'Definindo a propriedade permitir edição = true
  argForm.AllowEdits = True
  'Atribuindo uma legenda informando que o formulário
  'está liberado para edição
  argForm.Caption = "Atenção: Edição Liberada"

End Sub

Depois basta chamar o procedimento em qualquer formulário que necessite ser liberado para edição, passando o formulário como parâmetro para o código:

Sub btnLiberaEdicao_Click()
  
  'Chamando o procedimento que libera
  'formulários e passando como argumento
  'o próprio formulário
  Call editaFormulario(Me)
  
End Sub

Claro que após a edição e o salvamento dos dados o formulário teria que ser bloqueado novamente, mas essa parte deixo como exercício prático para você.

O importante é perceber que caso você queira mudar a cor que será usada para representar a edição do formulário terá que alterar apenas no procedimento editaFormulario(), já que todos os botões utilizam o mesmo procedimento.

Outro objeto bastante utilizado em qualquer projeto com VBA é o DoCmd. Este é o objeto responsável por executar as ações do Access a partir de comandos no Visual Basic for Applications. Ele não precisa ser instanciado, pois é um objeto ativo, já iniciado com a aplicação. Para utilizá-lo basta chamar um de seus métodos, passando ou não um parâmetro, dependendo da ação desejada:

  'Abrindo o formulário FCliente
  DoCmd.OpenForm "FCliente"

  'Maximizando uma tela
  DoCmd.Maximize

  'Fechando uma tela
  DoCmd.Close

Para aprender a trabalhar com os objetos fornecidos pelo VBA você pode recorrer à documentação acessando-a a partir do próprio editor. Pesquise sobre cada objeto que desejar verificando seus métodos, propriedades e eventos.

Outra maneira ainda mais prática de pesquisar por estas informações é utilizando um recurso próprio para esta finalidade: o Pesquisador de Objetos. O pesquisador é uma ferramenta que facilita bastante a pesquisa por métodos, atributos e eventos de objetos do sistema. Um ponto importante é que ele não se limita a objetos do Access, mas qualquer código que estiver registrado em sua biblioteca, incluindo os objetos de todos os aplicativos do Office.

Como exemplo suponha que queremos saber quais são todos os membros do objeto caixa de combinação (combobox). Ao abrir o pesquisador, basta digitar combobox na caixa de pesquisa (1), escolher a classe do objeto combobox (2) que todas as suas propriedades aparecem na lista de membros (3).

Pesquisador de Objetos

 

Quer saber mais sobre o pesquisador de objetos? Veja o tutorial do amigo Avelino Sampaio:

http://www.usandoaccess.com.br/tutoriais/tuto2.asp?id=1#inicio

Interagindo com Aplicativos do Office

Além de trabalhar com os objetos internos do Access, o VBA nos permite criar novos objetos ou mesmo acessar objetos existentes de qualquer aplicativo do Office.

Imagine que você queira montar uma planilha no Excel com os dados das vendas do mês, existentes no cadastro do seu banco de dados. Ou talvez gerar cartas de proposta em Word para seus clientes registrados nas tabelas do Access. Mas você quer que o usuário consiga fazer isto automaticamente, simplesmente clicando em um botão. Então você deve utilizar os objetos da classe do aplicativo desejado.

O elemento responsável por criar um objeto é a função CreateObject. Para acessar um objeto existente utilize a função GetObject. Veja os exemplos:

  'Inicia o Microsoft Excel e cria um novo objeto PlanilhadeTrabalho.
  Set ExcelWorksheet = CreateObject("Excel.Sheet")

  'Inicia o Microsoft Excel e abre um objeto PlanilhadeTrabalho existente.
  Set ExcelWorksheet = GetObject("C:\Planilhas\MinhaPlanilha.xls")

  'Inicia o Microsoft Word.
  Set WordBasic = CreateObject("Word.Basic")

Criando um Objeto Planilha do Excel

Para exemplificar a interação com um objeto do Excel vamos criar uma planilha, incluir um texto na célula A1, salvar a planilha em uma pasta do computador e fechar o Excel após a tarefa.

  'Declara uma variável de objeto
  Dim minhaPlanilha As Object

  'Como a variável ainda não foi vinculada faremos
  'a vinculação tardia.
  Set minhaPlanilha = CreateObject("Excel.Sheet")

  'Torna o Excel visível através do objeto Application.
  'Observe que o objeto minhaPlanilha possui um
  'atributo que também é objeto, o Application, que possui
  'outras propriedades internas
  minhaPlanilha.Application.Visible = True

  'Coloca um texto na célula A1 da planilha
  minhaPlanilha.Application.Cells(1, 1).Value = "Esta é a coluna A, linha 1"

  'Salva a planilha no diretório C:\MinhaPlanilha.xls
  'Obs: Salve como .xlsx no Office 2007 ou superior
  minhaPlanilha.SaveAs "C:\MinhaPlanilha.xls"

  'Fecha o Excel com o método Quit no objeto Application
  minhaPlanilha.Application.Quit

  'Libera a variável de objeto
  Set minhaPlanilha = Nothing

Após criar um objeto você poderá acessá-lo novamente utilizando agora a função GetObject():

  'Declara uma variável de objeto
  Dim minhaPlanilha As Object

  'Busca a planilha criada anteriormente
  'Obs: Lembre-se que no Office 2007 ou superior o padrão é .xlsx
  Set minhaPlanilha = GetObject("C:\MinhaPlanilha.xls")

  'Torna o Excel visível através do objeto Application.
  minhaPlanilha.Application.Visible = True

  'Tornando a pasta de trabalho visível
  minhaPlanilha.Parent.Windows(1).Visible = True
 
  'Coloca um texto na célula A2 da planilha
  minhaPlanilha.Application.Cells(2, 1).Value = "Esta é a coluna A, linha 2"

  'Salva a planilha.
  minhaPlanilha.Save

  'Fecha o Excel com o método Quit no objeto Application
  minhaPlanilha.Application.Quit

  'Libera a variável de objeto
  Set minhaPlanilha = Nothing

Veja o resultado:

Excel x Access

As regras anteriores são válidas para qualquer objeto aplicativo diferente daquele em que se está trabalhando. Com isto você poderá usar sua imaginação para realizar, com sucesso, a interação entre aplicativos, buscando, exportando e visualizando informações da maneira que lhe for mais conveniente.

Para saber como programar para cada um dos aplicativos pesquise na documentação que acompanha o sistema. Ali você encontrará todas as informações necessárias para compreender e aplicar os conceitos em seus projetos.

Alterações no Modelo de Objetos do Access

A cada nova versão de produtos Office várias alterações são implantadas. Novos itens são incluídos, outros são alterados e ainda vários são removidos.

Com relação à criação de classes, métodos e propriedades personalizadas não houve alterações perceptíveis aos usuários em nenhuma das versões, ao logo de todos esses anos. Houve sim várias modificações no modelo de objetos do sistema.

As tabelas a seguir foram retiradas da documentação do Access 2007, e dizem respeito às modificações ocorridas comparando-se a versão do Access 2000 com o próprio Access 2007. Escolhi estas tabelas porque foram as mais resumidas que encontrei. Caso fosse apresentar todas as evoluções do sistema desde a primeira versão teríamos que iniciar outra série de artigos. Como o nosso foco é a criação e utilização de objetos, deixei de lado o restante e trouxe apenas uma amostra de como pesquisar sobre modificações das versões.

Para encontrá-las você deve abrir a ajuda de qualquer uma das versões, exibir o sumário e procurar pelo item O que há de novo. O tópico sempre informa as alterações ocorridas desde a última versão. No caso do Access 2007 a própria Microsoft incluiu um item com o histórico de modificações desde a versão 2000. Assim, para poupar trabalho, utilizei o que já estava pronto. Isto se chama reutilização, lembra-se? ;)

Resolvi apresentar apenas as modificações nos objetos mais utilizados pela maioria dos desenvolvedores, ou seja, apenas serão exibidas as alterações nos objetos mais conhecidos. Você poderá ver a lista completa de modificações acessando a documentação da ajuda do editor do VBA do Access 2007.

AccessObject

Propriedades Status
FullName Alterado

Sintaxe anterior

READ-ONLY FullName [STRING]

Nova sintaxe

READ-WRITE FullName [STRING]
Type Alterado

Sintaxe anterior

READ-ONLY Type [INT32]

Nova sintaxe

READ-ONLY Type [ACOBJECTTYPE]

 

AcCommand

Propriedades Status
acCmdDataAccessPageBrowse Oculto
acCmdDataAccessPageDesignView Oculto
acCmdDemote Oculto
acCmdImport Oculto
acCmdMicrosoftScriptEditor Oculto
acCmdNewObjectDataAccessPage Oculto
acCmdPromote Oculto
acCmdPublish Removido
acCmdSaveAsASP Oculto
acCmdSaveAsDataAccessPage Oculto
acCmdSaveAsIDC Oculto
acCmdSelectDataAccessPage Oculto
acCmdShowOnlyWebToolbar Oculto
acCmdStopLoadingPage Oculto
acCmdViewDataAccessPages Oculto

 

Application

Propriedades Status
CurrentObjectType Alterado

Sintaxe anterior

READ-ONLY CurrentObjectType [INT32]

Nova sintaxe

READ-ONLY CurrentObjectType [ACOBJECTTYPE]
DataAccessPages Oculto
DefaultWebOptions Oculto
FileSearch Oculto
Métodos Status
CreateControl Alterado

Sintaxe anteriorr

CONTROL CreateControl (STRING FormName, ACCONTROLTYPE ControlType, OPTIONAL ACSECTION Section = 0, OPTIONAL VARIANT Parent, OPTIONAL VARIANT ColumnName, OPTIONAL VARIANT Left, OPTIONAL VARIANT Top, OPTIONAL VARIANT Width, OPTIONAL VARIANT Height)

Nova sintaxe

_CONTROL CreateControl (STRING FormName, ACCONTROLTYPE ControlType, OPTIONAL ACSECTION Section = 0, OPTIONAL VARIANT Parent, OPTIONAL VARIANT ColumnName, OPTIONAL VARIANT Left, OPTIONAL VARIANT Top, OPTIONAL VARIANT Width, OPTIONAL VARIANT Height)
CreateDataAccessPage Oculto
CreateReportControl Alterado

Sintaxe anterior

CONTROL CreateReportControl (STRING ReportName, ACCONTROLTYPE ControlType, OPTIONAL ACSECTION Section = 0, OPTIONAL VARIANT Parent, OPTIONAL VARIANT ColumnName, OPTIONAL VARIANT Left, OPTIONAL VARIANT Top, OPTIONAL VARIANT Width, OPTIONAL VARIANT Height)

Nova sintaxe

_CONTROL CreateReportControl (STRING ReportName, ACCONTROLTYPE ControlType, OPTIONAL ACSECTION Section = 0, OPTIONAL VARIANT Parent, OPTIONAL VARIANT ColumnName, OPTIONAL VARIANT Left, OPTIONAL VARIANT Top, OPTIONAL VARIANT Width, OPTIONAL VARIANT Height)
NewCurrentDatabase Alterado

Sintaxe anterior

VOID NewCurrentDatabase (STRING filepath)

Nova sintaxe

VOID NewCurrentDatabase (STRING filepath, OPTIONAL ACNEWDATABASEFORMAT FileFormat = 0, OPTIONAL VARIANT Template, OPTIONAL STRING SiteAddress = "", OPTIONAL STRING ListID = "")
OpenCurrentDatabase Alterado

Sintaxe anterior

VOID OpenCurrentDatabase (STRING filepath, OPTIONAL BOOL Exclusive = 0)

Nova sintaxe

VOID OpenCurrentDatabase (STRING filepath, OPTIONAL BOOL Exclusive = 0, OPTIONAL STRING bstrPassword = "")

 

ComboBox

Propriedades Status
AllowedText Oculto

 

DoCmd

Propriedades Status
ApplyFilter Alterado

Sintaxe anterior

VOID ApplyFilter (OPTIONAL VARIANT FilterName, OPTIONAL VARIANT WhereCondition)

Nova sintaxe

VOID ApplyFilter (OPTIONAL VARIANT FilterName, OPTIONAL VARIANT WhereCondition, OPTIONAL VARIANT ControlName)
OpenReport Alterado

Sintaxe anterior

VOID OpenReport (VARIANT ReportName, OPTIONAL ACVIEW View = 0, OPTIONAL VARIANT FilterName, OPTIONAL VARIANT WhereCondition)

Nova sintaxe

VOID OpenReport (VARIANT ReportName, OPTIONAL ACVIEW View = 0, OPTIONAL VARIANT FilterName, OPTIONAL VARIANT WhereCondition, OPTIONAL ACWINDOWMODE WindowMode = 0, OPTIONAL VARIANT OpenArgs)
OutputTo Alterado

Sintaxe anterior

VOID OutputTo (ACOUTPUTOBJECTTYPE ObjectType, OPTIONAL VARIANT ObjectName, OPTIONAL VARIANT OutputFormat, OPTIONAL VARIANT OutputFile, OPTIONAL VARIANT AutoStart, OPTIONAL VARIANT TemplateFile)

Nova sintaxe

VOID OutputTo (ACOUTPUTOBJECTTYPE ObjectType, OPTIONAL VARIANT ObjectName, OPTIONAL VARIANT OutputFormat, OPTIONAL VARIANT OutputFile, OPTIONAL VARIANT AutoStart, OPTIONAL VARIANT TemplateFile, OPTIONAL VARIANT Encoding, OPTIONAL ACEXPORTQUALITY OutputQuality = 0) ;
SelectObject Alterado

Sintaxe anterior

VOID SelectObject (ACOBJECTTYPE ObjectType, OPTIONAL VARIANT ObjectName, OPTIONAL VARIANT InDatabaseWindow)

Nova sintaxe

VOID SelectObject (ACOBJECTTYPE ObjectType, OPTIONAL VARIANT ObjectName, OPTIONAL VARIANT InNavigationPane)
TransferSpreadsheet Alterado

Sintaxe anterior

VOID TransferSpreadsheet (OPTIONAL ACDATATRANSFERTYPE TransferType = 0, OPTIONAL ACSPREADSHEETTYPE SpreadsheetType = 8, OPTIONAL VARIANT TableName, OPTIONAL VARIANT FileName, OPTIONAL VARIANT HasFieldNames, OPTIONAL VARIANT Range, OPTIONAL VARIANT UseOA)

Nova sintaxe

VOID TransferSpreadsheet (OPTIONAL ACDATATRANSFERTYPE TransferType = 0, OPTIONAL ACSPREADSHEETTYPE SpreadsheetType = 10, OPTIONAL VARIANT TableName, OPTIONAL VARIANT FileName, OPTIONAL VARIANT HasFieldNames, OPTIONAL VARIANT Range, OPTIONAL VARIANT UseOA)

 

Form

Propriedades Status
AllowDesignChanges Oculto
Section Alterado

Sintaxe anterior

READ-ONLY Section [SECTION] (VARIANT Index)

Nova sintaxe

READ-ONLY Section [_SECTION] (VARIANT Index)
WhatsThisButton Oculto

 

ListBox

Propriedades Status
TextAlign Oculto

 

Report

Propriedades Status
Section Alterado

Sintaxe anterior

READ-ONLY Section [SECTION] (VARIANT Index)

Nova sintaxe

READ-ONLY Section [_SECTION] (VARIANT Index)

 

TextBox

Propriedades Status
AllowedText Oculto
FELineBreak Oculto

 

Chegamos ao Fim

Enfim chegamos ao final da série. Foi uma longa jornada em que tive que pesquisar, estudar e planejar meu tempo, buscando janelas de horários em que pudesse me dedicar a escrever os artigos, enquanto outras tarefas aguardavam ansiosas para seram também continuadas.

A todos que esperaram com entusiasmo o lançamento de cada um dos artigos peço desculpas pela demora no intervalo entre cada publicação, pois como devem imaginar tudo foi feito nas horas vagas, inclusive finais de semana e feriados.

A todos que acompanharam a série um muitíssimo obrigado. Tenho certeza de que as lições foram capazes de proporcionar o conhecimento mínimo necessário para que desenvolvam projetos orientados a objeto com qualidade.

Espero nos encontrarmos em breve em mais um trabalho tão quanto ou mais gratificante que este.

Abraços e até a próxima!


 

 


9 comentários

JPaulo   07/02/2011 20:07:08

Parabens pelo excelente trabalho.

Abraço

Marcelo   11/02/2011 17:38:09

Fala Plinio blz? sou o le_lo28 do ExpertAccess!

Parabéns pelo excelente trabalho, este material será muito útil em meu dia a dia pode ter certeza!

Que Deus te abençõe!

Plinio Mabesi   20/05/2011 21:50:25

Obrigado a todos, um pouco atrasado, mas antes tarde do que nunca...

Gilson   05/08/2011 14:04:07

É Grande Plinio, parabéns! Pra nós uma honra ter esse material, e pra você um orgulho em ver o projeto finalizado, parabéns mesmo, agora tenho meu manual de access OO. Gde Abraço

Gilson   05/08/2011 14:05:13

Eu iria me esquecendo, aquele abraço amigão Avelino, pelo apoio a todos nós!

MARCIO MELO - RJ   01/10/2011 19:20:02

Parabéns mesmo por todo seu esforço e planejamento que demonstra o verdadeiro potencial do access, tenho orgulho de ser brasileiro com esse material tão bem abordado, o genises um aplicativo classe..., deixo um exemplo para os colegas de um programa que desenvolvi ao longo de quase 2 anos e foi bem no momento que conheci esse site e adquiri o monta ribbons e novos conhecimentos http://sic.iniciantejoomla.com/ no vídeo de demonstração dar para ter uma idéia de muitos artigos que aqui estão...

Sou mais Brasil!

Forte abraço, companheiro de farda...

Plinio Mabesi   01/10/2011 19:33:26

Olá Márcio

Obrigado. Dei uma olhada em seu projeto, coisa muito profissional, parabéns!

mlops - RJ   08/06/2012 21:25:36

Querido Plinio nunca e tarde para agradecer a vc pelo excelente trabalho publicado aqui. Espero poder chegar a um nivel como seu e de outros mestres como jPaulo, Avelino, Alexandre, Wsenna, Rogério. Após estudar este seu conteudo, vejo que nao tem muito destas abordagem de POO em VBA aplicado como fizeste. Parabens irmão pelo esforço, dedicação, empenho de compartilhar e ensinar.

Vitor Simão Ferreira   20/02/2014 12:02:21

Ola Avelino, vi seu sistema de saldo dia-a-dia, tentei usar o codigo, mas como voce mesmo explica no video, voce usa tabelas temporarias e tal, e como sou novato não consegui reaproveitar seu código, nao tem uma maneira mais facil de fazer? consegui fazer no relatorio e estou a dias tentando no formulario mas nao consigo, fiz examente igual ao relatorio mas nao consigo obter resultados, pode me ajudar?
vitor(anderline)access(arroba)hotmail(ponto)com

att

obrigado


Envie seu comentário: