Utilizando Classe no Access - Conclusão
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito, através do Paypal.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
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).
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:
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!
Artigos Relacionados
Utilizando Classe no Access - Introdução
Utilizando Classe no Access - Parte 1 - Orientação a Objetos
Utilizando Classe no Access - Parte 2 - Programação OO no Access/Vba
Utilizando Classe no Access - Parte 4 - As Classes Auxiliares
Utilizando Classe no Access - Parte 5 - A Classe Cliente
Utilizando Classe no Access - Parte 6 - A Classe Produto
Utilizando Classe no Access - Parte 7 - As Classes Venda e Detalhe de Venda
Utilizando Classe no Access - Parte 8 - Finalização do Sistema
Utilizando Classe no Access - Parte 9 - Genesis: A Ferramenta Case
Utilizando Classe no Access - Parte 10 - Conclusão
Como estudar com o Pesquisador de Objetos
9 comentários mlops - RJ 08/06/2021 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/2021 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 Plinio Mabesi 01/10/2020 19:33:26 Olá Márcio Obrigado. Dei uma olhada em seu projeto, coisa muito profissional, parabéns! MARCIO MELO - RJ 01/10/2020 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... Gilson 05/08/2020 14:05:13 Eu iria me esquecendo, aquele abraço amigão Avelino, pelo apoio a todos nós! Gilson 05/08/2020 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 Plinio Mabesi 20/05/2020 21:50:25 Obrigado a todos, um pouco atrasado, mas antes tarde do que nunca... Marcelo 11/02/2020 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! JPaulo 07/02/2020 20:07:08 Parabens pelo excelente trabalho. Abraço |