locked
Linked Table via codigo. RRS feed

  • 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 intCont

        ValRetorno = SysCmd(SYSCMD_UPDATEMETER, 100)
       
        ValRetorno = SysCmd(SYSCMD_REMOVEMETER)
       
        DoCmd.Hourglass False

    Exit_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
        Resume

    End 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
       
    Else

        Me.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 If

    End If

    End Sub

    Private Sub Form_Load()

    Me.Moveable = False

    AtualizaVinculos

    End Sub

    Private Sub lblcan_Click()
    ' CANCEL

    Me.txtlog = ""
    Me.txtpass = ""
    Me.txtlog.SetFocus

    End Sub

    Private Sub txtlog_KeyDown(ByVal KeyCode As Object, ByVal Shift As Integer)
    ' TAB FUNCTION IN USERNAME BOX

    If KeyCode = "9" Then
        Me.txtpass.SetFocus
    End If

    End Sub

    Private Sub txtpass_KeyDown(ByVal KeyCode As Object, ByVal Shift As Integer)
    ' ENTER FUNCTION IN USERNAME BOX

    If KeyCode = "13" Then
        Call btnlog_Click
    End If

    End 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 intCont

        ValRetorno = SysCmd(SYSCMD_UPDATEMETER, 100)
       
        ValRetorno = SysCmd(SYSCMD_REMOVEMETER)
       
        DoCmd.Hourglass False

    Exit_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
        Resume

    End 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:18
    Moderador
  •  

    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