Fun with Microsoft Flow, What3Words and Flic Button

By365KAdmin

Fun with Microsoft Flow, What3Words and Flic Button

There’s some really cool IOT stuff going on, and its getting easier to get involved and have a go.

I thought in this blog I would have a play with a couple of tools and see what we could do. Hopefully it’ll inspire you to have a go and improve!

For this article I am going to use:

  • Microsoft Flow
  • What3Words 
  • Flic

Before I go any further, lets just have a quick overview of these tools.

Microsoft Flow

Microsoft Flow is a tool that can integrate cloud-based apps and services so they interact with each other seamlessly. According to Microsoft, this cloud-based tool improves efficiency and productivity by enabling virtually anyone in an organization to automate many tedious and time-consuming business tasks and processes without developer intervention.

What3Words

what3words provides a precise and incredibly simple way to talk about location. We have divided the world into a grid of 3m x 3m squares and assigned each one a unique 3 word address.

Flic

Flic Buttons are a Smart Button that can be linked to a number of services. The button can be programmed to perform actions via an app or a hub, and can even trigger Microsoft Flows

I know with the Flic button a message with your coordinates can be sent, so I was interested to see if we could Parse that message through Microsoft Flow, run it through the What3Words API then action something with the results.

The resulting flow takes looks like this:

So lets run through it.

Theres a couple of things you need to do with the Flic button to set this up. 

In the Flic App on your phone or other device, you need to setup your connection to Microsoft Flow, and its really important that you choose to send location data:

Once this is done, log in to Microsoft Flow and create a new flow from Blank. You will then be able to add a Flic button as a trigger – the first time you do this, you’ll need to add your Flic account as a connection. You’ll then get to choose which button and which action

