Enable HiDPI aware web viewer for FileMaker

With latest pre-release we added the WebView.SetInternetExplorerHiDPI function to switch on the HiDPI aware more for FileMaker application (or runtime). See comparison picture:



In your start script you can just call this function once to enable it:

MBS( "WebView.SetInternetExplorerHiDPI"; 1 )

When this option is active before web viewer is created, the web control will display the content high-dpi aware and zoom to 100% independent of the DPI of the display.

In earlier blog post we recommended to use JavaScript to zoom the website:

MBS( "WebView.RunJavaScript"; "web"; "document.body.style.zoom = \"200%\"; ")

But this is no longer needed on Windows once the web viewer zooms correctly.

PS: For Xojo use IEWebBrowserMBS.SetInternetExplorerHiDPI function to do the same.

MBS FileMaker Plugin, version 10.2pr5

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.

FileMaker Server Plugin Installation

You have a FileMaker Server installed, e.g. on Windows Server, and you need the MBS Plugin installed. Let us guide you though the installation process.
We expect you have a current FileMaker Server running. If you have an older/newer one, the buttons may be on a different position.

(more)

ODBC driver and MBS SQL Functions in FileMaker

We have made a ton of example code in the last decade showing how to connect to Microsoft SQL Server from MacOS or Linux using FreeTDS and our MBS FileMaker Plugin. And there are two ways to do it:

1. With loading driver directly

Set Variable [$result; Value: MBS("SQL.SetClient"; $Connection; "ODBC")]
#Tell plugin where freetds library is
Set Variable [$result; Value: MBS( "SQL.SetConnectionOption"; $Connection; "ODBC.LIBS"; "/Users/cs/Desktop/libtdsodbc.dylib")]
#Connect to database
Set Variable [$result; Value: MBS("SQL.Connect"; $Connection; "DRIVER={FREETDS};Server=192.168.2.32;UId=SA;PWD=test;Database=test;TDS_VERSION=7.2;Port=1433")]

As you see, we point to the dylib as ODBC library, load it and connect through it.

2. With loading iODBC and having driver in connection string

Set Variable [$result; Value: MBS("SQL.SetClient"; $Connection; "ODBC")]
#Tell plugin where freetds library is
Set Variable [$path; Value: "/Users/cs/Desktop/libtdsodbc.dylib" ]
#Connect to database
Set Variable [$result; Value: MBS("SQL.Connect"; $Connection; "DRIVER={" & $path & "};Server=192.168.2.32;UId=SA;PWD=test;Database=test;TDS_VERSION=7.2;Port=1433")]

As you see, we let the plugin load libiodbc.dylib (ODBC manager) and then have it load the library.

What is better?

Both ways do work, so for most customers there is no difference. But the second way is better as the libiodbc does some additional services like text encoding conversations, provide additional functions like a directory of the various database drivers, functions to browser for databases and a way to work with data sources.

So we recommend in general that all customers prefer the second way over the ODBC manager to make sure all things work well. For the next weeks, we'll try to update a couple of blog posts and examples projects.

Use formatted text in Excel files with FileMaker and LibXL

With the recent release of LibXL 3.9, we got new functions for working with styled text. For our MBS FileMaker Plugin, we added new functions for styled text:
Now you can pass directly styled text from a field in FileMaker to a cell in an Excel document. Or you build a styled text from scratch with text formatting functions in FileMaker like in the example below:

# create sheet
Set Variable [ $sheet ; Value: MBS( "XL.Book.AddSheet"; $book; "Styled Text Test") ]
#
Set Variable [ $row ; Value: 1 ]
Set Variable [ $col ; Value: 0 ]
Set Variable [ $text ; Value: TextColor ( TextSize ( "Red"; 15 ) & " Text" ; RGB ( 255 ; 0 ; 0 ) ) & TextColor ( TextSize ( " and blue"; 14 ) ; RGB (0 ; 0 ; 255 ) ) & " in FileMaker" ]
#
Set Variable [ $r ; Value: MBS( "XL.Sheet.CellWriteStyledText"; $book; $sheet; $row; $col; $text) ]
#
Set Variable [ $text ; Value: TextFont ( TextStyleAdd ( "Hello World" ; Bold+Underline+Italic ); "Calibri" ) ]
Set Variable [ $row ; Value: 2 ]
Set Variable [ $r ; Value: MBS( "XL.Sheet.CellWriteStyledText"; $book; $sheet; $row; $col; $text) ]

In our example database we show the styled text in two fields to check if we got them right:

