Zum Inhalt springen

MS Access verknüpfungen per VBA-Code ändern, diverse Fragen


DJTank

Empfohlene Beiträge

Hallo Gemeinde :)

Wir haben hier eine Applikation, welche zur Zeit aus einem Access-Frontend und externer Access-Datenbanken besteht.

Nun möchten wir je nach Einsatzzweck die Tabellen-Verknüpfen, die im Frontend auf die richtigen Tabellen zeigen dynamisch ändern. Dies geschieht durch ein Text-File, in welchem die Pfade zu den MDB's bzw. der ODBC-Connectionstring enthalten sind (je nach Einsatzzweck wird das eine oder das andere verwendet).

Beim Starten unserer Applikation überprüfen wir alle unsere Tabellen-Verknüpfungen, ob sie lt. dem Textfile noch aktuell sind. Ist dies nicht der Fall, sollte die Verknüpfung geändert werden.

Nun ein paar Fragen:

- wie kann es sein, dass ich, wenn ich die Tabellenverknüpfungen per "DAO.Tabledefs" durchgehe, Tabellen vorkommen, die gar nicht existieren (zB. hatte ich mal eine Access-Verknüpfung auf eine Tabelle namens "Bankkonto", welche ich gelöscht habe und zu Testzwecken einen ODBC-Link mit dem selben Namen, also "Bankkonto" erstellt habe).

Wenn ich nun mit einer Schleife alle Verknüpfungen durchgehe bekomme ich immer beide Verknüpfungen, obwohl die eine gar nicht existiert.

- Mein ODBC-String sieht folgendermaßen aus (für Oracle), wäre der korrekt?

ODBC;DSN=hacos_oracle;UID=SYSTEM;PWD=XXXXX;DBQ=HACOS

- Auf diese Art möchte ich die Verknüpfung aktualisieren, falls es eine MDB ist und es eine ODBC-Verknüpfung werden soll:

Dim ConnEinbinden As DAO.TableDefs

ConnEinbinden(I).Connect = strODBCstring + ";TABLE=Hacos." + ConnEinbinden(I).SourceTableName

ConnEinbinden(I).RefreshLink

DoEvents

Ich bekomme die verschiedensten Fehlermeldungen und habe zur Zeit gar keinen Durchblick mehr, vielleicht hat schon jemand Erfahrung mit dynamischen Verknüpfungen.

Ich danke vielmals.

Stefan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun ein paar Fragen:

- wie kann es sein, dass ich, wenn ich die Tabellenverknüpfungen per "DAO.Tabledefs" durchgehe, Tabellen vorkommen, die gar nicht existieren (zB. hatte ich mal eine Access-Verknüpfung auf eine Tabelle namens "Bankkonto", welche ich gelöscht habe und zu Testzwecken einen ODBC-Link mit dem selben Namen, also "Bankkonto" erstellt habe).

Wenn ich nun mit einer Schleife alle Verknüpfungen durchgehe bekomme ich immer beide Verknüpfungen, obwohl die eine gar nicht existiert.

üblicherweise wird die alte verknüfung komplett entfernt und sollte auch in der MSysObjects nicht mehr zu finden sein. ist das nicht der fall, hilft ein komprimieren der datenbank, um alte verknüpfungen restlos zu entfernen.

kannst du allenfalls mal (falls dort vorhanden) die zwei entsprechenden zeilen aus der tabelle MSysObjects posten?

- Mein ODBC-String sieht folgendermaßen aus (für Oracle), wäre der korrekt?

ODBC;DSN=hacos_oracle;UID=SYSTEM;PWD=XXXXX;DBQ=HACOS

der passt soweit, aber ist es absicht, dass du den logon mit SYSTEM machst (und nebenbei das systempasswort hier postest :floet: )?

Ich bekomme die verschiedensten Fehlermeldungen und habe zur Zeit gar keinen Durchblick mehr, vielleicht hat schon jemand Erfahrung mit dynamischen Verknüpfungen.

