Zum Inhalt dieser Seite

Access-Grundlagen #2 - Abfragen

2.1 Berechnete Spalten in Abfragen 2.2 SQL-Ansicht
2.3 Konstanten in Abfragen 2.4 Nullwerte in Kreuztabellen
2.5 Bezug auf Spalte eines Kombinationsfeldes 2.6 Replace() in Abfragen
2.7 Fixierte Spaltenüberschriften

Nach oben 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).

Abfrageentwurf #1

2. Dort trägt man jetzt den erwähnten Ausdruck ein (im Beispiel die Format-Funktion, die aus dem Erfassungsdatum den Monatsnamen ermittelt).

Ausdruck eintragen

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.

Angepasster Ausdruck

Einzelansicht

Nach oben 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).

Anlegen einer SQL-Ansicht

3. Danach fügt man den kopierten SQL-String ein (STRG+V).

SQL-Ansicht nach Einfügen des Vorschlags

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".

Angepasster SQL-String

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.

Ergebnisansicht der angep. Abfrage

Einzelansicht

Nach oben 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.

Parameterabfrage der Konstante

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.

Aussehen des Abfrageentwurfs bei Verw. von Konstanten

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.

Ersetzen der Konstanten durch deren Wert

5. Danach kann das Ergebnis der Abfrage ohne vorherige Parameterabfrage angezeigt werden.

Ergebnisansicht der angep. Abfrage

Einzelansicht

Nach oben 2.4 Nullwerte in Kreuztabellen

Angenommen man hat folgende Tabelle:

Beispieldatensätze

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:

Ursprüglicher Entwurf der Crosstab-Query

Das Ergebnis liefert dann aber bei den gegebenen Daten in einigen Spalten "Null":

Ergebnisansicht mit Null-Werten

Um daraus 0 als Wert zu erhalten, wechselt man wieder in den Entwurf und ändert die markierten Teile:

Anpassung der Crosstab-Query im Entwurf

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:

Ergebnisansicht der angep. Crosstab-Query

Einzelansicht

Nach oben 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:

Zitat

Undefinierte 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.

Einzelansicht

Nach oben 2.6 Replace() in Abfragen

Bei der Verwendung von Replace() in Abfragen kann es zu verschiedenen Fehlern kommen.

Nach oben2.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:

Zitat

Undefinierte 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.

Nach oben2.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:

Zitat

Datentypen in Kriterienausdruck unverträglich.

Durch vorherige Behandlung des Feldes mit Nz() kann dieser Fehler umgangen werden:

SELECT * FROM tblKunden WHERE REPLACE(Nz([txtTelNr],"")," ","")="03012345678"
Einzelansicht

Nach oben 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):

Fixierte Spaltenüberschriften

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.

Einzelansicht
Home