Mise a jour recordset : blocage aleatoire -> petit casse-tete.

Le
Guy
Bonjour,

Un petit casse-tete sous Access 2000 :

Soit 1 formulaire principal "F-Detail-Echantillon" (base sur la table
T-Echantillon -> cote 1 de la relation) et un sous-formulaire (base sur la
table T-Suivi -> cote plusieurs de la relation).

Lors de l'ouverture du formulaire principal "F-Detail-Echantillon" pas de
probleme pour la mise a jour des enregistrements aussi bien dans le
formulaire que dans le sous-formulaire : Normal.

MAIS :

Lorsque le formulaire "F-Detail-Echantillon" est ouvert a l'aide d'un bouton
de commande (avec stlinkcriteria = clé primaire) depuis un autre formulaire
"F-Etat-Actuel" qui lui est base sur le résultat d'une requete regroupement
(qui contient, entre autre, les tables "T-Echantillon" et "T-Suivi") alors
"impossible de mettre a jour le recordset".
Le blocage n'est pas systematique (presque) mais des qu'il apparait il est
impossible ensuite de mettre a jour le recordset. Seule la fermeture et
reouverture de la base permet un (rarement plusieurs) mises a jour du
recordset.

Access semble bloquer le recordset avec la requete regroupement et ne le
libere pas dans le nouveau formulaire ouvert.

J'ai essaye de mettre le type de recordset en instantane (pour le(s)
formulaire appelant(s)) mais ca ne fonctionne pas mieux.
J'ai aussi essaye de fermer le formulaire appelant en ouvrant le formulaire
appele mais aucun resultat.

Le moteur MS Jet est a la derniere version a jour.

