DJTank Geschrieben 6. Juli 2005 Teilen Geschrieben 6. Juli 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 6. Juli 2005 Teilen Geschrieben 6. Juli 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wolle Geschrieben 6. Juli 2005 Teilen Geschrieben 6. Juli 2005 (und nebenbei das systempasswort hier postest )? Ich hab das mal editiert Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DJTank Geschrieben 6. Juli 2005 Autor Teilen Geschrieben 6. Juli 2005 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 ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 6. Juli 2005 Teilen Geschrieben 6. Juli 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DJTank Geschrieben 6. Juli 2005 Autor Teilen Geschrieben 6. Juli 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DJTank Geschrieben 7. Juli 2005 Autor Teilen Geschrieben 7. Juli 2005 :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 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.