Far from being some stuffy science, writing regular expressions is closer to an art.
Ja, die is er 
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).
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).
Duidelijk en werkend gekregen.
Maar nu:
Het aantal gekoppelde tabellen is ongeveer 30.
Hierdoor wordt de onderstaande code zo'n 30x aangeroepen
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:
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...
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.
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.
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.
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.