PDA

Vollständige Version anzeigen : Datenbank aus Datenbank öffnen


Britta28
19.02.2003, 11:03
Hallo,
ich möchte gerne aus einer kleinen vorgeschalteten (Access2000)-Datenbank eine weitere Datenbank öffnen, die dann die aktuelle sein soll. Die erste kann und soll geschlossen werden. Mit dem folgenden Modul tut sich jedoch nur ein leeres Anwendungsfenster auf. Woran liegt´s? Wie kann ich eine weitere Datenbank per VBA aus Access öffnen?

Option Compare Database

Dim appAccess As Access.Application

Public Function Oeffnen()

Application.CloseCurrentDatabase

Set appAccess = New Access.Application
appAccess.OpenCurrentDatabase "E:\xyz.mdb"

End Function

tom70
19.02.2003, 11:09
Du kannst das z.B. auch so erreichen

Public Function Oeffnen()
test = "c:\xyz.mdb"
FollowHyperlink test
DoCmd.Quit
End Function

Gruß tom70

Markus
18.03.2003, 15:59
ich möchte dieses Thema aufgreiffen

Die FollowHyperlink ist ne gute Sache...

aber mit der OpenCurrentDatabase-Methode kann auch das Datenbankkennwort übergeben werden!

Ziel: Frontend ist mde mit Kennwort, Backend ist mdb mit Kennwort

Es wird eine kleine mde mit obigem Code erstellt, die das Frontend öffnet. Dass Kennwort ist kombiliert und nicht zugänglich. Verknüpfte Tabellen sind im Frontend durch das Kennwort geschützt.

Also wie lässt dich eine mdb/mde per mdb öffnen?

Hoffnungsvoll
Markus

Markus
18.03.2003, 22:16
und hops.......

Aquarii
18.03.2003, 23:12
Hallo Markus,

bei DonKarl (http://www.donkarl.com/) Tipp 1.13 hast Du schon geschaut?

Markus
18.03.2003, 23:17
ich habe hier im Forum einige Lösungen mit der Shell-Funktion gefunden...

bin ich da falsch?... aber meines Wissens kann mit dieser Methode das Kennwort nicht mitgegeben werden.

Also das einfache, relativ leicht knackbare :D Kennwort, nicht das Passwort einer *.mdw

Markus

Markus
25.03.2003, 16:14
?

Markus
10.04.2003, 17:16
vielleicht hab ich heute einen Glückstag?

Aquarii
10.04.2003, 22:27
Hallo Markus,

ob heute Dein Glückstag ist, weiß ich nicht, ;) aber versuche es einmal damit:

Du must eine zweite Instanz von Access laden, dort die kennwortgeschützte Datenbank öffnen und diese in den Vordergrund bringen. Versuche es mit folgender Funktion (in einem allgemeinen Modul):


Sub OpenDB(strDB As String, strPasswort As String)
Dim db As DAO.Database
Dim objAcc As Access.Application

On Error Resume Next
Set objAcc = New Access.Application
If Err <> 0 Then
Beep
MsgBox "Access-Instanz konnte nicht geöffnet werden", _
vbOKOnly + vbCritical, "Öffnen nicht möglich"
Exit Sub
End If

With objAcc
If strPasswort <> "" Then
Set db = .DBEngine.OpenDatabase(strDB, _
False, False, ";PWD=" & strPasswort)
End If
.OpenCurrentDatabase strDB
.RunCommand acCmdAppRestore
.RunCommand acCmdAppMaximize
If strPasswort <> "" Then
db.Close
End If
End With

End Sub

Die Funktion rufst Du dann beispielsweise wie folgt auf:

OpenDB "C:\Test\Test 2.mdb", "Passwort"

wobei "Passwort" für das Kennwort der DB steht.

Arne Dieckmann
10.04.2003, 22:31
Wobei ich aber den Aufruf mittels OpenDB "C:\Test\Test 2.mdb", "Passwort" dann nur auch wieder in einer "geschützten Umgebung" (z.B. MDE) empfehlen würde. Ansonsten ist das Kennwort doch für die Katz. ...

Aquarii
10.04.2003, 22:40
Hallo Arne,

ich denke, das ist so geplant:

Es wird eine kleine mde mit obigem Code erstellt, die das Frontend öffnet. Dass Kennwort ist kombiliert und nicht zugänglich. Verknüpfte Tabellen sind im Frontend durch das Kennwort geschützt.

Markus
11.04.2003, 09:40
Ich werde das prüfen und mich melden.

...das wird nächste Woche sein :sun: have a nice Weekend

Markus

