Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 08/02/2013, 14h26   #1
bsangoku
Membre à l'essai
 
Inscription : décembre 2009
Messages : 191
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 191
Points : 21
Points : 21
Par défaut Update et Select

Bonjour,

Est il possible de combiner Update et Select dans une même requête?

Je ne vois pas pourquoi ce code ne marche pas

Code :
1
2
3
Update Experts SET ID_Experts=  (SELECT  Round(RND()*Compte,0)
FROM(SELECT COUNT(ID_Experts) AS Compte
FROM Experts) )

Merci d'avance.
bsangoku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2013, 23h56   #2
tee_grandbois
Membre Expert
 
Avatar de tee_grandbois
 
Homme
Ingénieur-Consultant
Inscription : novembre 2004
Messages : 667
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Ingénieur-Consultant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 667
Points : 1 188
Points : 1 188
Bonsoir,
Citation:
Je ne vois pas pourquoi ce code ne marche pas
parce que, bien que cela puisse paraître bizarre, un SELECT pour mettre un champ à jour, ce n'est pas une syntaxe correcte dans le SQL d'Access, d'autant plus si il y a un regroupement (un COUNT en l'occurrence). A la place, il faut utiliser les fonctions de domaine :
Code :
UPDATE Experts SET ID_Experts = Round(Rnd()*DCount("ID_Experts","Experts"),0);
tee_grandbois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 22h26   #3
bsangoku
Membre à l'essai
 
Inscription : décembre 2009
Messages : 191
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 191
Points : 21
Points : 21
Bonjour,

Je souhaite vous posez une question comment faire si j'ai

Code :
1
2
Update Experts SET ID_Experts=  (SELECT  ID_Expert
FROM Experts WHERE Age>30) )
Comment faire mon update?

La vérité c'est que je n'ai pas compris pourquoi je n'ai pas le droit de le faire...
bsangoku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 00h33   #4
tee_grandbois
Membre Expert
 
Avatar de tee_grandbois
 
Homme
Ingénieur-Consultant
Inscription : novembre 2004
Messages : 667
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Ingénieur-Consultant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 667
Points : 1 188
Points : 1 188
Bonsoir,
Citation:
La vérité c'est que je n'ai pas compris pourquoi je n'ai pas le droit de le faire...
comme je te l'expliquai dans le premier post, bien qu'elle soit dans la norme SQL, cette syntaxe n'est pas malheureusement pas utilisable dans le SQL Access. Il faut utiliser les fonctions de domaine :
Code :
Update Experts SET ID_Experts=  (dlookup(" ID_Experts","Experts","Age>30") );
ou tu crées une fonction qui retourne la valeur de ton SELECT
1) dans un module :
Code :
1
2
3
4
5
6
7
8
9
10
11
Function returnID(pSql As String) As Variant
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(pSql)
    ' Le recordset ne devrait retourner qu'un seul enregistrement sous peine de problème
    If rs.RecordCount = 1 Then
        returnID = rs(0)
    Else
        returnID = Null
    End If
    Set rs = Nothing
End Function
2) dans SQL tu l'utilises comme ceci :
Code :
UPDATE Experts SET Experts.ID_Experts = returnID("SELECT ID_Experts FROM Experts WHERE Age>30");
tee_grandbois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 13h20   #5
bsangoku
Membre à l'essai
 
Inscription : décembre 2009
Messages : 191
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 191
Points : 21
Points : 21
Etes vous sur que la ligne Set rs = CurrentDb.OpenRecordset(pSql) est correct?

Parce que ça me fait un message d'erreur
bsangoku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 22h37   #6
tee_grandbois
Membre Expert
 
Avatar de tee_grandbois
 
Homme
Ingénieur-Consultant
Inscription : novembre 2004
Messages : 667
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Ingénieur-Consultant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 667
Points : 1 188
Points : 1 188
Citation:
Etes vous sur que la ligne Set rs = CurrentDb.OpenRecordset(pSql) est correct?
Je teste toujours le code posté.
Citation:
Parce que ça me fait un message d'erreur
et ce message est ?
tee_grandbois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2013, 18h24   #7
bsangoku
Membre à l'essai
 
Inscription : décembre 2009
Messages : 191
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 191
Points : 21
Points : 21
En fait mon code est celui-ci

Code :
1
2
3
4
UPDATE Choix_Expert SET ID_Expert = returnID("SELECT  ID_Expert
FROM (SELECT ID_Expert ,  DateDiff('yyyy',Date_de_Naissance,Now()) AS Age
FROM Experts )
WHERE Age>=25");
Je n'ai plus de message d'erreur. Mon code dans le returnID marche bien et me retourne 2 ID, par contre c'est que ça ne fait pas de mise à jour.
bsangoku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 14h56   #8
tee_grandbois
Membre Expert
 
Avatar de tee_grandbois
 
Homme
Ingénieur-Consultant
Inscription : novembre 2004
Messages : 667
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Ingénieur-Consultant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 667
Points : 1 188
Points : 1 188
Bonjour,
Citation:
Mon code dans le returnID marche bien et me retourne 2 ID, par contre c'est que ça ne fait pas de mise à jour.
change le code suivant :
Code :
1
2
3
    ' Le recordset ne devrait retourner qu'un seul enregistrement sous peine de problème
    If rs.RecordCount = 1 Then
        returnID = rs(0)
par
Code :
1
2
    If rs.RecordCount <> 0  Then
        returnID = rs(0)
Cela te renverra la première valeur du recordset.
Mais la mise à jour risque d'être aléatoire puisque, dans ce cas, le code te retournant plus d'une valeur, laquelle est la bonne ?

Autre chose : je ne comprend pas le but de cette mise à jour mais il est vrai que tu ne nous as pas expliqué le contexte.
tee_grandbois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 16h11   #9
bsangoku
Membre à l'essai
 
Inscription : décembre 2009
Messages : 191
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 191
Points : 21
Points : 21
Bonjour,

Ca ne marche toujours pas. En fait, c'est que j'ai deux tables

Experts(ID_Experts,Nom,Prénom,Date_de_Naissance)
Choix_Expert(ID_Expert,Choix)

En fait, c'est que l'expert a le droit à partir de 25 ans de choisir s'il souhaite avoir une retraite en capital différé ou une retraite en rente. (ne me demandez pas pourquoi, on est dans un scénario fictif)

C'est pourquoi je souhaite mettre à jour dans Choix_Expert les ID_Expert de plus de 30 ans automatiquement.
D'où mon code :

Code :
1
2
3
4
UPDATE Choix_Expert SET ID_Expert = returnID("SELECT  ID_Expert
FROM (SELECT ID_Expert ,  DateDiff('yyyy',Date_de_Naissance,Now()) AS Age
FROM Experts )
WHERE Age>=25");
Mais bon ça ne marche pas. En fait le code VBA marche (sous visual basic, ça m'affiche le bon ID, par contre c'est le UPDATE qui ne marche pas)
bsangoku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 19h36   #10
tee_grandbois
Membre Expert
 
Avatar de tee_grandbois
 
Homme
Ingénieur-Consultant
Inscription : novembre 2004
Messages : 667
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Ingénieur-Consultant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 667
Points : 1 188
Points : 1 188
Bonsoir,
la table Choix_Expert contient-elle tous les Id_Expert de la table Experts, et comment est mis à jour le choix ?
Je me trompe peut-être mais ne serait-il pas plus facile de mettre à jour le choix plutôt que l'ID dans la table Choix_Expert ?
Code :
UPDATE Choix_Expert SET Choix = leBonchoix WHERE ID_Expert IN (SELECT id_expert FROM Experts WHERE DateDiff("yyyy",Date_de_Naissance,Now())>=25);
Tout dépendra des réponses que tu donneras...
tee_grandbois est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h40.


 
 
 
 
Partenaires

Hébergement Web