Translate

Freitag, 19. September 2014

MS ACCESS: Datenpflege von m:n Datensätze über Kontrollkästchen



Aufgabenstellung:
Zuordnung von Gruppen (Geschäftlich, Freunde, Familie usw...) an Kontaktdaten

Dies wir üblicherweise in MS Access über Haupt- und Unterformular umgesetzt.
Geht es allerdings darum, nur Datensätze ohne weitere Angaben einen Hauptdatensatz zu zuordnen, dann sind Unterformulare nicht wirklich optimal.
Daher stelle ich in diesen Blog-Eintrag eine Lösung mit dynamischen Kontrollkästchen vor.

Klassisch Lösung mit Unterformular:
  • Nur die bereits zugeordneten Einträge werden in der Liste dargestellt
  • VBA-Code wird nicht benötigt
  • Bedienung umständlich und fehleranfällig
  • Jede Zuordnungsliste benötigt ein Unterformular
  • Fazit: Geeignet für Listen mit vielen Einträgen


 Alternative Lösung mit dynamischen Kontrollkästchen:
  • Sämtliche Einträge werden in der Liste übersichtlicht dargestellt
  • Bedienung einfach und eindeutig
  • Standardisiertes Design
  • Nur ein Unterformular
  • Kein externes ActiveX (OCX) wird benötigt
  • VBA-Code wird benötigt (ohne zusätzlichen Verweis)
  • Fazit: Geeignet für Listen mit wenig Einträgen


Das Formular mit Beispiel kann unter folgenden Link heruntergeladen werden:

Voraussetzung:
MS Access 2010, 2007, 2003, 2002, 2000
Es werden 2 Stammdaten Tabellen und eine Zuordnungstabelle benötigt.
Die Stammdaten Tabellen benötigen ein Feld mit eindeutigen Daten (z.B. Primarykey auf ein Feld).
Einer der zwei Stammdaten Tabellen wird in ein Formular in der Formularansicht dargestellt. Zusätzliche Verweise in VBA werden nicht benötigt.

Implementierung:
1.      Das Formular frmACB im aktuellen Projekt importieren
2.      Dieses Formular als Unterformular in das Hauptformular einfügen
3.     Im Hauptformular beim Laden (Form_Load) folgenden Code hinterlegen:

Option Compare Database
Option Explicit
   
DIM frmAktion As Form_frmACB


Private Sub Form_Load()
    Set frmAktion = Me.frmZuordnungAktion.Form
    With frmAktion
        .eLinkMasterFeld = Me.ID 'Erforderlich.

        .eZuordnungstabelle = "tblZuordnungKontaktAktion" 'Erforderlich.
        .eZuordnungsFeld1 = "KontaktID" 'Erforderlich.
        .eZuordnungsFeld2 = "AktionID" 'Erforderlich.
        .eStammtabelle = "tblAktion" 'Erforderlich.
        .eStammFeldID = "ID" 'Erforderlich.
        .eStammFeldBezeichnung = "Bezeichnung" 'Erforderlich.
       
        .eSpaltenBeschriftung = "Aktionen" 'Optional.

        .eStammFormName = "frmAktion" 'Optional.
        .eStammFormSchaltflächenbeschriftung = "Aktionen verwalten..." 'Optional.
        .eAuswahlAlleEinblenden = True 'Optional.
        .eSortierung = NachBezeichnung 'Optional.
        .eSortierrichtung = Aufsteigend 'Optional.
    End With 
End Sub

Hintergrund der Technik:
Das Formular frmACB ist ein Endlosformular und wird als Unterformular in einem Hauptformular eingefügt. Es kann beliebig oft in einem Hauptformular eingefügt werden. Denn welche Datensätze abgebildet werden soll ist nicht in dem Unterformular hinterlegt, sondern wird über das Hauptformular einmalig definiert (Siehe Code oberhalb)

Nach jedem Datensatzwechsel im Hauptformular, wird die entsprechende Datenherkunft im Unterformular frmACB gesetzt.
Die Prozedur RequeryRecords erzeugt eine sql-Abfrage die alle Datensätze der Stammdatentabelle (tblAktion) anzeigt.
Über einen LEFT JOIN wird festgestellt, ob der Datensatz einen zugeordneten Datensatz in der Zuordnungstabelle (tblZuordnungKontaktAktion) hat. Dies muss allerdings nur für den Datensatz geschehen, der im Hauptformular gerade vorhanden ist. Dies wird über eine integrierte Unterabfrage realisiert. Das Feld SELECTED enthält also den Wert True, wenn eine Zuordnung vorhanden ist, ansonsten False.

Die Änderung der Zuordnung kann allerdings nicht über das Kontrollkästchen SELECTED erfolgen, da dies ja ein berechneter Ausdruck ist, also nur zur Anzeige dient. Hier wird ein kleiner optischer Trick verwendet, über das Kontrollkästchen wird ein ungebundenes Kontrollkästchen chkChanger gelegt, welches die Änderungen erfasst.
Die Prozedur SetAssignment führt die Änderung tatsächlich durch.

In der Beispiel-Datei sind die Eigenschaften im Code genauer beschrieben.


Hinweis: Dies ist die neue Version 1.5  mit Ereignis-Übergabe mit folgenden Vorteilen:
  • Die Eigenschaften eZuordnungstabelle und eStammtabelle können jetzt alternativ mit einen SQL-Code befüllt werden, anstatt mit einen Tabellen-/Abfragename
  • Noch einfachere Implementierung (nur eine Prozedur)
  • Das  Formular frmACB liefert Events auf die im Hauptformular reagiert werden kann