Freigeben über


Ändern einer Abfrage aus einem DAO-Recordset

Verwenden Sie die Requery-Methode für ein Recordset-Objekt vom Typ dynaset oder Momentaufnahme, wenn Sie die zugrunde liegende Abfrage nach dem Ändern eines Parameters erneut ausführen möchten. Dies ist praktischer, als ein neues Recordset zu öffnen, und es wird schneller ausgeführt.

Im folgenden Codebeispiel wird ein Recordset-Objekt erstellt und an eine Funktion übergeben, die die CopyQueryDef-Methode verwendet, um die entsprechende SQL-Zeichenfolge zu extrahieren. Anschließend wird der Benutzer aufgefordert, der Abfrage eine zusätzliche Beschränkungsklausel hinzuzufügen. Die Requery-Methode im Code wird zum Ausführen der geänderten Abfrage verwendet.

Sub AddQuery() 
 
Dim dbsNorthwind As DAO.Database 
Dim qdfSalesReps As DAO.QueryDef 
Dim rstSalesReps As DAO.Recordset 
 
On Error GoTo ErrorHandler 
 
   Set dbsNorthwind = CurrentDb 
 
   Set qdfSalesReps = dbsNorthwind.CreateQueryDef("SalesRepQuery") 
   qdfSalesReps.SQL = "SELECT * FROM Employees WHERE Title = " & _ 
                      "'Sales Representative'" 
 
   Set rstSalesReps = qdfSalesReps.OpenRecordset() 
 
   ' Call the function to add a constraint. 
   AddQueryFilter rstSalesReps 
 
   ' Return database to original. 
   dbsNorthwind.QueryDefs.Delete "SalesRepQuery" 
 
   rstSalesReps.Close 
   qdfSalesReps.Close 
   dbsNorthwind.Close 
 
   Set rstSalesReps = Nothing 
   Set qdfSalesReps = Nothing 
   Set dbsNorthwind = Nothing 
 
   Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub 
 
Sub AddQueryFilter(rstData As Recordset) 
 
Dim qdfData As DAO.QueryDef 
Dim strNewFilter As String 
Dim strRightSQL As String 
 
On Error GoTo ErrorHandler 
 
   Set qdfData = rstData.CopyQueryDef 
 
   ' Try "LastName LIKE 'D*'". 
   strNewFilter = InputBox("Enter new criteria") 
 
   strRightSQL = Right(qdfData.SQL, 1) 
 
   ' Strip characters from the end of the query, 
   ' as needed. 
   Do While strRightSQL = " " Or strRightSQL = ";" Or _ 
                          strRightSQL = vbCR Or strRightSQL = vbLF 
      qdfData.SQL = Left(qdfData.SQL, Len(qdfData.SQL) - 1) 
      strRightSQL = Right(qdfData.SQL, 1) 
   Loop 
 
   qdfData.SQL = qdfData.SQL & " AND " & strNewFilter 
   rstData.Requery qdfData         'Requery the Recordset. 
   rstData.MoveLast               'Populate the Recordset. 
 
   ' "Lastname LIKE 'D*'" should return 2 records. 
   MsgBox "Number of records found:  " & rstData.RecordCount & "." 
 
   qdfData.Close 
   Set qdfData = Nothing 
 
   Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

Hinweis

Um die Requery-Methode verwenden zu können, muss die Restartable-Eigenschaft des Recordset-Objekts auf True festgelegt werden. Für die Restartable-Eigenschaft ist immer True festgelegt, wenn das Recordset-Objekt aus einer Abfrage erstellt wurde, die keine Kreuztabellenabfrage für Tabellen in einer Access-Datenbank ist. Es ist nicht möglich, SQL-Pass-Through-Abfragen neu zu starten. Abfragen für verknüpfte Tabellen in einem anderen Datenbankformat können mitunter neu gestartet werden. Ob eine Abfrage für ein Recordset-Objekt erneut ausgeführt werden kann, können Sie anhand der Restartable-Eigenschaft ermitteln.

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.