Next add an HTTP action. If your connection to Flic is successful, then you’ll have the output from the button press as options to feed in to your HTTP (in this case it is to access the What3Words API ( this is assuming you have already signed up to the What3Words API here and have an API key.

So here we have added the What3Words URI, and as you’ll see added the output from the Flic button as the coordinates. You’ll also need to add your API key as shown in the URI after &Key= and in the Value field.

Once this is completed, the returning JSON needs to be Parsed, so add the Parse JSON action. 

For the Schema, I used the “Use Sample Payload” option and the example on the What3Words Documentation here but just in case, here it is:

{
    "country": "GB",
    "square": {
        "southwest": {
            "lng": -0.195543,
            "lat": 51.520833
        },
        "northeast": {
            "lng": -0.195499,
            "lat": 51.52086
        }
    },
    "nearestPlace": "Bayswater, London",
    "coordinates": {
        "lng": -0.195521,
        "lat": 51.520847
    },
    "words": "filled.count.soap",
    "language": "en",
    "map": "https://w3w.co/filled.count.soap"
}                           

Finally, for this example I took the Parsed data, and added it to an email, but you could just as easily create a record in Dynamics 365 etc

And that should be it! If all works you’ll get lots of lovely ticks on your flow, and an email with your 3 word location, and a link to the map:

The possibilities are endless with these sort of tools. The whole process took less than an hour, and the only “Code” was the JSON payload that I copied and pasted!

Have a go.

By365KAdmin

Microsoft AZ-900 Certification

I’m pleased to say I have just passed the AZ-900 exam.

Although my main area of expertise is and always has been Dynamics 365 (CRM), I find myself getting more and more involved with the wider Microsoft Business Solutions Ecosystem, and that includes Azure. 

Whether its Logic Apps for workflow, or Service Bus for integration, I find most weeks I’m delving in to Azure.

For those thinking of taking the exam, I have to say I didn’t find it too difficult, and there are so many resources available to make sure you’re up to speed.

As a starting point, it’s always worth checking out the  details of what you’ll be examined on. for AZ-900, the details can be found here 

If you want some great training, and have a limited budget, I cannot recommend Microsoft Learn highly enough – Partly because it’s free, but mostly because it’s awesome! and getting better almost daily.

By365KAdmin

Dynamics 365 User Access Report with FetchXml and Power BI

Ok, so that’s not the snappiest of titles, but essentially it’s my lazy way of covering a couple of topics in one blog post:

  1. Need to report on Licensed Users and When they Last Accessed Dynamics
  2. Showing that in a Power BI Report using FetchXML

It’s worth noting at this point, how fantastic the Dynamics 365, and generally the Microsoft community is. Most of what I did has already been done and blogged about for free. I’ve tried to reference everyone who’s blog posts helped me.

So the first thing I needed was some fetch to give me the last logged in (or Access in Audit entity terms) for users.  I got the following from www.mscrmsolution.com but could have hand crafted in FetchXML Builder in XrmToolbox

<fetch aggregate='true' >
    <entity name='audit' >
    <attribute name='createdon' alias='LastAccessTime' aggregate='max' />
    <filter>
        <condition attribute='operation' operator='eq' value='4' />
        <condition entityname='su' attribute='isdisabled' operator='eq' value='0' />
    </filter>
    <link-entity name='systemuser' from='systemuserid' to='objectid' alias='su' >
        <attribute name='systemuserid' alias='SystemUserId' groupby='true' />
        <attribute name='domainname' alias='DomainName' groupby='true' />
        <attribute name='fullname' alias='FullName' groupby='true' />
    </link-entity>
    </entity>
    </fetch>

Couple of things worth noting here. Operation = 4 which is the Access record in the Audit (as opposed to Update, Create etc)

So at this point, I had the first piece done, as all I initially wanted was a way to see how long it was since users logged in. To get a quick view I just pasted the results in Excel and used a formula to calculate the days.

What I actually wanted to do was create a Power BI report that would connect to Dynamics, and use this FetchXml dynamically.

Ulrik Carlsson (CRMChartGuy) has a great post on this, and all credit to him for the following. (You may want to read his post in entirety, as I have summarized some bits)

Firstly open up your Power BI desktop, and choose Get Data –> Web

When this opens choose the Advanced option

So there a few steps here to get the connection working:

  1. The Service Root URL that you would otherwise use in Power BI https://MYCRMORG.api.crm.dynamics.com/api/data/v9.1/
  2. The PLURAL name of the entity schemaname follow by ?fetchXml=
    Example: audits?fetchXml=
  3. The FetchXML above, encoded as a URL (You can get this encoded at 
    https://www.freeformatter.com/url-encoder.html )
  4. Type in “Prefer” – it is not option you can select
  5. Exactly type: odata.include-annotations=”OData.Community.Display.V1.FormattedValue” (Important that you type in the Quote marks to avoid formatting issues)

Click OK

Open up the Query Editor

Click on “To Table” in the convert area, then click on the expand button (two arrows pointing away from each other)

And there you have it…..A live power BI report showing users access.

I’m not going to go in to how to “Pretty” the report up, I’ll leave that to you! 

The process above would be the same for any FetchXml query, and if you don’t need to hand craft the Fetch, then you can start with an Advanced Find, and export it out.

By365KAdmin

You Say Flow, I Say Logic Apps

I’ve been using Flow for quite a while, but recently started utilising Azure Logic Apps for some pieces of work. On one of the forums I frequent, someone asked the question “What’s the difference between Flow and Logic Apps”.

Well the quick and simple answer is that in a lot of ways, they’re the same thing……

However, that’s not the real answer or the complete picture. There are a few differences that might help you decide which to use in specific circumstances.

There’s a really good overview of the similarities and differences here, but it’s summed up nicely by this:


Microsoft Flow and Logic Apps are both designer-first integration services that can create workflows. Both services integrate with various SaaS and enterprise applications.
Microsoft Flow is built on top of Logic Apps. They share the same workflow designer and the same connectors.
Microsoft Flow empowers any office worker to perform simple integrations (for example, an approval process on a SharePoint Document Library) without going through developers or IT. Logic Apps can also enable advanced integrations (for example, B2B processes) where enterprise-level Azure DevOps and security practices are required. It’s typical for a business workflow to grow in complexity over time. Accordingly, you can start with a flow at first, and then convert it to a logic app as needed.

There’s loads of resources available to help get started, and decide which way to go. Here’s a couple of quick summaries

As I have mentioned before, Microsoft Learn has some great resources, and there is a really good Flow Learning Path to get you started. Nothing as yet on Learn for Logic Apps, but I’m sure there will be soon.

For me, when I looked at an integration with an external API, to be used across the whole enterprise, I decided to base it on Logic Apps. Whereas when I wanted a small solution to move attachments from Dynamics 365 to OneDrive (on my own companies Dynamics 365 instance) Flow was fine.

As we move to a more Serverless architecture, SaaS and PaaS solutions like Flow and Logic Apps are giving the power of integration and communication back in to the hands of the Power User, and not just the remit of the coder. The turn around and potential for Tech Debt is reduced (in my opinion), and is a very exciting step forward.

By365KAdmin

Learn More With….. Microsoft Learn!

I’m pretty well Microsoft through and through. However a few years ago I had a detour in to the depths of the realm know as Salesforce (It’s fine, I’m ok now)…..

Seriously though, There are a few things that Salesforce do quite well, and one of the things I thought they did well was Trailhead. Trailhead was an online, free learning platform which has a gamification feel about it, and allowed users to acquire the skills needed to be anything from a good user to a Salesforce Dev.

I always thought it was a great concept and executed really well, and something Microsoft could take note of.

Well…….

A few years forward and we have Microsoft Learn!

Now I have to say, the look and feel is very similar to Trailhead, but that’s not a bad thing, after all, Salesforce did it well.

So what can you learn? Well there’s lots of Learning paths you can take including Azure, Dynamics, Power BI and more, but as I’m well and truly entrenched in the Powerapps/Dynamics space, this is the Path I chose, and there really is some great modules.

The modules are so well put together, and really informative. If you’re going through one of the Azure modules, you even get a Sandbox instance right in the browser to work through the lesson

So give it a go…. Learn something new today.

By365KAdmin

Integration With Dynamics 365 CE And Companies House API – Azure Logic App

Introduction and Background

Before I start the overview of this process, I think it’s worth noting that over the last few years, the options for integration, and to be fair, any sort of extension and development in Dynamics 365 has/is shifting from being a C# development only domain, or at least a coding exercise, to giving us the option to do this via an extensive toolset – Azure, Office 365 to mention a few.

So for this example – Integration of data from an external data source – I will be going through the process in what I consider the easiest and lowest overhead in terms of coding. Yes there are a number of different options for achieving this, and coding something is one of those, but my favourite expression at the moment is “Don’t crack a walnut with a sledgehammer”.

So a couple of assumptions in terms of your setup. You’ll need:

  • An Azure Account
  • Dynamics 365 Instance
  • A perfunctory understanding of API’s and JSON

The use case for this integration is to call out to the Companies House API and pull back some company data in to Dynamics 365. There is a lot of information stored there about Ltd Companies in the UK, and could be really useful.

The Companies House API is still in Beta……to be fair it’s been Beta for a couple of years, but seems fairly stable, and there is a wealth of documentation and a forum. You will need to create an account on the site in order to access and use the API’s.

You can do this, and access the documentation and Forum here: https://developer.companieshouse.gov.uk/api/docs/

The process is going to be something like this:

So one of the first things you’ll need to do once you have created an account on the Companies House website is register an application. This process then assigns you an API Key used for authentication. There a few options for type of API, and restriction of IP addresses etc, but for this example we’ll go for a REST API. Once this is completed, you’ll get an API key.

The next step is to setup you Azure Logic App. I’ll skip the bits around setting up Resource Groups etc. CLick on Create Resource, Integration then Logic App:

Add the details:

Once this is all done, you can start to build out your logic. When your resource is ready you can navigate to it. If you’re familiar with Microsoft Flow, you might recognise some similarities.

There’s a reason why Logic Apps and Flow look similar. Flow is built on top of Logic Apps. You can read more details about the similarities and differences here

Click on the Blank Logic App and add the trigger for Dynamics 365. In this example I am going to trigger the integration when a new Account is created, but it could also be when a record is updated and so on.

So the next stage is to use the HTTP connector set it up to point to the Companies House API. For authentication use Raw, and you’ll only need the value (no need for username and password)

You’ll also notice that the URI is appended with a Dynamics Field, in this case the Account Number field which needs to store the Company number, as this is the format for searching for the company. Obviously that means you need to know the company number!

Once the HTTP is set, you need to Parse the resulting JSON. For this you need the Parse JSON Operation. Here you will set the Schema for the returning JSON.

For the GET Company Schema use the following:

{
    "properties": {
        "accounts": {
            "properties": {
                "accounting_reference_date": {
                    "properties": {
                        "day": {
                            "type": "string"
                        },
                        "month": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "last_accounts": {
                    "properties": {
                        "made_up_to": {
                            "type": "string"
                        },
                        "period_end_on": {
                            "type": "string"
                        },
                        "period_start_on": {
                            "type": "string"
                        },
                        "type": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "next_accounts": {
                    "properties": {
                        "due_on": {
                            "type": "string"
                        },
                        "overdue": {
                            "type": "boolean"
                        },
                        "period_end_on": {
                            "type": "string"
                        },
                        "period_start_on": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "next_due": {
                    "type": "string"
                },
                "next_made_up_to": {
                    "type": "string"
                },
                "overdue": {
                    "type": "boolean"
                }
            },
            "type": "object"
        },
        "can_file": {
            "type": "boolean"
        },
        "company_name": {
            "type": "string"
        },
        "company_number": {
            "type": "string"
        },
        "company_status": {
            "type": "string"
        },
        "confirmation_statement": {
            "properties": {
                "last_made_up_to": {
                    "type": "string"
                },
                "next_due": {
                    "type": "string"
                },
                "next_made_up_to": {
                    "type": "string"
                },
                "overdue": {
                    "type": "boolean"
                }
            },
            "type": "object"
        },
        "date_of_creation": {
            "type": "string"
        },
        "etag": {
            "type": "string"
        },
        "has_been_liquidated": {
            "type": "boolean"
        },
        "has_charges": {
            "type": "boolean"
        },
        "has_insolvency_history": {
            "type": "boolean"
        },
        "jurisdiction": {
            "type": "string"
        },
        "last_full_members_list_date": {
            "type": "string"
        },
        "links": {
            "properties": {
                "filing_history": {
                    "type": "string"
                },
                "officers": {
                    "type": "string"
                },
                "persons_with_significant_control": {
                    "type": "string"
                },
                "self": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "registered_office_address": {
            "properties": {
                "address_line_1": {
                    "type": "string"
                },
                "address_line_2": {
                    "type": "string"
                },
                "locality": {
                    "type": "string"
                },
                "postal_code": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "registered_office_is_in_dispute": {
            "type": "boolean"
        },
        "sic_codes": {
            "items": {
                "type": "string"
            },
            "type": "array"
        },
        "status": {
            "type": "string"
        },
        "type": {
            "type": "string"
        },
        "undeliverable_registered_office_address": {
            "type": "boolean"
        }
    },
    "type": "object"
}

If all goes well, when you add the final Operation – Update Record – You should see all the returned data options:

Obviously the fields need to be available on the Dynamics 365 Accounts form.

Then….. Time to test!

Add a new Account in Dynamics and include the Company Number:

Once you save the record, the call is made to the Companies House APi, and returns any details it finds:

So this is very much a click and configure integration, but I think a nice use of the Logic App solution, and an easy integration with REST API’s.

By365KAdmin

Show Image if field value equals…

Before I start, a massive shout out to Charles Osei .As part of the TDG team, we had a discussion, and his solution totally solved the requirement I had. Also another great example of how a collaborative group can work.

Had a requirement recently to show something a little more visual on a record form if a tick box was chosen…… something that would immediately show the user the status or conditions on a record.
In this example, were going to show Icons for Key Accounts and Sensitive Accounts at the top of the form if the corresponding fields are ticked.

Firstly, find your icons. For me I decided on a key for the Key Accounts, and an exclamation for the sensitive accounts, but I also added some text:

These need to be added to Dynamics as Web Resources.

Next add a section on your account form (I added a 3 column one) and add the two new icon web resources to it. Make sure you untick the box “Visible by Default” for each web resource.

You also need to add your radio buttons on the form – in my case one for Key Account and One for Sensitive.

Once these are all on, save and publish.

Next create a new web resource of type Script (JScript).

//Shows/hides keyaccount img webresouce based on a tickbox two option field

function alertpic (executionContext) 
{
    var formContext = executionContext.getFormContext();
	
    var keyaccount = formContext.getAttribute("uob_keyaccount").getValue();
	
    if (keyaccount === true) {
        formContext.getControl("WebResource_keyacc").setVisible(true);
    }
    else {
        formContext.getControl("WebResource_keyacc").setVisible(false);
    }
}

//Shows/hides sensacc img webresouce based on a tickbox two option field

function sensalert (executionContext) 
{
    var formContext = executionContext.getFormContext();
	
    var sensacc = formContext.getAttribute("uob_sensitiveaccount").getValue();
	
    if (sensacc === true) {
        formContext.getControl("WebResource_sensacc").setVisible(true);
    }
    else {
        formContext.getControl("WebResource_sensacc").setVisible(false);
    }
}

So the first variable sets the context (this will be passed as a parameter when you call the function).

The second variable is the tick box field.

Then depending on the value (True/False) it shows or hides the Icon.

Don’t forget to call the function from both Onload and Onchange (On the field)

The result:

By365KAdmin

Using SSIS for Bulk Data Deletion in Dynamics 365

I had a situation recently that an instance (not one I managed I hasten to add!) had started to grow in storage, to the point that it was at nearly 200% capacity. I was asked to look at it. Turned out that Plugin Tracing had been switched on, and a plugin was throwing errors. Unfortunately there were now so many records in the Log file that it wouldn’t open (Usual generic unhelpful SQL Error).

Taking a quick look at organisation insights confirmed that this was consuming nearly 60gb of storage, and a quick record count (Using Record Counter in XrmToolBox) indication there was approaching 10,000,000 records.

Normally I would use the standard Bulk Delete option, however for a couple of reasons I didn’t think this was a viable option:

  1. It would take too long
  2. It kept falling over after 1000 deletes (probably due to the number of records, but I didn’t get to the bottom of it)

In the end I decided to go back to trusty old SSIS, and (again) the lovely KingswaySoft solution for Dynamics 365.

The steps are essentially:

  1. Create a CRM connection
  2. Retrieve what you want to delete (Using Dynamics Data Source Component)
  3. Delete

If you’ve used the SSIS Toolbox before, then you’ll know how to setup a connection.

To retrieve the data, I decided to go with FetchXML as I wanted to specify a date range, so the following was added to the Dynamics Source Data Flow:

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="plugintracelog">
    <attribute name="plugintracelogid" />
    <filter type="and">
      <condition attribute="createdon" operator="on-or-before" value="2018-11-20" />
    </filter>
  </entity>
</fetch>

So the Fetch above would pull back any log files created before 20/11/2018.

Once this is done, connect the Source to the destination, and open up the Destination Module

Add your connection in Connection Manager.
In Action, choose Delete.
In Destination Entity, choose the Plugintracelog entity

I enabled multithread, and chose 32 threads.

Once that is all done, Save, Build and Run.

By365KAdmin

JavaScript to show Form Notification

Just a quick one…..

Needed to show a notification on a form if an option set value = x

Used the following to get the text value, then show the Notification:

 

 

Add the function to an onload event, and the results:

By365KAdmin

Anonymising Data in Dynamics 365 with SSIS

So I don’t want to get in to the whole GDPR discussion in this article, but with GDPR in mind, I think it’s important, and potentially reduces risk, to anonymise data in a non production environment.

Again, there are plenty of articles on whether it should be a process of anonymising or pseudonymisation, but for the purpose of this article, I am going to go through the steps of using SSIS for the purpose of Anonymising Dynamics 365 Data.

Firstly, a few assumptions…..

You have Visual Studio and SSIS setup. I’m personally using VS 2015 Pro Update 3, SSDT.

You will also need a couple of essential Dynamics tools from the lovely people at KingswaySoft

SSIS Integration Toolkit for Microsoft Dynamics 365

SSIS Productivity Pack

They provide a developer license model to get you started.

Once you have everything downloaded and setup, then you’re ready to go.

Create a new SSIS Project

In Connection Manager, create a new connection

 

 

 

 

 

 

 

Next, drag over the following components:

  • Dynamics CRM Source
  • Data Anonymizer
  • Dynamics CRM Destination

 

 

 

 

 

 

 

In the Dynamics Source Component, Enter the Connection you just created, the Entity (in this case Lead).

 

 

 

 

 

 

Click on the columns section, and choose which fields from Dynamics you want to anonymise…… In this case I chose things like FirstName, LastName, Email etc.

 

 

 

 

 

 

Connect the Dynamics CRM Source component to the Data Anonymiser component by dragging the connector.

Open the Data Anonymiser Component.

 

 

 

 

 

Here you will see the fields/columns you have decided to anonymise, and the option to choose the data type

So for example the email address will be anonymised with data of email type

 

 

 

 

Do this for all your fields/columns.

Once this is done, open the CRM Destination Component

 

 

 

 

 

 

Next click on the columns section and map the source to the destination

 

 

 

 

 

 

So to summarize….

  • CRM Connection
  • Choose Source entity and Fields
  • Choose Anonymise options
  • Set Destination Mapping

Once this is all done, save your solution and run it:

 

 

 

 

 

 

 

 

So in the instance above 274 Lead records were anonymised.

I hope you found this quick tutorial helpful.