Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Data1 : mauvaise synchronisation

3 réponses
Avatar
Gloops
Bonjour tout le monde,

J'ai créé un enregistrement ainsi

Set Rs = Data1.Recordset
'MDIForm1.frm1.Data1.RecordSource = ""
'MDIForm1.frm1.Data1.Refresh
Data1.RecordSource = ""
Data1.Refresh
tmpAdresse = NouvelIndexAdresse()
Rs.AddNew
Rs!CodeAdresse = tmpAdresse
Rs.Update

et j'ai vérifié par une autre requête, l'enregistrement a bien été créé
dans la table.

En revanche, il arrive que dans le contrôle Data, l'enregistrement
n'apparaisse pas, ce qui pose problème lorsqu'on veut le sélectionner.

Logiquement, l'instruction qui devrait se charger de faire apparaître le
nouvel enregistrement dans le formulaire est Data1.UpdateControls, si je
ne m'abuse ?

Si je la déclenche à ce moment-là, en mode pause, pas de succès, le
nombre d'enregistrements de Data1.Recordset ne change pas, et n'inclut
toujours pas l'enregistrement qui vient d'être créé, même si j'ajoute
Data1.Refresh.

A vrai dire c'est quelque chose de pas très catholique que je vous
demande de m'aider à faire, puisque je synchronise deux
sous-formulaires, sur un formulaire MDI. ça marche dix fois, vingt fois,
et à l'improviste l'adresse n'a pas été créée. C'est plus souvent lors
de la première création après ouverture de l'application que le problème
se pose. Une fois que j'ai réussi à créer un enregistrement, je peux le
supprimer et le recréer vingt fois sans problème.

Me serais-je trompé sur le rôle de Data1.UpdateControls, ou la table
risquerait-elle d'être verrouillée par un formulaire pendant que je
cherche à la mettre à jour sur l'autre ?

Pour un truc qui arrive une fois tous les X, je suis tenté de m'obstiner
quelque peu, pour trouver ce qui fait que cette fois-là la
synchronisation n'est pas possible, alors que toutes les autres fois si.

Déjà, pour commencer, ai-je bien compris le rôle de Data1.UpdateControls ?

3 réponses

Avatar
Gloops
Bon, j'ai une piste pour mon problème de synchronisation.

L'erreur 3167 s'est produite après la création d'enregistrement,
l'enregistrement était considéré comme supprimé.

La fiche 208799 dit qu'il faut ouvrir la base avec l'option dbSeeChanges.

Seulement, si dans le champ Options des propriétés de l'objet Data je
mets dbSeeChanges, on me répond que la valeur de propriété est incorrecte.

La fiche concerne bien une base Access 2000.
La différence par rapport à l'exemple donné est que je l'ai ouverte par
un objet Data.

Je vais laisser un peu reposer, pour voir si cette affaire prend sens
tout-à-coup ...

Si quelqu'un comprend avant moi quoi faire, il peut faire signe ...
Avatar
Gloops
Re,

Je dois m'avouer un peu perplexe.

Voici comment je m'y prends à présent :
Set DB = Data1.Database
Set Rs = DB.OpenRecordset("SELECT * FROM AdressePostale", dbOpenDynaset,
dbSeeChanges)


Data1.RecordSource = ""
Data1.Refresh
tmpAdresse = NouvelIndexAdresse()
Rs.AddNew
Rs!CodeAdresse = tmpAdresse
Rs.Update
Rs.Close
Set Rs = DB.OpenRecordset("SELECT * FROM AdressePostale", dbOpenDynaset,
dbSeeChanges)
' pour vérifier la présence d'enregistrement

...
Data1.RecordSource = "AdressePostale"
Data1.Refresh



Ce dernier jeu d'enregistrements ne contient que l'enregistrement qui
vient d'être créé, lequel ne peut pas être atteint à partir de Data1.

J'ai mis dbSeeChanges comme dit la fiche, j'ai fermé le jeu
d'enregistrements pour plus de sûreté, et en le rouvrant je trouve bien
le nouvel enregistrement, mais rien d'autre avec (en n'oubliant pas
MoveLast bien sûr). J'ai dû louper un épisode, non ?

J'ai aussi fait un essai avec une requête INSERT INTO.

Toujours pareil : une fois que l'utilisateur a créé une fois un
enregistrement (la deuxième adresse dans la table), il doit passer deux
fois dans chaque sens d'un formulaire à l'autre pour déclencher la
synchronisation deux fois. La première fois, il a une erreur 3426,
"méthode annulée par un objet associé", et ensuite tout se passe bien.

Si l'utilisateur saisit quelque chose dans les champs avant la deuxième
synchronisation, la saisie est perdue.

Si je tente de faire les deux synchronisations automatiquement c'est
comme si je flutais ...

L'idée commence à germer dans ma tête d'imposer un minimum de deux
enregistrements dans la table d'adresses (dont un vide par exemple),
mais j'aimerais quand même bien comprendre ce qui se passe ...

Voici la tronche de la table :
Base de données: C:Documents and Settings etc ...

Définition de la table pour AdressePostale

Champs: (Nom - Type - Taille Propr.)
------------------------------------------------------------
Adresse2 - Text - 50 AllowZeroLength
Adresse3 - Text - 50 AllowZeroLength
Adresse4 - Text - 50 AllowZeroLength
Adresse5 - Text - 50 AllowZeroLength
BureauDistributeur - Text - 50 AllowZeroLength
CodeAdresse - Text - 5 Required FixedLength
CP - Text - 10 AllowZeroLength

Index: (Nom - Champs - Unique)
------------------------------------------------------------
CodeAdresse - +CodeAdresse - True









Gloops a écrit, le 25/05/2005 09:31 :
Bon, j'ai une piste pour mon problème de synchronisation.

L'erreur 3167 s'est produite après la création d'enregistrement,
l'enregistrement était considéré comme supprimé.

La fiche 208799 dit qu'il faut ouvrir la base avec l'option dbSeeChanges.

Seulement, si dans le champ Options des propriétés de l'objet Data je
mets dbSeeChanges, on me répond que la valeur de propriété est incorrecte.

La fiche concerne bien une base Access 2000.
La différence par rapport à l'exemple donné est que je l'ai ouverte par
un objet Data.

Je vais laisser un peu reposer, pour voir si cette affaire prend sens
tout-à-coup ...

Si quelqu'un comprend avant moi quoi faire, il peut faire signe ...





Avatar
Gloops
Bonjour,

Pour finir, j'ai créé un formulaire frmMAJ qui décharge et recharge mon
formulaire MDI, sans oublier de sauvegarder sa position à l'écran.

De cette façon l'enregistrement est pris en compte correctement.

Je reste certes intéressé par une solution plus élégante.