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??????
Med version 7 af TeamShare tager Lector næste skridt og bygger en platform for AI-agenter, der i højere grad kan følge medarbejderen gennem hele arbejdsprocessen.
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
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
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 ***************
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
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!).
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.