MS Access | Aplicando Função Concatenação de Valores nos Campos das Consultas

MS Access | Aplicando Função Concatenação de Valores nos Campos das Consultas


No desenvolvimento de soluções VBA para bancos de dados, frequentemente há a necessidade de agrupar informações de diferentes registros em uma única linha. Isso é particularmente útil quando se deseja exibir múltiplos valores relacionados a uma chave primária de forma concatenada, como listar todos os membros de uma família em uma só célula de uma consulta. A função ConcatenateFieldValues permite exatamente isso.


 Aprenda: 17 Passos Essenciais para Melhorar seu Código VBA 


Essa função tem como base uma consulta SQL (Structured Query Language) que seleciona os valores de um campo específico. O código percorre todos os registros retornados e concatena os valores, separando-os por um delimitador definido pelo usuário — que, por padrão, é uma vírgula. Isso torna o uso da função flexível e aplicável a diversas situações em que diferentes separadores podem ser exigidos, como ponto-e-vírgula ou até mesmo uma quebra de linha.


Public Function ConcatenateFieldValues(pstrSQL As String, _

      Optional pstrDelim As String = ", ") As String


' Criado por Duane Hookom, 2003

' Este código pode ser incluído em qualquer aplicação, desde que

'      esta declaração seja mantida.

'

' Exemplo de uso:

'      tblFamily com FamID como chave primária numérica

'      tblFamMem com FamID, FirstName, DOB,...

' Retorna uma lista separada por vírgulas de FirstNames para um FamID

'                  Exemplo: John, Mary, Susan

' Em uma consulta:

'      SELECT FamID,

'      ConcatenateFieldValues("SELECT FirstName

'      FROM tblFamMem WHERE FamID =" & [FamID]) AS FirstNames

'      FROM tblFamily;

' ---------------------

' Modificado por Ken Snell 29 October 2005

'

' *** ESTA FUNÇÃO CONSTRÓI UMA STRING CONCATENADA QUE CONTÉM OS

' *** VALORES DE UM CAMPO PARA CADA REGISTRO EM UMA TABELA OU

' *** CONSULTA, SEPARADOS POR UM DELIMITADOR ESPECIFICADO.


Dim strConcat As String ' String que armazenará os valores concatenados


' Comentário sobre o uso de DAO

Dim db As DAO.Database

Dim rs As DAO.Recordset ' Objeto Recordset que será utilizado para armazenar os resultados da consulta


On Error Resume Next ' Ignora erros


strConcat = "" ' Inicializa a string concatenada


' Abre o banco de dados atual e executa a consulta passada como parâmetro (pstrSQL)

Set db = CurrentDb

Set rs = db.OpenRecordset(pstrSQL)


' Verifica se o Recordset não está vazio e processa os resultados

With rs

      If Not .EOF Then ' Se não estiver no final do Recordset

            .MoveFirst ' Move para o primeiro registro

            Do While Not .EOF ' Continua até o final dos registros

                  strConcat = strConcat & .Fields(0) & pstrDelim ' Concatena o valor do campo com o delimitador

                  .MoveNext ' Move para o próximo registro

            Loop

      End If

      .Close ' Fecha o Recordset

End With


Set rs = Nothing ' Libera a memória utilizada pelo Recordset


db.Close ' Fecha a conexão com o banco de dados

Set db = Nothing ' Libera a memória utilizada pelo objeto Database


' Remove o último delimitador da string concatenada

If Len(strConcat) > 0 Then strConcat = _

      Left(strConcat, Len(strConcat) - Len(pstrDelim))


' Retorna a string concatenada final

ConcatenateFieldValues = strConcat


Exit Function

End Function



Um dos grandes diferenciais desta função é sua aplicabilidade em consultas dentro do Microsoft Access. Um exemplo clássico seria uma tabela que armazena os nomes de membros de uma família, vinculada a outra tabela que armazena as informações da própria família. Utilizando a função ConcatenateFieldValues, é possível gerar uma consulta que retorne os nomes dos membros separados por vírgulas, tudo em um só campo, para cada família.


 Que tal aprender estes códigos também: 


A função também é extremamente eficiente, aproveitando o mecanismo de objetos DAO (Data Access Objects) para trabalhar diretamente com os registros no banco de dados. Além disso, a função foi projetada para que possa ser facilmente modificada para trabalhar com ADO (ActiveX Data Objects), caso o desenvolvedor precise acessar dados de fontes externas ao Access. Essa flexibilidade permite que a função seja aplicada em diferentes contextos, desde bancos de dados locais até conexões remotas.


Outro ponto importante é o tratamento de erros. Embora o código original utilize a instrução On Error Resume Next, que ignora erros, é recomendável adicionar um tratamento de erros mais robusto em ambientes críticos. Isso ajudaria a capturar possíveis falhas de execução, como consultas malformadas ou falta de conexão com o banco de dados, proporcionando mais segurança e controle sobre o comportamento do aplicativo.


Em suma, a função ConcatenateFieldValues resolve um problema comum em bancos de dados relacionais e é uma excelente ferramenta para gerar relatórios dinâmicos. Sua flexibilidade, eficiência e simplicidade a tornam uma função valiosa para desenvolvedores que buscam agregar dados de forma elegante e intuitiva, sem a necessidade de recorrer a técnicas mais complexas de programação.


  Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com


 Série Donut Project 
DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes


 Clique nas capas abaixo e compre também: 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)


Série Top 10 Funções: Top 10 Funções VBA para o Microsoft Excel (Série Top 10 Funções - Microsoft Excel)


eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes

eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes

eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes

MS Access | Utilizando SendKeys de Forma Eficiente

MS Access | Utilizando SendKeys de Forma Eficiente


A função SendKeys no VBA é uma ferramenta poderosa para automatizar a interação com janelas e aplicativos no Windows. No entanto, a evolução do sistema operacional trouxe desafios, especialmente com o lançamento do Windows Vista e suas versões posteriores. Neste contexto, adaptar funções VBA para garantir a compatibilidade com sistemas mais recentes é uma prática essencial para desenvolvedores.


 Aprenda: 17 Passos Essenciais para Melhorar seu Código VBA 


O código acima exemplifica uma solução robusta para enviar sequências de teclas em versões diferentes do Windows. A função SendKeys foi ajustada para reconhecer automaticamente se o sistema operacional é anterior ou posterior ao Windows Vista. Isso é feito através da função OsVersion, que utiliza uma chamada à API do Windows para obter informações detalhadas sobre o sistema. A partir dessa informação, a função decide qual método de envio de teclas usar — o SendKeys nativo do VBA para sistemas mais antigos, ou a WScript.Shell para sistemas modernos.


' Declaração das funções API para obter a versão do sistema operacional e o nome do módulo

Private Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long


' Estrutura para armazenar informações sobre a versão do sistema operacional

Private Type OSVERSIONINFO

    dwOSVersionInfoSize As Long

    dwMajorVersion As Long

    dwMinorVersion As Long

    dwBuildNumber As Long

    dwPlatformId As Long

    szCSDVersion As String * 128 ' String para armazenar a descrição do pacote de serviços

End Type


' Função para obter a versão do sistema operacional (Windows)

Function OsVersion() As Single

    Dim os As OSVERSIONINFO

    Dim retval As Long

    os.dwOSVersionInfoSize = Len(os) ' Define o tamanho da estrutura de dados

    retval = GetVersionEx(os) ' Chama a função API para obter a versão do Windows

    OsVersion = Val(os.dwMajorVersion & "." & os.dwMinorVersion) ' Retorna a versão principal e secundária do sistema operacional

End Function


' Função para enviar teclas (equivalente ao SendKeys) com suporte para Windows Vista ou superior

Public Function Sendkeys(sSend As String, Optional bWait As Boolean = False)

    Static bInit As Boolean, bVistaOrGreater As Boolean, wShell As Object


    ' Inicializa variáveis estáticas na primeira execução da função

    If Not bInit Then

        bVistaOrGreater = (OsVersion() >= 6) ' Verifica se o SO é Windows Vista ou superior

        If bVistaOrGreater Then Set wShell = CreateObject("WScript.Shell") ' Cria objeto WScript.Shell se for Vista ou superior

        bInit = True ' Marca a inicialização como completa

    End If


    ' Se não for Vista ou superior, usa VBA.SendKeys; caso contrário, usa wShell.SendKeys

    If Not bVistaOrGreater Then

        VBA.Sendkeys sSend, bWait ' Usa o método SendKeys do VBA para SOs mais antigos

    Else

        wShell.SendKeys sSend, bWait ' Usa o método SendKeys da WScript.Shell para Windows Vista ou superior

    End If

End Function


Essa distinção é importante porque o Windows Vista introduziu mudanças na segurança e no gerenciamento de aplicativos que podem interferir no comportamento do SendKeys. A abordagem aqui proposta garante que a função funcione corretamente em qualquer ambiente Windows sem a necessidade de modificações adicionais no código.


