IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Update et Select


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Points : 53
    Points
    53
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Experts SET ID_Experts = Round(Rnd()*DCount("ID_Experts","Experts"),0);
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Experts SET Experts.ID_Experts = returnID("SELECT ID_Experts FROM Experts WHERE Age>30");
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Points : 53
    Points
    53
    Par défaut
    Etes vous sur que la ligne Set rs = CurrentDb.OpenRecordset(pSql) est correct?

    Parce que ça me fait un message d'erreur

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Etes vous sur que la ligne Set rs = CurrentDb.OpenRecordset(pSql) est correct?
    Je teste toujours le code posté.
    Parce que ça me fait un message d'erreur
    et ce message est ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Points : 53
    Points
    53
    Par défaut
    En fait mon code est celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Points : 53
    Points
    53
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

Discussions similaires

  1. update et select en une seule fois
    Par laloupiote dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/06/2007, 15h58
  2. LIMIT dans UPDATE vs SELECT
    Par Yadutaf dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/04/2007, 20h36
  3. Update et select
    Par Arola78 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/09/2006, 14h07
  4. [Debutant] UPDATE et SELECT
    Par zooffy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/06/2006, 16h19
  5. [Oracle9i/ Pl/Sql] Update et select en même temps
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 7
    Dernier message: 31/05/2005, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo