OVH Cloud OVH Cloud

Requête Mise à jour

9 réponses
Avatar
Yermak
Bonjour,

J'essaye de mettre à jour une table avec le résultat d'une requête sur un
autre table.

La table contient le code client en clé primaire.
La requête extrait à partir de l'autre table le nombre de contacts chez le
client et renvoie le code client et le nombre de contact.

Je reçois le premier message classique me disant que je vais faire une mise
à jour de données, puis le message suivant :

"L'opération doit utiliser une requête qui peut être mise à jour" .

Merci par avance de votre aide

9 réponses

Avatar
circaete
C'est un problème que j'ai déjà souvent rencontré lorsue la requête utilisée
pour la mise à jour est une requête avec regroupement.

La solution que j'ai trouvé est la suivante
Je crée une table intermédioaire destinée à recevoir le résultat de la
requête avec regroupement, puis je lance trois requêtes successives

Une requête suppression qui vide la table intermédiaire
Une requête ajout qui alimente la table intermédiaire avec le résultat de la
requête avec regroupement
Une requête mise à jour entre la table intermédiaire et la table définitive

Si quelqu'un a une meilleure solution, je suis preneur




Bonjour,

J'essaye de mettre à jour une table avec le résultat d'une requête sur un
autre table.

La table contient le code client en clé primaire.
La requête extrait à partir de l'autre table le nombre de contacts chez le
client et renvoie le code client et le nombre de contact.

Je reçois le premier message classique me disant que je vais faire une mise
à jour de données, puis le message suivant :

"L'opération doit utiliser une requête qui peut être mise à jour" .

Merci par avance de votre aide


Avatar
Yermak
Merci de cette premioère réponse, c'est effectivement la solution que
j'utilise pour l'instant, comme toi, je recherche plus élégant. Attendons la
suite


C'est un problème que j'ai déjà souvent rencontré lorsue la requête utilisée
pour la mise à jour est une requête avec regroupement.

La solution que j'ai trouvé est la suivante
Je crée une table intermédioaire destinée à recevoir le résultat de la
requête avec regroupement, puis je lance trois requêtes successives

Une requête suppression qui vide la table intermédiaire
Une requête ajout qui alimente la table intermédiaire avec le résultat de la
requête avec regroupement
Une requête mise à jour entre la table intermédiaire et la table définitive

Si quelqu'un a une meilleure solution, je suis preneur




Bonjour,

J'essaye de mettre à jour une table avec le résultat d'une requête sur un
autre table.

La table contient le code client en clé primaire.
La requête extrait à partir de l'autre table le nombre de contacts chez le
client et renvoie le code client et le nombre de contact.

Je reçois le premier message classique me disant que je vais faire une mise
à jour de données, puis le message suivant :

"L'opération doit utiliser une requête qui peut être mise à jour" .

Merci par avance de votre aide




Avatar
J-Pierre
Bonsoir,

Il n'y a pas de suite, c'est comme ça !

Par contre, une remarque: Si j'ai bien compris, tu veux stocker dans la table client et pour chaque client le nombre de contacts de
ce client. Mais tu touches à une des limites d'Access. Comme les triggers ne sont pas supportés, tu n'as aucune garantie que tes
requêtes seront correctement exécutées et que le nombre de contacts sera juste, sauf à utiliser ADO et des BeginTrans, RollbackTrans
et CommitTrans qui inclueront la suppression et l'ajout des contacts.

Et puis, mais là, dans un environnement Acces, c'est très théorique, si plusieurs personnes modifient les contacts en même temps,
tes 3 requêtes vont se "téléscoper" et le résultat sera aléatoire.

Alors, il est peut-être plus simple et prudent d'utiliser une fonction de regroupement chaque fois que tu as besoin de ce nombre
total de contacts et de l'afficher dans un sous-formulaire qui ne contient que ça (et d'autres valeurs regroupées), car le
formulaire qui affiche cette info ne peut plus faire de mise à jour.

