Avatar billede tinam Nybegynder
06. januar 2002 - 12:14 Der er 7 kommentarer

automatisk sammenkædning

Jeg skal have tabeller sammenkædet ved opstart af programmet.
Jeg har forsøgt mig frem, ved hjælp af makro, men det er ikke godt nok.
Det skal være så når man åbner programmet, skal tabellerne automatisk sammenkædes, uden nogen form for manuel hjælp.
Hvordan gør jeg det??????
06. januar 2002 - 12:22 #1
i flg. The Accessweb, kan følgende kode klare problemet:

Koden kræver en reference til DAO (hvis du bruger Access 97 er den der i forvejen)

\'***************** Code Start ***************
Function fRefreshLinks() As Boolean
Dim strMsg As String, collTbls As Collection
Dim i As Integer, strDBPath As String, strTbl As String
Dim dbCurr As DATABASE, dbLink As DATABASE
Dim tdfLocal As TableDef
Dim varRet As Variant
Dim strNewPath As String

Const cERR_USERCANCEL = vbObjectError + 1000
Const cERR_NOREMOTETABLE = vbObjectError + 2000

    On Local Error GoTo fRefreshLinks_Err

    If MsgBox(\"Are you sure you want to reconnect all Access tables?\", _
            vbQuestion + vbYesNo, \"Please confirm...\") = vbNo Then Err.Raise
cERR_USERCANCEL

    \'First get all linked tables in a collection
    Set collTbls = fGetLinkedTables

    \'now link all of them
    Set dbCurr = CurrentDb

  strMsg = \"Do you wish to specify a different path for the Access Tables?\"
If MsgBox(strMsg, vbQuestion + vbYesNo, \"Alternate data source...\") = vbYes
Then  strNewPath = fGetMDBName(\"Please select a new datasource\")  Else
strNewPath = vbNullString  End If

    For i = collTbls.Count To 1 Step -1
        strDBPath = fParsePath(collTbls(i))
        strTbl = fParseTable(collTbls(i))
        varRet = SysCmd(acSysCmdSetStatus, \"Now linking \'\" & strTbl & \"\'....\")
        If Left$(strDBPath, 4) = \"ODBC\" Then
            \'ODBC Tables
            \'ODBC Tables handled separately
          \' Set tdfLocal = dbCurr.TableDefs(strTbl)
          \' With tdfLocal
          \'    .Connect = pcCONNECT
          \'    .RefreshLink
          \'    collTbls.Remove (strTbl)
          \' End With
        Else
            If strNewPath <> vbNullString Then
                \'Try this first
                strDBPath = strNewPath
            Else
                If Len(Dir(strDBPath)) = 0 Then
                    \'File Doesn\'t Exist, call GetOpenFileName
                    strDBPath = fGetMDBName(\"\'\" & strDBPath & \"\' not found.\")
                    If strDBPath = vbNullString Then
                        \'user pressed cancel
                        Err.Raise cERR_USERCANCEL
                    End If
                End If
            End If

            \'backend database exists
            \'putting it here since we could have
            \'tables from multiple sources
            Set dbLink = DBEngine(0).OpenDatabase(strDBPath)

            \'check to see if the table is present in dbLink
            strTbl = fParseTable(collTbls(i))
            If fIsRemoteTable(dbLink, strTbl) Then
                \'everything\'s ok, reconnect
                Set tdfLocal = dbCurr.TableDefs(strTbl)
                With tdfLocal
                    .Connect = \";Database=\" & strDBPath
                    .RefreshLink
                    collTbls.Remove (.Name)
                End With
            Else
                Err.Raise cERR_NOREMOTETABLE
            End If
        End If
    Next
    fRefreshLinks = True
    varRet = SysCmd(acSysCmdClearStatus)
    MsgBox \"All Access tables were successfully reconnected.\", vbInformation +
vbOKOnly, \"Success\"
fRefreshLinks_End:
    Set collTbls = Nothing
    Set tdfLocal = Nothing
    Set dbLink = Nothing
    Set dbCurr = Nothing
    Exit Function
fRefreshLinks_Err:
    fRefreshLinks = False
    Select Case Err
        Case 3059:

        Case cERR_USERCANCEL:
            MsgBox \"No Database was specified, couldn\'t link tables.\", _
                    vbCritical + vbOKOnly, _
                    \"Error in refreshing links.\"
            Resume fRefreshLinks_End
        Case cERR_NOREMOTETABLE:
            MsgBox \"Table \'\" & strTbl & \"\' was not found in the database\" & _
                    vbCrLf & dbLink.Name & \". Couldn\'t refresh links\", _
                    vbCritical + vbOKOnly, _
                    \"Error in refreshing links.\"
            Resume fRefreshLinks_End
        Case Else:
            strMsg = \"Error Information...\" & vbCrLf & vbCrLf
            strMsg = strMsg & \"Function: fRefreshLinks\" & vbCrLf
            strMsg = strMsg & \"Description: \" & Err.Description & vbCrLf
            strMsg = strMsg & \"Error #: \" & Format$(Err.Number) & vbCrLf
            MsgBox strMsg, vbOKOnly + vbCritical, \"Error\"
            Resume fRefreshLinks_End
    End Select
End Function

Function fIsRemoteTable(dbRemote As DATABASE, strTbl As String) As Boolean
Dim tdf As TableDef
    On Error Resume Next
    Set tdf = dbRemote.TableDefs(strTbl)
    fIsRemoteTable = (Err = 0)
    Set tdf = Nothing
End Function

Function fGetMDBName(strIn As String) As String
\'Calls GetOpenFileName dialog
Dim strFilter As String

    strFilter = ahtAddFilterItem(strFilter, _
                    \"Access Database(*.mdb;*.mda;*.mde;*.mdw) \", _
                    \"*.mdb; *.mda; *.mde; *.mdw\")
    strFilter = ahtAddFilterItem(strFilter, _
                    \"All Files (*.*)\", _
                    \"*.*\")

    fGetMDBName = ahtCommonFileOpenSave(Filter:=strFilter, _
                                OpenFile:=True, _
                                DialogTitle:=strIn, _
                                Flags:=ahtOFN_HIDEREADONLY)
End Function

Function fGetLinkedTables() As Collection
\'Returns all linked tables
    Dim collTables As New Collection
    Dim tdf As TableDef, db As DATABASE
    Set db = CurrentDb
    db.TableDefs.Refresh
    For Each tdf In db.TableDefs
        With tdf
            If Len(.Connect) > 0 Then
                If Left$(.Connect, 4) = \"ODBC\" Then
                \'    collTables.Add Item:=.Name & \";\" & .Connect, KEY:=.Name
                \'ODBC Reconnect handled separately
                Else
                    collTables.Add Item:=.Name & .Connect, KEY:=.Name
                End If
            End If
        End With
    Next
    Set fGetLinkedTables = collTables
    Set collTables = Nothing
    Set tdf = Nothing
    Set db = Nothing
End Function

Function fParsePath(strIn As String) As String
    If Left$(strIn, 4) <> \"ODBC\" Then
        fParsePath = Right(strIn, Len(strIn) _
                        - (InStr(1, strIn, \"DATABASE=\") + 8))
    Else
        fParsePath = strIn
    End If
End Function

Function fParseTable(strIn As String) As String
    fParseTable = Left$(strIn, InStr(1, strIn, \";\") - 1)
End Function
\'***************** Code End ***************





06. januar 2002 - 12:26 #2
(...fortsat)

Du bør så nok have en kode, som kaldes med Autoexec, som checker om der er forbindelse eller ej.

Denne kode kunne blot prøve at åbne en tabel - hvis den fejler, er der ingen forbindelse og fRefreshLinks skal kaldes.

Eks:

Public Function Opstart()
  On Error resume next
  Dim rs as DAO.Recordset
  Set rs = Currendb.Openrecordset(\"En af dine linkede tabeller\")
  If Err then call fRefreshLinks 
  rs.close
  Set rs = Nothing
End function
06. januar 2002 - 12:30 #3
Her er et link\'et, hvor jeg fandt koden.

Du skal vist også have den funktion, som hedder ahtCommonFileOpenSave. Der er link til den også på dette link: http://www.mvps.org/access/tables/tbl0009.htm

/Thomas

PS: Det ser måske lidt uoverskueligt ud, men der er desværre ikke nogen \'easy way\'
Avatar billede frankhove Nybegynder
07. januar 2002 - 11:20 #4
Hvis dine tabeller ligger i samme database, kan du oprette en UNION-query.
Det forudsættes dog , at data er de samme i alle tabeller.

Syntaksen er fx.

Select * from Tabel1
UNION
Select * from Tabel2
osv.

Avatar billede sblar Nybegynder
16. januar 2002 - 15:42 #5
Der er en lidt mere \'easy way\', men du må lige forklare lidt mere. Hvad er det for tabeller der skal sammenkædes, er det fra en ny back-end, skal brugeren selv vælge stien til back-end. (hvis det er de samme data hver gang sker det jo helt af sig selv!).
Avatar billede tinam Nybegynder
26. februar 2002 - 11:25 #6
jeg fandt selv løsningen. Undskyld ventetiden
28. september 2004 - 22:04 #7
tinam, lukker du ikke spm?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester