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 :

Set d'un champ sous condition


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué

    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 162
    Points : 179
    Points
    179
    Par défaut Set d'un champ sous condition
    bonjour

    J'aimerais comprendre pourquoi cette requête ne marche pas, access m'indique que l'opération dois être une requête de mise à jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE importstd INNER JOIN R_Montant_Créance ON importstd.Compte = R_Montant_Créance.Compte SET importstd.Client_IJ = IIf([R_Montant_Créance].[SommeDeMontant_facture]>200,"0000952684","0000952686");
    merci

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Heu, le Iif n'est pas dérangeant mais y'a pas de WHERE dans votre requête ?

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Le pb doit venir de la jointure, les UPDATES et les jointures ne font apparement pas bon ménage.

    Tu pourrais remplacer ta jointure par une instrcution IN(SELECT ...) dans ta clause WHERE mais attention IN n'est pas optimisable, cela peut avoir des conséquences sur le temps d'exécution.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Re-salut marot_r

    Je peux pas tester chez moi mais je crois que = marche mieux que IN ?

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour les amis,

    Je vais tenter d'embrouiller tout ça un peu plus...

    Je sais qu'une requête UPDATE peut être basée sur une jointure.

    Mais je me demande si les soucis ne seraient pas causés par importstd ou R_Montant_Créance.
    S'agit-il de tables ou de requêtes ???

    En particulier R_Montant_Créance, ça "sonne" bien comme nom de requête, non !?

    Dans l'affirmative, je suggère à Coocky10 de vérifier le type de Recordset de la requête et de le forcer avec le type [Feuille rép.dyn.(MAJ globale)].
    _

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Citation Envoyé par Chtulus Voir le message
    Re-salut marot_r

    Je peux pas tester chez moi mais je crois que = marche mieux que IN ?


    Probalement, personnelement je fais mes UPDATEs par code VBA j'ai bien moins de mal de tête avec ça :-).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour tout le monde,

    Effectivement marot_r

    Bien vu aussi =JBO=

    Sinon la jointure ne devrait pas poser de soucis ça se fait !

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  8. #8
    Membre habitué

    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 162
    Points : 179
    Points
    179
    Par défaut
    Tout d'abord merci pour vos réponses.

    Après avoir vu la réponse de =JBO= j'ai fait un test, car effectivment R_Montant_Créance est une requête.

    J'ai donc mis le résultat de cette requête dans une table, puis relancer mon update en jointant sur cette nouvelle table, et là ça marche .

    Par contre en essayant à nouveau à partir de R_Montant_Créance J'ai beau mettre le type de Recordset à [Feuille rép.dyn.(MAJ globale)], ca ne change rien, j'ai essayer le type [instantanée] sans plus de résultat .

    Marot_t, en remplacant ma jointure par un IN(SELECT ...), j'ai le même problème.

    Il semblerais que ce soit l'instruction IIF qui pose problème mais uniquement quand je passe par une requête et non par une table.

    Alors effectivement soit je met tout dans une table et je lance ma requête d'update, soit je fait deux requêtes d'update séparés sans le IIf mais avec un where, mais j'aurais préféré tout faire en une seule fois .

    Si il y a d'autre idées je suis preneur.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Coocky10 Voir le message
    Par contre en essayant à nouveau à partir de R_Montant_Créance J'ai beau mettre le type de Recordset à [Feuille rép.dyn.(MAJ globale)], ca ne change rien, j'ai essayer le type [instantanée] sans plus de résultat .
    Le type de Recordset le plus "permissif" est [Feuille rép.dyn.(MAJ globale)].
    Quant au type de Recordset [Instantané], c'est comme une "photo" des données qui ne permet ni de les modifier, ni de répercuter une mise-à-jour en cas de modification réalisée par ailleurs.

    Citation Envoyé par Coocky10 Voir le message
    Il semblerais que ce soit l'instruction IIF qui pose problème mais uniquement quand je passe par une requête et non par une table.
    Non. Je ne pense pas que ce soit dû à la fonction Iif().
    Certains type de requête ne permettent pas la mise-à-jour du Recordset:
    par exemple les requêtes UNION, GROUP BY... Peut-être est-ce le cas de R_Montant_Créance ?

    Citation Envoyé par Coocky10 Voir le message
    soit je fait deux requêtes d'update séparés sans le IIf mais avec un where
    As-tu essayé un UPDATE sans Iif() avec jointure sur la requête R_Montant_Créance ?
    Est-ce que ça fonctionne ??? En fait, j'en doute...

    Citation Envoyé par Coocky10 Voir le message
    mais j'aurais préféré tout faire en une seule fois .

    Si il y a d'autre idées je suis preneur.
    Une solution (pas du tout optimisée) serait d'utiliser une fonction de domaine d'Access pour éviter la jointure, en l'occurrence DLookup().
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE importstd 
    SET importstd.Client_IJ = IIf(DLookup("SommeDeMontant_facture","R_Montant_Créance","Compte=" & importstd.Compte) > 200,"0000952684","0000952686");
    En faisant l'hypothèse que R_Montant_Créance.Compte est un champ numérique.
    _

  10. #10
    Membre habitué

    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 162
    Points : 179
    Points
    179
    Par défaut
    Merci =JBO= pour toutes ces informations.

    Citation Envoyé par JBO
    Certains type de requête ne permettent pas la mise-à-jour du Recordset:
    par exemple les requêtes UNION, GROUP BY... Peut-être est-ce le cas de R_Montant_Créance ?
    Effectivement c'est une requête de regroupement dont je me sert pour calculer un montant globale sur une référence.
    Toutefois je n'arrive pas bien à comprendre quelle mise-à-jour du Recordset Access veut faire sur cette requête... puisque c'est la table Importsd que je suis souhaite mettre à jour.

    Citation Envoyé par JBO
    As-tu essayé un UPDATE sans Iif() avec jointure sur la requête R_Montant_Créance ?
    Est-ce que ça fonctionne ??? En fait, j'en doute...
    Effectivement ca ne marche pas, par contre cette requête ci fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE importstd SET importstd.Client_IJ = "0000952684"
    WHERE (((importstd.Compte) In (select [R_Montant_Créance].[compte] 
    from [R_Montant_Créance] where [R_Montant_Créance].[SommeDeMontant_facture]>200)));
    Mais là je dois faire deux requêtes de ce type pour gérer l'autre cas.

    Quand au DLookup() ca ne marche pas à cause d'un echec de conversion de type, R_Montant_Créance.Compte n'est pas de type numérique, mais je ne comprend pas pourquoi cela à un impact...

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par Coocky10 Voir le message
    Effectivement c'est une requête de regroupement dont je me sert pour calculer un montant globale sur une référence.
    Toutefois je n'arrive pas bien à comprendre quelle mise-à-jour du Recordset Access veut faire sur cette requête... puisque c'est la table Importsd que je suis souhaite mettre à jour.
    Ce n'est pas le fait que tu modifie une table plus qu'une autre qui est analyse par ACCESS mais l'ensemble. Si une table ou requete dans ta syntaxe sql n'est pas modifiable, alors l'ensemble n'est pas modifiable.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par Coocky10 Voir le message
    Merci =JBO= pour toutes ces informations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE importstd SET importstd.Client_IJ = "0000952684"
    WHERE (((importstd.Compte) In (select [R_Montant_Créance].[compte] 
    from [R_Montant_Créance] where [R_Montant_Créance].[SommeDeMontant_facture]>200)));
    Mais là je dois faire deux requêtes de ce type pour gérer l'autre cas.
    Pas forcement car normalement, tu peux faire reference a la sous requete dans laquelle tu auras enleve la clause Where. Ou bien je me melange entre SQL Jet et SQL. Ca donnera quelquechose du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE importstd SET importstd.Client_IJ =IIf([R_Montant_Créance].[SommeDeMontant_facture]>200, "0000952684","j'ai plus la valeur en tete")
    WHERE importstd.Compte In (select [R_Montant_Créance].[compte] 
    from [R_Montant_Créance]);

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour à tous !

    Citation Envoyé par Coocky10 Voir le message
    Quand au DLookup() ca ne marche pas à cause d'un echec de conversion de type, R_Montant_Créance.Compte n'est pas de type numérique, mais je ne comprend pas pourquoi cela à un impact...
    @ Coocky10:
    Avec DLookup() tu utilises une fonction Access (et non pas SQL) et dans ce cas les types de données ne sont pas convertis à la volée automatiquement.

    Tu aurais pu profiter de ton message pour préciser ce "fameux" type de données.
    Si le type de R_Montant_Créance.Compte est une chaîne de caractères, alors il faut encadrer la valeur avec des guillemets, ce qui donnerait:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE importstd 
    SET importstd.Client_IJ = IIf(DLookup("SommeDeMontant_facture","R_Montant_Créance","Compte=""" & importstd.Compte & """") > 200,"0000952684","0000952686");

    @ belu33fr:
    Je suis étonné par ce que tu écris.
    Es-tu sûr de toi ?
    Citation Envoyé par belu33fr Voir le message
    Pas forcement car normalement, tu peux faire reference a la sous requete dans laquelle tu auras enleve la clause Where. Ou bien je me melange entre SQL Jet et SQL.
    Qu'une sous-requête puisse faire référence aux champs de la requête englobante, c'est d'accord.
    Mais l'inverse, j'en doute...
    A priori, seul le *résultat* de la sous-requête est utilisable par la requête englobante. Qu'en dis-tu ?
    _

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par =JBO= Voir le message
    Bonjour à tous !
    @ belu33fr:
    Je suis étonné par ce que tu écris.
    Es-tu sûr de toi ?

    Qu'une sous-requête puisse faire référence aux champs de la requête englobante, c'est d'accord.
    Mais l'inverse, j'en doute...
    A priori, seul le *résultat* de la sous-requête est utilisable par la requête englobante. Qu'en dis-tu ?
    _
    Comme indique dans mon post, je ne savais plus si en SQL JET (mdb) c'etait possible. Je viens de verifier, tu as raison. Mais en SQL normal, ca marche sans probleme car, en fait, le UPDATE Table1 ... WHERE C1 IN (SELECT C2 FROM Table2) est traduit par le moteur SQL par un FROM Table1 INNER JOIN (SELECT <Liste des colonnes utilisees dans la requete maitre> FROM Table2) Tmp ON Table1.C1=Tmp.C2 qui est plus efficace qu'un IN. Un update Jet ne permet pas d'utiliser la clause FROM alors que SQL oui.

    Comme cela fait un moment que je n'ai pas fait du SQL jet ... j'ai un peu oublie ses limitations et differences. De meme, si il est possible en MSJet de faire un update sur pluesieurs tables avec une requete modifiable directement ecrite derriere le UPDATE, en SQL, il n'est pas possible de le faire directement.

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    OK et merci belu33fr pour ces précisions utiles.
    Citation Envoyé par belu33fr Voir le message
    Mais en SQL normal, ca marche sans probleme car, en fait, le UPDATE Table1 ... WHERE C1 IN (SELECT C2 FROM Table2) est traduit par le moteur SQL par un FROM Table1 INNER JOIN (SELECT <Liste des colonnes utilisees dans la requete maitre> FROM Table2) Tmp ON Table1.C1=Tmp.C2 qui est plus efficace qu'un IN. Un update Jet ne permet pas d'utiliser la clause FROM alors que SQL oui.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Bonjour à tous !

    Je me permet d'intervenir car j'ai le même soucis... Je me prends la tête depuis ce matin sur une petite requête d'update à la c... !!
    Bref, pour ma part, dans ma sous-requête, j'effectue une somme sur un champs en fonction de plusieurs critères dont un champs de la reqête englobante, et ca ne marche pas j'ai le même message d'erreur que Coocky10...
    J'ai essayé plusieurs trucs entre des requêtes, des tables, mais rien ne marche...

    en gros ma requête (simplifiée) ressemble à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE1 AS T1 SET T1.Champ1 = (SELECT sum(T2.Champ1) FROM Requete1 R1, Table2 T2 WHERE T1.Champs3 = R1.Champs3 AND R1.Champs4 = T2.Champs4 GROUP BY R1.Champs3)
    WHERE T1.Champs5 = Constante
    J'ai essayé de remplacer la requete Requete1 par la vrai requête (toutes les tables...) j'ai essayé des IN, plusieurs niveaux d'imbrications, mais ca marchep po !

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2009
    Messages : 98
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par DodoDAix Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE1 AS T1 SET T1.Champ1 = (SELECT sum(T2.Champ1) FROM Requete1 R1, Table2 T2 WHERE T1.Champs3 = R1.Champs3 AND R1.Champs4 = T2.Champs4 GROUP BY R1.Champs3)
    WHERE T1.Champs5 = Constante
    En faisant une requete rq1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT sum(T2.Champ1) AS x FROM Requete1 R1, Table2 T2 WHERE T1.Champs3 = R1.Champs3 AND R1.Champs4 = T2.Champs4 GROUP BY R1.Champs3
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE1 AS T1 SET T1.Champ1 = dlookup("X","rq1","")
    WHERE T1.Champs5 = Constante
    t'aiderait-il?

Discussions similaires

  1. valeur d'un champs sous condition
    Par albatros50 dans le forum IHM
    Réponses: 3
    Dernier message: 10/05/2007, 08h42
  2. Remplir automatiquement un champ sous condition.
    Par popoliline dans le forum Access
    Réponses: 15
    Dernier message: 15/09/2006, 23h04
  3. [PHP-JS] accessibilité d'un champ sous condition
    Par maraly dans le forum Langage
    Réponses: 1
    Dernier message: 08/08/2006, 16h31
  4. Somme de champs sous condition
    Par Nicola dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/08/2006, 14h47
  5. Afficher un champ sous condition
    Par Cantalou dans le forum Access
    Réponses: 24
    Dernier message: 01/02/2006, 14h25

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