Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Discussion: Update et Select

  1. #1
    Membre à l'essai
    Inscrit en
    décembre 2009
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 193
    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.

  2. #2
    Membre Expert Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    671
    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 : 671
    Points : 1 193
    Points
    1 193

    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 :
    UPDATE Experts SET ID_Experts = Round(Rnd()*DCount("ID_Experts","Experts"),0);

  3. #3
    Membre à l'essai
    Inscrit en
    décembre 2009
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 193
    Points : 21
    Points
    21

    Par défaut

    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...

  4. #4
    Membre Expert Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    671
    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 : 671
    Points : 1 193
    Points
    1 193

    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 :
    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");

  5. #5
    Membre à l'essai
    Inscrit en
    décembre 2009
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 193
    Points : 21
    Points
    21

    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
    Membre Expert Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    671
    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 : 671
    Points : 1 193
    Points
    1 193

    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 ?

  7. #7
    Membre à l'essai
    Inscrit en
    décembre 2009
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 193
    Points : 21
    Points
    21

    Par défaut

    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.

  8. #8
    Membre Expert Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    671
    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 : 671
    Points : 1 193
    Points
    1 193

    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 :
    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.

  9. #9
    Membre à l'essai
    Inscrit en
    décembre 2009
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 193
    Points : 21
    Points
    21

    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 :
    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
    Membre Expert Avatar de tee_grandbois
    Homme Profil pro
    Ingénieur-Consultant
    Inscrit en
    novembre 2004
    Messages
    671
    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 : 671
    Points : 1 193
    Points
    1 193

    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 :
    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...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •