Logic Apps (Standard) Data Mapper: What is a Function Chain (video)

Logic Apps (Standard) Data Mapper: What is a Function Chain (video)

Function Chain? What is a Function Chain? And how that works inside the Data Mapper?

When we use more than one cascading function to perform a transformation rule, we call it a Function Chain, or a chain of functions that are going to be executed in order. This way, we can apply more complex mapping rules inside the Logic Apps (Standard) Data Mapper. By the way, we had the same concept inside BizTalk Server Maps and Logic App Consumption Map (that is, the BizTalk Server Maps extracted and isolated)

The picture below shows us a Function Chain inside the Data Mapper. In this case, we are calculating national and international calls based on the phone number:

In this video, we will learn t what a Function Chain is inside the Logic Apps (Standard) Data Mapper and how it works.

Hope you find this helpful! So, if you liked the content or found it useful and want to help me write more content, you can buy (or help buy) my son a Star Wars Lego! 

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Data Mapper Tricks and Tips: Workaround to organize your functions (video)

Data Mapper Tricks and Tips: Workaround to organize your functions (video)

Time to start another series of blog posts about Logic Apps: Data Mapper Tricks and Tips! Where I will address simple tips and tricks, we can apply to our Data Mapper to be more productive, solve a problem, or help bypass some limitations or constraints.

For this first blog post, I decided to explain a simple workaround that we can use today to help us organize our maps better in order for them to be more readable. Unfortunately, at the moment, I’m writing this post when we add a Function to our map we cannot drag and drop the function into another position in the data mapper area. That means that often when we are applying the mapping rules, they will get overlap as you see in the picture below:

In this case, the To Integer Function is on top of the Concat function, which makes it difficult to read and work inside the Data Mapper. In this sort video, we will see a very useful trick and Tip to organize our functions inside the Logic Apps (Standard) Data Mapper – it may not work in all scenarios but is the best option we have for now.

P.S: Microsoft is working on adding this drag and drop capability, so in the future, we will be able to move the shapes, aka functions, in the mapping area.

Hope you find this helpful! So, if you liked the content or found it helpful and want to help me write more content, you can buy (or help buy) my son a Star Wars Lego! 

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

How to integrate RabbitMQ with Logic Apps (video)

How to integrate RabbitMQ with Logic Apps (video)

Unfortunately, no Logic App connector can make the bridge to RabbitMQ, which makes this integration challenge a little bit more complicated. However, we have the ability to create an Azure Function by using the RabbitMQ trigger for Azure Functions to overpass this limitation.

And we saw and explained in our last blog post that Azure Functions integrates with RabbitMQ via triggers and bindings. The Azure Functions RabbitMQ extension allows you to send and receive messages using the RabbitMQ API with Functions.

The purpose of this video is to explain how you create a POC that allows you to receive a message in a RabbitMQ queue, and that event triggers the Azure Function that then will route the message to a Logic App.

This was a real problem presented by a client during one of our Logic Apps training courses, where they have RabbitMQ on-premises, and they did want to pull messages from a queue into a Logic App Consumption to integrate them with other systems.

Hope you find this helpful! So, if you liked the content or found it useful and want to help me write more content, you can buy (or help buy) my son a Star Wars Lego! 

Big thanks to my team member Luís Rigueira for creating this video.

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Logic Apps (Standard) Data Mapper: What is a function?

Function category
Category description
Functions in category Collection

Used to perform a variety of operations over collections, such as cumulative sum, short, or get distinct values.

Average, Count, Direct Access, Distinct Values, Filter, Index, Join, Maximum, Minimum, Reverse, Sort, Sub Sequence, Sum Conversion

Used to convert values to specific times.

To DateTime, To integer, To number, To string Date and TimeUsed to perform a variety of operations over Dates, such as retrieving the current date and time or adding dates. Add days, Add DayTime to Date, Add DayTime to DateTime, Add DayTime to Time, Add YearMonth to DateTime, Adjust Date, Adjust DateTime, Adjust Time, Current date. Current DateTime value, Current time, DateTime, Day from DAte, Day from DateTime, Equal Date, Equal DateTime, Equal Day, Equal Month, Equal MonthDay, Equal Time, Equal Year, Equal YearMonth, Greater Date, Greater DateTime, Greater Time, Hours from DateTime, Hours from Time, Less Date, Less DateTime, Less Time, Minutes from DateTime, Minutes from Time, Month from Date, Month from DateTime, Seconds from DateTime, Seconds from Time, Subtract Dates, Subtract DateTimes, Subtract DateTime from Date, Subtract DateTime from DateTime, Subtract DateTime from Time, Subtract Times, Subtract YearMonth from Date, Subtract YearMonth from DateTime, Time zone from Date, Time zone from DateTime, Time zone from Time, Year from Date, Year from DateTime. Logical comparisonUsed to perform a variety of logical operations, such as greater than and logical existence. Equal, Exists, Greater, Greater or equal, if, if else, Is date, Is DateTime, Is nil, Is null, Is number, Is string, Less, Less or equal, Logical AND, Logical NOT, Logical OR, Not equal MathematicalUsed to perform a variety of mathematical and scientific operations, such as addition and multiplication. Absolute, Add, Arctangent, Ceiling, Cosine, Divide, Exponential , Exponential (base 10), Floor, Integre divide, Log, Log (base 10), Modulo, Multiply, Power, Round, Sine, Square root, Subtract, Tangent String

Used to perform a variety of string functions, such as trimming and concatenation.

Codepoints to string, Concat, Contains, Ends with, Length, Lowercase, Name, Regular expression matches, Regular expression replace, Replace, Start with, String to codepoints, Substring, Substring after, Substring before, Trim, Trim left, Trim right, Uppercase Utility

Used to perform a variety of additional and distinct operations that don’t fit in the above Categories, such as stopping a transformation and returning the specified error code and description or format a number or a date.

Copy, Error, Format date, Format DateTime value, Format number, Format time
Azure Function to consume RabbitMQ messages

Azure Function to consume RabbitMQ messages

Unfortunately, no Logic App connector can make the bridge to RabbitMQ, which makes this integration challenge a little bit more complicated. However, we have the ability to create an Azure Function by using the RabbitMQ trigger for Azure Functions to overpass this limitation.

Azure Functions integrates with RabbitMQ via triggers and bindings. The Azure Functions RabbitMQ extension allows you to send and receive messages using the RabbitMQ API with Functions.

So we pretend here to have an Azure Function that triggers when a message enters the queue and then routes that message into a Logic App.

And what does this Azure Function do?

This Azure Function is triggered by a RabbitMQ message in a specified queue. When a message arrives, the function is executed and performs the following steps:

  • Logs an information message indicating that the function has been triggered.
  • Prepares the payload for a request by creating an object with a “Message” property containing the content of the RabbitMQ message.
  • Serializes the payload object into a JSON string.
  • Creates an HTTP request with the JSON payload as the content and sets the content type to “application/json“.
  • Defines the URL of a Logic App that will receive the HTTP request.
  • Sends the HTTP request to the Logic App using the URL and payload.
  • Check the response status of the request.
    • If the request is successful (status code in the 2xx range), logs an information message indicating that the request was sent to the Logic App successfully.
    • If the request fails (status code outside the 2xx range), logs an error message indicating the failure and includes the response’s status code.

In summary, this Azure Function acts as a bridge between a RabbitMQ queue and a Logic App. It receives messages from RabbitMQ, sends them as JSON payloads to a specified Logic App endpoint via an HTTP request, and logs the success or failure of the request.

To create the Azure Function, we need to:

  • In Visual Studio 2022, click on Create a new project.
  • On the project template, choose Azure Functions.
  • On the Configure your new project panel, give your Azure Function a name that makes sense to you and your coworkers, do not forget to start using proper names from day one! Choose the location of your Azure Function.
  • Click next, and now you need to configure some fields:
    • On the Function worker, choose .NET 6.0 (Long Term Support).
    • On Function, select the RabbitMQ trigger.
    • On the Connection string setting name, you can name the connection string as RabbitMQConnection.
    • On the Queue name, add the name of the queue you created previously.
  • Click on Create. After the project is created, use the following code you can find on GitHub here:

Add these NuGet packages to the solution.

Next on the file local.settings.json is where you will store the connection string that will make it possible to connect with RabbitMQ and to do that, this is how the file should look like:

{
   "IsEncrypted": false,
   "Values": {
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
      "RabbitMQConnection": "amqp://user:acbdef@111.000.111.000:5672/my-vhost-v2"
   }
}

Notice that you need to apply the proper configuration to the RabbitMQConnection keyword.

  • amqp://user:acbdef@111.000.111.000:5672/my-vhost-v2 is just an example, but only the password and IP are fictitious in this example because you should have your own.

Where can I download it?

You can download the complete Azure Functions source code here:

Hope you find this helpful! So, if you liked the content or found it helpful and want to help me write more content, you can buy (or help buy) my son a Star Wars Lego! 

Big thanks to my team member Luís Rigueira for helping me realize and implement this idea.

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Logic Apps (Standard) Data Mapper: String functions (video)

Logic Apps (Standard) Data Mapper: String functions (video)

In my last blog post, I explain in detail the String functions available in the new Data Mapper, and I endup documenting each of them.

String functions are used to manipulate strings in standard ways, such as conversions to all uppercase or all lowercase, string concatenation, determination of string length, white space trimming, etc. If you come from the BizTalk Server background or are migrating BizTalk Server projects, they are the equivalent of String Functoids inside BizTalk Mapper Editor.

The String functoids are:

  • Codepoints to string: Converts the specified codepoints value to a string and returns the result.
  • Concat: Combines two or more strings and returns the combined string.
  • Contains: Returns true or false based on whether the string input contains the specified substring.
  • Ends with: Returns true or false based on whether the string input ends with the specified substring.
  • Length: Returns the number of items in the specified string or array.
  • Lowercase: Returns a string in lowercase format.
  • Name: Returns the local name of the selector node, which is useful when you want to retrieve the name of the incoming message component, not the value.
  • Regular expression matches: Returns true or false based on whether the string input matches the specified regular expression.
  • Regular expression replace: Returns a string created from the string input by using a given regular expression to find and replace matching substrings with the specified string.
  • Replace: Replaces a substring with the specified string and return the new complete string.
  • Starts with: Returns true if the given string starts with the specified substring.
  • String to codepoints: Converts the specified string to codepoints.
  • Substring: Returns characters from the specified string, starting from the specified position.
  • Substring after: Returns the characters that follow the specified substring in the source string.
  • Substring before: Returns the characters that precede the specified substring in the source string.
  • Trim: Returns the specified string with all the leading and trailing white space characters removed.
  • Trim left: Returns the specified string with all the leading white space characters removed.
  • Trim right: Returns the specified string with all the trailing white space characters removed.
  • Uppercase: Returns a string in uppercase format.

In this video, we will see each of these String Functions in action. For each one, we will provide simple input data, and we will see what the expected output is.

Hope you find this helpful! So, if you liked the content or found it useful and want to help me write more, you can buy (or help buy) my son a Star Wars Lego! 

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Logic Apps (Standard) Data Mapper: String functions

Logic Apps (Standard) Data Mapper: String functions

Overview

String functions are used to manipulate strings in standard ways, such as conversions to all uppercase or all lowercase, string concatenation, determination of string length, white space trimming, etc. If you come from the BizTalk Server background or are migrating BizTalk Server projects, they are the equivalent of String Functoids inside BizTalk Mapper Editor.

Available Functions

The String functoids are:

  • Codepoints to string: Converts the specified codepoints value to a string and returns the result.
  • Concat: Combines two or more strings and returns the combined string.
  • Contains: Returns true or false based on whether the string input contains the specified substring.
  • Ends with: Returns true or false based on whether the string input ends with the specified substring.
  • Length: Returns the number of items in the specified string or array.
  • Lowercase: Returns a string in lowercase format.
  • Name: Returns the local name of the selector node, which is useful when you want to retrieve the name of the incoming message component, not the value.
  • Regular expression matches: Returns true or false based on whether the string input matches the specified regular expression.
  • Regular expression replace: Returns a string created from the string input by using a given regular expression to find and replace matching substrings with the specified string.
  • Replace: Replaces a substring with the specified string and return the new complete string.
  • Starts with: Returns true if the given string starts with the specified substring.
  • String to codepoints: Converts the specified string to codepoints.
  • Substring: Returns characters from the specified string, starting from the specified position.
  • Substring after: Returns the characters that follow the specified substring in the source string.
  • Substring before: Returns the characters that precede the specified substring in the source string.
  • Trim: Returns the specified string with all the leading and trailing white space characters removed.
  • Trim left: Returns the specified string with all the leading white space characters removed.
  • Trim right: Returns the specified string with all the trailing white space characters removed.
  • Uppercase: Returns a string in uppercase format.

