# Access : gespeicherte Abfrage als Grundlage für SQL Abfrage



## tombe (16. Januar 2007)

Hallo,

ich experimentiere gerade ein bisschen mit Access herum.
In der DB git es im Moment 3 Tabellen (Ok, es sind mehr aber die 3 sind wichtig):

a) Zimmer (Nummer, Beschreibung, Artikelgruppe und Preis),
b) Ausstattung (Artikelnummer und Ausstattungsmerkmal) und
c) Reservierung (Artikelnummer, Von und Bis)

So und hier das Problem :
Ein Zimmer kann an verschiedenen Tagen reserviert/vermietet sein. Wenn ich jetzt wissen will welche Zimmer einer bestimmten Gruppe, sagen wir vom 15.01.07 bis 19.01.07 verfügbar sind, ermittle ich dies über zwei gespeicherte Abfragen.
Die Daten (Datum von, Datum bis und Gruppe) stammen von dem Formular von dem aus die Abfrage aufgerufen werden.

Abfrage1:

```
SELECT reservierung.zimmernummer, reservierung.datum_von, reservierung.datum_bis
FROM reservierung
WHERE (((reservierung.datum_von) Between [Forms]![reservierung].[txtDatum_von] And [Forms]![reservierung].[txtDatum_bis])) OR (((reservierung.datum_bis) Between [Forms]![reservierung].[txtDatum_von] And [Forms]![reservierung].[txtDatum_bis])) OR (((reservierung.datum_von)<=[Forms]![reservierung].[txtDatum_von]) AND ((reservierung.datum_bis)>=[Forms]![reservierung].[txtDatum_bis]));
```

Ermittelt zunächst die Zimmer die NICHT verfügbar sind.

Abfrage2:

```
SELECT zimmer.nummer, zimmer.beschreibung
FROM zimmer LEFT JOIN Abfrage1 ON zimmer.nummer = Abfrage1.zimmernummer
WHERE (((Abfrage1.zimmernummer) Is Null) AND ((zimmer.gruppe) Like [Forms]![reservierung].[lstGruppe]))
ORDER BY zimmer.nummer;
```

Baut auf dem Ergebnis von Abfrage1 auf und kehrt es um. Somit erhalte ich die gewünschten Daten.

Jetzt will ich aber dieses Ergebnis noch "verfeinern" indem ich bestimmte Ausstattungen hinzufüge.

Mein Problem ist ich weiß nicht wie viele Ausstattungen es gibt und ich weiß auch nicht wie viele davon als Abfragekriterium ausgewählt werden. Deshalb kann ich das nicht als fertige Abfrage speichern.

Ich will jetzt in einer For-Next Schleife einen SQL-String erstellen der auf dem Ergebnis der Abfrage2 aufbaut.

Allerdings erhalte ich immer die Fehlermeldung "Too few Parameters. Expected 3 (oder auch 4)".

Hier mal der Code wie ich es bis jetzt versuche (zum testen habe ich hierbei allerdings nur das Feld "preis" als Abfragekriterium genommen, aber egal) :


```
db.QueryDefs("Abfrage2")![Forms!reservierung.txtDatum_von] = Forms![reservierung]![txtDatum_von]
db.QueryDefs("Abfrage2")![Forms!reservierung.txtDatum_bis] = Forms![reservierung]![txtDatum_bis]
db.QueryDefs("Abfrage2")![Forms!reservierung.lstGruppe] = Forms![reservierung]![lstGruppe]

Set rs = db.OpenRecordset("SELECT Abfrage2.nummer, Abfrage2.beschreibung FROM Abfrage2 WHERE Abfrage2.preis >= '1'")
```

Der obige Fehler deutet eigentlich darauf hin, das ein Feldname falsch geschrieben ist oder so. Ich habe es aber sowohl mit "Abfrage2.nummer" als auch mit "zimmer.nummer" und auch nur mit "nummer" versucht. Der Fehler bleibt immer der selbe.

Habt ihr eine Erklärung oder ein Beispiel wie das aussehen muss?
Ich hoffe ihr könnt mir da (mal wieder) weiterhelfen.

Gruß Thomas


----------



## Ork6 (10. Februar 2007)

Hallo Thomas,

die Abfrage kann nicht funktionieren, da Abfrage2 kein Feld mit namen "preis" liefert.



> ... WHERE Abfrage2.preis >= '1'")


 funktioniert nur, wenn es in Abfrage2 auch ein Feld "preis" gibt

Ändere die Abfrage2 in 

```
SELECT zimmer.* FROM zimmer  ....
```

Dann sollte die Abfrage funktionieren.

Grüße
Uwe


----------

