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

Access Discussion :

Calculs et fonction sur une suite d'enregistrements d'un champ et non le champ entier


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut Calculs et fonction sur une suite d'enregistrements d'un champ et non le champ entier
    Bonjour à tous.

    J'ai cherché à bien comprendre la façon d'utiliser des fonctions dans les requêtes Access, mais je n'arrive pas encore à les faire fonctionner.

    Voici mon problème :
    J'ai un table très simple, avec 3 champs:
    - La clé primaire
    - Le champ "date", finalement aussi unique que la clé
    - Le champ "cours", donnant le cours du produit au jour donné


    Je veux pouvoir faire une requête qui affichera ces 3 champs ainsi qu'un 4ème champ "Moyenne10Jours", calculé comme suit:
    Le 4ème champ est égal à la moyenne historique des 10 derniers jours.

    Ce champ est donc la moyenne arithmétique des 10 enregistrements du champs "cours" qui précèdent l'enregistrement actuellement calculé, ie par exemple, l'enregistrement 23 de ce champ "Moyenne10Jours" est égal à la moyenne des "cours" des enregistrements 14 à 23, et ainsi de suite.



    Ce calcul, évidemment très simple en Excel, me paraît plus délicat en Access.


    D'après ce que j'ai lu sur le forum et sur les tutoriels, je pense qu'une des solutions simples est de passer par une fonction que j'appelle pour calculer le champ "Moyenne10Jours" dans ma requête Access.


    La fonction serait donc une boucle de ce type, avec le nom du champ (tbl) et le numéro de l'enreregistrement actuel (i) en données d'entrée:


    Public Function Moyenne(tbl As Variant, i as integer) As Double
    Dim Var1
    For j = -9 To 0
    Var1 = Var1 + tbl( i + j) 'somme des valeurs
    Next
    Moyenne = Var1 / 10
    End Function


    Mon problème, c'est que je n'arrive pas à appeler correctement cette fonction dans ma requête.

    - Je ne sais pas comment dire dans ma requête qui appelle la fonction que le "i" est le numéro d'enregistrement actuel

    - J'ai le même problème pour demander de mettre le champ "cours" en tant qu'input de la fonction.


    Merci d'avance pour votre aide.

    Bien cordialement,

    Laurent

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour,

    Le pb est celui des premiers enregistrements, pour lesquels les cours des 10 derniers jours ne sont pas disponibles. Cela peut conduire à écrire une fonction si tu ne veux rien aficher pour les 9 premiers enregistrements. Si tu n'es pas trop regardant là-dessus, tu peux faire assez simple:
    tu ajoutes un champ en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MM10 : DAvg("Cours";"MaTable";"MaDate > #" & Format([MaDate]-10;"mm/dd/yyyy) & "# AND MaDate <= #" & Format([MaDate];"mm/dd:yyyy") & "#"
    J'ai appelé ton champ 'date' 'MaDate' parce que 'Date' est réservé.
    Après correction des erreurs de syntaxe, cela devrait marcher.

    Bon courage,

    PGZ

  3. #3
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT a.date, a.cours, Avg(b.cours) AS moyenne10
    FROM matable AS a, matable AS b
    WHERE( b.clef>=[a].[clef]-11
     And b.clef<[a].[clef])
    or b.clef=1
    GROUP BY a.date, a.cours
    ORDER BY a.date;

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    Edit : Merci beaucoup pour VOS réponses.

    Pour le problème des 9 premiers enregistrements, c'est en effet quelque chose à traiter, sur lequel je me pencherai ensuite...
    (A ce propos, est-il possible de mettre une valeur na() comme dans Excel, pour que les résultats des 9 premiers enregistrements ne gênent pas leur réutilisation par d'autres requêtes?)



    Sinon, PGZ, ton code me semble très bien, mais mon Access 2003 ne le digère pas.
    Outre la petite faute de frappe dans les dates à la fin (avec des "/" partout et pas de ":"), il semble y avoir autre chose.


    Access me met le message d'erreur suivant:
    "La syntaxe de l'expression entrée n'est pas correcte.
    Vous avez peut-être entré un opérande sans opérateur."

    Plus précisément, Access sélectionne la partie centrale suivante :
    # AND MaDate <= #


    Je débute dans la syntaxe Access, et je n'arrive donc à trouver où cela cloche...



    Edit : Merci pour ta proposition différente, random, car je n'avais jamais testé de requête SQL.


    Laurent

  5. #5
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Re,

    Je corrige une mon ânerie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MM10 : DAvg("Cours";"MaTable";"MaDate > #" & Format([MaDate]-10;"mm/dd/yyyy") & "# AND MaDate <= #" & Format([MaDate];"mm/dd/yyyy") & "#"
    MaDate c'est le nom de ton champ qui contient la date, et que tu ne dois pas appeler Date.

    Si tu confirmes le pb des 9 premiers enregistrements, on arrangera cela après.

    A+

    PGZ

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    Merci PGZ.

    Oui, j'ai changé le nom "date" en "Madate", tout comme le nom de ma table en "matable" pour correspondre.

    Mais j'ai toujours un bug Access, qui m'écrit:
    "Il manque dans l'expression une parenthèse fermante, un crochet (]) ou une barre verticale (|)."

    J'ai vérifié mon "copier-coller" en le refaisant plusieurs fois : il reste une erreur de syntaxe quelque part.

    En fait, il manque une fermeture de parenthèse.
    Mais quand je l'ajoute à la fin, la fonction marche (elle est convertie de l'anglais au français), mais les résultats de la requête affichent tous: #Erreur


    Random, la fonction marche avec ta méthode, et je t'en remercie.
    Cependant, je devrais faire autrement pour ne pas utiliser un des "regroupements" de Access avec l'opération simple "moyenne" pour faire des calculs plus complexes sur les "x derniers cours". (ex : statistiques de distribution, etc.)

    Merci à tous les deux.


    Laurent

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


    mais les fonctions de domaine proposent les mêmes fonctions que les fonctions de regroupement, et sont moins performantes que le sql

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

Discussions similaires

  1. calcul de durée sur une suite de données
    Par madousn dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/06/2008, 10h04
  2. cohabitation de fonction sur une page
    Par temperature dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2006, 15h21
  3. [VBA-E]Arrêt d'exécution sur une requette d'enregistrement
    Par thierry27 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2006, 18h53
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  5. [Dates] Calcul tout bête sur une date...
    Par poah dans le forum Langage
    Réponses: 5
    Dernier message: 01/11/2005, 15h02

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