AS EMPRESAS ESTÃO "DESESPERADAS" POR ESTE TIPO DE PROFISSIONAL... - VOCÊ É UM DELES?

MEGA FORMAÇÃO EM INFRAESTRUTURA DE TI - O Conhecimento que Vira Dinheiro - CLIQUE AQUI

Você está em: PrincipalArtigosLivroacc2003vba › Capítulo 5 : 07
Quer receber novidades e e-books gratuitos?
« Anterior Δ Página principal ¤ Índice Próxima »
Criando Relatórios de Impacto no MS Access
Autor: Robert Friedrick Martim
Lição 28 de 50 - Relatórios com VBA, Macros e Formulários Auxiliares

Chegou a hora de adicionarmos alguns extras em nossos relatórios utilizando VBA, macros e Formulários Auxiliares.

Tecnicamente, o que escrevemos em VBA é uma macro, porém o que escrevemos na macro não é “VBA”. O motivo para isso é que macros no Access já “vem de fábrica” e tudo que precisamos fazer é escolher o tipo de comando que desejamos utilizar e aplicá-los ao nosso problema.

Podemos também criar condições em macros para que as mesmas somente sejam executadas quando um critério é verdadeiro (ou falso). Veremos diversos exemplos de aplicabilidade de macros e VBA a seguir.

Utilizando macros para abrir e imprimir relatórios

Macros em Access representam uma classe distinta de objetos e não estão relacionados diretamente com o VBA. Macros apresentam instruções prontas as quais podem ser utilizadas para efetuar as mais diversas ações.

Neste exemplo, veremos como abrir e imprimir um relatório utilizando macros. Siga os passos abaixo para completar o exercício:

Clique no objeto Macros;
Clique em Novo;
Na coluna Ação procure pela ação AbrirRelatório;

Ao selecionar esta ação, na parte inferior da ação da macro aparecerá diversas opções:

Nome do relatório à Permite escolher o nome do relatório que deve ser aberto;
Exibir à Permite escolher o tipo de exibição. Neste caso, queremos a exibição Imprimir;
Nome do filtro à Permite determinar o nome de uma consulta ou filtro utilizado durante a abertura/impressão do relatório;
Condições onde à Permite determinar uma instrução SQL utilizando a cláusula WHERE (ONDE) que permite filtrar os dados no processo de abertura e impressão, por exemplo;
Modo janela à Permite definir o modo da janela. Escolha entre os vários tipos de modo disponível. Caso tenha alguma dúvida, pressione F1 durante a escolha.

A Figura 7‑1 mostra os passos acima visualmente:


Figura 7‑1 Definindo as propriedades da macro

Utilizando macros com condicionalidade

Como vimos no tópico anterior, é possível adicionar condicionalidade no processo de abertura e impressão em uma macro. Você pode definir um filtro, que funcionará como a condicionalidade, ou você pode utilizar uma instrução SQL.

Neste caso, iremos inserir uma condicionalidade na opção Condição Onde. A condição a ser inserida é:

CódigoDoCliente]=[Tópico7_2]![IDCliente].

Note que o campo IDCliente não existe. Portanto, quando o usuário tentar acessar tal relatório para impressão ele será solicitado a inserir o Código do Cliente para que o relatório possa ser impresso:


Figura 7‑2 Inserindo o parâmetro na condição WHERE

Agora, supondo que o relatório não possua dado algum para o ID digitado, o relatório ainda assim será impresso. Para evitar tal erro, você pode adicionar o seguinte código no relatório para cancelar a operação caso não exista dado algum para impressão:

Private Sub Report_NoData(Cancel As Integer)
    Cancel = 1
    MsgBox "Não há nenhuma informação para impressão!", _
        vbCritical, "Sem dados..."
End Sub

Zebrando o relatório com VBA

Quando possuímos um relatório muito extenso, fica relativamente difícil ler cada linha do relatório e associar os dados de uma mesma linha. Observe a figura abaixo:


Figura 7‑3 Relatório não zebrado

O relatório acima representa despesas em uma conta pessoal (este BD completo não está diponível com este curso, somente uma tabela e formulário para exemplo) em determinado período. Embora não exista nada de errado com ele, note que a leitura pode ser melhorada se adicionarmos um zebramento no relatório:


Figura 7‑4 Detalhes do relatório zebrados

Com o zebramento de cada linha na área de detalhes a leitura fica bem mais simples e organizada. Para zebrar a área de detalhes, utilize o código abaixo:

' Variável global para contagem da linha atual
Private linCont As Long

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

'   Conta o número da linha e adiciona 1 durante o
'   processo (evento) de formatação dos detalhes do relatório
    linCont = linCont + 1
 
'   Determina o resto da divisão do número da linha atual
'   Se for zero, a cor de fundo é branca.
    If linCont Mod 2 = 0 Then
      Me.Detail.BackColor = 16777215

'   Caso contrário, a cor é cinza.
    Else
      Me.Detail.BackColor = 15263976
    End If
End Sub

O que o leitor deve ter em mente diz respeito ao tamanho do conjunto de registros. Caso este seja muito grande o tempo de processamento pode ser considerável.

Filtros por intervalo de datas

Um cenário comum é onde precisamos de um relatório que nos traga informações relativas a algum intervalo de datas qualquer. Por exemplo, poderíamos querer um relatório para o ano fiscal e teríamos que filtrá-lo para somente mostrar as informações para o Intervalo determinado.

Para resolvermos tal problema, precisaremos de um formulário de suporte o qual irá filtrar as informações que desejamos.

Este formulário trabalhará em conjunto com o relatório. Desta forma, quebro abaixo em duas seções os passos que devemos seguir para completar o exercício.

Criando o formulário de suporte

A nossa primeira tarefa é criar o formulário de suporte. Para tanto, siga os passos abaixo (utilizando os dados do BD deste tópico):

  • Na janela do banco de dados clique em Formulários e em seguida em Design;
  • No modo de design adicione os seguintes controles:
  • Duas caixas de texto (nomeie-as como txtDataInicial e txtDataFinal respectivamente);
  • Um botão de comando (nomeie-o como cmdVisualizar e modifique o seu rótulo para Visualizar)
  • Modifique a máscara de entrada para as caixas de texto para aceitar datas abreviadas. Para tanto, selecione o controle e acesse suas propriedades. Sob a guia Dados selecione a opção Máscara de entrada a qual deve ser 99/99/00;0;_ (voce pode abrir o assistente de máscaras e criar sua própria máscara ou selecionar uma da lista)


Figura 7‑5 Máscara de entrada para datas abreviadas

Neste ponto, teremos um formulário como segue abaixo:


Figura 7‑6 Layout do formulário de apoio

Feito isso, selecione o botão de comando Visualizar e na guia Evento adicione um procedimento de evento para o evento Ao Clicar utilizando o seguinte código (explicações acompanham o código):

Option Explicit

Private Sub cmdVisualizar_Click()
'   Verifica se os campos para data inicial e final
'   forma preenchidos antes de continuar. Caso ambos ou um esteja vazio, entao
    If IsNull([txtDataInicial]) Or IsNull([txtDataFinal]) Then

'       Mostrar mensagem de que ambos os campos devem ser preenchido
        MsgBox "Você deve inserir datas de início e de fim.", vbExclamation
       
'       Ir para o controle de data inicial
        DoCmd.GoToControl "txtDataInicial"
    Else

'       Caso ambos campos tenha sido preenchidos, mas a data inicial
'       seja maior do que a data final...
        If [txtDataInicial] > [txtDataFinal] Then

'           ... mostrar mensagem avisando do erro...
            MsgBox "Data final deve ser maior do que a data inicial.", _
              vbExclamation
           
'           ... e ir para o controle de data inicial
            DoCmd.GoToControl "txtDataInicial"
        Else

'           Se condicao for falsa, entao ocultar o formulário.
            Me.Visible = False
        End If
    End If
End Sub

Isso é tudo que precisamos para o nosso formulário. O próximo passo requer a criação de nosso relatório o qual discuto a seguir.

Criando o relatório, instrução SQL e VBA do relatório

Com o formulário fora do caminho, precisamos agora criar o nosso relatório. Utilizando o pequeno banco de dados deste tópico, utilize o assistente de relatórios para criar um relatório contendo todos os campos da tabela. Aqui, nós ainda não estamos interessados em filtragem.

Uma vez que o leitor tenha criado o relatório, abra a caixa de propriedades para o relatório onde modificaremos a fonte de registros. A fonte de registro conterá o nome da tabela. O que desejamos fazer é construir a instrução SQL para filtrar os registros requeridos.

Siga os passos abaixo:

  • Abra a caixa de propriedades e selecione Relatório na caixa de seleção;
  • Selecione a guia Dados e clique no botão de edição de consulta para abrir a janela do construtor de consulta;
  • Selecione todos os campos da tabela de origem de dados, conforme mostra a figura:


Figura 7‑7 Construtor de consultas

  • Para o campo DataDaTransação, adicione o seguinte critério na linha de critérios: >=[forms]![frmDatas]![txtDataInicial] E <=[Forms]![frmDatas]![txtDataFinal];
  • Finalmente, dê os toques finais no seu relatório conforme o gosto.

A primeira parte de nossa tarefa está pronta. O próximo passo requer a escrita do VBA.

Lembra que no código para o formulário nós o deixávamos invisível quando ele continha datas válidas? Pois bem, a primeira coisa que precisamos fazer é criar uma função em VBA para determinar se o formulário está ou não aberto.

Adicione um módulo comum onde o código abaixo deve ser entrado:

Option Explicit

Function EstáAberto(ByVal strNomeForm As String) As Boolean

'   Constantes para os estados do formulário (fechado ou
'   em "modo de design"). Note que as constantes não são
'   necessárias. Elas apenas facilitam a leitura do código.
    Const constFrmFechado = 0
    Const constFrmDesign = 0
   
   
'   Checa para saber se o formulário está aberto. Se sim...
    If SysCmd(acSysCmdGetObjectState, acForm, strNomeForm) <> _
        constFrmFechado Then

'       Checar para saber não está aberto em modo de design.
'       Se não estiver em modo de design, então...
        If Forms(strNomeForm).CurrentView <> constFrmDesign Then

'           formulário está aberto
            EstáAberto = True
        End If
    End If
   
End Function

Com a função pronta, abra o VBE do relatório onde devemos inserir os seguintes procedimentos:

Private Sub Report_Close()
'   Ao fechar o relatório, fechar o formulário também
    DoCmd.Close acForm, "frmDatas"
End Sub

Private Sub Report_Open(Cancel As Integer)
   
'   Abre o formulário e determina o seu título, pois o mesmo
'   formulário pode ser usado por qualquer relatório
'   que necessite de filtro por datas.
    DoCmd.OpenForm "frmDatas", , , , , _
        acDialog, "Transações por datas"
   
'   Se o formulário estiver fechado, cancelar operação
    If Not EstáAberto("frmDatas") Then
        Cancel = True
    End If
End Sub

O leitor pode agora experimentar o trabalho feito. Abra o relatório através de um duplo-clique e o formulário de apoio será aberto. Digite a data inicial e a data final e clique no botão de comando para visualização do relatório.

Caso o período selecionado não contenha dados, a mensagem será mostrada e o relatório será cancelado. Se houver dados, o relatório filtrará o período digitado.

Apenas como sugestão, o leitor pode inserir um rótulo o qual lê as datas do formulário e imprime no relatório o período selecionado. Este fica como exercício para o leitor.

Filtros por contas

O exemplo anterior filtra por datas, porém poderíamos ter um cenário onde além de filtrarmos por datas nós desejamos filtrar por conta também. Filtros como estes, embora aparentemente simples, causam bastante confusão, pois geralmente a lista de contas é a partir de uma caixa de combinação.

Infelizmente, ao passarmos o parâmetro de filtro de uma caixa de combinação para a consulta o mesmo não é passado, causando um erro no filtro do relatório.

Continuarei a partir do exemplo anterior, porém uma nova tabela é adicionada ao projeto contendo algumas contas as quais serão relacionadas à tabela existente.

A primeira coisa que precisamos fazer é adicionar os novos controles ao formulário:


Figura 7‑8 Design do formulário

Agora, possuimos uma caixa de combinação e uma caixa de texto extra (no topo direito do formulário). Modifique a propriedade Visível para Não desta caixa de texto, pois não desejamos que ela fique visível ao usuário. Ela é apenas usada para armazer o número de identificação da conta.

O próximo passo requer a entrada do seguinte código para o evento Change da caixa de combinação:

Private Sub cboIDConta_Change()
    Me.txtIDConta = Me.cboIDConta.Value
End Sub

O código acima simplesmente passa o valor da seleção da caixa de combinação para a caixa de texto.

Feito isso, precisamos adaptar o código original para o botão de visualização como segue:

Private Sub cmdVisualizar_Click()
'   Verifica se os campos para data inicial e final
'   forma preenchidos antes de continuar. Caso ambos ou um esteja vazio, entao
    If IsNull([txtDataInicial]) Or IsNull([txtDataFinal]) Then

