Zum Inhalt dieser Seite

Access-Grundlagen #3 - Formulare

3.1 Daten aus anderen Tabellen anzeigen 3.2 Verweis auf Steuerelement in Unterformular
3.3 Bedingte Formatierung 3.4 Kombinationsfelder
3.5 Optionsgruppen

Nach oben 3.1 Daten aus anderen Tabellen anzeigen

Wenn man auf einem Formular mit Hilfe eines Textfelds einen Wert aus einer anderen Tabelle anzeigen lassen will, kann man z.B. die Funktion DLookup() bzw. DomWert() verwenden. Ähnliches gilt natürlich auch für die anderen Aggregatfunktionen für Domänen wie DCount(), DSum() etc. (s. VBA-Hilfe). Übrigens finden Sie im VBA-Abschnitt unter 6.6 Ersatz für Domänenaggregat-Funktionen schnellere Abfragemöglichkeiten.

Bei nummerischen Feldern der Domäne (Tabelle) im Kriterienteil verwendet man folgenden Steuerelementinhalt.

=DomWert("[Nachname]";"[Betreuer]";"[KundenID] = " & intKundenID)

Damit wird in der Tabelle "Betreuer" der "Nachname" nachgeschlagen, bei dem der Wert der (nummerischen) "KundenID" gleich dem Wert des Textfeldes "intKundenID" ist.

Bei nicht nummerischen Feldern im Kriterienteil muss das Kriterium in einfache Anführungszeichen gesetzt werden.

=DomWert("[Art]";"[Arten]";"[Beschreibung] = '" & txtBeschreibung & "'")

Damit wird in der Tabelle "Arten" die "Art" nachgeschlagen, bei der der Wert von "Beschreibung" gleich dem Wert des Textfeldes "txtBeschreibung" ist.

Bei Datumsfeldern wird es wieder etwas komplizierter (s. dazu auch FAQ 6.8):

=DomWert("[ID]";"[Einkaeufe]";"[Einkauf am] = " & Format([Datumsfeld];"\#jjjj\-mm\-tt\#"))

Damit wird in der Tabelle "Einkaeufe" die "ID" nachgeschlagen, bei der der "Einkauf am" gleichen Datum wie am angezeigten "Datumsfeld" stattgefunden hat.

Mehrere Kriterien müssen mit AND (bzw. OR - je nachdem ...) verknüpft werden:

=DomAnzahl("*";"[tblKunden]";"[Nachname] LIKE '*" & txtSuchName & "*' AND Geschlecht='w'")

Damit werden alle Damen (festes Kriterium Geschlecht='w') in der Tabelle "tblKunden" gezählt, deren Nachname den in "txtSuchName" gesuchten String enthält.

Einzelansicht

Nach oben 3.2 Verweis auf Steuerelement in Unterformular

Eigentlich ist dies auch schon unter FAQ 4.2 beschrieben. Leider gibt es dabei aber immer wieder Probleme. Angenommen man hat ein Hauptformular namens "frmKunden" und will in diesem auf ein Steuerelement (mit Namen "GesamtEinnahmen") des darin eingebundenen Unterformulares verweisen. Obwohl man ganz ausführlich

=Formulare!frmKunden!frmKunden_UF_Bestellungen.Formular!GesamtEinnahmen

als Steuerelementinhalt verwendet, erhält man in der Formularansicht als Resultat "#Name?".
Lösung: Man muss an der Stelle 1 (s. Screenshot) den Namen des Unterformular-Steuerelementes einsetzen (2 im Screenshot) und nicht den Namen des Herkunftsobjektes (3). Hier der Screenshot, bei dem es nicht funktionieren würde:

Ansicht Formular und Unterformular

Mit dem Steuerelementinhalt

=Formulare!frmKunden!UF_Bestellungen.Formular!GesamtEinnahmen

müsste es somit also gehen. Wenn anschliessend immer noch "#Fehler" als Resultat erscheint, kann es an dem Namen des Steuerelementes im Unterformular liegen (hier müsste man danach "GesamtEinnahmen" noch einmal kontrollieren).

Anmerkung zu VBA: In VBA muss man genauso vorgehen. Man muss dort natürlich "Formulare" und "Formular" wieder ins Englische übersetzen ("Forms" und "Form").

Einzelansicht

Nach oben 3.3 Bedingte Formatierung

Der folgende Hinweis gilt erst ab Access 2000, davor gab es die bedingte Formatierung noch nicht (s. FAQ 4.1).

Zunächst markiert man das gewünschte Textfeld (1) in der Entwurfsansicht des Formulares und geht anschliessend auf den Menüpunkt "Format" bzw. verwendet den Tastenschlüssel ALT+T ( 2), wo man den Punkt "Bedingte Formatierung..." finden sollte:

Screenshot zum Auffinden der bed. Formatierung

Danach öffnet sich der folgende Dialog, in dem man die gewünschten Einstellungen vornehmen kann:

Einstellmöglichkeiten bei der bedingten Formatierung

Ganz oben (1) findet man die Standardformatierung, die gilt, wenn keine andere Bedingung zutrifft. Unter (2) wählt man die gewünschte Bedingungsart, bei (3) wird der erforderliche Ausdruck eingegeben. Im Bereich, der bei (4) zu finden ist, kann man die Formatierung endlich einstellen. Die Symbole von links nach rechts bedeuten "Fett", "Kursiv", "Unterstrichen", "Füll-/Hintergrundfarbe", "Schrift-/Vordergrundfarbe", "Aktiviert".

Einzelansicht

Nach oben 3.4 Kombinationsfelder

Kombinationsfelder haben im Vergleich zu einfachen Textfeldern mehr Eigenschaften, die anfangs vielleicht etwas verwirrend sind und manchmal für den Anfänger zu unerwarteten Ergebnissen führen. Vor allem die Eigenschaft Gebundene Spalte hat schon so manchen zur Verzweiflung gebracht.

Nach oben3.4.1 Herkunftstyp

Beim Anlegen des Kombinationsfeldes wird man bei aktiviertem Steuerelement-Assistenten gefragt, ob das Kombinationsfeld auf einer Abfrage bzw. Tabelle basieren soll, oder ob man selbst Werte eingeben möchte. Daraus ergeben sich dann die beiden Typen Tabelle/Abfrage oder Wertliste. Sonderfälle sind die Herkunftstypen Feldliste und eine "Callback"-Funktion.

  • Tabelle/Abfrage: Zugriff auf eine Tabelle bzw. Abfrage (mittels gespeicherter Abfrage oder SQL-String).
  • Wertliste: Zugriff auf eine festgelegte Auswahl, deren Werte durch Semikola getrennt werden. Durch Festlegen der Spaltenanzahl wird automatisch nach x Werten eine neue Zeile ("Datensatz") im Kombinationsfeld angelegt. Bei beispielsweise 2 Spalten und 6 Einträgen erhält man also 3 "Datensätze".
  • Feldliste: Zugriff auf die Feld- oder Spaltennamen in einer Tabelle/Abfrage.
  • Callback-Funktion: Falls man per VBA eine Wertliste generieren möchte, diese aber ab 2048 Zeichen abgeschnitten wird, kann man das Kombinationsfeld auch mit einer selbst erstellten Funktion befüllen. Im folgenden Beispielcode gibt es eine Funktion namens fctData(), die durch Semikolon getrennte Werte liefert. Die Spaltenanzahl (cColumns) muss im Code angepasst werden, beim Herkunftstyp wird nur fctFillField eingetragen (ohne Gleichzeichen oder Klammern):

    Public Function fctFillField(ctl As Control, ID As Long, lRow As Long, lCol As Long, s As Integer)
     
    Const cColumns = 4
    Dim vRet As Variant
    Static vEntries As Variant
     
    'fctData() liefert nur die Rohdaten und wird hier nicht aufgeführt:
    If IsEmpty(vEntries) Then vEntries = Split(fctData(), ";")
     
    Select Case s
      Case 0                                        'Initialisieren
        vRet = True
      Case 1                                        'Öffnen mit eindeutiger ID für das Listenfeld
        vRet = Timer
      Case 3                                        'Zeilenanzahl
        vRet = (UBound(vEntries) + 1) / cColumns
      Case 4                                        'Spaltenanzahl
        vRet = cColumns
      Case 5                                        'Spaltenbreiten (True, um nichts zu ändern)
        vRet = True
      Case 6                                        'Mit Daten befüllen
        vRet = vEntries(lRow * cColumns + lCol)
      Case 7                                        'Abschluss
    End Select
     
    fctFillField = vRet
     
    End Function
     

Empfehlenswert ist bis auf wenige Ausnahmen der Herkunftstyp Tabelle/Abfrage, da so Sortierungen leichter möglich sind, die Auswahl einfacher angepasst werden kann usw.

Nach oben3.4.2 Datensatzherkunft

Je nachdem, was beim Herkunftstyp ausgewählt wurde, steht hier nur ein Tabellen-/Abfragename bzw. ein SQL-String (Herkunftstypen Tabelle/Abfrage bzw. Feldliste) oder eine durch Semikola getrennte Herkunft (Wertliste). Bei einer Callback-Funktion bleibt der Eintrag leer! Durch Anpassen des SQL-Strings mittels Aufruf des Abfrageeditors kann beim bereits empfohlenen Herkunftstypen "Tabelle/Abfrage" die Datensatzherkunft leicht eingeschränkt, sortiert oder anderweitig manipuliert werden. Beim Typ Wertliste muss die Anpassung ohne weitere Hilfsmittel vorgenommen werden.

