Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

.: Vitrine

Carregando artigos...

Views

MS Access | Como Gerenciar Links das Tabelas

MS Access | Como Gerenciar Links das Tabelas


Gerenciar tabelas vinculadas no Microsoft Access pode ser uma tarefa repetitiva, especialmente quando os arquivos de base de dados são movidos para novos diretórios ou compartilhados entre diferentes usuários. Nesse contexto, o código ChangeLinkPath surge como uma solução prática e eficiente para automatizar a alteração de caminhos de links de tabelas vinculadas, tornando o processo rápido e menos suscetível a erros manuais.


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


A função ChangeLinkPath aceita como entrada o novo caminho onde o arquivo de banco de dados vinculado está armazenado. Essa função percorre todas as tabelas vinculadas do banco de dados atual e, se alguma delas não estiver conectada ao novo caminho especificado, ela será relincada para garantir que todas as tabelas apontem para o local correto. Isso é particularmente útil em ambientes onde as bases de dados são movidas entre diferentes servidores ou máquinas de trabalho.


Public Function ChangeLinkPath(strNewPath As String) As String


' Função para alterar o caminho dos links das tabelas vinculadas em um banco de dados Access

' strNewPath: Novo caminho para o arquivo da base de dados vinculado

' Retorna uma string indicando se o processo foi concluído com sucesso ou se falhou


Dim dbs As DAO.Database ' Objeto de banco de dados DAO

Dim strTblName As String ' Nome da tabela atual sendo processada

Dim colTbl As Collection ' Coleção para armazenar nomes de tabelas que precisam ser relincadas

Dim intTbl As Integer ' Contador para iterar sobre as tabelas


' Verifica se um novo caminho foi fornecido e se ele é válido

If strNewPath <> "" And Dir(strNewPath) <> "" Then


      Set colTbl = New Collection ' Inicializa a coleção de tabelas

      Set dbs = CurrentDb ' Define o banco de dados atual


      ' Itera sobre todas as tabelas no banco de dados

      For intTbl = dbs.TableDefs.Count - 1 To 0 Step -1

            ' Verifica se a tabela é vinculada e se o caminho atual não corresponde ao novo caminho

            If dbs.TableDefs(intTbl).Connect <> "" And _

                  Not dbs.TableDefs(intTbl).Connect Like "*" & strNewPath Then

                  ' Adiciona a tabela à coleção para ser relincada

                  colTbl.Add dbs.TableDefs(intTbl).Name

                  ' Remove a tabela vinculada atual

                  dbs.TableDefs.Delete dbs.TableDefs(intTbl).Name

            End If

      Next intTbl


      ' Relinca as tabelas usando o novo caminho

      For intTbl = colTbl.Count To 1 Step -1

            strTblName = colTbl(intTbl) ' Nome da tabela a ser relincada

            ' Relinca a tabela com o novo caminho fornecido

            DoCmd.TransferDatabase acLink, "Microsoft Access", _

                  strNewPath, acTable, strTblName, strTblName

            Debug.Print "Conexão estabelecida para '" & strTblName & "'"

      Next intTbl


      ' Limpa as variáveis de objeto

      Set dbs = Nothing

      Set colTbl = Nothing

      Debug.Print "PROCESSO CONCLUÍDO!"

      ChangeLinkPath = "PROCESSO CONCLUÍDO!"


Else

      ' Caso o novo caminho não seja fornecido ou não seja válido

      Debug.Print "Caminho novo não foi fornecido. Nenhuma alteração feita!"

      ChangeLinkPath = "Caminho novo não foi fornecido. Nenhuma alteração feita!"


End If


Exit Function


End Function



O código faz uma verificação inicial para garantir que o caminho fornecido é válido. Caso o caminho não exista, ele não faz nenhuma alteração e retorna uma mensagem de aviso ao usuário. Esse tipo de verificação é essencial para evitar erros desnecessários, como tentativas de relincar tabelas para diretórios inexistentes, o que poderia causar falhas no banco de dados.


Outro ponto de destaque é a maneira como a função gerencia as tabelas. Em vez de alterar diretamente as tabelas vinculadas, ela primeiro armazena os nomes das tabelas em uma coleção e as exclui temporariamente. Somente após essa exclusão as tabelas são relincadas ao novo caminho. Esse processo garante que não haja duplicidade de tabelas e que as conexões antigas sejam corretamente removidas antes de estabelecer as novas conexões.


 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


