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 :

Expression trop complexe


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Par défaut Expression trop complexe
    Bonjour,

    J'ai un souci avec une requête ACCESS qui m'affiche le message d'erreur "EXPRESSION TROP COMPLEXE". Je sais qu'il me met cette erreur parce que mes expressions contiennent trop de IIF (VraiFaux) mais j'ai pas trouvé d'autres solutions que de faire comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    SELECT Compte_Note.no_etude, Compte_Note.no_produit, Compte_Note.question, Compte_Note.note, NOTE_REPARTIES.note_r, 
    IIf([note_r]=1 And [note]=1 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5),
    IIf([note_r]=2 And [note]=1 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5),
    IIf([note_r]=3 And [note]=1 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.02)/(1/5),
    IIf([note_r]=3 And [note]=2 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.07)/(1/5),
    IIf([note_r]=4 And [note]=2 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5),
    IIf([note_r]=5 And [note]=2 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.04)/(1/5),
    IIf([note_r]=5 And [note]=3 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.05)/(1/5),
    IIf([note_r]=6 And [note]=3 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5),
    IIf([note_r]=7 And [note]=3 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.06)/(1/5),
    IIf([note_r]=7 And [note]=4 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.03)/(1/5),
    IIf([note_r]=8 And [note]=4 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5),
    IIf([note_r]=9 And [note]=4 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.08)/(1/5),
    IIf([note_r]=9 And [note]=5 And [modalite_max]=5,([Compte_Note.CompteDenote]*0.02)/(1/5),
    IIf([note_r]=10 And [note]=5 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5),
    IIf([note_r]=11 And [note]=5 And [modalite_max]=5,([Compte_Note.CompteDenote]*(1/11))/(1/5)))))))))))))))) AS EFF5,
    IIf([note_r]=1 And [note]=1 And [modalite_max]=7,([Compte_Note.CompteDenote]*(1/11))/(1/7),
    IIf([note_r]=2 And [note]=1 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.0519)/(1/7),
    IIf([note_r]=2 And [note]=1 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.039)/(1/7),
    IIf([note_r]=3 And [note]=2 And [modalite_max]=7,([Compte_Note.CompteDenote]*(1/11))/(1/7),  
    IIf([note_r]=4 And [note]=2 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.013)/(1/7),
    IIf([note_r]=4 And [note]=3 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.0779)/(1/7),
    IIf([note_r]=5 And [note]=3 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.0649)/(1/7),
    IIf([note_r]=5 And [note]=4 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.026)/(1/7), 
    IIf([note_r]=6 And [note]=4 And [modalite_max]=7,([Compte_Note.CompteDenote]*(1/11))/(1/7),
    IIf([note_r]=7 And [note]=4 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.026)/(1/7),
    IIf([note_r]=7 And [note]=5 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.0649)/(1/7),
    IIf([note_r]=8 And [note]=5 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.0779)/(1/7),
    IIf([note_r]=8 And [note]=6 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.013)/(1/7),
    IIf([note_r]=9 And [note]=6 And [modalite_max]=7,([Compte_Note.CompteDenote]*(1/11))/(1/7), 
    IIf([note_r]=10 And [note]=6 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.039)/(1/7),
    IIf([note_r]=10 And [note]=7 And [modalite_max]=7,([Compte_Note.CompteDenote]*0.0519)/(1/7),
    IIf([note_r]=11 And [note]=7 And [modalite_max]=7,([Compte_Note.CompteDenote]*(1/11))/(1/7)))))))))))))))))) AS EFF7,
    IIf([note_r]=1 And IIf([note]=1 And [modalite_max]=9,([Compte_Note.CompteDenote]*(1/11))/(1/9),
    IIf([note_r]=2 And IIf([note]=1 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0202)/(1/9),
    IIf([note_r]=2 And IIf([note]=2 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0707)/(1/9), 
    IIf([note_r]=3 And IIf([note]=2 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0404)/(1/9), 
    IIf([note_r]=3 And IIf([note]=3 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0505)/(1/9), 
    IIf([note_r]=4 And IIf([note]=3 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0606)/(1/9), 
    IIf([note_r]=4 And IIf([note]=4 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0303)/(1/9), 
    IIf([note_r]=5 And IIf([note]=4 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0808)/(1/9),
    IIf([note_r]=5 And IIf([note]=5 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0101)/(1/9),
    IIf([note_r]=6 And IIf([note]=5 And [modalite_max]=9,([Compte_Note.CompteDenote]*(1/11))/(1/9), 
    IIf([note_r]=7 And IIf([note]=5 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0101)/(1/9), 
    IIf([note_r]=7 And IIf([note]=6 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0808)/(1/9), 
    IIf([note_r]=8 And IIf([note]=6 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0303)/(1/9), 
    IIf([note_r]=8 And IIf([note]=7 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0606)/(1/9), 
    IIf([note_r]=9 And IIf([note]=7 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0505)/(1/9), 
    IIf([note_r]=9 And IIf([note]=8 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0404)/(1/9), 
    IIf([note_r]=10 And IIf([note]=8 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0707)/(1/9), 
    IIf([note_r]=10 And IIf([note]=9 And [modalite_max]=9,([Compte_Note.CompteDenote]*0.0202)/(1/9), 
    IIf([note_r]=11 And IIf([note]=9 And [modalite_max]=9,([Compte_Note.CompteDenote]*(1/11))/(1/9)))))))))))))))))))) AS EFF9
    FROM NOTE_REPARTIES, Compte_Note;
    Il y aurait-il quand même un moyen d'appliquer cette requête ou une façon plus simplifiée de l'écrire ???

    Merci de vos réponses...

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    en fait la valeur dépend de trois paramètres
    note-r
    note
    modalité-max

    il suffit de créer une table annexe avec les combinaisons
    et le paramètre à renvoyer

    ce sera plus souple, plus robuste, plus modulable, plus agréable à lire et plus mieux

    dés lors tu feras une jonction dans ta requête et tu n'auras plus de pb

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Par défaut Re
    Merci de votre réponse, mais j'ai bien peur de ne pas avoir trés bien compris ce que je dois faire ???

    Pourriez-vous détaillé un peu plus svp ?

    Merci...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 74
    Par défaut
    Tu pourrais déjà vachement simplifier ta requête en utilisant directement la valeur des critères dans la requête :

    Plutôt que d'écrire
    IIf([note_r]=11 AND IIf([note]=9 AND [modalite_max]=9,([Compte_Note.CompteDenote]*(1/11))/(1/9)

    et que le dernier (1/9) dépend directement de la valeur de [note]
    tu pourrais écrire
    IIf([note_r]=11 AND [modalite_max]=9,([Compte_Note.CompteDenote]*(1/11))/(1/[note])

    ça te feras déjà gagner une grande partie des cas.

    Tu pourrais également faire cela avec la valeur des autres critères , par exemple remplacer le (1/11) par 1/[note_r] et decette manière tu réduis encore un bon nombre de cas puisque la formule semble être la même dans tous les cas.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 74
    Par défaut
    Petit supplément à ma réponse, en fait l'idée de base est de déterminer la formule de calcul en fonction des différents paramètres plutôt que de scrutter les différentes valeurs.

    Par exemple si je veux trouver le résultat d'une table de multiplication de A x B , tu peux écrire les chose de deux manières :
    La première qui ressemble à ta solution de départ :

    Si A = 1 et B = 1 alors Produit = 1 * 1
    Sinon si A = 1 et B = 2 alors Produit = 1 * 2
    sinon si A = 1 et B = 3 alors Produit = 1 * 3
    etc....

    La meilleure solution qui résoud tous les cas est bien sûr celle-ci :

    Produit = A * B

    Je pense que c'est dans cette direction là que tu dois aller pour résoudre ton problème.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Par défaut Re
    Merci de vos réponses, malheureusement je ne pense pas que vous ayez bien compris ma requête...

    Celle-ci permet de faire un calcul en fonction de plusieurs critéres :
    - si la note vaut 1
    ET
    - si la note_r vaut 1
    ET
    - si la modalité_max est à 5
    alors j'applique telle formule...
    MAIS
    - si la note vaut 2
    alors j'applique une autre formule !!!

  7. #7
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Citation Envoyé par random
    il suffit de créer une table annexe avec les combinaisons
    et le paramètre à renvoyer
    L'idée de random est sans doute une bonne solution.
    Pour cela tu crées une table, appelons-là tblCalcEff5
    comportant les données de tes formules
    Citation Envoyé par CONTENU DE TA TABLE
    Note_R;Note;modalite_max;A;B
    1;1;5;0.090909090909090909090909090909091;5
    2;1;5;0.090909090909090909090909090909091;5
    3;1;5;0.02;5
    3;2;5;0.07;5
    4;2;5;0.090909090909090909090909090909091;5
    5;2;5;0.04;5
    5;3;5;0.05;5
    6;3;5;0.090909090909090909090909090909091;5
    7;3;5;0.06;5
    7;4;5;0.03;5
    8;4;5;0.090909090909090909090909090909091;5
    9;4;5;0.08;5
    9;5;5;0.02;5
    10;5;5;0.090909090909090909090909090909091;5
    11;5;5;0.090909090909090909090909090909091;5

    ....
    où A et B sont les deux coefficient de ta formule.


    Dans ta requête tu peux alors faire une relation avec cette table (en reliant les champs Note_r Note, et modalite_max) et exprimer ton expression plus simplement:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [Compte_Note.CompteDenote]*tblCalcEff5.A*tblCalcEff5.B as EFF5 FROM Compte_Note LEFT JOIN tblCalcEff5 ON Compte_Note.Note_R= tblCalcEff5.Note_R AND...

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Par défaut [resolu] - Grand Merci
    Bonjour,

    J'ai testé la dernière solution et ça fonctionne... C'est vraiment beaucoup plus simple !

    MERCI de vos réponses en tous les cas...

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 33
    Dernier message: 16/01/2009, 14h02
  2. Expression trop complexe IIf
    Par zouhenlai dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/04/2008, 10h09
  3. Expression trop complexe ?
    Par Herman dans le forum Access
    Réponses: 2
    Dernier message: 05/04/2007, 16h07
  4. Erreur sur OpenReport : Expression trop complexe
    Par Mariboo dans le forum Access
    Réponses: 6
    Dernier message: 22/06/2006, 11h52
  5. [VBA-E] Erreur 16 expression trop complexe
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/04/2006, 11h44

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