Modification sur les recordsets - VB/VBA/VBS - Programmation
Marsh Posté le 09-12-2005 à 14:02:26
Bonjour,
En ce qui me concerne, j'utilise un recordset uniquement pour lire des données. Pour des opérations de mises à jour, j'utilise la méthode Execute d'un object Connexion avec une requête UPDATE, INSERT ou DELETE.
Marsh Posté le 09-12-2005 à 15:04:03
Moi aussi j'utilise les recordsets uniquement pour lire, mais dans certain cas je dois les retravailler (".Addnew" ) pour les utiliser, et je voudrais être sur que ça ne modifiera pas la Bdd à distance.
Marsh Posté le 09-12-2005 à 15:36:25
Re,
A mon avis, si tu fais un .Addnew, il faut .Update pour que la mise à jour se fasse.
Fais le test et tu nous dis ?
Marsh Posté le 09-12-2005 à 15:58:54
Le probleme est que le recorset est en READ-ONLY, donc je ne peux pas faire de .addnew et je ne sais pas comment enlever le READ-ONLY.
Marsh Posté le 09-12-2005 à 16:18:57
Re,
C'est un peu long, mais avec un peu de lecture (MSDN)
OpenRecordset, méthode
Crée un objet Recordset et l'ajoute à la collection Recordsets.
Syntaxe
Dans le cas d'objets Connection et Database :
Set recordset = object.OpenRecordset (source, type, options, lockedits)
Dans le cas d'objets QueryDef, Recordset et TableDef :
Set recordset = object.OpenRecordset (type, options, lockedits)
La syntaxe de la méthode OpenRecordset comprend les éléments suivants :
Élément Description
recordset Variable objet représentant l'objet Recordset à ouvrir.
object Variable objet représentant un objet existant à partir duquel vous voulez créer l'objet Recordset.
source Donnée de type String indiquant la source des enregistrements du nouvel objet Recordset. Il peut s'agir du nom d'une table, d'une requête ou d'une instruction SQL qui renvoie des enregistrements. Dans le cas d'objets Recordset de type Table figurant dans les bases de données Microsoft Jet, la source ne peut être qu'un nom de table.
type Facultatif. Constante indiquant le type d'objet Recordset à ouvrir, comme indiqué dans la section Valeurs.
options Facultatif. Combinaison de constantes indiquant les caractéristiques du nouvel objet Recordset, comme indiqué dans la section Valeurs.
lockedits Facultatif. Constante définissant le verrouillage de l'objet Recordset, comme indiqué dans la section Valeurs.
Valeurs
Vous pouvez affecter l'une des constantes suivantes à l'argument type :
Constante Description
dbOpenTable Ouvre un objet Recordset de type Table (espaces de travail Microsoft Jet uniquement).
dbOpenDynamic Ouvre un objet Recordset de type Dynamique, identique à un curseur dynamique ODBC(espaces de travail ODBCDirect uniquement)
dbOpenDynaset Ouvre un objet Recordset de type Feuille de réponses dynamique (Dynaset), identique à un curseur de jeu de valeurs clé ODBC.
dbOpenSnapshot Ouvre un objet Recordset de type Instantané, identique à un curseur statique ODBC.
dbOpenForwardOnly Ouvre un objet Recordset de type En avant seulement.
Note Si vous ouvrez un objet Recordset dans un espace de travail Microsoft Jet et si vous n'indiquez aucun type, OpenRecordset crée un objet Recordset de type Table si possible. Si vous indiquez une table liée ou une requête, la méthode OpenRecordset crée un objet Recordset de type Feuille de réponses dynamique (Dynaset). Dans le cas d'un espace de travail ODBCDirect, la valeur par défaut est dbOpenForwardOnly.
Vous pouvez affecter une combinaison des constantes suivantes à l'argument options.
Constante Description
dbAppendOnly Permet aux utilisateurs d'ajouter de nouveaux enregistrements à l'objet Recordset, tout en leur interdisant de modifier ou de supprimer les enregistrements existants (objet Recordset de type Feuille de réponses dynamique Microsoft Jet (Dynaset) uniquement).
dbSQLPassThrough Transmet une instruction SQL à une source de données ODBC connectée Microsoft Jet en vue de son traitement (objet Recordset de type Instantané Microsoft Jet (Snapshot) uniquement).
dbSeeChanges Génère une erreur d'exécution si un utilisateur modifie les données en cours de modification par un autre utilisateur (objet Recordset de type Feuille de réponses dynamique Microsoft Jet (Dynaset) uniquement). Ce comportement peut s'avérer utile dans les applications dans lesquelles plusieurs utilisateurs bénéficient d'accès simultané en lecture/écriture aux mêmes données.
dbDenyWrite Interdit aux autres utilisateurs de modifier ou d'ajouter des enregistrements (objets Microsoft Jet Recordset uniquement).
dbDenyRead Interdit aux autres utilisateurs de lire les données d'une table (objet Recordset de type Table Microsoft Jet uniquement).
dbForwardOnly Crée un objet Recordset de type En avant seulement (objet Recordset de type Instantané Microsoft Jet uniquement). Cette option est fournie dans un souci de compatibilité avec les versions précédentes ; il est préférable d'adopter la constante dbOpenForwardOnly dans l'argument type.
dbReadOnly Interdit aux utilisateurs d'apporter des modifications à l'objet Recordset (Microsoft Jet uniquement). La constante dbReadOnly de l'argument lockedits remplace désormais cette option, qui n'est fournie qu'à des fins de compatibilité avec les versions précédentes.
dbRunAsync Exécute une requête asynchrone (espaces de travail ODBCDirect uniquement).
dbExecDirect Exécute une requête en sautant SQLPrepare et en appelant directement SQLExecDirect (espaces de travail ODBCDirect uniquement). Utilisez cette option uniquement si vous n'ouvrez pas un objet Recordset basé sur une requête Paramètre. Pour plus d'informations, voir le "Manuel de référence du programmeur Microsoft ODBC 3.0".
dbInconsistent Autorise les mises à jour incohérentes (objets Recordset Microsoft Jet de type Feuille de réponses dynamique (Dynaset) et Instantané (Snapshot) uniquement).
dbConsistent Autorise uniquement les mises à jour cohérentes (objets Recordset Microsoft Jet de type Feuille de réponses dynamique (Dynaset) et Instantané (Snapshot) uniquement).
Note Les constantes dbConsistent et dbInconsistent s'excluent mutuellement ; si vous les utilisez toutes deux en même temps, une erreur se produit. Si vous indiquez un argument lockedits lorsque l'argument options utilise la constante dbReadOnly, vous obtiendrez également une erreur.
Vous pouvez affecter l'une des constantes suivantes à l'argument lockedits.
Constante Description
dbReadOnly Interdit aux utilisateurs d'apporter des modifications à l'objet Recordset (option par défaut pour les espaces de travail ODBCDirect). Vous pouvez utiliser l'objet dbReadOnly dans l'argument options ou lockedits, mais pas dans les deux. Si vous l'utilisez dans les deux arguments, une erreur d'exécution se produit.
dbPessimistic Utilise le verrouillage pessimiste afin de déterminer de quelle façon les modifications sont apportées à l'objet Recordset dans un environnement multi-utilisateur. La page contenant l'enregistrement que vous modifiez est verrouillée dès que vous utilisez la méthode Edit (option par défaut pour les espaces de travail Microsoft Jet).
dbOptimistic Utilise le verrouillage optimiste afin de déterminer de quelle façon les modifications sont apportées à l'objet Recordset dans un environnement multi-utilisateur. La page contenant l'enregistrement n'est pas verrouillée tant que l'exécution de la méthode Update n'est pas terminée.
dbOptimisticValue Utilise le contrôle concurrentiel optimiste à partir des valeurs des lignes (espaces de travail ODBCDirect uniquement).
dbOptimisticBatch Active la mise à jour par lot (espaces de travail ODBCDirect uniquement).
Remarques
Dans le cas d'un espace de travail Microsoft Jet, si object fait référence à un objet QueryDef ou à un objet Recordset de type Feuille de réponses dynamique (Dynaset) ou Instantané (Snapshot), ou bien si l'argument source fait référence à une instruction SQL ou à un objet TableDef représentant une table liée, vous ne pouvez pas affecter la constante dbOpenTable à l'argument type. En effet, cela entraînerait une erreur d'exécution. Si vous souhaitez lancer une requête directe SQL sur une table liée dans une source de données ODBC connectée Microsoft Jet, vous devez commencer par affecter à la propriété Connect de la base de données de la table liée une chaîne de connexion ODBC valide. Si vous avez uniquement besoin d'effectuer un seul passage sur un objet Recordset ouvert depuis une source de données ODBC connectée Microsoft Jet, vous pouvez améliorer les performances en affectant la constante dbOpenForwardOnly à l'argument type.
Si object fait référence à un objet Recordset de type Feuille de réponses dynamique (Dynaset) ou Instantané (Snapshot), le nouvel objet Recordset sera du même type object. Si l'argument object fait référence à un objet Recordset de type Table, le nouvel objet sera un objet Recordset de type Feuille de réponses dynamique (Dynaset). Vous ne pouvez pas ouvrir de nouveaux objets Recordset à partir d'objets Recordset ODBCDirect de type En avant seulement.
Dans le cas d'un espace de travail ODBCDirect, vous pouvez ouvrir un objet Recordset contenant plusieurs requêtes Sélection dans l'argument source. Exemple :
"SELECT LastName, FirstName FROM Authors
WHERE LastName = 'Smith';
SELECT Title, ISBN FROM Titles
WHERE ISBN Like '1-55615-*'"
L'objet Recordset renvoyé s'ouvrira avec les résultats de la première requête. Pour obtenir les jeux de résultats des enregistrements provenant de requêtes suivantes, utilisez la méthode NextRecordset.
Note Vous pouvez envoyer des requêtes DAO vers un certain nombre de serveurs de base de données différents avec ODBCDirect et différents serveurs reconnaîtront des dialectes SQL quelque peu différents. C'est pourquoi, l'aide contextuelle n'est plus fournie pour Microsoft Jet SQL, bien que l'aide en ligne pour Microsoft Jet SQL soit toujours accessible via le menu d'aide. Assurez-vous que vous consultez la documentation de référence appropriée pour le dialecte SQL de votre serveur de base de données lorsque vous utilisez des connexions ODBCDirect ou des requêtes directes dans des applications client/serveur connectées par Microsoft Jet.
Adoptez une constante dbSeeChanges dans un espace de travail Microsoft Jet si vous souhaitez récupérer les modifications lorsque plusieurs utilisateurs modifient ou suppriment le même enregistrement. Par exemple, si deux utilisateurs commencent à modifier le même enregistrement, le premier utilisateur qui exécute la méthode Update y parvient sans problème. En revanche, lorsque le deuxième utilisateur invoque la méthode Update, une erreur d'exécution se produit. De même, si le deuxième utilisateur tente de recourir à la méthode Delete pour supprimer l'enregistrement et que le premier utilisateur l'a déjà modifié, une erreur d'exécution se produit.
En général, si l'utilisateur reçoit cette erreur au cours d'une mise à jour, votre code doit mettre à jour le contenu des champs et extraire les valeurs nouvellement modifiées. Si l'erreur se produit au cours du processus de suppression, votre code peut présenter à l'utilisateur les nouvelles données de l'enregistrement et afficher un message indiquant que les données ont été modifiées récemment. À ce moment, votre code peut demander confirmation pour savoir si l'utilisateur souhaite toujours supprimer l'enregistrement.
Il est également recommandé d'utiliser la constante dbSeeChanges si vous ouvrez un objet Recordset dans un espace de travail ODBC connecté Microsoft Jet avec une table Microsoft SQL Server 6.0 (ou versions ultérieures) contenant une colonne IDENTITY ; sinon, une erreur risque de se produire.
Dans un espace de travail ODBCDirect, vous pouvez exécuter des requêtes asynchrones en définissant la constante dbRunAsync dans l'argument options. Cela permet à votre application de continuer de traiter d'autres instructions pendant que la requête s'exécute en arrière-plan. Vous ne pouvez toutefois pas accéder aux données de l'objet Recordset tant que la requête n'est pas terminée. Pour savoir si la requête est terminée, vérifiez la propriété StillExecuting du nouvel objet Recordset. Si la requête dure plus longtemps que vous ne l'escomptiez, vous pouvez y mettre fin à l'aide de la méthode Cancel.
L'ouverture de plusieurs objets Recordset sur une source de données ODBC risque d'échouer si la connexion est occupée par un appel OpenRecordset antérieur. Il est possible de contourner ce problème en utilisant un curseur côté serveur et ODBCDirect, si le serveur peut les prendre en charge. Il est également possible de remplir entièrement l'objet Recordset à l'aide de la méthode MoveLast, dès l'ouverture de l'objet Recordset.
Si vous ouvrez un objet Connection en affectant la constante dbUseClientBatchCursor à DefaultCursorDriver, vous pouvez ouvrir un objet Recordset afin de stocker en mémoire cache les modifications apportées aux données (ce procédé est appelé mise à jour par lot) dans un espace de travail ODBCDirect. Placez une constante dbOptimisticBatch dans l'argument lockedits afin d'activer le stockage des mises à jour en mémoire cache. Pour plus d'informations sur la façon d'écrire immédiatement les modifications sur disque ou sur la possibilité de les écrire en différé, voir la rubrique consacrée à la méthode Update.
La fermeture d'un objet Recordset à l'aide de la méthode Close le supprime automatiquement de la collection Recordsets.
Note Si l'argument source fait référence à une instruction SQL composée d'une chaîne concaténée avec une valeur non entière et si le séparateur décimal indiqué dans les paramètres système n'est pas le point (par exemple, strSQL = "PRICE > " & lngPrice, et lngPrice = 125,50), une erreur se produit à l'ouverture de l'objet Recordset. Lors de la concaténation, le nombre indiqué sera converti en chaîne en appliquant le caractère de séparation décimale par défaut de votre système, tandis que le langage SQL accepte uniquement le séparateur décimal américain (le point).
Marsh Posté le 09-12-2005 à 16:34:42
zou ! un petit exemple d'utilisation de recordset pour vous
On remplit la table "TableMachin" dont les champs sont : TypeDonnee, Libelle, flagCalcul
|
Marsh Posté le 09-12-2005 à 17:07:17
Ok pour "Set recordset = object.OpenRecordset (source, type, options, lockedits) "
Mais je ne vois pas quoi mettre à la place de "lockedits" pour ne plus avoir "READ ONLY"
Marsh Posté le 09-12-2005 à 10:15:35
Bonjour,
Après plusieurs recherche sur les recordsets, je n'ai pas tout compris.
1- Apres un ".OpenRecordset" à travers une connexion ODBC et une requête SQL("Select" ), j'aimerais savoir si le fait de bidouiller dans le recordset peut modifier la base de données.
(J'ai du mal a comprendre si le recordset est une seulement image ou si il garde les liens avec la base)
2- Comment puis-je effectuer des modifs dans le recordset ou dans un de ces clones en sachant que par défaut il est en READ-ONLY avec des connections ODBC.
Merci