Em termos de aplicabilidade, a função ChangeLinkPath pode ser usada em uma variedade de cenários. Imagine uma empresa que periodicamente migra suas bases de dados para novos servidores. Em vez de ajustar manualmente cada tabela vinculada em cada banco de dados Access, essa função permite que tudo seja feito automaticamente, economizando tempo e minimizando o risco de erros. Além disso, ela pode ser usada em soluções distribuídas, onde vários usuários precisam acessar a mesma base de dados em diferentes locais, garantindo que todos estejam sempre conectados ao diretório correto.


Por fim, ao integrar essa função em seus projetos VBA no Access, você simplifica a manutenção de tabelas vinculadas e automatiza uma tarefa que, de outra forma, seria trabalhosa e repetitiva. Isso melhora a eficiência do desenvolvimento e garante que os usuários finais tenham uma experiência mais fluida e sem interrupções no acesso aos dados.


  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 | Quebra de Texto em Linhas com Comprimento Máximo

MS Access | Quebra de Texto em Linhas com Comprimento Máximo


Em muitos cenários de automação no Microsoft Access, é necessário manipular strings de texto extensas e formatá-las de maneira legível, especialmente em relatórios ou caixas de mensagem. A função BreakTextAtX fornece uma solução eficiente para esse problema, permitindo dividir um texto em várias linhas com base em um caractere delimitador e um comprimento máximo por linha.


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


O funcionamento básico da função se dá pela análise de uma string de texto original e sua subsequente segmentação. Ela utiliza um caractere especificado, como um espaço em branco (ou outro delimitador definido pelo usuário), para determinar onde dividir o texto. Isso é particularmente útil em casos onde se deseja evitar que palavras sejam cortadas no meio, mantendo a integridade semântica de cada linha gerada.


Public Function BreakTextAtX(varOriginal As Variant, _

      Optional strBreakCharacter As String = " ", _

      Optional lngMaxLength As Long = 72) As Variant


' Função para dividir um texto em linhas menores com um comprimento máximo definido

' varOriginal: Texto original a ser quebrado

' strBreakCharacter: Caractere usado para quebrar o texto (padrão: espaço em branco)

' lngMaxLength: Comprimento máximo de cada linha (padrão: 72 caracteres)


Dim strNewString As String ' Armazena o texto formatado

Dim strWorking As String ' Parte atual do texto sendo processado

Dim strPart As String ' Parte do texto após a quebra

Dim strOriginalNoCrLf As String ' Texto original sem quebras de linha

Dim lngPosition As Long ' Posição atual no texto

Dim lngHold As Long ' Posição da última ocorrência do caractere de quebra

Dim lngLength As Long ' Comprimento total do texto original

Dim lngWorkLength As Long ' Comprimento da parte atual do texto sendo processado


' Obtém o comprimento do texto original

lngLength = Len(varOriginal & "")


' Verifica se o texto original tem conteúdo

If lngLength > 0 Then

      ' Remove quebras de linha (vbCr e vbLf) do texto original

      strOriginalNoCrLf = Replace(Replace(CStr(varOriginal), vbCr, ""), vbLf, "")

      strNewString = "" ' Inicializa o texto formatado

      lngPosition = 1 ' Começa na primeira posição do texto


      ' Loop para percorrer o texto original e dividir em partes menores

      Do While lngPosition <= lngLength

            ' Extrai uma parte do texto de acordo com o comprimento máximo definido

            strWorking = Mid(strOriginalNoCrLf, lngPosition, lngMaxLength)

            lngWorkLength = Len(strWorking) ' Obtém o comprimento da parte extraída


            ' Verifica se o comprimento da parte extraída é menor que o comprimento máximo

            If lngWorkLength < lngMaxLength Then

                  ' Se o texto formatado já tem conteúdo, adiciona uma quebra de linha

                  If Len(strNewString) > 0 And Len(strWorking) > 0 Then _

                        strNewString = strNewString & vbCrLf

                  ' Adiciona a parte final do texto e encerra o loop

                  strNewString = strNewString & strWorking

                  Exit Do

            Else

                  ' Procura pela última ocorrência do caractere de quebra

                  lngHold = InStrRev(strWorking, strBreakCharacter)

                  ' Se não houver caractere de quebra, usa o comprimento total da parte

                  If lngHold = 0 Then lngHold = lngWorkLength

                  ' Se o texto formatado já tem conteúdo, adiciona uma quebra de linha

                  If Len(strNewString) > 0 Then _

                        strNewString = strNewString & vbCrLf

                  ' Adiciona a parte do texto até a posição do caractere de quebra

                  strNewString = strNewString & Left(strWorking, lngHold)

                  ' Avança para a próxima parte do texto

                  lngPosition = lngPosition + lngHold

            End If

      Loop


      ' Retorna o texto formatado

      BreakTextAtX = strNewString

Else

      ' Se o texto original for nulo, retorna nulo; caso contrário, retorna uma string vazia

      If IsNull(varOriginal) Then

            BreakTextAtX = varOriginal

      Else

            BreakTextAtX = ""

      End If

End If


End Function



A aplicabilidade dessa função é vasta. Imagine que você precisa gerar relatórios que serão exibidos em caixas de texto de largura limitada, como em formulários de sistemas de inventário ou controle de estoque. Ao utilizar a função, o texto será formatado automaticamente em várias linhas, garantindo uma melhor apresentação e legibilidade. Isso pode ser usado tanto para exportação de relatórios quanto para visualizações dentro da interface do Access.


Outro exemplo prático seria o envio de notificações ou mensagens via e-mail, onde o limite de comprimento de uma linha pode ser crucial para manter a formatação correta. Em vez de manualmente ajustar o conteúdo, o código VBA faz isso de forma automática, adaptando-se ao tamanho máximo especificado pelo usuário e adicionando quebras de linha onde necessário.


 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 função também lida de maneira robusta com situações em que o texto original contém quebras de linha (caracteres vbCr e vbLf), removendo-as antes de processar a string. Isso é especialmente útil quando se trabalha com dados importados ou exportados de outras fontes, garantindo que a formatação do texto final seja sempre consistente e previsível.


Por fim, a flexibilidade da função em permitir ao usuário definir tanto o caractere de quebra quanto o comprimento máximo de cada linha a torna aplicável em uma grande variedade de projetos e necessidades dentro do Access. Desde o controle de visualizações até a geração de relatórios, o BreakTextAtX facilita a manipulação de strings de texto de forma prática e eficiente.


  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 | Monitoramento de Conexões de Usuários

MS Access | Monitoramento de Conexões de Usuários


O Microsoft Access permite que múltiplos usuários acessem simultaneamente um banco de dados, gerando um arquivo de bloqueio (.ldb) que rastreia quais usuários estão conectados. A função WhoIsInTheDatabaseLockFile descrita acima permite identificar, de maneira eficiente, quem está conectado ao banco de dados, incluindo informações detalhadas sobre o nome do computador, o nome de login do usuário e o status da conexão.


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


Esse tipo de monitoramento é extremamente útil em ambientes onde a colaboração é necessária, mas o controle de acesso e a auditoria de quem está utilizando os recursos são fundamentais para evitar conflitos, como a sobrescrição de dados ou bloqueios inesperados. O código acessa o esquema de usuários conectado ao Jet 4.0 OLE DB Provider, permitindo visualizar todas as conexões ativas ou que recentemente estiveram ativas, mesmo se a conexão do usuário foi encerrada abruptamente.


Public Function WhoIsInTheDatabaseLockFile() As String


' Esta função retorna uma lista de usuários que estão no arquivo de bloqueio (LDB) de um banco de dados Access.

' Informações fornecidas incluem:

' 1. Nome do computador

' 2. Nome de login do usuário

' 3. Se o usuário ainda está conectado

' 4. Estado suspeito da conexão do usuário (se foi desconectado de forma inesperada)


' Variáveis ADODB e DAO para manipulação de conexão e recordsets

Dim cn As New ADODB.Connection

Dim dbs As DAO.Database

Dim xlngLoop As Long

Dim rs As New ADODB.Recordset

Dim strNewDataSource As String, strCNString As String, xTT As String

Dim strCurrConnectString As String, xstrUserArray As String


' Constantes para nomes de tabelas e strings de conexão

Const strDummyTableName As String = "tbl__DummyTable_KeepRecordsetOpen"

Const strDatabaseString As String = "DATABASE="

Const strDataSourceText As String = "Data Source="

Const strPipeDelimiterChar As String = "|"


On Error GoTo Err_Msg ' Tratamento de erros


' Inicializa a variável para armazenar a lista de usuários

xstrUserArray = ""


' Obtém a string de conexão atual do projeto

strCurrConnectString = CurrentProject.Connection


' Extraindo o nome do arquivo do banco de dados da string de conexão

strCNString = Mid(strCurrConnectString, InStr(strCurrConnectString, strDataSourceText) + Len(strDataSourceText))

strCNString = Left(strCNString, InStr(strCNString, ";") - 1)


' Obtém o banco de dados atual e conecta-se a uma tabela "dummy"

Set dbs = CurrentDb

strNewDataSource = dbs.TableDefs(strDummyTableName).Connect

strNewDataSource = Mid(strNewDataSource, InStr(strNewDataSource, strDatabaseString) + Len(strDatabaseString))


Debug.Print "Arquivo contendo as tabelas de dados: " & strNewDataSource


' Atualiza a string de conexão para usar o caminho correto do arquivo de dados

cn.ConnectionString = Replace(strCurrConnectString, strCNString, strNewDataSource, 1, 1, vbTextCompare)

cn.Open ' Abre a conexão


' A função OpenSchema é usada para acessar o "User Roster", um esquema específico do Jet 4.0 OLE DB

Set rs = cn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")


' Exibe os nomes dos campos da tabela que serão retornados

Debug.Print rs.Fields(0).Name, "", rs.Fields(1).Name, "", rs.Fields(2).Name, rs.Fields(3).Name


' Loop para iterar sobre todos os registros (usuários) retornados

While Not rs.EOF

    Debug.Print rs.Fields(0), rs.Fields(1), rs.Fields(2), rs.Fields(3)


    ' Para cada campo da linha atual, armazena o valor no array de usuários

    For xlngLoop = 0 To 3

        xTT = Trim(Nz(rs.Fields(xlngLoop), "")) ' Remove espaços e nulos

        If Len(xTT) > 1 Then

            ' Remove caracteres nulos no final da string, se houver

            If Right(xTT, 1) = Chr(0) Then xTT = Left(xTT, Len(xTT) - 1)

        End If

        ' Concatena os valores usando um delimitador

        xstrUserArray = xstrUserArray & xTT & strPipeDelimiterChar

    Next xlngLoop


    rs.MoveNext ' Avança para o próximo registro

Wend


' Remove o último delimitador se existir

If Len(xstrUserArray) > 0 Then xstrUserArray = Left(xstrUserArray, Len(xstrUserArray) - 1)


' Retorna a string com os usuários

WhoIsInTheDatabaseLockFile = xstrUserArray


Exit_Function:

    On Error Resume Next

    rs.Close ' Fecha o recordset

    Set rs = Nothing

    cn.Close ' Fecha a conexão

    Set cn = Nothing

    dbs.Close ' Fecha o banco de dados

    Set dbs = Nothing

    Exit Function


Err_Msg:

    ' Em caso de erro, exibe a mensagem de erro no console de depuração

    Debug.Print "Ocorreu um erro. Número do erro " & Err.Number & ": " & Err.Description

    Resume Exit_Function


End Function


Além de fornecer informações detalhadas sobre o status de cada conexão, a função garante que as informações sejam apresentadas em um formato delimitado, ideal para auditoria ou análise posterior. Ela também lida com as nuances de tratamento de erros de forma robusta, garantindo que a função não falhe inesperadamente, mesmo se houver problemas durante a execução.


 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


Uma aplicação prática desse código seria em cenários onde o administrador do banco de dados precisa saber quem está bloqueando o banco de dados ou quem pode ter causado uma interrupção. Isso é importante, especialmente quando múltiplos usuários precisam realizar alterações e o bloqueio do banco pode prejudicar o andamento dos processos.


Por fim, a função demonstra uma abordagem sofisticada de uso do ADO e DAO no Access, combinando a manipulação de strings de conexão com o acesso a esquemas específicos do provedor OLE DB. Esse tipo de solução oferece uma visão clara e eficaz da infraestrutura de conectividade do banco de dados, permitindo ao administrador tomar ações mais informadas e garantir a disponibilidade contínua do sistema para todos os usuários.


  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