Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

4.5.12 Reflexive Beziehungen

4.6 Von Formular zu Formular

Weiter oben haben Sie bereits einige Möglichkeiten kennen gelernt, mit denen Sie von einem Formular aus ein weiteres Formular aufrufen und diesem bestimmte Informationen übergeben können.

Bei der Anwendung dieser Möglichkeiten sind einige Voraussetzungen zu beachten, damit Sie länger Spaß an den auf diese Weise »verknüpften« Formularen haben.

Die wichtigste Regel ist: Sorgen Sie für möglichst wenig Abhängigkeiten zwischen aufrufendem und aufgerufenem Formular. Das bedeutet in diesem Fall, dass Sie die Abhängigkeit erstens unidirektional auslegen und zweitens an bestimmten Punkten konzentrieren sollten - etwa auf das Öffnen und das Schließen des aufgerufenen Formulars.

Zur besseren Verständlichkeit heißt das aufrufende Formular in den nächsten Abschnitten »Parent« und das aufgerufene Formular »Child«.

Unidirektionale Abhängigkeit bedeutet, dass zwar das Parent-Formular das Child-Formular kennen muss, aber nicht umgekehrt. In der Praxis sieht das folgendermaßen aus:

  • Das Parent-Formular kennt den Namen des Child-Formulars und ruft dieses darüber auf.
  • Das Parent-Formular kennt die Datensatzquelle des Child-Formulars und weiß, wie eine Bedingung zur Einschränkung der Datensatzquelle aussehen muss.
  • Das Parent-Formular weiß, welche Werte es dem Child-Formular mit dem Öffnungsargument übergeben kann.
  • Umgekehrt weiß das Child-Formular nichts vom Parent-Formular - es wertet lediglich die vom Parent-Formular übergebenen Informationen aus, ist aber nicht von der Lieferung dieser Informationen abhängig.

    Andersherum soll das Parent-Formular neben den beim Aufruf übergebenen Informationen nach dem Schließen des Child-Formulars Werte von dort auslesen können. Daher darf das Child-Formular nicht geschlossen, sondern nur unsichtbar gemacht werden.

    Außer diesen zwei Kontakten - Parameterübergabe beim Aufruf und Auslesen des Child-Formulars vor dem Schließen - finden im Optimalfall keine Kontakte statt. Das heißt insbesondere, dass das Child-Formular nicht auf das Parent-Formular zugreift.

    Es gibt natürlich die Möglichkeit, Variablen, die zwischen Parent- und Child-Formular hin- und hergereicht werden sollen, in globalen Variablen zu speichern; man könnte auch vom Child-Formular aus lesend und schreibend auf das Parent-Formular zugreifen. Ersteres bedingt, dass beide Formulare die globalen Variablen kennen müssen, und Letzteres, dass das Parent-Formular das Child-Formular kennen muss und umgekehrt und diese damit voneinander abhängig sind.

    Seit Access 2007 gibt es mit den TempVars noch eine weitere Möglichkeit. Nähere Informationen dazu finden Sie in Kapitel 1, »Warum Access 2007?«.

    Formulare aufrufen und vor dem Schließen auslesen

    VBA-technisch sieht das wie folgt aus. Der Aufruf des Child-Formulars erfolgt mit der DoCmd.OpenForm-Methode. Damit das Parent-Formular das Child-Formular nach dem Ausblenden und vor dem Schließen auslesen kann, muss das Child-Formular als modaler Dialog geöffnet werden.

    Das bedeutet, dass keine anderen Aktionen in der Access-Anwendung möglich sind, solange das Child-Formular geöffnet ist. Auf diese Weise verhindern Sie Wechselwirkungen zwischen Child-Formular und anderen Elementen der Benutzeroberfläche. Um ein Formular mit der OpenForm-Methode als modalen Dialog zu öffnen, verwendet man den Parameter WindowMode mit dem Wert acDialog:

    DoCmd.OpenForm "frmChild", WindowMode:=acDialog

    Wichtigster Nebeneffekt des Öffnens als modaler Dialog ist, dass auch die aufrufende Prozedur angehalten wird. Diese läuft erst dann weiter, wenn das Child-Formular durch Setzen der Eigenschaft Visible auf den Wert True oder durch Schließen den Fokus verliert. Die aufrufende Routine weiß dann bei der nächsten Zeile zumindest sicher, dass das Child-Formular entweder geschlossen oder ausgeblendet ist. Erstrebenswert ist natürlich Letzteres, denn sonst könnten Sie von dort keine Informationen mehr erlangen.

    Also sorgen Sie dafür, dass das Formular nicht auf herkömmlichem Wege geschlossen, sondern nur über eine spezielle Schaltfläche ausgeblendet werden kann. Die passende Ereignisprozedur der Schaltfläche mit dem Namen cmdOK sieht dann folgendermaßen aus:

    Private Sub cmdOK_Click()
        Me.Visible = True
    End Sub

    Listing 4.27: Ausblenden eines Formulars

    In der aufrufenden Prozedur sollten Sie auf jeden Fall prüfen, ob das Formular noch geöffnet ist. Dazu können Sie die Eigenschaft IsLoaded des entsprechenden Elements der AllForms-Auflistung verwenden:

    If CurrentProject.AllForms("").IsLoaded = True Then

    Aber auch das verschafft noch keine Sicherheit, denn das Formular könnte ja auch in der Entwurfsansicht geöffnet sein. Also folgt eine weitere Prüfung:

    If CurrentProject.AllForms("").CurrentView = _
        acCurViewFormBrowse Then
    ...

    Anschließend kann das Child-Formular in Ruhe ausgelesen werden, bevor es geschlossen wird.

    Beispiel für das Aufrufen eines weiteren Formulars

    Wenn Sie ein Kombinationsfeld etwa für die Auswahl der Kategorie eines Artikels verwenden, sollten Sie die Möglichkeit bieten, leicht weitere Kategorien anzulegen. Im folgenden Beispiel wird bei der Eingabe eines Eintrags, der in der Datensatzherkunft eines Kombinationsfeldes noch nicht vorhanden ist (siehe Abbildung 4.56), ein weiteres Formular zum Anlegen eines neuen Datensatzes in der Kategorien-Tabelle angezeigt (siehe Abbildung 4.57).

    Abbildung 4.56: Anlegen einer neuen Kategorie (»frmArtikel«) ...

    Abbildung 4.57: ... in einem eigenen Formular (»frmKategorien«)

    Ob der Benutzer einen noch nicht in der Datensatzherkunft eines Kombinationsfeldes vorhandenen Datensatz eingefügt hat, stellen Sie daran fest, dass das Ereignis Bei nicht in Liste ausgelöst wird. Dieses Ereignis machen Sie sich zu Nutze und fragen darin den Benutzer, ob er den neuen Eintrag tatsächlich anlegen möchte - vielleicht hat er sich ja auch nur vertippt.

    Anderenfalls öffnet die Routine das Formular frmKategorien (siehe Abbildung 4.57) mit einem neuen Datensatz, der automatisch mit der neuen Kategorie gefüllt wird - dazu später mehr. Nach der Eingabe und dem Ausblenden des Formulars prüft die Routine, ob das Formular noch in der Formularansicht geöffnet ist, und liest gegebenenfalls die KategorieID des neuen Eintrags ein. Nach dem Schließen des aufgerufenen Formulars, das zu diesem Zeitpunkt nur ausgeblendet, aber nicht geschlossen ist, stellt die Routine das Kombinationsfeld auf den neuen Wert ein.

    Private Sub KategorieID_NotInList(NewData As String, Response As Integer)

        Dim lngKategorieID As Long

        If MsgBox("Möchten Sie diese Kategorie anlegen?", _
            vbYesNo + vbExclamation, "Neue Kategorie") = vbYes Then

            DoCmd.OpenForm "frmKategorien", DataMode:=acFormAdd, _
                OpenArgs:=NewData, WindowMode:=acDialog

            If CurrentProject.AllForms("frmKategorien").IsLoaded = True Then

                If CurrentProject.AllForms("frmKategorien").CurrentView = _

                    acCurViewFormBrowse Then
                    lngKategorieID = Forms!frmKategorien!KategorieID
                    DoCmd.Close acForm, "frmKategorien"
                    Me!KategorieID = lngKategorieID
                    Me!KategorieID.Requery

                End If
            End If
        End If

        Response = acDataErrContinue

    End Sub

    Listing 4.28: Aufrufen eines weiteren Formulars zum Eingeben verknüpfter Daten

    Nächster Abschnitt:

    4.7 Besonderheiten von Unterformularen

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.