[Access 2000] Controle op gekoppelde tabellen

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

  • J.Hollemans
  • Registratie: September 2001
  • Laatst online: 03-10-2025
Ik heb een gesplitste database:
een .mdb bestand met alleen tabellen en een .mdb
bestand met de GUI (alle queries, forms, etc...)

de "GUI" database heeft dus een aantal tabellen die gekoppeld
zijn aan de eerste database. Wanneer deze database wordt
verplaatst kan hij de (gekoppelde) tabellen niet meer vinden.
(logisch)

Nu wil ik een macro schrijven, die controleert of de database
op z'n plek staat en zo niet, moet gevraagd worden waar
de database dan wel staat.

Vervolgens kan ik dan met de opdrachten "ObjectVerwijderen" en "DatabaseOverbrengen" de tabellen opnieuw koppellen.

of is hier ook een makkelijkere manier voor ?

Far from being some stuffy science, writing regular expressions is closer to an art.


  • 3volution
  • Registratie: September 2001
  • Niet online

3volution

tsja...

Ja, die is er ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'strBackend wordt als ByVal meegegeven en bevat 
'de lokatie van de back-end.

  Dim dbs    As DAO.Database
  Dim tdf    As DAO.TableDef
  
  Set dbs = CurrentDB
  For Each tdf In dbs.TableDefs
    If InStr(1, tdf.Connect, ";DATABASE") > 0 Then
    tdf.Connect = ";DATABASE=" & strBackEnd
    tdf.RefreshLink
    End If
  Next
  dbs.TableDefs.Refresh
  dbs.close

  set tdf = Nothing
  set dbs = Nothing

Als er 'DATABASE in de Connect-string staat, gaat het om een koppeling met een Access-database. (bij ODBC en SQL tabellen/databases staat er wat anders).

  • J.Hollemans
  • Registratie: September 2001
  • Laatst online: 03-10-2025
Duidelijk en werkend gekregen.

Maar nu:
Het aantal gekoppelde tabellen is ongeveer 30.
Hierdoor wordt de onderstaande code zo'n 30x aangeroepen
code:
1
tdf.RefreshLink

dat is nogal erg traag (over een netwerk in dit geval).

Hoe kan ik controleren of een gekoppelde tabel wel of niet
goed gekoppeld is ?

Ik bedoel dan zoiets:
code:
1
2
3
4
5
6
For Each tdf in CurrentDB.TableDefs
  If tdf.Attributes = dbAttachedTable ;) AND KOPPELLING BESTAAT NIET Then
    tdf.Connect = ";DATABASE=" & strBackEnd
    tdf.RefreshLink
  End If
Next

mijn vraag is dus:
wat is de code voor KOPPELLING BESTAAT NIET ?

Het kan dus zijn, dat de gekoppelde database (.mdb) wel bestaat, maar een bepaalde tabel niet...

Far from being some stuffy science, writing regular expressions is closer to an art.


  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Een controle of een koppeling bestaat of niet is zelfs niet voldoende, je moet controleren of de koppeling ook naar de juiste data-database wijst.
Als je bijvoorbeeld een KOPIE van de databases maakt naar een andere directory van bijv. C:\DATA naar D:\DATA dan bestaan de koppelingen in de programma database in D:\DATA nog maar ze verwijzen wel naar de data/backend database in C:\DATA.

Ik zou het zo doen:
In het begin van je functie maak je alvast de gewenste connectiestring
Van een geconnecte tabel vergelijk je de connectiestring met de gewenste connectiestring en als ie verschilt dan moet de link ververst worden.
code:
1
2
3
4
5
6
7
strConnectNieuw = ";DATABASE=" & UCase$(strBackEnd)
For Each tdf in CurrentDB.TableDefs
  If (tdf.Attributes = dbAttachedTable) AND (UCase$(tdf.Connect) <> strConnectNieuw) Then
    tdf.Connect = strConnectNieuw
    tdf.RefreshLink
  End If
Next

Dit zou moeten werken, alleen kan het voorkomen dat ze nog onnodig ververst worden als je met korte padnamen werkt of met drive-mappings maar daar heb ik zelf ook nog nooit echt een goede oplossing voor gevonden.