Mit DLookup auf andere Datenbank zugreifen

  • VB6

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Sascha1974.

    Mit DLookup auf andere Datenbank zugreifen

    Hallo,

    ich habe mal wieder ein kleines (oder gar großes?) Problem, welches mir Kopfzerbrechen bereitet.

    Ich habe zwei Datenbanken "Reisen.mdb" und "Flug.mdb"

    In der "Flug.mdb" gibt es eine Tabelle "Flüge". Nun möchte ich von der Datenbank "Reisen.mdb" auf die Tabelle "Flüge" zugreifen und einzelne Felder eines bestimmten Datensatzes auslesen. Innerhalb der Datenbank klappt das ohne Probleme nach folgendem Muster:

    txt_flugnummer = DLookup("Flugnummer", Flüge", "Ziel=" & txt_flugziel)

    Es wird in einem Formular das Feld "txt_flugziel" abgefragt und als Suchkriterium verwendet, damit dann in einem Feld "txt_flugnummer" die aus der Tabelle "Flüge" ermittelte passende Flugnummer eingetragen wird.

    Wie gesagt, innerhalb einer Datenbank ist das kein Problem, doch Datenbankübergreifend komme ich nicht weiter.

    Ich weiß, dass ich erst eine Connection zur anderen Datenbank aufbauen muss, was ich wie folgt vorbereitet habe:

    Dim Flugtabelle As ADODB.Connection
    Set Flugtabelle = New ADODB.Connection
    Flugtabelle.Provider = "Microsoft.Jet.OLEDB.4.0"
    Flugtabelle.Open ("F:\Flug.mdb")

    Danach kämen meine Anweisungen und das ganze endet mit

    Flugtabelle.Close
    Set Flugdaten = Nothing

    Wer kann mir helfen?

    Viele Grüße
    Sascha
    Hallo Markus,

    mein Problem ist, dass ich den Syntax für den DLookup-Befehl für den Zugriff auf eine andere Datenbank nicht kenne. Wie gesagt, innerhalb der gleichen Datenbank geht das ohne Problem, d.h. den Syntax kenne ich. Aber ich kenne halt "den Kniff" für den Zugriff auf die externe Datenbank nicht.

    Würde also die Tabelle "Flüge" innerhalb der selben Datenbank stehen, dann hieße der Befehl

    txt_flugnummer = DLookup("Flugnummer", "Flüge", "Ziel=" & txt_flugziel)

    und wenn ich auf die Datenbank "Flug" zugreifen will, wie dann?

    Das ist meine Frage!

    Viele Grüße
    Sascha
    Hallo Sascha,
    ich weiß nicht ob das mit der Methode überhaupt klappen kann, warum machst du nicht soetwas (sorry das geht bestimmt eleganter, will nicht ausschließen, dass da Fehler sind):

    Public Function cc_Find(strDB As String, strTb As String, strCrit As String, strFd As String) As Variant
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    cc_Find = False
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strDB
    rs.Open strTb, cn, adOpenDynamic
    rs.Find strCrit
    If Not (rs.EOF) Then cc_Find = rs.Fields(strFd)
    Set rs = Nothing
    Set cn = Nothing
    End Function

    Sub test()
    MsgBox cc_Find("C:\Eigene Dateien\db7.mdb", "Tabelle01", "ID=4", "test")
    End Sub

    Gruß Markus
    Hallo Markus,

    erstmal vielen Dank für deine Hilfe. Habe jetzt deine Function und die Test-Subroutine in ein Modul kopiert und die Text-Routine auf meine Datenbank umgemünzt.

    Sub test()
    MsgBox cc_Find("F:\Flug.mdb", "tbl_Flüge", "Ziel=Hanoi", "Gesellschaft")
    End Sub

    Die Felder "Ziel" und "Gesellschaft" sind Textfelder. Es haben mehrere Datensätze im Feld "Ziel" den Eintrag "Hanoi". Wenn ich nun die Test-Routine starte, bekomme ich die Fehlermeldung

    "Laufzeitfehler 3001! Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar!"

    Dabei wird die Zeile "rs.Find strCrit" gelb hinterlegt. Das wundert mich, denn der Syntax lautet bei meinem Kriterium 'rs.Find "Ziel=Hanoi"', was ja vom Syntax an sich korrekt ist. Woran kann jetzt das noch liegen?

    Vielleicht als Hinweis: Der Connect selber scheint zu funktionieren, denn beim Debuggen erhalte ich beim Zeigen auf "rs.Fields(strFd)" in meinem Beispiel den Feldinhalt des ersten Datensatzes - hier aus dem Feld "Gesellschaft" den Eintrag "Lufthansa", welches in meiner Beispieltabelle korrekt ist. Also im groben klappt der Zugriff schon.

    Bis hierher nochmals vielen Dank. Wenn wir diese Sache jetzt auch noch geschaukelt bekommen, dann wäre das ein echter Durchbruch für mich.

    Viele Grüße
    Sascha
    Hallo Markus,

    wegen meiner Fehlermeldung habe ich etwas herausbekommen:

    Sascha1974 schrieb am 15.09.2003 08:48

    Sub test()
    MsgBox cc_Find("F:\Flug.mdb", "tbl_Flüge", "Ziel=Hanoi", "Gesellschaft")
    End Sub

    Die Felder "Ziel" und "Gesellschaft" sind Textfelder. Es haben mehrere Datensätze im Feld "Ziel" den Eintrag "Hanoi". Wenn ich nun die Test-Routine starte, bekomme ich die Fehlermeldung

    "Laufzeitfehler 3001! Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar!"


    Ändere ich nun die Test-Prozedur auf

    Sub test()
    MsgBox cc_Find("F:\Flug.mdb", "tbl_Flüge", "LfdNr=15", "Gesellschaft")
    End Sub

    dann funktioniert es wunderbar. Offenbar muss ich als Suchkriterium ein Primärschlüsselfeld (in diesem Fall "LfdNr") angeben, damit das funktioniert. Der alte Eintrag "Ziel=Hanoi" bezog sich auf ein Datenfeld, welches den Eintrag "Hanoi" in mehreren Datensätzen hat. Leider kann ich damit nichts anfange. Ich bräuchte eine Übersicht aller Datensätze, die im Datenfeld "Ziel" den Eintrag "Hanoi" haben. Das sind in meiner Beispieldatenbank 4 Datensätze.

    Ich habe es nun mal mit einer SQL-Anweisung probiert. Der Befehl wird wohl auch ausgeführt und es erscheint auch keine Fehlermeldung, aber es wird kein Ergebnis angezeigt. Was mache ich falsch?

    Sorry, wenn ich nerve, aber ich arbeite mich erst so richtig in die Materie ein und die Unterlagen hier taugen nicht die Bohne. Man kann damit lernen, wie man per VBA den Office-Assistenten programmiert - wie sinnvoll :rolleyes:

    Hier meine Prozedur:

    Private Sub cmd_suchen_Click()

    Dim Flugtabelle As ADODB.Connection
    Set Flugtabelle = New ADODB.Connection
    Flugtabelle.Provider = "Microsoft.Jet.OLEDB.4.0"
    Flugtabelle.Open ("F:\Flug.mdb")

    With Flugtabelle
    .Execute "SELECT Gesellschaft, FlugNummer, Datum, Ziel FROM tbl_Flüge WHERE Ziel='" & txt_flugziel & "'"
    End With

    Flugtabelle.Close
    Set Flugdaten = Nothing

    End Sub

    Viele Grüße
    Sascha
    Hallo Markus,

    ich habe des Rätsels Lösung endlich gefunden. Manchmal sind es eben die kleinsten Kleinigkeiten, die alles zum Scheitern verurteilen.

    Was habe ich falsch gemacht?

    Sub test()
    MsgBox cc_Find("F:\Flug.mdb", "tbl_Flüge", "Ziel=Hanoi", "Gesellschaft")
    End Sub

    Damit obiges Beispiel funktioniert, muss "Hanoi" in einfach Hochkommas ' gesetzt werden. Schon klappts auch mit der Function. Ich weiß jetzt gar nicht mehr, wie ich darauf gekommen bin, aber ich bin darauf gekommen und bin nun endlich am Ziel meiner Versuche angekommen.

    An dich an dieser Stelle nochmals einen herzlichen Dank. Deine Function funktioniert wunderprächtig!!

    Viele Grüße
    Sascha