title image


Smiley Re: Access fernsteuern, Parameteraustausch
Hallo Panos,



auch das ist möglich. Dummerweise bietet die .OpenReport - Methode des DoCmd - Objektes keine Öffnungsargumente (OpenArgs) wie die .OpenForm Methode.



Deshalb muß hier ein wenig anders vorgegangen werden.



Das Application - Objekt von Access bietet die Methode .Run, mit der man beliebige Sub - Prozeduren (Sub - nicht Function!) aufrufen kann. Dabei kann man bis zu 30 Parameter übergeben. Wenn man die Parameter ByRef übergibt, kann man sie auch wieder zurücklesen.



Hier also folgende Anleitung:





Erstelle ein neues Verzeichnis für unser Beispiel und in diesem Verzeichnis eine MS-Access Datenbank namens "MeineDatenbank".



Füge der neu erstellten Access-Applikation einen Bericht hinzu und nenne ihn "MeinBericht".

Naürlich muß der Bericht irgendwelche Daten ausgeben können. Erstelle also irgend eine Tabelle, die als Datenherkunft für diesen Bericht dienen kann.



Der Bericht erhält folgenden Code:

Option Compare DatabaseOption Explicit Private Sub Report_Close()    ' Da die öffentlichen Eigenschaften [DateVon] und [DateBis]    ' so lange erhalten bleiben, bis diese Instanz von Access.Application    ' geschlossen wird, könnte es bei einem erneuten Öffnen dieses Berichtes    ' (oder eines anderen Berichtes, der auf die selben Eigenschaften zugreift)    ' vorkommen, daß der zweite Bericht die Parameter des ersten enthält.    ' Deshalb lösche ich die Parameter aus Sicherheitsgründen beim schließen    ' des Berichtes.    DateVon = Null    DateBis = NullEnd Sub'-------------------------------------------------- Private Sub Report_Open(Cancel As Integer)    ' Beim öffnen des Berichtes werden die öffentlichen Eigenschaften    ' [DateVon] und [DateBis] abgefragt und in diesem Beispiel in    ' einer Message Box angezeigt.    ' Um die Werte tatsächlich auch zu verwenden, kann man in    ' dieser Prozedur die Datenherkunft ändern (Me.RecordSource) oder    ' die Filter - Eigenschaften einstellen (Me.Filter und Me.FilterOn).    Dim sMessage As String     If VarType(DateVon) = vbDate Then        sMessage = "Von " & Format(DateVon, "Long Date") & vbCrLf    Else        sMessage = "Von - keine Angabe -" & vbCrLf    End If     If VarType(DateBis) = vbDate Then        sMessage = sMessage & "Bis " & Format(DateBis, "Long Date")    Else        sMessage = sMessage & "Bis - keine Angabe -"    End If     MsgBox sMessage, vbInformationEnd Sub'-------------------------------------------------- 



Füge der Access-Applikation ein Standardmodul hinzu und nenne es "modPublicProperties".



Das Modul erhält folgenden Code:

Option Compare DatabaseOption Explicit ' Lokale Variablen, um die Werte Permanent zu speichern:Private mvarVon As Variant, mvarBis As Variant Public Sub SetDates(Optional ByRef DateVon As Variant, Optional ByRef DateBis As Variant)    ' Diese Prozedur setzt und liest Datumswerte.    ' Sie soll durch Verwendung der Run-Methode aufgerufen werden.    ' Die Parameter werden ByRef übergeben, um sie bei Bedarf verändern zu können und so der rufenden    ' Anwendung verfügbar zu machen.    If IsMissing(DateVon) Then        ' Fall1: Die Sub-Prozedur wurde ohne Parameter aufgerufen.        '        Der Datumswert wird zurückgesetzt.        mvarVon = Null    ElseIf VarType(DateVon) = vbDate Then        ' Fall2: Es wurde ein Datumswert übergeben.        mvarVon = DateVon    Else        ' Fall3: Es soll gelesen werden.        DateVon = mvarVon    End If     If IsMissing(DateBis) Then        ' Fall1: Die Sub-Prozedur wurde ohne Parameter aufgerufen.        '        Der Datumswert wird zurückgesetzt.        mvarBis = Null    ElseIf VarType(DateBis) = vbDate Then        ' Fall2: Es wurde ein Datumswert übergeben.        mvarBis = DateBis    Else        ' Fall3: Es soll gelesen werden.        DateBis = mvarBis    End If End Sub'-------------------------------------------------- Public Property Let DateVon(NewDate As Variant)    If VarType(NewDate) = vbDate Then        mvarVon = NewDate    Else        mvarVon = Null    End IfEnd Property'-------------------------------------------------- Public Property Get DateVon() As Variant    If VarType(mvarVon) = vbDate Then        DateVon = mvarVon    Else        DateVon = Null    End IfEnd Property'-------------------------------------------------- Public Property Let DateBis(NewDate As Variant)    If VarType(NewDate) = vbDate Then        mvarBis = NewDate    Else        mvarBis = Null    End IfEnd Property'-------------------------------------------------- Public Property Get DateBis() As Variant    If VarType(mvarBis) = vbDate Then        DateBis = mvarBis    Else        DateBis = Null    End IfEnd Property'--------------------------------------------------  Damit wäre die Access - Anwendung vorbereitet. Nun zur steuernden Visual Basic - Applikation:



Füge zu Form1 aus dem Beispielprojekt eine weitere Befehlsschaltfläche hinzu. Damit enthält diese Form drei Schaltflächen:Command1(0), Command1(1) und Command2.



