SQLite turned 20

SQLite just turned 20 years old.

The first check-in of SQLite code occurred 20 years ago.
see sqlite.org/src/timeline?c=2000-05-29

Version 1 just had a few commands. Open database, close database, execute a statement. Code for recordsets didn't exist at that time and came later.

Congratulations to Richard Hipp and his team!

see SQLite Forum

JWT RS256 authentication in FileMaker

Recently a client asked about JWT signatures. Here is an example calculation for JWT with HS256 in FileMaker with MBS FileMaker Plugin. We prepare a header and payload string with some sample data. Inside the header we declare the algorithm to be HS256, which means we use HMAC with SHA256 as hashing algorithm. The payload is some JSON and depends on the web service you use, but for the example we specify it here directly. Next we encode both using Base64URL and do the HMAC and finally assemble everything:

Let ( [

secret = "secretkey";
header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
payload = "{\"loggedInAs\":\"admin\",\"iat\":1422779618}";

// calculate hash
encodedString = MBS( "Text.EncodeToBase64URL"; header; "UTF-8" ) & "." & MBS( "Text.EncodeToBase64URL"; payload; "UTF-8" );
hash = MBS( "Hash.SHA256.HMAC"; secret; encodedString; 1+8 );

// and built final result:
result = encodedString & "." & hash
]; result )


5 Monate bis zur Deutschen FileMaker Konferenz 2020 in Malbun

Noch fünf Monate bis zur FileMaker Konferenz 2020 in Malbun (Liechtenstein).

Vom 28. bis 31. Oktober findet die elfte deutschsprachige FileMaker Konferenz in Malbun, Liechtenstein statt. Ursprünglich geplant für Juni muss die Veranstaltung leider in den Oktober verschoben werden. Wir hoffen dennoch auf tolles Wetter, viele Interessante Teilnehmer und Gespräche. Eventuell könnte das die einzige Konferenz rund um FileMaker in diesem Jahr werden, die vor Ort stattfindet.

Ein MBS Schulungstag ist für den Mittwoch vorher geplant. Bei Interesse kann man sich gerne bei uns anmelden.

Die Veranstalter vom Verein FM Konferenz erwarten auch 2020 rund 120 Entwickler, Anwender, IT-Fachleute und Entscheidungsträger aus Wirtschaft, Bildung und Verwaltung. Rund um über 20 Fachvorträge und Workshops wird es viel Zeit zum Vernetzen in den gemeinsamen Pausen und beim Abendprogramm geben.

Für den Deutschsprachigen Raum ist diese Konferenz das Treffen des Jahres. Hier finden Sie vom Anfänger bis zum Profi Kontakte zu anderen Entwicklern. Lernen Sie was es neues gibt, nehmen Sie Impulse mit für die eigene Arbeit und erfahren Sie mehr zu FileMaker von deutschsprachigen Experten!
Bitte planen Sie wenigstens einen extra Tag ein für ihren Besuch in Liechtenstein, damit Sie die Natur in dem schönen Tal geniessen können. Den Aufstieg auf den Sareis können Sie bequem zu Fuß vom Hotel aus starten und die Turnastraße hinauf spazieren bis zum Restaurant am Gipfel. Oder alternativ die Seilbahn nehmen.

More customization for Claris FileMaker Web Direct

Recently a client asked how to customize the look of Web Direct a bit more than just changing the layouts in FileMaker itself.


First thing may be to get a 32x32 pixel logo of your company with alpha channel. Save it with e.g. GraphicsConverter as a ico file named "favicon.ico". Now on your FileMaker Server, locate the favicon.ico file from Claris in the following path and replace it there:

Web Publishing/publishing-engine/jwpc-tomcat/fmi/VAADIN/themes/default/favicon.ico

Once you replaced it and restarted browser and reload the pages, you may see your icon there.


Next we can customize the html files in the folder:

Web Publishing/publishing-engine/jwpc-tomcat/fmi/VAADIN/launchcenter/

The home.html file contains the first page loaded. So there we can edit it and write a custom text there:

<title>MBS Web Database</title>

This is the text the tab will use as label in the browser and users bookmarking it will use for the bookmark.

Login Screen

To show a custom logo on the login screen, we can change login.html file to have a line after the <div id="login_dialog_body"> line there to put some picture just over the login fields with html like this:

<p align=right><img src="/fmi/VAADIN/launchcenter/mbs.png" width=300 height=300></p>

The image goes in the same folder as the html file and we reference it directly via that folder.

Screenshot from a test server running FileMaker Server 19 with default certificate in German.


