Marquer une position dans un jeu d’enregistrements DAO

Un signet est un tableau d'octets généré par le système qui identifie chaque enregistrement de manière unique. La propriété DAO Bookmark d'un objet Recordset change chaque fois que vous vous déplacez sur un nouvel enregistrement. Pour identifier un enregistrement, placez-vous dans cet enregistrement, puis affectez la valeur de la propriété DAO Bookmark à une variable de type Variant. Pour revenir à cet enregistrement, attribuez à la propriété DAO Bookmark la valeur de la variable.

L’exemple de code suivant montre comment trouver le produit qui fait le plus et le moins de revenus par catégorie à l’aide d’un signet pour enregistrer la position de l’enregistrement actuel. Les signets vous permettent d'effectuer d'autres opérations sur l'objet Recordset et de revenir à la position enregistrée.

Sub GetProductStats() 
 
Dim dbsNorthwind As DAO.Database 
Dim rstProducts As DAO.Recordset 
Dim rstCategories As DAO.Recordset 
Dim varFirstMark As Variant 
Dim varHighMark As Variant 
Dim varLowMark As Variant 
Dim curHighRev As Currency 
Dim curLowRev As Currency 
Dim strSQL As String 
Dim strCriteria As String 
Dim strMessage As String 
 
On Error GoTo ErrorHandler 
 
   Set dbsNorthwind = CurrentDb 
 
   strSQL = "SELECT * FROM Products WHERE UnitsOnOrder >= 40 " & _ 
            "ORDER BY CategoryID, UnitsOnOrder DESC" 
   Set rstProducts = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
   If rstProducts.EOF Then Exit Sub 
 
   StrSQL = "SELECT CategoryID, CategoryName FROM Categories " & _ 
            "ORDER BY CategoryID" 
   Set rstCategories = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
 
   ' For each category find the product generating the least revenue 
   ' and the product generating the most revenue. 
   Do Until rstCategories.EOF 
 
      strCriteria = "CategoryID = " & rstCategories![CategoryID] 
      rstProducts.FindFirst strCriteria 
      curHighRev = rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] 
 
      If Not rstProducts.NoMatch Then 
 
         ' Set bookmarks at the first record containing the CategoryID. 
         varFirstMark = rstProducts.Bookmark 
         varHighMark = varFirstMark 
         varLowMark = varFirstMark 
 
         ' Find the product generating the most revenue. 
         Do While rstProducts![CategoryID] = rstCategories![CategoryID] 
            If rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] > _ 
            curHighRev Then 
               curHighRev = rstProducts![UnitPrice] * _ 
                            rstProducts![UnitsOnOrder] 
               varHighMark = rstProducts.Bookmark 
            End If 
            rstProducts.MoveNext 
         Loop 
 
         ' Move to the first record containing the CategoryID. 
         rstProducts.Bookmark = varFirstMark 
         curLowRev = rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] 
 
         ' Find the product generating the least revenue. 
         Do While rstProducts![CategoryID] = rstCategories![CategoryID] 
            If rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] < _ 
            curLowRev Then 
               curLowRev = rstProducts![UnitPrice] * _ 
                           rstProducts![UnitsOnOrder] 
               varLowMark = rstProducts.Bookmark 
            End If 
            rstProducts.MoveNext 
         Loop 
 
      End If 
 
      ' Set high and low bookmarks to build the message string. 
      strMessage = "CATEGORY:  " & rstCategories!CategoryName & _ 
                   vbCrLf & vbCrLf 
      rstProducts.Bookmark = varHighMark 
      strMessage = strMessage & "HIGH: $" & curHighRev & "  " & _ 
                   rstProducts!ProductName & vbCrLf 
      rstProducts.Bookmark = varLowMark 
      strMessage = strMessage & "LOW:  $" & curLowRev & "  " & _ 
                   rstProducts!ProductName 
      MsgBox strMessage, , "Product Statistics" 
      rstCategories.MoveNext 
   Loop 
 
   rstProducts.Close 
   rstCategories.Close 
   dbsNorthwind.Close 
 
   Set rstProducts = Nothing 
   Set rstCategories = Nothing 
   Set dbsNorthwind = Nothing 
 
Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

Un signet est utile si une méthode échoue car la position de l’enregistrement actuel n’est pas définie. La propriété LastModified de l’objet Recordset fournit une bonne illustration de l’utilisation d’un signet. The LastModified property returns the bookmark of the last record in the Recordset to be added or modified. Pour l’utiliser, définissez la propriété Bookmark DAO comme étant égale à la propriété LastModified, comme suit.

rstCustomers.Bookmark = rstCustomers.LastModified 

Ce code déplace la position d'enregistrement actuelle sur le dernier enregistrement ajouté ou modifié. Cela se révèle particulièrement utile lors de l'ajout de nouveaux enregistrement, car après que vous avez ajouté un enregistrement, l'enregistrement actif correspond à celui sur lequel vous vous trouviez avant cet ajout. La propriété LastModified vous permet de vous déplacer sur le dernier enregistrement ajouté si c'est ce que votre application attend. Lorsque vous fermez un objet Recordset, les signets que vous avez enregistrés ne sont plus valides.

Vous ne pouvez pas utiliser un signet d'un jeu d'enregistrements dans un autre jeu, et ce, même si les deux jeux d'enregistrements se basent sur la même table ou requête sous-jacente. Toutefois, vous pouvez utiliser un signet sur le clone d’un recordset, comme illustré dans l’exemple suivant.

Dim dbsNorthwind As DAO.Database 
Dim rstOriginal As DAO.Recordset 
Dim rstDuplicate As DAO.Recordset 
Dim varBookMark As Variant 
 
   Set dbsNorthwind = CurrentDb 
 
   ' Create the first Recordset. 
   Set rstOriginal = dbsNorthwind.OpenRecordset("Orders", dbOpenDynaset) 
 
   ' Save the current record position. 
   varBookMark = rstOriginal.Bookmark 
 
   ' Create a duplicate Recordset. 
   Set rstDuplicate = rstOriginal.Clone() 
 
   ' Go to the same record. 
   rstDuplicate.Bookmark = varBookMark 
 
   rstOriginal.Close 

Vous pouvez également utiliser la propriété DAO Bookmark sur l'objet Recordset sous-jacent d'un formulaire. Grâce à cette propriété, votre code peut marquer l'enregistrement actuellement affiché dans le formulaire, puis modifier l'enregistrement affiché. Par exemple, dans un formulaire qui contient des informations sur un employé, vous pouvez insérer un bouton permettant d'afficher l'enregistrement de son supérieur.

Notes

[!REMARQUE] Les feuilles de réponse dynamiques basées sur certaines tables liées, telles que les tables Paradox qui n'ont pas de clé primaire, ne prennent pas en charge les signets, comme les objets Recordset de type avant uniquement. Vous pouvez déterminer si un objet Recordset donné prend en charge les signets en vérifiant la valeur de la propriété Bookmarkable.

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.