2011

Apr

18

Av Rolf

Internet är en outtömlig källa för alla möjliga sorters information, t.ex. finns de rätta lottonumren för den senaste lottodragningen färdiga för att importeras i FileMaker. Jag har tidigare skrivit om hur man t.ex. kan importera aktuella valutakurser och valresultat i XML-format från internet till en FileMaker-databas.

Även lottoraden (och stryktipset, keno m.fl.) finns i XML-format från Svenska Spel. Det är inte bara den senaste raden som finns, faktiskt alla rätta lottorader sedan spelet introducerades i september 1980 tillsammans med aktuella vinstpengar. Tänk så mycket statistik man kan få fram! (Vilket nummer har gett mest i vinst? Hur många miljonvinster har delats ut? osv.)

Jag tänkte visa hur man kan importera den rätta lottoraden och i det här exemplet helt enkelt ignorera övrig information.

Uppdatering 2013: Svenska Spel har ändrat länken och bytt till ”https” vilket inte FileMaker kan importera. Exemplet fungerar inte längre.

XSLT

FileMaker kan inte importera XML-informationen precis som den är, FileMaker kan bara importera XML-information som är formaterad i en viss struktur. Alla XML-filer som du vill importera måste först transformeras till rätt struktur innan de kan importeras. Transformeringen görs i samband med importen med hjälp av ett slags konverteringsprogram i språketXSLT. Språket XSLT är standardiserat och används i en mängd andra sammanhang för att strukturera och transformera XML-information.

Jag behöver alltså en XSLT som transformerar XML-informationen till FileMakers struktur. Till att börja med tittar man på XML-informationen för att se hur den ser ut. Den finns t.ex. här:

http://www.svenskaspel.se/includes/xmlelements/XMLresultat.asp?produktid=8&omgang=1

Det är XML-informationen med de första rätta lottonumren med dess vinst. (Produktid = 8 i adressen är Lotto, det finns även andra produktid för Stryktips etc.) Parametern ”omgang” är numret på omgången.

Jag vill importera till fem fält i en FileMaker-tabell som jag kallar för RättRad: omgångens nr, typ av nummer (nummer eller tilläggsnummer), produktid (det finns 2 dragningar, Lotto 1 och 2) samt datumet. Jag skapar en tabell i FileMaker med dessa 5 fält, alla numeriska utom nummertypen och datumet (som även innehåller veckonummer) som båda är textfält.

En XSLT för att importera dessa fem fält kan se ut så här:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns="http://www.filemaker.com/fmpxmlresult">
  <xsl:template match="/">
  <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
   <ERRORCODE>0</ERRORCODE>
   <PRODUCT BUILD="" NAME="" VERSION=""/>
   <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(//resultat)}" 
        TIMEFORMAT="h:mm:ss a"/>
   <METADATA>
    <FIELD><xsl:attribute name="NAME">omgang</xsl:attribute>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute></FIELD>
    <FIELD><xsl:attribute name="NAME">produktid</xsl:attribute>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute></FIELD>
    <FIELD><xsl:attribute name="NAME">nummer</xsl:attribute>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute></FIELD>
    <FIELD><xsl:attribute name="NAME">typ</xsl:attribute>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute></FIELD>
    <FIELD><xsl:attribute name="NAME">datum</xsl:attribute>
        <xsl:attribute name="EMPTYOK">YES</xsl:attribute>
        <xsl:attribute name="MAXREPEAT">1</xsl:attribute>
        <xsl:attribute name="TYPE">TEXT</xsl:attribute></FIELD>
   </METADATA>
   <RESULTSET>
    <xsl:attribute name="FOUND"><xsl:value-of select="count(//resultat/*)"/></xsl:attribute>
   <xsl:for-each select="//resultat/*">
    <ROW>
     <xsl:attribute name="MODID">0</xsl:attribute>
     <xsl:attribute name="RECORDID">0</xsl:attribute>
     <COL><DATA><xsl:value-of select="../../omgang"/></DATA></COL>
     <COL><DATA><xsl:value-of select="../../../produktid"/></DATA></COL>
     <COL><DATA><xsl:value-of select="."/></DATA></COL>
     <COL><DATA><xsl:value-of select="name()"/></DATA></COL>
     <COL><DATA><xsl:value-of select="../../datum"/></DATA></COL>
    </ROW>
   </xsl:for-each>
  </RESULTSET>
   </FMPXMLRESULT>
 </xsl:template>
 </xsl:stylesheet>

Först definieras vilka fem fält som jag vill importera i XML-informationen, sedan görs en loop för att utvinna informationen för posterna som ska skapas. Det kommer att skapas en post i tabellen för varje rätt nummer, sju nummer och fyra tilläggsnummer för en dragning blir alltså 11 poster. När du importerar en omgång kommer det att skapas 22 poster eftersom både Lotto 1 och 2 kommer tillsammans.

Manus för import

I FileMaker gör jag ett manus som importerar XML-informationen till tabellen RättRad med hjälp av XSLT ovan.

LottoManus

Importsteget importerar XML-data och jag beräknar fram internet-adressen med hjälp av ett fält för omgångsnumret.

LottoImportruta

Beräkningen ser ut så här (omgångens nummer hämtas från manusparametern):

"http://www.svenskaspel.se/includes/xmlelements/XMLresultat.asp?produktid=8&omgang=" & Get ( Manusparameter )

XSLT-filen hämtar jag från internet.

Portaler

Jag gör sedan en layout i FileMaker med 4 portaler, som var och en av dem visar information från omgången. Vilka rader från tabellen RättRad som ska visas i respektive portal bestäms med portalfilter (kräver FileMaker 11, annars får man använda globalfält). Det finns två portaler med ordinarie nummer från Lotto 1 (produktid = 8) respektive Lotto 2 (produktid = 9) samt 2 portaler med tilläggsnumren för respektive dragning.

Portalfilter kan se ut så här (portalen visar ordinare nummer för Lotto 1 om relationen heter LottoImport_RättRad):

LottoPortalfilter

Den slutliga layouten kan se ut så här:

LottoImportKlar

Skapa en ny post, skriv in ett nummer för omgången (senaste omgången 16 april är nr 1597) och klicka på knappen ”Importera rätt rad”.

Ladda ner exempeldatabas här:

LottoImport.zip (17,40 kb)

Kommentarer

2011-11-25 Arto Ylitervo

Hej,
Försökte importera rätt Lottorad men fick följande fel:
Xml-tolkningsfel: Required attribute "FOUND" was not provided.

Har du några förslag på vad jag har gjort för fel?

M.v.h.
Arto

2011-11-25 Rolf

Rolf Clausen

Vilken version av FileMaker har du?

2011-11-25 Arto Ylitervo

Filemaker 10 Pro

2011-11-25 Rolf

Det ska fungera med både 10 och 11. Prova igen! Får du fortfarande felmeddelande, kontakta mig via epost.

Skriv en kommentar

Din epost-adress stannar hos oss.