Access-Grundlagen #2 - Abfragen
2.1 Berechnete Spalten in Abfragen
Von anderer Seite (z.B. in einemForum) wird empfohlen, eine berechnete Spalte (o.ä. formuliert) mit Inhalt "X" anzulegen. Wie macht man das?
1. Die Abfrage sollte in der Entwurfsansicht geöffnet werden. Danach geht man mit dem Cursor in eine neue Spalte (evtl. mit der horizontalen Bildlaufleiste nach rechts scrollen).
2. Dort trägt man jetzt den erwähnten Ausdruck ein (im Beispiel die Format-Funktion, die aus dem Erfassungsdatum den Monatsnamen ermittelt).
3. Im Beispiel wurde diese berechnete Spalte durch Access "Ausdr1" getauft. Diese Bezeichnung (alles vor dem Doppelpunkt) kann dann noch angepasst werden. Im nächsten Screenshot wurde die berechnete Spalte in "Monatsname" umbenannt.
Einzelansicht
2.2 SQL-Ansicht
In Foren wird oft die SQL-Ansicht einer Abfrage gepostet. Damit kann man als Anfänger meistens nicht viel anfangen. Was kann man trotzdem tun, um den somit erhaltenen Tipp umzusetzen?
1. Zunächst sollte man den SQL-String aus dem Beitrag kopieren (markieren und anschliessend STRG + C ).
2. Anschliessend legt man eine neue (leere) Abfrage an und wechselt dort sofort zur SQL-Ansicht über Ansicht/SQL-Ansicht ( ALT + A , danach L ).
3. Danach fügt man den kopierten SQL-String ein ( STRG + V ).
4. Die Tabelle heisst jetzt aber nicht "MeineTabelle" und auch die Felder heissen tatsächlich anders. Deshalb muss der SQL-String noch manuell in der SQL-Ansicht angepasst werden. Im Beispiel heisst die Tabelle "tblKunden", das ID-Feld "KundenID" und das Datumsfeld "DatErfassung".
5. Wenn man jetzt alles richtig gemacht hat, kann man den Entwurf der Abfrage über Ansicht/Entwurfsansicht ( ALT + A , danach W ) betrachten bzw. gleich das Ergebnis über Abfrage/Ausführen ( ALT + R , dann H ) bewundern.
Einzelansicht
2.3 Konstanten in Abfragen
Konstanten wie z.B.
vbBinaryCompare
stehen in Abfragen nicht zur Verfügung. Deshalb muss die Konstante
durch den eigentlichen Wert ersetzt werden.
1. Beispiel: In einer Abfrage hat man eine berechnete Spalte (s. 2.1 ) mit folgendem Inhalt eingefügt:
Unterschied: StrVgl([KundenName];"Müller";vbBinaryCompare)
2. Beim Öffnen der Abfrage taucht jetzt eine Parameterabfrage auf.
3. Dieses Verhalten kommt daher, dass die Konstante bei der Ausführung der Abfrage nicht bekannt ist. Dieses Fehlen kann man auch beobachten, wenn man die Abfrage in der Entwurfsansicht betrachtet. Dort steht die Konstante nach Eingabe des Ausdrucks und Verlassen der berechneten Spalte plötzlich in eckigen Klammern.
4. Um die Funktion trotzdem verwenden zu können, muss man die Konstante durch ihren Wert ersetzen (hier: 0).
Zur Ermittlung von Konstantenwerten ohne Verwendung der Onlinehilfe: s. 6.2 .
5. Danach kann das Ergebnis der Abfrage ohne vorherige Parameterabfrage angezeigt werden.
Einzelansicht
2.4 Nullwerte in Kreuztabellen
Angenommen man hat folgende Tabelle:
Daraus möchte man eine Kreuztabellenabfrage mit "Kundenname" als Zeilenüberschrift und "Artikelname" als Spaltenüberschrift erstellen. Die SQL-Ansicht dieser Abfrage würde ungefähr so aussehen:
TRANSFORM Count(tblBestellungen.ID) AS [Anzahl von ID] SELECT tblBestellungen.Kundenname, Count(tblBestellungen.ID) AS Gesamtanzahl FROM tblBestellungen GROUP BY tblBestellungen.Kundenname PIVOT tblBestellungen.Artikelname;
Im Entwurf sähe die Abfrage so aus:
Das Ergebnis liefert dann aber bei den gegebenen Daten in einigen Spalten
"Null"
:
Um daraus 0 als Wert zu erhalten, wechselt man wieder in den Entwurf und ändert die markierten Teile:
In der SQL-Ansicht sähen die Änderungen so aus:
TRANSFORM Val(Nz(Count([ID]),0)) AS Ausdr1 SELECT tblBestellungen.KundenName, Count(tblBestellungen.ID) AS Gesamtanzahl FROM tblBestellungen GROUP BY tblBestellungen.KundenName PIVOT tblBestellungen.ArtikelName;
Nun hat man endlich das Ergebnis, das man haben möchte:
Einzelansicht
2.5 Bezug auf Spalte eines Kombinationsfeldes
Wenn man sich in einer Abfrage auf eine bestimmte Spalte eines Kombinationsfeldes beziehen möchte und deshalb ein Kriterium wie
=[Formulare]![frmLieferscheine]![cboPosition].[column](2)
verwendet, so erhält man beim Ausführen der Abfrage eine Fehlermeldung, die ungefähr so lautet:
ZitatUndefinierte Funktion '[Formulare]![frmLieferscheine]![cboPosition].[column]' in Ausdruck.
Dieses Problem umgeht man mit der folgenden Funktion, die man in ein globales Modul einfügt. Das Modul muss beim Speichern anders als die Funktion benannt werden (s. auch Anleitung auf DBWiki ):
Public Function fctComboCol(strForm As String, _ strCombo As String, _ intCol As Integer) 'Aufruf in SQL-Ansicht einer Abfrage oder in VBA mit: 'fctComboCol("NameDesFormulars","NameDesKombiFeldes",Spalte) 'Aufruf in Entwurfsansicht einer Abfrage mit: 'fctComboCol("NameDesFormulars";"NameDesKombiFeldes";Spalte) fctComboCol = Forms(strForm)(strCombo).Column(intCol) End Function
Die Funktion ist anschliessend als Kriterium einsetzbar. Bezogen auf das obige Beispiel muss das Kriterium in der Entwurfsansicht (nicht zu verwechseln mit der SQL-Ansicht , in der die Semikola durch Kommata ersetzt werden müssen!) einer Abfrage so aussehen:
=fctComboCol("frmLieferscheine";"cboPosition";2)
Übrigens wird mit diesem Beispielkriterium auf die 3. Spalte des Kombinationsfeldes verwiesen, da
Column
- wie fast alle Auflistungen - bei
0
anfängt.
2.6 Replace() in Abfragen
Bei der Verwendung von
Replace()
in Abfragen kann es zu
verschiedenen Fehlern
kommen.
2.6.1 Funktion wird nicht erkannt
Es kommt bei bestimmten Access 2000-Installationen vor, dass bei der Verwendung von
Replace()
innerhalb von Abfragen eine Fehlermeldung erscheint:
ZitatUndefinierte Funktion 'Replace' in Ausdruck.
Am einfachsten lässt sich dieses Problem umgehen, indem man den
Replace()-Ersatz von DBWiki
in einem neuen Modul einfügt (s. auch Anleitung auf
DBWiki
). Danach sollte
Replace()
auch in der Abfrage funktionieren.
2.6.2 Nullwerte
Angenommen man verwendet eine Abfrage wie:
SELECT * FROM tblKunden WHERE REPLACE([txtTelNr]," ","")="03012345678"
Sobald das Feld
txtTelNr
Nullwerte enthält, kann es zu folgender Fehlermeldung kommen:
ZitatDatentypen in Kriterienausdruck unverträglich.
Durch vorherige Behandlung des Feldes mit
Nz()
kann dieser Fehler umgangen werden:
SELECT * FROM tblKunden WHERE REPLACE(Nz([txtTelNr],"")," ","")="03012345678"
2.7 Fixierte Spaltenüberschriften
Kreuztabellenabfragen haben die Eigenschaft, unnötige Spalten nicht anzuzeigen. Wenn man z.B. eine Kreuztabellenabfrage erstellt, die die Bestellungen pro Kunde und Quartal zählt:
TRANSFORM Count([tblBestellungen].[ID]) AS [Anzahl von ID] SELECT [tblBestellungen].[KundenName], Count([tblBestellungen].[ID]) AS Gesamtanzahl FROM tblBestellungen GROUP BY [tblBestellungen].[KundenName] PIVOT "Quartal " & Format([datBestellung],"q");
, dann werden nur die Quartalspalten ausgegeben, in denen Bestellungen vorliegen. Durch Anpassung der nur für Kreuztabellenabfragen gültigen
Abfrageeigenschaft
"Fixierte Spaltenüberschriften" werden alle 4 Quartale sichtbar. Man muss bei dieser Eigenschaft die möglichen Werte durch Semikolon getrennt eintragen (s.
PIVOT
-Abschnitt in der SQL-Ansicht):
Die Änderung in der SQL-Ansicht sieht übrigens so aus:
TRANSFORM Count([tblBestellungen].[ID]) AS [Anzahl von ID] SELECT [tblBestellungen].[KundenName], Count([tblBestellungen].[ID]) AS Gesamtanzahl FROM tblBestellungen GROUP BY [tblBestellungen].[KundenName] PIVOT "Quartal " & Format([datBestellung],"q") IN ("Quartal 1","Quartal 2","Quartal 3","Quartal 4");
Die nun zusätzlich angezeigten Quartalspalten sind in diesem Fall leer. Wenn man an den Stellen 0 anzeigen lassen möchte, sollte man nach 2.4 Nullwerte in Kreuztabellen vorgehen.
EinzelansichtSeiten: 1