For all the changes, please know what you do. Be familiar with unix file permissions, how to use a real text editor like BBEdit on MacOS or UltraEdit on Windows (Word won't work) and make backup copies of the files before you modify them. A wrong or broken html tag can make the website to not work properly.

If you have to update or reinstall FileMaker Server, all your changes are lost and should be manually recreated. Don't just copy over your modified files as the structure of the files may have changed.

The FileMaker.PerformScript function in FileMaker 19

You may have read the documentation about the new JavaScript integration in FileMaker 19. Let's take a look on this in detail. For every website you load, FileMaker injects automatically a little JavaScript when the page is finished loading. The JavaScript for the PerformScript script in the FileMaker namespace looks like this:

function PerformScript(name, parameter) {
    if (parameter == null) {
        parameter = ""
    var message = '{"command": "PerformScript", "value": { "name": ' + quote(name) + ', "parameter": ' + quote(parameter) + '}}';
    // For mac
    if (window.webkit && window.webkit.messageHandlers.fm != null) {
    } else if (window.external != null) {
        // For windows

As you see for MacOS (and iOS), they use the MessageHandler protocol offered by WebKit, which is the same we use for our WebView.AddScriptMessageHandler function in MBS FileMaker Plugin. The message handler is quotes the given parameters, builds a JSON text and passes this to the message handler.

If you need, you can use MBS FileMaker Plugin to add the same functionality for MacOS and iOS (iOS with FileMaker iOS SDK) to your solution for FileMaker 16 to 19. Use WebView.RunJavaScript to install the FileMaker object with the function above. You may need to add a file name parameter as we need that for the plugin to call a script.

For Windows, the use the external messaging, which is available in Internet Explorer control. Sadly we can't access this via plugin interface for our plugin. But a great move by Claris to add this for us!

Now you may notice that the function checks whether window.webkit.messageHandlers.fm is defined, so if the message handler is not yet installed, the calls to PerformScript do nothing. But you may be able to check whether FileMaker is not undefined like this:

if (typeof(FileMaker) != "undefined") { /* okay */ }

In your JavaScript on the website, you may just run setup work on start and set a timer to do any call to FileMaker.PerformScript a few milliseconds later.
You may want to checkout onfmready.js from Stephan Casas, who made a nice utility function to delay the call until FileMaker.PerformScript is available. See also community posting.

See also Check out options for FileMaker JavaScript Integration

Disable Dark Mode for FileMaker 19 application

If you like to disable Dark Mode for the FileMaker 19 application, but continue to use Dark Mode for all other applications, you can use the following command line in Terminal to run FileMaker always in light mode:

defaults write /Applications/FileMaker\ Pro.app/Contents/Info NSRequiresAquaSystemAppearance -boolean yes

If you have FileMaker Pro installed in a different location, you may need to adjust the path. To reverse you can always call this again with "no" as value on the end.
If a future FileMaker 19 update replaces the application, this setting is reset.

PS: This may break code signing, so you may also use codesign --remove-signature command to remove the broken signature.

Checkout Machine Learning features in FileMaker

Have you seen the machine learning functions in FileMaker 19?

Apple added CoreML framework in 2017 and presented it at WWDC that year. The framework allows to easily load a model for machine learning and call it with your input data. Examples include visual detection of things in pictures like image classification. Other examples include speech detection and sound analysis, text analysis or pattern matching. For example we saw models to take text and tell you the language or the mood of the writer. Also welcome are models to detect porn or violence to filter those.

FileMaker 19 comes built-in with a new script step Configure Machine Learning Model to load a model and let FileMaker know the parameters. Then you can use the new ComputeModel function to run the model. The great thing here is that this is built-in to FileMaker Go, so we expect many more people to use this on the go with FileMaker databases without the need to use iOS SDK and a plugin.

Since 2017 we have CoreML functions in MBS FileMaker Plugin. Compared to the built-in functions in FileMaker, the plugin may have a few more goodies for you. While you can't use it in FileMaker Go, you can do a FileMaker iOS SDK application or in MacOS with FileMaker Pro. Due to the plugin being separate with FileMaker, you can use it in older FileMaker versions if needed. The plugin provides the functionality as functions, so you can use them in custom functions and don't need to use a script. Although we usually use scripts, it can be handy to do something in a Let statement somewhere.

A few extra options you have with our plugin is to provide array parameters to the model. e.g. if you have a model doing math on an one or two dimension array, check the CoreML.AddArrayParameter and CoreML.Add2DArrayParameter functions. Use our CoreML.ResultImage function for models returning you an image. And finally use CoreML.Update to update the model on the go with new data.

See also:

Please don't hesitate to contact us with your questions.

Check out options for FileMaker JavaScript Integration

The just released FileMaker version 19 brings some welcome additions to use JavaScript with web viewer. You can now use a script step Perform JavaScript in Web Viewer to run JavaScript within the web viewer on the current layout.

In MBS FileMaker Plugin, we have our own WebView.RunJavaScript function since version 1.3 from July 2007. That function has been upgraded as WebView.Evaluate end of last year for version 10.0 of our plugin to provide results back on MacOS, Windows and iOS.

The built-in functionality has an advantage the plugin can't provide, which is is having it work in FileMaker Go or Web Direct. But you first need to upgrade everything to FileMaker version 19.

As usual we expect that the majority of the FileMaker developers will be happy with the built-in functionality, but if you need more, our plugin can provide additional features. Here is a table to compare features between MBS FileMaker Plugin and FileMaker's built-in functions.

FeaturePlatformFileMaker 19MBS FileMaker Plugin
Required FileMaker versionFileMaker 19 and newerFileMaker 19, 18, 17 and older
Run JavaScript in web viewerFileMaker MacOSYesYes
FileMaker WindowsYesYes
iOS with FileMaker GoYesNo plugin on FileMaker Go
iOS with SDKYesYes
Web DirectYesNo, plugin has no access to browser with Web Direct
Run JavaScript without Web ViewerFileMaker MacOSNoYes, see JavaScript or JavaScriptMac functions
FileMaker WindowsNoYes, see JavaScript Functions
iOS with FileMaker GoNoNo plugin on FileMaker Go
iOS with SDKNoYes, see JavaScript or JavaScriptMac functions
Web DirectNoYes, see JavaScript Functions
Server ScriptingNoYes, see JavaScript Functions
Returns result from JS directlyFileMaker MacOSNoYes, with WebView.Evaluate, JavaScriptMac or JavaScript functions
FileMaker WindowsNoYes, with WebView.Evaluate or JavaScript functions
iOS with FileMaker GoNoNo plugin on FileMaker Go
iOS with SDKNoYes, with WebView.Evaluate, JavaScriptMac or JavaScript functions
Web DirectNoNo, plugin has no access to browser with Web Direct
Server ScriptingNoYes, see JavaScript Functions
Trigger script via FMP URLYesYes
Trigger script from JavaScriptFileMaker MacOSYesYes, via WebView.AddScriptMessageHandler
FileMaker WindowsYesNo, WebView.InstallCallback broke with newer IE versions. ServerSocket functions may work.
iOS with FileMaker GoYesNo plugin on FileMaker Go
iOS with SDKYesYes, via WebView.AddScriptMessageHandler
Web DirectYesNo
Pass file name for script:No, always current file.Yes
Available via Script StepYesYes
Available as FunctionNoYes
Available for Custom FunctionsNoYes
Data Types for parameter or return valueText onlyText, Boolean, Number or JSON.
Set Webviewer to be silentNoYes, for Windows, see WebView.SetSilent
Run JavaScript synchronouslyNoYes
Run JavaScript asynchronouslyYesYes, for MacOS & iOS via option for WebView.RunJavaScript function
Works in runtimesNoYes

Let us know if you have a correction or addition for the table above.
Please don't hesitate to contact us with your questions.

Welcome FileMaker 19

The release of Claris FileMaker 19 marks and a big step for Claris on their move to a new agile development cycle. They said this is the last big yearly update. In future Claris Inc. plan to release smaller updates more regularly and push new features quicker to developers. Instead of developing something and waiting for next May to release it, they will now release things as they get ready over the year. And if we will install many more updates over the years, we hope they soon allow in-place updates for the server without reinstalling.

For MBS Plugin the recent release 10.2 is updated for FileMaker 19. Older versions like 10.1 still had bugs we corrected later, so please avoid older plugins to not run into issues we fixed already. The older version 10.1 mostly works, but we have a few issues including a crash in Script Workspace. Using older versions in FileMaker 19 is not supported.

You may heard that Claris works on a Linux version of the FileMaker Server as mentioned in their roadmap video. MBS Plugin has been supporting Linux since we got the first Cloud server betas in 2016. Over the years we learnt a lot and currently our plugin works fine on a lot of FileMaker Cloud servers on AWS. Once released later this year, you may be able to install Claris FileMaker Server on your own computer running a supported Linux distribution. Our Linux version of MBS Plugin can be used there and we suggest you get the developer preview in the next months.

In the next blog posts, we will take a deeper look to compare the JavaScript and CoreML features in FileMaker 19 to the features in our plugin. While FileMaker now has some things built-in, we expect the plugin to add value for developers with some extra functionality.

If you see problems, please do not hesitate to contact us.

Automatically install MBS FileMaker Plugin

You can automate the installation of MBS FileMaker Plugin via the Install Plugin script step. This is great when you have hundreds of FileMaker Pro installations and you need to use the plugin locally in your scripts. But same techniques apply for server installations for people with a lot of FileMaker servers. Especially if you manage a vertical solution with hundreds of customers running each servers and clients, you like to automate this.

Things to consider

When you plan to add automatic plugin install, you may need to think about the processes and how to define the table and the scripts. For example you can have a table which contains the plugin and metadata. You may want to have the following fields:

  • The plugin name, as this can be used for multiple plugins.
  • The plugin version
  • The platform for the given file: MacOS, Windows, Linux and 32/64bit if needed.
  • An active switch, so you can enable/disable this plugin
  • Minimum and maximum FileMaker version, so you can have an older plugin for an older FileMaker version and a newer version for a newer FileMaker version.
  • The target groups like development, testers, users. Define whether this version should install for a given group of people.
  • A force downgrade switch. This may force a downgrade to an older version if needed and you discovered a problem with a newer version of a plugin.

News about the MBS FileMaker Plugin 10.2

In this article I want to introduce you the new functions from the MBS FileMaker Plugin in version 10.2.

We have some new functions that help you to work with the FileMaker layout IDs. You can get the ID of the current layout with FM.CurrentLayoutID function. If you have a layout name, you find the matching layout ID with FM.LayoutNameForLayoutID function. Other way you can query the layout ID to a given layout name with FM.LayoutIDForLayoutName function and list all layout names with FM.LayoutNames.
This is analog to our script functions to query ID or name for scripts, see FM.ScriptIDForScriptName and FM.ScriptNameForScriptID.

In the new version we add a lot of function for the work with the data structure named Matrix. With the Matrix.Add function we can add a value to a range of cells in the matrix. If we want to change the entries by a formula we can use the new Matrix.Evaluate function.

If we want to copy a column or a row from one matrix to another or to another place in the same matrix, we can use the functions Matrix.CopyColumn and Matrix.CopyRow. In the parameters we first specify the matrix from which we want to copy data, followed by the row or column to be copied. The next parameters are the target matrix and the target row or column.

We can now also use the functions Matrix.SetColumnName and Matrix.SetRowName to set column or row names. These can then be read out individually with Matrix.GetColumnName and Matrix.GetRowName. With Matrix.GetColumnNames and Matrix.GetRowNames we get a list of the columns or row names. Whenever you specify a column or row index, you can now pass the name instead. Please make sure the names are unique. (more)

Custom Functions to Log Script Calls and maintain call stack

We have three handy custom functions for you to log function calls with MBS FileMaker Plugin:

  1. CountScriptCall
  2. LogFunctionCall
  3. LogFunctionResult
And they can be used together to log function calls like on the screenshot here:


Now let's take a look on each function. Start of the script may just call the first two functions together in one Set variable script step:

Set Variable [ $r ; Value: CountScriptCall & LogFunctionCall ]

The CountScriptCall function is to check which scripts get called and how often. We can call it in each script on the start to log that this script is still in use. We use a global variable $$LogScriptCalls to turn this on/off as needed. In the custom function we first try to insert a record via FM.InsertRecord in the log table. If that fails as the record with same unique key is already there, we use the FM.ExecuteFileSQL to run an SQL statement to update the counter and increase it. FileMaker also updates the modification time stamp field. This way we know the first time the function was called via creation date and the last time called via modification date. Take a look on our CountScriptCall function here:


Let ( [

FileName = Get(FileName); 

ScriptName = Get(ScriptName); 

// try to insert new record

r = MBS( "FM.InsertRecord"; FileName; "ScriptCallCounter"; "Counter"; 1; "ScriptName"; ScriptName; "FileName"; FileName );

// r shows OK or "[MBS] ERROR:  (504): Field failed unique value validation test" in case of duplicate

// check for error: 504

p = Position ( r ; "(504)" ; 1 ; 1 );

// update existing call on error

r = If( p > 0; MBS( "FM.ExecuteFileSQL"; FileName; "UPDATE \"ScriptCallCounter\" SET \"Counter\" = \"Counter\" + 1 WHERE \"ScriptName\" = ? AND \"FileName\" = ?"; 9; 13; ScriptName; FileName ); r) 

]; r ); "")

As you see we pass FileName to the two MBS functions for the file name of the log table. But that is not required as you can move the logs to another file. This way logs appear in a different file as they can become quite big.


This function should log a function call. Again enabled via $$LogScriptCalls global variable, we query a few information pieces for the context like user name, current table and layout. We then generate an unique ID and store it in a local variable to be able to later find the record again. We add our script to the $$CallStack variable, we always have the current call stack in a variable and we can know which script calls which other script. To log we use FM.InsertRecord again to pass all the field names and values.

Here is the calculation for the LogFunctionCall function:

If($$LogScriptCalls; Let ( [

// query some values about current context

FileName = Get(FileName); 

ScriptName = Get(ScriptName); 

TableName = Get(LayoutTableName); 

AccountName = Get(AccountName); 

LayoutName = Get(LayoutName); 

UserName = Get(UserName); 

IP = Get(SystemIPAddress); 

ScriptParameter = Get(ScriptParameter); 

// make an unique key for later

$ScriptCallID = Get(UUID);

// and build call stack

$$CallStack = $$CallStack & ScriptName & ;

// now log it.

r = MBS( "FM.InsertRecord"; FileName; "ScriptCallLog"; 

"ScriptCallID"; $ScriptCallID; 

"ScriptName"; ScriptName; 

"FileName"; FileName; 

"TableName"; TableName; 

"LayoutName"; LayoutName; 

"AccountName"; AccountName; 

"UserName"; UserName; 

"IP"; IP; 

"ScriptParameter"; GetAsText(ScriptParameter);

"CallStack"; $$CallStack;

"StartTime"; Get ( CurrentTimestamp ))

]; r ); "")

Every script must have such a line on the end and you call the function for each way the script can be exited. That is some work, but only if the function is called, we can cleanup the $$CallState variable. We check $ScriptCallID variable for whether we have an ID set earlier. If so, we can use it to update the log and add the end time and the script result to the table. As start and end time of each script is set, you can calculate later how long those scripts take.

Here the calculation for the LogFunctionResult function with parameter Result:

If(not IsEmpty($ScriptCallID); Let ( [

// remove us from call stack

$$CallStack = LeftValues ( $$CallStack ; ValueCount ( $$CallStack ) - 1 );

// now updat entry in log to show result.

FileName = Get(FileName); 

r = MBS( "FM.ExecuteFileSQL"; FileName; "UPDATE \"ScriptCallLog\" SET \"ScriptResult\" = ?, \"EndTime\" = ? WHERE \"ScriptCallID\" = ?"; 9; 13; GetAsText( Result ); Get(CurrentTimestamp); $ScriptCallID )

]; Result ); Result)

What do you think about those functions?
See problems? Flaws? Please let us know, so we can update our example.
The example database will be included with future plugin updates.

See also Looping over records in FileMaker with error checking for the CheckError custom function.

DynaPDF Manual online

DynaPDF has it's own documentation, which you can find included with our plugin: dynapdf_help.pdf.

In order to read it in a browser and for search engines to soon index it, I put the manual online as a webpage version:


Maybe it helps people. Updated today to current version. We link to this from our plugin documentation extensively, so you may jump right from our documentation to the original dynapdf documentation.

Dash help archives for Xojo and FileMaker

For browsing help files, the Dash application is very useful on Mac and iOS.

Here you can click to launch Dash and install our plugin help:
MBS Xojo Plugin and MBS FileMaker Plugin

You can download the archives manually on our website:
FileMaker and Xojo (Real Studio).

You can also add Xojo documentation itself to your dash set, see download in preferences dialog.
For FileMaker you find the docsets here: FileMaker Dash Docsets

For Windows and Linux, you can use Zeal application. You may need to download the archive and install manually.

Feedback is welcome.

MBS FileMaker Plugin 10.2 - More than 6200 Functions In One Plugin

Nickenich, Germany - (May 12th, 2020) -- MonkeyBread Software today is pleased to announce MBS FileMaker Plugin 10.2 for macOS, iOS, Linux and Windows, the latest update to their product that is easily the most powerful plugin currently available for FileMaker Pro. As the leading database management solution for Windows, macOS, iOS and the web, the FileMaker Pro Integrated Development Environment supports a plugin architecture that can easily extend the feature set of the application. MBS FileMaker Plugin 10.2 has been updated and now includes over 6200 different functions, and the versatile plugin has gained more new functions:

For our JavaScript engine embedded in the plugin, we got a great example using LibPhoneNumber. This is a library to format and validate phone numbers. The library is part of the example file and loaded in the JavaScript environment at start of the solution, so you can run queries against it later. Great to format phone numbers in your solution or to alert the user if the format is incorrect. This can be used on clients and server and does not need a web viewer on the layout!

Our DynaPDF functions got new capabilities to create signature fields. We can sign PDFs for years, but now you can show a field on the PDF page with a custom appearance. The PDF viewer validates the signature and shows the status next to your own graphics. For form fields we can now attach images to buttons in forms. To draw gradients, you can now create radial and axial shadings.

If you like data structures with our plugin, check out the improved matrix functions. Columns and rows can now be named and accessed by name. The Matrix.Evaluate function allows you to pass an expression, so we evaluate it for each value to generate a new value. To add or subtract a value, you can check the new Matrix.Add function. We have two functions to copy rows or columns from one matrix to another: Matrix.CopyColumn and Matrix.CopyRow.

For JSON we added a JSON.SortWithEvaluate function to sort JSON objects or arrays with custom expression. Your expression can check the JSON to compare and define how the JSON values are compared. The JSON.AddArrayToArray function quickly copies the content of one array to append another JSON array.

The SQL functions to other databases can get you all fields in a row or the whole result set as a JSON block. You can get and set all parameters for a SQL command with JSON. Those functions can be used together with FM.SQL.JSONRecord and FM.SQL.JSONRecords functions to export data to foreign databases. In the other direction, to FileMaker, the SQL.InsertOrUpdateRecords function can now pass dates, times and timestamps better.

To synchronize multiple scripts in FileMaker server between WebDirect and Script Engine, we got new Mutex functions. They also help to synchronize use of our SharedMemory functions.

Our list functions got new ways to count items in the list and find the index of the first matching element. The List.SortWithEvaluate and QuickList.SortWithEvaluate functions allow you to sort lists with custom expressions. Your expression is evaluated to compare two entries and provide a custom sorting.

For CURL we can now provide HTTP headers as JSON with our new CURL.GetHeaderAsJSON function. If you need to use a specific CURL library, you can load it with the CURL.LoadLibrary function. For Linux we load libidn dynamically if installed and use it to resolve domain names with unicode characters. For MacOS and Windows we let the system do this. We enabled SSPI, Kerberos 5 and SPNEGO for CURL functions on Windows.

Our new plugin allows you to use LibXL in version 3.9, the library we use to read and write Excel documents (xlsx and xls) without having Microsoft Excel being installed. The new version enables us to read styled text from cells in the document and return them as styled text in FileMaker with XL.Sheet.CellReadStyledText function. In the other direction, we can pass styled text from a FileMaker field directly to a cell in the Excel document with XL.Sheet.CellWriteStyledText function. You can query whether a cell contains styled text with XL.Sheet.CellIsStyledText and you can set the calculation mode for the whole document. For columns and rows you can now let LibXL return you the size in pixels to better adjust pictures to place to the right size.

The hotkey functions can now define hotkeys to work only in ScriptWorkspace and to be permanently stored in preferences file. This helps to automate actions in Script Workspace in relation to our custom contextual menu commands there. Please enjoy improved font size support in the Script Workspace.

The new XML.Compact function can compact XML and is the reverse for XML.Format function. With WebView.SetInternetExplorerHiDPI function you can enable HiDPI support for the web viewer on Windows. The CoreML functions can now pass 2D data with CoreML.Add2DArrayParameter function. With WebView.InstallUserMediaAccess and new preferences keys you can enable camera access within web viewer on MacOS and iOS.

Finally we updated CURL to version 7.70.0, DynaPDF to, SQLAPI to 5.0.6, LibXL to 3.9 and OpenSSL to 1.1.1g.

See release notes for a complete list of changes.

Neues MBS FileMaker Plugin 10.2

12. Mai 2020 - Monkeybread Software veröffentlicht heute das MBS Plugin für FileMaker in Version 10.2, mit inzwischen über 6200 Funktionen eines der größten FileMaker Plugins überhaupt. Hier einige der Neuerungen:

Für unsere JavaScript-Engine im Plugin haben wir ein tolles Beispiel mit LibPhoneNumber entwickelt. Diese Bibliothek formatiert und validiert Telefonnummern. Das benötigte JavaScript ist Teil der Beispieldatei und wird beim Start der Lösung in eine JavaScript Umgebung geladen, so dass Sie später jederzeit Funktionen aufrufen können. Großartig, um Telefonnummern in Ihrer Lösung zu formatieren oder den Benutzer zu warnen, wenn das Format falsch ist. Dies kann auf Clients und Server verwendet werden und benötigt keinen WebViewer auf dem Layout!

Unsere DynaPDF Funktionen haben neue Möglichkeiten erhalten, um Signaturfelder zu erstellen. Wir können seit Jahren PDFs signieren, und mit dem 10.2er Plugin können Sie ein Signatur-Feld auf der PDF Seite mit einem benutzerdefinierten Erscheinungsbild anzeigen. Der PDF Betrachter prüft die Signatur und zeigt den Status neben Ihren eigenen Grafiken an. Für Formularfelder können wir jetzt Bilder für Buttons in Formularen festlegen. Zum Zeichnen von Farbverläufen können Sie jetzt radiale und axiale Schattierungen erstellen.

Wenn Ihnen Datenstrukturen mit unserem Plugin gefallen, schauen Sie sich die verbesserten Matrixfunktionen an. Spalten und Zeilen können jetzt benannt und über den Namen aufgerufen werden. Die Funktion Matrix.Evaluate erlaubt es Ihnen, einen Ausdruck zu übergeben, so dass wir ihn für jeden Wert auswerten, um einen neuen Wert zu berechnen. Um nur einen Wert zu addieren oder zu subtrahieren, können Sie die neue Funktion Matrix.Add verwenden. Wir haben zwei Funktionen zum Kopieren von Zeilen oder Spalten von einer Matrix in eine andere: Matrix.CopyColumn und Matrix.CopyRow.

Für JSON haben wir eine Funktion JSON.SortWithEvaluate hinzugefügt, um JSON-Objekte oder -Arrays mit benutzerdefiniertem Ausdruck zu sortieren. Ihr Ausdruck kann entscheiden wie die zwei JSON Werte verglichen werden. Die Funktion JSON.AddArrayToArray kopiert den Inhalt eines Arrays und fügt ihn einem anderen JSON-Array hinzu.

Die SQL Funktionen zu anderen Datenbanken können Ihnen alle Felder in einer Zeile oder die gesamte Ergebnismenge als JSON-Block liefern. Sie können alle Parameter für einen SQL-Befehl als JSON abfragen oder übergeben. Diese Funktionen können zusammen mit den Funktionen FM.SQL.JSONRecord und FM.SQL.JSONRecords verwendet werden, um viele Daten in fremde Datenbanken zu exportieren. In umgekehrter Richtung kann die Funktion SQL.InsertOrUpdateRecords nun Datums- und Zeitangaben sowie Zeitstempel besser an FileMaker übergeben.

Um mehrere Scripte in FileMaker Server zwischen WebDirect und Script Engine zu synchronisieren, gibt es neue Mutex Funktionen. Sie helfen auch bei der Synchronisierung unserer SharedMemory Funktionen.

Unsere List Funktionen haben neue Möglichkeiten, Elemente in der Liste zu zählen und den Index des ersten übereinstimmenden Elements zu finden. Die (Quick)List.SortWithEvaluate Funktionen ermöglichen es Ihnen, Listen mit benutzerdefinierten Ausdrücken zu sortieren. Ihr Ausdruck wird ausgewertet um zwei Einträge zu vergleichen und eine benutzerdefinierte Sortierung bereitzustellen.

Für CURL können wir jetzt HTTP-Header als JSON mit unserer neuen Funktion CURL.GetHeaderAsJSON abfragen. Wenn Sie eine bestimmte CURL-Bibliothek verwenden müssen, dann laden Sie diese mit der Funktion CURL.LoadLibrary. Für Linux laden wir libidn dynamisch, falls installiert, und verwenden diese, um Domänennamen mit Unicode-Zeichen aufzulösen. Für MacOS und Windows lassen wir das System dies tun. Unter Windows haben wir SSPI, Kerberos 5 und SPNEGO für die CURL Funktionen aktiviert.

Unser neues Plugin ermöglicht Ihnen die Verwendung von LibXL in Version 3.9, der Bibliothek zum Lesen und Schreiben von Excel-Dokumenten (xlsx und xls) ohne dass Microsoft Excel installiert sein muss. Die neue Version ermöglicht es uns, formatierten Text aus Zellen im Dokument zu lesen und als formatierten Text in FileMaker mit der Funktion XL.Sheet.CellReadStyledText zurückzugeben. Umgekehrt können wir mit der Funktion XL.Sheet.CellWriteStyledText formatierten Text aus einem FileMaker-Feld direkt an eine Zelle im Excel-Dokument übergeben. Mit der Funktion XL.Sheet.CellIsStyledText können Sie abfragen, ob eine Zelle formatierten Text enthält, und Sie können den Berechnungsmodus für das gesamte Dokument festlegen. Für Spalten und Zeilen können Sie nun von LibXL die Größe in Pixeln zurückgeben lassen, um Bilder besser an die richtige Größe anpassen zu können.

Die Hotkey Funktionen können jetzt Hotkeys definieren, die nur im ScriptWorkspace funktionieren und dauerhaft in der Einstellungsdatei gespeichert werden. Dies hilft bei der Automatisierung von Aktionen im Script-Arbeitsbereich in Bezug auf unsere dortigen benutzerdefinierten Kontextmenübefehle. Unsere Anpassung der Schriftgrößen im Script-Arbeitsbereich funktioniert inzwischen deutlich besser.

Die neue Funktion XML.Compact kann XML komprimieren und ist die Umkehrung der Funktion XML.Format. Mit der Funktion WebView.SetInternetExplorerHiDPI können Sie die HiDPI-Unterstützung für den WebViewer unter Windows aktivieren. Die CoreML Funktionen können jetzt 2D-Daten mit der Funktion CoreML.Add2DArrayParameter übergeben. Mit WebView.InstallUserMediaAccess und neuen Einstellungen können Sie den Kamerazugriff innerhalb des WebViewers unter MacOS und iOS aktivieren.

Schließlich haben wir CURL auf Version 7.70.0, DynaPDF auf, SQLAPI auf 5.0.6, LibXL auf 3.9 und OpenSSL auf 1.1.1g aktualisiert.

Alle Änderungen in den Release Notes.

ARM Macs thoughts

Recently a client asked whether we would be ready for Apple someday switching to Mac computer with ARM based CPU design.

First we expect, if Apple does such a move, that they do announce it similar to previous switches from 68k to PPC and from PPC to Intel. At a WWDC (world wide developer conference) they announce the upcoming switch, present test computers, provide a new Xcode version to build for ARM and give developers time to try it. Months later they launch a consumer computer to let early adapters get a first ARM based device.

We expect Apple will reuse the FAT binary technique to have Mac apps contain both ARM and x86 code for a while. They did that with 68k/PPC, PPC/Intel and Intel 32/64 bit code. We even for a while packed PPC 32/64-bit and Intel 32/64bit code together for an application.

My prediction would be that Apple quickly shows an iMac like computer for developers to proof the power of the new chips and have a test/build computer for developers. Lots of cores performing quickly and show they are at the same level as the Intel iMacs. To show power consumption, something like a MacBook Air with ARM compared to Intel version and have a few extra hours of battery usage. Maybe the new ARM based computers are not much better than Intel counterpart as the goal may not be to have better chips, but to own them and allow custom changes in future.

One curious thing is how Apple can use LLVM bitcode to help automate the transition. Did you remember the Apple Watch upgrade from 32 to 64-bit? Apple internally recompiled the apps from bitcode to native 64-bit ARM code to run on the new 64-bit Watch CPU. As apps for the Mac App Store are all build with bitcode embedded nowadays, Apple may be able to use that code to build ARM versions automatically. Or use the bitcode to improve performance for any emulation layer they use. The bitcode is the intermediate code the compiler generated from source code and is used to generate the machine code.

For FileMaker, we would need Claris Inc. to start building an ARM version of FileMaker and then we can use a newer Xcode version to build our plugin. Currently we already build 64-bit ARM for the iOS version of our plugin.

For Xojo, the team already builds iOS with 64-bit and have ARM support for Linux. So we expect them to quickly enable ARM for MacOS once a new Xcode is available to build their own framework and use newer compilers.

For both we expect to quickly be able to build something. It may be some work to remove all deprecated APIs as we expect Apple to not bring those over. e.g. FSRef data tpes, Addressbook framework and OpenGL frameworks are deprecated. They still work for compatibility, but may simply not make the move to ARM versions of the software.

MBS FileMaker Plugin, version 10.2pr8

New in this prerelease of version 10.2 of the MBS FileMaker Plugin: Download at monkeybreadsoftware.com/filemaker/files/Prerelease/ or ask for being added to the dropbox shared folder.

Deutschen FileMaker Konferenz 2020 in Malbun

Noch etwas fünf Monate bis zur FileMaker Konferenz 2020 in Malbun (Liechtenstein).

Vom 28. bis 31. Oktober 16. Juni 2021 21. Juli 2021 findet die elfte deutschsprachige FileMaker Konferenz in Malbun, Liechtenstein statt. Ursprünglich geplant für Juni muss die Veranstaltung leider in den Oktober verschoben werden. Wir hoffen dennoch auf tolles Wetter, viele Interessante Teilnehmer und Gespräche. Eventuell könnte das die einzige Konferenz rund um FileMaker in diesem Jahr werden, die vor Ort stattfindet.

Die Veranstalter vom Verein FM Konferenz erwarten auch 2020 rund 120 Entwickler, Anwender, IT-Fachleute und Entscheidungsträger aus Wirtschaft, Bildung und Verwaltung. Rund um über 20 Fachvorträge und Workshops wird es viel Zeit zum Vernetzen in den gemeinsamen Pausen und beim Abendprogramm geben.

Für den Deutschsprachigen Raum ist diese Konferenz das Treffen des Jahres. Hier finden Sie vom Anfänger bis zum Profi Kontakte zu anderen Entwicklern. Lernen Sie was es neues gibt, nehmen Sie Impulse mit für die eigene Arbeit und erfahren Sie mehr zu FileMaker von deutschsprachigen Experten!
Bitte planen Sie wenigstens einen extra Tag ein für ihren Besuch in Liechtenstein, damit Sie die Natur in dem schönen Tal geniessen können. Den Aufstieg auf den Sareis können Sie bequem zu Fuß vom Hotel aus starten und die Turnastraße hinauf spazieren bis zum Restaurant am Gipfel. Oder alternativ die Seilbahn nehmen.

Eventuell bieten wir auch wieder einen MBS Schulungstag an am Mittwoch vorher. Bei Interesse kann man sich gerne vormerken lassen. Die Ankündigung kommt später.

MBS FileMaker Plugin, version 10.2pr7

New in this prerelease of version 10.2 of the MBS FileMaker Plugin: Download at monkeybreadsoftware.com/filemaker/files/Prerelease/ or ask for being added to the dropbox shared folder.

Installing a new FileMaker version?

Don't forget the Advanced Tools checkbox when installing a FileMaker Pro as developer:

A new version may have a new preferences file and not use the settings of older versions, so please check preferences after installation, mark that checkbox and also check the other settings.

Don't forget to update plugins as needed. Some older plugins may need an update and not load. In general you may want to install current plugin versions to avoid running into issues fixed months ago.

Easter holidays at home

The last weeks we stayed at home, but made trips to go for hiking in the Rhine and Moselle valleys. If you have a chance to come by someday, please enjoy

Castle Eltz, view from west side:

Example Script for DynaPDF.FindText and DynaPDF.WebLink

Included with lastest MBS FileMaker Plugin prerelease 10.2pr6 we have a new database named Add Weblinks.fmp12, made for a client in the last days. The script below walks over PDF pages and searches for some text to put a link on that position to reference a website.

This example may be useful for all of you, who want to easily make words clickable in the PDF text. We simply search for a word to get the coordinates with our DynaPDF.FindText function. Then we split the coordinates into individual variables and call DynaPDF.WebLink to add the URLs to the PDF page. Works great if you have a list of products and you want to make them clickable to point to the web shop. As we search for text this only works for text on the page matching the search term exactly (case insensitive option available).

Of course if you would assemble the PDF with DynaPDF functions in MBS FileMaker Plugin, you would know the positions exactly and place the link directly to known coordinates. For example the DynaPDF.Table.SetCellAction function allows to link a cell in a table directly to an action and jump to another page or to an URL. Also if you write text with our DynaPDF.WriteFTextEx function, you know the coordinates and can directly put the link there.

Below the script. If you have questions, please don't hesitate to contact us.


MBS FileMaker Plugin, version 10.2pr6

New in this prerelease of version 10.2 of the MBS FileMaker Plugin:
  • Updated CURL to version 7.70.0.
  • Added XML.Compact function.
  • Changed default text encoding for email parsing on Linux to be Windows encoding to avoid endless loop in plugin SDK text routines.
  • Fixed bug in Audit functions, introduced in pr2.
  • Changed PKCS7.ReadFromFile to better report error messages from OpenSSL.
  • Updated DynaPDF to version
  • Changed Linux plugin to use ISO 8859 1 for text strings, which have native encoding, but are not UTF-8.
  • Changed CURL.FormAddKeyText and CURL.FormAddKeyTextContentType to use UTF-8 as default encoding.
  • Added ECKey.CanSign and ECKey.Valid functions.
  • Changed Linux plugin to load libidn dynamically at runtime. If this works, you can use domain names in unicode characters.
  • Changed plugin to load LDAP library dynamically.
  • Added IDN support for MacOS with a pull request to CURL.
Download at monkeybreadsoftware.com/filemaker/files/Prerelease/ or ask for being added to the dropbox shared folder.

DynaPDF license usage

In case you buy a DynaPDF license from us, you can use it with various development tools:
  • FileMaker with MBS Plugin
  • Xojo with our MBS Xojo Plugin
  • C and C++
  • Visual Basic 6.0
  • Visual Basic .Net
  • Visual C#
  • Embarcadero Delphi
  • PHP 5 and 7

DynaPDF supports the following platforms:

  • MacOS
  • Windows
  • Linux
  • iOS
  • Android
  • HP-UX Itanium
  • Solaris
  • Tru64

As a portable C++ library it may even be compiled for other platforms.
See the feature comparison for the differences between Starter/Lite/Pro/Enterprise licenses.

DynaPDF is licensed per developer and not per client/user, so you may only need one license for yourself as the developer or one for your client, if they like to own a license themselves.

Please note that the licenses for DynaPDF bought directly from DynaForms do not work with our plugins!


Apr 2024
Mar 2024
Feb 2024
Jan 2024
Dec 2023
Nov 2023
Oct 2023
Sep 2023
Aug 2023
Jul 2023
Jun 2023
May 2023
Apr 2023
Mar 2023
Feb 2023
Jan 2023
Dec 2022
Nov 2022
Oct 2022
Sep 2022
Aug 2022
Jul 2022
Jun 2022
May 2022
Apr 2022
Mar 2022
Feb 2022
Jan 2022
Dec 2021
Nov 2021
Oct 2021
Sep 2021
Aug 2021
Jul 2021
Jun 2021
May 2021
Apr 2021
Mar 2021
Feb 2021
Jan 2021
Dec 2020
Nov 2020
Oct 2020
Sep 2020
Aug 2020
Jul 2020
Jun 2020
May 2020
Apr 2020
Mar 2020
Feb 2020
Jan 2020
Dec 2019
Nov 2019
Oct 2019
Sep 2019
Aug 2019
Jul 2019
Jun 2019
May 2019
Apr 2019
Mar 2019
Feb 2019
Jan 2019
Dec 2018
Nov 2018
Oct 2018
Sep 2018
Aug 2018
Jul 2018
Jun 2018
May 2018
Apr 2018
Mar 2018
Feb 2018
Jan 2018
Dec 2017
Nov 2017
Oct 2017
Sep 2017
Aug 2017
Jul 2017
Jun 2017
May 2017
Apr 2017
Mar 2017
Feb 2017
Jan 2017
Dec 2016
Nov 2016
Oct 2016
Sep 2016
Aug 2016
Jul 2016
Jun 2016
May 2016
Apr 2016
Mar 2016
Feb 2016
Jan 2016
Dec 2015
Nov 2015
Oct 2015
Sep 2015
Aug 2015
Jul 2015
Jun 2015
May 2015
Apr 2015
Mar 2015
Feb 2015
Jan 2015
Dec 2014
Nov 2014
Oct 2014
Sep 2014
Aug 2014
Jul 2014
Jun 2014
May 2014
Apr 2014
Mar 2014
Feb 2014
Jan 2014
Dec 2013
Nov 2013
Oct 2013
Sep 2013
Aug 2013
Jul 2013
Jun 2013
May 2013
Apr 2013
Mar 2013
Feb 2013
Jan 2013
Dec 2012
Nov 2012
Oct 2012
Sep 2012
Aug 2012
Jul 2012
Jun 2012
May 2012
Apr 2012
Mar 2012
Feb 2012
Jan 2012
Dec 2011
Nov 2011
Oct 2011
Sep 2011
Aug 2011
Jul 2011
Jun 2011
May 2011
Apr 2011
Mar 2011
Feb 2011
Jan 2011
Dec 2010
Nov 2010
Oct 2010
Sep 2010
Aug 2010
Jul 2010
Jun 2010
May 2010
Apr 2010
Mar 2010
Feb 2010
Jan 2010
Dec 2009
Nov 2009
Oct 2009
Sep 2009
Aug 2009
Jul 2009
Apr 2009
Mar 2009
Feb 2009
Dec 2008
Nov 2008
Oct 2008
Aug 2008
May 2008
Apr 2008
Mar 2008
Feb 2008