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 génère le plus et le moins de revenus par catégorie à l’aide d’un signet pour enregistrer la position d’enregistrement actuelle. 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 d’enregistrement actuelle 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 sur 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 objet 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.
Remarque
Les feuilles 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, ni 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.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour