November 17th, 2021
Breaking out of loops in DataMapper
Loops are commonplace in data mapping configurations. Unless all your data is static, you have to use them in order to extract repeating items. However, it can sometimes be challenging to loop precisely on a specific set of conditions, especially when dealing with compound conditions. Let’s see how OL Connect 2021.1 can help us streamline loops.
Note: all examples shown use resources that are attached at the bottom of this article.
Let’s say you are given the list of chemical elements found in the human body. Since there are several tens of elements that only have trace amounts, you are tasked with only extracting in a main table all the top elements that make up a maximum of 99% of the composition of the body. The rest can be discarded. Fortunately, you are provided with a sorted list of all elements in descending order :
If we add up the elements above, we can see that going from Oxygen to Phosphorus, we reach a total of 98.7%. Adding Potassium would make us go over the 99% mark. So our (simple) challenge is to extract the first 6 elements in a loop.
The easy way to do this is to loop through all elements and simply ignore elements once we’ve reached the maximum allowed. The following DM config should work just fine:
However, there are a number of issues with it. First of all, the loop ran 11 times, which is a waste of time. Second, the loop extracted Sodium, after having skipped over Postassium and Sulfur. That’s because at that point, it had reached a total of 98.7%, so it skipped those two elements, but then Sodium came next and adding it to our total would still not exceed our 99% limit. But that’s incorrect: we were asked to add the top elements, up to 99%, not pick and choose all elements until we get as close as possible to 99%. And the last issue we have is that at the end of the loop, we are at the bottom of our data page so if we were planning on doing any further processing, we don’t know where we actually reached our maximum percentage.
Fortunately, we can fix it easily: let’s change the loop so that it stops as soon as the next element would make the total exceed 99%. So we convert the loop from “On all elements” to a “While statement is true” loop and check for a simple value that gets set in the false branch of the embedded condition. This works better and brings down the total number of loops to 7 and the maximum percentage of all top elements to 98.7% (both highlighted in blue), which is what we want:
However, look at the position of our data (highlighted in red): we
are now positioned at the Sulfur line, which means we skipped over the
Potassium line (which is the one that would have made our percentage
total exceed 99%).
So if we have further processing to do, we’ll start that processing one line too far. The problem is with the Goto step in the loop: it gets executed even though our loop is, in theory, finished. You could try putting it inside a condition, but then the loop will complain of a possible infinite loop. There are a few ways to get around this issue, but I will leave that as an exercise for the reader. Let’s just say that however you get around it, it’s a PITA and a waste of valuable time.
With version 2021.1, the DataMapper implements a method to break out of a loop and immediately jump to the next task following the current loop:
Here, we go back to looping through all elements, so we don’t have to set a condition on our loop. But when the element we are processing makes our total exceed 99%, the false branch of the condition now executes the new Break out of repeat loop action, which immediately transfers control to the first task following the loop. That way, we avoid executing that extra Goto step inside the loop and our data pointer is now positioned exactly where it should be: at the Potassium line.
You will find that this feature simplifies your data mapping configurations as it avoids having to specify extra conditions for the loops or inside the loops. It also ensures that the number of iterations is kept to a minimum, thereby making the process more efficient.
Tagged in: break, datamapper, loop
Receive exclusive OL products news, tips and resources.
Your email address will not be published. Required fields are marked *
January 19th, 2022
e-Invoicing standards are cropping up everywhere and are increasingly becoming mandatory. A number of those standards are based on PDF/A-3 with an XML attachment. Starting with version 2019.1, OL Connect comes with features for creating PDF/A-3, and turning them into ZUGFeRD and Factur-X conforming e-invoices. PDF/A-3 is not only for e-invoicing, it’s an archive format after all, so other applications become possible as well, of course. This article explains how to use this functionality in OL Connect.
January 12th, 2022
As a general rule, software engineers love to give users of their applications as much flexibility as possible. If you ask them for an option allowing you to pick one of the seven rainbow colors, they’ll usually respond with some way of picking any of the 32 million colors that your display is capable of. After all, they say, it’s no more work for them to do so and it gives you, the user, much greater flexibility. But that flexibility may come at a price you’re not prepared to pay.
December 8th, 2021
Just like in the Friday the 13th movie franchise, JSON is everywhere ( :-|). And now, it can be handled natively as a new data type in the DataMapper. All those web-based processes that use JSON as a data exchange format no longer require you to convert the data to something else in order to extract values from it. Read on to learn more on this feature we introduced with version 2021.1 of OL Connect.