Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/05/2011, 14h43   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Par défaut Demande aide requête combinée

Bonjour,
Ma sous requête ci-dessous fonctionne très bien. Je souhaite ensuite faire une jointure pour ne retenir qu'une seule ligne sauf que le formalisme global n'est pas bon.
Erreur : "L'opération doit utiliser une requête qui peut être mise à jour"
Quelqu'un peut m'aider avec des explications (je fais sans arrêt cette erreur, et oui j'apprends empiriquement)? Merci beaucoup.

Code :
1
2
3
4
5
6
7
8
9
 
UPDATE D INNER JOIN F ON D.SAPIdentification_Notification=F.Notification_ 
SET D.ILIDInProgress = 
(
SELECT F.Notification_, COUNT(F.Notification_)
FROM F WHERE F.CodeGroup_ <> 'Z'
GROUP BY F.Notification_
)
WHERE D.Identification_Infoset='A' OR D.Identification_Infoset='S' ;
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 15h25   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Teuzadur,

Citation:
Envoyé par Teuzadur
.../... j'apprends empiriquement .../...
==> alors, a fortiori, je te conseille fortement de passer par l'assistant graphique de création de requête (QBE).

Ensuite, de découper tes requêtes.

Donc, via l'assistant :
Requête R1 => la sous-requête groupée (le count() ne semble pas nécessaire, tu gagneras, sans doute, en performance) ;
Requête R2 => à partir de la requête R1, liée à la table que tu veux mettre à jour. Avant de passer en requête "mise à jour", assures-toi que les enregistrements sélectionnés sont les bons.

Cela te permet de t'assurer qu'une étape fonctionne avant de passer à la suivante.

Enfin, tu peux toujours étudier/récupérer le code SQL généré pour, à terme, ne taper QUE du SQL, si tu le souhaites.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 15h46   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
C'est uniquement le COUNT que je souhaite conserver, il s'agit d'un mauvais copier/coller, le F.Notification_ ne me sert que pour la vérification.
Je déteste l'assistant car justement, c'est juste personnel, il ne permet pas de sentir les choses et donc m'améliorer sur le code SQL, ce que je souhaite principalement faire.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 16h19   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Citation:
Envoyé par Teuzadur
.../... Je déteste l'assistant .../...
==> c'est toi qui vois...

Il n'empêche qu'il faut découper ton travail. Par exemple, le SELECT groupé te renvoie 2 champs (F.Notification_, COUNT(F.Notification_))
: comment Access détermine quel est le champ qui doit mettre à jour D.ILIDInProgress ?... à moins qu'il y ait quelque chose qui m'échappe.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 16h59   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Je suis toujours preneur d'un coup de pouce. Ci-après ma requête mise à jour avec la correction :

Code :
1
2
3
4
5
6
7
8
9
 
UPDATE D INNER JOIN F ON D.SAPIdentification_Notification=F.Notification_ 
SET D.ILIDInProgress = 
(
SELECT COUNT(F.Notification_)
FROM F WHERE F.CodeGroup_ <> 'Z'
GROUP BY F.Notification_
)
WHERE D.Identification_Infoset='A' OR D.Identification_Infoset='S' ;
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 17h10   #6
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Tu ne dis pas si elle fonctionne.

Comme je te l'ai dit, utilises l'assistant et avances étape par étape.

En aparté, Count(*) suffit.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 17h45   #7
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 412
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 412
Points : 4 442
Points : 4 442
bonjour,

je pense qu'on a encore droit au fameux message:
Code :
"L'opération doit utiliser une requête qui peut être mise à jour"
Dans ce cas, on peut essayer en remplaçant le SELECT Count... par son équivalent en VBA avec Dcount...

Il y a quand même un truc qui me chiffonne:
Code sql :
1
2
3
SELECT COUNT(F.Notification_)
FROM F WHERE F.CodeGroup_ <> 'Z'
GROUP BY F.Notification_
Cette requête est susceptible de renvoyer plusieurs lignes (une par notification).
Dans ce cas là, lors de l'affectation à la colonne D.ILIDInProgress:
Code sql :
1
2
3
4
5
6
...SET D.ILIDInProgress = 
(
SELECT COUNT(F.Notification_)
FROM F WHERE F.CodeGroup_ <> 'Z'
GROUP BY F.Notification_
)
on aura immanquablement un message d'erreur, tu vois ?
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 18h07   #8
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonsoir Fabien,

Je pense qu'il y a un souci de clarté de ce que Teuzadur veut obtenir.
Première requête présentée :
Code sql :
1
2
3
4
5
6
7
8
.../...
SET D.ILIDInProgress = 
(
SELECT F.Notification_, COUNT(F.Notification_)
FROM F WHERE F.CodeGroup_ <> 'Z'
GROUP BY F.Notification_
)
.../...
==> Outre le fait que cette requête peut, également, renvoyer plusieurs enregistrements, comme Fabien l'a fort justement dit, Access est en droit de se demander : "que dois-je mettre dans D.ILIDInProgress ?... F.Notification_ ou COUNT(F.Notification_) ?"

Seconde requête présentée :
Code sql :
1
2
3
4
5
6
7
.../...
SET D.ILIDInProgress = 
(
SELECT COUNT(F.Notification_)
FROM F WHERE F.CodeGroup_ <> 'Z'
GROUP BY F.Notification_
)
==> OK, Access ne se demande plus quoi mettre dans D.ILIDInProgress, mais "de quel enregistrement retourné ?".

Il faudrait donc, en premier lieu, et de manière indépendante, résoudre le problème de la requête groupée et, ensuite, tenter de l'incorporer dans une autre requête. Pour cela, bien entendu, il faudrait comprendre le "cahier des charges" de cette fameuse requête.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h45.


 
 
 
 
Partenaires

Hébergement Web