Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Tabellen wieder einbinden

Begonnen von ulli, Dezember 11, 2011, 12:48:05

⏪ vorheriges - nächstes ⏩

ulli

Hallo,

ich habe eine Datenbank, aufgeteilt in FE und BE, von mehreren Menschen benutzt. Da derzeit noch häufiger Updates des FE erfolgen, wollte ich den Usern das ständige Neu-Einbinden der Tabellen des Backends ersparen und habe den Code von Don Karl (FAQ3.1) in das "beim Öffnen"-Ereignis des Start-Formulars eingesetzt, den Verweis auf MS DAO gesetzt und im Code "DeineDaten.mdb" durch den Namen des Backends ersetzt. Die Voraussetzung (beide DBs im gleichen Verzeichnis) ist erfüllt.

Beim Ausprobieren (alle Verknüpfungen gelöscht) kam keine Fehlermeldung des Codes, aber mein Startformular wurde auch nicht geööfnet mit Hinweis auf die fehlenden Datenquellen. Das Verschieben des Codes in das "Beim-Laden"-Ereignis brachte keine Besserung.

Wo könnte mein Fehler liegen?

database

Hallo,

und donkarls Code in ein Standardmodul zu verfrachten und die Prozedur dann per AutoExec-Macro aufzurufen geht nicht?
Alternativ könntest du ein dummy-Formular erstellen welches keine Datenherkunft besitzt und dieses als Starform deklarieren und den Code ins LadeEreignis verfrachten.

Am Ende der Prozedur fügst du dann noch ein dass dein gewünschtes Form angezeigt wird ...  docmd.openform "DeinFormular"
und lasst das dummy-Forrm wieder in der Versenkung vershwinden ... DoCmd.Close acForm, "DeinDummyForm"

Beaker s.a.

Hallo Ulli,

ZitatBeim Ausprobieren (alle Verknüpfungen gelöscht)

Was heisst das? Das keine verknüpften Tabellen mehr da sind?

  If db.TableDefs(i).Connect <> "" Then


Tritt ja nicht ein, wenn .Connect leer.

Zitatin das "beim Öffnen"-Ereignis des Start-Formulars eingesetzt ...
aber mein Startformular wurde auch nicht geööfnet mit Hinweis auf die fehlenden Datenquellen

Sind das zwei verschiedene Forms? Wenn das Startformular nicht geöffnet wird, läuft ja auch der Code nicht ab.
Wenn das zwei sind, ist klar, dass das zweite mit der angebenen Fehlermeldung das Öffnen verweigert, da Du die Datenverbindung vermutlich selber gelöscht hast (s.o.).

hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ulli

Vielen Dank an euch beide. Zum einen habe ich den Vorschlag mit dem ungebundenen Formular umgesetzt; zum anderen war der Hinweis Gold wert, dass bei gelöschten Verknüpfungen das If-Ereignisses ja gar nicht eintritt. Ich habe es nun mit nicht existenten Verknüpfungspfaden probiert und es läuft einwandfrei. Noch eine Frage zum Schluss: wenn ich die Verknüpfungen gelöscht habe und will den Code ablaufen lassen - auf was müsste ich dann prüfen?

Beaker s.a.

Hallo Ulli,

ZitatIch habe es nun mit nicht existenten Verknüpfungspfaden probiert und es läuft einwandfrei.

Was sind denn "nicht existente Verknüpfungspfade"?

Zitatwenn ich die Verknüpfungen gelöscht habe und will den Code ablaufen lassen - auf was müsste ich dann prüfen?

IMO gibt es da nichts, denn Du hast ja in der TableDefs-Auflistung keine Tables mehr drin, wenn Du die gelöscht hast.
Karls Code bearbeitet ja nur die Eigenschaft .Connect der TableDefs, will sagen definiert keine neuen Verknüpfungen.

Die Tabellen aus dem Backend komplett per Code neu zu verknüpfen geht so:

Public Sub LinkinTables()
On Error GoTo MyError

Dim strDaten As String
Dim i As Integer
Dim tdf As DAO.TableDef
Dim dbE As DAO.Database 'DeineDaten.mdb = Backend

Set dbE = OpenDatabase("Pfad\DeineBackend.mdb")

strDaten = Left(dbC.Name, Len(dbC.Name) - Len(Dir(dbC.Name))) & "DeineBackend.mdb"

For Each tdf In dbE.TableDefs
   'Systemtabellen überspringen
   If Left(tdf.Name, 4) <> "MSys" Then
           ' Tabelle verlinken
           DoCmd.TransferDatabase acLink, "Microsoft Access", _
                                  strDaten, acTable, _
                                  tdf.Name, tdf.Name
   End If
Next tdf

MyExit:
   dbE.Close
   Set dbE = Nothing
   Exit Sub

MyError:
 MsgBox "Bei der Installation ist eine Ausnahme aufgetreten. ", 16, "Ausnahme"
 Resume MyExit
End Sub


hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ulli

Hallo Ekkehard,
mit "nicht existente Pfade" meine ich solche, die die im FE eingetragen,  aber nicht mehr verfügbar sind (im Test ein BE auf einem USB-Stick). Danke für deinen Code; solche Programmierungen liegen noch deutlich oberhalb meiner Kenntnisse :-).

Beaker s.a.

Hallo Ulli,

Zitatmit "nicht existente Pfade" meine ich solche, die die im FE eingetragen,  aber nicht mehr verfügbar sind

Du meinst also, das da noch verknüpfte Tabellen sind, nur das der im .Connect stehende Pfad nicht mehr stimmt?

Dann musst Du bei meinem letzten Code aufpassen, da der nicht prüft, ob die Tabelle schon vorhanden ist. Wenn die da ist, verknüpft der Code die trotzdem und nummeriert die Namen (TabellenName_1).
Wenn sich nur der Pfad verschoben hat, musst Du im Code von Karl die Variable strDaten mit einem FileDialog füllen. Was beim kompletten neu einbinden aber auch keine schlechte Idee wäre.

hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)