Mais si tu insistes vraiment, une solution possible: Toujours dans l'optique le formulaire principal affiche un client et le
sous-formulaire affiche les contacts de ce client.
Dans ton formulaire principal, tu mets ton champ "NbContacts" de ta table Client..
Et dans ton sous formulaire, évènements "Après insertion" et "Après suppression", tu mets:

Me.Parent.NbContacts = DCount("monChamp", "tableContacts", "codeClient=" & Me.codeClient)
SendKeys "+" & "{Enter}", True ' pour que la table soit immédiatement mise à jour

Toujours avec le risque (minime) que le DCount ne soit pas exécuté.

J-Pierre

"Yermak" a écrit dans le message de news:
Merci de cette premioère réponse, c'est effectivement la solution que
j'utilise pour l'instant, comme toi, je recherche plus élégant. Attendons la
suite


C'est un problème que j'ai déjà souvent rencontré lorsue la requête utilisée
pour la mise à jour est une requête avec regroupement.

La solution que j'ai trouvé est la suivante
Je crée une table intermédioaire destinée à recevoir le résultat de la
requête avec regroupement, puis je lance trois requêtes successives

Une requête suppression qui vide la table intermédiaire
Une requête ajout qui alimente la table intermédiaire avec le résultat de la
requête avec regroupement
Une requête mise à jour entre la table intermédiaire et la table définitive

Si quelqu'un a une meilleure solution, je suis preneur




Bonjour,

J'essaye de mettre à jour une table avec le résultat d'une requête sur un
autre table.

La table contient le code client en clé primaire.
La requête extrait à partir de l'autre table le nombre de contacts chez le
client et renvoie le code client et le nombre de contact.

Je reçois le premier message classique me disant que je vais faire une mise
à jour de données, puis le message suivant :

"L'opération doit utiliser une requête qui peut être mise à jour" .

Merci par avance de votre aide






Avatar
Yermak
Merci J-Pierre


Bonsoir,

Il n'y a pas de suite, c'est comme ça !

Par contre, une remarque: Si j'ai bien compris, tu veux stocker dans la table client et pour chaque client le nombre de contacts de
ce client. Mais tu touches à une des limites d'Access. Comme les triggers ne sont pas supportés, tu n'as aucune garantie que tes
requêtes seront correctement exécutées et que le nombre de contacts sera juste, sauf à utiliser ADO et des BeginTrans, RollbackTrans
et CommitTrans qui inclueront la suppression et l'ajout des contacts.

Et puis, mais là, dans un environnement Acces, c'est très théorique, si plusieurs personnes modifient les contacts en même temps,
tes 3 requêtes vont se "téléscoper" et le résultat sera aléatoire.

Alors, il est peut-être plus simple et prudent d'utiliser une fonction de regroupement chaque fois que tu as besoin de ce nombre
total de contacts et de l'afficher dans un sous-formulaire qui ne contient que ça (et d'autres valeurs regroupées), car le
formulaire qui affiche cette info ne peut plus faire de mise à jour.

Mais si tu insistes vraiment, une solution possible: Toujours dans l'optique le formulaire principal affiche un client et le
sous-formulaire affiche les contacts de ce client.
Dans ton formulaire principal, tu mets ton champ "NbContacts" de ta table Client..
Et dans ton sous formulaire, évènements "Après insertion" et "Après suppression", tu mets:

Me.Parent.NbContacts = DCount("monChamp", "tableContacts", "codeClient=" & Me.codeClient)
SendKeys "+" & "{Enter}", True ' pour que la table soit immédiatement mise à jour

Toujours avec le risque (minime) que le DCount ne soit pas exécuté.

J-Pierre

"Yermak" a écrit dans le message de news:
Merci de cette premioère réponse, c'est effectivement la solution que
j'utilise pour l'instant, comme toi, je recherche plus élégant. Attendons la
suite


