OVH Cloud OVH Cloud

Problème MAJ Recordset

2 réponses
Avatar
DCR
Bonjour,

Après avoir retourner mon problème dans tous les sens sans succès je me suis
décider à vous soumettre mon problème.

Tout d'abord mon environnement : Access 2002 (10.6501.6735) SP3 - Windows XP.

J'ai créé une application access dont les tables sont toutes liées à des
tables d'une autre base Access (ou SQL serveur selon l'environnement ou je
travaille).

Dans mon application j'ai déclaré un recordset en variables publique.
A l'ouverture de l'un de mes formulaire j'initilise mon recordset

Dim MyRecordset as DAO.Recordset
Set MyRecordset = currentdb.openrecordset (MonSQL, dbOpesnSnapShot,
DbReadOnly).

Mon formulaire "MyForm" est un formulaire indépendant (Aucun recordsource de
défini). Il contient un sous formulaire "SFrm", qui lui contient exactement
les données de MonSQL (celui qui a servi a initialiser mon recordset).
Une autre section de MyForm me permet de saisir des données. Après un clic
sur un bouton Valider je lance une commande SQL

DoCmd.RunSQL "INSERT INTO MyTable (Champ1, Champ2, ...) VALUES ("'" &
Txt1.value & "', '" & Txt2.value "', " & ...).

Je met à jour mon sous formulaire et mon recordset

SFrm.Requery.
MyRecordset.Requery

Puis pour positionner mon recordset sur le nouvel enregistrement

MyRecordset.MoveFIrst
MyRecordset.FindFirst criteria:="Champ1 = '" & Txt1.value & "'"

Résultat :

Le nouvel enregistrement s'est bien affiché dans mon sous formulaire
(l'enregistrement à donc bien été inséré dans ma table.)
Par contre mon recorset, malgré le requery (j'ai également essayer de le
regénéré avec Set MyRecordset ...), ne contient pas mon nouvel
enregistrement. (La propriété NoMatch renvois true après mon FindFirst.

Si je ferme mon formulaire et que je le réouvre... miracle, mon recordset
contient bien mon enregistrement...

C'est un peu génant, dans le sens ou mon recordset me sert à construire un
treeview. J'aimerais donc ne pas avoir a refermer mon formulaire pour
reconstituer mon treeview.

Avez vous une idée ?

Merci d'avance

DCR

2 réponses

Avatar
david
salut,

si j'ai bien compris (par ce que c'est pas tout a fait clair) :
- tu as une table (myTable) , que tu vas remplir avec des données
saisies.
- tu as une instruction SQL (monSQL) qui remplie un sous-formulaire en
prenant les données depuis une table (SQL ou Access) et depuis
myTable.
- tu as un DAO.recordSet de type snapshot, utilisant le code monSQL.

Maintenant, si tu ajoutes des données dans myTable : le formulaire
basé sur monSQL est bien mis à jour mais pas le recordset (pourtant
normalement équivalent) ?
As-tu essayé de recréer totalement le recordset :
myRecordset.Close: set myRecordset = Nothing
set myRecordset = currentdb.openrecordset (MonSQL, dbOpenSnapShot)
rq: le readonly n'est pas nécessaire, un snapshot est forcément
readonly
Sinon, essaye de cloner le recordset servant de source à ton
sous-formulaire.
Cela devrait mieux fonctionner.

En fait, le problème vient de l'utilisation du snapshot (instantané
en lecture seule) et donc de la mauvaise réactualisation des données.
Par contre, je m'étonne que tu utilises DAO et non pas ADO pour
accéder à tes données. Attention : DAO exécute les instructions
forcément en local, alors que ADO peu les faire exécuter sur un autre
serveur (surtout SQL).

A+
Avatar
DCR
Tu as effectivement bien compris mon problème. merci d'avoir pris le temps
d'essayer de comprendre ce qu'il y avait dans ma tete !

merci de ton aide, je vais faire des tests.

J'utilise DAO car je n'ai jamais utilisé ADO. Je viens de regarder il semble
que j'ai pas mal de code a changé si je voulais changé mon type de recordset.

J'utilise notemment les méthode Edit et FindFIrst des recordset DAO que je
ne retrouve pas dans les ADO. Peut être peux tu m'aider ?

Initiliase t'on un recordset de la meme manire avec ADO et DAO ?
SET MyRC = CurrentDB.OPenRecordset (...) ?




salut,

si j'ai bien compris (par ce que c'est pas tout a fait clair) :
- tu as une table (myTable) , que tu vas remplir avec des données
saisies.
- tu as une instruction SQL (monSQL) qui remplie un sous-formulaire en
prenant les données depuis une table (SQL ou Access) et depuis
myTable.
- tu as un DAO.recordSet de type snapshot, utilisant le code monSQL.

Maintenant, si tu ajoutes des données dans myTable : le formulaire
basé sur monSQL est bien mis à jour mais pas le recordset (pourtant
normalement équivalent) ?
As-tu essayé de recréer totalement le recordset :
myRecordset.Close: set myRecordset = Nothing
set myRecordset = currentdb.openrecordset (MonSQL, dbOpenSnapShot)
rq: le readonly n'est pas nécessaire, un snapshot est forcément
readonly
Sinon, essaye de cloner le recordset servant de source à ton
sous-formulaire.
Cela devrait mieux fonctionner.

En fait, le problème vient de l'utilisation du snapshot (instantané
en lecture seule) et donc de la mauvaise réactualisation des données.
Par contre, je m'étonne que tu utilises DAO et non pas ADO pour
accéder à tes données. Attention : DAO exécute les instructions
forcément en local, alors que ADO peu les faire exécuter sur un autre
serveur (surtout SQL).

A+