racoon0506
11.04.2003, 10:20
Hab bei Dev Ashish dies Hier (http://www.mvps.org/access/modules/mdl0005.htm) gefunden. Dabei soll keine zweite Acc-Instanz benötigt werden.
Ist vielleicht eine Alternative.....(habs selbst noch nicht ausprobiert)

Arne Dieckmann
11.04.2003, 11:24
@Aquarii: Oweia - hast ja recht. Ich sollte mal etwas genauer lesen. Sorry, wg. des Einwands (ich habe nur den ersten Beitrag genauer gelesen - dort war noch nicht von einer MDE die Rede).

Sascha Trowitzsch
11.04.2003, 12:10
@racoon0506: Mit Mikes TSISOON kann man aber nur eine neue DB ohne Passwort öffnen.

racoon0506
11.04.2003, 12:20
@Sascha
Wie schon gesagt, habs NOCH nicht selbst ausprobiert, ist aber gut, zu wissen. Und wie schaut das mit der unter "Prior Versions" angegebenen Variante mit Sendkeys aus? Lässt sich auf diese Weise ein PW mitgeben?

Markus
15.04.2003, 10:22
Zurück vom langen Wochenende - Danke allen für die rege Beteiligung!
Habe die Funktion von Heiko in einer eigenen mdb als Modul hinterlegt und Verweis auf DAO erstellt.

zusätzlich ein Formular mit dem Ereignis:

Private Sub Form_Activate()
OpenDB "g:sgu\rcs\myRCS.mdb", "Kennwort"
End Sub

eingerichtet. Dieses Formular habe ich in die Startbedingung eingetragen.

Das Programm läuft fehlerfrei ab, allerdings sehe ich keine zweite Instanz. Nach Ablauf vom Code bleibt die mdb mit geöffnetem Formular stehen.

gibt es spezielle Einstellungen die zu beachten sind?

Markus

Markus
16.04.2003, 22:12
habe jetzt auch noch den Code von Donkarl für xp gefunden (6.19):

Sub openRCS()
Dim appAcc As Access.Application
Set appAcc = CreateObject("Access.Application")
appAcc.OpenCurrentDatabase "g:\sgu\rcs\original\Umwelt Daten.mdb", False, "Kennwort"
End Sub

Das Programm läuft auch hier fehlerfrei ab, aber ohne Anzeige der neu geöffneten DB!. Dabei wird diese schon geöffnet, das erkenne ich daran, das bei einer Eingabe von einem falschen Kennwort, die Kennworterfassung aufgeht und erst nach korrekter Eingabe weiterfährt.

Beide Code-Varianten verhalten sich da gleich.

Wie kriege ich diese Instanz zur Anzeige? :(

Nouba
16.04.2003, 23:48
ich würde mal die Visible-Eigenschaft des Application Objekts auf True setzen.

Markus
17.04.2003, 11:09
habe folgenden Code:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"> <pre><span class="TOKEN">Sub</span> openRCS()
<span class="TOKEN">Dim</span> appAcc <span class="TOKEN">As</span> Access.Application
<span class="TOKEN">Set</span> appAcc = CreateObject(&quot;Access.Application&quot;)
appAcc.OpenCurrentDatabase &quot;g:\sgu\rcs\original\Umwelt Daten.mdb&quot;, False, &quot;Kennwort&quot;
appAcc.Visible = <span class="TOKEN">True</span>
appAcc.RunCommand acCmdAppRestore
appAcc.RunCommand acCmdAppMaximize
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>

und bei dem Code von Heiko hab ich zusätzlich
.Visible = true eingebaut.

leider verhalten sich beide Varianten wie zufor. Man sieht kurz ein aufflackern, so als würde die Anzeige sofort wieder von der aufrufenden mdb überdeckt. (wäre dann eine mde -wenns läuft)

wer weiss rat?

Markus

Nouba
17.04.2003, 11:19
und am Ende der Prozedur verlierst Du den Scope auf die Objekt-Variable. Lege diese mal als Formvariable oder in einem globalen Modul ab, damit das Resultat auch vor Augen erscheint.

Markus
17.04.2003, 11:24
Hallo Nouba

das tönt gut! Leider bin ich mit dieser Formulierung überfordert: wie erhalte ich den Scope (was heisst das?) mit einer Formvariable/Modul?

ein Bsp wäre hilfreich

Markus

Nouba
17.04.2003, 11:33
die Variable appAcc ist nur innerhalb der Prozedur definiert. Schreibe <i>Dim appAcc As Access.Application</i> an den Anfang (vor Prozeduren und Funktionen) in ein allgemeines Modul oder an den Anfang des Formular-Kodes.

Markus
17.04.2003, 11:49
na das war jetzt wirlich einfacher als ich zuerst dachte.... :)
Die DB wird jetzt als zweite Instanz angezeigt!

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"> <pre><span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
<span class="TOKEN">Dim</span> appAcc <span class="TOKEN">As</span> Access.Application
&nbsp;
<span class="TOKEN">Sub</span> openRCS()
<span class="TOKEN">Set</span> appAcc = CreateObject(&quot;Access.Application&quot;)
appAcc.OpenCurrentDatabase &quot;g:\sgu\rcs\original\Umwelt Daten.mdb&quot;, False, &quot;Kennwort&quot;
appAcc.Visible = <span class="TOKEN">True</span>
appAcc.RunCommand acCmdAppRestore
appAcc.RunCommand acCmdAppMaximize
<span class="REM">'wie schliesse ich hier an dieser Stelle die aufrufende mdb(e)??</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>


Es verbleibt noch das Problem, wie ich die aufrufende mde(b) schliessen kann. Bisher schliessen entweder beide Instanzen (Application.Quit), oder keine (CurrrentDb.Close)....

Markus

Nouba
17.04.2003, 11:53
appAcc.Quit
set appAcc = Nothing

schießt die aufgerufene Instanz - der umgekehrten Weg geht wohl nicht mit OLE-Automatisierung, dazu wären dann andere Methoden anzuwenden.

Markus
17.04.2003, 12:02
wäre es möglich? die aufrufende Instanz von der aufgerufenen Instanz aus zu schliessen?. Der Name der Datei ist ja bekannt.

Markus
20.04.2003, 15:27
Danke euch allen

hier das Produkt

(einziger Schönheitsfehler: das Startformular kommt bei mir nicht zentriert, sondern in der oberen linken Ecke..)

Feedback erwünscht

Markus

Markus
20.04.2003, 15:33
.

Aquarii
20.04.2003, 15:35
Hallo Markus,

mit nachfolgender Funktion kannst du ein Formular zentrieren:

Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, _
(Screen.Height - Me.Height) \ 2
End Sub

Markus
20.04.2003, 20:29
Danke für den Move-Tipp

habe etwas gespielt damit. Einige der Methoden (Screen.Width, Me.Height) funktionieren bei mir nicht. Mit absoluten Twips-Zahlen funktioniert es. Schlussendlich habe ich die Formulareigenschaft geändert. Automatisch Zentrieren nein.
Jetzt wird die absolute Position korrekt übernommen.

Die automatische Zentrierung versagt nur beim Startformular, danach läufts normal.

Gruss Markus

StehtimSchilf
20.05.2003, 12:14
Also bei mir funzt DIES nicht:

Dim accAppl As Access.Application
Dim dbs As DAO.Database

Dim strDB As String
Dim strPasswort As String

strDB = "X:\BLVK\STAMM\Stamm_Frontend.mdb"
strPasswort = "123123"

Set accAppl = New Access.Application
Set dbs = accAppl.DBEngine.OpenDatabase(strDB, False, False, ";PWD=" & strPasswort)

accAppl.RunCommand acCmdAppRestore
accAppl.RunCommand acCmdAppMaximize
accAppl.visible = True

accAppl.DoCmd.OpenForm "Frm_Abgleich_der_Mastertabellen", acNormal

accAppl.CloseCurrentDatabase
Set accAppl = Nothing

Bei der Zeile 'Set dbs =' erscheint trotzdem eine Dialogbox 'Anmelden'. (Jeder Benutzer ist an einer .mdw angeschlossen)

Nachdem ich mich angemeldet habe, erscheint der Fehler:
Fehler 3029
Kein zulässiger Kontoname oder kein zulässiges Kennwort!

klicke ich dann auf debugen und anschliessen auf F5 (Fortfahren) wird das Formular trotzdem geöffnet....

Wie erreiche ich es jetz, dass das kleine 'Anmelde'-Fensterchen nicht kommt? Und wieso erhalte ich den Fehler 3029?

thx
SiS

Markus
20.05.2003, 18:07
habe deinen Code ausprobiert. Fenster/Fehlermeldung bekomme ich keine, musste aber die openCurrentDatabase einbauen... damit neue Db geöffnet kommt.
leider kann ich nicht mit Ac2000 testen. Benutze Acxp

Ach ja: Das Kennwort hat nicht's mit dem mdw Passwort zu tun!

Markus

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"> <pre><span class="TOKEN">Dim</span> accAppl <span class="TOKEN">As</span> Access.Application
<span class="TOKEN">Dim</span> dbs <span class="TOKEN">As</span> DAO.Database
&nbsp;
<span class="TOKEN">Dim</span> strDB <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> strPasswort <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
strDB = &quot;g:\sgu\rcs\original\TrainRCS.mde&quot;
strPasswort = &quot;DasPWD&quot;
&nbsp;
<span class="TOKEN">Set</span> accAppl = <span class="TOKEN">New</span> Access.Application
<span class="TOKEN">Set</span> dbs = accAppl.DBEngine.OpenDatabase(strDB, False, False, &quot;;PWD=&quot; &amp; strPasswort)
&nbsp;
accAppl.OpenCurrentDatabase strDB
accAppl.RunCommand acCmdAppRestore
accAppl.RunCommand acCmdAppMaximize
accAppl.Visible = <span class="TOKEN">True</span>
&nbsp;
<span class="REM"> 'accAppl.DoCmd.OpenForm &quot;Frm_Abgleich_der_Mastertabellen&quot;, acNormal</span>
&nbsp;
<span class="REM"> 'accAppl.CloseCurrentDatabase</span>
<span class="REM"> 'Set accAppl = Nothing</span>
&nbsp;</pre></div>