PDA

Vollständige Version anzeigen : Tabellen flexibel verknüpfen


Diego
03.05.2001, 07:07
Hallo
In meiner Datenbank hab ich die Tabellen ausgelagert und mit Datei - Externe Daten - Tabellen verknüpfen verbunden. Nun ist es so, dass das Laufwerk nicht bei allen Usern gleich ist. Bei einigen ist es das h:\... und bei den anderen das k:\...

Ist es möglich, das flexibel zu lösen? Jetzt ist es so, dass eine Gruppe immer einen Fehler erhält, dass das Laufwerk mit den Daten ungültig sei.

Besten Dank für Eure Tipps!

Gruss Diego

Alexander Jan Peters
03.05.2001, 07:15
<font color="#000000" size="2" face="Tahoma">Hallo,

das erfordert eine Prüfung der Verknüpfung beim Datenbankstart wie in <a href="http://www.donkarl.com/FAQ/FAQ3TAbfragen.htm#3.1">3.1 TABELLEN WIEDER EINBINDEN</a> erläutert.
Bin mir zwar nicht sicher, aber geht es nicht auch, wenn Du den UNC-Pfad (\\...) beim Verknüpfen verwendest?


Gruß

A.J. Peters

Empfehlenswerte Links:
<a href="http://www.donkarl.com">Access FAQ von Karl Donaubauer</a>
<a href="http://www.access-paradies.de/Links.htm">Access-Paradies Links</a></font>

FPietsch
03.05.2001, 07:32
Guten Morgen,

ich habe dazu 2 Möglichkeiten:

1. Beim Start der Anwendung suchst du über FileSearch deine Daten-Datenbank und bindest dann die Tabellen ein (TransferDatabase und A_ATTACH...). Das FileSearch dauert (auf meinem Rechner) etwas zu lange. Deshalb die

2. Möglichkeit:

Du richtest in der FrontEnd eine Tabelle (ich nenn die KONFIGURATION) ein, in die schreibst du bei der Erstinstallation den Pfad der Backend-DB.
Bei jedem Start der FE überprüfst du die Einbindung. In meinen Anwendungen lösche ich alle eingebundenen Tabellen (am einfachsten frägt man die Systemtabelle: MSYSObjects das Feld: Type = 6 ab) und binde die Tabellen über den ausgelesenen Pfad der Koonfiguration neu ein. Das klappt ganz ausgezeichnet und geht sehr schnell.

Gruß

f.p.

Diego
03.05.2001, 07:49
Hallo A.J.
Das mit dem UNC-Pfad (\\...) wär natürlich gut, da müsste sich der Benutzer nicht drum kümmern. Aber wie kann ich dem System sagen, dass es diesen Pfad nehmen soll? Kann man das irgendwo angeben?

Gruss Diego

marmic55
03.05.2001, 07:52
Hallo Diego,

ich könnte hier eine Teillösung anbieten, zu der aber noch ein Klassenmodul "FileDialog" (ComminDialog API) von Karsten Pries erforderlich ist.
Beim ersten Formular/Modul pp., bei dem DATEN aus der Tabelle angefordert werden, wird ein Fehler erzeugt, sofern die Tabellenverknüpfung nicht korrekt ist (Daten werden nicht gefunden).
Nach einer Meldung an den User wird in eine Funktion gesprungen, die erine Dialogbox öffnet, in der die Tabellen gesucht und selektiert werden. Diese werden dann neu eingebunden.
Stopp: Die bestehenden Verknüpfungen werden aktualisiert.
Anschließend wird je nach Struktur der Datenbank (autoexec) alles zurückgesetzt; der Start beginnt von vorne.

Ich könnte bei Interesse diese Fehlerroutine, das Aufrufen der Dialogbox pp. (also den gesamten Ablauf) ab heute Abend zur Verfügung stellen in Form einer "db1.mdb".
Oder Du nimmst den Vorschlag mit der Tabelle an, das funktioniert auch.

Ab hier mal die Funktionen, die den Ablauf steuern (wie gesagt, das Klassenmodul kann ic´h hier nicht reinstellen (zu lang):

Nachfolgend die Fehleroutine im ersten Modul / Formular pp.,
in dem Daten angefordert werden.

'=============================================================
Fehler_erstanmeldung:
If err = 3024 Then
Beep
MsgBox "Es müssen zuerst die Tabellen neu eingebunden werden !"
PfadEinbinden
End If
' ==============================================================

' Ab hier jetzt ein neues Modul (beachte Deklarationsteil !


==========================================================
Option Compare Database
Option Explicit
Dim fd As New FileDialog
Dim strFehlertext As String


Function Tabelle_einbinden(Dateiname As String)
On Error GoTo Tabelle_einbinden_ERR
Dim db As Database
Dim i As Integer
Set db = CurrentDb


For i = 0 To db.TableDefs.count - 1
On Error GoTo fehler1 ' warum das so ist, bleibt mir ein Rätsel. Der Sprung in die
' normale Fehlerbehandlungsroutine ergibt stets den Fehler "0"
' hierzu müsste man sich ggf. mit diesem Thema näher auseinandersetzen
' vielleicht hat auch jemand eine Erklärung hierfür
If (db.TableDefs(i).Attributes And dbAttachedTable) Then
db.TableDefs(i).Connect = ";Connect=MS Access;DATABASE=" & Dateiname
db.TableDefs(i).RefreshLink ' ein Passwort kann hier mit übergeben werden (dann aber MDE erstellen!)
End If
Next i

Tabelle_einbinden_EXIT:
Exit Function

Tabelle_einbinden_ERR:
' hier kann nicht auf Fehler in Schleife reagiert werden ?!
Select Case err.Number
Case Else
MsgBox err.Number & " Fehler - (Prozedur 'Tabelle_einbinden') " & err.Description & "(" & err.Number & ")"
Resume Tabelle_einbinden_EXIT
End Select

fehler1:
If err = 3011 Then ' verknüpfte Tabelle ist in Daten-Datenbank nicht vorhanden !!
Beep
Dim strFehler As String
strFehler = err & "Die Datenbank würde jetzt folgenden Fehler anzeigen:@@" & err.Description & vbCrLf & vbCrLf & _
"=====================" & vbCrLf & "Hier ist eine Tabelle verknüpft, die in der Original-Datenbank " & _
"nicht vorhanden ist !!! Bitte prüfen! " & Dateiname
MsgBox strFehler
Resume Next
Else
MsgBox "Unbekannter Fehler ! (" & err & ")"
End If

End Function
Function PfadEinbinden()
On Error GoTo PfadEinbinden_ERR
' Hier wird Dialogbox geöffnet. Anwender sucht Datei.
' ü. Dialog-Formular wird u. g. Datei gesucht u. ausgelesen.
' Anschließénd wird vorhergehende Funktion aufgerufen


' If CurrentUser <> "Verwalter" Then
' Beep
' MsgBox "Keine Berechtigung !", vbCritical + vbOKOnly, "Tabellen einbinden"
' Exit Function
' End If

Dim fd As New FileDialog
Dim Dateiname As String

With fd
.DialogTitle = "Daten einbinden"
.DefaultExt = "Datenbank.mdb" 'Standard-Endung wenn vom Benutzer nix anderes angegeben
.DefaultDir = "" ' bewirkt, dass Name im Fenster nicht vorgegeben ist und
' Anwender den Namen in Dialogbox suchen u. anklickenb muss
.DefaultFileName = "Datenbank.mdb"
.Filter1Text = "Datenbank.mdb"
.Filter1Suffix = "Datenbank.mdb"
.ShowOpen
If fd.FileName = "" Then
MsgBox "Sie haben das Einbinden der Tabellen unterbrochen. Es erfolgt ein Programmabbruch !"
DoCmd.Quit acQuitSaveNone
Exit Function ' Abbruch durch Benutzer
End If
Dateiname = fd.FileName
End With

MsgBox Dateiname ' na ja, Kontrolle ist ganz gut
Call Tabelle_einbinden(Dateiname)
DoCmd.Minimize
DoCmd.RunMacro "autoexec" ' alles schließen und ab hier von vorne anfangen

PfadEinbinden_EXIT:
Exit Function


PfadEinbinden_ERR:
Dim strFehlertext As String
strFehlertext = err.Number & "Fehler - " & err.Description & _
"(" & err.Number & ") in 'PfadEinbinden'"

If err = 32755 Or Dateiname = "" Then
MsgBox "Sie haben das Einbinden der Tabellen unterbrochen. Es erfolgt ein Programmabbruch !"
DoCmd.Quit acQuitSaveNone
End If

Select Case err.Number
Case Else
MsgBox " Fehler - (Prozedur 'PfadEinbinden') " & err.Description & "(" & err & ")"
Resume PfadEinbinden_EXIT
End Select

End Function

====================================================================
Gruß

Michael

O-Schreiner
03.05.2001, 10:09
Meines Wissens kannst Du den UNC-Pfad direkt als "Quelle" zur Daten-MDB eingeben. Oder aber Du baust ihn über die Netzwerkumgebung und nicht über die virtuellen Laufwerke Klick für Klick auf.

HTH cu, Olly

Alexander Jan Peters
03.05.2001, 11:56
<font color="#000000" size="2" face="Tahoma">Hallo,

wie Olly schon geschrieben hat, kann man den Pfad direkt angeben. Es ist die Connect-Eigenschaft der Tabelle, die gesetzt werden muß.</p></font>

<font color="#000000" size="2" face="Courier New">
'Beispiel (DAO) - (strUNCPath etwas so: \\Rechnername\Public\Databases\Backend.MDB)
'Fehlerbehandlung und Prüfung auf Existenz der einzubindenden DB/Tabelle ist nicht implementiert !!!
Public Function fConnectTable (strTableName As String, strUNCPath As String) As Boolean
Dim db As Database
Dim intA As Integer
Dim fConnected As Boolean

fConnected = False

Set db = DBEngine(0)(0)

'Tabelle mit übergebenem Namen suchen
For intA = 0 To db.TableDefs.Count - 1

If db.TableDefs(intA).Name = strTableName
'Tabelle mit diesem Namen gefunden

'Prüfung, ob es überhaupt eine eingebundene Tabelle ist
If db.TableDefs(intA).Connect <> "" Then
'Ergebnis: Ja
'Achtung, die Argumente des Connect-Strings variieren
'je nach Typ der einzubindenden Datenbank
strUNCPath = ";DATABASE=" & strUNCPath
db.TableDefs(intA).Connect = strUNCPath
fConnected = True

Else
'Ergebnis: Nein
Exit For
End If

Exit For

End If

Next i

fConnectTable = fConnected

End Sub</font>


<font color="#000000" size="2" face="Tahoma">
Ich hoffe das Beispiel hilft.Es ist allerdings deutlich leichter den Pfad über die Netzwerkumgebung
(s.Olly's Beitrag) aufzubauen und dann die DB mit dieser fest eingestellten UNC-Einbindung weiterzugeben.

Gruß

A.J. Peters

Empfehlenswerte Links:
<a href="http://www.donkarl.com">Access FAQ von Karl Donaubauer</a>
<a href="http://www.access-paradies.de/Links.htm">Access-Paradies Links</a></font>

Diego
04.05.2001, 06:50
Hallo zusammen
Vielen Dank für Eure Hilfe. Ja es stimmte, den Pfad kann man via Netzwerkumgebung herausfinden und so klick um klick zusammensetzen, dann hat man den UNC-Pfad.

Also nochmals besten Dank.

Gruss Diego