Software Venture Consulting

FileMaker Pro downloads & Resources
FileMaker Custom Functions
FileMaker Web Viewer Examples
FileMaker Pro & Lasso Consulting
FileMaker Books
FileMaker Articles
FileMaker Error Reference

Free Web Tools
Free FileMaker Tools

Personal Pages

Shopping Cart
Shopping Cart


Free Newsletter


Privacy Policy

FileMaker is a registered trademark of FileMaker, Inc. in the U.S. and other countries.


 FileMaker Pro Custom Functions

List  |  Show Random  |  Upload  |  Add This to Your Site

xShuffle ( string; control )

Rate this function:  

  Average rating: 4.4  (22 votes)
  Discuss this Custom Function

Nick Lightbody, Deskspace Systems Limited

To shuffle a string

Sample Input:
abcdef, 7
Sample Output:

 Then copy & paste into FileMaker Advanced's Edit Custom Function window.

Click here to copy To Clip Manager if you have myFMbutler's Clip Manager installed


Understanding a tail recursive FileMaker Custom Function.

This is just for any non-mathamaticians out there for whom recursion is not second nature. Filemaker has offered recursion since 2007 and this is the first time I felt I understood tail recursion, so this may be helpful for a few former Arts students like me.

Sometimes, when doing encryption it is useful to shuffle sets of characters, for example when creating substitution keys.
In the past I have just written simple scripts in Filemaker to do this because, although I have used and adapted recursive custom functions several times, I have never really understood the difference between a normal recursive function and a tail recursive function.

This is important because the normal form is limited to 10,000 cycles in FileMaker but the tail form can run to 50,000 cycles.

The other day I had to create a shuffle routine within a database definition hence, as I couldn't script it, I had to work out how to create a suitable recursive function.

A quick search found an erudite explanation by Ray Cologon from 2006 which explained the difference...

Here is the key quote: "Tail recursion has nothing to do with whether you 'loop' backwards from the end or forward from the beginning. What matters is how values accumulate and are passed down through successive function calls (and in particular, whether the function must feed values via a temporary memory 'stack' in the course of its operation). In the simplest terms, recursive functions that are constructed so that they don't depend on the stack are tail recursive."

In other words, it is tail recursive if you pass all the results of the expression on to the next iteration as parameters without creating local variables.

With that understood it was fairly simple to construct my shuffle function so that it output the shuffled string and a control value, so the control value reduced by 1 on each call and the result of the expression no longer called itself when the control had reduced to zero.

Nick Lightbody
September 9th 2015

Note: these functions are not guaranteed or supported by Please contact the individual developer with any questions or problems.

This is my Custom Function and I want to edit it


There are no comments yet. Be the first to post a comment about this Custom Function! Please try to keep it brief & to the point. Anyone can post:

Your Name:
characters left. If you paste in more than 1500 characters, it will be truncated. Discuss the function - advertisements and other useless posts will be deleted.
Answer 2 + 5 =
Search for Custom Functions:

Custom Functions Widget
Download the Custom Function Dashboard Widget for OS X
Keep all the latest Custom Functions right at your fingertips!

Newest Custom Functions:

1. sql.getTable ( fullyQualifiedFieldObject )
  (Thu, Feb 22, 8:36am)
2. sql.getField ( fullyQualifiedFieldObject )
  (Thu, Feb 22, 8:34am)
3. FilterOut ( ListA ; ListB )
  (Wed, Feb 21, 6:11pm)
4. Char0 ( )
  (Sun, Feb 18, 2:35am)
5. CreateVCardFile ( FirstName ; LastName ; CompanyName ; Phone ; Email ; WEB ; hAddress1 ; hAddress2 ; hZip ; hCity ; hCountry ; wAddress1 ; wAddress2 ; wZip ; wCity%2
  (Sun, Feb 18, 1:50am)
6. AccurateAge (start; end )
  (Tue, Feb 13, 5:41am)
7. fnParser_UnCertain(text;firstSymbol;secondSymbol;SN)
  (Mon, Feb 12, 11:10pm)
8. sql.whereInList.asList ( fqFieldToReturn ; fqFieldToMatch ; listOfValuesToMatch )
  (Wed, Feb 07, 2:03pm)

RSS Feed of Custom Functions