For the conversion to/from styled text, we support passing font name, color, size and the following styles: bold, italic, strikethrough, single/double underline, subscript and superscript. Optionally, you can attach a format to the cell, which may define the alignment and other formatting options. We hope you enjoy this functions and use them to post process the Excel exports from FileMaker or code your own export from scratch via script.

Please try the new functionality and don't hesitate to contact us with questions. This is already included in 10.2pr4 download.

Digitally signing PDF with DynaPDF and custom signature appearance

For some time now we can sign PDFs with DynaPDF functions automatically in a script in FileMaker. For next pre-release we add a new feature to add a custom signature appearance. You define in your script how the PDF draws the signature on the page and includes the validation icon. That validation icon is a special feature of the PDF reader where they draw a checkmark to let you know the signature is valid. Like this screenshot:



We draw in the box there to show it's signed, write the name there and then tell the PDF viewer to place the icon left to the text. If the PDF viewer doesn't know or doesn't check, this should display a question mark. See picture on the right.

To do this, you do three steps:
  1. You call DynaPDF.CreateSigField to create a signature field on the PDF and specify the coordinates. You choose where to put it on the page and yes, you can render various areas and look for white space.
  2. To place the validation icon, please use our new DynaPDF.PlaceSigFieldValidateIcon function. This receives relative coordinates within the signature field rectangle.
  3. Then use DynaPDF.CreateSigFieldAP to create a custom signature field appearance stream and draw some text into it. You draw what you like within the given rectangle of your signature and the icon is later placed on top over the custom drawing. Please call DynaPDF.EndTemplate when done with the drawing.
Now you save the PDF and use our DynaPDF.SaveAndSignFile function to provide the file path to the private key file and let the plugin close the file with valid signature.

PS: Also available for Xojo with DynaPDFMBS class, see signature appearance project.

MBS FileMaker Plugin Examples Videos

Stefanie Juchmes made two videos where she walks though example files on MacOS and Windows.
Thumbnail

MBS FileMaker Plugin Examples Windows (English)

Thumbnail

MBS FileMaker Plugin Examples MacOS (English)

For more presentation videos see the other videos


MBS FileMaker Plugin, version 10.2pr4

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.

Vote for FileMaker Plugin SDK Ideas

As you may know FileMaker comes with a plugin SDK, which C++ developers like me use to develop plugins. Now the Plugin SDK offers a way to register functions and script steps and provide additional features to the FileMaker developer.

The plugin developer can get a list of parameters with the function call and inspect them, e.g. do different things for containers, texts or numbers passed in. And the plugin can return a value as result and the SDK offers functions to return texts, numbers and assemble containers. Over the years we got a few SQL functions to do queries and modify data in the database on behalf of the FileMaker developer. With the evaluate function in the SDK, we can call Get(Functions) or do calculations.

From a plugin we can trigger a script. That means the script call is put on a queue and executed later after the current script finished. But for some reason, we can't trigger a script on FileMaker Server. The plugin SDK doesn't provide the functionality to do this.

In the plugin we can work with styled text stored in FileMaker fields. We use that to format JSON and XML text now. But we can't access alignments in a styled text.

So as a plugin developer I submitted a few ideas over time:
Please vote for them if you like. Claris Inc. may look right now what to deliver in 2020 and we would appreciate if something would be picked based on popular vote.

Those ideas could help to make a better plugin SDK, which may lead a dozen plugin developers to make better plugins, which hundreds of FileMaker developers could use in thousands of solutions.

PS: Fixed links to point to new Claris community.

MBS FileMaker Plugin, version 10.2pr3

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.

Sort with evaluate in FileMaker

We got a few new functions to sort lists: List.SortWithEvaluate, QuickList.SortWithEvaluate and JSON.SortWithEvaluate.

The idea is to pass an expression to do the comparison for the sort operation. This way you can use functions like for example GetAsNumber() to convert from text to number.

If you run the function with simply comparing leftValue and rightValue like this:

MBS("List.SortWithEvaluate"; "1¶22¶3"; "leftValue < rightValue")

You get the list back with 1, 22 and 3. But if you use GetAsNumber(), you define the order for numbers like this:

MBS("List.SortWithEvaluate"; "1¶22¶3"; "GetAsNumber(leftValue) < GetAsNumber(rightValue)")

The list is now returned as 1, 3 and 22.

This function can handle various things including sorting by date with GetAsDate(), sorting only text after first 5 characters with Middle() function or do various other operations as needed.

Finally we applied the same technique to JSON with our new JSON.SortWithEvaluate function. You can sort array values here and do the JSON comparison in the expression by using built-in JSON functions in FileMaker or our MBS JSON functions. Here an example sorting a JSON array:

