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 |
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.
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:
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").
Einzelansicht3.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:
Danach öffnet sich der folgende Dialog, in dem man die gewünschten Einstellungen vornehmen kann:
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".
Einzelansicht3.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.
3.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 nurfctFillField
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.
3.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.
3.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.
3.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.
3.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
).
3.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).
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.
EinzelansichtSeiten: 1