Valutakoersen

wanneer je bezig bent met handel buiten de euro-zone dan krijg je te maken met wisselkoersen en het feit dat die fluctueren. De Europese Centrale Bank (ecb) publiceert dagelijks rond 3 uur CET op http://www.ecb.europa.eu/stats/exchange/eurofxref/html/index.en.html 32-tal valuta-koersen.

Deze koersen kun je gebruiken om bijvoorbeeld in de je boekhouding te gebruiken. Het zijn overigens de middelkoersen en niet de inkoop- en verkoop-koersen. De verschillen daarmee moet je natuurlijk apart verwerken.

De gepubliceerde koersen zijn ook beschikbaar als downloads en één van de formaten is xml. Er zijn 3 varianten beschikbaar:

  1. de dagelijkse http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
  2. de afgelopen 90 dagen http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml én
  3. De historie vanaf januari 1999 http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml en als http://www.ecb.europa.eu/stats/eurofxref/eurofxref-sdmx.xml (Deze laatste doen we hier niets mee, omdat de informatie over de koers al in de eerste variant is opgenomen. Het formaat van de eurofxref-hist is identiek aan dat van eurofxref-hist-90d en eurofxref-daily.)

Het xml-bestand

Het formaat ziet er als volgt uit:

Screenshot van eurofxref-daily.xml
Screenshot van eurofxref-daily.xml

 

de beide andere bestanden eurofxref-hist.xml en eurofxref-hist-90d.xml zijn identiek aan deze. Voor iedere datum is daarin een node Cube@time voor elke valuta-datum toegevoegd.

Het xsl-bestand

De xsl die nodig is om dit formaat te vertalen is ook redelijk eenvoudig gebleven en ziet er als volgt uit:

Screenshot van de stylesheet waarmee eurofxref-bestanden kunnen worden omgezet naar voor Filemaker begrijpelijke xml

Er zijn eigenlijk maar 2 dingen die opvallen in dit bestand en dat zijn:

  1. de declaratie van de 2 name-spaces gesmes en ecb. De gesmes is duidelijk, want die zie je ook staan in eurofxref-daily.xml . Zonder de declaratie van de namespace kan je die niet gebruiken in de xsl. De tweede ecb zie je daar niet en die is nodig voor het deel van eurofxref-daily.xml waar geen namespace bij staat genoemd.
    Die namespace bestaat echter wél, want dat is de default-namespace van eurofxref-daily.xml. De x-path moet deze namespaces noemen: /gesmes:Envelope/ecb:Cube/ecb:Cube…. Zonder deze namespaces is het niet mogelijk de xml uit te lezen.
  2. xsl:variabele “datum” vertaalt de datum YYYY-MM-DD in $time naar DD-MM-YYYY.

Het FileMaker-bestand

In het voorbeeld-bestand zitten slechts 2 tabellen: xsl en currencies. In de eerste is de stylesheet opgeslagen welke, iedere keer dat de nieuwste koersen moeten worden opgehaald, wordt opgeslagen in de temporary-map van Filemaker. Het bestand wordt automatisch opgeruimd zodra FileMaker is afgesloten.

In de tweede tabel staan alle koersen per datum en per valuta-code opgeslagen. Alleen koersen die nog niet in je tabel bestaan worden geïmporteerd.

Scripting

Er is maar 1 script: “Update currencies” en daar zitten alle nodige stappen in. Eerst wordt de stylesheet in de temporary-map geplaatst, zodat het klaarstaat om de data van de ECB binnen te halen.
Het pad naar temp wordt bepaald met:

Let ( [
  $temp = Choose ( Abs ( Get ( SystemPlatform ) ) ; “” ; “filemac:” ; “filewin:” ) &
                Get ( TemporaryPath ) ;
  $xslpath = $temp & xsl::FileName 
] ; 
  1
)

Als je fm13 gebruikt kan je de bestandsnaam ook bepalen met:

GetContainerAttribute ( xsl::File ; “filename” )

en dan zou het veld xsl:FileName helemaal niet nodig zijn.

De juiste gegevens ophalen

De volgende stap bepaalt van wanneer de laatste koersen zijn en alle valutarecords moeten worden gesorteerd. Van het laatste record wordt dan de datum gebruikt om te bepalen wat de definitieve URL wordt waar bij de ECB één van drie mogelijke bestanden wordt opgehaald en geïmporteerd.

De eerste keer óf wanneer je er méér dan 90 dagen mee hebt gewacht, wordt de hele historie die beschikbaar is bij de ECB opgehaald. In dat geval kan het hele gedoe meer dan een minuut duren, afhankelijk van zowel je computer als van de beschikbare internet-verbinding.

Tijdens het importeren worden datum en valutacode gebruikt om met elkaar te vergelijken. Alleen nog niet bestaande records worden zo toegevoegd. De data wordt overigens wél overschreven, maar dat is geen probleem.

Koersen gebruiken

Tenslotte is er het gebruik van de koersen. In het voorbeeld staat daar helemaal niet over, dat mag je helemaal zelf verzinnen/uitvoeren. De volgende vingerwijzingen zijn waarschijnlijk wel handig:

Maak een relatie vanaf waar je de koers(en) wilt gebruiken door te koppelen dmv zowel de valutacode als de datum.
Relatie

 

Haal de valuta op door de koers op te halen:

Lookup

 

 

En daar aan te geven dat eerstvolgende lagere waarde wilt ophalen als er geen exacte match is:

WhatToCopy

 

 

 

 

 

 

 

Op deze wijze krijg je de altijd een koers terug, mits er eentje bestaat voor de betreffende valuta.

Het voorbeeld bestand  Currencies staat klaar om te downloaden.