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 :

Problème d'exécution entre requète et module pour une fonction quartile [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Problème d'exécution entre requète et module pour une fonction quartile
    Bonjour à vous,

    Petite présentation puisque c'est mon premier message, je suis néophyte sur Access; je vais également devoir touché à Ruby. Je bosse à Artprice comme chargé d'économétrie,et vais devoir être autonome sur l'exploitation des b2d. Donc je risque de trainer dans le coin dorénavant si vous voulez bien de moi.

    Première mission, première difficulté:

    Je dois créer une fonction quartile afin d'automatiser leeur calcul notamment la médiane des prix pour un artiste.
    J'ai pour variable mt_adjuge_FF pour les prix, ma table est Adecoeuv.
    Voici la fonction que j'ai intégré dans un module :


    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
    Public Function XPercentile(FName As String, _
    TName As String, _
    X As Double) _
    As Double
    ' FName = Nom du champ
    ' TName = Nom de la table
    ' x = percentile décimal (0.68 for 68%)
     
    ' Retourne la valeur minimale pour laquelle
    ' x% des valeurs y sont inférieures ou égales
     
    XPercentile = DMin(FName, TName, _
    "DCount(""*"", """ & TName & """, """ & FName & _
    "<="" & [" & FName & " ]) >= " & _
    X * DCount("*", TName))
    End Function
    Voici la requête pour appeler la fonction :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Adecoeuv.mt_adjuge_FF, XPercentile("[mt_adjuge_FF ]","Adecoeuv", 0.5) AS 50Percentile
    FROM Adecoeuv
    GROUP BY Adecoeuv.mt_adjuge_FF;
    ***

    J'ai le message d'erreur suivant :

    Erreur de syntaxe (virgule) dans l'expression 'DCount("*", "Adecoeuv","[mt_adjuge_FF<])>=3337089,5'.

    J'ai un doute sur ce problème de virgule. Yen a t-il parmi vous pour qui une erreur saute aux yeux ?
    D'avance merci.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    je ne vous conseille pas d'utiliser cette fonction (au demeurant très répandue sur le web car écrite par un mvp ) car elle ne retourne pas toujours la bonne valeur.

    Par exemple, pour la série de valeurs suivantes la médiane trouvée est 3 alors que la vraie valeur est 5,5...
    Concernant l'appel de la fonction dans ta requête, il faut mettre des ";" à la place des "," pour séparer les arguments de la fonction xpercentile.

    De plus, je pense que ce sera très long car la requete va calculer la médiane pour chaque ligne de la table et les fonctions de domaine sont particulièrement lentes...

    Philippe

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci Philippe !
    Sympa pour le conseils. Bon, je vais la tester avec ";" .
    J'ai vu une autre fonction sur un autre forum, je la posterai lundi pour comparaison, et si le coeur vous en dit de revenir par ici !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bon, je n'arrive pas à faire tourner la fonction, malgré les points virgules insérés pour séparer les paramètres ...
    Au vu du constat sur les défauts de l'algo, je n'insiste pas.

    Voici la seconde fonction dont je parlais :

    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
    Function Median(tName$, fldName$) As Single
          Dim MedianDB As Database
          Dim ssMedian As Recordset
          Dim RCount%, i%, x%, y%, OffSet%
          Set MedianDB = CurrentDb()
          Set ssMedian = MedianDB.Openrecordset("SELECT [" & fldName$ & _
                    "] FROM [" & tName$ & "] WHERE [" & fldName$ & "] IS _
                    NOT NULL ORDER BY [" & fldName$  & "];")
          'NOTE: To include nulls when calculating the median value, omit
          'WHERE [" & fldName$ & "] IS NOT NULL from the example.
    ssMedian.MoveLast
          RCount% = ssMedian.RecordCount
          x% = RCount% Mod 2
          If x% <> 0 Then
             OffSet% = ((RCount% + 1) / 2) - 2
             For i% = 0 To OffSet%
                ssMedian.MovePrevious
             Next i
             Median = ssMedian(fldName$)
          Else
             OffSet% = (RCount% / 2) - 2
             For i% = 0 To OffSet%
                ssMedian.MovePrevious
             Next i
             x% = ssMedian(fldName$)
             ssMedian.MovePrevious
             y% = ssMedian(fldName$)
             Median = (x% + y%) / 2
          End If
          ssMedian.Close
          MedianDB.Close
        End Function
    Elle m'arrange d'autant plus qu'elle supprime les valeurs nulles.
    En revanche, je n'arrive pas à l'appeler correctement ... Les "$" me pertubent, entre autres. Moi, j'aurai mis ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Median(["Adecoeuv"]; ["mt_adjuge_FF"]) As Single
    FROM Adecoeuv
    WHERE (((Adecoeuv.cd_arti)=22796))
    GROUP BY Adecoeuv.mt_adjuge_FF;

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    Les "$" me pertubent, entre autres
    les $ et % permettent de typer les variables. Ces caractères de déclaration de type indiquent que la variable avec un % est de type integer, et celle avec $ indique type string.

    Bien que ce type de déclaration soit encore parfois utile, je te propose d'abandonner ce code de vétéran et de plutôt utiliser la fonction proposer par Tofalu dans la faq.

    pour la requête, en écartant les valeurs null et pour ne retourner qu'une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT fMediane("Adecoeuv", "mt_adjuge_FF") AS Mediane
    FROM Adecoeuv
    WHERE ((mt_adjuge_FF IS NOT NULL) AND (cd_arti=22796))
    GROUP BY fMediane("Adecoeuv", "mt_adjuge_FF");
    Philippe

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    re bonjour,

    Désolé, j'ai fais une petite erreur et Tofalu aussi...

    mon erreur : il faut modifier légèrement la requête de la fonction de tofalu pour qu'elle ne tienne pas compte des valeurs nulles :
    Remplacer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " ORDER BY " & strField)
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set oRST = oDBS.OpenRecordset("SELECT * FROM " & strTable & " WHERE " & strField & " IS NOT NULL ORDER BY " & strField)
    De plus, une erreur s'est glissé dans sa fonction. En effet, il ne faut pas faire un .MoveNext mais un .MovePrevious.
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    If blnEven Then 
    oRST.MoveNext 
    ...
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If blnEven Then
             oRST.MovePrevious
    Et la requête devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT fMediane("Adecoeuv", "mt_adjuge_FF") AS Mediane FROM Adecoeuv WHERE (cd_arti=22796) GROUP BY fMediane("Adecoeuv", "mt_adjuge_FF");
    J'espère que cette fois-ci c'est ok...

    PS: Il faudrait qu'un modérateur valide ma remarque concernant la fonction de Tofalu pour ainsi corriger la faq. par avance merci.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Un grand merci !

    Je vais tester tout ca cette aprem' pour vous confirmer les modif'.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Dernière question technique :

    J'ai mis le prog de la fonction dans le module, laquelle est sauvegardée.
    J'ai mis le code pour appeler la fonction dans ma requête.
    Il ne semble pas y avoir de fautes, et pourtant, je reçois le message:

    Fonction fMediane non définie dans l'expression.

    Faut-il une macro pour lier les deux ?
    Y a t-il une référence appelé dans le prog' qui n'est pas activée ( la DAO 3.6 Object Library est référencée ) ...

    En attendant, je suis passé par excel, mais quelle barbe ... j'aimerai tant avoir cette petite fonction.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    j'ai mis une base exemple (format Access 2003) pour que ça soit plus simple.

    Philippe
    Fichiers attachés Fichiers attachés

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci pour l'attention, c'est super sympa.
    Grace à cela, j'ai pu voir ce qui m'affichait "expression non définie", j'avais mis le même nom à mon module qu'à la fonction, ce qui faisait bugger mon affaire ...

    En revanche, je ne trouve pas les mêmes résultats (fiables cela). Je suis bien en dessous des valeurs attendues.
    De même, quand je rajoute une condition where dans ma requête, j'obtiens toujours le même résultat. Je me penche dessus plus tard. Faut-il mettre la condition de la requête dans le group by comme vous l'avez fait pour cd_artist ?

    Etes vous certains que les valeurs nulles ne sont pas pris avec cet algo ?

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    bonjour,

    pour filtrer les enregistrements j'ai modifié la fonction de tofalu. En utilisant la fonction fMediane de ma base exemple, on peut contruire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT fMediane("Adecoeuv","mt_adjuge_FF","cd_arti=22796") AS Mediane
    FROM Adecoeuv
    WHERE (((Adecoeuv.cd_arti)=22796))
    GROUP BY fMediane("Adecoeuv","mt_adjuge_FF","cd_arti=22796");
    Le 3ème paramètre de la fonction fmediane contient le filtre qui permet ici de ne calculer la médiane que sur les enregistrements ayant cd_arti=22796.
    De plus, par défaut, la fonction rejette les valeurs nulles.

    La requête en elle-même filtre les enregistrements (WHERE (((Adecoeuv.cd_arti)=22796))) pour éviter de calculer la médiane autant de fois qu'il y a de lignes dans la table. Mais ça n'influe pas le résultat de la médiane puisque fMediane utilise ces propres données via ces paramètres.

    Le GROUP BY ne sert qu'à afficher une seule fois la médiane calculée.

    Selon ce que l'on veut obtenir, il est parfois plus intéressant de calculer la médiane comme source d'un contrôle indépendant d'un formulaire plutôt que de passer par une requête.

    Philippe

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Analyste économétrie
    Inscrit en
    Février 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste économétrie
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2012
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Yep. En tout cas merci pour ta précieuse aide.
    Ca m'a l'air bon.
    Bonne semaine.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2013, 10h49
  2. [MySQL] Problème d'exécution de requête
    Par hedgehog dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/02/2007, 15h29
  3. Problème d'exécution de requête
    Par Juanito-Toto dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/10/2006, 10h14
  4. problème d'exécution de requête sous VBA?
    Par jessy212 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/08/2006, 18h48
  5. [STRUTS/HIBERNATE] Problème d'exécution de requête
    Par mc_chicken dans le forum Hibernate
    Réponses: 5
    Dernier message: 21/10/2005, 09h27

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