Greg On Dynamics Ax

Random thoughts about development using Dynamics AX and .Net

AIF Pipeline Example

with 4 comments

In my last post (Top 5 AIF Development Tips and Tricks) I mentioned how you can use the AIF to transform external messages into the format that AX expects. This post elaborates upon that tip with a more detailed example.

Suppose you want to import currency exchange rates.

AX has an action for this out of the box – createListExchangeRates, and will happily accept a message similar to this:

<ExchangeRates xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/ExchangeRates">
    <DocPurpose>Original>/DocPurpose>
    <ExchRates>
        <CurrencyCode>GBP</CurrencyCode>
        <ExchRate>1.71</ExchRate>
        <FromDate>2009-09-21<FromDate>
        <ToDate>2009-09-22</ToDate>
    </ExchRates>
</ExchangeRates>

Thats all well and good if you have control over the schemas of any inbound messages.
Most likely this is not the case, say for example you want to import the exchange rates for the euro from the european central banks daily published list (http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml).

If you try and receive this it will fail on two counts:
1) It is not wrapped in an envelope (which is used by the AIF to identify the message sender and destiation) and
2) the format of the exchange rate does not match AX schema.

To solve problem 1) you can make use of the¬†‘Wrap XML in AIF envlope’¬†program available from axaptapedia here:www.axaptapedia.com/AIFEnvelopeTool

To solve 2) you can use the pipeline to specify an XSLT to transform the message, the XSLT to perform the transformation for this example is:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:ax="http://schemas.microsoft.com/dynamics/2006/02/documents/ExchangeRates" 
  xmlns:ext="http://www.ecb.int/vocabulary/2002-08-01/eurofxref" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" 
  exclude-result-prefixes="ext xs xsi xsl gesmes" 
  xmlns="http://schemas.microsoft.com/dynamics/2006/02/documents/ExchangeRates">    
  <xsl:namespace-alias stylesheet-prefix="ax" result-prefix="#default" />
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="gesmes:Envelope">
      <ax:ExchangeRates>          
          <xsl:variable name="root" select="." />          
          <xsl:for-each select="$root/ext:Cube/ext:Cube">
            <xsl:variable name="xrateDate" select="$root/ext:Cube/ext:Cube/@time" />
              <xsl:for-each select="$root/ext:Cube/ext:Cube/ext:Cube">
              <ax:ExchRates>
                <xsl:attribute name="class">
                  <xsl:value-of select="'entity'" />
                </xsl:attribute>
                <ax:CurrencyCode>
                  <xsl:value-of select="@currency" />
                </ax:CurrencyCode>
                <ax:ExchRate>
                  <xsl:value-of select="@rate" />
                </ax:ExchRate>
                <ax:FromDate>
                  <xsl:value-of select="$xrateDate" />
                </ax:FromDate>
                <ax:ToDate>
                  <xsl:value-of select="$xrateDate" />
                </ax:ToDate>
              </ax:ExchRates>
            </xsl:for-each>
          </xsl:for-each>        
      </ax:ExchangeRates>         
    </xsl:template>  
</xsl:stylesheet>

After running the AIF inbound service upon last weeks exchange rates it results in the following data being created (US Dollar highlighted):

Exchange rates AX form

Exchange rates AX form

About these ads

Written by gregondax

October 26, 2009 at 8:00 am

4 Responses

Subscribe to comments with RSS.

  1. Thanks for these tips – you helped us no end getting an AIF import working.

    It might be useful to know that you can also add in the AX envelope using XSLT and an external transform tool (http://www.altova.com/altovaxml.html is free).

    Here’s the XSLT that does this (for the create action)…

    “MYDOMAIN\MYUSER”
    “MYENDPOINT”
    “http://schemas.microsoft.com/dynamics/2008/01/services/MyService/create”

    We also found that using altovaxml to validate our import documents against the AX schema before wrapping them with the envelope helped us identify faults in the document format that AX simply would not tell us about (other than to say that XML didn;t comply with the schema).

    Malcolm Burtt

    November 4, 2009 at 5:57 pm

    • Thanks for the positive feedback Malcolm.
      I’ll certainly have a look at the Altova tool you recommend.

      gregondax

      November 4, 2009 at 8:50 pm

      • I Just realised my XSLT code didn’t come through onto the previous replay so I’ll try again…

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:n="http://schemas.microsoft.com/dynamics/2008/01/documents/message"
        xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs xsi xsl"
        xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/message">
        <xsl:namespace-alias stylesheet-prefix="n" result-prefix="#default"/>
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
        <xsl:template match="/">
        <n:Envelope>
        <n:Header>
        <n:SourceEndpointUser>MYDOMAIN/MYUSER</n:SourceEndpointUser>
        <n:DestinationEndpoint>MYLOCALENDPOINT</n:DestinationEndpoint>
        <n:Action>http://schemas.microsoft.com/dynamics/2008/01/services/MYService/create"</n:Action>
        </n:Header>
        <n:Body>
        <n:MessageParts>
        <xsl:copy-of select="node()"/>
        </n:MessageParts>
        </n:Body>
        </n:Envelope>
        </xsl:template>
        </xsl:stylesheet>

        Malcolm Burtt

        November 5, 2009 at 9:59 am


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: