In eerdere blogs hebben we gedetailleerd beschreven hoe je gegevens kunt ophalen uit populaire online administratiepakketten zoals Exact Online en AFAS, en deze vervolgens kunt analyseren met behulp van Power BI. In dit artikel richten we ons op een ander veelgebruikt administratieplatform: Twinfield. Net als Exact Online en AFAS biedt Twinfield een krachtige API waarmee je gegevens kunt ophalen en naadloos kunt integreren in Power BI. In deze blog delen we een stapsgewijze handleiding om dit te realiseren, zodat je de volledige analysekracht van Power BI kunt benutten voor Twinfield-gegevens.
Als erkende experts in het koppelen van administratiesystemen met Power BI, hebben we uitgebreide ervaring in het ophalen en integreren van gegevens uit Twinfield. We laten je graag zien hoe je dit kunt doen, en delen handige tips en inzichten om het proces soepel te laten verlopen. Of je nu een financieel manager, een data-analist of een ondernemer bent, deze gids zal je helpen om waardevolle inzichten te verkrijgen uit je Twinfield-gegevens met behulp van Power BI.
Aanmaken parameters
Allereerst maken we een aantal parameters aan zodat we deze later in de scripts kunnen gebruiken bij het aanroepen van de API.
Ga naar Edit Queries en kies in het lint voor Home -> Manage Parameters.
Maak via het knopje New de volgende parameters aan:
Als username en password en organisatie gebruik je de credentials van een gebruiker met toegang tot de administraties die je wilt ophalen.
Vul bij de URL_Logon de volgende waarde in: https://login.twinfield.com/webservices/session.asmx?wsdl
Laat de andere twee URL’s en het SessionID nog even leeg. De juiste waardes hiervoor moeten we nog ophalen.
Opzetten sessie
Als eerste stap moeten we eerst een sessie opzetten waarbij de gebruiker zich moet authentiseren. Het resultaat hiervan is dat de Twinfield API een sessionID genereert. Deze sessionID kun je vervolgens gebruiken om gegevens aanvragen uit te voeren.
Daarnaast krijg je ook een clusterwaarde terug. Deze clusterwaarde is een url waar we de gegevens kunnen gaan opvragen. Maak via New Source een Blank Query aan en geef deze de naam Twinfield_sessie.
Ga naar de Advanced Editor.
Voeg hier de volgende code in:
let
Source = Xml.Tables(Web.Contents(“”& URL_Logon &””
,[Content=Text.ToBinary(”
<soap:Envelope xmlns:soap=”&Character.FromNumber(34)&”http://schemas.xmlsoap.org/soap/envelope/”&Character.FromNumber(34)&” xmlns:xsi=”&Character.FromNumber(34)&”http://www.w3.org/2001/XmlSchema-instance”&Character.FromNumber(34)&” xmlns:xsd=”&Character.FromNumber(34)&”http://www.w3.org/2001/XmlSchema”&Character.FromNumber(34)&”>
<soap:Body>
<Logon xmlns=”&Character.FromNumber(34)&”http://www.twinfield.com/”&Character.FromNumber(34)&”>
<user>”& User &”</user>
<password>”& Password &”</password>
<organisation>”& Organisation &”</organisation>
</Logon>
</soap:Body>
</soap:Envelope>
“),Headers=[#”Content-Type”=”text/xml;charset=UTF-8”]]))
in
Source
De uitkomst hiervan is een eerste resultaat met een geaggregeerd resultaat. Klik op de twee pijltjes in de kolomkop van de kolom Table om deze verder open te klappen en klik op OK.
Doe dit nog twee keer tot jet het volgende overzicht krijgt:
Klik nu op het woord Table in de rij Header. Je krijgt nu de SessionID te zien.
Neem de waarde van de SessionID op in de parameter SessionID.
Klik nu op het woord Table in de rij Body.
Je krijgt nu onder meer de cluster URL te zien.
Gebruik deze url om de waardes voor de parameters URL_Process en URL_Session in te vullen:
- URL_Process = [cluster]/webservices/processxml.asmx?wsdl
- URL_session = [cluster]/webservices/session.asmx?wsdl
Selecteren administratie
De volgende stap is het toevoegen van de juiste administratie aan de zojuist aangemaakt sessie. Maak via New Source een Blank Query aan en geef deze de naam SelectCurrentCompany. Ga naar de advanced editor en voer de volgende code in:
let
Source = Xml.Tables(Web.Contents(“” & URL_Session &””
,[Content=Text.ToBinary(”
<soap:Envelope xmlns:soap=”&Character.FromNumber(34)&”http://schemas.xmlsoap.org/soap/envelope/”&Character.FromNumber(34)&” xmlns:xsi=”&Character.FromNumber(34)&”http://www.w3.org/2001/XMLSchema-instance”&Character.FromNumber(34)&” xmlns:xsd=”&Character.FromNumber(34)&”http://www.w3.org/2001/XMLSchema”&Character.FromNumber(34)&”>
<soap:Header>
<Header xmlns=”&Character.FromNumber(34)&”http://www.twinfield.com/”&Character.FromNumber(34)&”>
<SessionID>”& SessionID &”</SessionID>
</Header>
</soap:Header>
<soap:Body>
<SelectCompany xmlns=”&Character.FromNumber(34)&”http://www.twinfield.com/”&Character.FromNumber(34)&”>
<company>XXXXX</company>
</SelectCompany>
</soap:Body>
</soap:Envelope>
“),Headers=[#”Content-Type”=”text/xml;charset=UTF-8”]]))
in
Source
Voeg tussen de tags <company>XXXX</company> het Twinfield administratie nummer in.
Het resultaat van deze query is weer een geaggregeerde tabel. Als je deze verder openklapt zie je in de kolom SelectCompanyResult ‘OK’ staan, hetgeen betekent dat het selecteren van de administratie gelukt is.
Ophalen transacties
We hebben nu een sessie en een verbinding met de juiste administratie. De volgende stap is het ophalen van transacties.
Maak via New Source een Blank Query aan en geef deze de naam Twinfield_Transacties.
Ga naar de advanced editor en voer de volgende code in:
let
Source = Xml.Tables(Web.Contents(“”& URL_Process &””
,[Content=Text.ToBinary(”
<soapenv:Envelope xmlns:soapenv=”&Character.FromNumber(34)&”http://schemas.xmlsoap.org/soap/envelope/”&Character.FromNumber(34)&” xmlns:twin=”&Character.FromNumber(34)&”http://www.twinfield.com/”&Character.FromNumber(34)&”>
<soapenv:Header>
<twin:Header>
<twin:SessionID>”& SessionID &”</twin:SessionID>
</twin:Header>
</soapenv:Header>
<soapenv:Body>
<twin:ProcessXmlString>
<twin:xmlRequest><![CDATA[
<columns code=’030_1′>
<column><field>fin.trs.head.office</field><label>Administratie</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from></column>
<column><field>fin.trs.head.officename</field><label>Adm.naam</label><visible>true</visible><ask>false</ask><operator>none</operator></column>
<column><field>fin.trs.head.year</field><label>Jaar</label><visible>true</visible><ask>true</ask><operator>none</operator><from>2018</from></column>
<column><field>fin.trs.head.period</field><label>Periode</label><visible>true</visible><ask>true</ask><operator>none</operator></column>
<column><field>fin.trs.head.yearperiod</field><label>Jaar/periode (JJJJ/PP)</label><visible>false</visible><ask>true</ask><operator>between</operator><from>2018/03</from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.head.code</field><label>Dagboek</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.head.number</field><label>Boekingsnummer</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.head.status</field><label>Status</label><visible>true</visible><ask>true</ask><operator>equal</operator><from>normal</from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.head.date</field><label>Boekdatum</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.line.dim1</field><label>Grootboekrek.</label><visible>true</visible><ask>true</ask><operator>between</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.line.dim1name</field><label>Grootboekrek.naam</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.line.dim1type</field><label>Dimensietype 1</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.line.basevaluesigned</field><label>Basisbedrag</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
<column><field>fin.trs.line.debitcredit</field><label>D/C</label><visible>true</visible><ask>false</ask><operator>none</operator><from></from><to></to><finderparam></finderparam></column>
</columns>
]]></twin:xmlRequest>
</twin:ProcessXmlString>
</soapenv:Body>
</soapenv:Envelope>
“),Headers=[#”Content-Type”=”text/xml;charset=UTF-8”]]))
in
Source
We maken hier gebruik van de Browse data optie van de Twinfield API.
Meer informatie hierover is te vinden op de website van Twinfield: https://c3.twinfield.com/webservices/documentation/#/ApiReference/Request/BrowseData
We gebruiken hier Browse code 030_2.
Vervolgens worden verschillende kolommen gedefinieerd die we willen ophalen.
Bij de kolommen fin.trs.head.year (=2018) en fin.trs.head.yearperiod (van 2018/03 tm 2018/03) hebben we tevens een filter opgenomen, zodat we in dit geval niet gelijk te veel data ophalen.
Als resultaat krijgen we weer een geaggregeerd resultaat.
Klap de tabel open tot je het volgende overzicht krijgt in de kolom ProcessXmlStringResult
Converteren resultaat
Het resultaat vanuit Twinfield staat hier in 1 kolom en moeten we converteren naar een normale tabel structuur.
Selecteer de kolom ProcessXmlStringResult en ga in het lint in de tab Transform naar Convert to list
Kies nu voor Parse en dan de optie XML
Klik in het volgende overzicht de kolom ‘tr’ en vervolgens ‘tr.td’ open.
Je ziet dat de gegevens van 1 transactie nu in meerdere rijen zijn opgenomen in plaats van netjes in één rij.
Dit gaan we omzetten de optie Pivot columns. Klap eerst de kolom ‘tr.key’ open. Verwijder de kolommen die je verder niet meer nodig hebt , zoals th en de kolommen beginnend met ‘attribute’.
Selecteer de kolom tr.td.Attribute.Fields en kies in het lint voor Pivot column
Kies bij Values column voor tr.td.Elements: Tekst en bij de Aggregate Value Function voor Don’t aggregate
Alle transacties komen nu netjes per transacties in een rij te staan en kunnen nu verder gebruikt worden in Power BI.
Afsluiting
Naast Exact Online en AFAS kunnen ook de gegevens uit Twinfield rechtstreeks in Power BI worden ingeladen. Het vraagt een aantal stappen, maar met de juiste queries kunnen alle gegevens prima uitgelezen worden.
Een vervolgstap kan zijn om van het opvragen van een sessionID en het cluster functies te maken die automatisch worden overgenomen in vervolg gegevens aanvragen.
Wellicht stof voor een volgende blog.
Meer weten over onze oplossingen?
Onze consultants hebben veel ervaring binnen een grote verscheidenheid aan branches.
Eens verder brainstormen over de mogelijkheden voor jouw organisatie?
Maak kennis met onze specialist Arnoud van der Heiden.
Wellicht herkent u een van deze vraagstukken.
Inmiddels hebben wij ruime ervaring opgedaan met Business Intelligence. Wij staan ook u graag te woord bij vragen of opmerkingen.
Business Intelligence (BI) is het technologie gedreven proces van gegevensanalyse dat bedrijven in staat stelt om waardevolle inzichten te halen uit hun gegevens. BI-oplossingen kunnen helpen bij het verzamelen, analyseren en presenteren van bedrijfsgegevens om betere beslissingen te nemen en concurrentievoordeel te behalen.
BI richt zich op het verzamelen, analyseren en presenteren van historische en huidige gegevens om bedrijfsprestaties te meten en te rapporteren. BA daarentegen richt zich meer op het voorspellen van toekomstige trends en mogelijkheden door geavanceerde analysemethoden en -modellen toe te passen op gegevens.
Het gebruik van BI-oplossingen kan bedrijven helpen om hun prestaties te verbeteren, betere beslissingen te nemen en concurrerend te blijven. Het kan hen helpen om inzicht te krijgen in klantgedrag, trends te identificeren, kosten te verlagen, de efficiëntie te verbeteren en nieuwe zakelijke kansen te ontdekken.
Growteq biedt verschillende BI-oplossingen aan, waaronder Power BI van Microsoft, QlikView en Qlik Sense, Tableau en SAP BusinessObjects. Elk van deze oplossingen heeft zijn eigen sterke punten en functies, en kan worden aangepast aan de behoeften van een bedrijf.
Ja, Growteq kan bedrijven helpen bij het implementeren van BI-oplossingen door het bieden van strategisch advies, consultancy en implementatiediensten. Ze werken samen met klanten om oplossingen op maat te maken die aan hun specifieke behoeften voldoen en hen helpen om waarde te halen uit hun gegevens.
De kosten van BI-oplossingen kunnen variëren afhankelijk van de grootte van het bedrijf, de omvang van de implementatie en de gekozen oplossing. Growteq werkt samen met klanten om oplossingen te vinden die passen bij hun budget en behoeften. De voordelen van het gebruik van BI-oplossingen kunnen echter vaak opwegen tegen de kosten, omdat ze bedrijven kunnen helpen om hun prestaties te verbeteren en hun concurrentievoordeel te behalen.
De implementatie van een BI-oplossing omvat meestal de volgende stappen:
- Definiëren van de doelstellingen en vereisten van het BI-project
- Verzamelen en integreren van relevante gegevens uit verschillende bronnen
- Het ontwikkelen van een datawarehouse om de gegevens op te slaan in een logisch model
- Implementatie van dashboards, KPI’s en visualisatie voor gegevenspresentatie
- Training van medewerkers
- Continue monitoring en optimalisatie van de BI oplossing
BI maakt verschillende soorten analyses mogelijk, waaronder:
- Descriptive analyse: Hierbij worden historische gegevens gebruikt om te begrijpen wat er in het verleden is gebeurd.
- Diagnostische analyse: Hierbij wordt onderzocht waarom bepaalde gebeurtenissen of trends zich hebben voorgedaan
- Voorspellende analyses: Hierbij worden gegevens en modellen gebruikt om toekomstige gebeurtenissen en trends te kunnen voorspellen
- Prescriptive analyse: Hierbij worden aanbevelingen gedaan over mogelijke acties op basis van analyse en voorspelling
Enkele populaire BI-tools zijn o.a.:
- Microsoft Power BI
- QlikView
- Qlik Sense
- Tableau
- MicroStrategy
- IBM Cognos
Business Intelligence (BI) kan gegevens uit verschillende bronnen gebruiken, zoals:
- Interne databases en systemen (bijv. CRM-systemen, ERP-systemen)
- Externe gegevensbronnen (bijv. marktonderzoekgegevens, sociale media)
- Gestructureerde gegevens (bijvoorbeeld databases en spreadsheets)
- Ongestructureerde gegevens (bijv. tekstuele gegevens, e-mails, logboeken etc.)
- Big data-bronnen (bijv. sensorgegevens, weblogs)
Growteq heeft ervaring met al deze bronnen.
Selfservice BI verwijst naar het vermogen van niet-technische gebruikers om zelfstandig gegevens te verkennen, te analyseren en rapporten en dashboards te maken met behulp van gebruiksvriendelijke BI-tools. Enkele voordelen van selfservice BI zijn o.a.:
- Verminderde afhankelijkheid van IT-afdelingen voor rapportage en analyses
- Snellere besluitvorming doordat gebruikers direct toegang hebben tot benodigde gegevens
- Verhoogde flexibiliteit en aanpasbaarheid bij het verkennen van gegevens
- Stimuleert gegeven gestuurde cultuur binnen de organisatie
5 reacties. Leave new
Dit leek mij interessant en ik heb deze stappen gevolgd. PowerBI gaf bij invoeren van de stuk code voor het selecteren van een administratie een foutmelding ” Token comma expected” bij regel 36: “),Headers=[#”Content-Type”=”text/xml;charset=UTF-8”]])). PowerBI viel over de “)
Klopt dit stukje?
Beste Daniel,
Het lijkt erop dat het stukje code dat geplakt is in de blog een paar opmaak tekens anders heeft geinterpreteerd als bedoeld. Ik heb de code vervangen in de blog.
Dit zou de juiste moeten zijn voor het eerste onderdeel:
[dm_code_snippet background="yes" background-mobile="yes" slim="yes" line-numbers="yes" bg-color="#2c3e50" theme="dark" language="php" wrapped="no" height="" copy-text="Copy Code" copy-confirmed="Copied"]
let
Source = Xml.Tables(Web.Contents(""& URL_Logon &""
,[Content=Text.ToBinary("
<soap:Envelope xmlns:soap="&Character.FromNumber(34)&"http://schemas.xmlsoap.org/soap/envelope/"&Character.FromNumber(34)&" xmlns:xsi="&Character.FromNumber(34)&"http://www.w3.org/2001/XmlSchema-instance"&Character.FromNumber(34)&" xmlns:xsd="&Character.FromNumber(34)&"http://www.w3.org/2001/XmlSchema"&Character.FromNumber(34)&">
<soap:Body>
<Logon xmlns="&Character.FromNumber(34)&"http://www.twinfield.com/"&Character.FromNumber(34)&">
<user>"& User &"</user>
<password>"& Password &"</password>
<organisation>"& Organisation &"</organisation>
</Logon>
</soap:Body>
</soap:Envelope>
"),Headers=[#"Content-Type"="text/xml;charset=UTF-8"]]))
in
Source
[/dm_code_snippet]
Top dit werkt perfect. Bedankt hiervoor. Hebben jullie ook al een blog gemaakt over het automatisch overnemen van het sessionID en het cluster? Of heeft iemand een linkje waarin beschreven wordt hoe dit te doen? Dan wordt het helemaal super.
Bedankt
Rob
Beste Rob
Dit hebben we nog niet in een blog verwerkt. Twinfield gaat ook over op de authenticatie met OAUTH en OpenID. Dat werkt net iets anders.
Wellicht kun je eens kijken naar de Power BI Twinfield connector die door een collega van Growteq is ontwikkeld: https://growteq.nl/business-intelligence-bi/koppelingen/boekhoud-software/twinfield-en-power-bi/ Hierin is alles al helemaal geregeld.
Dankje voor de tip Gideon!