Author: Fabrice

  • FileMaker 2025 ! Les nouveautés

    FileMaker 2025 ! Les nouveautés

    [vc_row bg_color=””][vc_column][vc_column_text]

    Claris vient d’annoncer la sortie de FileMaker 2025 (nom commercial de la version 22). Comme il est de coutume, vous retrouverez dans cet article les nouveautés et un point de vue critique pour, d’une part, essayer d’analyser la direction prise, et d’autre part vous permettre d’appréhender ces nouveautés.

    Généralités importantes

    Commençons par quelques remarques très importantes à lire avant de franchir le pas.

    • FileMaker Server 2025 ne permet les connexions que depuis FileMaker Pro 2024 (21) et 2025 (22). Attention donc si vous avez encore des parcs avec de plus anciennes versions
    • En revanche, à partir de la 22, la mise à jour inApp supportera les versions majeures. Cela simplifiera le maintien à jour du parc logiciel.
    • Très important – et qui ne facilitera pas les transitions si, justement, vous avez des versions disparates : sous Windows il sera désormais impossible d’installer FileMaker Pro 2025 aux côtés de plus anciennes versions. FileMaker Pro 22 devrait remplacer les anciennes versions (je n’ai pour ma part pas testé cela, n’hésitez pas à réagir pour compléter cette information).
    • À prendre en compte avant de faire la mise à jour de votre serveur, si vous utilisez OData : il y a de grandes améliorations mais aussi quelques changements qui pourraient perturber les systèmes existants (voir paragraphe sur FileMaker Server en fin d’article)

    Aussi, c’est la première fois que les interfaces pour Windows et pour Mac divergent. La version mac apporte de nombreuses nouveautés qui tendent à se rapprocher des applications Apple telles que Keynote, Pages ou Numbers – mais cela concerne la partie “développeur” (on reviendra dans le détail). Mais c’est aussi l’interface utilisateur qui change avec la nouvelle barre d’outils. J’avoue ne pas bien comprendre ce qui empêchait de remplacer les icônes sur PC également afin de maintenir une cohérence.

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column][vc_column_text]

    IA, IA, IA

    Déjà largement présente avec la version 21 (on l’a peut-être oublié, mais l’IA est au sein de FileMaker depuis la version 19 en 2020 avec CoreML), l’intelligence artificielle est la grande star de cette version 2025.

    Je ne vais pas ici rentrer dans le détail de l’implémentation car elle comporte d’innombrables fonctions et pas de scripts – pour une lecture détaillée des nouveautés, je vous recommande toujours la lecture des notes de version publiées par Claris – mais de manière générale on peut dire ceci :

    • on est dans la continuité de ce qui était déjà présent en version 21, à savoir une priorité donnée à l’utilisateur final pour interagir avec les données, plutôt qu’un mode “agentic” permettant au développeur de générer du code ou des interfaces automatiquement. Personnellement, cela me semble être la bonne stratégie, le “code” FileMaker étant déjà si rapide à produire, mais on peut déduire des immenses progrès faits dans la représentation XML d’un fichier (grosses évolutions du XML quand on sauve une copie en XML, avancées de l’utilitaire Upgrade Tool, intégré à FileMaker Server…) que Claris est en train de préparer l’arrivée de l’assistant au développeur.
    • les principales nouveautés sont :
      • RAG (pour limiter les réponses d’un LLM à des informations trouvées dans un corpus de données précis (vos documents, votre site web…) afin d’obtenir des réponses précises et d’éviter les hallucinations.
      • recherche sémantique (texte et images) côté serveur
      • génération de requêtes SQL en langage naturel
      • implémentation des modèles directement sur FileMaker Server. Certains modèles sont même livrés avec l’installeur de FileMaker Pro pour une encore plus grande facilité.

    Sur ce dernier point, qui se caractérise par un nouvel onglet de la console d’administration du serveur, d’où l’on peut activer des modèles d’IA installés localement, on peut contester la pertinence. En effet, si cela a l’immense avantage d’être ultra-simple, il est très difficile, voire impossible, de contrôler la répartition des ressources entre en les modèles d’IA et FileMaker Server lui-même. Ainsi, à moins d’utiliser un serveur local grandement fourni en RAM et en VRAM – un mac Studio par exemple -, on peut très vite pénaliser l’exécution normale de FileMaker Server. On peut parier que dans un avenir proche, une machine secondaire pourra être désignée pour faire tourner l’IA, à l’image de ce que l’on peut déjà faire avec Web Direct. Pour l’heure, les principaux services d’hébergement, dont notre service fmcloud.fm, ont choisi de masquer cet onglet et de ne le proposer que dans des configurations “custom”.

    [/vc_column_text][vc_column_text]

    Localisation en français revue

    C’est un petit point, mais qu’il fallait bien mentionner quelque part : j’ai proposé à Claris de revoir un grand nombre de traductions et d’abréviations inutiles qui étaient présentes dans l’interface en français. Un grand nombre de ces modifications ont été appliquées, pour une plus grande clarté et une meilleure cohérence. La plupart de ces modifications vous sembleront parfaitement naturelles et vous ne les remarquerez même pas. J’attire toutefois votre attention sur les fonctions ObtenirTexteDynamique et ObtenirTexteDynamiqueEnJson où “TexteDynamique” remplace “TexteEnDirect” pour respecter la traduction d’Apple de sa technologie LiveText, mais qui pourrait vous laisser chercher ces fonctions longtemps.

    [/vc_column_text][vc_column_text]

    Navigation dans les ensembles trouvés (found sets)

    Immense nouveauté : la possibilité de mémoriser et restituer une liste d’enregistrements, en utilisant l’ID interne des enregistrements, tels que retournés par la fonction Get ( RecordID ) / Obtenir ( IDenregistrement )

    La fonction GetRecordIDsFromFoundSet ( type ) / ObtenirIDEnregistrementDansJeuTrouvé retourne un texte ou un tableau JSON (array) en fonction du paramètre type.

    [/vc_column_text][ish_table header_bg_color=”color2″ border_color=”color5″]

    Valeur du paramètre Forme du résultat
    0 liste d’IDs séparés par un retour chariot – ¶ ou Char (13) : 75¶76¶77¶78¶79¶81¶83¶87¶88¶89
    1 tableau JSON des IDs sous forme de strings (je ne comprends pas l’intérêt)
    2 tableau JSON des IDs sous forme de nombres
    3 liste des intervalles séparés par un retour chariot : 75-79¶81¶83¶87-89
    4 tableau JSON des intervalles

    [/ish_table][vc_column_text]

    Retenez les points suivants :

    • la fonction retourne un résultat immédiat, car elle ne fait pas appel à la “couche” données. Aucun téléchargement de données entre le serveur et le client n’est nécessaire
    • l’ordre de tri est respecté, mais il n’existe aucune information de contexte (ni table, ni modèle, ni… ordre de tri : les enregistrements sont dans le bon ordre mais on n’a pas les critères de tri).
    • il n’existe pas de fonction pour passer d’une notation liste (ou tableau) à son équivalent avec les intervalles, et vice versa. Il faut donc savoir ce que l’on veut faire lors de la restitution dès le moment de sa mémorisation (pour une restitution simple, la notation avec les intervalles est bien plus efficace (prend beaucoup moins de place), mais si vous comptez utiliser l’action de script Activer les enregistrements liés, alors vous avez besoin de la liste complète des IDs.

    Restitution : comme il est logique, la restitution de cet ensemble d’enregistrements se fait avec l’action de script Go to list of records, qui prend en paramètre n’importe quelle variante du résultat de la fonction ci-dessus, et permet de sélectionner le modèle de destination et d’ouvrir une nouvelle fenêtre.

    L’utilisation de ce pas de script ainsi que la gestion d’erreur a été harmonisée avec Activer les enregistrements liés.

    Remarque : si l’ordre de tri n’est pas l’ordre naturel, soit que les enregistrements eussent été triés à l’origine, soit que l’on aura manipulé l’ordre “manuellement”, par exemple avec un calcul du type : “3¶1¶2” – car oui, il est possible de définir un ordre qui ne pourrait être obtenu par un tri naturel – alors l’ensemble restitué sera semi-trié. C’est très important car, ne disposant pas des critères de tri à l’origine, FileMaker ne peut véritablement trier. Il faut donc prendre en compte que les sous-récapitulatifs après tri ne seront pas affichés, ou que la fonction GetSummary / Recapitulatif ne fonctionnera pas.

    Pourquoi est-ce si important ?

    • En combinaison avec l’exécution de scripts sur serveur et aux transactions, il devient extrêmement aisé de déléguer au serveur le traitement d’un ensemble d’enregistrements. Cette fonction personnalisée (c’est cadeau !) vous permettra de plus d’inclure plus d’information sur l’ensemble trouvé.
    • Vous pouvez mémoriser facilement de nombreux ensembles, afin, par exemple, de revenir en arrière dans un historique de navigation
    • Bien que toutes les fonctions d’un snapshot ne soient pas présentes (tri, alerte en cas d’enregistrements supprimés…), il est possible de communiquer un ensemble d’enregistrements, et ce sans faire appel au système de fichier. Ainsi, c’est utilisable en Web Direct.

    [/vc_column_text][vc_column_text]

    Remplacer contenu de rubrique sans exécuter les auto-entrées

    Pour moi, c’est ici la nouveauté la plus “révolutionnaire”. Elle figurait en tête de mes “feature requests” depuis bien longtemps. On peut maintenant, uniquement dans le cadre d’un script, éviter l’exécution des auto-entrées lors du remplacement du contenu d’une rubrique (Replace Field Contents).

    Cas d’utilisation :

    • Après une migration de données d’une ancienne application à une nouvelle : corrigez les données sans modifier les horodatages de modification.
    • Populez une nouvelle rubrique sur les anciens enregistrements.

    Conseil :

    Si vous avez un menu personnalisé pour les développeurs, remplacez la commande Remplacer par un script avec une seule instruction : Remplacer contenu rubrique. Ainsi, en tant que développeur, vous aurez la possibilité de cocher ou non la case pour exécuter les auto-entrées.

    Remarque : Nous avons désormais trois pas de scripts permettant d’éviter les auto-entrées : Importer enregistrements, Ouvrir transaction, Remplacer contenu rubrique.

    [/vc_column_text][vc_column_text]

    JSONParse

    Cette nouvelle fonction de calcul permet de stocker dans une variable, à côté de la classique représentation texte d’un objet (ou tableau) JSON, un réel objet JSON, permettant des traitements nettement (vraiment très très nettement !) plus rapides.

    Exemple d’utilisation :

    Soit $json contenant du JSON, par exemple un tableau dans lequel nous allons effectuer une boucle (par script ou avec la fonction While / TantQue.

    Définir Variable [ $json ; JSONParse ( $json )] retourne une variable $json inchangée quand on l’exploite avec des fonctions texte ou nombre (par exemple : Longueur ( $json ) ou Debut ( $json ; 1 )), mais qui contient également un véritable objet JSON, permettant aux fonctions JSON, notamment JSONGetElement d’agir beaucoup, plus vite.

    D’autre part, la fonction JSONParsedState ( $json ) permet de savoir si la variable $json contient un objet/tableau JSON, et si oui de quel type (3 pour objet, 4 pour tableau).

    [/vc_column_text][vc_column_text]

    Insérer texte : la limite de longueur supprimée

    Depuis que la cible de ce pas de script peut être une variable, ce pas de script est de retour en grâce car il permet d’introduire une constante de texte sans utiliser le moteur de calcul, et donc sans échapper les guillemets et autre retours chariot.

    Mais la limite de longueur de 30 000 caractères pouvait parfois être un problème. C’est désormais résolu, la limite est désormais de 250 000 000 (deux-cent-cinquante millions). Attention, si vous utilisez le plugin MBS sur mac, pensez à le mettre à jour, de longues variables pourraient le faire planter (c’est de toute façon une bonne idée que de le maintenir à jour).

    [/vc_column_text][vc_column_text]

    Dossiers dans les fonctions personnalisées

    Dans le même genre d’idée, on peut désormais regrouper les fonctions personnalisées par dossiers. Malheureusement, cette nouveauté se fait au détriment de la possibilité – indispensable à mes yeux – de trier les fonctions, soit par ordre alphabétique, soit par ordre de création.

    La possibilité nouvelle de rechercher dans les fonctions personnalisées ne vient que très partiellement pallier cet inconvénient.

    Plus grave, le fait de créer des dossiers avec la version 2025 (22) rendra la gestion des fonctions impossible avec les versions antérieures. En combinaison avec le fait que la version 2025 ne peut plus cohabiter, sous Windows, avec d’anciennes versions, c’est hautement problématique.

    De plus la fenêtre de gestion des fonctions personnalisées semble avoir été faite par un stagiaire, avec des boutons rectangulaires comme on n’en trouvait plus que dans la gestion des modèles – partout ailleurs nous avons des boutons arrondis), mais sans respecter la taille de police ou la marge. (à gauche, la fenêtre de gestion des modèles, à droite celle des fonctions personnalisées)

    [/vc_column_text][vc_column_text]

    Espace de travail de script : code repliable

    On peut désormais plier/déplier des partie de code dans les scripts, notamment à chaque fois qu’un pas de script provoque l’indentation (Si, Sinon, Fin de si, Boucle, Ouvrir transaction…).

    Note : à propos d’indentation, le comportement a changé : les pas de script désactivés ne modifient plus l’indentation, facilitant ainsi la lecture d’un script dont certains pas de script on été désactivés.

    [/vc_column_text][vc_column_text]

    Un SQL plus puissant

    De nombreuses améliorations ont été apportées à l’interface SQL utilisée par ODBC ou les plugins. Grâce à la mise à jour de la bibliothèque utilisée, on peut désormais utiliser les intervalles, les clauses IN, ALTER…

    On peut donc désormais facilement renommer un champ (par exemple) avec un plugin capable d’exécuter une requête SQL (MBS, BaseElements…) et une requête ALTER.

    FETCH NEXT facilitera les systèmes de pagination.

    Autre amélioration, dont bénéficie aussi la fonction de calcul ExecuterSQL : on a désormais accès à une nouvelle table système : FileMaker_ValueLists, ainsi, pour les listes non relationnelles, qu’à leurs valeurs FileMaker_ValueList_{NomDeLaListe}

    [/vc_column_text][vc_column_text]

    Extraire le texte d’un PDF

    Une nouvelle fonction de calcul permet d’extraire le texte d’un PDF stocké dans une rubrique conteneur.

    Attention, il ne s’agit pas de magie ou d’OCR, simplement de l’extraction de la couche texte du PDF, et c’est déjà très bien.

    [/vc_column_text][vc_column_text]

    Nouveautés de la gestion de base de données

    Cette interface apporte plusieurs nouveauté :

    • à l’image de ce qui était possible au niveau des rubriques, il est désormais possible d’ajouter un commentaire au niveau des tables. Chouette !… sauf que Claris a oublié de nous donner la fonction de calcul correspondante !
    • le type de résultat des rubriques Calcul est affiché dans la liste des rubriques. Enfin ! Malheureusement l’icône à gauche des rubriques dans l’éditeur de calcul ne distingue pas, elle, les différents types. Mais c’est un bon début !

    [/vc_column_text][vc_column_text]

    Modèles

    Quand on modifie la base de données, les changements sont automatiquement reflétés dans les modèles. On pouvait déjà, dans les réglages de l’application, demander à ce que les nouvelles rubriques ne soient pas ajoutées au modèle courant. On peut désormais faire en sorte qu’aucune modification de la structure de la base de données ne soit reflétée (pas de changement des libellés, pas de création de modèle pour une nouvelle table…)

    Mais la grande nouveauté, ou plutôt la petite nouveauté que vous allez adorer, c’est la possibilité d’ajouter des objets à un groupe sans avoir besoin de défaire le groupe (et de perdre les conditions de masquage…). Ceci peut se faire par les menus ou, plus naturellement, grâce à la palette d’objets. Bien sûr l’opération inverse (retirer du groupe) est également possible.

    [/vc_column_text][vc_column_text]

    Nouveautés pour Windows

    Deux nouveautés très importantes à mes yeux pour Windows :

    • l’action de script Envoyer courrier en passant par le client de messagerie devrait normalement fonctionner correctement avec tous les clients (Thunderbird…) et non plus seulement avec Outlook (et pour Outlook, on devrait en avoir fini avec les problèmes des versions récentes)
    • si l’utilisateur est connecté à son réseau local via Entra ID, le Web Viewer héritera de cette authentification. C’est un grand progrès pour les situation ou une application web interne requiert l’authentification.

    [/vc_column_text][vc_column_text]

    Nouveautés pour macOS

    Il y a énormément à dire sur ce chapitre. Comme dit précédemment, Claris se rapproche de sa maison mère, Apple, et il est important de matérialiser cela par l’expérience utilisateur. Il était anormal que, pour satisfaire l’aspect multi-plateforme de FileMaker, un utilisateur soit perdu en ouvrant FileMaker.

    Ainsi, voici les nouveautés remarquables :

    • la couleur de surbrillance définie dans les réglages système est désormais appliquées aux dialogues de FileMaker.
    • le design des volets gauche (liste de rubriques / objets / add-ons) et droit (inspecteur) est revu complètement. Personnellement, je trouve qu’on passe plus de temps à scroller dans l’inspecteur, mais un peu de fraicheur ne fait pas de mal.
    • la vue Tableau dispose de nouvelles options qui permettent un résultat graphiquement beaucoup plus “clean”.
    • le centre de lancement est revu. Attention, il n’est pas évident de trouver comment supprimer un favori ou une application récente. Il faut le sélectionner et l’effacer au clavier (Delete)
    • enfin et peut-être surtout, la barre d’outils est revue. Nouvelles icônes, nouvelles possibilités de personnalisation de la barre d’outils (chaque élément peut être ajouté/supprimé individuellement…), et fin des couleurs pour le mode modèle.

    [/vc_column_text][vc_column_text]

    FileMaker Server

    Comme dit plus haut, le gros des nouveautés concerne l’IA (recherche sémantique sur serveur, RAG, exécution de modèles en local…)

    De grandes améliorations ont été apportées à OData, notamment les fonctions d’agrégation (y compris AS). On peut donc contrôler pleinement la forme de la réponse, par exemple en concaténant le nom et le prénom et en renommant (AS) “nomComplet”. Pour l’instant, ces fonctions ne s’appliquent à la partie $select de la requête et non à la partie $filter (équivalent de WHERE en SQL). Cela reste pour moi la principale raison de continuer à utiliser ODBC, mais espérons qu’une version ultérieure apporte cette amélioration.
    D’autre part, les problèmes avec les caractères spéciaux introduits en version 21 ont été réglés.
    Attention toutefois, une modification importante dans la manière de retourner le ROWID vous obligera à adapter votre code pour parser cet élément. J’avoue mon étonnement concernant ce choix.

    Il est désormais très facile d’installer et de mettre à jour un certificat SSL Let’s Encrypt (ce que fmcloud.fm fait pour vous depuis “toujours”).

    On peut maintenant définir la page d’accueil de Web Direct depuis la console d’administration ainsi que depuis l’admin API.

    Web Direct : une alerte prévient l’utilisateur qu’il va quitter l’application quand il clique sur le bouton Back (retour) de son navigateur. Enfin la fin de cette technique de Romain Dunand et Ceydrick Valentini.

    On peut, depuis FileMaker Pro, désactiver pour Web Direct le menu local sur une rubrique conteneur.

    Voici pour un premier tour. J’espère vous avoir fait gagner du temps pour appréhender cette nouvelle version. N’hésitez pas à commenter ci-dessous.

    [/vc_column_text][/vc_column][/vc_row]

  • FileMaker 2025! Explore the new features

    FileMaker 2025! Explore the new features

    [vc_row bg_color=””][vc_column][vc_column_text]
    Claris has just announced the release of FileMaker 2025 (the commercial name for version 22).
    As usual, this article will walk you through what’s new and offer a critical perspective—both to help analyze the direction Claris is taking and to help you better understand the changes.

    Key points to consider

    Let’s start with a few important notes you should read before upgrading.

    • FileMaker Server 2025 only allows connections from FileMaker Pro 2024 (21) and 2025 (22). So be careful if your deployment still includes older versions.
    • Starting with version 22, major updates will now be supported via in-app updates, making it easier to keep client machines up to date.
    • Very important—and likely to complicate transitions if you’re working with a mix of versions: on Windows, it is no longer possible to install FileMaker Pro 2025 alongside older versions. FileMaker Pro 22 is expected to replace previous installations. (I haven’t tested this myself, so feel free to share your experience to clarify this point.)
    • If you’re using OData, consider waiting before updating your server. While there are significant improvements, some changes may break existing integrations (see the section on FileMaker Server at the end of this article).

    This is also the first time the Mac and Windows versions of the user interface diverge. On macOS, the developer interface now more closely resembles Apple’s own apps—like Keynote, Pages, or Numbers (more details on that below). But even the end-user interface is affected, with a new toolbar design. Frankly, I don’t quite understand why the icon set wasn’t updated on Windows too—for the sake of consistency.
    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column][vc_column_text]

    AI, AI, AI

    Already a major theme in version 21 (and let’s not forget that AI has been part of FileMaker since version 19 in 2020 via CoreML), artificial intelligence takes center stage in FileMaker 2025.

    I won’t go into all the implementation details here—there are numerous new functions and script steps. For an in-depth look, I still recommend reading the offficial release notes from Claris. But overall, here’s what stands out:

    • FileMaker 2025 continues in the same direction as version 21, prioritizing end-user interaction with data, rather than an “agentic” approach where AI would assist the developer by generating code or interfaces.
      Personally, I think this is the right strategy—after all, FileMaker’s “code” is already so fast to produce.
      That said, the major improvements in the XML representation of files (notably when saving a copy as XML) and the enhanced Upgrade Tool integrated into FileMaker Server suggest Claris is actively preparing for some form of developer assistant down the road.

    The main new AI features include:

    • RAG (Retrieval-Augmented Generation): limits LLM responses to data from a specific corpus (your documents, website, etc.), improving accuracy and reducing hallucinations

    • Semantic search, including text and image search—on the server side

    • Natural language to SQL query generation

    • Model hosting directly within FileMaker Server, with some models even bundled with the FileMaker Pro installer for even easier deployment

    That last point is worth discussing. FileMaker Server now includes a new admin console tab where you can enable locally installed AI models. While this is impressively simple to use, resource management is a real concern. Currently, there’s little to no way to control how much memory or GPU capacity is used by the models versus the FileMaker Server itself.
    Unless you’re running on powerful local hardware—like a Mac Studio with plenty of RAM and VRAM—you risk slowing down your entire deployment. We can probably expect Claris to allow offloading AI processing to a secondary machine in the near future, much like what’s already possible with WebDirect.

    For now, most hosting providers—including our own fmcloud.fm—have chosen to disable this AI tab by default and only enable it in custom configurations.

    [/vc_column_text][vc_column_text]

    French Localization Revisited

    It’s a minor point, but worth mentioning nonetheless: I had the opportunity to suggest improvements to Claris regarding several unnecessary translations and abbreviations in the French interface.

    Many of these changes have now been implemented, leading to a more consistent and clearer UI. Most of them will feel completely natural—you probably won’t even notice.

    However, I’d like to draw your attention to two specific functions: ObtenirTexteDynamique and ObtenirTexteDynamiqueEnJson.
    These now use TexteDynamique instead of TexteEnDirect, in order to align with Apple’s translation of Live Text.
    This change makes sense in context—but if you’re used to the old naming, you might spend a while looking for them.

    [/vc_column_text][vc_column_text]

    Found Set Navigation

    A major new feature: the ability to store and restore a list of records using their internal Record IDs, as returned by the Get ( RecordID ) function.

    The new GetRecordIDsFromFoundSet ( type ) function returns either a text string or a JSON array of record IDs, depending on the type parameter.

    [/vc_column_text][ish_table header_bg_color=”color2″ border_color=”color5″]

    Parameter value Result Format
    0 list of IDs separated by carriage returns – ¶ or Char (13): 75¶76¶77¶78¶79¶81¶83¶87¶88¶89
    1 JSON array of IDs as strings (I don’t really see the point)
    2 JSON array of IDs as numbers
    3 list of intervals separated by carriage returns: 75-79¶81¶83¶87-89
    4 JSON array of intervals

    [/ish_table][vc_column_text]

    Key points to remember:

    • The function returns an immediate result—it does not interact with the data layer. No data is downloaded between the server and the client.

    • Sort order is preserved, but no contextual information is included (no table, no layout, and no sort criteria—records are in the correct order, but the criteria used to sort them are not retained).

    • There’s no built-in function to convert between a list (or array) of IDs and a compact interval-based format, and vice versa. You need to choose your format at the time of storing the record set:

      • For lightweight storage or simple restoration, the interval format is much more efficient.

      • But if you plan to use the Go to Related Records script step later, you’ll need the full list of Record IDs.

    Restoring a found set is done, logically, via the new Go to list of records script step. It accepts any variant of the result from the function mentioned above and lets you specify the target layout and open a new window if needed.

    Error handling and behavior have been aligned with the Go to Related Records script step for consistency.

    Important note: If the sort order was custom—either because the found set had been sorted originally, or because the order was manually constructed (e.g. "3¶1¶2"), which allows for orders that couldn’t be achieved via standard sorting—then the restored found set will be semi-sorted.
    Why? Because FileMaker cannot reconstruct the sort criteria, so it cannot actually perform a sort. This means:

    • Sub-summary based on sort order layout parts will not display, and

    • The GetSummary function will not return expected results.

    Why does this matter?

    • Combined with Perform Script on Server (PSoS) and transactions, this makes it much easier to delegate the processing of a found set to the server.

    • You can store and restore multiple found sets, which opens up powerful use cases like maintaining a navigation history.

    • While it doesn’t offer all the features of a snapshot link (e.g., sort metadata, warning if records are deleted), you can pass found sets between users or processes—even in WebDirect, with no need for file system access.

    Bonus: Here’s a custom function to enhance this capability by embedding additional metadata alongside the found set…

    [/vc_column_text][vc_column_text]

    Replace Field Contents Without Triggering Auto-Enter

    To me, this is the most groundbreaking new feature in FileMaker 2025. It’s been at the top of my feature request list for a long time.
    You can now—exclusively within a script—choose to bypass auto-enter options when using Replace Field Contents.

    Use cases:

    • After migrating data from a legacy system: clean up or correct values without altering modification timestamps

    • Populate a new field across existing records, without interfering with calculated fields, timestamps, or modification tracking

    Pro tip:
    If you use a developer custom menu set, consider replacing the default Replace Field Contents command with a script that only includes that step. This way, you—as a developer—can decide whether to check or uncheck the Perform auto-enter options box.

    Note:
    We now have three script steps that can bypass auto-enter behavior:

    1. Import Records

    2. Open Transaction

    3. Replace Field Contents

    [/vc_column_text][vc_column_text]

    JSONParse

    This new calculation function allows you to store not just the usual text representation of a JSON object or array in a variable, but a true parsed JSON object, enabling much faster processing (and I really mean much faster).

    Example use case:

    Let’s say you have a JSON array stored in $json and you want to loop through its elements—either via script or using the While function.

    Set Variable [ $json ; JSONParse ( $json ) ]

    This keeps $json unchanged when used with text or numeric functions (e.g., Length ( $json ) or Left ( $json ; 1 )),
    but it now also contains a fully parsed JSON object, which significantly speeds up calls to JSON functions like JSONGetElement.

    Additionally, the new JSONParsedState ( $json ) function lets you check whether $json holds a parsed object or array—and tells you the type: 3 (object), 4 (array)

    [/vc_column_text][vc_column_text]

    Insert Text: Length Limit Removed

    Now that the target of the Insert Text script step can be a variable, this step has become popular again—since it allows you to define a text constant without invoking the calculation engine, meaning no need to escape quotes or carriage returns.

    However, the 30,000-character limit used to be a constraint. That’s now resolved: the new limit is 250,000,000 characters (yes, two hundred and fifty million).

    Note: If you’re using the MBS plugin on macOS, make sure to update it—very large variables could cause crashes. (In any case, keeping the plugin up to date is always a good idea.)

    [/vc_column_text][vc_column_text]

    Folders for Custom Functions

    Along the same lines, you can now organize custom functions into folders.
    Unfortunately, this new feature comes at the expense of something I consider essential: the ability to sort functions alphabetically or by creation order.

    The newly added search field only partially compensates for the lack of sorting.

    More critically, creating folders in FileMaker 2025 (version 22) makes the custom function list unreadable in earlier versions. Combined with the fact that FileMaker 2025 can no longer coexist with previous versions on Windows, this poses a serious compatibility concern.

    Besides, the custom function management window design is far from perfect.
    We’re back to old-school rectangular buttons that are -to my knowledge- only used in the Manage Layout dialog, but not even using the same margin, font size…
    (For comparison: manage layouts window on the left, custom functions window on the right.)

    [/vc_column_text][vc_column_text]

    Script Workspace: Collapsible Code

    You can now collapse and expand sections of code in scripts—particularly for script steps that introduce indentation, such as If, Else, End If, Loop, Open Transaction, and so on.

    Note: Regarding indentation—disabled script steps no longer affect indentation, making scripts easier to read when some steps are turned off.

    [/vc_column_text][vc_column_text]

    More Powerful SQL

    Numerous improvements have been made to the SQL engine used via ODBC or through plug-ins, as well as the ExecuteSQL function. Thanks to an updated underlying library, you can now use features such as intervals, IN clauses, and even ALTER statements.

    This means, for example, you can now rename a field using a plug-in capable of executing SQL (like MBS or BaseElements) along with an ALTER query.

    The addition of FETCH NEXT also makes it easier to implement pagination systems.

    Another enhancement is the introduction of a new system table: FileMaker_ValueLists.
    This allows you to query non-relational value lists, along with their individual values via dynamically generated tables like:
    FileMaker_ValueList_{ValueListName}.

    [/vc_column_text][vc_column_text]

    Extract Text from a PDF

    A new calculation function allows you to extract text from a PDF stored in a container field.

    Note: this isn’t magic or OCR—it simply extracts the text layer already present in the PDF. And that’s already a very welcome addition.

    [/vc_column_text][vc_column_text]

    Improvements to the Manage Database Dialog

    The updated interface brings a few new features:

    • Just like with fields, you can now add comments at the table level. Nice!
      …Except Claris forgot to give us a corresponding calculation function to access them.
    • The return type of calculation fields is now displayed in the field list—finally!
      Unfortunately, the icon to the left of fields in the calculation editor still doesn’t reflect the data type. But hey, it’s a start.

    [/vc_column_text][vc_column_text]

    Layouts

    When modifying the database structure, changes are automatically reflected in layouts.
    Previously, you could configure the app to prevent new fields from being added to the current layout. Now, you can go a step further and disable all automatic layout updates—no new fields, no label changes, and no auto-generated layouts for new tables.

    But the real treat—the small feature you’re going to love—is this:
    You can now add objects to a group without ungrouping it (and thus without losing hide conditions or other settings). This can be done via the menus, or more intuitively through the Object panel.

    Naturally, the reverse is also possible—you can now remove objects from a group just as easily.

    [/vc_column_text][vc_column_text]

    Windows-Specific Improvements

    Two major improvements on Windows, in my opinion:

    • The Send Mail script step (using the default email client) should now work properly with all email clients—including Thunderbird—not just Outlook. And for Outlook users, compatibility issues with recent versions should finally be resolved.

    • If the user is connected to the local network via Entra ID, the Web Viewer will inherit that authentication. This is a significant improvement for scenarios where an internal web app requires authentication.

    [/vc_column_text][vc_column_text]

    macOS-Specific Improvements

    There’s a lot to cover in this section. As mentioned earlier, Claris is aligning more closely with its parent company, Apple—and it was about time that this alignment translated into the user experience.
    For a cross-platform product like FileMaker, it was problematic that Mac users would feel lost in an interface that didn’t reflect macOS conventions.

    Here are the most notable changes:

    • The system accent color defined in macOS settings is now applied to FileMaker dialogs.

    • The design of the left and right panes (fields/objects/add-ons on the left, inspector on the right) has been completely reworked. Personally, I find myself scrolling more in the inspector—but the visual refresh is still welcome.

    • The Table view now offers new options for a much cleaner visual result.

    • The Launch Center has been redesigned. Be aware: removing a favorite or recent file isn’t very intuitive—you have to select it and press Delete on the keyboard.

    • And perhaps most importantly, the toolbar has been overhauled: new icons, full customization of individual toolbar elements, and the removal of colored icons for layout mode toolbar.

    [/vc_column_text][vc_column_text]

    FileMaker Server

    As mentioned earlier, most of the big changes on the server side revolve around AI: semantic search on the server, RAG (Retrieval-Augmented Generation), and local model execution.

    Significant improvements have also been made to OData, especially around aggregation functions (including AS). This means you can now fully control the response shape—for example, by concatenating first and last names and returning it as fullName.
    For now, though, these aggregation functions only apply to the $select portion of the query—not to $filter (the SQL-equivalent of WHERE). That remains, in my view, the main reason to continue using ODBC. Hopefully a future update will address this.
    On a positive note, issues with special characters introduced in version 21 have now been resolved.
    ⚠️ Important: a significant change has been made to how ROWID is returned, which may require you to update your parsing logic. I must admit, this design choice caught me by surprise.

    Installing and updating an SSL certificate via Let’s Encrypt is now extremely easy (something our service, fmcloud.fm, has been doing for a long time).

    You can now define the WebDirect home page from both the Admin Console and the Admin API.

    In WebDirect, users are now shown a warning before leaving the app when they click the browser’s Back button.
    Finally—no more needing to rely on Romain Dunand and Ceydrick Valentini’s clever workaround.

    From FileMaker Pro, you can also disable the context menu on container fields for WebDirect users.

    That’s it for this initial tour!
    I hope this helped you get a quicker handle on what FileMaker 2025 brings.
    Feel free to share your thoughts or questions in the comments below.

    [/vc_column_text][/vc_column][/vc_row]

  • Ecriture d’une fonction de calcul: json2sql

    Ecriture d’une fonction de calcul: json2sql

    [vc_row bg_color=””][vc_column][vc_column_text]Après avoir passé deux jours sur l’écriture d’une fonction de calcul, je me suis dit que je n’étais plus à un jour près et que raconter l’histoire de cette écriture pourrait être intéressant pour d’autres développeurs, non pas tellement pour cette fonction en elle-même, mais pour capter l’état d’esprit et les idées générales qui permettent d’aborder une fonction complexe.

    En plus, Claris m’ayant fait l’honneur de me programmer à la conférence Engage en mars prochain à Austin, avec un sujet aussi peu banal et prétentieux que “comment, moi, Fabrice Nordmann, j’aborde une problématique à résoudre avec la plateforme FileMaker”, il faut que je commence sérieusement à faire de l’introspection pour comprendre moi-même comment je fonctionne afin de l’expliquer. En tant que lecteur vous me servez donc de cobaye, ce dont je vous remercie.[/vc_column_text][vc_column_text]

    Tout d’abord, expliquons ce que fait la fonction.

    La fonction s’appelle json2sql et permet de formuler une requête SQL pour FileMaker en utilisant un paramètre JSON.

    En effet, la fonction d’écriture de JSON, JSONSetElement, est devenue franchement agréable à utiliser avec la version 21 de FileMaker, et on prend vite l’habitude, alors qu’écrire du SQL est vraiment pénible, surtout si on veut l’écrire bien, sans dépendance au nom des champs, afin que la requête ne s’arrête pas de fonctionner si on renomme une rubrique.

    L’idée est donc de passer un paramètre JSON à cette fonction, qu’elle le traduise en requête SQL et l’exécute (ça c’est l’idée avec laquelle j’ai commencé, mais ça s’est bien compliqué ensuite, vous allez voir).

    Nous avions déjà une fonction que nous utilisons beaucoup, sql.match ( _requestedField ; _matchField ; _match ), qui permet de retrouver les valeurs d’une colonne (_requestedField) dans les enregistrements correspondant à un critère dans une requête du type.

    SELECT _requestedField WHERE _matchField = _match

    Elle nous permet, de réaliser une grosse proportion des requêtes dont nous avons besoin quand on code en FileMaker.

    Mais évidemment, c’est très limité. Si on veut plusieurs colonnes, des fonctions, plusieurs comparaisons (WHERE)… ça ne suffit pas.

    Nous avons aussi un ensemble de fonctions qui nous aident à écrire proprement du SQL, comme sql.table, sql.col, sql.in.clause… mais rien d’aussi cool que le JSON.

    Et puis aussi, il y avait de la vaisselle sale dans l’évier, donc vraiment c’était le moment de trouver une fonction à écrire.

     

    Donc c’est parti, “yapuka”

    D’abord, quelle doit être “l’empreinte” de cette fonction ? Quel nom ? quels paramètres ?

    J’aime faire simple, alors :

    json2sql ( _json )

    Ben oui, JSON, c’est déjà fait pour structurer l’information, donc je vais tout indiquer dans le JSON, c’est joli. (Spoiler : ça ne finira pas comme ça).[/vc_column_text][vc_column_text]Je réfléchis donc à la structure du JSON, en ayant bien en tête que la fonction doit, in fine, appeler la fonction native

    ExecuteSQL ( sqlQuery ; fieldSeparator ; rowSeparator { ; arguments... } )

    Si vous n’êtes pas familier avec la fonction ExecuteSQL, rappelons que sqlQuery est une requête SQL de type SELECT uniquement, que l’on peut utiliser des ? en lieu et place des valeurs de comparaison et que ces ? vont être remplacés par FileMaker par des éléments dans la liste d’arguments passés en fin de fonction, dans l’ordre. L’avantage de cela est que FileMaker gère tout seul les types de données (transforme les dates au format SQL, ajoute les guillemets autour des textes mais pas des nombres, gère le séparateur décimal…)

    Donc par exemple si j’écris :

    ExecuteSQL ( "SELECT primaryKey FROM invoices WHERE clientName > ? AND invoiceDate = ? AND totalAmount > ?" ; "" ; "" ; "L" ; Date ( 6 ; 1 ; 2024 ) ; round ( 100/3 ;2 ) )

    Alors FileMaker va comprendre tout seul et exécuter la requête:

    SELECT primaryKey FROM invoices WHERE clientName > 'L' AND invoiceDate = '2024-06-01' AND totalAmount > 333.33

    (ajout des guillemets simples, transformation de la date, et utilisation du point comme séparateur décimal, même si mon fichier utilise la virgule, car SQL comprend le point).

    Voilà pour ce rappel concernant ExecutesSQL, revenons maintenant à l’écriture de la fonction.

    On aura donc un JSON écrit avec une fonction du type:[/vc_column_text][vc_column_text]

    JSONSetElement ( ""
       ; [ "query" ; <un objet JSON compliqué auquel je réfléchirai dans le détail après> ; JSONObject ]
       ; [ "fieldSeparator" ; "" ; JSONString ]
       ; [ "rawSeparator" ; "" ; JSONString ]
       ; [ "arguments" ; <un array JSON puisque les arguments doivent être passés dans l'ordre> ; JSONArray ]
    )

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]Notons aussi que je souhaite écrire

    • "{table}"."{column}" et nom simplement {column}
    • "{table}" et non simplement {table}

    Ceci afin d’éviter les problèmes de noms réservés de SQL ainsi que les nommages bizarre des champs avec par exemple une espace. Il est très important selon moi d’être dans cet état d’esprit : tout le monde doit pouvoir utiliser cette fonction, dans n’importe quel fichier FileMaker. Je ne prends donc ni pour acquis que les rubriques seront nommées “correctement” ou que le séparateur décimal d’un fichier sera forcément le mien, ou la langue le français (même si j’utilise la version anglaise de FileMaker). Donc toujours penser “ubiquité” : la fonction doit marcher partout, et si elle ne le peut pas, cela doit être conscient, assumé et documenté.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]La structure “algorithmique” de la requête est donc :

    "SELECT" & [ boucle sur une liste ordonnée de noms de colonnes ] & " FROM " & [ table, qui est une information que je peux extraire de la même liste si je qualifie pleinement les références aux rubriques avec la notation table::rubrique ]

    Suivi d’une partie facultative (on n’est pas obligé d’avoir des critères) :

    & " WHERE " & [ boucle sur un tableau de critères composés d'un opérateur logique (sauf pour le premier), d'une colonne, d'un opérateur de comparaison, et d'une valeur ]

    [/vc_column_text][vc_column_text]Je me lance donc enfin dans l’écriture d’un prototype de JSON pour le paramètre query.

    J’ouvre donc le DataViewer et…[/vc_column_text][vc_column_text]

    JSONSetElement ( ""
       ; [ "query.columns[+]" ; GetFieldName ( invoice::invoiceNumber ) ; JSONString ]
       ; [ "query.columns[+]" ; GetFieldName ( invoice::invoiceDate ) ; JSONString ]
       ; [ "query.columns[+]" ; GetFieldName ( invoice::amount ) ; JSONString ]
    )

    [/vc_column_text][vc_column_text]Voici donc un premier tableau, celui du nom des colonnes (il s’agit bien du nom et non de la valeur, c’est pourquoi le type est toujours String).

    Sauf que… je réalise que j’ai oublié les fonctions. Je sais que je ne veux pas les gérer tout de suite, mais il faut que ma structure permette l’évolution. J’ai aussi en tête que si un jour je veux gérer les jointures, il va me falloir un peu plus d’information sur les colonnes, mais ça, c’est pour plus tard. Je reprends :[/vc_column_text][vc_column_text]

    JSONSetElement ( ""
       ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceNumber ) ; JSONString ]
       ; [ "query.columns[:].function" ; "Sum" ; JSONString ]
       ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceDate ) ; JSONString ]
       ; [ "query.columns[+].name" ; GetFieldName ( invoice::amount ) ; JSONString ]
    )

    [/vc_column_text][vc_column_text]Bien, maintenant j’ai un tableau qui représente la liste des colonnes, je dois maintenant en faire quelque chose.

    Avant tout, il me faut un environnement pour ça. J’écris donc dans mon Visualiseur de données :[/vc_column_text][vc_column_text]

    Let ([
       _json = JSONSetElement ( ""
             ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceNumber ) ; JSONString ]
             ; [ "query.columns[:].function" ; "Sum" ; JSONString ]
             ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceDate ) ; JSONString ]
             ; [ "query.columns[+].name" ; GetFieldName ( invoice::amount ) ; JSONString ]
          );
       _query = ""
    ];
       _query
    )

    [/vc_column_text][vc_column_text]Je peux maintenant attaquer le paramètre query, et observer le résultat.

    Je ne vous remets pas tout le contenu du Visualiseur de données, juste le paramètre _query de la fonction Let (Definir en français)[/vc_column_text][vc_column_text]

    "SELECT " & While ([
            j = _json ;
    	          c = ValueCount ( JSONListKeys ( j ; "columns" )) ;
    	          i = 0 ;
    	          r = "" ;
    	          v = "" ;
    	          to = "" ;
    	        toq = "" 
    	     ];
    	        i < c ;
    	     [
    		        v = Substitute ( JSONGetElement ( j ; "columns[" & i & "].name" ) ; "::" ; ¶ ) ;
    		        function = JSONGetElement ( j ; "columns[" & i & "].function" ) ;
    		        // as we are selecting from 1 table only, let's extract the table occurrence name only during the first iteration
    		        to = Case ( i = 0 ; GetValue ( v ; 1 ) ; to ) ;
    		        // quoted version, to avoid issue with reserved words or blanks
    		        toq = Case ( i = 0 ; Quote ( to ) ; toq ) ;
    		        column = GetValue ( v ; 2 ) ;
    		        colq = Quote ( column ) ; // quoted version
    		        // append to the list
    		        r = List ( r ; Case ( IsEmpty ( function ) ; colq ; function & "(" & colq & ")" )) ;
    		        i = i+1
    	     ];
    		        Substitute ( r ; ¶ ; ", " ) & " FROM " & to 
       )
    )

    [/vc_column_text][vc_column_text]D’abord, rassurez-vous, je n’ai pas écrit ça d’un seul coup, mais je ne peux pas décortiquer chaque étape, sans quoi vous allez vous ennuyer et la vaisselle dans l’évier va commencer à sentir…

    Notez tout de même que :

    • je ne me suis pas occupé des fonctions tout de suite
    • j’utilise pour mes fonctions While (TantQue) un certain nombre de conventions qui me font aller assez vite :
      • l’itérateur est toujours i (sauf dans le cas d’une boucle imbriquée (While dans While, auquel cas c’est j)
      • je commence par c (le nombre d’itérations), et par initialiser i (l’itérateur), r (le résultat), et en général v (la valeur traitée)
      • la condition est presque toujours i < c
      • l’incrémentation de l’itérateur (i = i+1) intervient en premier paramètre de la partie logique, ou en dernier quand on travaille sur un array JSON (0-based)
    • je n’ai ajouté les commentaires que plus tard

    Vous pourriez aussi vous demander pourquoi avoir to et toq, column et colq, et pas seulement la version q (entre guillemets). Vous avez raison, à ce stade ça n’est pas nécessaire. Je les ai laissés ici pour que la comparaison avec les versions suivantes soient facilitées (je vous mâche le travail !)[/vc_column_text][vc_column_text]

    Clause WHERE

    Je peux donc passer aux critères.

    Je commence à écrire le tableau (array), sauf que là, il me faut quelques données, ou du moins, à ce stade, une table et des rubriques.

    Je demande à ChatGPT de me fournir un échantillon de données en csv, en faisant bien attention d’avoir différents types (texte (dont au moins une colonne contenant des textes multi-lignes), nombre, date) et des doublons (pour pouvoir faire des regroupements). Je m’assure aussi d’avoir des colonnes dont les noms comportent des espaces ou des caractères accentués. Je glisse mon CSV sur l’icone de FileMaker qui le convertit en fichier .fmp12 et hop, on peut travailler “pour de vrai”. En fait, pas tout à fait encore. Je dois d’abord convertir les données de type date qui sont au format YYYY-MM-DD au format FileMaker, qui dans mon fichier est DD/MM/YYYY. Cela aurait dû me mettre la puce à l’oreille, mais… vous allez voir.

    Retour au Visualiseur de données.[/vc_column_text][vc_column_text]

    JSONSetElement ( "" 
       ; [ "criteria[+].column" ; GetFieldName ( invocies::total ) ; JSONString ]
       ; [ "criteria[:].operator" ; "<" ; JSONString ]
       ; [ "criteria[:].value" ; 100.23 ; JSONNumber ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::invoiceNumber ) ; JSONString ]
       ; [ "criteria[:].operator" ; "LIKE" ; JSONString ]
       ; [ "criteria[:].logicalOperator" ; "OR" ; JSONString ]
       ; [ "criteria[:].value" ; "NC%" ; JSONString ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::clientVatNumber ) ; JSONString ]
       ; [ "criteria[:].operator" ; "=" ; JSONString ]
       ; [ "criteria[:].value" ; "*" ; JSONString ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::taxTotal ) ; JSONString ]
       ; [ "criteria[:].operator" ; "=" ; JSONString ]
       ; [ "criteria[:].value" ; "=" ; JSONString ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::date ) ; JSONString ]
       ; [ "criteria[:].operator" ; ">" ; JSONString ]
       ; [ "criteria[:].value" ; Date ( 12 ; 1 ; 2015 ) ; JSONString ]
    )

    [/vc_column_text][vc_column_text]Comme vous le voyez, avec cette nouvelle notation [+] et [:] de la version 21, il est vraiment très aisé d’écrire un array de manière naturelle. Avec [+], je commence une nouvelle rangée, avec [:] j’ajoute une “colonne” (“attribut”) en restant dans la même rangée.

    Je peux donc écrire presque naturellement, et donc au cours de l’écriture me viennent des idées. Par exemple l’idée d’utiliser des opérateurs de recherche classiques et bien pratiques en FileMaker tel que “=” (vide) et “*” (non vide). Je prévois donc ces cas dans le prototype en pensant que je les traiterais pour des opérateurs IS NULL et IS NOT NULL en SQL. L’important ici est que je n’y avais pas pensé avant de commencer, et que je juge au fil de l’eau que ce sera assez facile à gérer et que donc je vais l’intégrer dès la première version.

    Premier écueil

    En revanche, en écrivant ce prototype je me rends compte d’une chose à laquelle je n’avais pas pensé (j’aurais dû, mais je dois bien me rendre à l’évidence, au risque de décevoir ma mère : je suis imparfait)
    Note: pour ma grand mère, dont je vous parlais ici, c’est tout noir ou tout blanc, elle est très booléenne.

    Et donc, ce problème, c’est qu’en arrivant à la comparaison de date, je me rends compte que si je passe comme je le voulais les arguments sous forme de ? pour qu’ils soient substitués pas les valeurs (voir plus haut sur la syntaxe de ExecuteSQL), le type sera forcément perdu par un passage par JSON, JSON étant dépourvu de type date, et donc FileMaker sera incapable de passer le bon type de donnée (il n’y verra que du texte ou du nombre).

    Cela s’ajoute à ce que j’avais déjà en tête, à savoir que pour passer un nombre variable de paramètres à une fonction (ce qu’indiquent les {} (facultatif) et les … (nombre variable) dans l’empreinte de la fonction

    ExecuteSQL ( sqlQuery ; fieldSeparator ; rowSeparator { ; arguments... } )

    Et ça, je sais que ça va m’obliger à utiliser l’indirection et la fonction Evaluate… et je n’ai pas très envie à ce stade, en particulier quand on est dans un contexte où on joue avec l’indépendance des noms des champs, avec des guillemets, des conversions de type… Bref, le truc pénible qui va compliquer l’écriture de cette fonction, sa maintenance, et éventuellement sa qualité. On verra plus tard qu’on y arrivera, à l’indirection (Evaluate), mais pour d’autres raisons.

    Donc je laisse tomber l’idée de passer les arguments avec des ?, et je dois donc insérer directement les valeurs correctement dans le JSON à l’aide d’une fonction que j’utilisais déjà pour écrire les requêtes SQL : sql.getAsSqlData ( _data ; _type ). C’est vrai pour les données de types date, heure et horodatage. Les nombres sont bien gérés par JSON.

    D’ailleurs, en écrivant cet article, je me rends compte que le nom même de la fonction json2sql n’est pas forcément le bon. Dans notre bibliothèque de fonction, le premier mot nous permet de regrouper alphabétiquement les fonctions selon ce qu’elles traitent. Nous avons une ribambelle de text.<quelque chose>, de json.<quelque chose>… or ici, il me semble que le sujet est plus le SQL que le JSON. Donc je devrais probablement renommer la fonction sql.fromJson… je vais devoir encore réfléchir un peu à ça.[/vc_column_text][vc_column_text]Cette mésaventure me pousse à reconsidérer l’empreinte que j’avais choisie, avec un simple paramètre en JSON.

    Sans que ce soit évident (je pourrais très bien continuer dans cette voie, je me dis que le fait de passer les paramètres fieldSeparator et rowSeparator dans le JSON ne mettra pas en valeur la différence avec ExecuteSQL et la manière de passer les arguments. Je décide de revenir sur cette décision et de passer à l’empreinte suivante :

    json2sql ( _jsonQuery ; _fieldSeparator ; _rowSeparator )

    qui ressemble plus à l’empreinte de la fonction native :

    ExecuteSQL ( sqlQuery ; fieldSeparator ; rowSeparator { ; arguments... } )

    et cela allège un peu la documentation que l’utilisateur (développeur) devra lire pour utiliser la fonction.

    Cela aussi, ça fait partie de “l’état d’esprit” dans lequel je me mets pour écrire une fonction personnalisée : j’essaie de respecter les usages de la plateforme FileMaker, et d’être aussi cohérent que possible. Je ne renonce pas pour autant aux _ (underscores) devant les paramètres : d’abord ils rappellent qu’il s’agit d’une fonction personnalisée, et ensuite c’est une convention que je trouve assez importante dans mon code, mais on ne va pas discuter conventions de nommage…[/vc_column_text][vc_column_text]J’ajoute donc à ma fonction la partie qui s’occupe des critères (clause WHERE) :[/vc_column_text][vc_column_text]

    <the first part of the function here>
    & Case ( not IsEmpty ( JSONListKeys ( j ; "criteria" )) ; 
       " WHERE " &
       While ([
          i = 0 ;
          c = ValueCount ( JSONListKeys ( j ; "criteria" )) ;
          v = "" ;
          r = ""
       ];
          i < c ;
       [
          f = GetValue ( Substitute ( JSONGetElement ( j ; "criteria[" & i & "].column" ) ; "::" ; ¶ ) ; 2 ) ;
          o = JSONGetElement ( j ; "criteria[" & i & "].operator" ) ;
          o = Case ( IsEmpty ( o ) ; "=" ; o ) ; // default comparison operator is =
          lo = JSONGetElement ( j ; "criteria[" & i & "].logicalOperator" ) ; 
          lo = Case ( IsEmpty ( lo ) ; "AND" ; lo ) ; // default logical operator is AND
          value = JSONGetElement ( j ; "criteria[" & i & "].value" ) ; 
          type = JSONGetElementType (  j ; "criteria[" & i & "].value" ) ;
          // this ugly things converts the data to JSON then parses it as a string to handle decimal separators and single quotes.
          v = Case ( type = JSONNumber or type = JSONBoolean ; Substitute ( JSONSetElement ( "" ; "v" ; value ; JSONNumber ) ; [ "{\"v\":" ; "" ] ; [ "}" ; "" ] ) ; "'" & value & "'" ) ;
          r = r & Case ( i ; " " & lo & " " ) // the logical operator is omitted for the first criterion
              & Quote ( f ) & " " & Case ( o = "=" and ( IsEmpty ( value ) or value = "=" ) ; "IS NULL" ; o = "=" and value = "*" ; "IS NOT NULL" ;  o & " " &  v ) ;
          i = i+1 
       ] ;
          r
       )
    )

    [/vc_column_text][vc_column_text]Quelques commentaires :

    • cette partie est conditionnée au fait qu’on trouve bien un tableau (array) “criteria” dans le JSON, j’aurais pu inclure le ” WHERE ” dans le résultat du While, mais je trouve que c’est plus lisible ainsi. On voit tout de suite qu’il s’agit de la clause WHERE de la requête.
    • pour l’opérateur de comparaison (o), on voit que s’il est vide, j’utilise “=”, valeur par défaut. Penser à des valeurs par défaut permet de faciliter l’usage de la fonction.
    • pour l’opérateur logique, c’est AND par défaut
    • comme prévu, le traitement de * et de = est très simple (voir la définition de r)

    [/vc_column_text][vc_column_text]Je passe rapidement sur les autres clauses GROUP BY, ORDER BY, OFFSET et FETCH FIRST. Elles sont assez facilement compréhensibles dans le code de la fonction.

    Notons simplement que j’ai volontairement exclus le OFFSET par pourcentage, parce que ça introduisait une ambiguité au niveau du paramètre JSON : dois-je envoyer un nombre (5) ou un texte (“5%”). Et puis je vous avoue que je n’ai jamais utilisé ce pourcentage, donc pas envie d’ajouter de la complexité pour rien, en tout cas pas dans la première version.[/vc_column_text][vc_column_text]

    // GROUP BY
    & Case ( not IsEmpty ( JSONListKeys ( j ; "group" )) ; " GROUP BY " &
    
       While ([
          i = 0 ;
          c = ValueCount ( JSONListKeys ( j ; "group" )) ;
          f = "" ;
          r = ""
       ];
          i < c ;
       [
          f = GetValue ( Substitute ( JSONGetElement ( j ; "group[" & i & "].column" ) ; "::" ; ¶ ) ; 2 ) ;
          r = List ( r ; Quote ( f )) ;
          i = i+1 
       ] ;
          Substitute ( r ; ¶ ; ", " )
       )
    )
    
    // ORDER BY
    & Case ( not IsEmpty ( JSONListKeys ( j ; "sort" )) ; " ORDER BY " &
       While ([
          i = 0 ;
          c = ValueCount ( JSONListKeys ( j ; "sort" )) ;
          d = "" ;
          r = ""
       ];
          i < c ;
       [
          f = GetValue ( Substitute ( JSONGetElement ( j ; "sort[" & i & "].column" ) ; "::" ; ¶ ) ; 2 ) ;
          d = JSONGetElement ( j ; "sort[" & i & "].dir" ) ; 
          d = Case ( IsEmpty ( d ) ; "A" ; d ) ;
          r = List ( r ; Quote ( f ) & Case ( Left ( d ; 1 ) = "d" ; " DESC" ; " ASC" )) ;
          i = i+1 
       ] ;
          Substitute ( r ; ¶ ; ", " )
       )
    )
    
    // OFFSET and FETCH FIRST
    & Case ( JSONGetElement ( j ; "offset" ) ; " OFFSET " & JSONGetElement ( j ; "offset" ) & " ROWS" )
    & Case ( JSONGetElement ( j ; "limit" ) ; " FETCH FIRST " & JSONGetElement ( j ; "limit" ) & " ROWS ONLY" )

    [/vc_column_text][vc_column_text]

    Exécution du SQL et c’est fini !

    Et donc me voilà avec une fonction qui crée un parfaite requête SQL à partir d’un parmètre JSON. Je n’avais plus qu’à exécuter le SQL et retourner le résultat.

    Rien de plus simple.

    Quelques tests. Ça marche du feu de Dieu ! (pour les plaintes en blasphèmes, adressez-vous au guichet d’à côté). Les requêtes fonctionnent, j’obtiens bien les bons résultats, avec ou sans fonctions, avec ou sans critères…

    Et puis… j’ai eu une idée.

    Et c’est donc là que les ennuis ont commencé…

    … mais je vous les raconterai dans une seconde partie.[/vc_column_text][vc_column_text]

    Conclusions de la première partie

    • se mettre dans un certain état d’esprit. Ici je sais que je travaille sur une fonction générique, elle doit donc être capable de fonctionner dans n’importe quel contexte, et être facilement utilisable pas n’importe quel développeur. Quand je crée une fonction dans le cadre d’un projet client, je préfixe le nom de la fonction du nom du projet, et en fin de projet, je parcours ces fonctions pour voir si certaines mériteraient d’être rendues génériques et d’entrer dans notre boîte à outil. Mais si certaines se qualifient, ce n’est JAMAIS sans une revue du code pour qu’il soit présenté de manière cohérente avec nos autres fonctions, qu’il prévoie bien des cas dont nous n’avions pas besoin dans ce projet spécifique…
    • dans la mesure du possible, respecter la plateforme FileMaker et écrire les fonctions d’une manière qui les rendra utilisables assez naturellement dans ce cadre.
    • penser à gérer des valeurs par défaut pour ne pas contraindre l’utilisateur (le développeur) à renseigner tous les paramètres.
    • planifier, mais pas trop. J’ai une idée de ce que dois faire la fonction, je diffère d’emblée certaines possibilités (ici les jointures par exemple), mais d’un autre côté je ne m’interdis pas d’avoir des idées en cours de route (le traitement des opérateurs de comparaison = et * dans cet exemple). Comme vous le verrez dans la seconde partie, avoir eu une idée en cours de route m’a coûté très cher en temps, mais d’un autre côté le résultat méritait cette peine.
    • travailler avec des données. Partir du concret et aller vers l’abstrait. Beaucoup plus efficace que de monter toute une construction mentale et d’ensuite la confronter à la réalité et se rendre compte que rien ne va.
    • penser aux types de données, et garder en tête que quand on va boucler (While), les textes multi-lignes sont en soi un type de données.
    • avoir des conventions (ici la structure de la boucle While, entre autres) et s’y tenir.

    [/vc_column_text][/vc_column][/vc_row]

  • Writing a calculation function: json2sql

    Writing a calculation function: json2sql

    [vc_row bg_color=””][vc_column][vc_column_text]After spending two days writing a calculation function, I figured I wasn’t a day short, and that sharing the story behind writing this function could be interesting for other developers—not so much for the function itself, but to capture the mindset and the general ideas that help approach a complex function.

    Moreover, since Claris has honored me with a spot at the Engage conference next March in Austin, with a topic as unusual and pretentious as “how I, Fabrice Nordmann, tackle a problem to solve with the FileMaker platform,” I need to start seriously reflecting to understand my own process in order to explain it. As readers, you’re serving as my test audience, for which I thank you.[/vc_column_text][vc_column_text]

    First, let’s explain what the function does.

    The function is called json2sql and enables the formulation of an SQL query for FileMaker using a JSON parameter.

    Indeed, the JSON writing function, JSONSetElement, became quite enjoyable to use with FileMaker 21, and you quickly get used to it, while writing SQL remains cumbersome—especially if you want to write it well, without dependency on field names, so that the query doesn’t break if a field is renamed.

    The idea, therefore, is to pass a JSON parameter to this function, have it translate the parameter into an SQL query, and execute it (that was the initial idea, but things got much more complicated afterward, as you’ll see).

    We already had a function that we use frequently, sql.match (_requestedField ; _matchField ; _match), which allows retrieving values from a column (_requestedField) in records matching a criterion in a query of this type.

    SELECT _requestedField WHERE _matchField = _match

    It allows us to handle a large portion of the queries we need when coding in FileMaker.

    But, of course, it’s very limited. If you want multiple columns, functions, multiple comparisons (WHERE)… it’s not enough.

    We also have a set of functions that help us write SQL cleanly, like **sql.table**, **sql.col**, **sql.in.clause**… but nothing as cool as JSON.

    Plus, there were dirty dishes in the sink, so it was clearly the perfect moment to come up with a new function to write.

    So here we go!

    First, what should be the “signature” of this function? What name? What parameters?

    I like to keep things simple, so:

    json2sql ( _json )

    Exactly, JSON is already designed to structure information, so I’ll include everything in the JSON—it looks nice. (Spoiler: it won’t end up that way.)[/vc_column_text][vc_column_text]So, I’m thinking about the structure of the JSON, keeping in mind that the function ultimately needs to call the native function:

    ExecuteSQL ( sqlQuery ; fieldSeparator ; rowSeparator { ; arguments... } )

    If you’re not familiar with the ExecuteSQL function, let’s recap: sqlQuery is a SELECT-only SQL query. You can use ? placeholders instead of comparison values, which FileMaker will replace with items from the argument list at the end of the function, in order. The advantage of this approach is that FileMaker handles data types for you (converts dates to SQL format, adds quotes around text but not numbers, manages decimal separators, etc.).

    For example, if I write:

    ExecuteSQL ( "SELECT primaryKey FROM invoices WHERE clientName > ? AND invoiceDate = ? AND totalAmount > ?" ; "" ; "" ; "L" ; Date ( 6 ; 1 ; 2024 ) ; round ( 100/3 ;2 ) )

    Then, FileMaker will interpret it automatically and execute the following query:

    SELECT primaryKey FROM invoices WHERE clientName > 'L' AND invoiceDate = '2024-06-01' AND totalAmount > 33.33

    (adds single quotes, converts the date, and uses a period as the decimal separator, even if my file uses a comma, since SQL interprets the period).

    That’s our quick refresher on ExecuteSQL; now, let’s get back to writing the function.

    We’ll have a JSON structured using a function like:[/vc_column_text][vc_column_text]

    JSONSetElement ( ""
       ; [ "query" ; <a complex JSON object I will think about later> ; JSONObject ]
       ; [ "fieldSeparator" ; "" ; JSONString ]
       ; [ "rawSeparator" ; "" ; JSONString ]
       ; [ "arguments" ; <a JSON array, since arguments must be ordered> ; JSONArray ]
    )

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]Note that I wish to use these notations

    • "{table}"."{column}" instead of simply {column}
    • "{table}" instead of {table}

    This approach helps avoid issues with SQL reserved names and oddly named fields, like those with spaces. It’s essential, in my opinion, to adopt this mindset: everyone should be able to use this function in any FileMaker file. I make no assumptions that fields will be named “correctly” or that the decimal separator will match mine, or that the language will be French (even though I personally use the English version of FileMaker). So, always think “ubiquity”: the function should work everywhere, and if it can’t, that limitation should be deliberate, acknowledged, and documented.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]The “algorithmic” structure of the query is therefore:

    "SELECT" & [ loop over an ordered list or array of column names ] & " FROM " & [ table, which is information I can extract from the same list if I fully qualify field references with the table::field notation ]

    followed by an optional section (criteria aren’t mandatory):

    & " WHERE " & [ loop over an array of criteria composed of a logical operator (except for the first one), a column, a comparison operator, and a value ]

    [/vc_column_text][vc_column_text]I finally dive into writing a JSON prototype for the query parameter.

    So I open the Data Viewer and…[/vc_column_text][vc_column_text]

    JSONSetElement ( ""
       ; [ "query.columns[+]" ; GetFieldName ( invoice::invoiceNumber ) ; JSONString ]
       ; [ "query.columns[+]" ; GetFieldName ( invoice::invoiceDate ) ; JSONString ]
       ; [ "query.columns[+]" ; GetFieldName ( invoice::amount ) ; JSONString ]
    )

    [/vc_column_text][vc_column_text]Here’s the first array—the list of column names (this is indeed the name, not the value, so the type is always String).

    Except… I realise I forgot about functions. I know I don’t want to handle them just yet, but my structure needs to allow for future expansion. I’m also keeping in mind that if I ever want to manage joins, I’ll need a bit more information about the columns, but that’s for later. Starting over:[/vc_column_text][vc_column_text]

    JSONSetElement ( ""
       ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceNumber ) ; JSONString ]
       ; [ "query.columns[:].function" ; "Sum" ; JSONString ]
       ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceDate ) ; JSONString ]
       ; [ "query.columns[+].name" ; GetFieldName ( invoice::amount ) ; JSONString ]
    )

    [/vc_column_text][vc_column_text]Good, now I have an array representing the list of columns, and I need to do something with it.

    First and foremost, I need an environment for this. So, I write in my Data Viewer:[/vc_column_text][vc_column_text]

    Let ([
       _json = JSONSetElement ( ""
             ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceNumber ) ; JSONString ]
             ; [ "query.columns[:].function" ; "Sum" ; JSONString ]
             ; [ "query.columns[+].name" ; GetFieldName ( invoice::invoiceDate ) ; JSONString ]
             ; [ "query.columns[+].name" ; GetFieldName ( invoice::amount ) ; JSONString ]
          );
       _query = ""
    ];
       _query
    )

    [/vc_column_text][vc_column_text]

    I can now tackle the query parameter and observe the result.

    I won’t include the entire content of the Data Viewer here—just the _query parameter of the Let function.

    [/vc_column_text][vc_column_text]

    "SELECT " & While ([
            j = _json ;
    	          c = ValueCount ( JSONListKeys ( j ; "columns" )) ;
    	          i = 0 ;
    	          r = "" ;
    	          v = "" ;
    	          to = "" ;
    	        toq = "" 
    	     ];
    	        i < c ;
    	     [
    		        v = Substitute ( JSONGetElement ( j ; "columns[" & i & "].name" ) ; "::" ; ¶ ) ;
    		        function = JSONGetElement ( j ; "columns[" & i & "].function" ) ;
    		        // as we are selecting from 1 table only, let's extract the table occurrence name only during the first iteration
    		        to = Case ( i = 0 ; GetValue ( v ; 1 ) ; to ) ;
    		        // quoted version, to avoid issue with reserved words or blanks
    		        toq = Case ( i = 0 ; Quote ( to ) ; toq ) ;
    		        column = GetValue ( v ; 2 ) ;
    		        colq = Quote ( column ) ; // quoted version
    		        // append to the list
    		        r = List ( r ; Case ( IsEmpty ( function ) ; colq ; function & "(" & colq & ")" )) ;
    		        i = i+1
    	     ];
    		        Substitute ( r ; ¶ ; ", " ) & " FROM " & to 
       )
    )

    [/vc_column_text][vc_column_text]First, rest assured, I didn’t write this all in one go. But I can’t dissect each step, or you’d get bored, and the dishes in the sink would start to smell…

    A few things to note:

    • I didn’t handle functions right away.
    • I follow several conventions for my While loops, which make the process faster:
      • The iterator is always i (except in nested loops, where it’s j).
      • I start with c (the number of iterations) and initialize i (the iterator), r (the result), and usually v (the processed value).
      • The condition is almost always i < c.
      • Incrementing the iterator (i = i+1) is in the first parameter of the logical part or last when working on a JSON array (zero-based).
      • I only added comments later.

    You might also wonder why I have to and toq, column and colq, instead of just the q (quoted) versions. You’re right; at this stage, it’s not necessary. I left them here to make comparison with future versions easier (saving you some work!).[/vc_column_text][vc_column_text]

    WHERE clause

    I started with the criteria.

    I began writing the array, but at that point, I needed some data—or at least a table and fields for testing.

    I asked ChatGPT to provide me with a sample dataset in CSV format, making sure it included various data types (text, including at least one column with multi-line text, numbers, and dates) and duplicates (to enable grouping). I also ensured that some column names included spaces or accented characters. I dragged the CSV file onto the FileMaker icon, which converted it into an .fmp12 file, and voilà, I was ready to work “for real.” Well, almost. I first needed to convert the date data from the YYYY-MM-DD format to FileMaker’s format, DD/MM/YYYY in my file. That should have clued me in, but… you’ll see.

    Then, back to the Data Viewer.[/vc_column_text][vc_column_text]

    JSONSetElement ( "" 
       ; [ "criteria[+].column" ; GetFieldName ( invocies::total ) ; JSONString ]
       ; [ "criteria[:].operator" ; "<" ; JSONString ]
       ; [ "criteria[:].value" ; 100.23 ; JSONNumber ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::invoiceNumber ) ; JSONString ]
       ; [ "criteria[:].operator" ; "LIKE" ; JSONString ]
       ; [ "criteria[:].logicalOperator" ; "OR" ; JSONString ]
       ; [ "criteria[:].value" ; "NC%" ; JSONString ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::clientVatNumber ) ; JSONString ]
       ; [ "criteria[:].operator" ; "=" ; JSONString ]
       ; [ "criteria[:].value" ; "*" ; JSONString ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::taxTotal ) ; JSONString ]
       ; [ "criteria[:].operator" ; "=" ; JSONString ]
       ; [ "criteria[:].value" ; "=" ; JSONString ]
       ; [ "criteria[+].column" ; GetFieldName ( invoices::date ) ; JSONString ]
       ; [ "criteria[:].operator" ; ">" ; JSONString ]
       ; [ "criteria[:].value" ; Date ( 12 ; 1 ; 2015 ) ; JSONString ]
    )

    [/vc_column_text][vc_column_text]As you can see, with the new [+] and [:] notation in version 21, it’s incredibly easy to write an array naturally. With [+], I start a new row, and with [:], I add a “column” (“attribute”) while staying in the same row.

    This allows me to write in a very natural way, and new ideas come to mind as I go. For example, I thought of using common, practical search operators in FileMaker, such as “=” (empty) and “*” (not empty). So, I included these cases in the prototype, planning to map them to IS NULL and IS NOT NULL in SQL. What’s important here is that I hadn’t considered this before starting, but as I worked, I realised it would be manageable and decided to integrate it right into the first version.

    First pitfall

    On the other hand, while writing this prototype, I realize something I hadn’t thought of (I should have, but I must face the truth, even if it disappoints my mother: I am imperfect).
    Note: For my grandmother, whom I mentioned earlier (article in French), it’s all black or white; she has a very Boolean way of thinking.

    And so, the issue is that when it comes to date comparison, I realize that if I pass the arguments as ?, as I initially wanted, so they can be substituted with values (see above on the ExecuteSQL syntax), the type will inevitably be lost through JSON, as JSON lacks a date type. As a result, FileMaker won’t be able to pass the correct data type, seeing only text or a number.

    This adds to what I already had in mind: to pass a variable number of parameters to a function, as indicated by {}(optional) and (variable number) in the function’s signature:

    ExecuteSQL ( sqlQuery ; fieldSeparator ; rowSeparator { ; arguments... } )

    And this, I know, will force me to use indirection and the Evaluate function… and I’m not thrilled about it at this stage, especially when dealing with field name independence, quotation marks, type conversions, and so on. In short, it’s a hassle that will complicate writing this function, maintaining it, and potentially affect its quality. We’ll get to indirection (Evaluate) later, but for other reasons.

    So I’m dropping the idea of passing arguments with ?, and I’ll need to insert the values directly and correctly in the JSON using a function I already use to format SQL queries: sql.getAsSqlData ( _data ; _type ). This is particularly relevant for date, time, and timestamp data types. Numbers are well managed by JSON.

    As I write this, I realize that the function name json2sql might not be the best choice. In our function library, the first word helps categorize functions alphabetically based on what they handle. We have a slew of text.<something>, json.<something>… but here, it seems the focus is more on SQL than JSON. So I should probably rename the function sql.fromJson… I’ll have to think this over a bit more.

    [/vc_column_text][vc_column_text]This mishap led me to reconsider the signature I had chosen, with a single JSON parameter.

    Although I could have continued in this direction, I realized that including fieldSeparator and rowSeparator parameters in the JSON wouldn’t highlight the difference from ExecuteSQL or the way arguments are passed. I decided to revise this approach and move to the following signature:

    json2sql ( _jsonQuery ; _fieldSeparator ; _rowSeparator )

    which resembles the signature of the native function more closely:

    ExecuteSQL ( sqlQuery ; fieldSeparator ; rowSeparator { ; arguments... } )

    and it lightens the documentation that the user (developer) will need to read to use the function.

    This, too, is part of the “mindset” I adopt when writing a custom function: I aim to respect the conventions of the FileMaker platform and to be as consistent as possible. I’m not giving up the underscores before the parameters, though; firstly, they remind the user that this is a custom function, and secondly, it’s a convention I find quite important in my code. But let’s not get into naming conventions…[/vc_column_text][vc_column_text]I then add to my function the part that handles the criteria (the WHERE clause):[/vc_column_text][vc_column_text]

    <the first part of the function here>
    & Case ( not IsEmpty ( JSONListKeys ( j ; "criteria" )) ; 
       " WHERE " &
       While ([
          i = 0 ;
          c = ValueCount ( JSONListKeys ( j ; "criteria" )) ;
          v = "" ;
          r = ""
       ];
          i < c ;
       [
          f = GetValue ( Substitute ( JSONGetElement ( j ; "criteria[" & i & "].column" ) ; "::" ; ¶ ) ; 2 ) ;
          o = JSONGetElement ( j ; "criteria[" & i & "].operator" ) ;
          o = Case ( IsEmpty ( o ) ; "=" ; o ) ; // default comparison operator is =
          lo = JSONGetElement ( j ; "criteria[" & i & "].logicalOperator" ) ; 
          lo = Case ( IsEmpty ( lo ) ; "AND" ; lo ) ; // default logical operator is AND
          value = JSONGetElement ( j ; "criteria[" & i & "].value" ) ; 
          type = JSONGetElementType (  j ; "criteria[" & i & "].value" ) ;
          // this ugly things converts the data to JSON then parses it as a string to handle decimal separators and single quotes.
          v = Case ( type = JSONNumber or type = JSONBoolean ; Substitute ( JSONSetElement ( "" ; "v" ; value ; JSONNumber ) ; [ "{\"v\":" ; "" ] ; [ "}" ; "" ] ) ; "'" & value & "'" ) ;
          r = r & Case ( i ; " " & lo & " " ) // the logical operator is omitted for the first criterion
              & Quote ( f ) & " " & Case ( o = "=" and ( IsEmpty ( value ) or value = "=" ) ; "IS NULL" ; o = "=" and value = "*" ; "IS NOT NULL" ;  o & " " &  v ) ;
          i = i+1 
       ] ;
          r
       )
    )

    [/vc_column_text][vc_column_text]A few comments:

    • This part is conditional on finding a criteria array in the JSON. I could have included the ” WHERE ” directly in the While result, but I find this approach more readable. It’s immediately clear that it’s the WHERE clause of the query.
    • For the comparison operator (o), if it’s empty, I default to “=”. Considering default values helps make the function easier to use.
    • For the logical operator, the default is AND.
    • As anticipated, handling * and = is very straightforward (see the definition of r).

    [/vc_column_text][vc_column_text]I’ll briefly cover the other clauses: GROUP BY, ORDER BY, OFFSET, and FETCH FIRST. They’re fairly straightforward in the function’s code.

    Just note that I intentionally excluded OFFSET by percentage, as it introduced ambiguity in the JSON parameter—should I send a number (5) or a text (“5%”)? Also, I’ll admit that I’ve never used the percentage offset, so I didn’t want to add unnecessary complexity, at least not in the first version.[/vc_column_text][vc_column_text]

    // GROUP BY
    & Case ( not IsEmpty ( JSONListKeys ( j ; "group" )) ; " GROUP BY " &
    
       While ([
          i = 0 ;
          c = ValueCount ( JSONListKeys ( j ; "group" )) ;
          f = "" ;
          r = ""
       ];
          i < c ;
       [
          f = GetValue ( Substitute ( JSONGetElement ( j ; "group[" & i & "].column" ) ; "::" ; ¶ ) ; 2 ) ;
          r = List ( r ; Quote ( f )) ;
          i = i+1 
       ] ;
          Substitute ( r ; ¶ ; ", " )
       )
    )
    
    // ORDER BY
    & Case ( not IsEmpty ( JSONListKeys ( j ; "sort" )) ; " ORDER BY " &
       While ([
          i = 0 ;
          c = ValueCount ( JSONListKeys ( j ; "sort" )) ;
          d = "" ;
          r = ""
       ];
          i < c ;
       [
          f = GetValue ( Substitute ( JSONGetElement ( j ; "sort[" & i & "].column" ) ; "::" ; ¶ ) ; 2 ) ;
          d = JSONGetElement ( j ; "sort[" & i & "].dir" ) ; 
          d = Case ( IsEmpty ( d ) ; "A" ; d ) ;
          r = List ( r ; Quote ( f ) & Case ( Left ( d ; 1 ) = "d" ; " DESC" ; " ASC" )) ;
          i = i+1 
       ] ;
          Substitute ( r ; ¶ ; ", " )
       )
    )
    
    // OFFSET and FETCH FIRST
    & Case ( JSONGetElement ( j ; "offset" ) ; " OFFSET " & JSONGetElement ( j ; "offset" ) & " ROWS" )
    & Case ( JSONGetElement ( j ; "limit" ) ; " FETCH FIRST " & JSONGetElement ( j ; "limit" ) & " ROWS ONLY" )

    [/vc_column_text][vc_column_text]

    SQL execution, and it’s done!

    And so, here I am with a function that creates a perfect SQL query from a JSON parameter. All that was left was to execute the SQL and return the result.

    Nothing could be simpler.

    A few tests. It works like a charm! The queries work perfectly—I get the correct results, with or without functions, with or without criteria…

    And then… I had an idea.

    And that’s when things started to go sideways…

    …but I’ll tell you all about it in part two.[/vc_column_text][vc_column_text]

    Conclusions of Part One

    • Get into a specific mindset. Here, I know I’m working on a generic function, so it must be capable of operating in any context and be easy for any developer to use. When I create a function for a client project, I prefix the function name with the project name, and at the end of the project, I review these functions to see if any should be made generic and added to our toolkit. But if some qualify, I NEVER do so without reviewing the code to ensure it’s consistent with our other functions, and that it accounts for cases we didn’t need in this specific project.
    • Respect the FileMaker platform whenever possible and write functions in a way that makes them naturally usable within that context.
    • Thinking about handling default values prevents forcing the user (the developer) to specify all parameters.
    • Plan, but not too much. I have an idea of what the function needs to do, and I defer some possibilities right away (like joins in this case), but on the other hand, I don’t close myself off to ideas that may come up along the way (such as handling the comparison operators = and * in this example). As you’ll see in the second part, having an idea midway through cost me a lot of time, but on the other hand, the result was worth the effort.
    • Work with data. Start with concrete examples and move towards abstraction. This approach is far more efficient than building an entire mental structure, only to confront it with reality later and realize it doesn’t work.
    • Think about data types, and keep in mind that when looping (While), multi-line texts are a data type in themselves.
    • Have conventions (like the While loop structure here, among others) and stick to them.

    [/vc_column_text][/vc_column][/vc_row]

  • Ma version FileMaker 21.1 à moi

    Ma version FileMaker 21.1 à moi

    [vc_row bg_color=””][vc_column][vc_column_text]Voici exactement deux ans, lors de la première conférence EngageU à Malmö, Matt Navarre organisait un panel de discussion et me faisait l’honneur de m’y inviter.

    En présence de Brad Freitag, CEO de Claris et de Robert Holsey, chef de produit FileMaker, je lançai l’idée que Claris devrait consacrer une petite partie de son énergie à reprendre des vieilles choses qui embêtent les développeurs et qui ne demanderaient pas de développements compliqués.

    Brad et Robert ont tout de suite réagi et compris, et j’ai pu, durant ces deux années, travailler en plus étroite collaboration avec eux, notamment avec Rick Kalman qui a organisé ce cadre de travail, et avec David McKee et d’autres. De mon côté, je me suis tourné vers la communauté des développeurs pour connaître leurs idées sur les priorités, et de l’autre, je rapportais cela aux équipes de Claris.

    Une grande partie de ce qu’apporte la version 21.1 est issue de ce processus, mais pas exclusivement.

    Il y a donc, dans cette version 21, des grandes nouvelles fonctionnalités, et ces “petits changements qui n’ont l’air de rien”, dont certains sont simplement un meilleur confort pour le développeur, et d’autres de vraies révolutions. On trouve aussi pas moins de 309 corrections !

    Alors commençons par ces petites améliorations, et nous finirons par les vraies nouveautés.

    Tout d’abord, ma préférée, qui va très au-delà de la petite évolution.

    Ignorer les options d’auto-entrée

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/2″][ish_image image=”101632″ size=”full” align=”center” show_caption=”yes”][/vc_column][vc_column width=”1/2″][ish_image image=”101630″ size=”full” align=”center” show_caption=”yes”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]Oui ! on peut enfin écrire dans la base de données sans déclencher les auto-entrées. Le seul moyen qui existait jusqu’ici était de passer par un import, mais c’était extrêmement compliqué et pas dynamique, sauf à passer par des techniques vraiment très complexes pour un développement courant.

    Attention cela dit, cette option, très puissante, met aussi à mal les techniques rudimentaires d’audit log. Aussi, si l’intégrité de vos données repose sur les auto-entrées, veuillez faire attention à retirer le privilège d’édition de scripts aux utilisateurs (en réalité, s’ils avaient ce privilège, ils pouvaient déjà altérer les données en utilisant un import)[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Thème par défaut

    Enfin ! Il est désormais possible de définir un thème par défaut pour un fichier (depuis Fichier/Gérer/Thèmes). Enfin donc la création d’un nouveau modèle ne fera pas réapparaître le thème Aqua Blue. Une étape importante  vers le Nirvana qui consisterait à ce que FileMaker ne soit plus jamais un produit moche.[/vc_column_text][vc_column_text]

    Mémorisation de la largeur des colonnes dans les interfaces pour développeurs.

    On cherche encore ce que vous allez pouvoir faire avec tout le temps gagné puisque vous n’aurez plus besoin de redimensionner les colonnes des listes de tables, de rubriques, de listes de valeurs, de fonctions personnalisées…[/vc_column_text][vc_column_text]

    Valeurs par défaut dans les pas de script.

    Oh ! que je suis content avec ça. Tout ces pas de script qui avaient des valeurs par défaut absurdes. Tous les pas de script qui ont comme option d’ouvrir une boîte de dialogue ou de demander une confirmation ont maintenant cette option à Non par défaut, à l’exception de Tronquer table, Supprimer Enregistrement, Supprimer rangée externe, Supprimer tous les enregistrements…

    En effet, quand on écrit un script, on veut automatiser au maximum. L’intervention de l’utilisateur doit être l’exception. Le fait que, par exemple, Valider enregistrement ait cette option -que personne n’utilise- à Non par défaut la rend immédiatement compatible serveur (pour les scripts exécutés sur serveur).

    Petit regret : j’aurais aimé que Mode recherche ait aussi l’option Pause à Non par défaut, mais il faut croire que ç’aurait été trop parfait.

    La meilleure nouvelle dans tous cela : Aller à l’enregistrement suivant/précédent a désormais l’option Sortir après dernier à Oui par défaut. Idem pour l’action correspondante pour les rangées externes. Finies les boucles infinies par étourderie ![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Passons maintenant aux grandes nouveautés de cette version. Il y en a !

    D’abord, signalons la compatibilité complète avec le dernier macOS : Sequoia.

    PSoSoS

    Sans doute la plus importante nouveauté : Exécuter Script sur Serveur est désormais compatible… serveur. Cela signifie que l’on peut déclencher des actions en parallèle sur serveur. Attention, à ce jeu-là, il vaut mieux bien choisir son hébergeur, et bonne nouvelle pour notre service d’hébergement fmcloud.fm, d’après les tests de Nick Lightbody, notre architecture permet 4 fois plus de sessions de script sur serveur que les services classiques.

    J’en profite pour vous signaler que vous pouvez demander la mise à jour de votre serveur fmcloud.fm dès maintenant. Au passage vous pourrez découvrir notre nouvelle console, avec plein de fonctionnalités très pratiques.

    Cette nouveauté signifie que notre fameux FMSDIFM, présenté il y a 13 ans, peut désormais, enfin, prendre sa retraite.[/vc_column_text][vc_column_text]

    Fin de la limite de bande passante pour OData et Data API

    Dans le cas où vous hébergez votre propre serveur ou faites appel à un service d’hébergement autre que celui de Claris (FileMaker Cloud), la limite de traffic est levée. Enfin ! Il n’y avait aucune logique à faire payer l’accès à vos propres données sur votre propre serveur ! De plus, cela introduisait une incertitude sur le coût réel de la plateforme. Ces limites sont supprimées, vous pouvez foncer sur OData ! (J’en profite pour signaler que je présenterai dans 10 jours une session sur OData à la conférence EngageU à Malmö. Dépêchez-vous de vous inscrire ![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    AI : Cohere et la recherche sémantique sur les images

    La grande révolution introduite par FileMaker 21 reste l’intégration de l’intelligence artificielle.

    La version 21.1 améliore encore ces possibilités en intégrant Cohere comme alternative à Open AI.

    Également, la recherche sémantique peut maintenant s’appliquer aux images ! Ça permet des choses vraiment très intéressantes ![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Améliorations d’Open Quickly

    Je suis un immense fan de cette fonctionnalité, accessible par le raccourcis clavier cmd-K (macOS) / ctrl-K (Windows). Elle permet au développeur de naviguer dans son application bien plus facilement qu’avant, et de concevoir des interfaces très efficaces pour l’utilisateur.

    Mais il est vrai que la version 21.0 posait quelques problèmes de “sécurité” : on exposait trop de choses à l’utilisateur final.

    Désormais, ce qui est affiché est logique et cohérent avec les cases à cocher correspondant à la visibilité des modèles et des scripts, sauf quand on est en Accès intégral et donc on a accès à tout.
    De plus, un nouveau privilège permet de désactiver complètement l’accès à Open Quickly.

    D’autre part, on peut désormais limiter le résultat des recherches au fichier actif.

    Enfin et surtout, on peut désormais activer une rubrique, une table ou une occurrence de table directement depuis Open Quickly ! Dans ce cas la fenêtre Gérer la base de données s’ouvre avec le bon élément directement sélectionné !
    Étonnamment, les listes de valeurs et les fonctions personnalisées ne sont pas (encore) concernées.[/vc_column_text][ish_image image=”101654″ size=”full” align=”center”][vc_column_text]Deux petits regrets (mais patience…) : l’ordre de tri des résultats n’est toujours pas satisfaisant. Il me semble que les éléments du fichier actif devraient arriver avant les autres.
    Et puis, il me semble qu’un pas de script permettant d’ouvrir Open Quickly permettrait vraiment de proposer des interfaces extraordinaires. Un bouton dans l’interface pour tout faire. Mais il faut bien pouvoir continuer de rêver à quelque chose…[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Calculs de modèle : les rubriques sont référencées

    Désormais, si vous référencez une rubrique avec son nom complet dans un calcul de modèle (table::rubrique), alors le calcul est mis à jour si le nom de la rubrique change.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Pas de script : Set Revert Transaction on Error (On/Off)

    Permet de modifier le comportement des transactions et de les empêcher de se terminer dès qu’elles rencontrent une erreur.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Option Restreindre sans les index

    Dans le cas où vous travaillez avec une table comportant plusieurs centaines de milliers ou millions d’enregistrements et que vous avez déjà effectué une pré-sélection (recherche), le pas de script Restreindre l’ensemble trouvé permet désormais de ne pas passer par l’index de toute la table, ce qui est plus efficace.

    Honnêtement, les cas sont rares où c’est utile, et on pouvait déjà écrire soi-même une boucle pour tester chaque enregistrement, mais c’est toujours bon à prendre.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Sécurité : limite de références aux fichiers hébergés sur le même serveur

    Une nouvelle case à cocher fait sont apparition sur le dernier volet du dialogue de sécurité, qui permet de limiter aux fichiers sur le même serveur le droit d’établir des références au fichier actif.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    FileMaker Server

    Plusieurs nouveautés importantes pour FileMaker Server.

    OData

    On a déjà parlé de la suppression de la limite de trafic pour OData et Data API, mais OData gagne aussi en fonctionnalités, notamment avec la possibilité d’utiliser des alias dans les requêtes.

    Selon Claris, la conformité à OData 4.01 est achevée, ce qui est presque vrai ;). Cela ouvre la porte à ce que l’on voie apparaître un pas de script Exécuter OData dans une prochaine version, comme on l’avait vu pour Data API.

    Web Direct : déclencheurs sur frappe clavier

    Les déclencheurs surFrappeClavierObjet et surFrappeClavierModèle sont désormais pris en charge, mais seulement pour les touches Entrée, Retour et Escape. J’aurais pour ma part aimé que les flèches (droite, gauche, haut, bas) en fasse aussi partie, mais ça n’est pas le cas.

    Console d’administration

    De nombreuses améliorations sont apportées à la console, notamment la gestion des sous-dossiers de bases de données et l’affichage de la version de Java installée.

    Une nouvelle option vraiment intéressante permet, lors d’un redémarrage, de ne pas rouvrir toutes les bases de données mais seulement celles qui était ouvertes avant le redémarrage.

    HTTPS Tunneling

    Les version macOS et Windows se mettent à la page et intègre désormais cette fonctionnalité. On peut se connecter avec FileMaker Pro via https au lieu du port 5003. Je rappelle que notre service d’hébergement fmcloud.fm est le seul à permettre le double standard : vous pouvez avoir certains clients qui se connectent en https et d’autres avec le port 5003.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Claris Studio et Claris Connect

    Profitant de la sortie de FileMaker 21.1, on rappelle la mise à jour récente du connecteur Claris Studio de Claris Connect, avec un nouveau déclencheur (Création d’enregistrements multiples) et de nouvelles actions.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Si vous avez aimé…

    Si vous avez aimé cet article, merci de visiter le site de Claris en cliquant sur ce bouton. Claris aime que vous cliquiez sur ce bouton et c’est bon pour votre Karma (et pour le mien). Merci ![/vc_column_text][ish_button el_text=”Site de Claris” url=”url:https%3A%2F%2Fcontent.claris.com%2Fcpl-q1fy25-1more|target:_blank” size=”medium” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Et pour tester…

    Bien sûr, si vous déployez un serveur d’essai sur fmcloud.fm, il est immédiatement déployé en 21.1, et vous recevez un lien de téléchargement de la nouvelle version.[/vc_column_text][ish_button el_text=”Essayer” url=”url:https%3A%2F%2Fwww.fmcloud.fm%2Fchatbot%3Futm_source%3D1mt_blog|target:_blank” size=”medium” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row]

  • My Own Private FileMaker 21.1

    My Own Private FileMaker 21.1

    [vc_row bg_color=””][vc_column][vc_column_text]Exactly two years ago, at the first EngageU conference in Malmö, Matt Navarre organized a panel discussion and was kind enough to invite me to participate.

    In the presence of Brad Freitag, CEO of Claris, and Robert Holsey, FileMaker Product Manager, I suggested that Claris could devote a small portion of its resources to revisiting some longstanding issues that frustrate developers and that wouldn’t require complex development work.

    Brad and Robert immediately responded and understood, and over the past two years, I’ve had the chance to work more closely with them, especially with Rick Kalman, who organized this framework, as well as with David McKee and others. On my end, I reached out to the developer community to gather their ideas on priorities, and on the other, I shared this feedback with the Claris teams.

    Much of what’s new in version 21.1 stems from this process, though not exclusively.

    So, in this version 21, there are major new features, as well as these “little changes that seem insignificant”—some are simply about improving developer comfort, while others are true game-changers. And there are also no fewer than 309 fixes!

    Let’s start with these small improvements, and we’ll end with the real new features.

    First, my favorite, which goes far beyond a minor enhancement:

    Ignore Auto-Entry Options

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/2″][ish_image image=”101632″ size=”full” align=”center” show_caption=”yes”][/vc_column][vc_column width=”1/2″][ish_image image=”101630″ size=”full” align=”center” show_caption=”yes”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]Yes! We can finally write to the database without triggering auto-entries. Until now, the only way to achieve this was through an import, but that was extremely complicated and not dynamic, unless you resorted to very complex techniques for standard development.

    However, keep in mind that while this option is very powerful, it can also compromise basic audit log techniques. So, if the integrity of your data relies on auto-entries, be careful to remove script editing privileges from users (though, realistically, if they had this privilege, they could already alter the data using an import).[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Default Theme

    Finally! It’s now possible to set a default theme for a file (via File > Manage > Themes). This means creating a new layout will no longer bring back the Aqua Blue theme. This is an important step toward the ultimate goal: for FileMaker to no longer be an unattractive product.[/vc_column_text][vc_column_text]

    Column Width Retention in Developer Interfaces

    We’re still wondering what you’ll do with all the time you’ll save, now that you won’t have to keep resizing columns in tables, fields, value lists, custom functions, and more…[/vc_column_text][vc_column_text]

    Default Values in Script Steps

    Oh, I’m thrilled about this! All those script steps with absurd default values are finally getting some logic. Now, any script steps with options to open a dialog or prompt for confirmation have these options set to No by default—except for critical actions like Truncate Table, Delete Record, Delete Portal Row, and Delete All Records.

    When writing a script, the goal is usually maximum automation, with user intervention as the exception. For example, setting Commit Record to No by default—an option that hardly anyone uses—makes it immediately server-compatible (for scripts run on the server).

    One minor wish: I would have loved it if Enter Find Mode also had Pause set to No by default, but I guess that would’ve been too perfect.

    The best news of all: Go to Next/Previous Record now has Exit After Last set to Yes by default. The same applies to the corresponding action for portal rows. Say goodbye to those endless loops due to oversight![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Now, let’s move on to the major new features in this version. And there are plenty!

    First, let’s highlight full compatibility with the latest macOS: Sequoia.

    PSoSoS

    Perhaps the most significant new feature: Perform Script on Server is now… server-compatible. This means you can trigger parallel actions on the server. When working with this feature, choosing the right host is crucial—and here’s some great news for our hosting service, fmcloud.fm. According to tests by Nick Lightbody, our architecture supports four times as many server script sessions as traditional services.

    I’ll also take this opportunity to let you know that you can request the update for your fmcloud.fm server right now. While you’re at it, you’ll get to explore our new console, packed with very handy features.

    This update marks the well-deserved retirement of our famous FMSDIFM, which we introduced 13 years ago.[/vc_column_text][vc_column_text]

    End of Bandwidth Limit for OData and Data API

    If you’re hosting your own server or using a third-party hosting service instead of Claris’s own FileMaker Cloud, the traffic limit has been lifted. Finally! It made no sense to charge for access to your own data on your own server. Plus, it introduced uncertainty around the actual cost of the platform. With these limits removed, you can go all-in on OData!

    (On that note, I’ll be presenting a session on OData in just 10 days at the EngageU conference in Malmö. Hurry and register!)[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    AI: Cohere and Semantic Image Search

    The biggest breakthrough introduced by FileMaker 21 is undoubtedly the integration of artificial intelligence.

    Version 21.1 takes these capabilities even further by adding Cohere as an alternative to OpenAI.

    Additionally, semantic search can now be applied to images! This unlocks some truly exciting possibilities![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Open Quickly improvements

    I’m a huge fan of this feature, accessible via the keyboard shortcut cmd-K (macOS) / ctrl-K (Windows). It allows developers to navigate their applications much more easily than before and to design highly efficient user interfaces.

    However, it’s true that version 21.0 had some “security” issues: it exposed too much to the end user.

    Now, what’s displayed is logical and consistent with the visibility checkboxes for layouts and scripts, except when in Full Access mode, where everything remains accessible. Additionally, a new privilege allows you to completely disable access to Open Quickly.

    Additionally, you can now limit search results to the active file.

    Best of all, you can now activate a field, table, or table occurrence directly from Open Quickly! In this case, the Manage Database window opens with the selected item already highlighted.

    Surprisingly, value lists and custom functions aren’t (yet) included.[/vc_column_text][ish_image image=”101654″ size=”full” align=”center”][vc_column_text]

    Two small regrets (but let’s be patient…): the sorting order of results is still not ideal. I think items from the active file should appear before others.

    And it seems that a script step to open Open Quickly would allow for truly extraordinary interfaces. A single button in the UI to do it all. But we need to keep dreaming about something, right?

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Layout Calculations: Fields Are Referenced

    Now, if you reference a field by its full name in a layout calculation (table::field), the calculation will automatically update if the field name changes.

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Script step: Set Revert Transaction on Error (On/Off)

    It allows you to modify the behavior of transactions and prevent them from ending as soon as they encounter an error.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Constrain found set. Find without indexes option.

    When working with a table containing hundreds of thousands or millions of records, and you’ve already performed an initial selection (search), this script step now allows you to further narrow down the found set without relying on the entire table index, making it more efficient.

    Admittedly, the cases where this is useful are rare, and you could already write a loop to test each record individually, but it’s still a welcome addition.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Security: Limit References to Files Hosted on the Same Server

    A new checkbox has appeared on the fourth tab of the security dialog, allowing you to restrict references to the active file to only those files hosted on the same server.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    FileMaker Server

    OData

    We’ve already discussed the removal of the traffic limit for OData and Data API, but OData is also gaining new capabilities, including the option to use aliases in queries.

    According to Claris, compliance with OData 4.01 is complete—almost! 😉 This could pave the way for a Perform OData script step in a future release, similar to what we saw with Data API.

    WebDirect: Keyboard Triggers

    The OnObjectKeystroke and OnLayoutKeystroke triggers are now supported in WebDirect but only for the Enter, Return, and Escape keys. Personally, I would have liked to see arrow keys (right, left, up, down) included as well, but they’re not.

    Admin Console

    Many improvements have been made to the console, including database subfolder management and displaying the installed Java version.

    A very useful new option now allows you, during a restart, to reopen only the databases that were open before the restart instead of reopening all databases.

    HTTPS Tunneling

    The macOS and Windows versions have been updated to include this feature, allowing connections with FileMaker Pro via HTTPS instead of port 5003. I’d like to remind you that our hosting service, fmcloud.fm, is the only one that offers a dual standard: you can have some clients connecting via HTTPS and others via port 5003.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    Claris Studio et Claris Connect

    With the release of FileMaker 21.1, it’s worth noting the recent update to the Claris Studio connector in Claris Connect. This update introduces a new trigger, Create Multiple Records, along with new actions, expanding the automation and integration capabilities within the Claris platform.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    If You Enjoyed This…

    If you enjoyed this article, please visit the Claris website by clicking this button. Claris loves it when you click this button, and it’s great for your karma (and mine). Thank you!

    [/vc_column_text][ish_button el_text=”Site de Claris” url=”url:https%3A%2F%2Fcontent.claris.com%2Fcpl-q1fy25-1more|target:_blank” size=”medium” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    And for Testing…

    Of course, if you set up a test server on fmcloud.fm, it’s immediately deployed in version 21.1, and you’ll receive a download link for the latest version.[/vc_column_text][ish_button el_text=”Essayer” url=”url:https%3A%2F%2Fwww.fmcloud.fm%2Fchatbot%3Futm_source%3D1mt_blog|target:_blank” size=”medium” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row]

  • Tout ce qu’il faut savoir sur FileMaker 2024

    Tout ce qu’il faut savoir sur FileMaker 2024

    [vc_row bg_color=””][vc_column][vc_column_text]FileMaker 2024 est annoncé à l’instant par Claris!

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_button el_text=”Voir sur Claris.com” url=”url:https%3A%2F%2Fcontent.claris.com%2Fclaris-filemaker2024-announce-1morething-lp|target:_blank” size=”medium” align=”center” color=”color7″ text_color=”color4″ border=”no”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]Comme d’habitude à l’occasion d’une sortie, vous trouverez sur notre blog tout ce qu’il faut savoir pour les geeks et les moins geeks.

    Prêt(e) ? C’est parti ![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Intégration de l’Intelligence Artificielle (AI) et des modèles larges de langage (LLM)[/ish_headline][vc_column_text]C’est bien sûr LA fonctionnalité la plus visible de cette version 2024, mais aussi la plus complexe à expliquer et à maîtriser. Nous lui dédierons un article séparé. Sachez toutefois qu’il est désormais possible d’interagir avec virtuellement tous les modèles larges de langage tels que Chat GPT (Open AI), Gemini (Google) ou Llama (Meta/Facebook).

    On peut employer ces modèles pour de la recherche sémantique sur ses propres données (on peut donc rechercher des données en formulant des requêtes dans un langage humain !) ou demander à l’outil graphique de représenter vos données.

    Mais cela ne s’arrête pas là. Avec un peu d’entraînement, on peut développer son propre générateur de code FileMaker pour générer des calculs compliqués ou des fonctions.

    De quoi passer beaucoup de temps pour en gagner un peu, certes, mais c’est beau :)[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Open Quickly, un nouveau mode d’interaction avec vos applications[/ish_headline][vc_column_text]Depuis quelques versions, le raccourcis Cmd-option-K (macOS)/Ctrl-alt-K (Windows) permettait de changer de modèle, et ce uniquement en mode modèle.

    Open Quickly ouvre des possibilités beaucoup plus importantes, mais présente aussi un risque dont les développeurs doivent être informés.

    Je vous recommande de mettre en pause la lecture de cet article après cela, de faire le tour de vos applications pour voir si vous n’êtes pas impacté, et de revenir lire la suite plus tard.

    De quoi s’agit-il ?

    1. la fonctionnalité est désormais si puissante qu’elle devait aussi être plus accessible. Le raccourcis est donc Cmd-K (macOS) et Ctrl-K (Windows). L’ouverture du panneau de gauche en mode modèle est donc relayé au deuxième niveau (Cmd-option-K / Ctrl-alt-K). Ceci est bien logique
    2. Open Quickly est désormais disponible dans les autres modes (utilisation, recherche, prévisualisation), et peut activer 3 types d’éléments :
      1. les modèles (ceux du fichier courant s’ils sont définis pour être visibles dans la liste des modèles ou ceux pour lesquels vous avez le droit de modification). Si on sélectionne un modèle, on va a ce modèle (en restant dans le même mode). Si on maintient la touche option (macOS)/alt (Windows) enfoncée, on voit que l’icône change et le modèle s’ouvre dans une nouvelle fenêtre)
      2. les scripts. Les scripts apparaissent s’ils sont définis pour être visibles dans la liste ou si vous êtes connecté avec un compte permettant la modification du script.
        Attention, c’est ici que se situe le “problème”. Si vous avez le droit de modifier les scripts, vous pouvez sélectionner un script pour le modifier ou, en maintenant option (macOS)/alt (Windows) enfoncée, exécuter le script. Si vous n’avez pas ce droit, le script est exécuté. Cette fonctionnalité est fantastique ! on peut vraiment créer des interfaces très efficaces, mais il est extrêmement important de ne pas exposer les scripts qui ne peuvent pas être exécutés par un utilisateur sans cliquer sur un bouton spécifique. Il faut donc passer en revue vos applications pour décocher la case visibilité pour les scripts qui ne doivent pas être accessibles.
      3. les fichiers (les fichiers récents et les favoris sont accessibles). Open Quickly est donc aussi un super lanceur.

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Les fonctions JSON évoluent[/ish_headline][vc_column_text]Une nouvelle fonction et une belle évolution rendent le travail avec JSON bien plus efficace.

    JSONMakeArray ( listOfValues ; separator ; type )

    permet de convertir une liste séparée par des retours chariot (¶) en Array (tableau) JSON. La liste étant pour des raisons historiques l’élément structurel le plus répandu en FileMaker, c’est une possibilité qui faisait vraiment défaut et empêchait souvent d’améliorer/moderniser son code sans se lancer dans un refactoring long et coûteux.

    Nouveaux opérateurs [+] et [:]

    Les nouveaux opérateurs permettent d’écrire des Arrays (tableaux) JSON beaucoup plus facilement.

    [+] permet de passer à l’index suivant

    [:] permet de rester sur le même index.

    Ainsi la simple expression :

    JSONSetElement ( ""
       ; [ "contact[+].nameLast" ; "Doe" ; JSONstring ]
       ; [ "contact[:].nameFirst" ; "John" ; JSONstring ]
       ; [ "contact[+].nameLast" ; "Smith" ; JSONstring ]
       ; [ "contact[:].nameFirst" ; "Emma" ; JSONstring ]
    )

    permet d’obtenir le résultat :

    {
       "contact" :
       [
          {
             "nameFirst" : "John",
             "nameLast" : "Doe"
          },
          {
             "nameFirst" : "Emma",
             "nameLast" : "Smith"
          }
       ]
    }

    L’opérateur [:] permet aussi de récupérer le dernier élément d’un tableau avec la fonction JSONGetElement

    GetLiveTextAsJSON

    est une nouvelle fonction réservée au matériel Apple (tant sur FileMaker Pro que FileMaker Go ou FileMaker Server) qui permet, comme GetLiveText, de récupérer le texte contenu dans une image, mais cette fois-ci en JSON.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Exécuter FileMaker Data API en écriture ![/ish_headline][vc_column_text]Le pas de script Exécuter FileMaker Data API est désormais capable d’écrire dans la base de données, et donc précisément de créer un nouvel enregistrement, de modifier ou dupliquer des enregistrements, et bien sûr de les supprimer.

    Il est donc vraiment possible, depuis un script FileMaker, de faire (presque) toutes les opérations sur la base de données sans changer de contexte.

    Avantage ou inconvénient ? la Data API travaillant dans une autre session, les modifications faites par ce biais ne déclenchent pas de script (déclencheurs), ne sont pas prises en compte dans l’événement SurTransactionFenêtre… d’un autre côté cela permet d’écrire dans la base de données indépendamment de la transaction en cours.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Annulation d’une transaction dans un sous-script[/ish_headline][vc_column_text]À propos de transactions… une des faiblesses de l’implémentation des transactions de script est que toute la transaction devait avoir lieu dans le même script.

    Bien que cela ne change pas fondamentalement, le pas de script Annuler transaction peut désormais être dans un sous-script, ce qui atténue le problème.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Scripts serveur (PSoS), callback et notifications[/ish_headline][vc_column_text]Il s’agit ici d’améliorations, mais non des moindres :

    Quand on exécute un script sur serveur, on peut désormais appeler le script de callbak par nom. De plus, les notifications (Configurer Notification Locale) fonctionne désormais sur Pro (macOS et Windows). On se demandait bien pourquoi ça n’était pas le cas, mais voici cela réparé. Il est donc désormais aisé de lancer un script sur serveur et d’obtenir une notification sur l’écran de son mac/pc quand celui-ci a terminé.

    De plus, il est possible de déterminer si le script de call back doit reprendre un éventuel script en pause.

    Malheureusement, bien qu’on ait accès à la configuration des boutons et de presque tous les aspects d’une notification système, on ne peut contrôler l’icône ou l’image. a technique exposée ici par Laurent Spielmann, de 1-more-thing (2016), est donc toujours utile.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Autres améliorations de FileMaker Pro[/ish_headline][vc_column_text]En dehors de ces nouveautés, des dizaines de bugs ont été résolus.

    Également, des améliorations plus discrètes doivent être mentionnées

    • support des numéros de répétitions de variables dans les chemins de fichiers. On peut donc par exemple exporter des données vers un fichier dont le chemin est contenu dans $var[3]
    • ceci n’est pas une mince affaire : le moteur utilisé pour la conversion en/de XML/XSLT a été remplacé, on est passé de Xeres/Xalan à libxml2/libxslt. Ceci permet le support des fonctions EXSLT. Nul doute que l’on verra bientôt fleurir de belles applications dans le cadre de FileMaker.
    • Très important également, le Web Viewer évolue. Sur Windows, l’installeur met à jour WebView2 Runtime, ce qui évitera à certaines applications de ne pas tourner jusqu’à une installation manuelle. Plus important : les Web Viewers (macOS et Windows) supportent le WebRTC. On va donc pouvoir intégrer des applications telles que des visioconférences ou autres au sein de nos applications FileMaker.
    • Enfin (il y a d’autres petites choses mais il faut bien s’arrêter), notons que le format EPS n’est plus supporté en tant qu’image sur macOS. Claris suit ainsi Apple qui a arrêté le support d’EPS dans son système d’exploitation.

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Du côté de FileMaker Server 2024[/ish_headline][vc_column_text]FileMaker Server 2024 n’est pas en reste. Il y a là aussi de fort belles nouveautés.

    Tout d’abord, notons qu’il n’y a pas de changement de compatibilité entre Pro/Go et Server. Les versions 19.4.2 de FileMaker Pro et Go pourront toujours se connecter.

    Améliorations des performances

    Par la mise en cache de CSS (pour Web Direct) et, surtout, du graphique des liens, les nouvelles sessions serveur devraient s’ouvrir plus rapidement. On devrait donc observer des sessions PSoS plus rapides, avec moins de “overhead”.

    Le tunneling https est désormais également disponible sur les versions macOS et Windows du serveur. Il ne l’était jusqu’à présent que pour Linux. FileMaker peut désormais être installé n’importe où. Même plus besoin d’ouvrir le port 5003.

    Les certificats SSL Let’s Encrypt peuvent désormais facilement être installés grâce à un script système fourni (seulement sur Linux et macOS). Pour information cela fait quelques années que ces certificats sont installés gratuitement si vous optez pour un hébergement sur fmcloud.fm

    Des progrès ont été fait du côté des “Custom OAuth”. On peut maintenant configurer l’icone, et tout peut se faire par l’Admin API.

    L’admin API ajoute de nouvelles fonctionnalités comme l’upload et le download de fichiers de base de données (attention, les conteneurs ne suivent pas ! c’est logique mais présente un réel problème). On peut également modifier les informations de contact qui accompagnent les notifications par email.

    Les rôles d’administrateurs ont été améliorés. Chaque administrateur peut agir sur ses bases de données pendant que l’administrateur principal peut agir sur toutes. Plusieurs administrateurs peuvent partager les mêmes dossiers.

    Le log “Script Events” peut maintenant être activé côté serveur, permettant ainsi de séparer le log d’événements serveur du log des scripts.

    Toujours dans la rubrique log, le pas de script “Activer la journalisation des erreurs” (Set Error Logging) fonctionne désormais pour Web Direct et Data API.
    Également, les logs TopCallStats et Statistiques (stats.log) sont désormais activés par défaut. Attention, nous anticipons que sur certaines configurations extrêmement sollicitées avec un grand nombre d’utilisateurs, l’activation du TopCallStats pourra causer des problèmes. Si vous observez une chute drastique des performances après le passage à FileMaker Server 2024, pensez à désactiver ce log.

    Dans la console d’admin, le log viewer a un peu progressé

    L’ergonomie du panneau “Programmes” a été améliorée. Par exemple on peut double cliquer pour modifier les programmes ou afficher les colonnes de son choix dans la liste, filtrer la liste, dupliquer plusieurs programmes à la fois…

    Enfin ! il est possible via l’admin API et via la console d’administration de bloquer les nouvelles connexions. Vous pourrez donc enfin fermer les fichiers sans que de nouveaux utilisateurs se connectent ou se reconnectent pendant la fermeture.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Les versions Moyen-Orient et Europe Centrale disponibles sur Linux[/ish_headline][vc_column_text] C’est une première ! Non seulement les versions localisées éditées par Winsoft International pour le Moyen-Orient (qui permet de concevoir des interface pour les langues s’écrivant de droite à gauche comme l’Arabe, l’Hébreu ou le Persan) et pour l’Europe Centrale sont disponibles en même temps que la version classique, mais en plus le serveur est désormais disponible pour Linux.

    Vous pourrez donc générer des PDF sur le serveur ou proposer à vos utilisateurs des interfaces Web Direct réellement pensées pour ces langues.

    Bien entendu, ces versions sont disponibles immédiatement sur fmcloud.fm, l’hébergement de 1-more-thing. Vous devrez pour cela disposer de la licence appropriée, que nous pouvons vous fournir également.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Compatibilité[/ish_headline][vc_column_text]FileMaker Pro 2024 (ou 21.0) requiert

    • macOS Ventura 13 ou supérieur
    • Windows 10 ou 11

    et peut se connecter à FileMaker Server 19.4.2 et supérieur. (Attention, nous avouons avoir du mal à comprendre que l’a connexion à 19.4.2 soit encore tolérée car cela ne contribue pas à l’indispensable mise à jour des serveurs. Si vous devez impérativement rester en FileMaker Server 19, nous recommandons de manière extrêmement appuyée de passer sans délai à FileMaker Server 19.6.4. De même, si vous devez conserver une version 20 (on ne voit pas très bien pourquoi puisque la 21 propose la même compatibilité avec les versions clientes), veuillez mettre à jour votre serveur en 20.3.2.
    Chez fmcloud.fm, 100% de nos serveurs sont à jour.

    Pour FileMaker Server 2024

    • Ubuntu 20.04 LTS Server (AMD64)
    • Ubuntu 22.04 LTS Server (AMD64 ou ARM64)
    • macOS Ventura 13 ou supérieur
    • Windows Server 2019 ou 2022

    Les clients Pro/Go en 19.4.2 ou supérieur peuvent se connecter.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Où se procurer FileMaker ?[/ish_headline][vc_column_text]Si vous commencez avec la plateforme, nous recommandons de passer par l’essai gratuit notre service d’hébergement fmcloud.fm de démarrer.

    En moins de 10 minutes, vous aurez une copie d’essai de FileMaker Pro et un serveur installé dans le cloud.

    Une petite vidéo explicative ici.[/vc_column_text][/vc_column][/vc_row]

  • Everything about FileMaker 2024

    Everything about FileMaker 2024

    [vc_row bg_color=””][vc_column][vc_column_text]FileMaker 2024 has just been announced by Claris!

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_button el_text=”See on Claris.com” url=”url:https%3A%2F%2Fcontent.claris.com%2Fclaris-filemaker2024-announce-1morething-lp|target:_blank” size=”medium” align=”center” color=”color7″ text_color=”color4″ border=”no”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]As usual, when Claris announces a new version of FileMaker you’ll find everything you need to know on our blog, for geeks and non-geeks alike.

    Ready, set, go![/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Artificial Intelligence (AI) and Large Language Models (LLM)[/ish_headline][vc_column_text]This is of course THE most visible feature of this 2024 version, but also the most complex to explain and master. We’ll be dedicating a separate article to it. You should know, however, that it is now possible to interact with virtually all large language models such as Chat GPT (Open AI), Gemini (Google) or Llama (Meta/Facebook).

    You can use these models for semantic searches on your own data (so you can search for data by formulating queries in human language!), or ask the chart tool to graph your data.

    But it doesn’t stop there. With a little practice, you can develop your own FileMaker code generator to generate complicated calculations or functions.

    It may take a lot of time to save a little, but it’s beautiful :)[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Open Quickly, a new way of interacting with your applications[/ish_headline][vc_column_text]For several versions now, the shortcut Cmd-option-K (macOS)/Ctrl-alt-K (Windows) has been used to change models, but only in model mode.

    Open Quickly opens up much greater possibilities, but also presents a risk that developers should be aware of.

    I recommend that you pause reading this article afterwards, take a look at your applications to see if you’re not affected, and come back to read the rest later.

    What’s it all about?

    1. the functionality is now so powerful that it also needed to be more accessible. The shortcut is therefore Cmd-K (macOS) and Ctrl-K (Windows). Opening the left panel in template mode is therefore relayed to the second level (Cmd-option-K / Ctrl-alt-K). This is quite logical
    2. Open Quickly is now available in all other modes (use, search, preview), and can activate 3 types of elements:
      1. layouts (those in the current file, if defined to be visible in the layout list, or those for which you have editing rights). If you select a layout, you go to that layout (remaining in the same mode). If you hold down the option key (macOS)/alt (Windows), the icon changes and the layout opens in a new window.)
      2. Scripts. Scripts appear in the list if they are defined to be visible in the list, or if you are logged in with an account that allows script modification.This is where the “problem” lies. If you have the right to modify scripts, you can select a script to modify it or, by holding down option (macOS)/alt (Windows), execute the script. If you don’t have this right, the script is executed. This is a fantastic feature! You can really create very efficient interfaces, but it’s extremely important not to expose scripts that can’t be executed by a user without clicking on a specific button. So review your applications to uncheck the visibility box for scripts that should not be accessible.
    3. Files (recent files and favorites are accessible). Open Quickly is also a great launcher.

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]JSON functions gain in power[/ish_headline][vc_column_text]A new function and a new development make working with JSON much more efficient.

    JSONMakeArray ( listOfValues ; separator ; type )

    allows you to convert a list separated by carriage returns (¶) into a JSON Array. The list being, for historical reasons, the most widespread structural element in FileMaker, this is a possibility that was really lacking and often prevented you from improving/modernizing your code without embarking on lengthy and costly refactoring.

    New operators [+] et [:]

    The new operators make it much easier to write JSON arrays.

    [+] allows you to move to the next index

    [:] allows you to stay on the same index.

    So the simple expression:

    JSONSetElement ( “”

       ; [ "contact[+].nameLast" ; "Doe" ; JSONstring ]
       ; [ "contact[:].nameFirst" ; "John" ; JSONstring ]
       ; [ "contact[+].nameLast" ; "Smith" ; JSONstring ]
       ; [ "contact[:].nameFirst" ; "Emma" ; JSONstring ]
    )

    returns:

    {
       "contact" :
       [
          {
             "nameFirst" : "John",
             "nameLast" : "Doe"
          },
          {
             "nameFirst" : "Emma",
             "nameLast" : "Smith"
          }
       ]
    }

    The [:] operator can also be used to retrieve the last element of an array using the JSONGetElement function.

    GetLiveTextAsJSON

    is a new function reserved for Apple operating systems (whether FileMaker Pro, FileMaker Go or FileMaker Server) which, like GetLiveText, allows you to retrieve the text contained in an image, but this time in JSON.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Execute FileMaker Data API can now do Write operations[/ish_headline][vc_column_text]The Execute FileMaker Data API script step is now capable of writing to the database, and therefore precisely of creating a new record, modifying or duplicating records, and of course deleting them.

    It is now possible to perform (almost) any operation on the database from within a FileMaker script, without changing context.

    Advantage or disadvantage? since the Data API works in another session, modifications made in this way do not trigger any script (triggers), nor are they taken into account in the OnTransactionWindow event… on the other hand, this means you can write to the database independently of the current transaction.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Revert transaction in subscripts[/ish_headline][vc_column_text]About transactions… one of the weaknesses of implementing script transactions was that the entire transaction had to take place in the same script.

    Although this doesn’t fundamentally change, the Revert transaction script step can now be in a sub-script, which alleviates the problem.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Server side scripts (PSoS), callback and notifications[/ish_headline][vc_column_text]These are improvements, but not the least of them:

    When running a script on a server, you can now call the callbak script by name. What’s more, notifications (Configure Local Notification) now work on Pro (macOS and Windows). We wondered why this wasn’t the case, but here it is. It’s now easy to run a script on a server and get a notification on your Mac/PC screen when it’s finished.

    What’s more, it’s now possible to determine whether the callback script should resume a paused script.

    Unfortunately, although we have access to the configuration of buttons and almost every aspect of a system notification, we can’t control the icon or image. he technique outlined here by Laurent Spielmann, of 1-more-thing (2016), is therefore still useful.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Other improvements for FileMaker Pro[/ish_headline][vc_column_text]In addition to these new features, dozens of bugs have been resolved.

    More subtle improvements include

    • support for variable repetition numbers in file paths. So, for example, you can export data to a file whose path is contained in $var[3].
    • this is big: the engine used for conversion to/from XML/XSLT has been replaced, moving from Xeres/Xalan to libxml2/libxslt. This enables EXSLT functions to be supported. There’s no doubt that we’ll soon be seeing the emergence of some fine applications within the FileMaker framework.
    • The Web Viewer is evolving. On Windows, the installer updates WebView2 Runtime, which will prevent some applications from not running until a manual installation.
    • More importantly, Web Viewers (macOS and Windows) now support WebRTC. This means we’ll be able to integrate applications such as videoconferencing and others into our FileMaker applications.
    • Last note (there are a few other little things, but we’ve got to stop somewhere), the EPS format is no longer supported as an image on macOS. Claris thus follows Apple in discontinuing EPS support in its operating system.

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]How about FileMaker Server 2024?[/ish_headline][vc_column_text]FileMaker Server 2024 is not to be outdone. There are some very nice new features here too.

    First of all, there’s no change in compatibility between Pro/Go and Server. Versions 19.4.2 of FileMaker Pro and Go will still be able to connect.

    Performance enhancements

    By caching CSS (for Web Direct) and, above all, the link graph, new server sessions should open faster. This should result in faster PSoS sessions, with less overhead.

    https tunneling is now also available on macOS and Windows versions of the server. Until now, it was only available for Linux. FileMaker can now be installed anywhere. You don’t even need to open port 5003.

    Let’s Encrypt SSL certificates can now be easily installed using a supplied system script (Linux and macOS only). For your information, these certificates have been installed free of charge for some years now, if you choose to host your server on fmcloud.fm.

    Progress has been made on the “Custom OAuth” side. You can now configure the icon, and everything can be done via the Admin API.

    The Admin API adds new functionalities such as uploading and downloading database files (beware, containers don’t follow! this is logical but presents a real problem). You can also modify the contact information that accompanies email notifications.

    Administrator roles have been enhanced. Each administrator can act on his own databases, while the main administrator can act on all of them. Multiple administrators can share the same folders.

    The “Script Events” log can now be activated on the server side, thus separating the server event log from the script log.

    Also in the log section, the “Set Error Logging” script step now works for Web Direct and Data API.
    Also, TopCallStats and Statistics logs (stats.log) are now enabled by default. Please note that we anticipate that on some extremely busy configurations with large numbers of users, enabling TopCallStats may cause problems. If you notice a drastic drop in performance after upgrading to FileMaker Server 2024, consider disabling this log.

    In the admin console, the log viewer has improved too.

    The ergonomics of the “Programs” panel have been improved. For example, you can double-click to modify programs or display the columns of your choice in the list, filter the list, duplicate several programs at once…

    Finally! you can now block new connections via the admin API and the admin console. This means you can finally close files without new users connecting or reconnecting during the closing process.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Middle-East and Central Europe versions available on Linux[/ish_headline][vc_column_text]It’s a first! Not only are the localized versions published by Winsoft International

    for the Middle East (allowing you to design interfaces for right-to-left languages such as Arabic, Hebrew and Persian) and for Central Europe are available at the same time as the classic version, but the server is now also available for Linux.

    This means you can generate PDFs on the server, or offer your users Web Direct interfaces designed specifically for these languages.

    Of course, these versions are immediately available on fmcloud.fm, 1-more-thing’s hosting service. You’ll need the appropriate license, which we can also provide.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Compatibility[/ish_headline][vc_column_text]FileMaker Pro 2024 (or 21.0) requires

    • macOS Ventura 13 or higher
    • Windows 10 ou 11

    and can connect to FileMaker Server 19.4.2 and higher. (Please note that we find it hard to understand why connection to 19.4.2 is still tolerated, as it doesn’t contribute to the indispensable updating of the servers. If you absolutely must remain in FileMaker Server 19, we strongly recommend that you upgrade to FileMaker Server 19.6.4 without delay. Similarly, if you need to keep a version 20 (why? since 21 offers the same compatibility with client versions), please update your server to 20.3.2.
    At fmcloud.fm, 100% of our servers are up to date.

    FileMaker Server 2024

    • Ubuntu 20.04 LTS Server (AMD64)
    • Ubuntu 22.04 LTS Server (AMD64 or ARM64)
    • macOS Ventura 13 or higher
    • Windows Server 2019 or 2022

    Pro/Go Clients with 19.4.2 or greater can connect.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Where to start? Where to find FileMaker?[/ish_headline][vc_column_text]If you’re just starting out with the platform, we recommend going through the free trial our fmcloud.fm hosting service to get started.

    In less than 10 minutes, you’ll have a trial copy of FileMaker Pro and a server installed in the cloud.

    A short video explanation here.[/vc_column_text][/vc_column][/vc_row]

  • Video: Get Started With FileMaker in 10 minutes… for FREE

    Video: Get Started With FileMaker in 10 minutes… for FREE

    [vc_row bg_color=””][vc_column][vc_column_text]When it comes to database management and application development, the FileMaker platform has been a trusted choice for years. However, with so much information available, it can sometimes seem like a daunting task to get started. That’s where Fabrice Nordmann comes in to simplify the process for you.

    Who is Fabrice Nordmann?

    Fabrice Nordmann is a seasoned, certified FileMaker expert with a passion for making complex concepts easy to understand. With his help, you can confidently navigate the FileMaker platform and start creating your own applications.

    What’s in Store?

    This 10-minute long video guide is your key to unlocking the power of the FileMaker platform. Here’s what you can expect:

    1. Easy Access: The first step is often the most challenging, but Fabrice will guide you through it. He’ll show you how to download the FileMaker software hassle-free.

    2. Installation: Worried about the technicalities of installation? Fear not! Fabrice will walk you through the installation process, making it a breeze.

    3. Creating Your First App: The heart of the FileMaker platform lies in creating your own applications. Fabrice will demonstrate how to set up your very first app, secure it, and upload it to the cloud so it’s available from anywhere in the world. And the best part? You can do it all for free!

    4. Learning the Basics: You will see how multiple clients can collaborate in real time, and how FileMaker Pro is used to create contents that can be used directly from the browser using Web Direct.

    5. Troubleshooting: Stuck on a particular problem? Fabrice will address common issues and provide troubleshooting tips to keep you moving forward.

    Why Choose FileMaker?

    FileMaker is a powerful and versatile platform that allows you to create custom applications tailored to your specific needs. Whether you’re looking to streamline business processes, manage data efficiently, or build an app for personal use, FileMaker can do it all.

    The best part? Fabrice Nordmann’s guide makes it accessible to everyone, regardless of your technical background. You don’t need to be a coding wizard to create impressive applications with FileMaker.

    Conclusion

    Don’t let the abundance of information about the FileMaker platform intimidate you. Fabrice Nordmann’s video guide offers a straightforward, step-by-step approach to get you started. By the end of the video, you’ll have the knowledge and confidence to create your own applications in the cloud, all without spending a dime. The trial is entirely free.

    So, if you’re ready to dive into the world of FileMaker, let Fabrice Nordmann be your trusted guide. Watch his video, and you’ll be on your way to mastering this versatile platform in no time. Get ready to unlock your creativity and productivity with FileMaker today![/vc_column_text][vc_video link=”https://vimeo.com/1morething/filemaker-get-started” align=”center”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_list]

    Summary

    • Deploy a server in the cloud
    • Download and install FileMaker Pro
    • Create your first app
    • Secure your app for the cloud
    • Upload your app in the cloud. It’s now available from anywhere in the world.
    • Enable Web Direct to share your app with your team
    • Modify your app with FileMaker Pro
    • Edit records with FileMaker Pro and Web Direct

    Remember

    • Server admin credentials are used only to:
      • access the admin console
      • upload files from FileMaker Pro
      • access your backups using FTP
    • For all other requests for credential, the database account is used, not the server account.
    • The cloud hosting service used in this video is fmcloud.fm

    [/ish_list][ish_button el_text=”Start your journey here” url=”url:https%3A%2F%2Fwww.fmcloud.fm|title:Start%20You%20Journey” size=”big” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row]

  • Tutorial : Démarrez avec FileMaker en 10 minutes… gratuitement !

    Tutorial : Démarrez avec FileMaker en 10 minutes… gratuitement !

    [vc_row bg_color=””][vc_column][vc_column_text]En matière de gestion de bases de données et de développement d’applications, la plate-forme FileMaker est un choix de confiance depuis des années. Cependant, avec autant d’informations disponibles, il peut parfois sembler difficile de commencer. C’est là que Fabrice Nordmann intervient pour vous simplifier la tâche.

    Qui est Fabrice Nordmann ?

    Fabrice Nordmann est un expert FileMaker chevronné et certifié qui a pour passion de rendre les concepts complexes faciles à comprendre. Avec son aide, vous pourrez naviguer en toute confiance sur la plateforme FileMaker et commencer à créer vos propres applications.

    Qu’y a-t-il dans cette vidéo ?

    Ce guide vidéo de 10 minutes est la clé qui vous permettra de découvrir la puissance de la plate-forme FileMaker. Voici ce qui vous attend :

    1. Accès facile : La première étape est souvent la plus difficile, mais Fabrice vous guidera à travers elle. Il vous montrera comment télécharger le logiciel FileMaker sans difficulté.

    2. L’installation : Vous êtes préoccupé par les aspects techniques de l’installation ? N’ayez crainte ! Fabrice vous guidera à travers le processus d’installation, pour en faire un jeu d’enfant.

    3. Création de votre première application : Le cœur de la plateforme FileMaker réside dans la création de vos propres applications. Fabrice vous montrera comment mettre en place votre toute première application, la sécuriser, et la télécharger sur le cloud pour qu’elle soit disponible de n’importe où dans le monde. Et le meilleur ? Vous pouvez faire tout cela gratuitement !

    4. Apprendre les bases : Vous verrez comment plusieurs clients peuvent collaborer en temps réel et comment FileMaker Pro est utilisé pour créer des contenus qui peuvent être utilisés directement à partir du navigateur.[/vc_column_text][vc_video link=”https://vimeo.com/1morething/filemaker-get-started” align=”center”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_list]

    Sommaire

    • Déployez un serveur dans le cloud
    • Téléchargez et installez FileMaker Pro
    • Créez votre première application
    • Sécurisez votre application pour le cloud
    • Téléchargez votre application dans le nuage. Elle est désormais disponible partout dans le monde.
    • Activez Web Direct pour partagez l’application avec votre équipe
    • Modifiez votre application avec FileMaker Pro
    • Travaillez sur les données avec FileMaker Pro et Web Direct

    Mémo

    • Les login/mot de passe du serveur ne sont utilisés que pour :
      • accéder à la console d’administration
      • téléverser (uploader) des applications avec FileMaker Pro
      • accéder à vos sauvegardes en FTPs
    • Pour toutes les autres fois où vous devez vous authentifier, il s’agit de votre compte sur la base de données, sur le serveur.
    • Le service cloud utilisé dans cette vidéo est fmcloud.fm

    [/ish_list][ish_button el_text=”Commencez votre voyage” url=”url:https%3A%2F%2Fwww.fmcloud.fm|title:Commencez%20votre%voyage” size=”big” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row]

  • FileMaker 2023 20.2 – Layout Calculations – Video

    Claris has just announced a new release of FileMaker, 20.2.

    Among other new features and improvements, let’s take a closer look at layout calculations.

    Video by Fabrice Nordmann

    Updates:

    • I forgot to mention symbols in the video. Introduced very early (FileMaker Pro 2 or earlier), symbols like ## (page number), @@ (record number), “//” (current date)… were updated in FileMaker 15 (unsure). The notation {{RecordNumber}} allowed access to all Get function parameters. {{HostApplicationVersion}} for instance.
    • the new layout calculations being a subclass of the merge feature of text objects, it is possible to use them in labels of the old button/popover button objects. But there are important limitations to that, so you definitely won’t do it. These are:
      • the UI doesn’t allow access to the calculation dialog, so you have to type the formula precisely and without mistake
      • as opposed to simple text objects (new behaviour described in the video), buttons cannot be resized to a smaller size than their contents (in that case, the calculation formula), at least using the mouse (you can achieve this using the inspector)

    New to FileMaker? Watch our Quick Start video and get started in 10 minutes.

  • FileMaker 2023 – “Audit log”

    FileMaker 2023 – “Audit log”

    [vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]Comme nous l’avons vu dans cette revue détaillée des nouveautés de FileMaker 2023, une des deux fonctionnalités phares, avec l’exécution de script sur serveur avec call-back, est ce que Claris appelle “Audit Log”

    Il y a tellement de choses à savoir sur cette fonctionnalité que nous avons préféré lui consacrer un billet complet.[/vc_column_text][ish_headline tag_size=”h2″]Pas un audit log[/ish_headline][vc_column_text]Tout d’abord mettons-nous d’accord, même si le marketing de Claris n’a pas résisté à la tentation de l’appeler ainsi, cette fonctionnalité n’est pas un réel audit log, et ce pour plusieurs raison.

    • D’abord pour une raison assez simple : cette fonctionnalité ne logue rien du tout. Elle permet éventuellement à un développeur de bâtir son audit log dessus.
    • Ensuite un audit log, pour être digne de se nom, doit répondre à certains impératif d’inviolabilité (on ne doit pas pouvoir faire une modification sans qu’elle soit loguée, on ne doit pas pouvoir modifier une entrée dans le log…). Même si on verra que c’est ce que FileMaker pouvait proposer de mieux, la nouvelle fonctionnalité ne répond pas à ces critères.

    Est-ce à dire qu’il faut passer son chemin sans regarder ? Pas du tout ! La nouvelle fonctionnalité est enthousiasmante, mais comme disait Camus, “mal nommer les choses c’est s’exposer à la critique”  (ou un truc comme ça). Et s’exposer à la critique d’un auditeur externe à qui on aurait vendu un “audit log” qui n’en serait pas un… voilà bien une situation que je préférerais éviter.

    Donc non, l’audit log n’est pas un audit log. Soit. Comment l’appeler alors ?[/vc_column_text][ish_headline tag_size=”h2″]Transactions de fenêtre[/ish_headline][vc_column_text]C’est le nom “technique” de la fonctionnalité. C’est sous ce nom qu’on la retrouve dans FileMaker Pro, et ça me semble être déjà beaucoup plus proche de la réalité.

    Enfin, c’est ainsi qu’on la retrouve dans FileMaker Pro… en anglais (OnWindowTransaction), car le déclencheur a été étrangement traduit par SurOperationFenetre en français, mais à moins que l’on parle de finance ou de compatibilité, c’est bien de transaction qu’il s’agit ici. Je réalise en écrivant que les transactions de la version 19.6 sont également, partiellement traduites en “opérations”, mais pas le nom de la fonction Obtenir ( EtatTransactionOuvert ).

    Les transactions de fenêtres apparaissent sous la forme d’un déclencheur de script dans les options de fichier, et vont s’appliquer à toutes les transactions.

    Une fois activé, chaque transaction (ou presque) déclenchera le script.

    Qu’est-ce qu’une transaction ? La question se pose car quand on nomme mal les choses… et depuis 30 ans, il faut dire que nommer les choses bizarrement est une spécialité de FileMaker (essayez de parler de rubriques à des pros de la base de données, ou de modèles à des designers, et vous verrez ce que je veux dire). Donc une transaction n’est pas particulièrement ce que Claris a appelé transaction dans la version 19.6.
    Une transaction, c’est simplement le fait de créer, modifier, supprimer un ensemble d’enregistrements (y compris un seul enregistrement) et de valider. Ça existait déjà avant la 19.6, même si la 19.6 a permis d’écrire des transactions plus facilement, ou de rendre certaines actions “transactionnelles” alors que ça n’était pas possible préalablement.
    Notons que la modification d’une rubrique globale, qui n’est pas a proprement parler une modification de données, ne provoque pas de transaction de fenêtre, (sauf bien sûr si la modification d’une rubrique globale entraîne une modification d’une autre rubrique, standard elle, par le truchement d’une auto-entrée en résultat de calcul).

    Bref, vous avez compris ce qu’est une transaction de données. Lors d’une transaction on peut :

    • créer des enregistrements
    • modifier des enregistrements
    • supprimer des enregistrements

    Les transactions de fenêtre sont en FileMaker ce qui se rapproche le plus d’une transaction de données, ou plus exactement d’un événement qui a lieu sur transaction de données.

    Mais ce sont des transactions… de fenêtre. Encore faut il donc avoir une fenêtre, même virtuelle.

    Autrement dit, sont exclus de ces transactions les interactions directes avec la couche data :

    • Data API (sauf si elle exécute un script)
    • OData (sauf si elle exécute un script)
    • PHP/XML (sauf s’ils exécutent un script)
    • ODBC
    • Instruction de script Tronquer la table
    • Un fichier est défini comme une source de données externes d’un fichier d’interface dans lequel les transactions de fenêtres sont activées (déclencheur actif), mais les données sont modifiées depuis un autre fichier.

    Voilà pourquoi même si un système de log était fourni, cette fonctionnalité ne permettrait pas d’avoir un réel “audit log”.[/vc_column_text][ish_headline tag_size=”h2″]Description des transactions de fenêtre[/ish_headline][vc_column_text]Nous l’avons déjà évoqué, l’interface de configuration se trouve dans les options de fichier.

    Audit Log file options trigger

    On peut sélectionner le script qui sera activé quand on valide une transaction, et indiquer facultativement le nom hard-codé d’une rubrique. Comme pour les autres déclencheurs au niveau du fichier, seul un script du fichier en cours peut être sélectionné. Dans ce cas ci, c’est un peu dommage, mais on comprend bien la raison.

    Quand une transaction est validée, le script sera déclenché et recevra automatiquement un paramètre en JSON tel que :[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    {
       "nomDuFichier":
       {
           "nomDeLaTable":
           [
                 [ //(pour chaque enregistrement):
                      type de modification ("New", "Modified" ; "Deleted"),
                      ID de l'enregistrement,
                      "paramètre facultatif"
                 ];
                 [ 
                      type de modification ("New", "Modified" ; "Deleted"),
                      ID de l'enregistrement,
                      "paramètre facultatif"
                 ]
            ]
       }
    }

    [/vc_column_text][vc_column_text]Comme vous l’avez repéré du premier coup d’œil car vous êtes désormais des experts en JSON, les enregistrements modifiés sont les éléments d’un tableau (array), avec 3 informations dont il faut donc connaître l’ordre : le type de modification (New, Modified, Deleted), l’ID de l’enregistrement, et le paramètre facultatif, qui sera présent mais vide si vous ne l’avez pas défini.

    L’autre chose que vous avez immédiatement repérée est qu’il n’y a pas de trace de données ou de noms de rubriques modifiées.[/vc_column_text][ish_headline tag_size=”h3″]Le paramètre facultatif[/ish_headline][vc_column_text]Le contenu du paramètre facultatif provient de la fameuse rubrique que vous avez pu choisir dans les options du fichier.

    Si vous n’avez pas indiqué de nom de rubrique et qu’il existe une rubrique du nom de OnWindowTransaction (un truc que vous n’auriez pas inventé si on ne vous l’avait pas dit… un peu comme la chanson de la Sorcière du placard aux balais), cette rubrique sera prise en compte.

    Donc au moment de la validation de la transaction, pour chaque enregistrement créé, modifié, ou supprimé (dans ce dernier cas la rubrique est évaluée avant la suppression), la rubrique -qui peut bien sûr être calculée- est évaluée et son contenu transmis comme paramètre facultatif pour cet enregistrement.

    JSON

    Notons que si le contenu de la rubrique est un JSON, ce JSON n’est pas rendu en string (“stringifié”). Pour être très précis, afin de ne pas perdre trop de temps à valider chaque JSON, ce qui ralentirait fortement les transactions avec beaucoup d’enregistrements, FileMaker considère que si le contenu commence et finit par { et } ou [ et ], il s’agit d’un JSON valide.[/vc_column_text][ish_headline tag_size=”h3″]Transactions massives[/ish_headline][vc_column_text]Il existe neuf manières de modifier plusieurs enregistrements en une opération avec FileMaker.

    Certaines d’entre elles sont parfaitement gérées par les transactions de fenêtres, d’autres non.

    Eliminons d’abord celles qui ne sont pas gérées, mais gardons-les en tête si nous voulons vraiment parler d’audit log :

    • requêtes externes directement sur la couche données (Data API, OData, PHP/XML, ODBC). Dans le cas d’exécution de script (et donc de l’existence d’une fenêtre), les transactions de fenêtre auront lieu.
    • action de script Tronquer la table.
    • modification du schéma de données (on peut supprimer une table, créer une rubrique calculée ou modifier une formule de calcul, valider la modification, puis changer le type de rubrique pour en faire une rubrique standard, et les données ont été modifiées sans qu’il y ait de transaction de fenêtre.
    • ajoutons une variante de cette dernière : la création de fichier par conversion. Si par exemple vous glissez un fichier Excel sur l’icône de FileMaker, vous obtiendrez un fichier avec déjà une table et des données, avant même d’avoir pu configurer le moindre déclencheur ou le moindre script.

    Les méthodes gérées sont donc :

    Les méthodes non transactionnelles :

    Les méthodes transactionnelles :

    • Les transactions par lien, telles qu’elles existent depuis que FileMaker est relationnel (FileMaker 3, sorti en 1996) : on peut modifier l’enregistrement principal (celui affiché) ainsi que créer, modifier, supprimer des enregistrements liés -la suppression nécessitant une table externe.
    • Les transactions de FileMaker 19.6, qui sont la même chose si ce n’est que :
      • elles peuvent être faites en changeant de contexte (on n’a donc plus besoin de lien)
      • elles peuvent inclure les autres types de transactions massive (importation, suppression de l’ensemble trouvé, remplacer)

    Importance de l’utilisation des transactions de script “de la 19.6” pour les transactions massives

    Pour les méthodes transactionnelles, c’est assez évident : une transaction occasionnera une et une seule transaction de fenêtre (tous les enregistrements créés, modifiés et supprimés se retrouveront  donc dans le paramètre du script)

    Quant aux trois autres méthodes (import, supprimer tous, remplacer), il est très avantageux de les inclure également dans une transaction.

    En effet, contrairement à notre FM AuditLog Pro (qui sera bien évidemment mis à jour très prochainement pour tirer parti de cette nouvelle fonctionnalité) qui parvenait à réunir les différentes transactions réelles en une seule transaction logique, les transactions de fenêtres reflètent exactement le fonctionnement interne de FileMaker.

    Par exemple, quand on supprime tous les enregistrements, FileMaker les supprime 100 par 100. Quand on importe, cela dépend du format du fichier (par tranches de 25 pour le format csv, mais par tranches alternées de 25 et de 1000 pour le format mer (un csv avec les titres de colonnes), par tranches de 500 pour Remplacer contenu rubrique…
    Bref, c’est tout ce que j’avais découvert en développant FM AuditLog Pro, mais cette “popote interne” n’intéresse sûrement pas l’utilisateur et on aurait préféré qu’un import ou une suppression soit résumé en une transaction. Or ça n’est pas le cas, le script SurOperationFenetre sera déclenché autant de fois qu’il y a de transactions internes. Il est donc très important d’encapsuler ces opérations dans une transaction de script.

    Conseil : si l’utilisateur peut lui-même procéder à un import, à une suppression de l’ensemble trouvé, ou à un remplacement de rubrique, nous recommandons d’utiliser les menus personnalisés pour remplacer ces commandes, avec des scripts associés tels que :

    Ouvrir une opération
       Importer enregistrements
    Valider l'opération

    Reste le cas marginal où l’utilisateur est déjà dans le cas d’une transaction (opération) avec un script en pause. Si on veut éviter l’erreur 3 pour des transactions imbriquées (erreur qui ne pose pas de problème mais c’est moins joli et on aime bien que ce soit joli), alors on peut écrire :

    Si [ Obtenir ( EtatOperationOuvert )]
       Importer enregistrements
    Sinon
       Ouvrir une opération
          Importer enregistrements
       Valider l'opération
    Fin de si
    
    

    Data API, OData, XML

    Pour ce qui est de ces modes d’interaction avec FileMaker, il existe la possibilité de privilégier les scripts. Afin de garantir la validité d’un audit log (au sens strict), on pourra, dans les réglages de sécurité, s’assurer que ces modes d’interaction ne peuvent modifier des enregistrements que si un script est en cours d’exécution.

    not EstVide ( Obtenir ( NomScript ))

    Mais cela se fait malheureusement au prix d’une baisse des performances.

    On peut vraiment regretter que le pas de script Exécuter FileMaker Data API soit limité à la lecture. Il serait tellement plus simple de convertir les appels à l’API en scripts…[/vc_column_text][ish_headline tag_size=”h2″]Drag and drop (glisser/déposer) et Remplacer[/ish_headline][vc_column_text]Depuis toujours, deux événements se distinguent dans la manière de modifier des données : le drag and drop et Remplacer contenu de rubrique.

    En effet, ces deux événements ont la particularité de pouvoir opérer sur des enregistrements non ouverts préalablement, de modifier les enregistrements, et de les garder “fermés”, sans déclencher d’événement SurValidationEnregistrement donc.

    Dans le cas du glisser/déposer, cela va même encore plus loin puisque l’on peut carrément modifier un enregistrement alors qu’il est ouvert par un autre utilisateur !

    Et bien c’est une excellente nouvelle : les transactions de fenêtre permettent désormais de capter ces événements. Si l’enregistrement actif n’est pas ouvert quand on entame une action de remplacement ou que l’on glisse un contenu sur une rubrique, alors une transaction de fenêtre sera déclenchée après l’événement.

    En terme d’intégrité des données, c’est un gros progrès ![/vc_column_text][ish_headline tag_size=”h2″]Difficultés[/ish_headline][vc_column_text]Une des difficultés que l’on rencontrera en mettant en place un script pour logguer ses transactions, c’est d’inhiber le script après avoir enregistré la transaction.

    Souvenons-nous, toutes les transactions ayant lieu dans une fenêtre du fichier déclenchent le script.

    Parade : écrire en début de script une condition de sortie comme

    Si [ Obtenir ( NomModèle ) = <leModèleSurLequelJeLogueLesTransactions>
       Fin de Script
    Fin de Si
    Suite du script

    Un bug ennuyeux

    La version qui sort aujourd’hui comporte un bug très ennuyeux. Gageons qu’il sera vite réglé lors d’une prochaine mise à jour.

    Lors de l’exécution du script SurOperationFenetre, l’action de script Fermer Fenêtre est tout simplement ignorée. Elle ne retourne pas d’erreur mais est sans effet.

    C’est très embêtant car comme souvent, quand on ne veut pas perdre le contexte de l’utilisateur (onglets sélectionnés, position de défilement de la fenêtre et des tables externes…) un script classique serait de la forme :

    Nouvelle fenêtre
    Activer modèle [ <modèleOùJeLogueLesTransactions> ]
    Nouvel enregistrement
    Définir rubrique [ rubrique ; Obtenir ( ParamètreScript )]
    Fermer Fenêtre

    Or la dernière action ne sera pas prise en compte ! C’est embêtant.

    En attendant la correction, deux parades à cela :

    • dès le départ, transmettre le paramètre à un script exécuté sur serveur, mais cela présente deux inconvénients majeurs :
      • si l’on n’est pas sur serveur (c’est encore le cas dans de nombreuses situations, notamment pour des applications asynchrones sur iPhone ou iPad)
      • sur des grosses transactions, la taille limite du paramètre pourrait être atteinte (un million de caractères)
    • utiliser un déclencheur SurTemporisation. Le script prend donc la forme :
    Nouvelle fenêtre
    Activer modèle [ <modèleOùJeLogueLesTransactions> ]
    Nouvel enregistrement
    Définir rubrique [ rubrique ; Obtenir ( ParamètreScript )]
    Installer un script sur temporisation [ script: Fermer fenêtre; Intervalle : 0,00001 ]
    Fin de script

    Et bien sûr le script Fermer fenêtre… ferme la fenêtre ! (Bravo si vous aviez deviné ! 😉 )[/vc_column_text][ish_headline tag_size=”h2″]Un audit log… pour quoi faire ?[/ish_headline][vc_column_text]Si vous avez lu jusqu’ici, vous allez être récompensé(e), car au-delà des aspects techniques, la grande question est : “que faire de cette nouvelle fonctionnalité ?”

    Or vous allez le voir, le potentiel est énorme -“juste énorme !”, comme disent ceux qui sont nés après la sortie de FileMaker 7.

    Exemples d’utilisation :

    • Bien sûr, garder la trace des modifications. Cela tombe sous le sens mais il ne faut pas l’oublier
    • Mettre à jour des enregistrements liés, voir des “vues”. C’est un éternel challenge avec FileMaker -dépourvu de déclencheurs de tables (OnUpdate)- de mettre à jour des enregistrements liés. Par exemple si je mets à jour le montant d’un paiement je veux que la facture correspondante soit mise à jour, ainsi que la fiche client (pour connaître son solde). Dorénavant, je peux capter à coup sûr qu’un enregistrement de la table PAIEMENTS a été créé/modifié/supprimé et mettre à jour les enregistrements correspondants.
      On peut facilement envisager des tables de vues qui remplacent les vues liste et qui synthétisent l’information que l’utilisateur doit voir, sans calcul et sans lien, afin d’optimiser la vitesse de défilement ou de tri).
      Par exemple un enregistrement de la table CLIENTS, qui est liée à n factures, n commandes, n paiements… peut avoir son pendant dans la table CLIENTS_VUE, avec des rubriques standard (non calculées) qui permettent d’afficher des listes très rapides. Il est en effet relativement facile de développer une logique qui provoque le rafraichissement d’un tel enregistrement dès qu’un paiement, une commande ou une facture est modifié dans une transaction.
    • “Réplication”. avec un outil comme FM AuditLog Pro 3.0 en préparation, il sera possible non seulement de faire du Roll-back comme avec FM AuditLog Pro 2.0, mais on pourra ré-exécuter les transactions sur un autre serveur, par exemple dans un scénario ou des utilisateurs travaillent sur plusieurs continents, chacun sur son serveur, mais où les modifications doivent être reportées sur un serveur central.

    Voilà, j’espère que ces quelques pistes vous auront permis d’envisager le potentiel de cette nouvelle fonctionnalité et que vous avez apprécié cet article au point de le partager sur les réseaux.[/vc_column_text][/vc_column][/vc_row]

  • FileMaker 2023 – “Audit log”

    FileMaker 2023 – “Audit log”

    [vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]As we saw in this detailed review of what’s new in FileMaker 2023, one of the two flagship features, along with Perform Script on Server With Callback, is what Claris calls “Audit Log.”

    There is so much to know about this feature that we preferred to dedicate a full post to it.[/vc_column_text][ish_headline tag_size=”h2″]Not an audit log[/ish_headline][vc_column_text]First of all, let’s agree that even if Claris’ marketing didn’t resist the temptation to call it that, this feature is not a real audit log, and this for several reasons.

    • First of all for a simple reason: this feature does not log anything. It does allow a developer to build an audit log on top of it.
    • Then an audit log, to be worthy of its name, must meet certain requirements of inviolability (it must not be possible to make a modification without it being logged, it must not be possible to modify an entry in the log…). Even if we will see that this is the best FileMaker could offer, the new functionality does not meet these criteria.

    Does this mean that you should pass by without looking? Not at all! The new feature is very exciting, but as Camus said, “to name things wrongly is to expose oneself to criticism” (or something like that). And exposing yourself to criticism from an external auditor who was sold an “audit log” that wasn’t an audit log… that’s a situation I’d rather avoid.

    So no, the audit log is not an audit log. So be it. What should we call it then?[/vc_column_text][ish_headline tag_size=”h2″]Window transactions[/ish_headline][vc_column_text]This is the “technical” name of the feature. This is the name under which it is found in FileMaker Pro, and it seems to me to be much closer to reality.

    Window transactions show up as a script trigger in the file options, and will apply to all transactions.

    Once enabled, every transaction (or almost every transaction) will trigger the script.

    What is a transaction ? A transaction is not particularly what Claris called a transaction in version 19.6.
    A transaction is simply the act of creating, modifying, deleting a set of records (including a single record) and committing. It already existed before 19.6, even if 19.6 allowed to write transactions more easily, or to make some actions “transactional” when it was not possible before.
    Note that the modification of a global field, which is not strictly speaking a data modification, does not cause a window transaction, (except of course if the modification of a global field leads to a modification of another field, which is standard, by means of an calculated result auto-entry).

    In short, you have understood what a data transaction is. During a transaction you can :

    • create new records
    • modify records
    • delete records

    Window transactions are the closest thing FileMaker has to a data transaction, or more precisely to an event that takes place on a data transaction.

    But these are window transactions. So you still need a window, even a virtual one.

    In other words, direct interactions with the data layer are excluded from these transactions:

    • Data API (unless it executes a script)
    • OData (unless it runs a script)
    • PHP/XML (unless running a script)
    • ODBC
    • Truncate table script step
    • A file is defined as an external data source of an interface file in which window transactions are enabled (active trigger), but data is modified from another file.

    That’s why even if a log system was provided, this feature would not allow a real “audit log”.[/vc_column_text][ish_headline tag_size=”h2″]How window transactions work[/ish_headline][vc_column_text]As we have already mentioned, the configuration interface can be found in the file options (File Menu)

    Audit Log file options trigger

    On peut sélectionner le script qui sera activé quand on valide une transaction, et indiquer facultativement le nom hard-codé d’une rubrique. Comme pour les autres déclencheurs au niveau du fichier, seul un script du fichier en cours peut être sélectionné. Dans ce cas ci, c’est un peu dommage, mais on comprend bien la raison.

    Quand une transaction est validée, le script sera déclenché et recevra automatiquement un paramètre en JSON tel que :[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_column_text]

    {
       "fileName":
       {
           "tableName":
           [
                 [ //(for each record):
                      modification type ("New", "Modified" ; "Deleted"),
                      record ID,
                      "optional parameter"
                 ];
                 [ 
                      modification type ("New", "Modified" ; "Deleted"),
                      record ID,
                      "optional parameter"
                 ]
            ]
       }
    }

    [/vc_column_text][vc_column_text]As you spotted at first glance because you are now JSON experts, the modified records are elements of an array, with 3 pieces of information so you need to know the order: the type of modification (New, Modified, Deleted), the record ID, and the optional parameter, which will be present but empty if you didn’t set it.

    The other thing you immediately noticed is that there is no trace of modified data or field names.[/vc_column_text][ish_headline tag_size=”h3″]Optional parameter[/ish_headline][vc_column_text]The content of the optional parameter comes from the field that you can choose in the file options.

    If you did not specify a field name and there is a field named OnWindowTransaction, this field will be taken into account instead.

    So at the time of the transaction commit, for each record created, modified, or deleted (in this last case the field is evaluated before deletion), the field -which can of course be calculated- is evaluated and its content passed as an optional parameter for this record.

    JSON

    Note that if the content of the field is a JSON, it is not rendered as a string (“stringified”). To be very precise, in order not to waste too much time validating each JSON, which would greatly slow down transactions with many records, FileMaker considers that if the content of the field starts and ends with { and } or [ and ], it is a valid JSON.[/vc_column_text][ish_headline tag_size=”h3″]Mass transactions[/ish_headline][vc_column_text]There are nine ways to edit multiple records in one operation with FileMaker.

    Some of them are perfectly handled by the window transactions, others are not.

    Let’s eliminate the ones that are not handled first, but keep them in mind if we really want to talk about audit logging:

    • External requests directly on the data layer (Data API, OData, PHP/XML, ODBC). In the case of script execution (and therefore the existence of a window), window transactions will take place.
    • Truncate table script step.
    • Modification of the data schema (you can delete a table, create a calculated field or modify a calculation formula, validate the modification, then change the type of field to make it a standard field, and the data has been modified without a window transaction.
    • Let’s add a variant of this: file creation by conversion. If, for example, you drag an Excel file onto the FileMaker icon, you will obtain a file with a table and data, even before you have been able to configure any triggers or scripts.

    Handled methods are :

    Non-transactional methods :

    Transactional methods:

    • Transactions through relationships, as they have existed since FileMaker became relational (FileMaker 3, released in 1996): you can modify the main record (the one displayed) as well as create, modify and delete related records (deletion requires a portal object).
    • FileMaker 19.6 transactions, which are the same thing except that :
      • they can be done while changing context (no need for a relationship anymore)
      • they can include other types of mass transactions (import, delete all records, replace field contents)

    Importance of using “19.6” script transactions for bulk transactions

    For transactional methods, it is quite obvious: a transaction will cause one and only one window transaction (all created, modified and deleted records will be in the script parameter)

    As for the other three methods (import, delete all, replace), it is very advantageous to also include them in a transaction.

    Indeed, as opposed to our FM AuditLog Pro (which will obviously be updated very soon to take advantage of this new feature) which managed to combine the different real transactions into one logical transaction, the window transactions exactly reflect the internal workings of FileMaker.

    For example, when you delete all the records, FileMaker deletes them 100 by 100. When you import, it depends on the format of the file (in increments of 25 for the csv format, but in alternating increments of 25 and 1000 for the .mer format (a csv with the column headers), in increments of 500 for Replace field content…
    In short, that’s all I had discovered while developing FM AuditLog Pro, but this “internal popote” is surely not interesting for the user and we would have preferred that an import or a deletion be summarized in one transaction. But this is not the case, the OnWindowTransaction script will be triggered as many times as there are internal transactions. It is therefore very important to encapsulate these operations in a script transaction.

    Tip : if the user himself can perform an import, a deletion of the found set, or a field contents replacement, we recommend to use the custom menus to replace these commands, with associated scripts such as:

    Open transaction
       Import records
    Commit transaction

    There remains the marginal case where the user is already in the case of a transaction with a paused script. If we want to avoid error 3 for nested transactions (an error that is not a problem but it is less pretty and we like it to be pretty), then we can write :

    If [ Get ( TransactionOpenState )]
       Import records
    Else
       Open transaction
          Import records
       Commit transaction
    End if
    
    

    Data API, OData, XML

    As far as these modes of interaction with FileMaker are concerned, there is the possibility of giving preference to scripts. In order to guarantee the validity of an audit log (in the strict sense), it can be ensured in the security settings that these modes of interaction can only modify records if a script is running.

    not isEmtpy ( Get ( ScriptName ))

    Unfortunately, this comes at the cost of reduced performance.

    We can really regret that the script step Execute FileMaker Data API has read-only access. It would be so much easier to convert the API calls into scripts…[/vc_column_text][ish_headline tag_size=”h2″]Drag and drop and Replace Field Contents[/ish_headline][vc_column_text]Since the beginning, two events have been distinguishable in the way of modifying data: drag and drop and Replace Field Contents.

    Indeed, these two events have the particularity of being able to operate on records not previously opened, to modify the records, and to keep them “closed”, without triggering an OnRecordCommit event.

    Well, that’s great news: window transactions can now capture these events. If the active record is not open when you start a replace action or drag content onto a field, then a window transaction will be triggered after the event.

    In terms of data integrity, this is a big improvement![/vc_column_text][ish_headline tag_size=”h2″]Caveats[/ish_headline][vc_column_text]One of the difficulties encountered when setting up a script to log transactions is to disable the script after recording the transaction.

    Remember, all transactions taking place in a file window trigger the script.

    Workaround: write at the beginning of the script an exit condition like

    If [ Get ( LayoutName ) = <theLayoutOnWhichILogTransactions>
       Exit Script
    End If
    The rest of the script

    An annoying bug

    The version released today has a very annoying bug. We hope that it will be fixed in a future update.

    When running the onWindowTransaction script, the Close Window is simply ignored. It does not return an error but has no effect. – update: this is fixed in 20.1.2, released on Jun-7.[/vc_column_text][ish_headline tag_size=”h2″]An audit log… why?[/ish_headline][vc_column_text]If you’ve read this far, you’ll be rewarded, because beyond the technical aspects, the big question is: “what to do with this new feature?”

    As you will see, the potential is enormous .

    Examples of use:

    • Of course, keep track of the changes. This makes sense, but it should not be forgotten
    • Updating related records, or even “views”. It’s an eternal challenge with FileMaker -without table triggers (OnUpdate)- to update related records. For example, if I update the amount of a payment, I want the corresponding invoice to be updated, as well as the customer record (to know the balance). From now on, I can definitely detect that a record in the PAYMENTS table has been created/modified/deleted and update the corresponding records.
    • It is easy to imagine view tables that replace list views and that synthesize the information that the user needs to see, without calculation and without links, in order to optimize the scrolling or sorting speed.)
      For example, a record in the CUSTOMERS table, which is linked to n invoices, n orders, n payments… can have its counterpart in the CUSTOMERS_VIEW table, with standard (non-calculated) fields that allow for very fast lists. It is indeed relatively easy to develop a logic that causes such a record to be refreshed as soon as a payment, an order or an invoice is modified in a transaction.
    • With a tool like FM AuditLog Pro 3.0 in preparation, it will not only be possible to roll-back transactions as with FM AuditLog Pro 2.0, but it will also be possible to re-execute transactions on another server, for example in a scenario where users work on several continents, each on their own server, but where changes need to be rolled-back to a central server.

    So, I hope that these few hints have helped you see the potential of this new feature and that you enjoyed this article enough to share it on the social networks.[/vc_column_text][/vc_column][/vc_row]

  • Claris Update 2023

    Claris Update 2023

    Tout consultant FileMaker, et les bien des utilisateurs ont besoin d’une certaine visibilité pour maintenir leur confiance dans la plateforme FileMaker et celle appelée à lui succéder, la plateforme Claris.

    Il y a quelques mois, Claris avait annoncé cette nouvelle plateforme, dont le très médiatisé Claris Studio est la facette la plus visible, mais ces annonces laissaient presque autant de questions ouvertes.

    Il était temps de remettre un peu de clarté dans la stratégie, et c’est ce que Brad Freitag, Robet Holsey, Gianine Campbell et Peter Nelson ont fait fin janvier dans cette présentation en direct.

    Nous rappelons à cette occasion que notre plateforme fmcloud.fm est la seule à ce jour à prendre en charge l’hébergement de Claris Server.

    Bon visionnage !

     

  • FileMaker 19.5 est là !

    FileMaker 19.5 est là !

    Depuis quelque temps, le cycle des versions de FileMaker a changé, et les versions passent un peu inaperçues, notamment en raison de la numérotation figée à 19 et d’un rythme plus soutenu des sorties. FileMaker 19.5 n’échappe pas à la règle.

    La liste des nouvelles fonctionnalités est ici pour FileMaker Pro et ici pour FileMaker Server, mais nous sommes là pour décortiquer et insister sur celles qui nous paraissent les plus importantes.

    Côté FileMaker Pro/FileMaker Go, les nouveautés qui nous semblent particulièrement intéressantes pour le plus grand nombre sont :

    • lecture de QR Code dans les images dans les conteneurs (macOS et iOS uniquement, pas pour Windows donc). Il est donc possible de prendre en photo un QR Code, de stocker la photo dans un conteneur, et de le lire plus tard.
    • la fonction LiveText, toujours sur matériel Apple uniquement, permet d’extraire le texte d’une image, comme le fait désormais Safari par exemple. Malheureusement il n’est toujours pas possible nativement d’extraire le texte d’un PDF, ce qui serait pourtant simple à faire et autrement plus important.
    • Pro : quand on copie un objet exclus de l’ordre de tabulation, il reste exclus quand on le colle, ce qui revient à dire qu’on peut espérer que les ordres de tabulations seront plus maintenables désormais.
    • Important. C’est une correction qui va améliorer les performances mais qui pourrait aussi avoir des conséquences néfastes : les objets sur la droite du modèle (dans la partie invisible) ne sont plus évalués. (fichier démo à télécharger : 1MT_evaluationADroite_195.fmp12)
    • Petit changement bien pratique : on peut désormais changer le certificat de licence de FileMaker Pro sans devoir désinstaller/réinstaller. Pour la plupart des utilisateurs, ils ne sauront même pas de quoi on parle (et tant mieux pour eux), mais pour ceux qui étaient confrontés au problème, c’est un grand pas.
    • Au rayon des bugs corrigés, le problématique échec de la validation lors de l’import a été corrigé : “Lors de l’import, les importations avec validation des champs ne parvenaient pas à filtrer les importations d’enregistrements et ignoraient l’option de validation “valeur existante” et importaient tous les enregistrements.”. Une bonne nouvelle pour l’intégrité des données.
    • Enfin, ça n’est pas repris dans les notes de sortie, mais un changement très appréciable pour ceux qui travaillent avec de nombreux enregistrements est que le séparateur de milliers défini dans les préférences système est repris dans le formatage du nombre d’enregistrements. Malheureusement, la chasse (espacement entre les caractères) ne rend pas le séparateur espace très visible (les Américains utilisent la virgule). Une astuce consiste à taper deux espaces dans les préférences système.

    Record Counter

    Du côté FileMaker Server 19.5 maintenant

    il y a de grosses améliorations. Si vous pensez que vous n’utilisez que le client Pro et que donc ça n’a pas d’importance, vous vous trompez :). Désormais tout se passe sur le serveur. C’est d’ailleurs pour cela qu’il est si important de choisir le meilleur hébergeur du monde, c’est-à-dire… nous !

    • Calcul des rubriques statistiques côté serveur. Ça, ça va changer la vie des utilisateurs parce que les performances vont être grandement améliorées. Le client est toutefois toujours bloqué en attendant la réponse du serveur, mais cela va beaucoup plus vite. Cela va aussi changer la vie des hébergeurs car le serveur risque d’être beaucoup plus sollicité ! D’ailleurs… votre serveur actuel tiendra-t-il la charge ?
    • Backups en parallèle : les fichiers peuvent être sauvegardés simultanément, ce qui va réduire le temps de la sauvegarde, et aussi permettre d’avoir une cohérence entre des fichiers liés (sauvegardés en même temps).
    • Annulation de la sauvegarde. Quand on travaille sur des très gros fichiers, il était parfois problématique de ne pouvoir interrompre une sauvegarde. Une nouvelle commande est disponible dans l’interface en ligne de commande et via l’admin API
    • Web Direct améliore le cache des layouts (modèles), qui est maintenant côté serveur. On peut attendre une belle progression des performances quand de nombreux utilisateurs sont connectés
    • L’interface OData (Atom/Json) est désormais disponible sur macOS et Windows (elle n’était jusqu’ici disponible que sur serveur Linux).
    • Sur Linux, Ubuntu 20 est supporté ainsi qu’Ubuntu 18. Sur Ubuntu 20, c’est le serveur web Nginx qui remplace Apache. Bien sûr notre service d’hébergement fmcloud.fm supporte déjà les deux versions. Par défaut cependant, c’est Ubuntu 18 qui sera installé pendant encore plusieurs mois, le temps de voir ce que donne Nginx avec un peu d’expérience.
    • Correction d’un problème important qui faisait que le serveur ralentissait quand une solution utilisait beaucoup de conteneurs externes.
    • Un autre problème a été résolu qui provoquait des ralentissements progressifs quand on utilisait des fenêtre cartes (card windows) en Web Direct.
    • Et une liste très longue de bugs corrigés, notamment sur Web Direct.

    Comme toutes les versions “techniques”, il n’y a donc pas vraiment de “wow effect”, mais il n’en reste pas moins que l’amélioration des performances et la correction de quelques fuites de mémoires qui pénalisaient lourdement les grosses applications sont les bienvenues.

    Si vous êtes à jour de vos licences, vous pouvez dores et déjà mettre à jour en téléchargeant la nouvelle version.

    Notre service fmcloud.fm mettra comme d’habitude à jour les serveurs dans environ un mois, après que nous avons suffisamment de retour d’expérience en conditions réelles. Si vous souhaitez allez plus vite, n’hésitez pas à nous contacter.