Codepoints to string

This function states that you can convert the specified codepoints value to a string and returns the result. but first, we need to understand what is a codepoint! In character encoding terminology, a code pointcodepoint, or code position is a numerical value that maps to a specific character. Code points usually represent a single grapheme, usually a letter, digit, punctuation mark, or whitespace but sometimes represent symbols, control characters, or formatting. You can check and learn more about codepoint here: https://codepoints.net/. For example, the codepoint 65 is the letter A.

Behind the scenes, this function is translated to the following XPath function: codepoints-to-string()

  • codepoints-to-string($arg as xs:string) as xs:string

Concat

This function states that you can combine two or more strings and returns the combined string.

Behind the scenes, this function is translated to the following XPath function: concat()

  • concat( $arg1 as xs:anyAtomicType?, $arg2 as xs:anyAtomicType?, … ) as xs:string

Rules:

  • This function accepts two or more xs:anyAtomicType arguments and casts each one to xs:string. The function returns the xs:string that is, the concatenation of the values of its arguments after conversion. If any argument is the empty sequence, that argument is treated as the zero-length string.
  • The concat function is specified to allow two or more arguments, which are concatenated together. This is the only function specified in this document that allows a variable number of arguments.

Contains

This function states that it returns true or false based on whether the string input (argument 1) contains the specified substring (argument 2).

Behind the scenes, this function is translated to the following XPath function: contains()

  • contains($arg1 as xs:string?$arg2 as xs:string?) as xs:boolean

Rules:

  • If the value of $arg1 or $arg2 is the empty sequence or contains only ignorable collation units, it is interpreted as the zero-length string.
  • If the value of $arg2 is the zero-length string, then the function returns true.
  • If the value of $arg1 is the zero-length string, the function returns false.

Ends with

This function states that it returns true or false based on whether the string input ends with the specified substring.

Behind the scenes, this function is translated to the following XPath function: ends-with()

  • ends-with($arg1 as xs:string?$arg2 as xs:string?) as xs:boolean

Rules:

  • If the value of $arg1 or $arg2 is the empty sequence or contains only ignorable collation units, it is interpreted as the zero-length string.
  • If the value of $arg2 is the zero-length string, then the function returns true.
  • If the value of $arg1 is the zero-length string, and the value of $arg2 is not the zero-length string, then the function returns false.
  • The function returns an xs:boolean indicating whether or not the value of $arg1 ends with a sequence of collation units that provides a match to the collation units of $arg2 according to the collation that is used.

Length

This function states that it returns the number of items in the specified string or array.

Behind the scenes, this function is translated to the following XPath function: string-lenght()

  • string-length($arg as xs:string?) as xs:integer

Rules:

  • The function returns an xs:integer equal to the length in characters of the value of $arg.
  • If the value of $arg is the empty sequence, the function returns the xs:integer value zero (0).

Lowercase

This function states that it returns a string in lowercase format.

Behind the scenes, this function is translated to the following XPath function: lower-case()

  • lower-case($arg as xs:string?) as xs:string

Rules:

  • If the value of $arg is the empty sequence, the zero-length string is returned.
  • Otherwise, the function returns the value of $arg after translating every character to its lower-case correspondent as defined in the appropriate case mappings section in the Unicode standard.

Name

This function states that it returns the local name of the selector node, which is useful when you want to retrieve the name of the incoming message component, not the value.

Behind the scenes, this function is translated to the following XPath function: local-name-from-QName()

  • local-name-from-QName($arg as xs:QName?) as xs:NCName

Rules:

  • If $arg is the empty sequence, the function returns the empty sequence.
  • Otherwise, the function returns a xs:NCName representing the local part of $arg.

Regular expression matches

This function states that it returns true or false based on whether the string input matches the specified regular expression.

Behind the scenes, this function is translated to the following XPath function: matches()

  • matches($input as xs:string?$pattern as xs:string) as xs:boolean

Rules:

  • If $input is the empty sequence, it is interpreted as the zero-length string.
  • The function returns true if $input or some substring of $input matches the regular expression supplied as $pattern. Otherwise, the function returns false

Regular expression replace

This function states that it returns a string created from the string input by using a given regular expression to find and replace matching substrings with the specified string.

Behind the scenes, this function is translated to the following XPath function: replace()

  • replace($input as xs:string?, $pattern as xs:string, $replacement as xs:string) as xs:string

Rules:

  • If $input is the empty sequence, it is interpreted as the zero-length string.
  • The function returns the xs:string that is obtained by replacing each non-overlapping substring of $input that matches the given $pattern with an occurrence of the $replacement string.
  • If two overlapping substrings of $input both match the $pattern, then only the first one (that is, the one whose first character comes first in the $input string) is replaced.

In this sample above, if the city element from the source message has the value abracadabra then the output will be *c*bra

Replace

This function states that it replaces a substring with the specified string and returns the new complete string.

Behind the scenes, this function is translated to the following XPath function: replace()

  • replace($input as xs:string?, $pattern as xs:string, $replacement as xs:string) as xs:string

This will be exactly the same as the previous one, but instead of using a regular expression pattern, we use a string to be replaced.

Starts with

This function states that it returns true if the given string starts with the specified substring.

Behind the scenes, this function is translated to the following XPath function: starts-with()

  • starts-with($arg1 as xs:string?$arg2 as xs:string?) as xs:boolean

Rules:

  • If the value of $arg1 or $arg2 is the empty sequence, or contains only ignorable collation units, it is interpreted as the zero-length string.
  • If the value of $arg2 is the zero-length string, then the function returns true. If the value of $arg1 is the zero-length string, and the value of $arg2 is not the zero-length string, then the function returns false.

String to codepoints

This function states that it converts the specified string to codepoints. But first, we need to understand what is a codepoint! In character encoding terminology, a code pointcodepoint, or code position is a numerical value that maps to a specific character. Code points usually represent a single grapheme, usually a letter, digit, punctuation mark, or whitespace but sometimes represent symbols, control characters, or formatting. You can check and learn more about codepoint here: https://codepoints.net/. For example, the letter A is the codepoint 65.

Behind the scenes, this function is translated to the following XPath function: string-to-codepoints()

  • fn:string-to-codepoints($arg as xs:string?) as xs:integer

Rules:

  • The function returns a sequence of integers, each integer being the Unicode codepoint of the corresponding character in $arg.
  • If $arg is a zero-length string or the empty sequence, the function returns the empty sequence.

Substring

This function states that it returns characters from the specified string, starting from the specified position.

Behind the scenes, this function is translated to the following XPath function: substring()

  • substring($sourceString as xs:string?, $start as xs:double, $length as xs:double) as xs:string

or

  • substring($sourceString as xs:string?, $start as xs:double) as xs:string

Rules:

  • If the value of $sourceString is the empty sequence, the function returns the zero-length string.
  • Otherwise, the function returns a string comprising those characters of $sourceString whose index position (counting from one) is greater than or equal to the value of $start (rounded to an integer), and (if $length is specified) less than the sum of $start and $length (both rounded to integers).
  • The characters returned do not extend beyond $sourceString. If $start is zero or negative, only those characters in positions greater than zero are returned.

Substring after

This function states that it returns the characters that follow the specified substring in the source string.

Behind the scenes, this function is translated to the following XPath function: substring-after()

  • substring-after($arg1 as xs:string?$arg2 as xs:string?) as xs:string

Rules:

  • If the value of $arg1 or $arg2 is the empty sequence or contains only ignorable collation units, it is interpreted as the zero-length string.
  • If the value of $arg2 is the zero-length string, then the function returns the value of $arg1.
  • If the value of $arg1 does not contain a string that is equal to the value of $arg2, then the function returns the zero-length string.

Substring before

This function states that it returns the characters that precede the specified substring in the source string.

Behind the scenes, this function is translated to the following XPath function: substring-before()

  • substring-before($arg1 as xs:string?$arg2 as xs:string?) as xs:string

Rules:

  • If the value of $arg1 or $arg2 is the empty sequence or contains only ignorable collation units, it is interpreted as the zero-length string.
  • If the value of $arg2 is the zero-length string, then the function returns the zero-length string.
  • If the value of $arg1 does not contain a string that is equal to the value of $arg2, then the function returns the zero-length string.

