Using Loops in EFT 8.0.4
#38 TOP TIPBy Matt Thomas | Dec 8, 2020 | News, Top Tips
This technical top tip is written by EFT expert Richard Auger. In it he takes users through the introduction of loops into event rules in EFT 8.0.4.
I recently wrote an opinion piece on EFT 8.0.4, in which I touched upon the introduction of loops into event rules. I thought that perhaps I would share an example of how you can put loops to good use in a rule.
My use case was fairly simple:
- Transfer files from a known folder and, based upon the file name, deliver to a dynamically set destination folder.
- When the transfer is complete, email the folder owner to inform them of the file.
The first thing I needed was a reference file in CSV format. This needs 3 columns – the filename, destination folder, and recipient email address. The ordering of the columns is irrelevant, but one thing to point out is that column headers are case sensitive – whatever case you use here, you must stick to in the rest of the rule. Potentially, I could have added some more columns here – recipient name as well as email address, for example, to allow for a better formatted email.
This is the CSV I chose:
I started the script by getting a listing of the source folder and loading it into a dataset that I called InputFiles. Before looping through the dataset, I read in the reference CSV and saved that into a dataset called ‘Refs’. I did this at this point as I only needed to read it once; I could loop through the reference as many times as I wanted.
Next came the loop through the dataset InputFiles. I set a variable called %infile% to contain the value %InputFiles.CurrentRow.FileName%. This contains the filename that I found in the source directory. I didn’t necessarily need to set this, however by doing so I saved myself some typing, made things easier to read, and also had the opportunity to write the content of the variable into the EFT.log.
I then proceeded to loop through the dataset Refs. This inner loop would execute for each row of the outer loop. I again set a variable %compare% to contain %Refs.CurrentRow.filename% for the same reasons as before.
Now I hit a problem; no matter how hard I tried, I could not successfully compare %infile% to %compare% in an IF comparison. After much checking, I found that context variables can only be used on the left side of an IF comparison; entering a variable on the right side is interpreted as text. What I needed to do was have a constant that I could use instead.
My solution to this was to embed some PowerShell and do a comparison there:
For reference, this is the code I used:
$infile = $EFT_CONTEXT.GetVariable(“infile”)
$compare = $EFT_CONTEXT.GetVariable(“compare”)
if ($infile -eq $compare) {$EFT_CONTEXT.SetVariable(“found”, “yes”)} else {$EFT_CONTEXT.SetVariable(“found”, “no”)}
This piece of the code…
$EFT_CONTEXT.SetVariable(“found”, “yes”)
…created another custom variable called %found% which would indicate that I had a match between the source filename and reference filename.
Finally, I copied the file (using its full path rather than just the filename) to a destination with a dynamically constructed path. I followed this up with an email to a dynamically set recipient, wrote everything to the event log. (Handy Tip: do this to check your variables are what you expect) and as a last step, broke out of the inner loop; once you’ve found a match, you don’t need to go any further. This is how my rule looks:
There are of course improvements to be made to this script if you want to run it in production – for a start you would need to have a ‘catch-all’ row at the end of the reference CSV, and modify the PowerShell to do a pattern match rather than precise comparison. However, this script demonstrates how you can make good use of the new functionality in EFT 8.0.4.
![Line](https://www.globalscapesoftware.co.uk/hubfs/raw_assets/public/GlobalscapeSoftware_November2021/images/blue-line-300x50.png)
EFT Modules
![Line](https://www.globalscapesoftware.co.uk/hubfs/raw_assets/public/GlobalscapeSoftware_November2021/images/blue-line-300x50.png)