Flexibles Unterformular

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Die Datenherkunft eines Unterformulars ändert sich in der Regel zur Laufzeit nicht – es wird höchstens mal ein Filter oder eine Sortierung angewendet. Gelegentlich soll das gleiche Unterformularsteuerelement zwar mal das Unterformular wechseln, aber auch dies ist kein Problem. Interessant wird es, wenn Sie ein einziges Unterformular zur Laufzeit mit verschiedenen Datenherkünften ausstatten möchten. Sie können zwar Tabellen oder Abfragen statt eines richtigen Formulars als Unterformular angeben, aber diese bieten natürlich keine Möglichkeit, auf Ereignisse zu reagieren. Wir zeigen, wie Sie ein einziges Unterformular flexibel mit beliebigen Daten füllen.

Beiträge wie dieser wurden meist durch einen konkreten Anwendungsfall angeregt. In diesem Fall geht es um den Duplikatmanager aus dem Beitrag Duplikatsuche in Adressen (www.access-im-unternehmen.de/744). Dort soll ein Unterformular die Daten einer Abfrage anzeigen, die mehrfach vorkommende Kombinationen bestimmter Feldwerte enthält. Diese Anzeige soll die doppelt oder öfter vorkommenden Kombinationen allerdings nur in einfacher Ausführung liefern. Der Benutzer wählt dann einen der Einträge aus, woraufhin ein weiteres Unterformular nur die Dubletten dieses ausgewählten Eintrags anzeigt – so kann der Benutzer in Ruhe entscheiden, ob einer oder mehrere der Datensätze gelöscht werden sollen.

Die Anforderung in diesem Fall lautet: Das erste Unterformular soll die Daten einer speziellen Abfrage anzeigen. Dies allein ist kein Problem: Sie können einem Unterformular-Steuerelement zur Laufzeit per VBA nicht nur ein Formular, sondern auch eine Tabelle oder eine Abfrage als Herkunftsobjekt zuweisen. Das geht zum Beispiel so:

Me!sfmSubform.ControlSource = "Table.tblAdressen"

Für eine Abfrage stellen Sie entsprechend das Schlüsselwort Query voran. Für die meisten Fälle ist dies ausreichend. Beim Duplikatmanager soll ein Klick auf einen der Einträge dieses Unterformular bestimmte Daten in einem weiteren Unterformulars anzeigen. Der Benutzer soll nicht erst den Datensatz auswählen und auf eine Schaltfläche klicken müssen. Diese Lösung wäre auch akzeptabel, aber in Anbetracht einer gegebenenfalls großen Menge von Duplikaten zählt jeder Mausklick.

Also wollen wir dem Unterformular ein Ereignis hinzufügen, das auf das Anklicken eines Eintrags reagiert. Für das Beispiel des vorliegenden Beitrags reicht es, wenn einfach ein Meldungsfenster erscheint und die ID des gewählten Datensatzes ausgibt – um alles weitere kümmern wir uns im oben genannten Beitrag. Genau genommen brauchen wir uns nicht auf einen Mausklick zu konzentrieren, sondern es reicht, den Datensatzwechsel zu beobachten – so können wir mit der Ereignisprozedur Beim Anzeigen arbeiten.

Unterformular flexibel gestalten

Das jeweilige Ereignis ist für diesen Beitrag aber ohnehin uninteressant – wir haben hier ganz andere Probleme. Zum Beispiel müssen wir uns überlegen, wie wir einem Formular, dessen Datenherkunft wir noch nicht kennen, die entsprechenden Steuerelemente hinzufügen können.

Theoretisch wird das so ablaufen:

  • Wir weisen der Eigenschaft RecordSource des Formulars den Namen der Tabelle oder Abfrage zu, welche die Daten liefert.
  • Dann fügen wir für jedes Feld der Datenherkunft ein Steuerelement zum Formular hinzu und stellen seine Eigenschaft ControlSource auf das entsprechende Feld ein.

Dies hört sich einfach an, würde aber voraussetzen, dass wir das Formular zunächst per VBA-Code im Entwurf öffnen müssen, die Steuerelemente hinzufügen und erst dann in die Datenblattansicht wechseln können.

Dies ist zwar technisch machbar, aber wir würden hier prinzipiell jedes Mal ein komplett neues Formular erstellen. Wir gehen einen etwas anderen Weg: Wir bereiten gleich beim Erstellen des Formulars eine Reihe von Steuerelementen vor, die bei normalen Anforderungen ausreichen sollten. Eine Adresstabelle sollte etwa mit 20 Feldern auskommen. Wir fügen also vorab 20 Textfelder zu unserem künftigen Unterformular hinzu. Nach dem Zuweisen der Datenherkunft zur Laufzeit durchlaufen wir dann alle darin enthaltenen Felder und weisen der Eigenschaft ControlSource der Textfelder die jeweiligen Namen der Felder der Datenherkunft zu.

Eines haben wir jedoch noch nicht bedacht: Tabellen und Abfragen zeigen nicht immer alle Daten in Textfeldern an, sondern teilweise auch in Kombinationsfeldern und Kontrollkästchen. Wir sollten also für jedes der maximal 20 vorgesehenen Felder der Datenherkunft ein Textfeld, ein Kombinationsfeld und ein Kontrollkästchen vorsehen und jeweils nur das entsprechende Feld mit einem Feld der Datenherkunft verknüpfen.

Steuerelemente anlegen

Legen Sie zunächst ein neues, leeres Formular an und speichern Sie es unter dem Namen sfmFlex. Stellen Sie außerdem seine Eigenschaft Standardansicht auf den Wert Datenblatt ein. Anschließend kümmern wir uns um das Anlegen der Steuerelemente. Natürlich erledigen wir das nicht von Hand, sondern fügen die Steuerelemente per VBA hinzu. Dies erledigt die Prozedur aus Listing 1.

Listing 1: Hinzufügen der Steuerelemente des flexiblen Unterformulars

Public Sub FlexformControls()
    Dim frm As Form
    Dim strForm As String
    Dim i As Integer
    Dim ctl As Control
    strForm = "sfmFlex"
    DoCmd.OpenForm strForm, View:=acDesign
    Set frm = Forms(strForm)
    For i = 1 To 20
         Set ctl = Application.CreateControl(strForm, acTextBox, acDetail)
        ctl.Name = "txt" & Format(i, "00")
        Set ctl = Application.CreateControl(strForm, acLabel, acDetail, ctl.Name)
        ctl.Name = "lbltxt" & Format(i, "00")
        Set ctl = Application.CreateControl(strForm, acCheckBox, acDetail)
        ctl.Name = "chk" & Format(i, "00")
        Set ctl = Application.CreateControl(strForm, acLabel, acDetail, ctl.Name)
        ctl.Name = "lblchk" & Format(i, "00")
        Set ctl = Application.CreateControl(strForm, acComboBox, acDetail)
        ctl.Name = "cbo" & Format(i, "00")
        Set ctl = Application.CreateControl(strForm, acLabel, acDetail, ctl.Name)
        ctl.Name = "lblcbo" & Format(i, "00")
    Next i
End Sub

Nach dem Öffnen des Formulars durchläuft die Prozedur eine Schleife, in der verschiedene Aufrufe der CreateControl-Methode die einzelnen Steuerelemente anlegen – in der hier vorliegenden Version genau 20 Mal. Erst kommen die Textfelder an die Reihe, gefolgt von den entsprechenden Bezeichnungsfeldern. Diese sind nötig, damit die Spaltenköpfe später die Feldnamen der Quelltabelle anzeigen. Das Anlegen der Bezeichnungsfelder erfordert gegenüber den übrigen Steuerelementen die Angabe eines zusätzlichen Parameters, der festlegt, zu welchem gebundenen Steuerelement das Bezeichnungsfeld gehört.

Auf die gleiche Weise verfährt die Prozedur mit den Kontrollkästchen und Kombinationsfeldern. Das Formular sieht anschließend so aus, als würde es nur ein Steuerelement enthalten. Das Aufklappen der Steuerelementliste des Eigenschaftsfensters zeigt jedoch, dass alle Steuerelemente angelegt wurden (s. Bild 1).

pic001.png

Bild 1: Das flexible Unterformular mit sämtlichen oben links angelegten Steuerelementen

Damit sind bereits alle Voraussetzungen geschaffen – den Rest übernimmt die zur Laufzeit aufgerufene Prozedur FillFlexForm (s. Listing 2).

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar