Tuesday, September 30, 2014

The nuts and bolts of Lync / Presence / IM integration

I recently had to figure out what makes the "Presence" integration tick. I didn't find any really good explanations to work from, so here I'll try sum up the bits that makes this work. I'll try to boil the information down to the bare minimum of what you need to know. The feature is actually very flexible and I don't want this to be a very long post with information about tons of ways to use it.

Okay, first of all you'll need to have a Lync client installed along with your AX client. And you need to be logged into Lync with your account for that.

Next you'll need to add some contacts in AX. You must create an address of type e-mail and fill the address with the e-mail address this contact uses for instant messaging (IM). Please observe that some people have different e-mail addresses for regular e-mail and for IM.

In the contact form you must click the More options / Advanced button and check the "Instant messenger sign-in" check box. This tells AX to use this particular address of the contact when integrating with Lync. If the address is only used for IM and not also for regular e-mail, check the "Instant message" check box too.

When you want to show the presence indicator next to a field on a form, there are three properties of the form field to consider:
  • PresenceIndicatorAllowed. I assume you can guess what this controls.
  • PresenceDataSource and PresenceDataField. This is the datasource and datasource field from the form that holds data used to find the right contact with.
The last thing, is to control how the contact person is found and set up a PresenceInfo object. 

There are different approaches for different kinds of key data. Here AX looks at the extended data source of the PresenceDataField that you specified on the form field. 

On the extended data type there are two properties pointing to the class method doing the job of finding the contact person. The properties are PresenceClass and PresenceMethod. I think all standard implementations of these point to the DirPresenceInfo class as the PresenceClass. If you examine this class you can see how it based on different kinds of keys finds the right contact person and creates a PresenceInfo object for the contact.

That's all.

Tuesday, September 16, 2014

Send tweets from AX via the Retail module

Once again I fell over some objects with interesting names in the retail code. This time I learned that you can update Twitter and Facebook from AX.

In the following I'll describe the Twitter setup.

First of all, you need to setup an application under your Twitter account. Go to to do that. Under settings, you need to fill in:
  • Name: This will be the name of your application. Mine is called PalleAgermarkTest.
  • Description: This shows up when for example you later on link the application to be able to use your Twitter account.
  • Website: This should be a website where users can download the application. Since I don't have a real application, I have just put the address of my blog.
  • Callback URL: This is needed when AX links the application to your Twitter account. Again, the address is not important (but an address is needed) for this demonstration and I have again put the address of my blog here.
On the API tab of the setup, you'll get an API key and an API secret. You will need these in AX.

On the Permissions tab, give the application write access to the Twitter accounts that sign up to the application:

That's it for Twitter.

Go to Retail \ Setup \ Parameters \ Retail parameters to setup some seed data for the retail module. Click the Initialize button:

Now in AX, go to Retail \ Setup \ Parameters \ Retail shared parameters and enter the API key secrets from above:

Then go to Sales and marketing \ Setup \ Campaigns \ Media types and add Twitter as a media type:

Now when clicking the Link account button, you should get the option to link your Twitter account (the screen clip is in Danish, but you should be able to get the idea):

So now all the bits and pieces are setup, and a very simplified piece of code like this example is able to post to Twitter:

static void Tweet(Args _args)
    smmCampaignMediaTypeGroup           mediaTypeGroup;
    RetailMediaChannelConnectorSettings settings;
    RetailMediaChannelTwitterConnector  connector;
    RetailMediaChannelMessage           message;

    select firstOnly TableId from mediaTypeGroup
        where mediaTypeGroup.CampaignMediaTypeDescription == 'Twitter'
    join settings
        where settings.smmCampaignMediaTypeGroup == mediaTypeGroup.CampaignMediaTypeId;

    connector = RetailMediaChannelTwitterConnector::construct(settings);
    message = RetailMediaChannelMessage::construct();
    message.parmMessage("Tweet from AX");

The result:

Saturday, September 13, 2014

Dimension Defaulting on MSDN blogs

The Microsoft Dynamics AX GFM team have written up a great seven part series about dimension defaulting. Read it here:

This would really have been helpful information to get when this new framework was released, but better later than never I guess.

Thursday, September 11, 2014

Normalization pattern for custom fields in separate table

When you need to add fields to standard tables, you can choose to add them to a new linked table rather than to the standard table.

If you do that, you might find the pattern for normalization for county/region fields useful.

Have a look at the White Paper "Adapting your code to table normalization for country/region fields in Microsoft Dynamics AX 2012 R2"