Queridos Amigos, há anos eu utilizo um código que re-vincula as tabelas de um backend de forma automática. Nunca tive problemas com esse código, contudo num de meus aplicativos ao renomear o BackEnd ou move-lo de lugar o sistema inicia a re-vinculação automática ao mesmo tempo que surge uma mensagem "O formulário Principal não existe". Isso já me torrou algumas centenas de milhares de neurônios e não consigo verificar o que deve estar ocorrendo.
Devo dizer que este aplicativo funcionava perfeitamente bem até há uns três dias atrás.
O código a que me refiro é este:
Option Compare Database
Option Explicit
Public CaminhoAtual As String
Public booNovaChecagem As Boolean
Public booOk As Boolean
Public booSair As Boolean
Public Function fncChecaVinculo() As Boolean
Dim PathBe As String
Dim NomeBE As String
Dim Contador As Byte
Dim box As String
On Error GoTo TrataErro
'------------------------------------------------------
'Passa o caminho e o nome do back-end para as variáveis
'------------------------------------------------------
PathBe = Nz(DLookup("path_0", "tblCaminhoBe"), "vazio")
NomeBE = Nz(DLookup("NomeBe", "tblCaminhoBe"), "vazio")
'-----------------------------------------------------------------
'Verifica se o nome do back-end se encontra na tabela tblcaminhoBe
'-----------------------------------------------------------------
If NomeBE = "vazio" Then
MsgBox "Entre com o nome do back-end no campo NomeBE da tabela tblCaminhoBe...", vbCritical, "Aviso"
fncChecaVinculo = True
Exit Function
End If
'---------------------------------------------------------------------------
'Verifica se o caminho atual do back-end esta gravado na tabela tblCaminhoBe
'---------------------------------------------------------------------------
If PathBe = "vazio" Then
CurrentDb.Execute "UPDATE tblCaminhoBe SET path_0 ='" & CurrentProject.path & "\" & NomeBE & "'"
PathBe = CurrentProject.path & "\" & NomeBE
End If
'-------------------------------------------------------------------------------------
'Passa o caminho do back-end, que está gravado no vínculo das tabelas, para a variável
'-------------------------------------------------------------------------------------
CaminhoAtual = fncBackEndAtual
'-----------------------------------------------
'Verifica se o back-end existe no local indicado
'-----------------------------------------------
If Len(Dir(PathBe) & "") > 0 Then
'----------------------------------------------------
'Verifica se o local atual do back-end corresponde
'ao local gravado no vínculo. caso não corresponda,
'abre a barra de progresso para refazer os vinculos
'----------------------------------------------------
If CaminhoAtual <> PathBe Then
CaminhoAtual = PathBe
DoCmd.Close acForm, "frmLogin"
DoCmd.OpenForm "frmBarraProgresso", OpenArgs:=1
Else
If Len(Trim(DLookup("formPrincipal", "tblCaminhoBe")) & "") > 0 Then
DoCmd.OpenForm DLookup("formPrincipal", "tblCaminhoBe")
End If
End If
Else
'----------------------------------------------------------------
'Abre o formulário para indicar a nova localização do back-end
'----------------------------------------------------------------
DoCmd.OpenForm "frmCaminhoBe", , , , , acDialog, 1
If booSair = True Then
fncChecaVinculo = True
Exit Function
End If
If booNovaChecagem Then fncChecaVinculo
End If
Sair:
Exit Function
TrataErro:
Select Case err.Number
Case 76, 52
DoCmd.OpenForm "frmCaminhoBe", , , , , acDialog, 1
Case 2102
MsgBox "O formulário principal '" & DLookup("formPrincipal", "tblCaminhoBe") & "' não existe...", vbInformation, "Aviso"
fncChecaVinculo = True
Case Else
MsgBox "Erro: " & err.Number & vbCrLf & err.Description, vbCritical, "Aviso", err.Helpfile, err.HelpContext
fncChecaVinculo = True
End Select
End Function
Private Function fncBackEndAtual() As String
Dim strCon As String
Dim strTabelaLink As String
Dim tbl As DAO.TableDef
On Error GoTo TrataErro
'-----------------------------------------------
'capturando o nome da última tabela vinculada
'-----------------------------------------------
For Each tbl In CurrentDb.TableDefs
If Len(tbl.Connect & "") > 0 Then strTabelaLink = tbl.Name
Next
'-----------------------------------------------------
'Passando o caminho do vínculo para a variável
'-----------------------------------------------------
strCon = CurrentDb.TableDefs(strTabelaLink).Connect
'-----------------------------------------------------
'Agora vou retirar apenas o caminho do accdb,
'sem o ";DATABASE=" que o precede na string Connect.
'-----------------------------------------------------
fncBackEndAtual = right$(strCon, (Len(strCon) - (InStr(1, strCon, ";DATABASE=", 2) + 9)))
Sair:
Exit Function
TrataErro:
MsgBox "Erro: " & err.Number & vbCrLf & err.Description, vbCritical, "Aviso", err.Helpfile, err.HelpContext
Resume Sair:
End Function
Devo informar ainda que utilizo este código em diversos outros aplicativos e em todos os outros funciona de forma perfeita, e mais, estou utilizando o Access 2003, e a bem da verdade, em nenhum dos demais aplicativos, e inclusive neste, não existe algum formulário denominado Principal.
Aguardo alguma ideia dos Mestres.
Abraços, WSenna