Ersetze den alten Code in Form1 durch diesen Code:

Option ExplicitDim mobjAccess As Access.Application Private Sub Command1_Click(Index As Integer)    ' Da der Anwender das Access-Fenster zwischenzeitlich geschlosen haben könnte,    ' bei jedem Click neu initialisieren:    InitializeAccess     ' Parameter einstellen:    mobjAccess.Run "SetDates", Date, Date + 1     Select Case Index    Case 0 ' Vorschau        ShowAccess mobjAccess        mobjAccess.DoCmd.OpenReport "MeinBericht", acViewPreview    Case 1 ' Drucken        ' Da in unserem Beispiel der Bericht eine Message Box anzeigt,        ' sollten wir Access auch beim drucken sichtbar machen:        ShowAccess mobjAccess        mobjAccess.DoCmd.OpenReport "MeinBericht", acViewNormal    End SelectEnd Sub'-------------------------------------------------- Private Sub Command2_Click()    ' Da der Anwender das Access-Fenster zwischenzeitlich geschlosen haben könnte,    ' bei jedem Click neu initialisieren:    InitializeAccess     ' Die in der Access - Anwendung eingestellten Werte zurücklesen:    Dim vntReadbackVon As Variant, vntReadbackBis As Variant    mobjAccess.Run "SetDates", vntReadbackVon, vntReadbackBis     Dim sMessage As String     If VarType(vntReadbackVon) = vbDate Then        sMessage = "Von " & Format(vntReadbackVon, "Long Date") & vbCrLf    Else        sMessage = "Von - keine Angabe -" & vbCrLf    End If     If VarType(vntReadbackBis) = vbDate Then        sMessage = sMessage & "Bis " & Format(vntReadbackBis, "Long Date")    Else        sMessage = sMessage & "Bis - keine Angabe -"    End If     MsgBox "Die Parameter wurden auf folgende Werte eingestellt:" & vbCrLf & _           sMessage, vbInformation End Sub'-------------------------------------------------- Private Sub Form_Load()    Command1(0).Caption = "Vorschau..."    Command1(1).Caption = "Drucken"    Command2.Caption = "Werte zurücklesen..."End Sub'-------------------------------------------------- Private Sub Form_Unload(Cancel As Integer)    TerminateAccessEnd Sub'-------------------------------------------------- Private Sub InitializeAccess()    Dim sDatabaseName As String     If mobjAccess Is Nothing Then Set mobjAccess = CreateObject("Access.Application")    'If mobjAccess Is Nothing Then Set mobjAccess = GetObject(, "Access.Application")    'If mobjAccess Is Nothing Then Set mobjAccess = New Access.Application     sDatabaseName = App.Path & "\MeineDatenbank.mdb" On Error Resume Next    Dim sTest As String, fOpenDatabaseRequired As Boolean    sTest = mobjAccess.CurrentDb.Name    If Err Then        fOpenDatabaseRequired = True    End If On Error GoTo 0    If fOpenDatabaseRequired Then        mobjAccess.OpenCurrentDatabase sDatabaseName, False    ElseIf LCase(mobjAccess.CurrentDb.Name) <> LCase(sDatabaseName) Then        mobjAccess.OpenCurrentDatabase sDatabaseName, False    End IfEnd Sub'-------------------------------------------------- Private Sub TerminateAccess()On Error Resume Next    mobjAccess.CloseCurrentDatabase    mobjAccess.Quit    Set mobjAccess = NothingEnd Sub'-------------------------------------------------- 



Der Code im Standardmodul bleibt unverändert, hier noch einmal der Vollständigkeit halber:

Option Explicit Private Declare Function SetForegroundWindow Lib "User32" _  (ByVal hWnd As Long) As LongPrivate Declare Function IsIconic Lib "User32" _  (ByVal hWnd As Long) As LongPrivate Declare Function ShowWindow Lib "User32" _  (ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPrivate Const SW_NORMAL = 1     'Show window in normal sizePrivate Const SW_MINIMIZE = 2   'Show window minimizedPrivate Const SW_MAXIMIZE = 3   'Show window maximizedPrivate Const SW_SHOW = 9       'Show window without changing window size '----------------------------------------------------------------------'This procedure brings the instance of Microsoft Access referred to'as "instance" into view. The instance's window size can be SW_NORMAL,'SW_MINIMIZE, SW_MAXIMIZE, or SW_SHOW. If size is omitted, the window is'not changed (SW_SHOW). To call this function, use this syntax:'ShowAccess instance:=objAccess, size:=SW_SHOW'----------------------------------------------------------------------Sub ShowAccess(instance As Object, Optional size As Variant)    Dim hWnd As Long, hResult As Long     If IsMissing(size) Then size = SW_SHOW On Error Resume Next    If Not instance.UserControl Then instance.Visible = TrueOn Error GoTo 0 'turn off error handler     hWnd = instance.hWndAccessApp    hResult = SetForegroundWindow(hWnd)    If size = SW_SHOW Then 'keep current window size         If IsIconic(hWnd) Then hResult = ShowWindow(hWnd, SW_SHOW)    Else         If IsIconic(hWnd) And size = SW_MAXIMIZE Then _           hResult = ShowWindow(hWnd, SW_NORMAL)         hResult = ShowWindow(hWnd, size)    End IfEnd Sub'-------------------------------------------------- 



Ausprobieren!



Viel Erfolg!

Thomas Prötzsch

cu


Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: