RecordsAffected ne fonctionne pas ?
Suite à une conversation sur les forums…
J’exécute des instructions SQL à l’aide de la commandeExecute
. J’ai vu qu’on pouvait récupérer le nombre de lignes modifiées parCurrentDb.RecordsAffected
. Mais on dirait que ça ne marche pas ?
Ce qui ne marche pas
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub DemoRecordsAffected1() ' Une instruction SQL Dim strSQL As String strSQL = "INSERT INTO [tbl Produits] ([Code Produit], Catégorie, Libellé, Quantité)" _ & " VALUES (11, 'XYZ', 'Produit Test', 100)" ' On exécute l'instruction CurrentDb.Execute strSQL ' On affiche le nombre de lignes modifiées MsgBox CurrentDb.RecordsAffected End Sub |
En toute logique, ce code devrait afficher 1, mais il affiche toujours 0, alors qu’une ligne est bien ajoutée à la table…
Première explication
Il se peut qu’aucune ligne n’ait été insérée, tout simplement parce que vous auriez des doublons sur la clef primaire de la table. Dans notre exemple, si un Code Produit
(clef primaire) existe déjà avec la valeur 11
, l’instruction SQL échoue, et c’est normal qu’on affiche 0.
Deuxième explication
Mais même quand une ligne est ajoutée à la table, RecordsAffected
affiche toujours 0 !
Le problème ne vient pas de RecordsAffected
, mais d’une mauvais utilisation de CurrentDb
: à chaque fois que vous faites appel à cette instruction, vous instanciez un nouvel objet Base de données (DAO.Database
). Du coup, le CurrentDb
utilisé dans le MsgBox
n’est pas le même que celui utilisé pour exécuter le code SQL, c’est en quelque sorte un « nouveau » CurrentDb
, dont la propriété RecordsAffected
vaut 0, sa valeur initiale.
La solution
La solution consiste à passer par une variable pour pointer vers un seul et unique objet Database
le temps de l’opération, au lieu d’appeler CurrentDb
à chaque fois. Ce qui donne :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub DemoRecordsAffected2() ' L'objet db pointe vers la base de données en cours Dim db As DAO.Database Set db = CurrentDb ' Une instruction SQL Dim strSQL As String strSQL = "INSERT INTO [tbl Produits] ([Code Produit], Catégorie, Libellé, Quantité)" _ & " VALUES (12, 'XYZ', 'Produit Test', 100)" ' On exécute l'instruction db.Execute strSQL ' On affiche le nombre de lignes modifiées MsgBox db.RecordsAffected End Sub |
Voir aussi cet autre article sur CurrentDb
. où il est question de performances.
CurrentDb
par DBEngine.Workspaces(0).Databases(0)
ou DBEngine(0)(0)
, le RecordsAffected
aurait fonctionné, parce que cette syntaxe pointe vers la même instance de Database
. Mais cette syntaxe est d’une part plus longue à écrire, d’autre part déconseillée depuis Access 2000, pour éviter des problèmes en réseau.Pour plus de détails sur les références, consultez cette page.