Além disso, a implementação de variáveis estáticas dentro da função SendKeys otimiza a performance, inicializando objetos e verificações apenas uma vez por execução. Isso reduz a sobrecarga, tornando o código mais eficiente, especialmente quando é executado repetidamente em um processo automatizado.


 Que tal aprender estes códigos também: 

MS Access | Aplicando Função Concatenação de Valores nos Campos das Consultas
MS Access | Utilizando SendKeys de Forma Eficiente
MS Access | Automatizando a Compactação do Bancos de Dados
MS Access | Como Gerenciar Links das Tabelas
MS Access | Quebra de Texto em Linhas com Comprimento Máximo
MS Access | Monitoramento de Conexões de Usuários
MS Access | Mapeando 3.500 Erros com a Criação de Tabelas de Erros
MS Access | Código para Registro de Logs
MS Access | 17 Passos Essenciais para Melhorar seu Código VBA
MS Access | Código VBA para Backup de Todas as Tabelas Comentado


Esse tipo de implementação é extremamente útil em cenários de automação de tarefas repetitivas, como o controle de aplicativos legados que não possuem API direta ou automação de fluxos complexos envolvendo várias interfaces. A possibilidade de enviar sequências de teclas dinamicamente pode ser empregada para preencher formulários, navegar em menus ou executar comandos em software de terceiros, sem a necessidade de interação manual.


Portanto, adaptar funções VBA clássicas, como o SendKeys, para suportar diferentes versões do Windows, permite que os desenvolvedores criem soluções robustas e compatíveis com ambientes diversos. Isso não só amplia a vida útil dos projetos, mas também garante que a automação funcione perfeitamente em versões futuras do sistema operacional.


  Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com


 Série Donut Project 
DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes


 Clique nas capas abaixo e compre também: 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)


Série Top 10 Funções: Top 10 Funções VBA para o Microsoft Excel (Série Top 10 Funções - Microsoft Excel)


eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes

eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes

eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes

MS Access | Automatizando a Compactação do Bancos de Dados

MS Access | Automatizando a Compactação do Bancos de Dados


Manter o desempenho de bancos de dados Access é uma tarefa essencial, especialmente em ambientes que fazem uso intensivo de arquivos backend compartilhados. A compactação regular do banco de dados melhora sua eficiência, elimina fragmentação e recupera espaço em disco. O código CompactBackendDatabaseFile_Custom automatiza essa tarefa, permitindo compactar um banco de dados backend com segurança e facilidade.


 Aprenda: 17 Passos Essenciais para Melhorar seu Código VBA 


A função verifica se o arquivo original do banco de dados está sendo usado através da existência de um arquivo ".ldb", o que indica que o banco de dados está em uso. Se o arquivo de bloqueio estiver presente, a compactação não é realizada para evitar a corrupção de dados. Isso é útil em ambientes multiusuário, onde o banco pode estar constantemente acessado por diferentes usuários.


 Que tal aprender estes códigos também: 

MS Access | Aplicando Função Concatenação de Valores nos Campos das Consultas
MS Access | Utilizando SendKeys de Forma Eficiente
MS Access | Automatizando a Compactação do Bancos de Dados
MS Access | Como Gerenciar Links das Tabelas
MS Access | Quebra de Texto em Linhas com Comprimento Máximo
MS Access | Monitoramento de Conexões de Usuários
MS Access | Mapeando 3.500 Erros com a Criação de Tabelas de Erros
MS Access | Código para Registro de Logs
MS Access | 17 Passos Essenciais para Melhorar seu Código VBA
MS Access | Código VBA para Backup de Todas as Tabelas Comentado


A compactação é realizada de maneira segura utilizando um arquivo temporário. O código renomeia o arquivo original e cria uma cópia temporária, que é compactada em seguida. Essa abordagem minimiza os riscos de falhas durante o processo, e, em caso de erro, o código restaura o arquivo original automaticamente. Esse nível de automação reduz o esforço manual e a probabilidade de erro humano.


Public Function CompactBackendDatabaseFile_Custom(strPathFilename_OriginalBEDB As String, _

strPathFilename_TemporaryBEDB As String, blnKeepBackup As Boolean) As Integer


' Função para compactar um banco de dados backend do Access

' strPathFilename_OriginalBEDB: caminho e nome do arquivo do banco de dados que será compactado

' strPathFilename_TemporaryBEDB: caminho e nome do arquivo temporário usado para compactação