MBS( "JSON.SortWithEvaluate"; "[2,9,3,1]"; "MBS( \"JSON.GetValue\"; leftJSON) < MBS( \"JSON.GetValue\"; rightJSON)" )

Next an example to sort objects by a value of a key within each object. For example if you have records with a name as one of the fields, you can now sort by the field name:

MBS( "JSON.SortWithEvaluate"; "[
    {\"name\": \"Joe\"},
    {\"name\": \"Anna\"},
    {\"name\": \"Tim\"},
    {\"name\": \"John\"}
    ]"; "JSONGetElement ( leftJSON; \"name\") < JSONGetElement ( rightJSON; \"name\")" )

The expression can combine multiple comparisons to look e.g. on first and last name. The following expression would look first if last name is the same and then compare first name:

If (JSONGetElement ( leftJSON; \"lastName\") = JSONGetElement ( rightJSON; \"lastName\");
    JSONGetElement ( leftJSON; \"firstName\") < JSONGetElement ( rightJSON; \"firstName\");
    JSONGetElement ( leftJSON; \"lastName\") < JSONGetElement ( rightJSON; \"lastName\") )

If you do the standard sorting, our List.Sort, QuickList.Sort and JSON.Sort functions will be much faster. But this is for maximum flexibility. If needed we could put in some optimization of course for the future.

Trigger FileMaker Scripts from JavaScript in FileMaker without fmp URL

Did you know you can have a callback from JavaScript in a web viewer in FileMaker without using FMP URL scheme?

For MacOS and iOS in FileMaker 16 or newer, you can use the WebKit message handler feature. First you call Webview.AddScriptMessageHandler function to register a name:

MBS( "Webview.AddScriptMessageHandler"; Name )

Next you can use it in Javascript to trigger a script in FileMaker from JavaScript:

window.webkit.messageHandlers.test.postMessage({'filename':'WebView Message Handler.fmp12', 'parameter':'Hello World from JavaScript', 'scriptName':'test'});

And you can evaluate an expression in JavaScript:

window.webkit.messageHandlers.test.postMessage({'evaluate':'MBS( "Msgbox"; "Hello from Evaluate in JavaScript" )'});

As you see, we get for our message handler a new entry in the namespace called window.webkit.messageHandlers.test. This allows us to call postMessage method there and this triggers the plugin code to trigger scripts or do evaluation. The parameter to the postMessage must be a Javascript object with a few properties:
  • fileName: The name of the file with the script.
  • scriptName: The name of the script to trigger.
  • parameter: The parameter to pass to the script.
  • evaluate: The expression to evaluation.
This works nice for 2 years now and we'd love to see what you can do with this technique.

You can define a JavaScript function to wrap this and install it with WebView.RunJavaScript into the web viewer or include it in the html document:

function CallFileMaker(FileName, ScriptName, Parameter)
{
    window.webkit.messageHandlers.test.postMessage({'filename': FileName, 'parameter': Parameter, 'scriptName': ScriptName });
}

Works in FileMaker Pro, Runtimes and in apps based on the FileMaker iOS SDK.

ISO FileMaker Magazin Videos

Matt Petrowsky from the ISO FileMaker Magazine has an amazing library of video content related to FileMaker. You can subscribe on the website and enjoy a lot of tutorials and video talks about learning FileMaker.

Currently for the time of the COVID-19 pandemie he provides a new series on Youtube:

Learning FileMaker: Covid 19 Solution.

We are honored to be mentioned in episode #4 where Matt talks about enhancements in FileMaker provided by MBS Plugin:

Learning FileMaker: Episode #4 - Enhancing your development environment

Enjoy the series and have fun learning FileMaker!

We are Claris Partner

We are now a Claris Partner as we just renewed our FBA membership:

It is already 8 years since we applied for this and being a Claris Partner helps:

The listing on the website as well as recommendations to prospects by Claris employers helps to bring business to your company. You get a discount for license purchase so you can make some money selling your solution bundled with the FileMaker licenses and offer one stop shopping to your clients. You can list your products on the marketplace and use Solution Bundle Agreement if you like to sell a lot of bundles. Access to beta versions, extra training sessions, exclusive partner meetings and a few test licenses are included, too.

If you like to become Claris Partner, you can read more on the FileMaker website.

Convert a SVG image to PNG with alpha channel

You can use GraphicsMagick functions in MBS FileMaker Plugin to convert a SVG to a PNG image with transparency.

To assist there we add a new GMImage.ReadFromContainer function to our plugin. This allows you to create the picture, configure it and then load the picture into the image. When you set background to transparent in a picture with alpha channel, you can preserve the transparency from the SVG. And as you specify a size for the picture and reading it, you can scale the SVG to the size you need:

 

# Load image from container

Set Variable [ $image ; Value: MBS( "GMImage.New"; "500x500"; "transparent" ) ] 

 

# turn on alpha channel and set background to transparent

Set Variable [ $r ; Value: MBS( "GMImage.SetType"; $image; 7 ) ] 

Set Variable [ $r ; Value: MBS( "GMImage.SetBackgroundColor"; $Image; "transparent" ) ] 

 

# Read SVG

Set Variable [ $r ; Value: MBS( "GMImage.ReadFromContainer"; $image; SVG to PNG::InputFile; "500x500"; 0; "SVG" ) ] 

# Output to container and release image

Set Field [ SVG to PNG::OutputFile ; MBS( "GMImage.WriteToPNGContainer"; $image; "test.png") ] 

Set Variable [ $r ; Value: MBS("GMImage.Free"; $image) ] 

If you have questions or need a newer plugin including the new plugin, please don't hesitate to contact us.


MBS FileMaker Plugin, version 10.2pr2

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.

Query FileMaker records as JSON

When you need FileMaker records as JSON, you can just query them via MBS Plugin functions. Use FM.SQL.Execute first to run SQL and get reference number to result in memory. Then call FM.SQL.JSONRecords to get the records as a JSON array. This has high performance and may be faster than looping in a script to build the JSON in pure FileMaker functions.

Once you have the JSON, you may just pass it to FileMaker's data API to move records to another server or pass them as payload for a web service. Within the SQL you can make adjustments to the data. For example you insert fixed values with putting them in the SQL (text in single quotes), you can use CONCAT to concat texts or use CAST() to change data type in SQL. By passing field list to FM.SQL.JSONRecords, you can rename the fields to match whatever you target service expects.

# get related teams
Set Variable [ $r ; Value: MBS( "FM.SQL.Execute"; Get(FileName); "SELECT \"UUID\", \"ID\", \"ID_Abteilung\", \"Team.Name\", \"Txt_Anz.Mia\" FROM \"Teams\" WHERE ID_Abteilung=?"; Abteilung::ID) ]
If [ MBS("IsError") ]
    Show Custom Dialog [ "SQL error" ; $r ]
Else
    # fill as json in field
    Set Field [ Abteilung::JSON_Abteilung ; MBS( "FM.SQL.JSONRecords"; $r; "UUID¶ID¶ID_Abteilung¶Team.Name¶Txt_Anz.Mia") ]
    Set Variable [ $e ; Value: MBS( "FM.SQL.Release"; $r ) ]
End If

Don't forget to release memory when you are done by calling FM.SQL.Release function.
Check also FM.SQL.JSONRecord to just get one row as JSON object. Use FM.SQL.InsertRecords to insert records into another table in another file within FileMaker or FM.SQL.InsertRecordsToSQL to insert records to a foreign database, e.g. MySQL. You can use FM.SQL.CSV to get records as CSV for exporting.

This works in runtime applications and may be useful in all FileMaker apps to collect data to send to a web service, e.g. to FileMaker Server's DATA API.

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

Virtuelle FileMaker Stammtische

Da aktuell kein Restaurant oder Biergarten offen hat, verlegen sich viele Stammtische ins Internet.

Dienstag war der Virtueller, überregionaler FileMaker Stammtisch vom Holger Darjus organisiert. Immerhin 56 Leute waren zur Spitzenzeit online!

Heute Abend findet dann der Hamburger Stammtisch virtuell statt. 2. April, gegen 19 Uhr per Zoom teilnehmen: Zoom Link.

Voraussichtlich findet der Ulmer Stammtisch die Woche darauf auch virtuell statt.

Der Zürcher Stammtisch findet am 17. April online statt. Anmeldung

Generell bietet es sich an, dass FileMaker Entwickler aus dem ganzen Deutschsprachigen Raum sich regelmäßig treffen. Und reihum können verschiedene Leute die Moderation übernehmen.

MBS FileMaker Plugin, version 10.2pr1

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.

Archives

Sep 2025
Aug 2025
Jul 2025
Jun 2025
May 2025
Apr 2025
Mar 2025
Feb 2025
Jan 2025
Dec 2024
Nov 2024
Oct 2024
Sep 2024
Aug 2024
Jul 2024
Jun 2024
May 2024
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
Mar 2010
Dec 2009
Nov 2009