C'est un problème que j'ai déjà souvent rencontré lorsue la requête utilisée
pour la mise à jour est une requête avec regroupement.

La solution que j'ai trouvé est la suivante
Je crée une table intermédioaire destinée à recevoir le résultat de la
requête avec regroupement, puis je lance trois requêtes successives

Une requête suppression qui vide la table intermédiaire
Une requête ajout qui alimente la table intermédiaire avec le résultat de la
requête avec regroupement
Une requête mise à jour entre la table intermédiaire et la table définitive

Si quelqu'un a une meilleure solution, je suis preneur




Bonjour,

J'essaye de mettre à jour une table avec le résultat d'une requête sur un
autre table.

La table contient le code client en clé primaire.
La requête extrait à partir de l'autre table le nombre de contacts chez le
client et renvoie le code client et le nombre de contact.

Je reçois le premier message classique me disant que je vais faire une mise
à jour de données, puis le message suivant :

"L'opération doit utiliser une requête qui peut être mise à jour" .

Merci par avance de votre aide











Avatar
3stone
"J-Pierre"
[...]
| SendKeys "+" & "{Enter}", True ' pour que la table soit immédiatement mise à jour

Pouaaarrkkkk !


Me.Dirty = False

;-)


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
J-Pierre
Me.Dirty = False force la MAJ ?
Intéressant ça.....
Tu veux bien confirmer ?

--
J-Pierre
------------------------------------------------------
http://www.mpfa.info :
Le site où que j'ai dû payer pour y figurer :-(
------------------------------------------------------

"3stone" a écrit dans le message de news: %
"J-Pierre"
[...]
| SendKeys "+" & "{Enter}", True ' pour que la table soit immédiatement mise à jour

Pouaaarrkkkk !


Me.Dirty = False

;-)


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/



Avatar
Salut J-Pierre
t'as des soucis pour tester tout seul, toi grand Aspeur vaudou ? ;-)
ps : c'est quoi cette signature :-O** ?

--
Arnaud
-----------------------------------------
Vous êtes novice ? :
http://www.mpfa.info
-----------------------------------------



"J-Pierre" a écrit dans le message de news:
Me.Dirty = False force la MAJ ?
Intéressant ça.....
Tu veux bien confirmer ?

--
J-Pierre
------------------------------------------------------
http://www.mpfa.info :
Le site où que j'ai dû payer pour y figurer :-(
------------------------------------------------------



Avatar
J-Pierre
Salut Arnaud,

Ca t'aurait pris moins de temps pour me répondre "OUI".....
Je testerai, puisqu'ON refuse de m'aider.

--
J-Pierre
------------------------------------------------------
http://www.mpfa.info :
Le site où que j'ai dû payer pour y figurer :-(
------------------------------------------------------

<Anor> a écrit dans le message de news: uu$
Salut J-Pierre
t'as des soucis pour tester tout seul, toi grand Aspeur vaudou ? ;-)
ps : c'est quoi cette signature :-O** ?

--
Arnaud
-----------------------------------------
Vous êtes novice ? :
http://www.mpfa.info
-----------------------------------------



"J-Pierre" a écrit dans le message de news:
Me.Dirty = False force la MAJ ?
Intéressant ça.....
Tu veux bien confirmer ?

--
J-Pierre
------------------------------------------------------
http://www.mpfa.info :
Le site où que j'ai dû payer pour y figurer :-(
------------------------------------------------------







Avatar
3stone
Salut,

"J-Pierre"
| Je testerai, puisqu'ON refuse de m'aider.


Je viens de rentrer... et je te dis "OUI"

;-)



Sendkeys !!! Non mais ?!?!?

:o))



PS:
Me.Dirty = False
- "force" la mise à jour (sans message d'erreur en cas où...)

Me.Dirty = True
- fait l'inverse. Il "brouille" un enregistrement sans que tu commence à saisir!
Parfait pour "forcer" la génération d'un NumAuto *avant* de commencer la saisie.


--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/