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 :

Liste de transaction avec valeur actualisée suivant taux de change


Sujet :

Requêtes et SQL.

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut Liste de transaction avec valeur actualisée suivant taux de change
    Bonjour,
    J'ai une base de données Access contenant 4 tables
    Table(Champ, Champ2-[Type de champ], ...)
    T_Product (ID, Product [T9], Currency_Id-[T3], Specif-[T9])
    T_Transaction (ID, DateTransaction, Product_Id, Valeur [Dble])
    T_Currency (ID_Currency-[T3])
    T_RateMvt (ID, Currency-[T3], Date_Change, Rate).

    Je dois faire une requête me listant la somme des valeurs pour toutes les transactions faites depuis le #1/2/2014# et dont le champ Specif de la table [T_Product] est égal à 'Manual
    Les valeurs peuvent être négatives ou positives.
    Jusque là pas de problème.
    Certains produits sont en USD d'autres en EUR, etc...
    Je devrais donc avoir dans ma requêtes la valeur par rapport au taux de change par rapport à l'USD en tenant en compte du dernier cours de la monnaie (champ Rate pour la dernière date pour cette monnaie (champ Date_Change)

    La requête actuelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T_Product.Product, T_Currency.ID_Currency, Sum(T_Transaction.Valeur) AS SommeDeQuantité
    FROM (T_Currency INNER JOIN T_Product ON T_Currency.ID_Currency = T_Product.Currency_Id) INNER JOIN T_Transaction ON T_Product.ID = T_Transaction.Product_ID
    WHERE (((T_Transaction.DateTransaction)>#2/1/2014#) AND ((T_Product.Specif)="Manual"))
    GROUP BY T_Product.Product, T_Currency.ID_Currency, T_Product.Product
    ORDER BY T_Product.Product;
    Quelqu'un peut-il m'aider ?
    Je suppose qu'il faut faire une sous-requête mais je ne vois pas comment la faire, j'ai lu LE SQL de A à Z : 5e partie - les sous-requêtes mais je ne vois pas comment faire la requête qui me donnera le dernier taux de change.

    Pour obtenir la dernière date du change, cela fonctionne mais je n'arrive pas à avoir le champ Rate de la table [T_RateMvt]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Currency.ID_Currency, T_RateMvt.Currency, Max(T_RateMvt.Date_Change) AS MaxDeDate_Change
    FROM T_Currency INNER JOIN T_RateMvt ON T_Currency.ID_Currency = T_RateMvt.Currency
    GROUP BY T_Currency.ID_Currency, T_RateMvt.Currency;
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    tenant en compte du dernier cours de la monnaie
    Je suppose que tu veux dire : le cours à la date de transaction, ou si pas de cours à cette date, celui de la date précédente la plus proche.

    J'écrirais une fonction qui restitue ce cours et j'y ferais appel dans la requête.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour Claude,
    Merci de t'intéresser à ma demande.
    En effet dans la table [T_RateMvt], chaque enregistrement contient les champs Currency qui a comme valeur (EUR, USD, etc...), Date_Change qui contient la date du cours et Rate le cours à cette date. Donc j'ai plusieurs enregistrements par monnaie et le but est d'obtenir le dernier cours.
    C'est essentiellement cette partie que déjà je n'arrive pas à réaliser. Ton intervention dans cette discussion où tu suggères l'utilisation de DMIN (dans mon cas DMAX) me semblait être proche de ce que je cherchais mais je n'y arrive pas.
    Je manque encore d'expérience dans les requêtes plus poussées comme les sous-requêtes ainsi qu'avec les fonctions de domaines.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Peux-tu poster une db Access2000 compatible avec quelques données, pour me permettre de tester une proposition ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour Claude,
    Merci pour ton aide, voici la BD
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    Une fonction qui renvoie le cours le plus récent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function Cours(Devise As String, DateTran As Date) As Variant
      Dim DateProche As Date
      'On cherche la date de la dernière cotation
      DateProche = DMax("Date_Change", "T_RateMvt", "Date_Change <= #" _
               & Format(DateTran, "mm/dd/yyyy") & "# and Currency=""" & Devise & """")
      'On recherche le cours à cette date
      Cours = DLookup("Rate", "T_RateMvt", "Date_Change =#" & Format(DateProche, "mm/dd/yyyy") & "# and Currency=""" & Devise & """")
    End Function
    et on l'utilise dans la requête :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Sum([Valeur]*(cours([id_currency],[DateTransaction]))) AS ContreValeurUSD
    FROM (T_Currency INNER JOIN T_Product ON T_Currency.ID_Currency = T_Product.Currency_Id) INNER JOIN T_Transaction ON T_Product.ID = T_Transaction.Product_ID
    WHERE (((T_Transaction.DateTransaction)>#2/1/2014#) AND ((T_Product.Specif)="Manual"));

    La db est ici : http://claudeleloup.developpez.com/F...tCurrecncy.mdb
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour Claude,
    Merci pour ton aide. J'avais espéré m'en sortir avec une requête et sous-requête sans passer par du VBA mais tant pis, je vais passer par cette fonction car j'ai déjà passé trop de temps sur ce cas là.
    En tout les cas, j'ai pu mieux appréhender la syntaxe exacte de la fonction DMAX.
    Cependant je n'ai pas compris ce que représente le dièse (#) dans la comparaison de l'argument critère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateProche = DMax("Date_Change", "T_RateMvt", "Date_Change <= #"
    Merci encore et

    [EDIT]
    J'ai consulté l'aide du VBE concernant l'utilisation du # dans DMAX mais j'avoue que cela ne me parle pas trop (valeur en cours du contrôle ?) est-ce que cela signifie la valeur du record depuis lequel on invoque la fonction ?
    Je vais faire des tests
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    En tout les cas, j'ai pu mieux appréhender la syntaxe exacte de la fonction DMAX
    Si tu veux tout savoir, voici « la » référence, c’est le tutoriel de Philippe JOCHMANS Les fonctions de domaine.


    Cependant, je n'ai pas compris ce que représente le dièse (#) dans
    De toi à moi, ce n'est pas un dièse, mais un croisillon ! http://fr.wikipedia.org/wiki/Croisillon_(signe)

    Ici, il s'agit du délimiteur pour un critère de type date : « = #CritèreDate# ».
    Pour un critère de type texte, on encadre avec des doubles-quotes : « = "CritèreTexte" » (éventuellement redoublés s'ils sont eux-mêmes dans une expression entre doubles-quotes.
    Pour un critère de type numérique, pas de délimiteur : « = CritèreNumérique ».
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour Claude,
    Ici, il s'agit du délimiteur pour un critère de type date. « = #CritèreDate# »
    Pour un critère de type texte, on encadre avec des doubles-quotes « = "CritèreTexte" » (éventuellement redoublés s'ils sont eux-mêmes dans une expression entre doubles-quotes.
    Pour un critère de type numérique, pas de délimiteur. « = CritèreNumérique »
    Ces syntaxes je les connais mais je n'ai pas reconnu cela dans la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DMax("Date_Change", "T_RateMvt", "Date_Change <= #"
    Je vais consulté le tutoriel que tu as référencé que j'avais lu un peu vite sans doute.

    [EDIT]
    Au temps pour moi.
    J'avais complètement occulté la suite de la fonction qui était en fait une concaténation. Il est temps que je prenne des vacances.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    Bonsoir à vous deux,

    Citation Envoyé par Philippe Tulliez Voir le message
    Merci pour ton aide. J'avais espéré m'en sortir avec une requête et sous-requête sans passer par du VBA ...
    Ok, tu l'auras voulu

    Tout commence par une rasta sous-requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT T.ID               AS ID_transaction,
           Max(T.Date_Change) AS DateTauxApplicable
    FROM   (SELECT T_Transaction.ID,
                   T_RateMvt.Date_Change
            FROM   (T_Currency
                    INNER JOIN (T_Product
                                INNER JOIN T_Transaction
                                        ON T_Product.ID = T_Transaction.Product_ID)
                            ON T_Currency.ID_Currency = T_Product.Currency_Id)
                   INNER JOIN T_RateMvt
                           ON T_Currency.ID_Currency = T_RateMvt.Currency
            WHERE  T_RateMvt.Date_Change <= [DateTransaction]) AS T
    GROUP  BY T.ID;
    Elle ramène pour chaque transaction de produit, la date d'application du taux. Par exemple pour la transaction ID=4 du produit "tata" en EUR, dont la date de transaction est 25/03/2014, la date d'application du taux (1,36) est 07/02/2014.

    Et voici comment l'utiliser pour calculer les contrevaleurs en USD pour chaque transaction :
    Nom : req1_PTulliez.PNG
Affichages : 181
Taille : 30,2 Ko

    Je trouve le même résultat que Claude pour le total (c'est rassurant !).

    Bon, ça pique un peu les yeux... mais fallait pas m'inviter
    Fichiers attachés Fichiers attachés

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    ... mais fallait pas m'inviter
    J'étais sûr que tu passerais par ici avec une requête à la f-leb !
    Images attachées Images attachées  
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour Fabien et Claude,
    J'avoue que je suis resté sans voix à la vue de cette belle requête que je vais analyser et décortiquer pour bien la comprendre.
    C'est du grand art et
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. [MySQL] Liste déroulante mysql avec valeur vide
    Par tittano dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/02/2009, 14h31
  2. [SQL] liste déroulante classée avec valeur cible
    Par nagdrir dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/09/2007, 16h09
  3. actualiser un taux de change
    Par alsimbad dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/09/2007, 14h18
  4. Réponses: 3
    Dernier message: 14/08/2006, 21h27
  5. [Liste Modifiable] Problème avec la valeur par défault
    Par fusion_sadam dans le forum Access
    Réponses: 3
    Dernier message: 16/06/2006, 11h00

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