Nach oben3.4.3 Spaltenanzahl

Die Spaltenanzahl sollte immer mit der Datensatzherkunft korrespondieren. Das heisst, wenn eine Abfrage verwendet wird, die insgesamt 2 Spalten selektiert, so sollte hier auch 2 eingestellt werden.

Nach oben3.4.4 Spaltenüberschriften

Standardmässig steht diese Eigenschaft auf "Nein". Wenn hier "Ja" eingestellt wird, erscheint oberhalb der Datensätze im Kombinationsfeld ein nicht selektierbarer Eintrag mit den Feldnamen. Bei einer Feldliste führt "Ja" dazu, dass der erste Feldname nicht ausgewählt werden kann, deshalb ist diese Einstellung eher nur für die Herkunftstypen Tabelle/Abfrage oder Wertliste bzw. bei einer Callback-Funktion sinnvoll.

Nach oben3.4.5 Spaltenbreiten

Hiermit legt man fest, was das Kombinationsfeld beim Aufklappen und nach der Auswahl eines Wertes überhaupt anzeigt. Angenommen man hat eine Abfrage wie diese hier als Datensatzherkunft:

SELECT
  [tblArtikel].[idArtikel],
  [tblArtikel].[txtArtikel],
  [tblArtikel].[idArtikelGruppe]
FROM tblArtikel
ORDER BY [tblArtikel].[txtArtikel], [tblArtikel].[idArtikelGruppe];
 

und stellt nun die Spaltenbreiten auf 0cm;4cm;2cm, dann werden beim Aufklappen das Feld idArtikel nicht zu sehen und nur die beiden folgenden Felder Spalten txtArtikel und idArtikelgruppe sichtbar sein. Nach der Auswahl und dem Zuklappen des Kombinationsfeldes wird nur noch das Feld txtArtikel angezeigt. Oder allgemeiner formuliert: Die erste Spalte mit einer Breite > 0cm wird angezeigt. In der Klappliste können mehr als eine Spalte angezeigt werden, aber im zugeklappten Kombinationsfeld wird immer nur der Wert aus der ersten Spalte der Klappliste angezeigt. Der angezeigte Wert kann von dem tatsächlich zu speichernden Wert abweichen (s. nächster Abschnitt: Gebundene Spalte).

Nach oben3.4.6 Gebundene Spalte

Die gebundene Spalte gibt an, welcher Wert tatsächlich durch Auswahl eines Eintrages gespeichert wird. Falls man dieselbe Datensatzherkunft wie unter Spaltenbreiten aufgeführt verwendet, und die gebundene Spalte auf 1 steht, sowie die Spaltenbreiten auf 0cm;4cm;2cm eingestellt wurden, dann wird der Wert aus der ersten Spalte idArtikel gespeichert und nicht der nachher angezeigte Wert aus txtArtikel!

Um auf den angezeigten Wert aus der 2. Spalte zuzugreifen (also txtArtikel), muss man z.B.mit VBA, wie unter FAQ 4.15 erläutert wird, mit Me![KombinationsfeldName].Column(1) arbeiten (Column fängt, wie fast alle Auflistungen, bei 0 an zu zählen).

Einzelansicht

Nach oben 3.5 Optionsgruppen

Optionsgruppen sind anders anzusprechen als Kontrollkästchen. D.h., wenn ein bestimmter Punkt per Code markiert werden soll, darf nicht das einzelne Optionsfeld auf True gesetzt werden (das geht auch gar nicht), sondern die Optionsgruppe selbst muss auf den dem Optionsfeld zugeordneten Wert gesetzt werden. Grundsätzlich sind diese Werte nicht True oder False, sondern "normale" nummerische Werte, wie sie beim Anlegen der Optionsgruppe mittels des Assistenten vom User vorgegeben wurden.

Man sollte also zunächst den Namen der Optionsgruppe ermitteln: Dazu den Gruppenrahmen im Entwurf markieren und danach das Eigenschaftsfenster öffnen. Standardmäßig werden Optionsgruppen mit RahmenXYZ (XYZ steht für eine fortlaufende Nummer) benannt. Und dieser Name wird im Code verwendet/angesprochen. Hier ein einfaches Beispiel für das Formular-Ereignis "Beim Laden":

Private Sub Form_Load()
 
Me!Rahmen5 = 2
 
End Sub
 

Ähnlich muss man vorgehen, wenn ein Standardwert gesetzt werden soll: Rahmen und nicht ein untergeordnetes Optionsfeld markieren und das Eigenschaftsfenster aufrufen.

Einzelansicht
Home