Inquiridor
Linked Table via codigo.

Pergunta
-
Como eu faço para setar o caminho de uma linked table via codigo ?
Grato,
terça-feira, 23 de janeiro de 2007 18:33
Todas as Respostas
-
Olá Eduardo segue ai um presente, uma funcao prontinha para usar.
Rubens Caxilé
RR Sistemas
Function AtualizaVinculos()
On Error GoTo Err_AtualizaVinculos' Atualiza vínculos ao banco de dados fornecido. Retorna True se bem sucedida.
Dim dbs As Database
Dim intCont As Integer
Dim Tdf As TableDef
Dim ValRetorno As Variant' Loop através de todas as tabelas do banco de dados.
ValRetorno = SysCmd(SYSCMD_REMOVEMETER)
DoCmd.Hourglass True
ValRetorno = SysCmd(SYSCMD_INITMETER, "Localizando base de dados ...", 100)
Set dbs = CurrentDb()
ValRetorno = SysCmd(SYSCMD_UPDATEMETER, 100)
ValRetorno = SysCmd(acSysCmdInitMeter, "Carregando Empresa ...", dbs.TableDefs.Count)
For intCont = 0 To dbs.TableDefs.Count - 1
Set Tdf = dbs.TableDefs(intCont)' Se a tabela tem uma seqüência de conexão, é uma tabela vinculada.
If Tdf.Attributes = dbAttachedTable Then
ValRetorno = SysCmd(acSysCmdInitMeter, Tdf.Name, dbs.TableDefs.Count)
Tdf.Connect = "MS Access;PWD=XXXXXXXXX;DATABASE=" & [CT_NomeBancoDados]
Tdf.RefreshLink ' Revincula a tabela.
ValRetorno = SysCmd(SYSCMD_UPDATEMETER, (dbs.TableDefs.Count / (dbs.TableDefs.Count - intCont)))
End If
ValRetorno = SysCmd(SYSCMD_UPDATEMETER, intCont)
Next intContValRetorno = SysCmd(SYSCMD_UPDATEMETER, 100)
ValRetorno = SysCmd(SYSCMD_REMOVEMETER)
DoCmd.Hourglass FalseExit_AtualizaVinculos:
DoCmd.Hourglass False
Exit Function
Err_AtualizaVinculos:Call MsgBox("Tabela abaixo informada não existe no Banco de Dados." & vbNewLine & vbNewLine & _
"Registrar o nome da mesma e informar ao Suporte." & vbNewLine & vbNewLine & _
"Tabela: " & Tdf.Name & vbNewLine & vbNewLine & _
"Erro: " & Err.Number & " - " & Err.Description, vbCritical, Form.Name)
Resume Next
ResumeEnd Function
quarta-feira, 24 de janeiro de 2007 09:20 -
Joia a acho que entendi a função.
Mas eu estou com alguns problemas aqui, certa vez eu precisei me referenciar a alguns campos de minhas tabelas e tentei usar um recordset, e no entando ele dava um este erro:
Compile Error:
Expected user-defined type, not project.
minhas referencias estão assim:
Visual basic for aplications
Ms access 11.0
Ms Forms 2.0
Ms DAO 3.6
Ms Shell controls and Automation
Eu colei sua função em um form e e chamei ela no form_load.
O que eu estou fazendo de errado ?
Não tem algum comando que eu possa setar deste modo ?
LinkedTable1.path = CurrentProject.path & "\"
quarta-feira, 24 de janeiro de 2007 10:11 -
As ref estao corretas, basta colocar para cima o DAO 3.6.
Vc pode usar o comando que está dentro da função.
para fazer um link sem o loop.
quarta-feira, 24 de janeiro de 2007 21:25 -
Option Compare Database
Dim stDocName, stLinkCriteria As String
Public Usr As String
Public Lvl As Byte
Private Sub btnlog_Click()
' LOGIN ****************UsrId = DLookup("[usr_id]", "Cad_Usr", "[usr_id]='" & Me.txtlog & "'")
UsrPas = DLookup("[usr_pass]", "Cad_Usr", "[usr_pass]='" & Me.txtpass & "'")
UsrNam = DLookup("[usr_name]", "Cad_Usr", "[usr_id]='" & Me.txtlog & "'")If UsrId = Me.txtlog And UsrPas = Me.txtpass Then
Usr = UsrNam
Lvl = DLookup("[usr_status]", "Cad_Usr", "[usr_id]='" & Me.txtlog & "'")
Me.txtpass = ""
stDocName = "Logged"
DoCmd.OpenForm stDocName, , , stLinkCriteria
ElseMe.txtpass = ""
stDocName = "Login"
DoCmd.OpenForm stDocName, , , stLinkCriteria
If IsNull(DLookup("[usr_id]", "Cad_Usr", "[usr_id]='" & Me.txtlog & "'")) = True Then
MsgBox "User does not exist.", vbCritical, "Login"
Else
MsgBox "Incorrect User or Password.", vbExclamation, "Warning"
End IfEnd If
End Sub
Private Sub Form_Load()
Me.Moveable = False
AtualizaVinculos
End Sub
Private Sub lblcan_Click()
' CANCELMe.txtlog = ""
Me.txtpass = ""
Me.txtlog.SetFocusEnd Sub
Private Sub txtlog_KeyDown(ByVal KeyCode As Object, ByVal Shift As Integer)
' TAB FUNCTION IN USERNAME BOXIf KeyCode = "9" Then
Me.txtpass.SetFocus
End IfEnd Sub
Private Sub txtpass_KeyDown(ByVal KeyCode As Object, ByVal Shift As Integer)
' ENTER FUNCTION IN USERNAME BOXIf KeyCode = "13" Then
Call btnlog_Click
End IfEnd Sub
Function AtualizaVinculos()
On Error GoTo Err_AtualizaVinculos' Atualiza vínculos ao banco de dados fornecido. Retorna True se bem sucedida.
Dim dbs As Database
Dim intCont As Integer
Dim Tdf As TableDef
Dim ValRetorno As Variant' Loop através de todas as tabelas do banco de dados.
ValRetorno = SysCmd(SYSCMD_REMOVEMETER)
DoCmd.Hourglass True
ValRetorno = SysCmd(SYSCMD_INITMETER, "Localizando base de dados ...", 100)
Set dbs = CurrentDb()
ValRetorno = SysCmd(SYSCMD_UPDATEMETER, 100)
ValRetorno = SysCmd(acSysCmdInitMeter, "Carregando Empresa ...", dbs.TableDefs.Count)
For intCont = 0 To dbs.TableDefs.Count - 1
Set Tdf = dbs.TableDefs(intCont)' Se a tabela tem uma seqüência de conexão, é uma tabela vinculada.
If Tdf.Attributes = dbAttachedTable Then
ValRetorno = SysCmd(acSysCmdInitMeter, Tdf.Name, dbs.TableDefs.Count)
Tdf.Connect = "MS Access;PWD=XXXXXXXXX;DATABASE=" & [Database_Backup]
Tdf.RefreshLink ' Revincula a tabela.
ValRetorno = SysCmd(SYSCMD_UPDATEMETER, (dbs.TableDefs.Count / (dbs.TableDefs.Count - intCont)))
End If
ValRetorno = SysCmd(SYSCMD_UPDATEMETER, intCont)
Next intContValRetorno = SysCmd(SYSCMD_UPDATEMETER, 100)
ValRetorno = SysCmd(SYSCMD_REMOVEMETER)
DoCmd.Hourglass FalseExit_AtualizaVinculos:
DoCmd.Hourglass False
Exit Function
Err_AtualizaVinculos:Call MsgBox("Tabela abaixo informada não existe no Banco de Dados." & vbNewLine & vbNewLine & _
"Registrar o nome da mesma e informar ao Suporte." & vbNewLine & vbNewLine & _
"Tabela: " & Tdf.Name & vbNewLine & vbNewLine & _
"Erro: " & Err.Number & " - " & Err.Description, vbCritical, Form.Name)
Resume Next
ResumeEnd Function
Esse é meu codigo do formulário de login.
o que tem de errado ? o erro persiste, eu passei o DAO3.6 pra cima.
quinta-feira, 25 de janeiro de 2007 10:29 -
Eduardo boa noite,
acredito que vc não observou que os dados na linha abaixo vc tem que substituir
Tdf.Connect = "MS Access;PWD=XXXXXXXXX;DATABASE=" & [Database_Backup]
sexta-feira, 26 de janeiro de 2007 08:17 -
Compile Error:
Expected user-defined type, not project.
Mesmo alterando estes dados este erro continua. Este erro se não me engano é por falta da referencia. mas o DAO 3.6 está lá ! O pior é que eu não tenho nem ideia mais do que possa ser.
Essa função eu tenho que jogar dentro de um form ou tem que criar um modulo ?
sexta-feira, 26 de janeiro de 2007 10:05 -
Eduardo,
acho que alguma função pública de seus módulos está com o mesmo nome do aplicativo (ou seja, função com o mesmo nome do projeto VBA). Mude o nome da aplicação e veja se resolve.
sexta-feira, 26 de janeiro de 2007 23:18Moderador -
Bom dia Eduardo,
Esta função vc coloca no form mesmo, crie um mdb separado crie um form com um Botao para executar a funcao ao click,
anexe algumas tabelas neste novo banco e teste a mesma.
Qdo dar o erro de compilacao em que instrução o DEBUG fica para. (tarja amarela).
Rubens Caxilé
RR Sistemas
sábado, 27 de janeiro de 2007 11:46 -
Seguinte, desta maneira não está dando certo. Então desenvolvi uma outra meneira e gostaria de saber a opinião de vocês que com certeza tem muito mais experiencia do que eu.
O fato é o seguinte, desenvolvi uma aplicação com layout de web para a empresa. Porem está empresa onde trabalho tem muitas unidade no mundo inteiro e todas vão ter acesso ao dominio na rede na qual vai estar está aplicação.
Minha ideia foi a seguinte, coloquei somente as "worksheets" que são atualizadas manualmente por cada unidade( china, brazil, eua, etc ) e quem for usar essa aplicação deverá copia-la para a maquina e executar a partir dela.
Qual foi o problema novo que surgiu ?
Eu não sei a unidade de rede que estará mapeada em cada maquina, foi então que usei tal comando.
Shell "NET USE /delete t:" ' Para garantir a unidade livre
Shell "NET USE t: \\domain\group" ' mapeio a unidade livre
E quando faz logoff ele dá um unmap : Shell "net use /delete t:" para não substituir a unidade mapeada se já existir em alguma outra unidade.
Eu gostaria de saber como eu faço para dar um "unmap" quando o usuario simplismente fechar o access, sem fazer logoff ? Eu já tentei colocar no "deactivate" de um form, mas não deu.
Outra coisa, como eu faço para fechar um form ? Quando o user clicar em uma label ele fecha o form atual e abre outro.
Risco que eu já tenho conhecimento mas não vão acontecer:
- O usuário possuir uma unidade fisica mapeada na letra t.
O que vcs acham ?
Grato,
Eduardo Monteiro
segunda-feira, 29 de janeiro de 2007 16:49