Struktur mit einem Masterdatensatz verknüpfen
Zeigen Sie nur die Datensätze an, die zum aktuellen Datensatz eines Formulars oder eines anderen Recordsets gehören, so wie ein Access-Unterformular – zum Beispiel die Positionen der Bestellung, die das Formular zeigt.
Voraussetzungen: WKL Forms Object Library 1.23 oder höher.
Lösungsüberblick
LinkChildFields nennt die Felder der Datenherkunft der Struktur und LinkMasterFields die passenden Felder des
Masters, in derselben Reihenfolge. Beide werden mit dem Formular gespeichert. Der Master ist der aktuelle Datensatz des
Formulars, auf dem das Steuerelement liegt. Zur Laufzeit können Sie stattdessen ein Recordset zum Master machen
(MasterRecordset) oder die Werte direkt übergeben (MasterValues); Letzteres funktioniert auch auf UserForms von
Excel, Word und Outlook. BeforeMasterChange und AfterMasterChange treten ein, wenn sich der Masterdatensatz
ändert. Nach welchen Regeln welche Quelle gilt, beschreibt
`LinkMasterFields` (API-Referenz, Englisch).
Umsetzung
Fügen Sie auf der Designerseite Verknüpfung (Zeile Benutzerdefiniert [...] des Steuerelements) je
Verknüpfungsfeld ein Feldpaar hinzu. Gleichnamige vorschlagen schlägt Paare von Feldern vor, die in beiden
Datenherkünften denselben Namen haben, wie der Unterformular-Assistent. Steuerelementinhalt setzen setzt ControlSource des
Steuerelements auf die Masterfelder, sodass Access jeden Datensatzwechsel sofort meldet. Ohne diese Einstellung prüft
das Steuerelement den Masterdatensatz alle 250 ms.
Dieselben Einstellungen im Eigenschaftenblatt (Registerkarten Andere und Daten), für eine Liste von
Bestellpositionen im Bestellformular frmBestellungen:
| Eigenschaft | Wert |
|---|---|
RecordSource | tblPositionen |
KeyField | BestellNr;PosNr |
ParentField | BestellNr;UebergeordnetePosNr |
LinkChildFields | BestellNr |
LinkMasterFields | ID |
ControlSource (Registerkarte Daten) | ID |
Im Formularmodul auf einen Wechsel des Masterdatensatzes reagieren:
Private Sub List1_AfterMasterChange(ByVal Values As Variant)
Me!lblPositionen.Caption = Me!List1.Object.NodeCount & " Positionen"
End Sub
Den Master statt aus dem Formular selbst aus einem anderen Unterformular nehmen:
Private Sub Form_Load()
Set Me!List1.Object.MasterRecordset = Me!sfmBestellungen.Form.Recordset
End Sub
Auf einer UserForm, die kein Formular-Recordset hat, die Werte aus dem Code übergeben:
Private Sub cboBestellung_Change()
Me.List1.MasterValues = Me.cboBestellung.Value ' Array(...) for several link fields
End Sub
Hinweise
- Ohne Masterdatensatz (ein neuer oder leerer Master) ist die Struktur leer, und das Hinzufügen oder Kopieren von Knoten löst
wkeInvalidValueaus. - Neue Datensätze erhalten die Masterwerte in ihren Verknüpfungsfeldern.
- Das Setzen von
MasterValuesaus dem Code löst keine Ereignisse aus; das Setzen auf Null kehrt zuMasterRecordsetoder zum Formular zurück. LinkMasterFieldsdarf statt eines Felds ein Steuerelement des Formulars nennen, wie bei einem Unterformular.- Für eine Pass-Through-Abfrage oder eine langsame verknüpfte Tabelle als Datenherkunft setzen Sie
MasterFilterModeaufwmfLocal(Designer: Einmal laden, im Speicher filtern): Die Struktur liest die Quelle einmal und filtert sie bei jedem Masterwechsel im Speicher, statt die Abfrage erneut auszuführen. - In der Entwurfsansicht mit
LivePreviewund in der Vorschau des Designers zeigt die Struktur die Datensätze des ersten Datensatzes des Formulars, weil die Entwurfsansicht keinen aktuellen Datensatz hat. - Auf einer UserForm wird das Steuerelement ohne
.Objectangesprochen (Me.List1), weil MSForms seine eigenen Eigenschaften mit denen des Steuerelements zusammenführt. Meldet VBA dort einen Member als nicht gefunden, siehe „Methode oder Datenobjekt nicht gefunden“ für ein Steuerelement auf einer UserForm.