Trim

This function states that it returns the specified string with all the leading and trailing white space characters removed.

Behind the scenes, this function is translated to the following XPath function: replace()

  • replace($input as xs:string?, ‘^s*|s*$’, ”)

This is a specific call to the replace() function where the second and third arguments are already specified behind the scenes. Trim functoid is an abstraction of this replace() function call.

Trim left

This function states that it returns the specified string with all the leading white space characters removed.

Behind the scenes, this function is translated to the following XPath function: replace()

  • replace($input as xs:string?, ‘^s+’, ”)

This is a specific call to the replace() function where the second and third arguments are already specified behind the scenes. Trim functoid is an abstraction of this replace() function call.

Trim right

This function states that it returns the specified string with all the trailing white space characters removed.

Behind the scenes, this function is translated to the following XPath function: replace()

  • replace($input as xs:string?, ‘s+$’, ”)

This is a specific call to the replace() function where the second and third arguments are already specified behind the scenes. Trim functoid is an abstraction of this replace() function call.

Uppercase

This function states that it returns a string in uppercase format.

Behind the scenes, this function is translated to the following XPath function: upper-case()

  • upper-case($arg as xs:string?) as xs:string

Rules:

  • If the value of $arg is the empty sequence, the zero-length string is returned.
  • Otherwise, the function returns the value of $arg after translating every character to its upper-case correspondent as defined in the appropriate case mappings section in the Unicode standard.

Hope you find this helpful! So, if you liked the content or found it useful and want to help me write more, you can buy (or help buy) my son a Star Wars Lego! 

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Thanks! Awarded as Microsoft Azure MVP 2023-2024

Thanks! Awarded as Microsoft Azure MVP 2023-2024

And the most expected email arrived once again on July 6th. I’m delighted to share that I was renewed as a Microsoft Azure MVP (Microsoft Most Valuable Professional). Thanks, Microsoft, for this amazing award. I’m always honored and humbled to receive it, and this is my 13th straight year in the MVP Program, an amazing journey and experience that started in 2011 back then as a BizTalk MVP. This program gave me the opportunity and still does, to travel the world for speaking engagements, share knowledge, and meet the most amazing and skilled people in our industry.

This longevity in the program currently makes me the “Godfather” of the Portuguese MVPs alongside my dear friend Rodrigo Pinto (but I am a few months older :)). And that could not be possible without the huge support of my beautiful wife Fernanda and my amazing 3 kids!

Jokes apart, I want to send a big thanks to Cristina González Herrero for all the fantastic work managing the program in my region. To Microsoft Portugal and to Microsoft for empowering us to support the technical communities. To my coworkers and team at DevScope, all my blog readers, friends, and Microsoft Enterprise Integration Community members, and in special to my beautiful family – THANKS! Thanks for your support during these years.

It’s a big honor to be in the program and be one of this fantastic worldwide group of technicians and community leaders who actively share their high-quality and real-world expertise with other users and Microsoft. I’m looking forward to another great year!

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Logic Apps (Standard) Data Mapper Patterns: Aggregation Pattern

Logic Apps (Standard) Data Mapper Patterns: Aggregation Pattern

Basically, the Aggregation Pattern could also be another example or a subset of the Content Enricher Pattern (you can know more about this here: BizTalk Mapping Patterns & Best Practices), but sometimes when we exchange messages between different systems, we will need to gather information from multiple external sources, this is also known as Scatter-Gather Pattern (https://www.enterpriseintegrationpatterns.com/patterns/messaging/BroadcastAggregate.html), and once a complete set of messages has been received, we need to process them as a whole and combine or merge parts of information from each correlated message to create the expected message by the target system.

So the main difference between the Aggregation Pattern and the Content Enricher one is that in this last one, we’re normally talking about mapping one-to-one messages, and in the Aggregator pattern, we are dealing with multiple inbound messages that were collected from the original request and need to be mapped and aggregated into a single outbound request. For example, we want to bill the client’s order after all items have been pulled from the financial system or warehouse. Also, Content Enricher can happen inside the Aggregation Pattern along with other types of patterns.

Reference to this pattern:

In this video, you can see and learn how to apply the Aggregation Pattern inside the new Data Mapper available for Logic Apps (Standard)

Hope you find this helpful! So, if you liked the content or found it useful and want to help me write more, you can buy (or help buy) my son a Star Wars Lego! 

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira

Democratizing RPA with Power Automate Desktop Book Review

Democratizing RPA with Power Automate Desktop Book Review

The book states: “Boost your productivity by implementing best practices for automating repeating desktop processes.”, adding that no special IT knowledge is needed for this book. And I have to say that is 100% true. It is a remarkably user-friendly book that covers a wide range of essential topics about implementing Robotic Process Automation with Power Automate Desktop.

I sincerely recommend this book to individuals interested in this area or technology in general. This book will be a run pup for you or your team to understand the basics of RPA, from integrating with local programs, processes, or web browsers, even without you needing any programming knowledge! It is well-written, easy to follow and navigate, and with excellent illustrations.

I haven’t read a book about technology that held me to the end for a long time. I was curious to see what came next, and although I have a lot of knowledge in Power Automate, I never invested much in RPA, so I learned a lot from this book. Congratulations to the author!

Democratizing RPA with Power Automate Desktop Book Description

Whether you want to organize simple files or perform more complex consolidations between different Office programs and remote-control applications that don’t allow outside access, Power Automate Desktop helps meet these challenges. This book explains how to leverage this workflow automation platform by explaining the underlying RPA concepts step-by-step.

You’ll start with simple flows that can be easily recorded and further processed using the built-in recorder. Later, you’ll learn how to use the more advanced actions to automate folder and file management and enable Office programs to interact with each other. You’ll also get to grips with integrating desktop flows into different cloud environments and further enhance their value using AI. As you progress, you’ll understand how flows can run unattended, how they are managed in the Power Platform, and key concepts such as creating, modifying, debugging, and error-handling UI flows. Finally, the book will guide you to use Process Automation Designer (PAD) with your frequently used desktop systems to automate routine tasks.

By the end of this book, you’ll have become a Power Automate Desktop expert, automating both professional and personal tasks.

What you will learn

  • Master RPA with Power Automate Desktop to commence your debut workflow.
  • Grasp all essential product concepts such as UI flow creation and modification, debugging, and error handling.
  • Use PAD to automate tasks with the frequently used systems on your desktop.
  • Attain proficiency in configuring flows that run unattended to achieve seamless automation.
  • Discover how to use AI to enrich your flows with insights from different AI models.
  • Explore how to integrate a workflow in a broader cloud context.

Who is this book for

Whether you’re a home user looking to automate simple tasks on your workstation or a business user or citizen developer seeking to automate more complex rule-based processes, this book will help you overcome the challenge. No knowledge of a programming language is required. Still, in the more advanced chapters, a general understanding of information technology, including basic programming language structures, protocols, and cloud concepts, will be helpful.

Table of Contents

  1. Getting Started with Power Automate Desktop
  2. Using Power Automate Desktop and Creating First Flow
  3. Editing and Debugging UI Flows
  4. Basic Structure Elements and Flow Control
  5. Variables, UI Elements, and Images
  6. Actions for UI Automation
  7. Automate Your Desktop and Workstation
  8. Automating Standard Business Applications
  9. Leveraging Cloud Services and Power Platform
  10. Leveraging Artificial Intelligence
  11. Working with APIs and Services
  12. PAD Enterprise Best Practices

Where can you order the book?

You can order the book and find the complete table of contents on the Packt Website or Amazon.

Hope you find this helpful! So, if you liked the content or found it useful and want to help me write more, you can buy (or help buy) my son a Star Wars Lego! 

Author: Sandro Pereira

Sandro Pereira lives in Portugal and works as a consultant at DevScope. In the past years, he has been working on implementing Integration scenarios both on-premises and cloud for various clients, each with different scenarios from a technical point of view, size, and criticality, using Microsoft Azure, Microsoft BizTalk Server and different technologies like AS2, EDI, RosettaNet, SAP, TIBCO etc.

He is a regular blogger, international speaker, and technical reviewer of several BizTalk books all focused on Integration. He is also the author of the book “BizTalk Mapping Patterns & Best Practices”. He has been awarded MVP since 2011 for his contributions to the integration community.
View all posts by Sandro Pereira