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 18/01/2011, 17h06   #1
Candidat au titre de Membre du Club
 
Benoit
Inscription : janvier 2006
Messages : 36
Détails du profil
Informations personnelles :
Nom : Benoit

Informations forums :
Inscription : janvier 2006
Messages : 36
Points : 11
Points : 11
Par défaut UPDATE et sous-requête

Bonjour,

Je patine sur un problème de sous-requête dans un UPDATE..., avec le classique message "l'opération doit utiliser une requête qui peut être mise à jour"

J'ai une BDD avec une table "T_Clients" :
> IdClient (clé primaire)
> Nom
> Prénom
> etc...


J'aurai à terme d'autres tables, par exemple de commandes de chaque client, ou n'importe quoi, liées à la table T_Clients sur cet "IdClient".

J'ai une table "T_ClientActif", dans laquelle je note l'IdClient du client dont je veux afficher les détails, modifier ou saisir des infos, etc. Toutes mes requêtes s'appuieront sur cet IdClientActif.
> IdClientActif

Cette table T_ClientActif ne contient qu'un enregistrement, dont je modifie la valeur pour correspondre à l'IdClient qui m'intéresse.

Quand je rajoute un nouveau client, j'aimerai pouvoir d'une requête modifier mon IdClientActif avec l'IdClient du nouveau

Je sais récupérer le dernier IdClient de T_Clients (requête R_IdDernierClient)
Code :
SELECT Max(T_Client.IdClient) AS DernierClient FROM T_Client;
Je sais fixer une valeur donnée à IdClientActif (requête R_DefClientActif)
Code :
UPDATE T_ClientActif SET T_ClientActif.IdClientActif = 1;
Mais quand j'essaie d'imbriquer les 2, ça ne marche pas...
Code :
UPDATE T_ClientActif SET T_ClientActif.IdClientActif = (SELECT Max(T_Client.IdClient) AS DernierClient FROM T_Client);
J'ai cherché la réponse, notamment dans cette discussion.
Je crois comprendre qu'il faudrait que je fasse une jointure, mais sur quoi ???

Help...

Benoit
BMATH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 18h04   #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 BMATH,

La démarche me paraît étrange, mais bon...

Pour répondre à ta question, effectivement, Access a besoin de lier T_ClientActif à T_Client. Le problème est, si j'ai bien compris, que la table T_ClientActif ne contient qu'un seul champ IdClientActif.

Le seul moyen que je vois, c'est de créer un champ "liaison" dans T_ClientActif qui aura, toujours, la valeur "1" (par exemple). Ensuite, créer un champ "liaison" dans T_Client qui, lui aussi, aura, toujours, la valeur "1", pour tous les clients.

==> la liaison devrait pouvoir s'effectuer via ce champ spécifique (qui ne servirait qu'à cela).

A tester... dans l'étrange...
__________________
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/01/2011, 18h46   #3
Candidat au titre de Membre du Club
 
Benoit
Inscription : janvier 2006
Messages : 36
Détails du profil
Informations personnelles :
Nom : Benoit

Informations forums :
Inscription : janvier 2006
Messages : 36
Points : 11
Points : 11
Merci pour ta réponse, Richard.

Je ne vois pas quelle syntaxe adopter pour faire la liaison, puisque ma requête SELECT est du type MAX() : je ne peux choisir qu'un argument (IdClient), et donc pas intégrer le champ Liaison dans ma requête...

Alors pour continuer à faire dans l'étrange, j'ai toujours la solution de supprimer l'enregistrement pré-existant dans ma table T_ClientActif, et d'en créer un nouveau avec la bonne valeur...

Mais je dois être un gars étrange, car je ne vois pas le caractère étrange de ma démarche, ou du moins, je ne vois pas comment faire autrement ? (en programmateur du dimanche que je suis !!)
BMATH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 19h33   #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
Eh bien, tu vois, ta solution
Citation:
... de supprimer l'enregistrement pré-existant dans ma table T_ClientActif, et d'en créer un nouveau avec la bonne valeur...
est beaucoup plus judicieuse que le mienne, je trouve.



Pour répondre à
Citation:
Mais je dois être un gars étrange, car je ne vois pas le caractère étrange de ma démarche, ou du moins, je ne vois pas comment faire autrement ? (en programmateur du dimanche que je suis !!)
il faudrait que tu dises pourquoi, dans ton application, tu as besoin d'une table qui contient le dernier client ajouté.
__________________
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/01/2011, 19h47   #5
Candidat au titre de Membre du Club
 
Benoit
Inscription : janvier 2006
Messages : 36
Détails du profil
Informations personnelles :
Nom : Benoit

Informations forums :
Inscription : janvier 2006
Messages : 36
Points : 11
Points : 11
Citation:
Envoyé par Richard_35 Voir le message
Pour répondre à il faudrait que tu dises pourquoi, dans ton application, tu as besoin d'une table qui contient le dernier client ajouté.
Simplement pour pouvoir, dans la foulée de l'ajout d'un nouveau client, lui affecter par exemple une commande, ou autres actions propres à ce client.

Autrement dit, pour que d'un clic en validant ce nouveau client, je n'ai pas besoin ensuite d'aller "le chercher" dans la BDD, mais que ça se fasse tout seul.

(pas sûr d'avoir été bien clair, pour le coup ^^)

En tout cas, merci pour ton aide !
BMATH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h30   #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
Bonjour BMATH,

Si j'ai bien compris, donc, tu souhaites effectuer les opérations suivantes :
  1. Création d'un client dans T_Clients ;
  2. => Stockage de max(Id) de T_Clients dans T_ClientActif ;
  3. ==> Affecter, par exemple, d'une commande à l'Id de T_ClientActif.

Si j'ai bien compris (encore une fois), pourquoi ne pas effectuer les opérations suivantes :
  1. Création d'un client dans T_Clients ;
  2. => Affecter, par exemple, le de max(Id) de T_Clients dans une commande (donc, sans passer par T_ClientActif).
__________________
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 20/01/2011, 22h35   #7
Candidat au titre de Membre du Club
 
Benoit
Inscription : janvier 2006
Messages : 36
Détails du profil
Informations personnelles :
Nom : Benoit

Informations forums :
Inscription : janvier 2006
Messages : 36
Points : 11
Points : 11
En fait, quand j'active un client, je ne fais pas que lui attribuer une commande, mais j'affiche tout son dossier qui fait intervenir plusieurs tables, pour pouvoir modifier différentes infos dans les unes et les autres.
Et puis j'utilise les mêmes requêtes et formulaires quand je choisis un autre dossier client.
D'où l'intérêt de stocker quelque part l'ID du client "actif", qui peut être soit celui que je viens de rentrer, soit celui d'un autre client, en fonction des besoins.

En tout cas merci de t'être penché sur mon problème

BM
BMATH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 11h56   #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
Bonjour BMATH,

La solution
Citation:
... de supprimer l'enregistrement pré-existant dans ma table T_ClientActif, et d'en créer un nouveau avec la bonne valeur...
devrait donc répondre parfaitement à ton besoin.
__________________
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é Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h49.


 
 
 
 
Partenaires

Hébergement Web