'       Mostrar mensagem de que as datas precisam ser preenchidas
'       e uma conta selecionada.
        MsgBox "Você deve inserir datas de início e de fim " _
        & "e escolher uma conta válida.", vbExclamation
       
'       Ir para o controle de data inicial
        DoCmd.GoToControl "txtDataInicial"
    Else

'       Caso ambos campos tenha sido preenchidos, mas a data inicial
'       seja maior do que a data final...
        If [txtDataInicial] > [txtDataFinal] Then

'           ... mostrar mensagem avisando do erro...
            MsgBox "Data final deve ser maior do que a data inicial.", _
              vbExclamation
           
'           ... e ir para o controle de data inicial
            DoCmd.GoToControl "txtDataInicial"
        Else

'           Se condicao for falsa, entao ocultar o formulário.
            Me.Visible = False
        End If
    End If
End Sub

Agora que possuimos estes dois pontos prontos, nós precisamos adaptar o nosso relatório para incluir em nossa consulta original o campo de identificação da conta e o nome da conta.

Abra o relatório em modo de design e efetue as seguintes modificações:

  • Adicione uma caixa de texto no cabeçalho do relatório. Nesta caixa de texto, adicione a seguinte fórmula: ="Transações para a conta " & [NomeConta] & " para o período de " & Forms!frmDatas!txtDataInicial & " a " & Forms!frmDatas!txtDataFinal & ".". O seu cabeçalho deve ser algo como segue:


Figura 7‑9 Cabeçalho do novo relatório

  • Modifique a fonte de registros para incluir os dois novos campos (IDConte e NomeConta);
  • Adicione o critério: [forms]![frmDatas]![txtIDConta] ao campo IDConta na consulta.


Figura 7‑10 Redefinindo a consulta

O leitor pode agora executar o relatórios e abrí-lo filtrando por data e número da conta.
« Anterior Δ Página principal ¤ Índice Próxima »

* Você pode baixar (fazer download) do conteúdo completo deste curso, em formato PDF, com 38 páginas, comprando o seguinte e-book:

VBA NO ACCESS 2003

você conhece a universidade do access?

Universidade do Access - Curso Completo de Access
com tudo para você dominar o Access - do Básico ao
Avançado - até a Criação de Sistemas Profissionais
Completos - Passo a Passo - Tela a Tela

Capa da Universidade do Access

Aplica-se ao Access 2019, 2016, 2013 e 2010!

13 Cursos - 574 Vídeo-Aulas - 63:32 horas

Para todos os detalhes, acesse:

https://juliobattisti.com.br/universidade-do-access.asp


você conhece a universidade do access?

Universidade do Access - Curso Completo de Access
com tudo para você dominar o Access - do Básico ao
Avançado - até a Criação de Sistemas Profissionais
Completos - Passo a Passo - Tela a Tela

Capa da Universidade do Access

Aplica-se ao Access 2019, 2016, 2013 e 2010!

13 Cursos - 574 Vídeo-Aulas - 63:32 horas

Para todos os detalhes, acesse:

https://juliobattisti.com.br/universidade-do-access.asp

Quer receber novidades e e-books gratuitos?

MEGA FORMAÇÃO EM INFRAESTRUTURA DE TI

(Online, Vitalício, Prático e Atualizado)!

  • Chega de ser Ignorado pelo Mercado!

  • A vida não vai Melhorar Sozinha!

  • Quem domina infraestrutura, domina o Mercado.

  • Com esta Formação você vai Dominar o Conhecimento e torne-se o Profissional que as Empresas estão Buscando, "desesperadamente", mas não estão encontrando.

NÃO PROCURE VAGAS, SEJA PROCURADO!

 

Curso Completo de Excel - Curso Online com Certificado - 925 Vídeo Aulas - 22 Cursos - 120:42 horas

 

Para Todos os Detalhes, Acesse:

Curso Completo de Excel - Curso Online com Certificado - 925 Vídeo Aulas - 22 Cursos - 120:42 horas

 

https://juliobattisti.com.br/curso-infra-ti.asp

 

Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

Todos os direitos reservados, Júlio Battisti 2001-2026 ®

LIVRO: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2016 - CURSO COMPLETO E PRÁTICO

DOMINE A PROGRAMAÇÃO VBA NO EXCEL - 878 PÁGINAS - CLIQUE AQUI