Programmiertips
Vorherige Seite
Zurück zur Übersicht
Nächste Seite

MS Access: Synchronisieren von Unterformularen
Ich habe eine Haupt- und eine Detailtabelle 1:n verknüpft. Nun möchte ich beide Tabellen in einem Formular in der Datenansicht darstellen. Wenn ich in der Haupttabelle einen Datensatz auswähle, sollen automatisch die Daten in der Detailtabelle richtig dargestellt werden.

Beispiele:

  1. Eine Datenbank, in der Stücklisten für die Herstellung verschiedener Geräte verwaltet werden. Die Haupttabelle könnte dann die Gerätebezeichnungen (Toaster, Bügeleisen, Kaffemaschine) und die Detailtabelle die für die Herstellung des jeweiligen Gerätes benötigten Bauelemente enthalten.
  2. Verwaltung von Kochrezepten. Die Haupttabelle enthält die Gerichte (Spare Ribs, Rouladen, Tomatensalat) und die Detailtabelle die für das jeweilige Gericht benötigten Zutaten (Fleisch, Salz, Zucker, Tomaten, Honig...).
Lösung:
Ich stelle hier eine komplette Step- by Step Anleitung vor, wie so etwas funktionieren kann:
 
Beispiel Formularansicht Sie sehen hier ein ungebundenes Access - Formular mit 2 Unterformularen. Links wird die Haupt-  und rechts die Detailtabelle dargestellt. Im Augenblick wurde in der linken Tabelle der Eintrag "Staubsauger" markiert, die zum Staubsauger gehörenden Komponenten "Düse", "Schlauch", "Staubbeutel" usw. werden rechts dargestellt.

1.) Tabellen
Um dieses Beispiel programmieren zu können benötigen Sie 2 Tabellen, die mindestens folgende Felder enthalten müssen:

Haupttabelle:
Eigenschaft Wert
Tabellenname Geräte
Spalte 1: Name GeräteID
Spalte 1: Felddatentyp AutoWert, Primärschlüssel
Spalte 2: Name Gerätebezeichnung
Spalte 2: Felddatentyp Text

Detailtabelle:
Eigenschaft Wert
Tabellenname Komponenten
Spalte 1: Name GeräteID
Spalte 1: Felddatentyp Long integer, Fremdschlüssel
Spalte 2: Name Bezeichnung
Spalte 2: Felddatentyp Text
Dann stellen Sie zwischen den Feldern [GeräteID] beider Tabellen eine Beziehung mit referentieller Integrität (!) her.

2.) Formulare
Zwei Unterformulare und ein Hauptformular werden benötigt. Die beiden Unterformulare benötigen jeweils mindestens ein Textfeld als Steuerelement.

Geräte-Unterformular:
Steuerelement Eigenschaft Wert
Formular Formularname sfrmGeräte
Formular Datenherkunft Geräte
Formular Standardansicht Datenblatt
Formular Beim Anzeigen (Form_Current) [Ereignisprozedur]
txtGerätebezeichnung Typ Textfeld
txtGerätebezeichnung Name txtGerätebezeichnung
txtGerätebezeichnung Steuerelementinhalt Gerätebezeichnung

Komponenten-Unterformular:
Steuerelement Eigenschaft Wert
Formular Formularname sfrmKomponenten
Formular Datenherkunft Komponenten
Formular Standardansicht Datenblatt
txtBezeichnung Typ Textfeld
txtBezeichnung Name txtBezeichnung
txtBezeichnung Steuerelementinhalt Bezeichnung

Beachten sie bitte, daß die Unterformulare nicht unbedingt die Felder [GeräteID] (Primär- bzw. Fremdschlüssel) enthalten müssen!

Hauptformular:
Steuerelement Eigenschaft Wert
Formular Formularname frmStücklisten
Formular Datenherkunft  - keine - (ungebunden)
Formular Standardansicht Einzelnes Formular
sfrmGeräte Typ Unterformular
sfrmGeräte Name sfrmGeräte
sfrmGeräte Steuerelementinhalt sfrmGeräte
sfrmKomponenten Typ Unterformular
sfrmKomponenten Name sfrmKomponenten
sfrmKomponenten Steuerelementinhalt sfrmKomponenten
sfrmKomponenten Verknüpfen von (Link child field) GeräteID
sfrmKomponenten Verknüpfen nach (Link master field) [sfrmGeräte]![Form].[GeräteID]

Korrektur vom 04.06.2003:
Die letzte Zeile in der vorherigen Tabelle ist falsch! Richtig ist hingegen:

sfrmKomponenten Verknüpfen nach (Link master field) [sfrmGeräte].[Form]![GeräteID]

Ausrufezeichen und Punkt wurden seinerzeit versehentlich vertauscht. Na klar: wir benötigen die Form-Eigenschaft von sfrmGeräte, um so auf das Feld GeräteID innerhalb des Unterformulares verweisen zu können. Sorry und Danke an Ulrich Mikge.

Beachten Sie bitte, wie die Verknüpfung formuliert wird!

3.) Programmcode
Wenn sie die Tabellen aufmerksam studiert haben wird Ihnen nicht entgangen sein, das der Eigenschaft "Beim Anzeigen" des Unterformulars [sfrmGeräte] der Wert "Ereignisprozedur" zugewiesen wurde. Diese Prozedur ist natürlich noch leer und wird nun noch mit folgendem Code gefüllt:

Option Compare Database
Option Explicit

Private Sub Form_Current()
  Dim ParentDocName As String

' Prüfe, ob ein Hauptformular existiert
  On Error Resume Next
  ParentDocName = Me.Parent.Name
' falls dieses Formular allein geöffnet wurde
' und nicht als Bestandteil eines Hauptformulares,
' wird hier ein Fehler signalisiert und abgefangen.

  If Err <> 0 Then
    GoTo Form_Current_Exit
  Else
    On Error GoTo Form_Current_Err
    Me.Parent![sfrmKomponenten].Requery
  End If
Form_Current_Exit:
  Exit Sub
Form_Current_Err:
  MsgBox Error$
  Resume Form_Current_Exit
End Sub

4.) Kompilieren, speichern und ausprobieren!


Vorherige Seite
Zurück zur Übersicht
Nächste Seite

© 1999 - 2003 T. Prötzsch
Aktualisiert am 04. Juni 2003