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

Interfaces de programmation Oracle Discussion :

intégrer une colonne calculée "Change devises croisées"


Sujet :

Interfaces de programmation Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut intégrer une colonne calculée "Change devises croisées"
    Bonjour,

    je cherche à intégrer une colonne pour y obtenir un taux de change croisé entre 2 devises, càd EUR/USD, GBP/USD, CHF/GBP, ... sachant que les seuls taux de changes que j’ai dans la base sont vis-à-vis de l’EUR.

    J'ai 3 bases au départ: Opération (o); Changes (ch) et Personne (p) avec les champs suivants:

    o.datvop "date valeur opération",
    o.devise "Code devise opération",
    o.mtneto "montant net opération",
    ch.datvcc "date valeur change",
    ch.devise "Code devise",
    ch.chatau "taux de change",
    p.devban "code devise de la banque",
    p.ibanbq "Nom du compte bancaire",
    Le taux change qui est alimenté par date par défaut dans la base change, est celui de l'EUR vers autres devises (ex: GBP vs EUR = 0,92). Pour le taux de change EUR/EUR, celui ci est de 1, mais à une seule date, celle du 01/01/1900 donc valeur vide pour toutes les autres dates. taux de change vide également si la date d'opération est supérieure à la dernière date de change connue (=> utilisation du max(chi.datvcc))

    voici le code que j'ai écrit pour le calcul du taux de change:

    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
    SELECT decode(p.devban,o.devise,1,
                 ((select decode(chbdi.chatau,'',
                                (decode(o.devise,'EUR',1,(select chatau
                                                        from changes
                                                        where datvcc=(select max(chi.datvcc)
                                                                      from changes chi)
                                                              and devise=o.devise))),
                                chbdi.chatau)
                  from changes chbdi where chbdi.devise=o.devise)
                 /(select decode(chbdo.chatau,'',
                                 (decode(p.devban,'EUR',1,(select chatau
                                                          from changes
                                                          where datvcc=(select max(chi.datvcc)
                                                                        from changes chi)
                                                                and devise=p.devban))),
                                 chbdo.chatau)
                  from changes chbdo where chbdo.devise=p.devban)))
                  as TxChangeBANDEP
    FROM  OPERATION                 o,
               changes                      ch,
               PERSONNE                  p
    WHERE o.datvop = ch.datvcc(+) "il y a plusieurs enregistrements sur une date d'opération pour une seule par devise dans la table change"
               and o.devise=ch.devise(+) "idem"
    mais il me met le message suivant:
    ORA-01427: Sous-interrogation ramenant un enregistrement de plus d'une ligne
    Merci d'avance pour vos bons conseils

    Laurent

    PS: remarque importante, je travaille avec QlikView sur base Oracle

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    A mon avis tu as bien trop de SELECT dans ta requête

    En plus un coup du test device=1 et après devise=EUR, t'es sûr qu'il n'y a pas une erreur ? Idem pour le test de '', ça devrait pas être NULL ?
    T'es sûr de tes jointures externes ? Parce que c'est surement là que tu as trop d'enregistrements du coup.

    Essaye un truc dans ce genre (évidemment fonctionnellement c'est pas forcément juste faudra adapté).

    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
    SELECT decode(p.devban,o.devise,
    							1,
    							decode(ch.chatau,NULL,(decode(o.devise,'EUR',1,ch_op.chatau)),ch.chatau)
    								/
    							decode(ch.chatau,NULL,(decode(o.devise,'EUR',1,ch_pers.chatau)),ch.chatau)
    			  ) AS TxChangeBANDEP
    FROM  OPERATION                 o,
               changes                      ch,
               PERSONNE                  p,
    		   (SELECT chatau,devise,max(chi.datvcc) datvcc
    			  FROM changes
    		      GROUP BY chatau,devise
    			) ch_op,
    		   (SELECT chatau,devise,max(chi.datvcc) datvcc
    			  FROM changes
    		      GROUP BY chatau,devise
    			) ch_pers,
    WHERE o.datvop=ch.datvcc(+) --il y a plusieurs enregistrements sur une date d'opération pour une seule par devise dans la table change
      AND o.devise=ch.devise(+) --idem
      AND o.devise=ch_op.devise
      AND o.devise=ch_pers.devise
    L'idée étant d'éviter les sous-requêtes dans le SELECT, sources d'erreur et de perfs catastrophiques.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    ok, grâce à toi, j'ai eu un très bon début de piste et ai pu modifier ma requête comme suit pour obtenir le résultat recherché:

    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
    SELECT        decode(p.devban,o.DEVISE,1,
                  decode(ch.chatau,NULL,decode(o.DEVISE,'EUR',1,ch_op.chatau),ch.chatau)
                  /              decode(ch.chatau,NULL,decode(p.DEVBAN,'EUR',1,ch_pers.chatau),ch.chatau))
                  as TxChangeBANDEP,
     
    FROM
    (SELECT chatau,devise,datvcc
    			  FROM changes
    			  where datvcc=(select max(chi.datvcc) from changes chi where chi.devise = devise)) ch_op,
    	 (SELECT chatau,devise,datvcc
    			  FROM changes
    			  where datvcc=(select max(chi.datvcc) from changes chi where chi.devise = devise)) ch_pers
     
    WHERE o.datvop=ch.datvcc(+) 
      AND o.devise=ch.devise(+)
      AND o.devise=ch_op.devise (+)
      AND o.devise=ch_pers.devise (+)

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oups, il me reste toujours un soucis:

    dans la 2e partie de la division, ce n'est pas ch.chatau que je dois prendre, mais le taux de change par rapport à la devise du compte banque(p.DEVBAN)

    Donc, en simplifié: Devise de l'opération/devise du compte banque.

    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
    SELECT o.datvop,
               decode(p.devban,o.DEVISE,1,
                  decode(ch.chatau,NULL,decode(o.DEVISE,'EUR',1,ch_op.chatau),ch.chatau)
                  /              decode(ch.chatau,NULL,decode(p.DEVBAN,'EUR',1,ch_pers.chatau),ch.chatau))
                  AS TxChangeBANDEP,
     
    FROM OPERATION                 o,
            changes                      ch,
            PERSONNE                  p,
            (SELECT chatau,devise,datvcc
    			  FROM changes
    			  WHERE datvcc=(SELECT max(chi.datvcc) FROM changes chi WHERE chi.devise = devise)) ch_op,
    	 (SELECT chatau,devise,datvcc
    			  FROM changes
    			  WHERE datvcc=(SELECT max(chi.datvcc) FROM changes chi WHERE chi.devise = devise)) ch_pers
     
    WHERE o.datvop=ch.datvcc(+) 
      AND o.devise=ch.devise(+)
      AND o.devise=ch_op.devise (+)
      AND o.devise=ch_pers.devise (+)
    En tout cas, merci pour ton aide orafrance, j'ai déjà bien progressé!

    Un bon week-end de Pâques

    Laurent

Discussions similaires

  1. d'un fichier xml à des tables Access : ajout d'une colonne calculée
    Par scribreiz dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 16/10/2009, 12h48
  2. DataTable - Ajout d'une colonne calculée
    Par Ouggada dans le forum Windows Forms
    Réponses: 14
    Dernier message: 24/02/2009, 17h09
  3. [firebird 1.5] refaire appel à une colonne calculée
    Par mickamar51 dans le forum Firebird
    Réponses: 1
    Dernier message: 08/10/2008, 16h55
  4. Réponses: 11
    Dernier message: 18/10/2007, 13h49
  5. DataTable - Ajout d'une colonne calculée
    Par dequi dans le forum JSF
    Réponses: 5
    Dernier message: 11/07/2007, 16h59

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