Le probleme est identique sous Access 2000, XP et 2003 (sans convertir la
base car l'application doit rester sous Access 2000).

Voila, si le probleme n'est pas clair je suis a disposition.

Un grand MERCI au(x) contributeur(s) doue(s).

Guy
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel Gesnot
Le #5042801
Bonjour Guy,

A mon avis, vous avez un problème de verrouillage : vous
accédez votre recordset sur les mêmes enregistrements à
partir de deux formulaires, ce qui équivaut à un accès par
deux utilisateurs.

Voyez du côté de la propriété Verrouillage/Recordlocks.

Bonne continuation
Michel Gesnot


-----Message d'origine-----
Bonjour,

Un petit casse-tete sous Access 2000 :

Soit 1 formulaire principal "F-Detail-Echantillon" (base
sur la table

T-Echantillon -> cote 1 de la relation) et un sous-
formulaire (base sur la

table T-Suivi -> cote plusieurs de la relation).

Lors de l'ouverture du formulaire principal "F-Detail-
Echantillon" pas de

probleme pour la mise a jour des enregistrements aussi
bien dans le

formulaire que dans le sous-formulaire : Normal.

MAIS :

Lorsque le formulaire "F-Detail-Echantillon" est ouvert a
l'aide d'un bouton

de commande (avec stlinkcriteria = clé primaire) depuis
un autre formulaire

"F-Etat-Actuel" qui lui est base sur le résultat d'une
requete regroupement

(qui contient, entre autre, les tables "T-Echantillon"
et "T-Suivi") alors

"impossible de mettre a jour le recordset".
Le blocage n'est pas systematique (presque) mais des
qu'il apparait il est

impossible ensuite de mettre a jour le recordset. Seule
la fermeture et

reouverture de la base permet un (rarement plusieurs)
mises a jour du

recordset.

Access semble bloquer le recordset avec la requete
regroupement et ne le

libere pas dans le nouveau formulaire ouvert.

J'ai essaye de mettre le type de recordset en instantane
(pour le(s)

formulaire appelant(s)) mais ca ne fonctionne pas mieux.
J'ai aussi essaye de fermer le formulaire appelant en
ouvrant le formulaire

appele mais aucun resultat.

Le moteur MS Jet est a la derniere version a jour.

Le probleme est identique sous Access 2000, XP et 2003
(sans convertir la

base car l'application doit rester sous Access 2000).

Voila, si le probleme n'est pas clair je suis a
disposition.


Un grand MERCI au(x) contributeur(s) doue(s).

Guy





.



Guy
Le #5042641
Bonjour Michel,

Merci pour la suggestion mais voici un complément d'information car je me
suis peut-être mal expliqué.

La seule manière d'accéder à nouveau à un recordset "déverrouillé" est de
compacter la base de données.

Résumé des tests :

1 Ouverture de la base et compactage
2 Ouverture du formulaire principal "F-Detail-Echantillon" qui comprend un
sous formulaire "F-Etat-Actuel" (basé lui sur une requête regroupement donc
recordset verrouillé)
3 Ouverture (depuis le sous formulaire "F-Etat-Actuel" avec un bouton sur la
ligne de l'enregistrement voulu) du formulaire "F-Detail-Echantillon"
4 Modification possible des données dans le formulaire
"F-Detail-Echantillon"
5 Fermeture du formulaire "F-Detail-Echantillon" et retour au formulaire
principal
6 Nouvelle ouverture (point 3) depuis un autre enregistrement du sous
formulaire : modification possible
7 Fermeture du formulaire "F-Detail-Echantillon" et du formulaire principal
"F-Detail-Echantillon"
8 Point 2 puis point 3 et là : RECORDSET VERROUILLE

Même en fermant Access et en revenant dans la base le recordset est toujours
verrouillé. Seul le compactage de la base permet de rétablir les choses.

Le formulaire principal n'est basé sur aucune table ni requête; il contient,
outre le sous formulaire "F-Etat-Actuel", deux sous formulaires qui
affichent chacun le résultat de requêtes DCOUNT. Les 3 sous formulaires
n'ont donc aucun lien ni entre eux (sauf qu'ils utilisent les mêmes tables)
ni avec le formulaire principal.

Si ça peut aider et que vous avez d'autres suggestions...

Cordialement

Guy


"Michel Gesnot" message de news:22b001c427ab$132529b0$
Bonjour Guy,

A mon avis, vous avez un problème de verrouillage : vous
accédez votre recordset sur les mêmes enregistrements à
partir de deux formulaires, ce qui équivaut à un accès par
deux utilisateurs.

Voyez du côté de la propriété Verrouillage/Recordlocks.

Bonne continuation
Michel Gesnot


-----Message d'origine-----
Bonjour,

Un petit casse-tete sous Access 2000 :

Soit 1 formulaire principal "F-Detail-Echantillon" (base
sur la table

T-Echantillon -> cote 1 de la relation) et un sous-
formulaire (base sur la

table T-Suivi -> cote plusieurs de la relation).

Lors de l'ouverture du formulaire principal "F-Detail-
Echantillon" pas de

probleme pour la mise a jour des enregistrements aussi
bien dans le

formulaire que dans le sous-formulaire : Normal.

MAIS :

Lorsque le formulaire "F-Detail-Echantillon" est ouvert a
l'aide d'un bouton

de commande (avec stlinkcriteria = clé primaire) depuis
un autre formulaire

"F-Etat-Actuel" qui lui est base sur le résultat d'une
requete regroupement

(qui contient, entre autre, les tables "T-Echantillon"
et "T-Suivi") alors

"impossible de mettre a jour le recordset".
Le blocage n'est pas systematique (presque) mais des
qu'il apparait il est

impossible ensuite de mettre a jour le recordset. Seule
la fermeture et

reouverture de la base permet un (rarement plusieurs)
mises a jour du

recordset.

Access semble bloquer le recordset avec la requete
regroupement et ne le

libere pas dans le nouveau formulaire ouvert.

J'ai essaye de mettre le type de recordset en instantane
(pour le(s)

formulaire appelant(s)) mais ca ne fonctionne pas mieux.
J'ai aussi essaye de fermer le formulaire appelant en
ouvrant le formulaire

appele mais aucun resultat.

Le moteur MS Jet est a la derniere version a jour.

Le probleme est identique sous Access 2000, XP et 2003
(sans convertir la

base car l'application doit rester sous Access 2000).

Voila, si le probleme n'est pas clair je suis a
disposition.


Un grand MERCI au(x) contributeur(s) doue(s).

Guy





.



Michel Gesnot
Le #5041191
Bonjour Guy,

Je suis désole, mais tout cela ne m'apparait pas tres
clair. J'ai peut-etre travaille tres tard hier soir,
mais j'ai ete frugal ce midi et n'ai bu ni vin ni biere :).

En fait, je ne m'y retrouve pas dans la description que
vous faites de vos formulaires.

J'ai compris que
1/ il y a deux tables :
T-echantillon et T-suivi, reliees par une relation 1 à
plusieurs.
Quid de l'integrite referentielle ?

2/ il y a un formulaire principal base directement sur la
table T-echantillon : soit F-Detail-echantillon, qui
semble etre la fiche signaletique de l'echantillon

Ce formulaire contient un sous-formulaire : soit F-Etat-
actuel, base sur une requete regroupement qui est un
historique ou une analyse des mouvements (T-suivi) des
echantillons (T-echantillon).
Le sous-formulaire est independant du formulaire
principal : il n'y a pas de liaison automatique entre les
deux via les champs pères & fils.


D'autre part, je lis que :
A/ il y a encore dans le formulaire principal, donc je
suppose F-Detail-echantillon, deux sous-formulaires qui
affichent, comme le sous-formulaire F-Etat-actuel, le
résultat de requetes de regroupement (DCOUNT), basees
toutes les deux sur les deux tables T-Echantillon et T-
Suivi. Ce qui fait 3 requetes regroupement si je compte
bien.

B/ le formulaire principal n'est base sur aucune table ni
requete, or il a ete dit que le formulaire principal, soit
F-Detail-echantillon, est base sur la table T-Echantillon.

Donc quelle est la situation?
Et, finalement, quel est le but de la manoeuvre?
S'il s'agit de sélectionner un enregistrement, est-ce que
le sous-formulaire ne pourrait pas etre remplace par une
zone de liste avec plusieurs colonne affichees?

A plus tard
M. Gesnot


-----Message d'origine-----
Bonjour Michel,

Merci pour la suggestion mais voici un complément
d'information car je me

suis peut-être mal expliqué.

La seule manière d'accéder à nouveau à un
recordset "déverrouillé" est de

compacter la base de données.

Résumé des tests :

1 Ouverture de la base et compactage
2 Ouverture du formulaire principal "F-Detail-
Echantillon" qui comprend un

sous formulaire "F-Etat-Actuel" (basé lui sur une requête
regroupement donc

recordset verrouillé)
3 Ouverture (depuis le sous formulaire "F-Etat-Actuel"
avec un bouton sur la

ligne de l'enregistrement voulu) du formulaire "F-Detail-
Echantillon"

4 Modification possible des données dans le formulaire
"F-Detail-Echantillon"
5 Fermeture du formulaire "F-Detail-Echantillon" et
retour au formulaire

principal
6 Nouvelle ouverture (point 3) depuis un autre
enregistrement du sous

formulaire : modification possible
7 Fermeture du formulaire "F-Detail-Echantillon" et du
formulaire principal

"F-Detail-Echantillon"
8 Point 2 puis point 3 et là : RECORDSET VERROUILLE

Même en fermant Access et en revenant dans la base le
recordset est toujours

verrouillé. Seul le compactage de la base permet de
rétablir les choses.


Le formulaire principal n'est basé sur aucune table ni
requête; il contient,

outre le sous formulaire "F-Etat-Actuel", deux sous
formulaires qui

affichent chacun le résultat de requêtes DCOUNT. Les 3
sous formulaires

n'ont donc aucun lien ni entre eux (sauf qu'ils utilisent
les mêmes tables)

ni avec le formulaire principal.

Si ça peut aider et que vous avez d'autres suggestions...

Cordialement

Guy



Guy
Le #5040771
Bonjour ou Bonsoir Michel,



Hier c'est moi qui étais fatigué après un dépannage de nuit.



Un schéma vaut mieux qu'un long discours (incompréhensible).



Les tables :



|-------------| |-------| |------------------|

|T-Echantillon|1--N|T-Suivi|---|T-Etat Echantillon|

|-------------| |-------| |------------------|



Les formulaires :



|-----------------------------------|

|F-Principal |----------------| |

| |F-Traité 7 jours| |

| |----------------| |

| |

| |-----------| |

| |F-En retard| |

| |-----------| |

| |

||---------------------------------||

||F-EtatActuel ||

|| ||

||Ligne 1 --- --- --- --- [Bouton] ||

||Ligne 2 --- --- --- --- [Bouton] ||

||Ligne n --- --- --- --- [Bouton] ||

||--- ||

||---------------------------------||

|-----------------------------------|



Le [Bouton] sur formulaire précédent ouvre le formulaire suivant :



|---------------------|

|F-Détail-Echantillon |

| |

| ------------ |

| -------- |

| ----------- |

| |

||-------------------||

||F-Suivi SF ||

||---- ---- --- --- -||

||---- ---- --- --- -||

||-------------------||

|---------------------|



Source des formulaires :

F-Principal : aucune

---



F-EtatActuel :



SELECT [T-Echantillon].Délai, [T-Echantillon].NumEnregistrement,
[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon,
Last([T-EtatEchantillon].EtatEchantillon) AS DernierDeEtatEchantillon

FROM [T-Echantillon] INNER JOIN ([T-EtatEchantillon] INNER JOIN [T-Suivi] ON
[T-EtatEchantillon].NumAutoEtat = [T-Suivi].[Etat de l'échantillon]) ON
[T-Echantillon].NumAutoEchantillon = [T-Suivi].NumAutoEchantillon

WHERE ((([T-EtatEchantillon].Ordre)<>10))

GROUP BY [T-Echantillon].Délai, [T-Echantillon].NumEnregistrement,
[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon

HAVING ((([T-Echantillon].Délai)<(Date()+7)))

ORDER BY [T-Echantillon].Délai, [T-Echantillon].NumEnregistrement,
[T-Echantillon].NumEchantillon;

---



F-Traité 7 jours :



T-Echantillon Requête (1) :

SELECT [T-Suivi].NumAutoEchantillon, Last([T-EtatEchantillon].Ordre) AS
DernierDeOrdre, [T-Echantillon].Délai

FROM [T-Echantillon] INNER JOIN ([T-EtatEchantillon] INNER JOIN [T-Suivi] ON
[T-EtatEchantillon].NumAutoEtat = [T-Suivi].[Etat de l'échantillon]) ON
[T-Echantillon].NumAutoEchantillon = [T-Suivi].NumAutoEchantillon

GROUP BY [T-Suivi].NumAutoEchantillon, [T-Echantillon].Délai

HAVING (((Last([T-EtatEchantillon].Ordre))<>10) AND
(([T-Echantillon].Délai)<(Date()+7)))

ORDER BY [T-Echantillon].Délai;



Source formulaire (2) :

SELECT Count([T-Echantillon Requête].NumAutoEchantillon) AS
CompteDeNumAutoEchantillon

FROM [T-Echantillon Requête];

---



F-En retard :



Rq-Recherche_Retard_Echantillon (1) :

SELECT [T-Echantillon].Délai, [T-Echantillon].NumEnregistrement,
[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon,
Last([T-EtatEchantillon].EtatEchantillon) AS DernierDeEtatEchantillon

FROM [T-Echantillon] INNER JOIN ([T-EtatEchantillon] INNER JOIN [T-Suivi] ON
[T-EtatEchantillon].NumAutoEtat = [T-Suivi].[Etat de l'échantillon]) ON
[T-Echantillon].NumAutoEchantillon = [T-Suivi].NumAutoEchantillon

WHERE ((([T-EtatEchantillon].Ordre)<>10))

GROUP BY [T-Echantillon].Délai, [T-Echantillon].NumEnregistrement,
[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon

HAVING ((([T-Echantillon].Délai)<Date()))

ORDER BY [T-Echantillon].Délai, [T-Echantillon].NumEnregistrement,
[T-Echantillon].NumEchantillon;



Source formulaire (2) :

SELECT Count([Rq-Recherche_Retard_Echantillon].NumAutoEchantillon) AS
CompteDeNumAutoEchantillon1

FROM [Rq-Recherche_Retard_Echantillon];

---



F-Détail-Echantillon :



Table T-Echantillom

---



F-Suivi :



Table T-Suivi

Champ père : NumAutoEchantillon (clé prim. T-Echantillon)

Champ fils : NumAutoEchantillon

---



Voilà pour le détail.



Résumé des tests :

1 Ouverture de la base et compactage
2 Ouverture du formulaire principal "F-Detail-Echantillon" qui comprend un
sous formulaire "F-Etat-Actuel" (basé lui sur une requête regroupement donc
recordset verrouillé)
3 Ouverture (depuis le sous formulaire "F-Etat-Actuel" avec un [bouton] du
formulaire "F-Detail-Echantillon"
4 Modification possible des données dans le formulaire
"F-Detail-Echantillon"
5 Fermeture du formulaire "F-Detail-Echantillon" et retour au formulaire
principal
6 Nouvelle ouverture (point 3) depuis un autre enregistrement du sous
formulaire : modification possible
7 Fermeture du formulaire "F-Detail-Echantillon" et du formulaire principal
"F-Detail-Echantillon"
8 Point 2 puis point 3 et là : RECORDSET VERROUILLE

Même en fermant Access et en revenant dans la base le recordset est toujours
verrouillé. Seul le compactage de la base permet de rétablir les choses.



Voilà le résumé de la situation.



Cordialement



Guy
Michel Gesnot
Le #5040651
Bonjour Guy

Je regarde cela ce soir ou ce WE.
Je reste persuadé que c'est une situation de "dead lock".

A priori peut-être fatal ...

Michel

-----Message d'origine-----
Bonjour ou Bonsoir Michel,



Hier c'est moi qui étais fatigué après un dépannage de
nuit.




Un schéma vaut mieux qu'un long discours
(incompréhensible).




Les tables :



|-------------| |-------| |------------------|

|T-Echantillon|1--N|T-Suivi|---|T-Etat Echantillon|

|-------------| |-------| |------------------|



Les formulaires :



|-----------------------------------|

|F-Principal |----------------| |

| |F-Traité 7 jours| |

| |----------------| |

| |

| |-----------| |

| |F-En retard| |

| |-----------| |

| |

||---------------------------------||

||F-EtatActuel ||

|| ||

||Ligne 1 --- --- --- --- [Bouton] ||

||Ligne 2 --- --- --- --- [Bouton] ||

||Ligne n --- --- --- --- [Bouton] ||

||--- ||

||---------------------------------||

|-----------------------------------|



Le [Bouton] sur formulaire précédent ouvre le formulaire
suivant :




|---------------------|

|F-Détail-Echantillon |

| |

| ------------ |

| -------- |

| ----------- |

| |

||-------------------||

||F-Suivi SF ||

||---- ---- --- --- -||

||---- ---- --- --- -||

||-------------------||

|---------------------|



Source des formulaires :

F-Principal : aucune

---



F-EtatActuel :



SELECT [T-Echantillon].Délai, [T-
Echantillon].NumEnregistrement,

[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon,
Last([T-EtatEchantillon].EtatEchantillon) AS
DernierDeEtatEchantillon


FROM [T-Echantillon] INNER JOIN ([T-EtatEchantillon]
INNER JOIN [T-Suivi] ON

[T-EtatEchantillon].NumAutoEtat = [T-Suivi].[Etat de
l'échantillon]) ON

[T-Echantillon].NumAutoEchantillon = [T-
Suivi].NumAutoEchantillon


WHERE ((([T-EtatEchantillon].Ordre)<>10))

GROUP BY [T-Echantillon].Délai, [T-
Echantillon].NumEnregistrement,

[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon

HAVING ((([T-Echantillon].Délai)<(Date()+7)))

ORDER BY [T-Echantillon].Délai, [T-
Echantillon].NumEnregistrement,

[T-Echantillon].NumEchantillon;

---



F-Traité 7 jours :



T-Echantillon Requête (1) :

SELECT [T-Suivi].NumAutoEchantillon, Last([T-
EtatEchantillon].Ordre) AS

DernierDeOrdre, [T-Echantillon].Délai

FROM [T-Echantillon] INNER JOIN ([T-EtatEchantillon]
INNER JOIN [T-Suivi] ON

[T-EtatEchantillon].NumAutoEtat = [T-Suivi].[Etat de
l'échantillon]) ON

[T-Echantillon].NumAutoEchantillon = [T-
Suivi].NumAutoEchantillon


GROUP BY [T-Suivi].NumAutoEchantillon, [T-
Echantillon].Délai


HAVING (((Last([T-EtatEchantillon].Ordre))<>10) AND
(([T-Echantillon].Délai)<(Date()+7)))

ORDER BY [T-Echantillon].Délai;



Source formulaire (2) :

SELECT Count([T-Echantillon Requête].NumAutoEchantillon)
AS

CompteDeNumAutoEchantillon

FROM [T-Echantillon Requête];

---



F-En retard :



Rq-Recherche_Retard_Echantillon (1) :

SELECT [T-Echantillon].Délai, [T-
Echantillon].NumEnregistrement,

[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon,
Last([T-EtatEchantillon].EtatEchantillon) AS
DernierDeEtatEchantillon


FROM [T-Echantillon] INNER JOIN ([T-EtatEchantillon]
INNER JOIN [T-Suivi] ON

[T-EtatEchantillon].NumAutoEtat = [T-Suivi].[Etat de
l'échantillon]) ON

[T-Echantillon].NumAutoEchantillon = [T-
Suivi].NumAutoEchantillon


WHERE ((([T-EtatEchantillon].Ordre)<>10))

GROUP BY [T-Echantillon].Délai, [T-
Echantillon].NumEnregistrement,

[T-Echantillon].NumEchantillon, [T-Echantillon].Libellé,
[T-Echantillon].NumAutoEchantillon

HAVING ((([T-Echantillon].Délai)<Date()))

ORDER BY [T-Echantillon].Délai, [T-
Echantillon].NumEnregistrement,

[T-Echantillon].NumEchantillon;



Source formulaire (2) :

SELECT Count([Rq-
Recherche_Retard_Echantillon].NumAutoEchantillon) AS

CompteDeNumAutoEchantillon1

FROM [Rq-Recherche_Retard_Echantillon];

---



F-Détail-Echantillon :



Table T-Echantillom

---



F-Suivi :



Table T-Suivi

Champ père : NumAutoEchantillon (clé prim. T-Echantillon)

Champ fils : NumAutoEchantillon

---



Voilà pour le détail.



Résumé des tests :

1 Ouverture de la base et compactage
2 Ouverture du formulaire principal "F-Detail-
Echantillon" qui comprend un

sous formulaire "F-Etat-Actuel" (basé lui sur une requête
regroupement donc

recordset verrouillé)
3 Ouverture (depuis le sous formulaire "F-Etat-Actuel"
avec un [bouton] du

formulaire "F-Detail-Echantillon"
4 Modification possible des données dans le formulaire
"F-Detail-Echantillon"
5 Fermeture du formulaire "F-Detail-Echantillon" et
retour au formulaire

principal
6 Nouvelle ouverture (point 3) depuis un autre
enregistrement du sous

formulaire : modification possible
7 Fermeture du formulaire "F-Detail-Echantillon" et du
formulaire principal

"F-Detail-Echantillon"
8 Point 2 puis point 3 et là : RECORDSET VERROUILLE

Même en fermant Access et en revenant dans la base le
recordset est toujours

verrouillé. Seul le compactage de la base permet de
rétablir les choses.




Voilà le résumé de la situation.



Cordialement



Guy





.



Publicité
Poster une réponse
Anonyme