PDA

Vollständige Version anzeigen : Zugriff auf Recordset-Objekt mittels SQL-Abfrage ?


proesel
26.03.2006, 18:43
Hallo Leute,

ich habe folgendes Problem: Ich habe ein Recordset (recDaten1) erstellt, dass eine bestimmte Menge Daten enthält. In einem nächsten Schritt will ich per Abfrage auf dieses Recordset zugreifen und bestimmte Daten rausfiltern, um sie in einem neuen Recordset zu speichern. Für die Abfrage verwende ich folgenden Code: strDaten = "SELECT * FROM recDaten1" & Filterkriterien
Sobald ich versuche, ein neues Recordset mit der Datenherkunft strDaten zu oeffnen, bringt Access mir die Fehlermeldung Error 3078 ... kann Eingangstabelle oder Abfrage 'recDaten1' nicht finden ...
Gibt es eine Möglichkeit mit VBA direkt auf Recordsets zu zugreifen, oder muss ich die immer erst als Tabelle bzw. Abfrage zwischenspeichern?

Es wäre schön, wenn jemand eine tolle Idee hätte.

Vielen Dank schon mal

Uwe

Nouba
26.03.2006, 19:11
Du kannst auf einem DAO-Recordset Filterkriterien anwenden.
Dim db As DAO.Database
Dim rs(1) As DAO.Recordset

Set db = CurrentDb()
Set rs(0) = db.OpenRecordSet("SELECT * FROM ADRESSEN WHERE LAND = 'D'", dbOpenSnapshot)
If Not rs(0).BOF And Not rs(0).EOF THEN
rs(0).Filter = "ORT='Hamburg'"
Set rs(1) = rs(0).OpenRecordset()
' Hier steht das gefilterte Recordset
'... irgendwann aufräumen
End If

proesel
26.03.2006, 19:15
Deine Lösung klingt gut, werde ich gleich ausprobieren.

Vielen Dank

Uwe

proesel
26.03.2006, 20:34
Hallo Nouba,

ich habe Deinen Vorschlag gleich ausprobiert, es hat super geklappt. Jetzt habe ich das Recordset-Objekt nach vier verschiedenen Kriterien gefiltert und will die verbliebenen Daten in einer Tabelle speichern. Ich hatte da an eine Tabellenerstellungsabfrage gedacht, aber auch hier gibt es beim SQL-String das Problem, dass er das Recordset-Objekt nicht erkennt.

Hast Du da noch einen Vorschlag für mich?

Uwe

Nouba
26.03.2006, 20:55
Erstelle eine Abfrage über die Grunddaten, die genau die gewünschten Zielder hat und verwende darin das Kriterium <tt>WHERE 1 = 0</tt>. Daraus baust Du Dir eine Tabellenerstellungsabfrage, die Du später im Kode aufrufen kannst. Mußt halt schauen, ob Du die Tabelle vorher oder nur ihren Inhalt löschen willst. Das Daten des Recordsets schreibt man dann am besten in eine Transaktion verpackt innerhalb einer Schleife in die Tabelle.

' weiter mit den Deklarationen von oben

On Error Resume Next
db.Tabledefs.Delete("TemporaereTabelle")
db.TableDefs.Refresh ' braucht man vermutlich nicht
On Error Goto 0
db.Execute "TabErstellungsabfrage", dbFailOnError

Dim rsZiel As DAO.Recordset
Dim ws AS DAO.WorkSpace
Set ws = DBEngine(0)
Set rsZiel = db.OpenRecordset("TemporaereTabelle")
ws.BeginTrans
Do While Not rs(1).EOF
Dim f As DAO.Field

rsZiel.AddNew
For Each f in rs(1)
rsZiel(f.Name) = f.Value
Next f
rsZiel.Update

rs(1).MoveNext
Loop
ws.Commit