Avatar billede per2edb Praktikant
18. oktober 2014 - 18:28 Der er 12 kommentarer og
1 løsning

Tilgængelig kilde med valutakurser

Jeg skal have daglig opdateret Valutakurser i hovedvautaerne fra en extern kilde ind i Access

Jeg har prøver forskellige web sider men kilden er ikke tilgængelig
Ër der nogen der kender en tilgængelig kilde
Avatar billede bvirk Guru
18. oktober 2014 - 19:13 #1
xml fil kan fås her:
  http://www.nationalbanken.dk/_vti_bin/DN/DataService.svc/CurrencyRatesXML?lang=da

Vender tilbage hvis jeg får ide til fuldautomatisk tabelopdatering
Avatar billede bvirk Guru
19. oktober 2014 - 11:52 #2
Bortset fra tegnkonverteringsfejl (æ,ø,å) er her en løsning på tabelopdatering fra remote xml fil.
Givet en tabel Valuta(code text,desc text,rate number) er dette topniveau kaldet:

Sub stocks2table()
    Const table = "Valuta"
    Dim newValues, fldValues, fldVArr
    CurrentDb.Execute "delete from " & table
    newValues = Split(csvvaluesOfXML(), vbCrLf)
    If Not IsEmpty(newValues) Then
        With CurrentDb.OpenRecordset(table)
            For Each fldValues In newValues
                If Len(fldValues) Then
                    fldVArr = Split(fldValues, ",")
                    .AddNew
                    ![Code] = fldVArr(0)
                    ![desc] = fldVArr(1)
                    ![Rate] = Replace(fldVArr(2), ".", ",")
                    .Update
                End If: Next: End With: End If
End Sub

Denne sub kalder:

Function csvvaluesOfXML()
    Const xslFile = "D:\home\dev\devel\access\stock.xsl"
    Dim domIn As DOMDocument30, domStylesheet As DOMDocument30, xmlData, loadXMLSucces
    Set domIn = New DOMDocument30
    loadXMLSucces = domIn.loadXML(xmlresponseText( _
            "http://www.nationalbanken.dk/_vti_bin/DN/DataService.svc/CurrencyRatesXML?lang=da"))
    If loadXMLSucces Then
        Set domStylesheet = New DOMDocument30
        domStylesheet.Load xslFile
       
        If Not domStylesheet Is Nothing Then
            csvvaluesOfXML = domIn.transformNode(domStylesheet)
        End If
    End If
    Set domIn = Nothing
End Function

Bemærk to ting der er hardcodet i csvvaluesOfXML()
1) url'en til natioalbankens valuta xml fil
2) filnavnet på en xsl fil - denne xml tekstfil ser såldes ud:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text" version="1.0" omit-xml-declaration="yes" encoding="ISO-8859-1" />
    <xsl:template match="/exchangerates/dailyrates">
        <xsl:for-each select="currency">
            <xsl:value-of select="@code"/><xsl:text>,</xsl:text><xsl:value-of select="@desc"/><xsl:text>,</xsl:text>
            <xsl:choose><xsl:when test="string-length(@rate) < 2"><xsl:text>0</xsl:text></xsl:when>
                <xsl:otherwise><xsl:value-of select="translate(@rate,',','.')"/></xsl:otherwise>
            </xsl:choose><xsl:text>
</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

xsl'en ser lidt rodet ud, det er vigtigt at der ikke kommer linieskift i outputet og den er hacket sammen så det ikke skete. Man teste med ?csvvaluesOfXML() i immediate vinduet 
Og endeligt denne funktion som udfører http kaldet - det er her jeg ikke har kunnet fremeksperimentere adodb.stream konvertering der bringer æ,ø og å fra iso-8859-1 ind i tabellen:

Function xmlresponseText(url, Optional method = "GET")
    Dim xhr
    Set xhr = CreateObject("Microsoft.XMLHTTP")
    xhr.Open method, url, False
    xhr.send
    If xhr.Status = 200 Then
        With New ADODB.Stream
            .Type = adTypeText
            .Charset = "iso-8859-1"
            .Open
            .WriteText xhr.responseText
            .Position = 0
            .Charset = "utf-8" '"windows-1252"
            xmlresponseText = .ReadText
        End With
    End If
    Set xhr = Nothing
End Function
Avatar billede per2edb Praktikant
19. oktober 2014 - 12:03 #3
Det lyder spændende. Jeg prøver det
Avatar billede bvirk Guru
19. oktober 2014 - 12:05 #4
sådant et forum indlæg egner sig ikke rigtigt til xsl dump - jeg har følgende 10 tegn:
følgende 10 tegn '&','#','1','3',';','&','#','10',';'
og ikke linieskift mellem sidste <xsl:text> og </xsl:text> - måske er det lige fedt!
Avatar billede bvirk Guru
19. oktober 2014 - 13:33 #5
Men det er det ikke med test="string-length(@rate) < 2" - < tegnet skal erstattes med - uden mellem
& l t ;
Avatar billede finb Ekspert
19. oktober 2014 - 13:43 #6
valutakurser.dk
Avatar billede per2edb Praktikant
19. oktober 2014 - 15:52 #7
Jeg får fejl her:
Dim domIn As DOMDocument30
Not defined  ?
Avatar billede bvirk Guru
19. oktober 2014 - 17:50 #8
referencer til:
Microsoft dao.36
Microsoft active x data object 2.8
Microsoft xml v.3.0

Der er rettet en del i denne - xsl ligger i blob
https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxhbWFpbHVzZXJ8Z3g6NjQ3MWY3ZTEzOTU5N2EyOQ

Nu går aldrig på valutakurser.dk længere ;)
Avatar billede per2edb Praktikant
19. oktober 2014 - 18:13 #9
1000 tak - det er bare super
Avatar billede bvirk Guru
19. oktober 2014 - 22:10 #10
Selv tak, jeg havde fornøjelsen af flere nye koncepter - bla. blob's i stedet for lokale filer og tegnkonvertering fra iso-8859-1
Avatar billede per2edb Praktikant
19. oktober 2014 - 22:32 #11
Hej
ØV Det var der næsten, men da jeg lagde Microsoft dao.36 ind fik jeg
Name conflicts ........
De virker pånær Name conflicts...
Jeg bruger Access 2013 og Windows 7 prof
Det virker med dao .36 i dit eksempel som er baseret på en ældre version
Kan du fortælle hvad jeg skal bruge i stedet for dao.36 når det er en nyere version
Avatar billede per2edb Praktikant
20. oktober 2014 - 15:56 #12
Nu fik jeg det til at virke
Microsoft dao.36  skulle bare ikke med
Avatar billede bvirk Guru
21. oktober 2014 - 12:05 #13
Anede mig at referencer ved indlemning i andre projekter, kunne være allerede eksisterende, og det ikke nødvendigvis med helt samme referencenavn. Det fiksede din erhvervede erfaring jo fint, per2edb ;)
Ja - jeg anvender Access 2000 - under xp home.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester