Lessons Learned from Advanced Expressions for MS Flow Session at Microsoft Business Applications Summit 2018

I didn’t actually attend the summit, but rather took advantage of the fact that Microsoft is generous enough to make all of the sessions available on-demand. The Advanced Expressions for MS Flow session, led by Stephen Siciliano, was chock-full of information on the various types of advanced expressions available in MS Flow, suggested uses for these different types, and real-world demos. Using advanced expressions can seriously kick up your MS Flow game, so I highly recommend becoming familiar with these gems.

Advanced expressions are function expressions that can be written in a compose action or inline in a conditional. When an advanced expression is written in a compose action, the result of the expression can then be used in other areas of your flow. On the other hand, if the expression is written in a conditional, the result of the expression will be used to determine to which path the flow will continue. In this case, the expression must begin with the @ character, and the expressions that can be used here include equals(), and(), or(), not(), less(), lessOrEquals(), greater(), and greaterOrEquals().

However, I may be getting ahead of myself. You may still be asking “Where do I find advanced expressions?” So, let me start there. Once you create an action, click on “Add dynamic content”, in the pop up, there are tabs for “Dynamic content” and “Expression”. Click on “Expression”. All of the advanced expressions are listed by type. They also include a short snippet description to assist you in determining what they do and how you might use them. It helps that most of their names are fairly descriptive as well.

The beauty of advanced expressions is they give you many more options for working with your data; and therefore, you can create flows that can do more for you. With advanced expressions you have the power to manipulate and generate data in the following ways:

Converting Data Types

  • MS Flow automatically converts some data types. For example, integers will automatically be converted to strings. What this means is that the data will be available both as an integer and as a string in the data content.
  • Other, less obvious, conversions can be written as an expression by the flow author. For example, if you need to convert a base64 encoded string to a string, you would use base64ToString(). There are advanced expressions for converting to string, floating point, integer, boolean, base64, Data URI, URI component, binary, array, JSON object, and XML content.

 

Working with Strings

  • There are expressions for joining two strings, concat(); extracting a chunk of a string, substring(); or replacing sections of a string, replace().
  • If you need to convert the case of a string, you can use toLower() and toUpper().
  • Finding the location of text in a string is easy with indexOf() and lastIndexOf().
  • Lastly, if you need to check if a string starts with or ends with a value, you can use startsWith() or endsWith().

 

Performing Arithmetic

  • Doing simple arithmetic, or even advanced arithmetic, can be achieved with the arithmetic expressions. These include:
    • add(), returns the result of adding two numbers
    • sub(), returns the result of subtracting two numbers
    • mul(), returns the result of multiplying two numbers
    • div(), returns the result of dividing two numbers
    • mod(), returns the remainder after dividing two numbers
  • Advanced arithmetic is possible, because you can use expressions within expressions. For example, if you want to complete a + b / c, your expression would be add(a, div(b,c)).
  • Min() and max() are expressions that return the minimum or maximum value from an array of numbers.

 

Manipulating Date/Time

  • There are a bunch of advanced expressions for manipulating date/time. These include, but are not limited to, expressions for:
    • Returning the current timestamp as a string, utcNow()
    • Adding times together, addMinutes(), addHours(), addDays(), etc
    • Converting time zones, convertTimeZone(), convertToUtc(), convertFromUtc()
    • Formatting date/time into a string, formatDateTime()
    • Returning a segment of time from a timestamp, dayOfWeek(), dayOfMonth(), etc.

 

Generating Data

  • The two most helpful examples of expressions that generate data are:
    • guid(), returns a globally unique string
    • rand(), which returns a random integer within the specified range

 

The if() expression can be helpful if you are simply trying to add styling or set a value based on a condition. You can write a simple if() expression rather than add an additional layer of conditions into the flow. Multiple layers of nested conditions can become confusing and can get short circuited if a missing property gets referenced.

Properties that are not set or return as null will cause your flow to fail. To avoid this, use the coalesce() function in conjunction with the ? character. The idea is to set a default value for the property that will be used if the property returns as null. This looks something like this: coalesce(body(‘Get_record’)?[‘content’], ‘Default Value’).

There are also some really cool advanced expressions for working with lists/arrays, and workflows. I encourage you to poke around in the Expression tab to see what else is available. In the session, Siciliano also briefly discussed asynchronous actions (using 2 triggers in the same flow), working with other flows (using the Flow Management Connector), and calling nested workflows (use this to break up larger flows into smaller chunks). As I stated earlier, this session was chock-full of information. It was well worth the time spent. I’d like to think my Flow game has been kicked up a notch as a result.

 

WHAT’S NEW IN OFFICE 365 (SEPTEMBER 2018)

Time flies when you’re having fun and that means Ignite will be here before we know it.  As expected Microsoft has already started to lay the ground work for some of the talking points at Ignite with their feature and enhancement announcements in August and will likely continue that trend through September.

Office 365 Roadmap Transitioning to Microsoft 365 Roadmap

When Microsoft first rolled out the Microsoft 365 package (Office 365, Windows 10, and Enterprise Mobility & Security) there was a lot of confusion around what the differences were between Microsoft 365 and Office 365.  In fact, we still get questions about this regularly and with this latest change that trend is likely to tick upward.  In mid-September 2018 Microsoft will be moving the Office 365 Roadmap to a new location on the web and adding Microsoft 365 features.  Continue reading “WHAT’S NEW IN OFFICE 365 (SEPTEMBER 2018)”

Creating New Habits: Sticking to Resolutions in (and Outside) the Workplace

It’s a new year, a chance to have a clean slate. As humans, we want to make the most of this clean start to a fresh new year. What better way to start a new year out by analyzing what we did wrong last year and vowing to fix it in the coming year.

New Year’s Resolutions.

 

They can be personal or professional, secret or open for the world to know. They’re made with the best of intentions and the strongest of convictions.

And yet, only 8% of those that make resolutions will actually succeed.

Why do we tend to fail? What takes us from being hopeful and determined to slowly giving up? and how can we get those resolutions to stick?

In the 1970’s, a book called PsychoCyberkinetics by Maxwell Maltz sent a popular notion out into society: It takes three weeks to create a habit and three days to break one.

It’s a catchy saying and for some people, 21 days is ample time to create a habit. However, according to a 2009 study, the time it takes to form a habit really isn’t that clear-cut. Researchers from University College London examined the new habits of 96 people over the space of 12 weeks, and found that the average time it takes for a new habit to stick is actually 66 days; furthermore, individual times varied from 18 to a whopping 254 days.

Continue reading “Creating New Habits: Sticking to Resolutions in (and Outside) the Workplace”

Staying Focused & Overcoming the SADness of the Winter Season

 

Is there any more paradoxical time of year than Winter Solstice? At its heart, Winter Solstice brings the shortest day of the year mixed with the heightened anticipation of the holidays. It is a time of year where you have endless feel-good Hallmark movies and Christmas songs on every radio station, yet the cold, cloudy-quickly-turned-to-dark days makes average Midwest citizens prone to Seasonal Affective Disorder (SAD).  Continue reading “Staying Focused & Overcoming the SADness of the Winter Season”

Token Based Auth in ASP.NET Core 2 Part 2: Refresh Tokens

In my last post, I discussed how to setup JWT’s in ASP.NET Core 2.  In this post, I’ll extend that example, adding the ability to refresh the JWT when it expires (i.e. refresh tokens).  A refresh token will be returned with the JWT when the user logs in.  And this new token will be used to refresh the JWT when it expires.  We’ll simply create another middleware that handle’s the refresh token.AJ

Continuing from my previous post, I’ll add refresh tokens to the application.  The source code for this demo can be found here. Continue reading “Token Based Auth in ASP.NET Core 2 Part 2: Refresh Tokens”

Token Based Authentication in ASP.Net using JWTs Part 2: Using Refresh Tokens

In Part 1 we setup basic token authentication using JWT’s with asp.net.  Things are setup reasonably but all is not well.  As a developer, you could give the token a lifespan of 30 days and just force the user to re-login after those days but what if you make the user inactive and don’t want him to login anymore?  There must be better way.AJ

Generally, I token has a lifetime of about an hour and when it expires, we want to refresh that token, verifying that the user still has access to the system, etc.  The method that this is handled is using refresh tokens.  A refresh token is returned along with the normal token and it’s stored for when we must refresh normal token.

Starting from our previous app, let’s support refresh tokens.  Note, the completed code for this blog can be found here.

This will require us to track refresh tokens in our database, so first, let’s create the RefreshToken model.

Continue reading “Token Based Authentication in ASP.Net using JWTs Part 2: Using Refresh Tokens”

Office 365 Collaboration Confusion

A couple weeks ago, Microsoft held their annual Ignite conference and I would usually be blogging about all the cool new things coming to Office 365. This year has been a bit a different experience altogether, not for a lack of features announced from Microsoft though…there were plenty of awesome new features announced. We’ve spent the past couple weeks fielding questions on Office 365 from existing customers and folks looking to make the move or at least understand the options available.

Continue reading “Office 365 Collaboration Confusion”