FileMaker Inc today released FileMaker Pro 15.0.3, an update to address bug fixes and various compatibility issues.
You can read in the knowledge base about FileMaker Server 15.0.3 (6 fixes),
FileMaker Pro (Advanced) 15.0.3 (6 fixes) and FileMaker Go 15.0.3
As usual FileMaker provides updaters only for Windows and we miss the ones for Mac. So here are the links for Mac:
FileMaker Advanced 15.0.2 to 15.0.3:
FileMaker Pro 15.0.2 to 15.0.3:
Be sure to only apply them when you have the right 15.0.2 version before and FileMaker is not running.
On the weekend of March 18-19, 2017, the first ever curl meeting is taking place is Nuremberg, Germany.
Users, developers, binding authors, application authors, curl maintainers, libcurl hackers and other people with a curl interest are welcome!
I will try to be there and finally meet the curl people. I've been using curl for various projects including Xojo and FileMaker plugins for over 10 years.
New in this prerelease of the 7.0 MBS FileMaker Plugin:
- Changed Audit: CurrentTimeStamp, CurrentTime and CurrentDate. Those can now be TimeStamp, Time, Date instead of Text fields.
- Changed Audit: FieldID, TableID and RecordID can now be number fields instead of text fields.
- Fixed progress dialog updates for macOS Sierra with CURL synchronous upload.
- Fixed an issue with PrintDialog functions and Mac OS X 10.6.
- Enabled script colors for German script editor for FileMaker 13 (broke in 6.5).
- Added PrintDialog.GetReset and PrintDialog.SetReset.
- Added progress window option to Files.CopyFile and Files.MoveFile for Windows.
- Changed SQL plugin to detect ODBC to FileMaker and handle that better for reading text fields and avoid a crash.
- Added enable parameter FM.AllowFileDragDrop, so you can disable/enable it when needed.
As you may know you can use CURL functions in MBS Plugin to send emails. We include examples to show you how to send with attachments, html text and inline graphics. A recent example coming with 7.0pr2 showed you how to batch send emails. But that example sends emails one by one and each time with a new connection. I already improved the example here to reuse connections which helps a lot on speed. Still the big problem is that network transfers with uploads take time. The script waits while the Kilobytes for the email go through the network cables.
Luckily our plugin offers a function for cURL to run a transfer in background: CURL.PerformInBackground. Using this function we can start a cURL transfer and the script continues. We can prepare and send the next email while the last one is still uploading. Now you need to be careful and manage the connections and their status. To show you how this can work, we show you what we did in our updated example. Here is an excerpt from the script where we look for a free cURL session:
#Find a non busy curl connection
Set Variable [$index; Value:1]
If [$curls[$index] = ""]
#found free index, setup new CURL session
Set Variable [$curl; Value:MBS("CURL.New")]
Set Variable [$curls[$index]; Value:$curl]
Set Variable [$r; Value:MBS("CURL.SetOptionURL"; $curl; "smtp://" & $SMTPServer)]
Set Variable [$r; Value:MBS("CURL.SetOptionUsername"; $curl; $SMTPUser)]
Set Variable [$r; Value:MBS("CURL.SetOptionPassword"; $curl; $SMTPPass)]
Exit Loop If 
#found used index
If [MBS( "CURL.IsRunning"; $curls[$index] ) = 0]
#found used index which is done
Perform Script [“HandleFinishedCURL”; Parameter: $curls[$index]]
Set Variable [$curl; Value:$curls[$index]]
Exit Loop If 
Set Variable [$index; Value:$index + 1]
If [$index = 9]
Set Variable [$index; Value:1]
Pause/Resume Script [Duration (seconds): ,01]
MedinCell S.A. is a company located in Montpellier in southern France near the Mediterranean Sea.
They use my plugins for a few years now and are looking for another Xojo developer: (more)
On the weekend we run into the issue that you can store files in a container, but you can't simply drag them into other applications or to the Finder.
To enable the desired behavior with a new plugin function called FM.AllowFileDragDrop.
The plugin than intercepts the drag and drop in FileMaker and writes the data into a temp file, so the drag includes a file reference and does work with Finder and other applications.
Watch the video: AllowFileDrag
Requires MBS FileMaker Plugin 7.0pr2 plugin or newer.
New in this prerelease of the 7.0 MBS FileMaker Plugin:
- Added FM.SQL.Text and FM.SQL.CSV.
- Added FM.AllowFileDragDrop function.
- Updated DynaPDF to version 18.104.22.168.
- Fixed FieldType for Audit.
- Added DynaPDF.RotateTemplate function.
- Added ScriptName to the possible field names for Audit.
- Added PrintDialog.GetPageNumberingOffset and PrintDialog.SetPageNumberingOffset.
- Added scripts to make 32-bit or 64-bit only plugin.
- Fixed WebView.EstimatedProgress.
- Fixed PrintDialog.SetDuplex function (broken in 6.5).
- Added LDAP.AddRecord and LDAP.ModifyRecord functions.
- Updated SQLite to 3.16.1.
- Fixed bug in PKey.GetPrivateKey.
- Added XML.NodeCount function.
Registration just started for the FileMaker Conference .fmp[x]Berlin 2017.
This conference is organized by Egbert Friedrich and takes place from 1st to 3rd June 2017 in Berlin, Germany.
As the conference is in english, this is your chance to meet people from around the world at a conference in Europe. And for a lot of people it's easier to get to Berlin than to cross the atlantic and deal with US immigration officers.
dotfmp is an effort of various leading European FileMaker Developers. It is meant to bring all kinds of higher level developers together to share knowledge, educate and challenge each other.
dotfmp starts at the 31 May 2107 in the later afternoon with a relaxed "Beer and Sausages" in one of the most famous Berlin Beergarden.The session days itself last from 1 until 3 June with various socialising events in the evenings. Additionally we offer suport on 4 June to see more from Berlin and its surroundings.
dotfmp is a 3 Day-Unconference, Meetup, Hangout or Barcamp. It is an informal and self-organized effort to meet on a personal base.
dotfmp takes place in one of the most famous spots in Berlin. The GLS Campus is located in a vibrant area with a very short walking distance to all the famous restaurants.
We feel there are far too few possibilities to talk to, learn from, and hangout with fellow developers in a relaxed and informal environment. And we'd like to share work and get feedback from people chewing on similar challenges.
If you like to join the conference and present something, please register soon.
Next Thursday, 12th January 2017, I will visit the regular FileMaker meeting in Saarbrücken.
If you like to join us, please sign up on the website filemaker-stammtisch-saarlorlux.de.
Feel free to ask me about our MBS FileMaker Plugin. Or lets talk about upcoming conferences?
How FileMaker Pro can log changes
Since 2012, the MBS plugin has an audit functions. With version 6.5 they got much faster and therefore you may want to take a closer look on our audit functions. In FileMaker Pro, you can use them to easily log all changes to the database. Later you can inspect who changed records and use the log to undo actions or display old values.
Audit with MBS
We start with a test database. For the example, we take the starter solution called event management. The audit function need an AuditLog table and a matching layout. Both of these should be available somewhere and can be in a different database. The MBS plugin looks into the AuditLog layout to determine which fields should be written. The records are then written internally using SQL commands. Therefore, there must be only a relationship to an AuditLog table, even if it is located in a different database. This is quite interesting for server-based solutions, if the log is split into several AuditLog tables and the relationships define which table logs into which AuditLog table.
We add fields to the AuditLog table. The following fields are required: FieldName, FieldHash, TableName and RecordID. The name for the field and the table define the field exactly. We know which record was changed via the RecordID and FieldHash is then the hash of the field value. The field value can be very long and can, but does not have to be written down.
The following fields can be defined:
FieldValue, FieldOldValue, FieldType, UserName, IP, CurrentTimestamp, TimeStamp, CurrentTime, CurrentDate, Action, CurrentHostTimeStamp, PrivilegeSetName, AccountName, LayoutNumber, ApplicationVersion, FileName, HostApplicationVersion, HostName, HostIPAddress, LayoutName, PageNumber, LayoutTableName, TableID, FieldID, ScriptName and WindowName.
In FieldValue, the plugin saves the new value. In the FieldOldValue field, it saves the old value of the field. This is, of course, only available if the plugin finds the older entry. FieldType saves the type of the field, for example text. UserName saves the user name and AccountName the current account name. The CurrentTimestamp, CurrentHostTimeStamp, TimeStamp, CurrentTime, and CurrentDate fields store all the current time and/or current date. Hostname and HostIPAddress define on which computer the change was made. LayoutName and LayoutNumber which layout was used, WindowName which window. TableID and FieldID store the IDs for the table and the field. Later you can then find values by IDs even faster.
Create an Audit table
So let's put a table called AuditLog and the fields FieldName, FieldHash, TableName, RecordID, FieldValue, FieldOldValue, FieldType, UserName, IP, CurrentTimestamp, Action, FileName and LayoutName. We also add an additional field to EventID. Because we can always save the ID of the event and then find the changes for an event. FileMaker automatically creates a layout for the new table. This layout is required by the current plugin to find the fields in the table. We can later see in the layout what was logged. Of course, regular users may not need to see the audit table or the layout.
You can create additional fields in the AuditLog table. For example, a LogTime field with the data type time stamp for the current time of logging. This field can automatically be filled by FileMaker. You can also pass these additional fields later using an audit call, for example, to log a variable.
In each table, we create an AuditTimeStamp field. This field is automatically set by FileMaker to the current time stamp when the record changes. If you already have a field with a different name, you can also use it and do not need a field with a redundant time stamp.
We also create a second field called AuditState. This will be a calculated value, which needs to be recalculated each time. So please uncheck the "Do not replace existing value of field" checkbox. The calculation is the call to Audit.Changed. This function has several parameters. First, we pass our time stamp, behind the name of the table itself, in this case events. Then we can specify fields that should be ignored. We can also use field name and | as a separator to fill a field with a given value. So, we set the value of the EventID field to the value of the EVENT ID MATCH FIELD field. Finally, we pass the label from the field "Task Label Plural" as this field should not be logged. This field is calculated easily from the other fields. Thus, the audit call looks like this:
MBS ("Audit.Changed"; AuditTimeStamp; "Events"; "EventID|" & EVENT ID MATCH FIELD; "Task Label Plural");
For the other tables, the calls would be:
MBS ("Audit.Changed", AuditTimeStamp, "Contributors", "EventID|", & EVENT ID MATCH FIELD)
MBS ("Audit.Changed"; AuditTimeStamp; "Tasks"; "EventID|" & EVENT ID MATCH FIELD)
MBS ("Audit.Changed", AuditTimeStamp, "Agenda", "EventID|", & EVENT ID MATCH FIELD)
MBS ("Audit.Changed", AuditTimeStamp, "Guests", "EventID|", & EVENT ID MATCH FIELD)
So the plugin logs all the changes for the events. You can open the windows side by side, one with the events layout and one with the layout for the AuditLog table. For changes to the portals you have to click on a free space in the event to write the changes to the record. This writes the changes for all portals together. In the AuditLog, we see many new entries for the new records.
Positive or negative?
There are two Audit.Changed commands in the plugin. Audit.Changed takes the field names that are not to be observed. On the other hand, Audit.Changed2 is different and takes a positive list of fields. Basically, Audit.Changed2 is faster because it does not have to query which fields are available. Form fields or unsaved calculations are not monitored by default, since these are easy to recalculate.
With the Audit.SetIgnoreCalculations function, you can completely disable the monitoring of all calculation fields. With Audit.SetIgnoreSummaryFields, you can ignore the summary fields. Or with Audit.SetIgnoreUnderscoreFieldNames all fields with underline at the beginning of the word. You can also use Audit.SetIgnoredFieldNames to globally specify a list of field names for fields that you want to ignore. by default the plugin ignores the AuditState and AuditTimeStamp fields.
Display the audit
We can display the audit data for the record. Perhaps not for every user, but the display is always useful as a change log. To do this, create a relationship between Events::EVENT ID MATCH FIELD and AuditLog::EventID in the relationship diagram.
Now create space in the event layout and create a portal for the AuditLog table. If it is not found in the reference records pop-up menu, you have created the relationship above incorrectly. You could sort the fields down by CurrentTimeStamp. It is enough to take the fields FieldName, FieldValue and perhaps UserName.
Audit on deletion
If you want to log the deletion, you have two options. Either you let the user delete only by script and you always notify the plugin before deleting, or you use the security settings in FileMaker for a delete trigger.
The call from the plugin would then be via the Audit.Delete function:
MBS ("Audit.Delete"; MyTable::AuditTimeStamp; "MyTable")
The time stamp is passed, but not really used. Instead of using MyTable, you specify the current table from the current record. The plugin logs the record as with the other calls, so all the changes to the fields if needed and then an entry for deletion. You can of course do this in a script shortly before the delete command (with variable set).
First we need a test user to delete. In the Security dialog, we create a new user. We create a new set of permissions for this user. Best way is to duplicate and customize the permissions from the data input. In the settings for the calculation, there is a pop-up menu for records in the upper left corner. There, select "Custom privileges ...". A suitable dialog appears, where you can set the permissions for each table. For each table, select "Limited ..." instead of Yes. A new dialog box appears for the calculation of the limitation. Here, please insert the plugin call, for example for the events table:
MBS ("Audit.Delete", AuditTimeStamp, "Events")
For testing, we are building a script called login. This script gets only one command: Re-Login [With dialog: On]. If everything works out, you can use the new script to log in again with the new user. There you create a new data record. Make sure you commit some changes. You will see the recording in a second window with the AuditLog table. If you delete the record now, the calculation will be executed and the record should be marked as deleted. Please note that FileMaker first performs the calculation and then displays a dialog. If the user presses Cancel there, the plugin has already set an entry and the record still remains undeleted.
Many plugin users use audit. Because FileMaker often stores changes, each database should have an audit. Easily a record is changed or deleted and no one knows later who has made what and why. In addition, you can offer an undo feature, if you can find what was previously in a field.
The table with AuditLog is growing quickly, because a record is created for each change. However, you can easily rotate the table, for example change it monthly. The AuditLog table and layout must be available only in an open file. Therefore, it is recommended to put the AuditLog table in another database file. You can even have different audit databases for different files and separate the log data. Thus, a table can log into an audit file and another table logs to another file. For this, however, the relationships must be true, so that under the name AuditLog is a reference in the relationships that point to the corresponding table. Those audit log tables have of course different names.
The whole auditing works at best, when the users don't know about it. If an employee then makes a mistake, a supervisor can undo the change. Or if the data does not agree, who has done what and when.
In version 6.5, we have significantly improved SQL statements for audit, so the new plugin is much faster in the network. For each change, we need to look for old entries in the AuditLog and see if the values have changed.
Give it a try!
For a client I just converted that example to Xojo.
On Mac OS X it looks like this:
and for Windows:
This is using Internet Explorer on Windows and WebKit on Mac.
Please try it. Will be included in next prerelease or if you need now, drop me a line by email.
There is an update to SQLite.
The new version 3.16.1 was released yesterday and I already updated plugins here.
3.16.x is faster, fixes a few bugs and has some new shell commands.
If you need a copy now, you can email me as usual.
For our German speaking users:
- FMM 201606: Word-Dateien ausfüllen, Ein Tipp zum MBS-Plugin
- FMM 201605: Das MBS-Kontextmenü, Script-Schritte schneller aktivieren/deaktivieren
- FMM 201604: Webservices in FileMaker einbinden, Verwendung von CURL-Befehlen im „MBS-Plugin“
- FMM 201603: 4000 Funktionen in zehn Jahren, Ein kleiner Rückblick auf das MBS-Plugin
- FMM 201601: iOS App SDK, Eigene iOS-Apps auf Basis von FileMaker
- FMM 201506: Authentizität durch Signaturprüfung, Daten übertragen und Veränderungen bemerken
- FMM 201505: Wünsche werden wahr, Neues im „MBS-Plugin“ bei der FMK 2015
- FMM 201504: Datensätze effizient kopieren, Mit etwas SQL und dem MBS-Plugin
- FMM 201503: Neue Datensätze ohne Layoutwechsel, Mit Hilfe von SQL-Befehlen und dem MBS-Plugin
- FMM 201501: QuickList, Schnelle Listen für FileMaker
- FMM 201405: E-Mail-Versand, Mehr Möglichkeiten mit dem MBS Plugin
- FMM 201405: Vorbereiten von PDFs für den Versand, Verkleinern großer Dateien
- FMM 201402: Variablen, Globalisierte Lösungen per Plugin
- FMM 201401: Kalendertermine und Erinnerungen, Wie man Ereignisse aus FileMaker anlegt
- FMM 201306: Zip-Archive auslesen, Bilder aus OpenOffice-Dokumenten extrahieren
- FMM 201303: Script-Träger übers Netzwerk, Scripts triggern übers Netzwerk
- FMM 201303: Syntax Coloring, Berechnungen und Scripts bekennen Farbe
- FMM 201203: Arbeiten mit Dateidialogen, Komfortablere Dateiexporte per MBS Plugin
- FMM 201105: Bilder skalieren mit dem MBS FileMaker Plugin, So bleibt Ihre Datenbank schlank
Wir empfehlen allen FileMaker Anwender ein Abo vom Magazin und den Kauf der alten Ausgaben. Das FileMaker Magazin ist eine excellente Quelle von Informationen, Anleitungen und Profitips.
New in this prerelease of the 7.0 MBS FileMaker Plugin:
- Added GMImage.DestroyAll function.
- Fixed a problem with WordFile not finding tag if it is the last text in a document.
- Fixed a crash with opening Midi devices on Windows in 64-bit application.
- Added PortMidi.GetDeviceID and PortMidi.GetDeviceName functions.
- Added XML helper functions: XML.ExtractText, XML.NodeNames, XML.SetVariables, XML.ListAttributes, XML.HasAttributes, XML.GetAttributes and XML.SubTree.
- Added functions to read PKCS12 and X509 certificates.
- Added more checks in CURL functions to avoid changing script triggers while transfer in use.
- Added SerialPort.HasLine and SerialPort.ReadLine functions.
- Changed returning text, so that many functions returning text with given encoding can now return hex and base64 if you pass hex or base64 as encoding.
- Changed WordFile.ReplaceTag to create multiple paragraphs if text to replace contains multiple lines and is part of a normal text paragraph.
- Added WordFile.RemoveTableRow function.
- Added checks to Audit function to complain if AuditLog layout does not have required fields.
- Added functions for batch download of files over FTP: CURL.GetBatchCurrentFileName, CURL.GetBatchCurrentFilePath, CURL.GetBatchDestinationPath, CURL.GetBatchFileNames and CURL.SetBatchDestinationPath.
- Added DynaPDF.PageLink and DynaPDF.PageLinkEx functions.
- Added DynaPDF.SetLinkHighlightMode and DynaPDF.GetLinkHighlightMode functions.
- Fixed bug in XML.canonical function.
- Changed ImageCapture.requestScan to better report errors, e.g. empty document feeder.
- Updated LibXL to version 3.7.2.
- Added DynaPDF.AddAnnotToPage and DynaPDF.WatermarkAnnot functions.
- Updated DynaPDF to version 22.214.171.124.
- Added DynaPDF.GetContent and DynaPDF.SetContent.
The last days I chatted with a FileMaker developer who had a need for some XML handling functions. So I added a few functions, first one to extract node names from an XML: XML.NodeNames. You pass in a XML and it can give you the list of node names in the first layer or if you want recursively all layers.
Next we got a function to get a subtree (XML.SubTree). So you may have a big XML with a smaller chunks and we can query nodes inside a bigger tree. This includes getting the nth entry like the nth record in a list of records.
The XML.ExtractText extracts the text inside an XML tree. So all text portions are returned as a list. You can first use the subtree function to get a part of a XML to only get a portion of the texts.
We got a few functions to handle attributes. XML.GetAttribute returns the value for the attribute.
Now we got something special for FileMaker Scripts.
We parse an XML with the XML.SetVariables function, identify all nodes with text values and create variables for you automatically. The plugin sets those variables and returns a list of the names. Later you can pass the list to XML.ClearVariables to clear them for another run.
For example the script looks like this:
Set Variable [$XMLVariables; Value:MBS( "XML.SetVariables"; test::input; 1)]
Set Variable [$otherVariable; Value:1]
#See Variables in Data Viewer
Set Field [test::output; MBS( "XML.ClearVariables"; $XMLVariables)]
Set Variable [$someVariable; Value:1]
The test XML:
<?xml version="1.0" encoding="UTF-8"?>And in the debugger all the variables may look like this for a test XML:
<Comment>Just a test.</Comment>
So you can have an input XML, split the values into variables using our plugin and process them in your script. I hope this is handy for you. What do you think?
Plugin will be available soon. If you like to test today, you can email me.
Just in time for Christmas Dana posted a teaser for XDC 2018.
The question to be answered is where the conference will take place. Until the next newsletter (subscribe here) in January tells us, we can enjoy betting where it could be.
Austin is not easy to reach, but convenient for Xojo Inc. as they have a couple of people living there who won't need any airplane ticket. Houston for 2016 was similar easy for Xojo Inc. with just a few hours drive from Austin. Dallas could fill a similar role with a big airport and in drivable distance from Austin.
We know that it will be USA and probably somewhere with direct flights internationally.
I would expect New York, San Francisco, Boston, Miami and and a few others to be too expensive.
And with the list of direct flights available from Paris and Frankfurt, I would bet on Seattle.
What is your guess?
There is no XDC 2017, so if you like to join a conference before 2018, please consider our conference in Europe:
The MBS Xojo Developer Conference will take place 4th/5th May 2017 in Berlin, Germany. An optional training day is available.
Frohe Weihnachten und ein gutes neues Jahr!
Merry Christmas & Happy New Year
Joyeux Noël et Bonne Année
Buon Natale e Felice Anno Nuovo
Franziska, Sebastian, Michael, Monika & Christian Schmitz
With iOS 10.2 we finally got the option in accessibility settings to define for the home button that it should not activate voice control or Siri.
For years I hated it when accidentally voice control turned on with iPhone in my pockets. Depending on what the iPhone recognized, it dialed people or played music. I did disable voice calling and Siri, but the voice control for music stayed on. Now Apple added the switch we needed for at least 5 years!
For me the best feature of 10.2 and a reason to upgrade immediately.
Anyone else so happy?
Do you sometimes run into a Windows error code?
Sometimes one like -2147221499 or 80040005 and you have no clue what it is?
You can lookup error codes on Microsoft Website:
But that list is only for regular error codes.
The COM/OLE functions return different error codes called HRESULT. They can be decoded, see Structure of COM Error Codes and there are various lists for HRESULT values.
Which brought me last year to write a little tool to collect errors from various header files and put them in a big table:
Windows Error Codes
There you can quickly lookup the error codes, in both decimal and hex notation.
We had a nice meeting with FileMaker developers in the bear and wolf park:
We even had some guests from Swiss and Frankfurt/Main coming. Topics included using SVGs to display complex layout information of print jobs with creating the SVG data on the fly in a script, access to web services, FileMaker news/licensing, developing business apps and of course using MBS FileMaker Plugin.
Older blog entries: