PDA

Vollständige Version anzeigen : Automatisch verlinktes BackEnd


hcscherzer
28.03.2007, 20:28
Moin zusammen,
immer wieder gibt es das Problem, dass FrontEnd- und BackEnd-Datenbanken beim Entwickler in anderen Verzeichnissen herumliegen als bei den Anwendern, oder dass die Pfade zur BackEnd-DB bei verschiedenen Arbeitsplätzen im Netzwerk unterschiedlich gemappt sind.

Ich habe dafür ein kleines Beispiel entwickelt, das die Verbindung vom FE zum BE automatisch herstellt. In den anliegenden beiden Datenbanken ist das demonstriert.

Das AutoExec-Makro im FE sorgt dafür, dass die Funktion init() im Modul Dienstprogramme gestartet wird. Der Name der zuletzt verknüpften BE-DB, der im Feld [dbname] der Tabelle [sys] abgelegt ist, wird eingelesen und dann wird versucht, diese DB zu öffnen. Falls dieses misslingt, öffnet die Fehlerbehandlung ein DateiÖffnen-Dialog damit der Anwender eine andere DB auswählen kann. Jetzt werden alle im FE befindlichen verknüpften Tabellen entfernt und der Name der ausgewählten DB wird in der Tabelle [sys] abgelegt.

Spätestens jetzt werden alle (ausser den System-) Tabellen die im BE vorhanden sind, in der Prozedur tabcheck() im FE geöffnet. Wenn das nicht klappt, werden sie entfernt und bzw. falls sie noch nicht oder nicht mehr vorhanden sind, neu verknüpft.

In beiden Prozeduren ist in der Fehlerbehandlung ein Zweig eingebaut, der bei bisher unbekannten Fehlern das Programm anhält. Ich würde mich freuen, solche Fehler mitgeteilt zu bekommen um die kleine Routine weiter verbessern zu können.

Vielen Dank an Tommy, der geholfen hat, den Code zu verbessern und an Günter Kramer für die hier (http://www.ms-office-forum.net/forum/showthread.php?t=40922&highlight=FileDialog) gefundene Version des FileDialog, der auch für Access-Versionen vor 2003 funktioniert.

Zum Download (http://ms-office-forum.net/forum/showpost.php?p=1450437&postcount=81)

Linus1971
29.03.2007, 14:22
Hallo Hans-Christian


Da sage ich mal ein ganz dickes Danke. Ich habe auch immer das Problem, dass die Laufwerke öfter umbenannt werden und dann die Verknüpfungen nicht mehr funktionieren. Jetzt muss ich nicht immer wieder die Tabellen neu verknüpfen, sondern kann den Anwender nach dem Backend selber suchen und einbinden lassen. TOP.

Inti31
05.04.2007, 11:06
Hi! Zunächst: Deine Lösung ist super, allerdings als Anregung:

Liegt das Backend nicht im selben Verzeichnis, muss man jedesmal die eingetragene Datenbank neu verbinden - das finde ich persönlich störend.

Dass liesse sich doch bestimmt dahingehend ändern, dass die letzte Verbindung zum Backend automatisch refresht wird und erst wenn die Db nicht mehr gefunden wird, dann der Dialog aufgerufen wird.

Gruß Harry

hcscherzer
05.04.2007, 11:28
Moin Harry,
danke für den Hinweis (den mir übrigens TommyK auch schon gegeben hatte):upps: sBEPath = DLookup("dbnam", "sys")
If InStr(1, sBEPath, "\\") = 0 ThenHier wird ja schon geprüft, ob ein kompletter Pfad in der Tabelle sys abgelegt ist.
Ich hab 29 Code-Zeilen weiter unten - endlich - dafür gesorgt, dass er jetzt auch gespeichert wird.:)

hcscherzer
02.06.2007, 15:40
Moin zusammen,
hier ist eine überarbeitete Version.
- ein paar unnötige Verweise entfernt
- es ist jetzt möglich, beliebig viele Back-End MDB's in das FrontEnd einzubinden, indem mehrere Datenbank-Namen oder -Pfade in der Tabelle sys angelegt werden.

HCH
04.06.2007, 15:40
Hallo Hans-Christian

ist eine geniale Lösung, welche ich schon länger suchte.
Vielen Dank

Grüße aus Linz
Christian (seit heute registriert)

juergen1965
06.06.2007, 19:18
Hallo HC!

Kann ich nur beipflichten ist eine deutlich flexiblere Lösung. Kann ich auch ganz gut einsetzen.
Vielen Dank.;)

Ted Bundy
12.06.2007, 11:24
Hallo hcscherzer.
Zunächt einmal Respekt für die Prozedur.

In der Fehlerbehandlung der INIT-Prozedur müsste noch Err.Number 3044 abgefangen werden, der eintritt, wenn zwischenzeitlich der Datenbankpfad umbenannt wird.

init_err:
If Err.Number = 3024 Or Err.Number = 3044 Then

MfG
Ted

prennert
13.09.2007, 09:00
Hallo!

Ich wollte dieses tool auch verwenden jedoch hat er die Funktion getpathtoADO nicht erkannt. Wo bekomme ich diese?

Lg tanja
Sorry hab zum falschen Beitrag meine Antwort geschrieben kann ihn aber nicht mehr löschen

TommyK
13.09.2007, 09:10
Hallo Tanja,

Ich wollte dieses tool auch verwenden jedoch hat er die Funktion getpathtoADO nicht erkannt. Wo bekomme ich diese?

Bist Du Dir sicher das Du dieses Tool meinst?
Die Funktion kommt doch darin gar nicht vor. :confused:

Wolfgang_CO
17.09.2007, 07:45
Moin zusammen,

ich arbeite mal wieder an dem Thema FE/BE und habe die obigen Prozeduren eingebaut... nur funktionieren sie leider nicht.

Wenn ich die Datenbank öffne, laufen die entsprechenden Autoexecute Scripts ab und irgendwann bleibt dann Access mit dem Fehler stehen:

"Fehler 3376: Tabelle 'Dispobereiche' ist nicht vorhanden"

Nach Klick auf ok gehts dann in den Script Editor an folgende Stelle:

Modul -> Dienstprogramme

Function init()
Dim pfad As String
Dim dbx As DAO.Database
Dim rs As DAO.Recordset
Dim t As DAO.TableDef
Dim sBEPath As String
On Error GoTo init_err

Set rs = CurrentDb.OpenRecordset("sys")

Do While Not rs.EOF

sBEPath = rs!dbnam
If InStr(1, sBEPath, "\") = 0 Then
pfad = Application.CurrentProject.Path & "\" & sBEPath
Else
pfad = sBEPath
End If

Set dbx = DBEngine.Workspaces(0).OpenDatabase(pfad)

For Each t In dbx.TableDefs()
If InStr(1, t.Name, "MSys") = 0 Then tabcheck t.Name, pfad
Next

rs.MoveNext

Loop
rs.Close

init_exit:
Set dbx = Nothing
On Error GoTo 0
Exit Function

init_err:
If Err.Number = 3024 Then
pfad = DateiOeffnen(Application.CurrentProject.Path, "BackEnd Datenbank öffnen")
If pfad <> "" Then
For Each t In CurrentDb.TableDefs()
If t.Connect <> "" Then
CurrentDb.Execute "DROP TABLE " & t.Name & ";"
End If
Next
rs.Edit
rs!dbnam = pfad
rs.Update
Else
Application.Quit
End If
ElseIf Err.Number = 3059 Then
Application.Quit
Else
MsgBox "Fehler: " & Err.Number & " - " & Err.Description
Stop
End If
Resume

End Function

Stehen bleibt er bei "Stop", vierte Zeile von unten....

Wenn ich dann auf Stopp (Zurücksetzen) klicke, kommt wieder Access mit "Aktion ist fehlgeschlagen":
Makroname: AutoExec
Bedingung: Wahr
Aktionsname: AusführenCode
Argumente: init()

Danach ist die Auswahl auf "Anhalten" beschränkt...

Was habe ich falsch gemacht?

Gruß
Wolfgang

hcscherzer
17.09.2007, 20:58
Moin Wolfgang,
Du schriebst:Fehler 3376: Tabelle 'Dispobereiche' ist nicht vorhanden
ein paar Fragen dazu:
- wo kommt denn dieser Tabellen-Name 'Dispobereiche' her?
- was genau hast Du in der Tabelle sys als Datenbankpfad eingegeben?
- hast Du eine andere Access Datenbank über den Datei Dialog ausgewählt?
- welche Access Version benutzt Du?

Hast Du mal folgendes probiert: nach dem Abbruch die Verarbeitung anhalten, dann in der Prozedur init() am Anfang einen Breakpoint setzen und sie dann nochmal ausführen (F5) und nach dem Breakpoint Schritt für Schritt weiter mit (F8) um festzustellen, wo genau der Fehler auftritt.

Wolfgang_CO
18.09.2007, 06:58
Hallo,

das vorherige Problem ist gelöst, lag wohl daran, dass die Tabelle "Dispobereiche Lasten" hiess und Access nach "Dispobereiche" gesucht hat - Leerzeichenfehler.

Soweit klappt das jetzt...

AAABER: ;)

Wenn ich alle Tabellenverknüpfungen im FE lösche und dann neu starte, werden nach Auswahl des BE automatisch alle Tabellen eingelesen und alles ist prima.
Wenn ich mit dem Status Access beende und neu starte, wird nach Verschieben des BE zwar brav nach dem BE im FileDialog gefragt, nur steigt Access jetzt mit folgendem Fehler aus:

Laufzeitfehler 3295: Sytaxfehler in DROP TABLE oder DROP INDEX.

Beim debuggen wird dann folgende Zeile angemarkert:

CurrentDb.Execute "DROP TABLE" & t.Name & ";"

bei Modul Dienstprogr. init():
init_err:
If Err.Number = 3024 Then
pfad = DateiOeffnen(Application.CurrentProject.Path, "BackEnd Datenbank öffnen")
If pfad <> "" Then
For Each t In CurrentDb.TableDefs()
If t.Connect <> "" Then
CurrentDb.Execute "DROP TABLE" & t.Name & ";"
End If
Next
rs.Edit
rs!dbnam = pfad
rs.Update
Else
Application.Quit
End If
ElseIf Err.Number = 3059 Then
Application.Quit
Else
MsgBox "Fehler: " & Err.Number & " - " & Err.Description
Stop
End If
Resume


Muss ich vor beenden alle Verknüpfungen wieder löschen? Wenn ja, wie soll ich das einrichten? Habe ich da was in den Beispielen übersehen?

Ach ja: Ich benutze Access 2003

Gruß
Wolfgang

hcscherzer
18.09.2007, 17:05
Moin Wolfgang,
welche Tabellenverknüpfung will er denn nicht löschen (was steht in t.name)?
Oder sehen meine Adleraugen das richtig und da fehlt ein Leerzeichen nach dem 'TABLE' ??

Wolfgang_CO
19.09.2007, 14:41
mann mann mann.. ich muss noch einiges lernen :)

Ich hatte eine Tabelle, die einen - (Bindestrich) im Namen hatte. Das wollte er nicht. Jetzt gehts....:rolleyes:

Jetzt muss ich noch das Passwort-Problem lösen... Mein BE soll ein DB-Kennwort haben. Wo genau muss ich jetzt nochmal den Password-String einsetzen?

Gruß
Wolfgang

hcscherzer
20.09.2007, 08:34
Schau mal in die Online Hilfe zur OpenDatabase Methode ...

Wolfgang_CO
21.09.2007, 09:25
Schau mal in die Online Hilfe zur OpenDatabase Methode ...

Für den Teil scheine ich echt zu blöd zu sein :(

Habe init() wie folt geändert:

Function init()
Dim pfad As String
Dim dbx As DAO.Database
Dim rs As DAO.Recordset
Dim t As DAO.TableDef
Dim sBEPath As String


On Error GoTo init_err

Set rs = CurrentDb.OpenRecordset("sys")

Do While Not rs.EOF

sBEPath = rs!dbnam
If InStr(1, sBEPath, "\") = 0 Then
pfad = Application.CurrentProject.Path & "\" & sBEPath
Else
pfad = sBEPath
End If

Set dbx = DBEngine.Workspaces(0).OpenDatabase(pfad, , , "pwd=123452")

For Each t In dbx.TableDefs()
If InStr(1, t.Name, "MSys") = 0 Then tabcheck t.Name, pfad
Next

rs.MoveNext

Loop
rs.Close

init_exit:
Set dbx = Nothing
On Error GoTo 0
Exit Function

init_err:
If Err.Number = 3024 Then
pfad = DateiOeffnen(Application.CurrentProject.Path, "BackEnd Datenbank öffnen")
If pfad <> "" Then
For Each t In CurrentDb.TableDefs()
If t.Connect <> "" Then

CurrentDb.Execute "DROP TABLE " & t.Name & ";"
End If
Next
rs.Edit
rs!dbnam = pfad
rs.Update
Else
Application.Quit
End If
ElseIf Err.Number = 3059 Then
Application.Quit
Else
MsgBox "Fehler: " & Err.Number & " - " & Err.Description
Stop
End If
Resume

End Function

Man achte auf Set dbx = DBEngine.Workspaces(0).OpenDatabase(pfad, , , "pwd=123452")

In der von Dir zitierten Online-Hilfe steht nämlich:

Syntax

Set Datenbank = Arbeitsbereich.OpenDatabase (DBName, Optionen, Schreibgeschützt, Verbindung)

....

Verbindung
Optional. Ein Wert vom Typ Variant (Untertyp String), der verschiedene Verbindungsinformationen, einschließlich Kennwörtern, angibt.


Was habe ich da falsch verstanden?

Gruß
Wolfgang

hcscherzer
21.09.2007, 10:05
Moin Wolfgang,
ich gestehe, das mit dem Passwort beim Zugriff auf eine Access MDB auch nochnicht gemacht zu haben.
Beim Zugriff auf einen SQL Server sieht so ein Connection-String allerdings noch etwas anders aus:Dim strConnect As String
strConnect = "Data Source=server;Initial Catalog=db;Integrated Security='false';User ID='user';Pwd='xyz1234'"
server kann die IP oder der Name des Servers im Netzwerk sein, db ist der Name der Datenbank; aber, wie gesagt: alles für MSSQL

Generell rege ich aber an, das Zwiegespräch auf das Forum zu verlagern bzw. dort einen neuen Thread zu öffnen.
Ich bin sicher, dass sich da jemand auskennt ...

vonson
27.09.2007, 22:53
Hallo,

ich habe die Lösung von hcscherzer (aus der Datei AutoLink.zip von Seite 1 dieses Threads) versucht, und sie funktioniert hervorragend - áußer, wenn der Pfad zur DB Leerzeichen enthält. Gibts eine Möglichkeit, das anzupassen? (habe selbst keine Ahnung von VBA...)

vonson
28.09.2007, 11:50
leider beschränkt sich das Problem nicht auf Leerzeichen - aber woran es nun liegt, weiß ich nicht. Manchmal klappts, oft nicht. Dann bekomm ich den Fehler:

Fehler 3295: Sysntax-Fehler in DROP TABLE oder DROP INDEX.

Nur wieso weiß ich nicht, an Leerzeichen liegts wohl nicht...

hcscherzer
28.09.2007, 13:05
Moin,
die Sache mit den Leerzeichen im DB-Namen bzw. Pfad schau ich mir am Wochenende mal an.
Den Syntax-Fehler 3295 hatte Wolfgang in #13 auch schon berichtet. Bei ihm lag es wohl an einem fehlenden Leerzeichen im Befehl 'DROP TABLE' ... könntest Du mal per schrittweise ausführen überprüfen, was da genau in t.name steht, wenn der Fehler auftritt?

vonson
29.09.2007, 18:13
...ich fürchte, der Fehler kam Zustande, weil eine meiner Tabellen einen Bindestrich im Namen enthielt. Irgendwie war mir nicht klar, daß das problematisch ist...

Arne Dieckmann
29.09.2007, 19:14
In Beitrag #15 gab's das gleiche Problem ... :p

Wenn man diese Zeile ein wenig anpasst (s. eckige Klammern), sollten Tabellennamen mit Sonderzeichen nicht mehr so viel Schwierigkeiten bereiten:

CurrentDb.Execute "DROP TABLE [" & t.Name & "];"

hcscherzer
30.09.2007, 10:30
Moin zusammen,

@Arne: vielen Dank für den Hinweis, das Problem mit den Tabellennamen zu lösen.
@Ted: bei der Gelegenheit habe ich Deinen Vorschlag aus #8 auch berücksichtigt.

vonson
30.09.2007, 14:32
Vielen Dank!

mbvanfan
03.12.2007, 10:55
Hallo,
bin gerade über die Forumsuche auf Deinen Beitrag zur Lösung des Problems variabler Pfadnamen der Backend-DB gestoßen. Ich denke, Deine Muster-DB würde auch mein aktuelles Problem wohl absolut lösen.
Die Muster-DB selbst konnte ich aber nicht (mehr) finden.
Wäre es möglich, mir diese nochmal bereit zu stellen?
Vielen Dank
Michael

hcscherzer
04.12.2007, 08:14
Moin Michael,
schau mal in #24 da ist die aktuelle Version (ich habe die alten jeweils löschen lassen, wenn ich Änderungen vorgenommen habe).

Crady
10.02.2008, 19:29
Hallo, zusammen!

Vielen Dank erstmal für diese Entwicklungsarbeit!

Leider habe ich nur sehr wenig Ahnung von Access - geschweige denn von VB Scripten...

ABER: Ich habe es geschafft, die DemoDatenbank aus Post #24 zu nutzen!

Nur würde ich die Funktion gerne dahingehend abändern, dass ich bei jedem öffnen des FE das zu verküpfende BE auswählen muss. (verschiedene Datenstände der BEs)

Leider weiß ich nicht, was ich da ändern muss, damit es funktioniert... Ich dachte zunächst daran, einfach VOR dem ausführen von init() einfach in die sys Tabelle einen ungültigen Pfad einzutragen... Aber selbst das bekomme ich nicht hin... :(

Es wäre schön wenn mir da jemand unter die Arme greifen könnte.

Danke!

Crady
10.02.2008, 20:42
ok.. ich habe es gefunden:

sBEPath = "c:\dummy.mdb"

ist zwar nicht die feine Art... aber es funktioniert!

Danke!

Crady
11.02.2008, 18:22
Nochmal Hallo, zusammen!

Da ich Probleme damit habe ein BE zu verlinken wenn bereits ein odere mehrere User darin arbeiten (dauer eeeeeeeeeeeeewig lange) würde ich das init() folgendermaßen abändern:

Wenn das zuletzt geöffnete BE noch an seinem Ort ist, möchte ich eine Frage einbauen, ob dieses benutzt werden soll, oder ob ein anderes geladen werden soll.

Falls das zuletzt geöffnete BE nicht mehr an seinem Ort ist, wird ja dann eh ein neues BE verlinkt.

Leider reichen meine VB Kenntnisse bei weitem nicht daran, dies selbst hinzubekommen :(

Daher würde ich gerne auf Eure Hilfe mittels einiger hilfreicher Tipps bauen...

Vielen Dank schonmal im Voraus!

Hintergrund: Weil der Chef es so will arbeiten wir mit verschiedenen BEs (wechseln Wochenwise) daher habe ich die Funktion wie oben angegeben geänder, dass JEDES mal das BE neu verlinkt wird. Auch wird mein Chef wohl hoffentlich bald an EINEM neuen BE arbeiten, und so haben wir die Möglichkeit, trotz vorhandenem BE das "neue" zu testen.

networker007
22.02.2008, 01:11
hallo liebe gemeinde,

das "verlinkte backend" eine tolle idee... klasse - nur bei mir funktioniert garnix irgendwie....

meine umgebung:
- win xp pro
- access 2002

ich habe die module und das macro in meine mdb (fe) importiert und dann meine mdb gestartet und dann kommt gleich mal eine fehlermeldung.

hilfeeeeeee???

Arne Dieckmann
22.02.2008, 07:40
Starte die Datenbank mit festgehaltener Shift-Taste, um das Autoexec-Makro zu umgehen und konsultiere dann FAQ 7.11 (Klick mich) (http://www.donkarl.com/FAQ/FAQ7Bugs.htm#7.11).

networker007
22.02.2008, 08:25
Starte die Datenbank mit festgehaltener Shift-Taste, um das Autoexec-Makro zu umgehen und konsultiere dann FAQ 7.11 (Klick mich) (http://www.donkarl.com/FAQ/FAQ7Bugs.htm#7.11).

s u p e r - danke. das wars.

Crady
11.03.2008, 16:36
Hallo, zusammen!

Hat einer von Euch Profis noch einen Tip für mich? Ich nutze diese Funktion von hcscherzer zwar zur Zeit aber nur mit mäßigem Erfolg...

Ich habe die Funktion so geändert, dass beim Start der DB immer das zu verlinkende BE ausgeählt werden muss. Allerdings ist die Arbeit dann mit der DB sehr schleppend und es kommt häufiger zu abstürzen (defektes BE)...

Wenn ich die Funktion in einem "Admin" Formular einbaue um ein BE zu verknüpen und zum start der DB immer das letzte, verknüpfte nutze, geht die Arbeit mit der DB sehr flüssig und es gibt kaum Problemem mit einem defekten BE...

Kann mir vielleicht jemand einen Tip geben, woran das liegen könnte? Denn die Idee von hcscherzer ist einfach Genial und ich muss so meinen Kollegen nicht jedesmal erklären, wie sie sich das neue FE zum neuen BE kopieren müssen...

Verzweifelter Gruß aus Kölle!

Crady

hcscherzer
11.03.2008, 21:45
Moin Crady,
ich kann jetzt nicht genau nachvollziehen, woher die Defekte in Deinem BE und die Abstürze herrühren. Wenn ich die Funktion in einem "Admin" Formular einbaue Wie muss man sich das jetzt vorstellen?

Crady
11.03.2008, 21:59
Tach auch!

Also: Normalerweise möchte ich Deine Funktion dazu nutzen, dass beim Start der Anwendung JEDES mal ein neues BE verknüpft werden kann. Das habe ich so gelöst, dass ich in Deinen Code einfach eine "Dummy.mdb" als "letztes BE" eingetragen habe, die natürlich nicht gefunden wird und so wird das ausgewählte BE eingebungen.

Deine Funktion wird direkt beim Start ausgeführt. - Als Formular, welches beim Laden Deinen Code ausführt und, dann das Menü öffnet und sich dan schließt.

Dann gibt es diese Probleme...

Wenn ich aber Deine Funktion per Knopf in einem Formular (Bei mir Admin-Formular) ausführe - also ein BE verknüpfe - und beim nächsten Öffnben der DB direkt das Menü starten lasse, ohne beim start neu zu verlinken, läuft die ganze Anwendung weitgehend Problemfrei und erheblich schneller...

Ich hoffe Du verstehst jetzt was ich meine...

Gruß

Crady

hcscherzer
11.03.2008, 22:33
Ich verstehe, was Du meinst und wohl auch, was Du machst.
Aber ich kann - ehrlich gesagt - das Phänomen der auftretenden Probleme nicht nachvollziehen ...

Crady
12.03.2008, 15:59
Tja, schade! Denn wenn ich das per relink mache entsteht genau das gleiche Problem...

Es ist sogar auf meinem Heimnetzwerk nachzuvollziehen (mit der Geschwindigkeit - nicht mit den defekten Backends)

FM66
01.04.2008, 12:09
Hallo Hans-Christian !

Habe mir deine Code mal zu nutze gemacht läuft wirklich klasse :) :) .

Gruß
Frank

Meras
30.05.2008, 08:59
Hm... also ich habe nun aus der FE-Datei die beiden Module und das Makro importiert.. habe eine Tabelle "sys" angelegt mit dem Attribut "dbnam"

wenn ich das backend nun umbenenne und dann das frontend starte, tuts nix.. die Tabellenverlinkungen sind immer noch die selben.. an was könnte das liegen?

in der Tabelle sys ist auch nichts abgespeichert.. und wenn ich das frontend ohne die Tabelle sys starte, dann kommt aber ein Fehler, dass die Tabelle nicht gefunden werden konnte.. also irgendwas tuts schon^^

Edit:
mh... nun habe ich den Pfad der Backend manuell in die Tabelle sys eingetragen .. und schon funktionierts.. auch wenn ich die Backend mal umbenenne... ist das so gewollt?

hcscherzer
30.05.2008, 23:09
Moin zusammen,

habe eine Tabelle "sys" angelegt mit dem Attribut "dbnam"Eigentlich sollte da ein Fehler (94, denn DLookUp() liefert in diesem Fall Null) auftreten, wenn nix im Feld dbnam drin steht. In meiner Sys ist ein PK auf dem Feld und es ist nie leer gewesen deshalb habe ich den Fehler bisher nicht abgefangen. Auf die Idee, dass sich jemand die Tabelle neu erstellt statt sie auch zu kopieren, bin ich ehrlich gesagt nie gekommen.

Wenn überhaupt kein Datensatz vorhanden ist, wird die Do While Schleife mit der Prüfung überhaupt nicht angesprungen. Aber versuch danach mal eine verknüpfte Tabelle zu öffnen, wenn das Backend umbenannt worden ist ...

Danke jedenfalls für den Hinweis.
Download (http://ms-office-forum.net/forum/showpost.php?p=1117943&postcount=43)

Andreas Scholl
05.06.2008, 08:50
Deine Lösung funktioniert KLASSE!

Ich möchte aber, wie ein Vorredner/schreiber auch, den Dialog mit der Auswahl eines Backends auch manuell über eine Schaltfläche anstoßen.

Hast Du einen Tipp?


Andreas

hcscherzer
05.06.2008, 14:14
Moin zusammen,
hier kommt die Version 4 vom AutoLink.
Der Fehler 3044 - > Pfad oder Laufwerk nicht vorhanden ist jetzt auch noch abgefangen.
Ein Formular ist integriert, mit dem ein beliebiges BackEnd verknüpft werden kann.

Andreas Scholl
05.06.2008, 17:03
Vielen Dank für die superschnelle Umsetzung.

Ich bekomme beim manuellen Anstoßen des Neueinbindens folgende Fehlermeldung (siehe Bild im Anhang..)

Viele Grüße


Andreas

Arne Dieckmann
05.06.2008, 17:21
Alter Fehler, alter Lösungsvorschlag: Demo-Datenbank - Automatisch verlinktes BackEnd (Beitrag #23).

hcscherzer
05.06.2008, 17:44
Alter Fehler
Jessas ... oberpeinlich. Den ollen Fehler wieder eingebaut.
Kommt davon, wenn man keine ordentlich Versionierung hat und an verschiedenen Arbeitsplätzen unterwegs ist. Bitte vielemale um Vergebung.
@Arne: Danke für den Hinweis.

Korrigierte Version anbei.

Andreas Scholl
05.06.2008, 18:03
SUUPI! Funzt einwandfrei!

Vielen Dank.

Andreas

PS: Darf ich noch ein Wunsch äußern? Ein Feld in einem Formular, in dem angezeigt wird, mit welchem Backend / Pfad aktuell gearbeitet wird....

hcscherzer
05.06.2008, 18:11
@Andreas: das solltest Du doch auch selbst hinkriegen, oder?
Erstelle einfach ein Textfeld und fülle es mit=DomWert("dbnam";"sys")

Andreas Scholl
06.06.2008, 08:21
Jepp, das kriege ich gerade noch hin... :D

Danke!

Andreas

DerSchatten
01.12.2008, 18:43
Hallo Leute,
der Beitrag ist ja schon etwas älter, vielleicht kann mir trotzdem jemand weiterhelfen.

Ich habe das Script in meine Datenbank inkludiert. Das Problem jedoch ist, daß mein Backend mit einem Kennwort verschlüsselt ist. Jetzt bekomme ich beim automatischen verknüpfen den Fehler 2031 - Kein zulässiges Kennwort.

Kann man das Script dementsprechend anpassen, daß auch das korrekte Kennwort übergeben wird? Oder ist das technisch unmöglich?

hcscherzer
02.12.2008, 08:15
Schau mal in die OnlineHilfe zur Methode OpenDatabase(); mit dem vierten Parameter sollte es möglich sein, ein Passwort zu übergeben.
Ich habe das allerdings noch nie ausprobiert und kann insofern kein funktionables Beispiel liefern ...

DerSchatten
02.12.2008, 19:10
Danke für deine rasche Antwort.
Das funktioniert wunderbar.

Jetzt hätte ich noch eine Frage.
Ich möchte das ganze so weit wie möglich abspecken.

Dazu habe ich mir folgende Zeilen zusammengesucht:


Function OpenDB()
Dim dbx As DAO.Database
Dim T As DAO.TableDef
Dim BEDatei As String
On Error GoTo Fehler

BEDatei = Application.CurrentProject.Path & "\WinMovieBaseData.accdb"
Set dbx = DBEngine.Workspaces(0).OpenDatabase(BEDatei, False, False, "MS Access;PWD=auto")
For Each T In dbx.TableDefs()
If InStr(1, T.Name, "MSys") = 0 Then tabcheck T.Name, BEDatei
Next
Set dbx = Nothing
Exit Function

Fehler:
MsgBox "Back-End Datenbank nicht gefunden! Bitte stellen Sie sicher das sich die Datei: WinMovieBaseData.accdb im selben Verzeichnis befindet.", vbCritical, "Fehler!"
Application.Quit

End Function


Sub tabcheck(tabnam As String, quelle As String)
Dim rs As DAO.Recordset
On Error GoTo tabcheck_err

Set rs = CurrentDb.OpenRecordset(tabnam)
rs.Close

tabcheck_exit:
On Error GoTo 0
Exit Sub

tabcheck_err:
If Err.Number = 3078 Then
DoCmd.TransferDatabase acLink, "Microsoft Access", quelle, acTable, tabnam, tabnam
ElseIf Err.Number = 3024 Or Err.Number = 3044 Or Err.Number = 3043 Then
CurrentDb.Execute "DROP TABLE " & tabnam & ";"
Else
MsgBox "Fehler: " & Err.Number & " - " & Err.Description
Stop
End If
Resume

End Sub


Funktioniert soweit wunderbar. Ein kleines Problem ist nur, wenn Access 2007 die Tabellen neu verknüpfen muß, öffnet sich automatisch die Objekt-Leiste auf der linken Seite mit. Wie gesagt nur beim neu verknüpfen. Habe ich da etwas zu viel weggelassen?

DerSchatten
02.12.2008, 21:33
habe gerade gemerkt das dies auch bei deiner der fall ist.

hcscherzer
02.12.2008, 21:46
Ich selber verwende Access 2007 (noch) nicht und kann das nicht nachvollziehen. Sorry. Aber wenn ich mich recht erinnere, hatte Ruedi (Lanz Rudolf) mir mal berichtet, er hätte es angepasst ... wie, hat er mir leider nicht verraten. Vielleicht fragst Du ihn noch einmal?

thomasreick
22.01.2009, 15:28
Hallo zusammen,
ich binde BE-Daten in ein FE ein. Dies soll aber nur passieren wenn das BE verschoben ist und das FE die Daten nicht findet.

So weit so gut.
Unter A2003 bei deutschem XPPro problemlos.
Auf A2003 bei "denglischem" XPro mußte "Or Err=3044" ergänzt werden
Bei verbinden mit dem Backend auf dem ebenfalls denglischen Server kam zusätzlich noch "Or Err=3078" dazu.

Meine Fragen
Ist generell der unten angehängte Code geeignet eine Prüfung zum Anstoß der BackEnd-Einbinde-Prozedur vorzunehmen?
Gibt es eine weniger fehleranfällige Variante?

Es wird die Pries'sche FileDialog-Klasse benutzt, Umgebung A2003/XPPro

Vielen Dank für Informationen

Thomas

'---------------------------------------------------------------------------------------
' Procedure : Form_Open
' Author : Ich
' Date : Oktober 2008
' Purpose : Prüfen, ob Daten vom Backend gelesen werden können
' um Neueinbinden beim Start der Tabellen zu umgehen,
' falls Standort des BE unverändert
'---------------------------------------------------------------------------------------
'
Private Sub Form_Open(Cancel As Integer)
Dim test As Long
On Error GoTo Form_Open_Error
'Lokale Dummyvariable "test" mit Anzahl der Datensätze einer Tabelle füllen
test = Nz(DCount("pk", "tblMeineTabelle"), 0)

ex:
On Error Resume Next
Exit Sub

Form_Open_Error:
'Provoziertes Abfangen des Anwendungs- oder objektdefinierten Fehlers
If Err = 3024 Then 'später ergänzt um Or Err = 3044 Or Err = 3078
'Backend neu einbinden
Call TabellenEinbindenBeispielaufruf 'Dank an André Minhorst
Else
Call fctHandleLfz("Form_frmLogin", "Form_Open") 'Fehlerhandler aufrufen und LFz behandeln
End If

Resume ex

End Sub

hcscherzer
22.01.2009, 20:39
Moin Thomas,

hast Du Dir mein Beispiel mal angeschaut?
Ich fange in meine Prozeduren die Fehler 3024, 3043, 3044, 3059 und 3078 sowie in Zusammenhang mit dem Eintrag in der Tabelle 'sys' die 94 ab.

thomasreick
23.01.2009, 09:27
Hallo hcscherzer,
danke für deine Antwort. Erst einmal aber eine Antwort auf deine Frage: Nein, ich habe mir deine Lösung noch nicht angesehen, werde es aber gleich tun.

Meine Frage zielt eher darauf ab, ob die provozierte Erzeugung eines Fehlers das richtige Herangehen an eine solche Prozedur ist, oder ob es bessere Wege gibt.

Das Teil ist schon im produktiven Einsatz, daher möchte ich zur Zeit möglichst wenig grundlegendes verändern.

Mittlerweile wird sogar überlegt, ob überhaupt eine Prüfung vorgenommen werden soll, oder grundsätzlich bei Start neu verknüpft wird. Dann sind die Fehlermeldungen auch Geschichte.

SchreibWas
Thomas

hcscherzer
24.01.2009, 15:37
die provozierte Erzeugung eines Fehlers

Wenn Du prüfen willst, ob das verknüpfte Objekt (=Tabelle) so vorhanden ist, wie die Verknüpfung es ausweist, gibt es imho nur den Weg, auf das Objekt zuzugreifen und damit ggf. einen Fehler hervorzurufen.

Eine andere Möglichkeit fällt mir nicht ein.

admin129
03.09.2009, 23:39
Hallo hcscherzer!

Finde ich echt super das Ding - habe es gerade implementiert!
Kannst Du mir sagen wie und wo ich einstellen soll, das er nur die dann das Formular Main anzeigt, wenn sich etwas geändert hat? Weil lt. dem Makro zeigt er es ja immer an


Danke und Grüße

hcscherzer
04.09.2009, 11:29
das er nur die dann das Formular Main anzeigt, wenn sich etwas geändert hat?
Nimm das 'Formular öffnen' aus dem AutoExec Makro raus - dann öffnet sich das Formular Main nicht mehr automatisch.

Was meinst Du mit: 'wenn sich etwas geändert hat'?
Das FE öffnet den DateiDialog, wenn die BackEnd DB nicht dort ist, wo die verknüpften Tabellen gefunden werden (können).

admin129
09.09.2009, 06:44
Hallo Zusammen!

Ich habe diese Lösung auch integriert und versucht dies mittels mit Passwort geschützter Backend Datenbank zu realisieren.

Ich bin wie folgt vorgegangen

Habe die Init geändert, siehe unten (roter Teil), danach habe ich die Backend Datenbank aufgerufen und mittels Extras > Sicherheit > Datenbankkennwort festlegen die Datenbank mit dem Kennwort "geheim" geschützt.
Danach habe ich den Ordner wo beide DBs drinnen liegen an eine andere STelle geschoben und aufgerufen, er hat den OpenFile-Dialog gebracht, ich habe die DB ausgewählt (Backend) und folgende Fehlermeldung bekommen:

Fehler: 3031 - Kein zulässiges Kennwort


Code:

Function init()
Dim pfad As String
Dim dbx As DAO.Database
Dim rs As DAO.Recordset
Dim t As DAO.TableDef
Dim sBEPath As String
On Error GoTo init_err

Set rs = CurrentDb.OpenRecordset("sys")

If rs.EOF Then
MsgBox "Keine Verbindung zur Datenbank", vbCritical, "Achtung"
rs.AddNew
rs!dbnam = "dummy"
rs.Update
End If

Do While Not rs.EOF

sBEPath = rs!dbnam
If InStr(1, sBEPath, "\") = 0 Then
pfad = Application.CurrentProject.Path & "\" & sBEPath
Else
pfad = sBEPath
End If

Set dbx = DBEngine.Workspaces(0).OpenDatabase(pfad, , , "pwd=geheim")
For Each t In dbx.TableDefs()
If InStr(1, t.Name, "MSys") = 0 Then tabcheck t.Name, pfad
Next

rs.MoveNext

Loop
rs.Close

init_exit:
Set dbx = Nothing
On Error GoTo 0
Exit Function

init_err:
If Err.Number = 3024 Or Err.Number = 3044 Then
pfad = DateiOeffnen(Application.CurrentProject.Path, "BackEnd Datenbank öffnen")
If pfad <> "" Then
db_aendern (pfad)
Else
Application.Quit
End If
ElseIf Err.Number = 3059 Then
Application.Quit
ElseIf Err.Number = 94 Then
MsgBox "Kein Dateiname im Feld 'sys.dbname'", vbCritical, "Achtung"
rs.Edit
rs!dbnam = "dummy"
rs.Update
ElseIf Err.Number = 3078 Then
MsgBox "Keine Tabelle 'sys' vorhanden", vbCritical, "Achtung"
DoCmd.SetWarnings False
DoCmd.RunSQL "SELECT 'dummy' AS dbnam INTO sys;"
DoCmd.SetWarnings True
Else
MsgBox "Fehler: " & Err.Number & " - " & Err.Description
Stop
End If
Resume

End Function


Was mache ich falsch?

Danke und Grüße

fadass
09.09.2009, 07:17
Versuch mal
Set dbx = DBEngine.Workspaces(0).OpenDatabase(pfad, , , ";pwd=geheim")

admin129
09.09.2009, 18:56
Hallo fadass habe es gemacht, bekomme aber immer noch die gleiche Fehlermeldung

Was mache ich noch falsch?

Grüße und Danke

hcscherzer
09.09.2009, 19:52
Hast Du mal in der OnlineHilfe über die Methode .OpenDatabase() nachgelesen?

/OT: btw - liest Du Deine PM's eigentlich?

GrafFoto
08.10.2009, 15:30
Hallo.

Ich hatte bislang den Tabellenverknüpfungsmanager per Button in meinem Projekt, musste aber feststellen, dass sich damit keine Runtime erzeugen lässt. Die DB stürzt sofort ab, wenn ich diese Funktion aufrufe.

Aber mit deiner wunderbaren Lösung habe ich es problemlos hinbekommen. Läuft super - auch in der Runtime.

Vielen Dank!

rr20051112
28.07.2010, 15:39
wie ist denn das Statement für 64 Bit Anwendungen?


Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(DateiDialogStruktur As DateiDialogStruktur) As Long
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(DateiDialogStruktur As DateiDialogStruktur) As Long



Diese Statements werden bei der Portierung nach 64 Bit angemeckert.

hcscherzer
28.07.2010, 15:57
Keine Ahnung, ich hab hier noch kein Access unter 64 Bit laufen.
Mit den neueren Versionen (ab 2003) könnte man die ganze handgestrickte DateiDialog-Geschichte durch die vorhandene Methode Application.FileDialog ersetzen. Ich bin bisher nur noch nicht dazu gekommen ...

rr20051112
28.07.2010, 16:41
OK, ich habe im Netz mal herumgesucht und auch was gefunden:

Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (GetOpenFileName)

Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(DateiDialogStruktur As DateiDialogStruktur) As Long
Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(DateiDialogStruktur As DateiDialogStruktur) As Long


das rote rote kommt dazu, dann läuft es auch unter 64 bit. :mrcool:

flo1976
06.08.2010, 09:31
Vielen Dank für die Demo-DB! Sehr nützlich und hilfreich!

Gruß
Flo

mabe79
17.08.2010, 15:47
Hallo fadass habe es gemacht, bekomme aber immer noch die gleiche Fehlermeldung

Was mache ich noch falsch?

Grüße und Danke

Hey..
hatte gleiches Problem!
konnte mit : Set dbLink = DBEngine(0).OpenDatabase(strDBPath, False, False, strPassword) hier als Beispiel gelöst werden.
man beachte die beiden "False" ... die sind notwendig.

palexg
11.10.2010, 21:57
Guten abend,

ich finde eure Arbeit wirklich spitze, habe aber noch folgendes Problem bei dem Ihr mir vielleicht behilflich sein könnt.
Ich habe mehrere Backends die ich mit dem FE verbinden möchte.
Bei mir funzt das aber nicht...
Ich habe zwei ändern Dialoge, wobei jedes mal vor dem löschen der alten tabellen abgefragt wird wie diese beginnen (bei mir z.B. tb1 die aus dem ersten backend und tb2 die aus dem 2. Backend) damit nicht immer alle Tabellen gelöscht werden.

Trotzdem funzt das nicht?
Irgendeine Idee?
Oder mache ich generell etwas falsch und im original Autolink ist die Verbindung mehrerer BE möglich, wenn ja erklährt es mir.

Danke #
PAlexG

hcscherzer
12.10.2010, 07:05
Hallo und willkommen im Forum.
Prinzipiell ist das wohl möglich, auch mehrere BackEnds zu verwalten.
Mit der hier liegenden Version 04a aber nicht.
Dazu müsste die Tabelle sys erweitert (Indexfeld und Feld mit dem Bezeichner für die Tabellenverknüpfungen) sowie die daruf zugreifenden Prozeduren daraufhin angepasst werden.

Marsu65
13.10.2010, 19:18
@PAlexG
Guck mal hier (http://ms-office-forum.net/forum/showthread.php?t=250092)
Das Tabellenverknüpfungsformular baut auf HCs Beispiel auf. Damit kannst du mehrere BEs verwalten.

martinmh51
31.05.2012, 10:13
Hallo zusammen,

was muss ich an dem Code ändern um den auf Access 2007 umzustellen? Ich kann zwar das frontend konvertieren, aber bei der Verknüpfungsfunktion bietet er mir immer nur ".mdb" an...

Gruß
Martin

hcscherzer
31.05.2012, 11:11
Hallo Martin,
willkommen im Forum.
was muss ich an dem Code ändern um den auf Access 2007 umzustellen?
Eigentlich nichts ...

bei der Verknüpfungsfunktion bietet er mir immer nur ".mdb" an...
Kannst Du mal sagen, was Du damit meinst, bzw. an welcher Stelle im Code das geschieht?

martinmh51
31.05.2012, 13:56
Hallo Martin,
willkommen im Forum.

Eigentlich nichts ...

Kannst Du mal sagen, was Du damit meinst, bzw. an welcher Stelle im Code das geschieht?


Hat sich erledigt, ich musste in dem Code vom FileDialog das .mdb durch ein .accdb ersetzen.

martinmh51
31.05.2012, 13:59
Hat sich erledigt, ich musste in dem Code vom FileDialog das .mdb durch ein .accdb ersetzen.


Dafür habe ich jetzt eine andere Frage. Ich hab ein frontend lokal auf dem Rechner und ein backend auf einem Netzlaufwerk/ server. Wenn ich Hyperlinks einfügen will, dann geht Access immer von dem Ordner aus, in dem die Datenbank liegt. Ich will aber trotz lokal geöffneter Datenbank die zu verlinkenden Dateien in einem Ordner auf dem Netzlaufwerk speichern. Wie kann ich diesen Ordner direkt vorgeben(möglichst als UNC-Pfad)? Das dort "hin-klicken" ist ziemlich mühseelig...

Gruß
Martin

hcscherzer
31.05.2012, 14:29
musste in dem Code vom FileDialog das .mdb durch ein .accdb ersetzen.Ja, das sollte ich mal als zusätzliche Option hier mit einbauen, da hast Du Recht ...

Der Vorgabepfad, in dem AutoLink den Datei_Öffnen Dialog anzeigt, ist hinterlegt mit dem Ordner des FrontEndApplication.CurrentProject.Path
Das kannst Du in den String mit dem UNC Pfad ändern an den Stellen, wo es steht bzw. von wo Du es verwendest (im Modul Form_Main Zeile 9 und im Modul Dienstprogramme Zeile 48).

martinmh51
31.05.2012, 14:35
Ja, das sollte ich mal als zusätzliche Option hier mit einbauen, da hast Du Recht ...

Der Vorgabepfad, in dem AutoLink den Datei_Öffnen Dialog anzeigt, ist hinterlegt mit dem Ordner des FrontEndApplication.CurrentProject.Path
Das kannst Du in den String mit dem UNC Pfad ändern an den Stellen, wo es steht bzw. von wo Du es verwendest (im Modul Form_Main Zeile 9 und im Modul Dienstprogramme Zeile 48).


Ich bin mir nicht sicher ob ich mein Anliegen richtig rübergebracht habe...

Ich habe frontends (lokal) und ein backend (server) mit den Tabellen. In einer der Tabellen ist die Möglichkeit, Hyperlinks anzulegen, damit die Datenbank nicht zu groß wird. Diese Hyperlinks sollen beim backend liegen... Access öffnet mir jedoch immer den Ordner in dem mein lokales frontend liegt. Also muß ich mich jedesmal wieder zum backend durchklicken...

hcscherzer
31.05.2012, 15:07
Diese Hyperlinks sollen beim backend liegenUnd diese Hyperlinks in der BackEnd-Tabelle was stellen die wiederum dar? Verknüpfungen zu weiteren Back-Back-End-Datenbanken? Oder Vernüpfungen zu Dateien?
Access öffnet mir jedoch immer den Ordner in dem mein lokales frontend liegt.Und: wann genau geschieht dies? Meine Kristallkugel ist etwas beschlagen ...

hcscherzer
31.05.2012, 15:08
Hier ist mal eine Version vom AutoLink im "neuen" Format (accdb), die auch accdb-BE's einbinden kann.

martinmh51
31.05.2012, 15:23
Und diese Hyperlinks in der BackEnd-Tabelle was stellen die wiederum dar? Verknüpfungen zu weiteren Back-Back-End-Datenbanken? Oder Vernüpfungen zu Dateien?

Also in der backend-Tabelle werden Hyperlinks zu Dateien, hauptsächlich pdf`s hinterlegt, die -damit sie von allen Usern gelesen werden können- auf dem Netzlaufwerk (in der Nähe vom backend) liegen.

Und: wann genau geschieht dies? Meine Kristallkugel ist etwas beschlagen ...


Wenn ich in dem Feld im frontend auf "rechte Maustaste-Hyperlink bearbeiten" klicke, nimmt er immer den Ordner in dem das lokale frontend liegt. Access soll an dieser Stelle aber den Ordner auf dem Netzlaufwerk nehmen auf dem das backend liegt...

Gruß
Martin

hcscherzer
31.05.2012, 15:42
Aha.
Das ist dann allerdings ein Thema, das hier im Code-Archiv und insbesondere mit dem Auto-Link nichts zu tun hat. Das war dann falsch von Dir, diese zusätzliche Frage (#77) hier zu stellen und ich hatte den Hintergrund nicht sofort verstanden. Sonst hätte ich Dir schon vorhin empfohlen, was ich jetzt tue: Eröffne bitte einen Thread im Access-Forum zu dem Thema und beende den Dialog hier.