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