' blnKeepBackup: indica se uma cópia de backup será mantida (True) ou não (False)

' Retorna:

'   -1: se um arquivo .ldb existir (indica que o banco está em uso, sem compactação)

'    0: se a compactação foi bem-sucedida

'    1: se o arquivo original não for encontrado (sem compactação)

'    2: se houve erro durante a compactação (sem compactação)


Dim intLocation As Integer

Dim xlngLooping As Long

Dim strTempBEDB As String, strDateTime As String

Dim strLockFile As String


Const strLockFileExtension As String = "ldb" ' Extensão do arquivo de bloqueio do Access


On Error Resume Next


' Gera um timestamp para nomear o arquivo temporário

Let strDateTime = Format(Now, "mmmddyyyyhhnnssAmPm")
Let strTempBEDB = strPathFilename_TemporaryBEDB
Let intLocation = InStrRev(strTempBEDB, "\") ' Localiza a última barra invertida no caminho

strTempBEDB = Left(strTempBEDB, intLocation) & strDateTime & _

      Mid(strTempBEDB, intLocation + 1) ' Insere o timestamp no nome do arquivo temporário


' Verifica se o arquivo de bloqueio (.ldb) existe, o que indica que o banco está em uso

Let strLockFile = Left(strPathFilename_OriginalBEDB, Len(strPathFilename_OriginalBEDB) - 3) & strLockFileExtension

If Dir(strLockFile) = "" Then


      On Error GoTo Err_Compact_1


      ' Renomeia o arquivo original para o nome temporário

      Name strPathFilename_OriginalBEDB As strTempBEDB

      DoEvents ' Permite que outros processos continuem executando


      On Error GoTo Err_Compact_2


      ' Compacta o banco de dados temporário no arquivo original

      DBEngine.CompactDatabase strTempBEDB, strPathFilename_OriginalBEDB

      DoEvents


      ' Espera até que o arquivo compactado esteja disponível

      Do Until Dir(strPathFilename_OriginalBEDB) <> ""

            On Error Resume Next

            For xlngLooping = 0 To 25

                  DoEvents

            Next xlngLooping

      Loop


      On Error Resume Next


      ' Remove o arquivo temporário se o backup não for necessário

      If blnKeepBackup = False Then Kill strTempBEDB


      Let CompactBackendDatabaseFile_Custom = 0 ' Compactação concluída com sucesso


Else

      Let CompactBackendDatabaseFile_Custom = -1 ' Arquivo em uso, compactação não realizada


End If


Exit_Compact:

      Exit Function


Err_Compact_1:

      ' Caso o arquivo original não seja encontrado

      MsgBox "O arquivo original do banco de dados não foi encontrado neste local:" & _

            vbCrLf & " " & strPathFilename_OriginalBEDB & vbCrLf & _

           "O arquivo não pode ser compactado.", vbExclamation, "Arquivo Não Encontrado!"

     CompactBackendDatabaseFile_Custom = 1

     Resume Exit_Compact


Err_Compact_2:

      ' Em caso de erro durante a compactação, restaura o banco original

      Kill strPathFilename_OriginalBEDB

      FileCopy strTempBEDB, strPathFilename_OriginalBEDB

      MsgBox "Ocorreu um erro durante a operação de compactação do arquivo!" & _

            vbCrLf & "O arquivo não pode ser compactado.", vbExclamation, "Erro de Compactação!"

      CompactBackendDatabaseFile_Custom = 2

      Resume Exit_Compact


End Function


Outro recurso interessante é a opção de manter ou não uma cópia de backup do banco de dados compactado. Caso o usuário deseje arquivar uma cópia antes da compactação, o sistema automaticamente adiciona um carimbo de data/hora ao nome do arquivo, tornando-o fácil de identificar. Isso é útil para manter versões anteriores de backups para auditoria ou recuperação de dados.


Em suma, a função CompactBackendDatabaseFile_Custom oferece uma maneira prática e segura de realizar a compactação de bancos de dados Access de forma programática. Essa automação não apenas melhora a performance e a organização do banco, mas também proporciona maior controle sobre o processo, permitindo agendamentos e execuções regulares sem intervenção manual constante.


  Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com


 Série Donut Project 
DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes


 Clique nas capas abaixo e compre também: 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)


Série Top 10 Funções: Top 10 Funções VBA para o Microsoft Excel (Série Top 10 Funções - Microsoft Excel)


eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes

eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes

eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes
diHITT - Notícias