welche fehlermeldungen denn genau?

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

;) Ich hab hier nur eine lokale Testumgebung, deshalb habe ich das Passwort im Klartext gepostet.

Ich habe das ganze jetzt wieder auf ein Minimum reduziert, nachdem ich kreuz und quer herumprobiert habe.

Die momentane Fehlermeldung lautet folgendermaßen:

"Das Microsoft Jet-Datenbankmodul konnte das Objekt 'Bankkonto' nicht finden. Stellen Sie sicher, dass das Objekt existiert und dass die Namens- und Pfadangaben richtig eingegeben wurden."

Ich habe momentan nur noch Links auf Access-Datenbanken und versuche diese auf ODBC zu verknüpfen, dies geschieht mit folgendem Code:

Dim Help1 As String, Help2 As String

Dim strTabelle As String

Dim strPasswrd As String

Dim I As Long, I1 As Long

Dim wsp As DAO.Workspace

Dim ConnEinbinden As DAO.TableDefs

Dim tn As String

On Error GoTo Fehler

strCurrentAction = conSpace0

Set wsp = DBEngine.Workspaces(0)

wsp.BeginTrans

If strEinbinden = conYes Then

'

I1 = CurrDataBase.TableDefs.Count - 1

Set ConnEinbinden = CurrDataBase.TableDefs

'

For I = 0 To I1

Help1 = conSpace0

Help2 = conSpace0

strTabelle = conSpace0

'

On Error Resume Next 'Hilfe bei FehlerDiagnose

Help1 = ConnEinbinden(I).Connect

'Name der Tabelle festlegen

Help2 = "Table: " + Nz(ConnEinbinden(I).Name, conSpace0)

'Name nochmal ohne Beschriftung

tn = Nz(ConnEinbinden(I).SourceTableName, conSpace0)

On Error GoTo Fehler

'

If Len(Help1) > 0 Then 'wenn es eine verknüpfte tabelle ist...

'

If strODBC = "ja" Then

'

If Right(Help1, 3) = "mdb" And Right(Help1, 10) <> "export.mdb" And Right(Help1, 9) <> "saege.mdb" _

And Right(Help1, 6) <> "vp.mdb" Then

ConnEinbinden(I).Connect = strODBCstring + ";TABLE=HACOS." + tn

ConnEinbinden(I).RefreshLink

DoEvents

End If

...

Link zu diesem Kommentar
Auf anderen Seiten teilen

du hast leider nicht den ganzen code der funktion/sub gepostet ... dadurch fällt mir ein debugging schwer, weil einige if's nicht geschlossen sind und das next zum for fehlt.

CurrDataBase ist bei dir was? ich kenne nur CurrentDB.

wann genau kommt denn die jet-fehlermeldung? nach dem .Connect, nach dem RefreshLink? kannst du da näheres dazu angeben.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die schnelle Antwort :) hier die komplette Funktion.

Nach dem RefreshLink kommt die Fehlermeldung jawohl.

CurrDataBase ist eine globale Variable für CurrentDB().

Public Function EinbindenINI() As String

Dim Help1 As String, Help2 As String

Dim strTabelle As String

Dim strPasswrd As String

Dim I As Long, I1 As Long

Dim wsp As DAO.Workspace

Dim ConnEinbinden As DAO.TableDefs

Dim tn As String

On Error GoTo Fehler

strCurrentAction = conSpace0

Set wsp = DBEngine.Workspaces(0)

wsp.BeginTrans

If strEinbinden = conYes Then

'

I1 = CurrDataBase.TableDefs.Count - 1

Set ConnEinbinden = CurrDataBase.TableDefs

'

For I = 0 To I1

Help1 = conSpace0

Help2 = conSpace0

strTabelle = conSpace0

'

On Error Resume Next 'Hilfe bei FehlerDiagnose

Help1 = CurrDataBase.TableDefs(I).Connect

'Name der Tabelle festlegen

Help2 = "Table: " + Nz(CurrDataBase.TableDefs(I).Name, conSpace0)

'Name nochmal ohne Beschriftung

tn = Nz(CurrDataBase.TableDefs(I).SourceTableName, conSpace0)

On Error GoTo Fehler

'

If Len(Help1) > 0 Then 'wenn es eine verknüpfte tabelle ist...

'

If strODBC = "ja" Then

'

If Right(Help1, 3) = "mdb" And Right(Help1, 10) <> "export.mdb" And Right(Help1, 9) <> "saege.mdb" _

And Right(Help1, 6) <> "vp.mdb" Then

CurrDataBase.TableDefs(I).Connect = strODBCstring + ";TABLE=HACOS." + tn

CurrDataBase.TableDefs(I).RefreshLink

DoEvents

End If

'Passwort und Pfad laden

'Call strTabelleDaten(Help1, strPasswrd, strTabelle)

'

If Right(strTabelle, 14) = "NavOffline.mdb" And (strTabelle <> "DATABASE=" + strNavOfflineMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strNavOfflineMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strNavOfflineMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 9) = "Saege.mdb" And (strTabelle <> "DATABASE=" + strSaegeMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strSaegeMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strSaegeMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 8) = "user.mdb" And (strTabelle <> "DATABASE=" + strUserMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strUserMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strUserMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 7) = "cad.mdb" And (strTabelle <> "DATABASE=" + strCadMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strCadMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strCadMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 11) = "projekt.mdb" And (strTabelle <> "DATABASE=" + strProjektMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strProjektMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strProjektMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 14) = "stammdaten.mdb" And (strTabelle <> "DATABASE=" + strStammdatenMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strStammdatenMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strStammdatenMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 6) = "vp.mdb" And (strTabelle <> "DATABASE=" + strVpMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strVpMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strVpMdb + ";pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 12) = "language.mdb" And (strTabelle <> "DATABASE=" + strLanguageMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strLanguageMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strLanguageMdb + " ;pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

ElseIf Right(strTabelle, 16) = "internet_RA1.mdb" And (strTabelle <> "DATABASE=" + strInternetMdb Or strPasswrd = conSpace0) Then

Help1 = "DATABASE=" + strInternetMdb

ConnEinbinden(I).Connect = ";DATABASE=" + strInternetMdb + " ;pwd=" + myPassWord

ConnEinbinden(I).RefreshLink

DoEvents

End If

End If

End If

Next I

CurrDataBase.TableDefs.Refresh

End If

strEinbinden = "NEIN"

wsp.CommitTrans ' Änderungen übernehmen

Ausgang:

On Error Resume Next

Set ConnEinbinden = Nothing

Set wsp = Nothing

strCurrentAction = conSpace0

Exit Function

Fehler:

wsp.Rollback

If Nz(Err.Description, conSpace0) = conSpace0 Or Err.Number = 0 Then

Call ErrorLog(strUserIdent, 8150815, Help1 + " " + Help2, "m_einbinden / EinbindenINI", , True)

Else

Call ErrorLog(strUserIdent, Err.Number, Err.Description, "m_einbinden / EinbindenINI", Help1 + " " + Help2, True)

End If

Set ConnEinbinden = Nothing

Set wsp = Nothing

Set CurrDataBase = Nothing

Set dbsFileArchiv = Nothing

Application.Quit

Resume Ausgang

Resume Next

End Function

Link zu diesem Kommentar
Auf anderen Seiten teilen

:floet:

Nachdem ich nun alles nochmal verworfen , den Code neu geschrieben und auf das Wesentliche beschränkt habe, bin ich drauf gekommen, dass ich was entscheidendes verschwitzt habe :rolleyes:

Alle Bezeichnungen sind in Oracle in GROSSSCHREIBUNG abgelegt, darum konnte er keine Objekte finden.

Vielen Dank für Eure Hilfe :) Vorerst kann ich meine Oracle-Migration weiterführen.

Gruß

Stefan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...