Category: Technique

  • 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]

  • 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]

  • 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]

  • 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 – “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

    FileMaker 2023

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

    FileMaker 2023 est sorti ! Présentation et exploration !

    Claris vient d’annoncer la disponibilité immédiate de la nouvelle version de FileMaker: FileMaker 2023.

    Voilà bien longtemps que nous n’avions pas publié un long article sur une nouvelle version de FileMaker. Il faut dire que le changement de système de numérotation survenu en version 19 n’incitait pas à l’excitation. Même si certaines versions mineures comportaient des nouveautés importantes, il était difficile d’attirer l’attention dessus.

    Or avec FileMaker 2023, on peut dire que “Claris sonne le clairon”. Non seulement le nom commercial du produit change : FileMaker 2023 et non FileMaker 20 (qui est pourtant bien son numéro de version), mais on a le droit à une toute nouvelle icône.

    FileMaker 2023 icon

    On peut toujours discuter de l’esthétique ou plaisanter en disant que c’est le Pac-man du logo de Claris qui a avalé un dossier de FileMaker, ça change quand même agréablement.
    Et tant qu’à parler des logos, notons au passage que Claris Connect reçoit aussi le sien.

    Icone Claris Connect

    Revoilà Pac-man, mais avec un nœud papillon.

    Ça donne envie de jouer au Trivial Pursuit, n’est-ce pas ? Et bien cela tombe très bien puisque cet article répondra, je l’espère, à beaucoup de questions.[/vc_column_text][/vc_column][/vc_row][vc_row tag_size=”h2″ align=”” icon=”” icon_align=”left” tag=”h” bottom_margin=”” bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Une version pour les geeks[/ish_headline][vc_column_text]Autant le dire tout de suite, les aspects les plus spectaculaires de cette version ont déjà été traités ci-dessus (le nom et l’icône), car FileMaker 2023 ne fera pas sauter en l’air les utilisateurs finaux avec des fonctionnalités “tape-à-l’œil”.
    En revanche, elle va les ravir parce que leurs développeurs ou utilisateurs avancés vont  pouvoir répondre de manière beaucoup plus efficace à certains problèmes qu’ils devaient jusqu’ici contourner difficilement.

    En réalité, j’ai moi-même longtemps cherché ce qui faisait la cohérence de cette version. À première vue, un patchwork d’évolutions disparates, mais en y regardant mieux, il y a vraiment un objectif de cohérence, de stabilité et d’extensibilité (on utilise souvent le terme anglais de “scalability”)

    Si je devais tirer deux “messages” pour synthétiser les nouveautés de cette version, ce serait :

    1. La plateforme FileMaker est vivante. Certains craignaient que Claris Studio ne mobilise trop de ressources chez Claris aux dépends de FileMaker et des composantes correspondantes de la plateforme Claris. Cette version est une réponse nette à ces inquiétudes, nous verrons pourquoi.
    2. Claris n’a pas renoncé à faire de FileMaker une plateforme de son temps, capable de servir de plus grands nombres d’utilisateurs traitant plus de données, et plus intégrée. Pour cela elle s’appuie sur la communauté de développeurs en leur fournissant des outils, certes un peu “geek”, mais diablement intéressants.

    [/vc_column_text][/vc_column][/vc_row][vc_row tag_size=”h2″ align=”” icon=”” icon_align=”left” tag=”h” bottom_margin=”” bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Note sur la compatibilité[/ish_headline][vc_column_text]FileMaker Pro 2023 est compatible avec

    • masOS Monterey et supérieur (donc Ventura, pour lequel plusieurs problèmes sont corrigés)
    • Windows 10 et supérieur

    D’autre part, après quatre ans de maintien de la compatibilité du serveur avec FileMaker Pro 18, ce dernier ne pourra plus se connecter à FileMaker Server 2023. Attention donc, il faut FileMaker Pro 19.4.2 minimum.

     

    Bien entendu, FileMaker Pro 2023 peut se connecter à FileMaker Server 19.4

    Attention (bis) : si vous utilisez des plug-ins, tant côté client que côté serveur, nous vous invitons à vérifier la compatibilité auprès de l’éditeur, et à faire les mises à jour de ces plug-ins le cas échéant.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]Du nouveau pour les utilisateurs (quand même)[/ish_headline][vc_column_text]Vous le savez, les utilisateurs sont impatients. Commençons donc par les nouveautés qui les concernent directement (il y en a !)

    • On peut maintenant lire un QR code à partir d’un document stocké dans une rubrique conteneur, et ce aussi bien sur serveur que sur le client (FileMaker Pro/FileMaker Go). De nouveaux flux automatisés de documents sont donc possibles. Pensons par exemple à la possibilité de lier un document à un enregistrement automatiquement.
    • La fonction ObtenirLiveText ) (macOS/iOS) est désormais compatible serveur (mac OS)
    • Import du certificat de licence ! Enfin ! Le fait de double-cliquer sur un certificat de licence Claris va désormais lancer le processus d’enregistrement de la licence. Voilà qui va simplifier la vie des utilisateurs et des administrateurs.
    • Envoi d’e-mail avec authentification OAuth2. Oui, je suis d’accord, vu le titre ça pourrait plutôt passer dans la section “pour les geeks”, mais en fait ça concerne très directement les utilisateurs qui étaient confrontés à l’évolution des messageries Gmail et Office 365. On peut à nouveau les utiliser directement depuis FileMaker.
    • Support de sFTP pour le pas de script Insérer depuis URL.
    • Une autre mise à jour technique mais qui fera plaisir à certains utilisateurs et administrateurs : le nombre maximal de fichiers hébergés sur FileMaker Server passe de 125 à 256. Je fais le pari que ce sera une question du prochain examen de certification, vous l’aurez lu ici en premier 🙂

    Encore deux points sur Claris Connect pour faire plaisir aux utilisateurs, et ensuite on attaque le dur.

    • C’est un des points les plus importants : Claris Connect, le service d’automatisation et d’orchestration de Claris (vidéo) a désormais une licence gratuite.
    • FileMaker Pro se trouve pourvu d’un nouveau pas de script –Déclencher un flux Claris Connect (Trigger Claris Connect Flow)– qui rend extrêmement facile l’intégration des deux outils. À vrai dire, il m’est impossible de trouver une explication au fait que cela n’ait pas été le cas avant. Toujours est-il qu’on peut maintenant sans connaissance particulière de cURL déclencher un flux Claris Connect et en récupérer le résultat dans une variable. Il y a vraiment de quoi, même pour des développeurs avancés, rendre Claris Connect beaucoup plus attractif.

    Cette fois-ci, c’est la fin des fonctions “utilisateurs”, le reste -le plus important et de loin- sera…[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h2″]…réservé aux geeks, aux développeurs, et aux administrateurs exigeants…[/ish_headline][vc_column_text]C’est bon ? nous sommes entre nous maintenant ? Je vais pouvoir utiliser plein d’acronymes et de jargon ?

    Non, rassurez-vous, je dois absolument en placer quelques-uns, mais il y a des grandes nouveautés fonctionnelles. Accrochez-vous, je garde le meilleur pour la fin.[/vc_column_text][ish_headline tag_size=”h3″]FileMaker 2023, une énorme mise à jour logicielle[/ish_headline][vc_column_text]Voilà qui est très rassurant pour la plateforme. Une grande partie des librairies et frameworks qui sous-tendent la plateforme ont été mis à jour, notamment sur le serveur. Java, Vaadin, Tomcat… C’est un excellent signe que Claris travaille vraiment sur la plateforme et ne se contente pas d’avancées de surface pour satisfaire le marketing.

    Un petit étonnement tout de même : Java est mis à jour en 17 alors que la version la plus récente est 19, mais je ne connais pas les raisons ni les implications.

    Un petit regret aussi : le WebKit embarqué dans le web viewer est toujours le même, et c’est un peu dommage car nombre de librairies javascript tirent partie des évolutions récentes. Par exemple notre add-on au succès inespéré 1MT PDF Viewer ne peut pas intégrer certaines fonctionnalités.[/vc_column_text][ish_headline tag_size=”h3″]Une version ARM et un load balancer pour une stratégie assumée[/ish_headline][vc_column_text]Nous l’avons déjà évoqué, la stratégie de Claris est de réduire le nombre de versions de FileMaker Server, et donc de ne plus supporter que Linux.

    C’est un excellent choix que nous appelions depuis longtemps de nos vœux, car il permettra à Claris d’aller beaucoup plus vite dans le développement.

    Reste que… les clients ne sont pas tous sous Linux. C’est pourquoi on s’oriente vraisemblablement sur un serveur Linux qui pourra être virtualisé sur macOS ou Windows, l’utilisateur n’y voyant alors aucune différence.

    Or nombre de PC, à commencer par les Mac récents (oui, les Mac sont aussi des PC, n’en déplaise à certains que je ne nommerais pas, mais qui vivent à Strasbourg, ont une grande moustache, et font partie de notre équipe depuis 10 ans cette année !), tournent désormais sur une architecture ARM et non plus x86.

    Et justement, avec FileMaker 2023, Claris sort une version de FileMaker Server pour processeur ARM. D’après nos tests, ce n’est pas encore la panacée en termes de performances, mais il est très important pour la communauté de développeurs de savoir que cette version existe déjà et qu’elle va progresser et être optimisée.

    Au passage, Ubuntu 22 est supporté. Ce qui veut dire que Claris supporte désormais Ubuntu 20/x86, Ubuntu 22/x86, Ubuntu 22/ARM, et bien sûr les versions macOS et Windows de FileMaker Server. Ça commence à faire, mais en plus les versions Linux sont aussi déclinées en Claris Server (l’équivalent de FileMaker Server pour la nouvelle plateforme Claris)[/vc_column_text][ish_headline tag_size=”h3″]Load balancing, gestion du cache et garbage collector[/ish_headline][vc_column_text]Les versions Linux de FileMaker Server, qui utilisent le serveur web NginX, permettent désormais d’installer très facilement des serveurs secondaires pour gérer un vrai load balancing pour les utilisateurs Web Direct.

    Entre nous, les performances que nous atteignons déjà sur fmcloud.fm, en raison de son architecture moderne, font que nous n’avons jamais, même dans des cas extrêmes, été confrontés à une limitation des capacités du serveur web, mais nous sommes curieux de voir l’impact sur les applications les plus exigeantes.

    Gestion du cache

    La version 19.6 avait déjà permis de supprimer le cache du client (FileMaker Pro) depuis les préférences de l’application. La version 20 (FileMaker 2023) ajoute des fonctions d’obtention Obtenir ( CheminFichierCache ) (Get ( CacheFileName )) et Obtenir ( NomFichierCache ) (Get ( CacheFilePath )), qui permettent de supprimer le fichier de cache par script, afin de procéder à des tests de performance sans relancer l’application. Oui c’est méchamment geek, mais c’est vraiment une bonne nouvelle pour les optimisations dont nous sommes friands.

    Côté serveur, une nouveauté permet d’allouer plus ou moins de mémoire cache aux vues en liste sur Web Direct. Concrètement, il est possible de configurer le nombre d’enregistrements que Web Direct devra pré-charger afin de fluidifier le défilement (scroll). Attention, cette fonctionnalité ne se retrouve pas dans la console d’administration, ne perdez pas de temps à l’y chercher.

    Java garbage collector sur le serveur.

    Deux fonctionnalités : un bouton qui permet de déclencher le garbage collector, et la possibilité de programmer ce processus, comme on exécute un script ou, comme depuis la version 19, comme on nettoie le cache.

    Je ne vais pas m’étendre sur ce qu’est le garbage collection (ramassage des poubelles, littéralement), mais c’est un processus qui permet de libérer les adresses mémoire qui n’ont pas été libérées par le processus qui les a allouées. En d’autres termes, ça fait le ménage là où les développeurs du serveur ou d’une de ses nombreuses composantes ont oublié de le faire. Nous sommes curieux de voir ce que cela peut améliorer dans les scénarios où le serveur utilisait de plus en plus de mémoire au fur et à mesure des connexions Web Direct.[/vc_column_text][ish_headline tag_size=”h3″]D’autres fonctionnalités de FileMaker Server 2023[/ish_headline][vc_column_text]Je le sens bien, vous aimeriez qu’on arrive au grandes nouveautés, mais bien que plus discrètes, celles qui viennent en sont, des grandes nouveautés, classées par ordre d’importance croissant (selon un point de vue universel et objectif : le mien)

    • Je passe sur la gestion des sauvegardes annulées. Cela complète la possibilité d’annuler les sauvegardes apparue avec FileMaker Server 19.5
    • L’accès à la console d’administration de la version Linux du serveur peut désormais être contrôlé par Active Directory.
    • Le nom des programmes de script peuvent atteindre 100 caractères, ce qui est nettement plus confortable que les 31 précédemment.
    • Les nouvelles connexions sont refusées quand un fichier est en cours de fermeture. Jusqu’ici, quand on fermait un fichier on provoquait la fin de session des utilisateurs, mais si une nouvelle connexion intervenait on ne pouvait pas l’empêcher. C’est un grand progrès pour les administrateurs d’applications avec un grand nombre d’utilisateurs.
    • Data API supporte désormais la fonction d’enregistrement de PDF.
    • Log des scripts serveur. Deux nouveautés :
      • l’action de script “Activer la journalisation des erreurs” est désormais compatible serveur.
      • les événements de scripts sont désormais enregistrés dans un log différent des événements serveur. ScriptEvent.log. Excellente nouvelle, mais qui peut potentiellement vous obliger à revoir vos procédures, si vous aviez automatisé des traitement sur les fichier de log.
    • OData devient vraiment très, très puissant puisqu’il peut maintenant travailler sur les données liées. OData est sans doute la moins connue des méthodes de publication de données FileMaker, mais elle est pourtant extraordinairement simple et puissante.

    [/vc_column_text][ish_headline tag_size=”h2″]Les grandes nouveautés[/ish_headline][vc_column_text]Enfin ! les deux nouveautés phare de FileMaker 2023.

    [/vc_column_text][ish_headline tag_size=”h3″]Exécution de script sur serveur avec call-back[/ish_headline][vc_column_text]Depuis FileMaker 13 il est possible d’exécuter aisément un script sur le serveur depuis le client (en réalité depuis avant cela si vous suivez nos aventures).

    Cela a ouvert bien des possibilités, avec des traitements bien plus rapides et sécurisés.

    De plus, cela autorisait l’exécution de processus parallèles, le client n’étant pas obligé d’attendre la fin de l’exécution du script sur le serveur. Le poste client pouvait donc vaquer à ses occupations, voire déclencher d’autres scripts sur le serveur, pendant que le serveur travaillait.

    Le problème qui se posait, c’était que le client n’avait pas moyen d’être averti que le serveur avait fini son travail. On était obligé de développer des systèmes de messagerie compliquées, et le poste client devait s’assurer régulièrement qu’aucun message n’était arrivé.

    C’est désormais de l’histoire ancienne puisqu’un nouveau pas de script Exécuter script sur serveur avec rappel (Perform Scrip on Server With Callback, ou PSoSWC) permet désormais non seulement d’exécuter un script sur le serveur, mais de faire en sorte qu’un autre script soit déclenché sur le poste client quand celui-ci a terminé.

    On peut donc par exemple signaler à l’utilisateur que son rapport est prêt ou qu’une opération lourde est terminée.

    Bon à savoir : le résultat du script (défini dans l’instruction Fin de script) du script serveur est repris comme paramètre de script du script Call-back.

    Regret : contrairement aux deux autres principaux pas de script permettant d’exécuter un script (Exécuter script et Exécuter script sur serveur), il n’est pas possible d’appeler un script par son nom ! (ni le script call-back, ni même le script serveur). Quel dommage ![/vc_column_text][ish_image image=”80278″ size=”full” align=”center”][ish_headline tag_size=”h3″]Les transactions de fenêtres (ou “audit log”)[/ish_headline][vc_column_text]Vous le savez ou non, l’audit log est pratiquement devenue une passion personnelle. La principale raison de cette “passion” pour la conservation des modifications de données vient probablement du fait qu’il n’est pas possible en FileMaker d’avoir un log 100% fiable. Une sorte de quête du Graal. Vaine mais belle.

    Néanmoins, en développant FM AuditLog Pro, je crois avoir percé bien des mystères du fonctionnement de FileMaker, compris certaines finesses du moteur de calcul, de la sécurité, et bien sûr du modèle de données et de l’arbre de dépendances.

    Inutile de dire, donc, que la lecture dans les nouveautés de la mention “Audit log” avait de quoi éveiller mon attention. Cette fonctionnalité est une petite merveille, mais de “bas niveau”, et conçue pour que l’on puisse fabriquer son système de log. Ça n’est pas en soi un audit log.

    Voici le principe en quelques mots. Nous publions simultanément un article entièrement dédié à cette fonctionnalité qui demande d’être explicitée.

    • Un nouveau déclencheur figure au niveau du fichier (Options de fichier) : SurOperationFenetre (pourquoi “Opération” ?, je ne sais pas, c’est une traduction littérale de Transaction en anglais (OnWindowTransaction), mais il aurait fallu prendre un autre dictionnaire que celui de Wall Street :). Il s’agit bien de transactions de fenêtres.
    • Si ce déclencheur est activé, toute validation d’enregistrement ou suppression d’enregistrement va déclencher ce script.
    • Le script recevra en paramètre du JSON indiquant les fichiers, les tables, les enregistrements (ID) concernés, ainsi que le type de modification (New, Modified, Deleted)
    • Au sein de ce paramètre en JSON, on pourra pour chaque enregistrement ajouter un paramètre personnalisé qui sera le contenu d’une rubrique nommée OnWindowTransaction. Il est possible de choisir un autre nom dans les options de fichier, mais ce nom devra être cohérent dans toutes les tables du fichier. Cette rubrique peut bien entendu être calculée, afin de contenir le nom des champs et les valeurs modifiées, ou autre information.
      Si le contenu de cette rubrique est du JSON, ce JSON ne sera pas converti en string.
    • Bien sûr, le script permet d’enregistrer les transactions.

    Vous n’avez rien compris ? c’est normal. On se retrouve sur l’article dédié à l’audit log.[/vc_column_text][ish_headline tag_size=”h3″]Bonus : les Tables de base (BaseTables)[/ish_headline][vc_column_text]En lien avec l’audit log, Claris nous gratifie de quelques fonctions permettant de travailler sur les tables, par opposition aux occurrences de tables.

    Partout dans FileMaker à quelques exceptions près (onglet Tables de la définition de bases de données, sécurité, action de script Tronquer la table), le mot “Table” fait référence non pas aux tables mais aux occurrences de table.

    Les vraies tables n’apparaissaient que dans une table système, interrogeable avec la fonction ExecuterSQL, FileMaker_Tables, qui représente les occurrences de table, mais qui comporte une colonne BaseTableName.

    En version 19, Claris avait ajouté une autre table : FileMaker_BaseTableFields, qui était une vue dédoublonnée de FileMaker_Fields.

    Cela change enfin, avec une série de nouvelles fonctions et tables SQL.

    • NomsTableBase ( NomFichier ) (BaseTableNames ( file )) permet de lister toutes les tables (noms) d’un fichier
    • IDsTableBase ( NomFichier ) (BaseTableIDs ( file )) permet de lister les IDs de ces tables. Notons au passage que pour ces deux fonctions, nous avons un mélange singulier pluriel (on devrait écrire TablesBase). Au passage, les fonctions de conceptions équivalentes pour les IDs sont traduites en français au singulier (IDTable, IDModele…) ce qui est une erreur.
    • ObtenirNomTableBase ( rubrique ) (GetBaseTableName ( field )) permet d’obtenir le nom de la table de base d’une rubrique.
    • Une nouvelle table interne, FileMaker_BaseTables, comporte les colonnes suivantes : BaseTableName, BaseTableID, Source (<Internal>, MYSQL…), ModCount.

    Malheureusement cet arsenal est très incomplet. La table système FileMaker_BaseTables, de même que FileMaker_BaseTableFields apparue en 19 ne prend pas en compte les tables de fichiers externes référencées dans le graphique des liens du fichier courant. Il est donc possible mais complexe de récupérer l’ID d’une table d’un fichier lié.
    L’absence de fonction ObtenirNomFichier ( rubrique ) (GetFileName ( field )) et de ObtenirIDTableBase ( rubrique ) (GetBaseTableID ( field )), voire d’une colonne BaseTableID dans la table système FileMaker_Fields ne facilite en rien ces requêtes.[/vc_column_text][ish_headline tag_size=”h2″]En conclusion…[/ish_headline][vc_column_text]Comme nous l’avons vu, cette version fourmille de nouveautés (et je n’ai pas tout abordé !), qui à première vue sont très disparates et forment un patchwork.

    En réalité, il y a des implications très fortes. Je vais tenter de les résumer afin d’en dégager une idée générale.

    • Vers un serveur Linux unique, sur ARM comme sur x86. Pas de panique, j’ai bien écrit “vers”.
    • Un serveur capable de gérer plus d’applications (256), plus d’utilisateurs (load balancing) et mieux outillé pour gérer la mémoire, voire la configurer finement.
    • OData et Data API de plus en plus puissants.
    • Des outils pour débugger les scripts serveur.
    • Une intégration facilitée avec Claris Connect, et une version gratuite pour ce dernier
    • Exécution de scripts serveur avec call-back. Une grande incitation à déléguer encore plus au serveur.
    • Un “audit log” qui permet d’envisager de mémoriser des transactions et donc de pouvoir les ré-exécuter sur un autre serveur…

    Comme on le voit, et conformément à la vision que nous avions annoncée il y a déjà plusieurs années, la composante centrale de la plateforme est de plus en plus le serveur. Il est de plus en plus aisé et efficace de concevoir des solutions dans lesquelles FileMaker Pro/Go n’est qu’un front end de luxe et délègue les tâches lourdes à FileMaker Server, à la manière de Web Direct. Le choix d’un hébergement n’a donc jamais été aussi crucial. (comparatif selon fmcloud.fm).

    Voilà, j’espère que ce long article vous aura permis d’aller plus vite et plus loin dans votre découverte de FileMaker 2023. N’hésitez pas à partager sur les réseaux.[/vc_column_text][/vc_column][/vc_row]

  • Droits de diffusion : résolution du calcul des droits disponibles

    Droits de diffusion : résolution du calcul des droits disponibles

    Dans le cadre du développement d’une application de gestion de cession de droits pour un grand groupe d’édition, notre client nous a demandé d’ajouter un module de calcul de droits disponibles. Son objectif était de savoir rapidement quels droits de diffusion étaient disponibles à la vente et dans quelles conditions.

    À première vue, cela ne paraissait pas très compliqué : les droits acquis (qu’un ou plusieurs producteurs ont cédés à notre client) et donc disponibles à la vente, sont enregistrés dans les mandats, et les droits cédés aux diffuseurs sont enregistrés dans les contrats.
    Autrement dit les mandats représentent les entrées de stock et les contrats les sorties.

    Droits des mandats – droits des contrats = droits disponibles ! Voilà, il n’y a plus qu’à écrire un script et on pourra aller boire une bière 🍺. Oui, mais… ce n’est pas aussi simple qu’il y paraît…

    Le challenge

    Les droits enregistrés dans les mandats peuvent inclure plusieurs modes de diffusion. Chaque mode peut être acquis en exclusivité (c’est-à-dire que notre client est le seul à disposer de ce droit de vente), en non-exclusivité (auquel cas notre client ne pourra pas le vendre en exclusivité), ou en « Holdback » (qui correspond à une interdiction de vente soit totale, soit partielle, par exemple une interdiction de vendre le droit de diffusion du programme à un diffuseur donné). Chaque mode de diffusion acquis l’est pendant une période donnée, sur un ou plusieurs territoire(s) donné(s), les territoires pouvant eux-mêmes être une combinaison de régions ou de pays, et dans une ou plusieurs langues.

    Par exemple, les droits acquis de mandats peuvent être de la forme :

    Programmes : La soupe aux choux et L’aile ou la cuisse
    Modes : Pay TV (Option : Exclusivité) et VOD (Option : Non-exclusivité)
    Territoires : Pays de l’UE, Pays du Commonwealth (sans l’Inde ni le Bangladesh) et avec le Canada
    Langues : français, anglais, allemand, espagnol, italien
    Dates : du 01/01/2020 au 31/12/2023

    Le script devrait donc commencer par linéariser (créer des lignes ou enregistrements pour représenter toutes les combinaisons possibles) l’ensemble des droits acquis pour avoir une liste de disponibilités. Dans notre exemple la liste est la suivante :

    • La soupe aux choux en Pay TV en exclusivité, en France et en Français du 01/01/2020 au 31/12/2023
    • La soupe aux choux en Pay TV en exclusivité, en France et en Anglais du 01/01/2020 au 31/12/2023
    • etc

    On ne vous liste pas les 1660 lignes de cet exemple simple (2 programmes x 2 modes x 83 pays x 5 langues)

    À ce stade, cela pourrait rester raisonnable, même si nous doutions déjà de la capacité de FileMaker à gérer efficacement ce calcul pour des dizaines de mandats pouvant contenir des dizaines de programmes acquis avec chacun différentes d’options de territoires et langues sur des périodes différentes. De plus, notre client nous indique alors qu’il est possible de forcer des options sur les pays ou les langues : il est donc possible d’acquérir la diffusion d’un programme en Pay TV en exclusivité dans les Pays de l’UE et en allemand, mais pas en Allemagne (si cela est déjà détenu par un concurrent en non-exclusivité), donc on va forcer la non-exclusivité sur l’Allemagne uniquement. Vous suivez toujours ?

    Si on reprend l’exemple précédent :

    Programmes : La soupe aux choux et L’aile ou la cuisse
    Modes : Pay TV (Option : Exclusivité) et VOD (Option : Non-exclusivité)
    Territoires : Pays de l’UE (Forcer la non-exclusivité sur l’Allemagne), Pays du Commonwealth (sans l’Inde ni le Bangladesh) et avec le Canada
    Langues : français, anglais, allemand, espagnol, italien
    Lorsqu’on linéarise les droits acquis pour l’Allemagne, dans tous les cas, il faut forcer la Non-exclusivité. Cela n’aura pas d’impact sur le mode VOD mais changera l’option pour le mode Pay TV et ceci dans toutes les langues.

    Ce n’est pas terminé 🤯.

    Les options forcées peuvent l’être sur les régions (Pays de l’UE par exemple), un pays ou une langue, il a donc fallu définir des règles de priorité d’application des options pour chaque cas possible et notamment lorsque des options contradictoires sont définies dans une combinaison.

    Dans un catalogue d’environ 1000 programmes avec en moyenne 100 acquisitions et 500 cessions par an sur des périodes différentes couvrant plusieurs années, le nombre de lignes de droits acquis et cédés linéarisées possible dans une recherche est astronomique et notre perspective de boire une bière après la rédaction de ce script s’éloignait de plus en plus. 😕

    De plus, une fois l’ensemble des règles de linéarisation des droits acquis et cédés, nous avons dû déterminer les règles de soustraction (ce qui fut finalement la partie la plus simple). Les droits cédés sont soustraits de la liste des droits acquis pour obtenir les droits disponibles, avec quelques subtilités tout de même : un droit cédé en exclusivité n’est plus disponible à la vente, un droit cédé en non-exclusivité reste disponible à la vente en non-exclusivité, un droit en holdback total n’est pas disponible à la vente et un droit en holdback partiel est indiqué à l’utilisateur.

    La solution technique

    Finalement, après des heures de réflexions collectives avec notre client pour comprendre le fonctionnement des droits acquis et cédés, et la manière dont il souhaitait que les droits soient linéarisés et la disponibilité calculée, il devenait évident que FileMaker, avec sa mémoire sur disque, ne pourrait pas gérer ce calcul dans un temps raisonnable pour les utilisateurs. Il nous fallait trouver un outil travaillant en mémoire vive. Nous avons décidé de tirer parti de l’intégration de FileMaker avec Javascript, ce dernier étant bien plus efficace pour ce type de traitements 💡.

    Dans l’application de gestion des cessions de droits, FileMaker dispose des droits acquis et cédés, regroupés dans une table qui contient toutes les informations sur les options (type d’option, date de début de de fin d’application, lien vers les blocs de droits cédés ou acquis, lien vers le ou les programmes, pays, langues, modes…).

    Lorsque que l’utilisateur saisit une recherche, il doit au minimum rechercher les disponibilités à une date donnée et peut ajouter des critères de recherche sur un programme, un pays, une langue… FileMaker va chercher les droits acquis et cédés répondant aux critères de recherche. La liste des droits acquis et cédés trouvée est extraite par FileMaker Data API, le résultat est injecté dans le code d’un web viewer sous forme de json. Le scripts JS réalise tout le travail de linéarisation en appliquant les règles de priorité de chaque option ainsi que la soustraction. Il renvoie à FileMaker via FileMaker.PerformScriptWithOption le résultat  contenant la liste des droits disponibles. FileMaker transforme ensuite ce résultat en enregistrements dans la base de données et n’a plus qu’à présenter les disponibilités à l’utilisateur dans une table de droits disponibles.

    Les cas courants demandent seulement quelques secondes d’exécution. Les cas les plus complexes quelques dizaines de secondes. 💪

    Une fois les scripts FileMaker et JS rédigés, tous les nœuds au cerveau dénoués, une validation du fonctionnement de ce moteur de recherche de droits disponibles et la rédaction d’une documentation utilisateur, nous avons finalement bien mérité une bière 🍻 !

    Leslie Audigane & Karl Vossen

  • Sortie de FileMaker 19.3

    Sortie de FileMaker 19.3

    Claris l’avait annoncé : finies les traditionnelles grandes sorties du mois de mai. Le cycle “Agile” consiste en des mises à jour plus fréquentes, avec une répartition des nouveautés tout au long de l’année.

    Cette semaine, c’est la version 19.3 qui a été annoncée, et c’est une version importante même si surtout “technique”. Petit résumé des nouveautés les plus importantes :

    Du côté du serveur (FileMaker Server) :

    • FileMaker Server pour macOS tourne maintenant nativement sur processeurs M1. D’après les premiers tests, on observe un vrai gain de performances, ce qui tendrait à réabiliter le mac comme serveur FileMaker… s’il existait des mac serveurs. Malheureusement, il n’en existe plus, et donc à moins de vouloir vraiment héberger ses bases de données sur des mac mini, c’est une nouveauté louable mais qui ne va pas forcément changer le monde.
    • La version Linux change elle complètement de distribution : les versions 19.1 et 19.2 tournaient sur CentOS, mais malheureusement pour Claris RedHat a annoncé l’arrêt de CentOS seulement quelques jours après la sortie. Qu’à cela ne tienne, une distro Linux n’est pas si différente d’une autre, et Claris a pu relativement facilement changer son fusil d’épaule. La version 19.3 tourne donc désormais sur Ubuntu uniquement, ce qui oblige à mettre à jour l’OS si on veut mettre à jour FileMaker Server. Pour ceux qui se posent la question : cette opération sera transparente si vous utilisez notre service fmcloud.fm, car l’architecture docker nous permet de mettre à jour des centaines de serveurs en un clin d’œil, mais nous préférons attendre quelques jours après la sortie de la version finale pour nous assurer que tout fonctionne bien, ainsi qu’un éclaircissement sur les conditions d’utilisation (voir à la fin de ce billet).
    • Le retour du log viewer : on peut enfin à nouveau consulter les logs depuis la console d’administration du serveur sans avoir à les télécharger. La recherche est efficace, mais malheureusement on relèvera qu’il est impossible de copier du contenu en le sélectionnant à la souris ! Parfois on se demande quand même ce qui passe par la tête des développeurs pour faire une telle chose, mais enfin c’est une très bonne nouvelle. Peut-être un jour retrouvera-t-on également les graphiques qui permettaient de visualiser les appels distants et autres indicateurs depuis la console d’administration de FileMaker Server 16 ?
    • Les plug-ins sont désormais disponibles pour la Data API.
    • Il est désormais possible de créer un certificat SSL (CSR) depuis la console d’administration
    • L’admin API se voit ajouter des fonctionnalités qui n’étaient accessibles que par la ligne de commande.

    Attention : une modification pourrait engendrer quelques surprises : l’accès à une donnée de conteneur via Data API requiert désormais un token. Il n’est donc plus possible de fournir directement un API qui donnerait l’URL d’un fichier afin que le web service puisse utiliser cette URL pour aller chercher le fichier.

    Liste complète des nouveautés pour FileMaker Server

    Data migration tool

    L’outil de migration en ligne de commande est désormais compatible Linux (Ubuntu), ce qui signifie qu’il est possible de prévoir des automatisations côté serveur comme on pouvait le faire sous Windows et macOS. Ceci est une excellente nouvelle pour les éditeurs de logiciels sous FileMaker (SBA, Software Bundle Agreement). Bien entendu notre service fmcloud.fm proposera ce type de services dès que nous aurons validé la migration vers Ubuntu.

    Du côté du client (FileMaker Pro)

    Ici encore, il s’agit plutôt d’une mise à jour technique, mais pas des moindres !

    • sur macOS : FileMaker Pro est désormais une application universelle, qui tourne donc nativement (sans Rosetta) sur les processeurs M1. Gains de performances en perspective (voir le comparatif réalisé par notre confrère Vincenzo Menanno sur le blog de Beezwax)
    • Microsoft Edgesur Windows : c’est LA grosse nouveauté : le moteur de rendu des web viewers a été remplacé ! Enfin Internet Explorer 11 est abandonné au profit de Edge (Chromium). En termes de performances c’est le jour et la nuit, et surtout en termes de codage : on peut enfin utiliser un code propre pour afficher des contenus complexes ou simplement “modernes”.
      Attention toutefois : il n’est pas possible de choisir le moteur de rendu utilisé, et dans certains cas ce changement ne sera pas parfait. Un exemple tout simple auquel je me suis retrouvé confronté : Internet Explorer interprétait tout seul du HTML comme étant en UTF-8, ce n’est pas le cas de Edge. Il m’a donc fallu ajouter une balise meta au code HTML existant (<meta charset=”UTF-8″>). Pas une grosse affaire, mais le changement de moteur de rendu n’est pas un détail. Si vous utilisez beaucoup de web viewers, faites bien attention à tester votre application avant de faire la mise à jour en production.
    • les fonction d’écriture et de lecture de JSON (JSONSetElement et JSONGetElement) permettent désormais de travailler avec des clefs qui comportent des points (ce qui était la moindre des choses, certains appels à l’API Data de FileMaker même en exigeant !). Il faut pour cela utiliser des guillemets simples (du jamais vu en FileMaker). Par exemple pour extraire du JSON suivant :
      {"a":{"b.c":1234}}
      

      le contenu de “b.c”, il faut écrire :

      JSONGetElement ( $json ; "a['b.c']" )

      on dirait de l’écriture inclusive !

    Par ailleurs, de nombreux problèmes ont été réglés, comme des problèmes de formatage conditionnel de cases à cocher (mac) ou de survol de bouton (Windows).

    La liste complète des nouveautés et corrections est ici

    Malheureusement, trois loupés à signaler pour FileMaker Pro :

    • les mises à jour “in App” sur mac semblent de moins en moins fiables. Je vous recommande de télécharger l’application complète depuis votre lien de téléchargement (si vous ne l’avez plus et que vous avez acheté votre licence via 1-more-thing ou fmcloud.fm, il vous suffit d’écrire à malicence@1-more-thing.com). Il est vraiment dommage que ces problèmes de mises à jour interviennent si systématiquement. Maintenant que l’installation sur mac se fait par un simple glisser/déposer, j’en arrive à penser que Claris devrait plutôt renoncer aux mises à jour “in-App”, du moins s’ils ne trouvent pas le moyen de les rendre plus fiables
    • pour la millième fois (peut-être deux-millième, je suis lassé de compter), une mise à jour casse l’affichage des PDF stockés dans les conteneurs (quand ça n’est pas une mise à jour de Claris, c’est une mise à jour d’Acrobat ou du système d’exploitation : déjà ce mois-ci une mise à jour de Windows avait provoqué un problème similaire). Nous avons opté pour le développement d’un add-on, 1MT PDF Viewer, disponible depuis notre plateforme add-on-olam. D’ailleurs, je ne vous en ai pas encore parlé, il faut vraiment que je le fasse bientôt. Sachez déjà que c’est là que nous distribuons nos add-ons ainsi que ceux d’éditeurs tiers comme IU-Data. Pour revenir à ce bug, Claris assure être en train de travailler à une solution, il faut donc espérer que ce problème sera réglé dans les jours qui viennent.
    • Attention à un bug en particulier de cette version 19.3 : sous Windows, glisser un fichier vers un conteneur interactif (drag and drop) n’insère que la référence et n’ajoute pas réellement le fichier à la base de données. Gageons que ceci sera vite corrigé. En attendant, faites bien attention à insérer explicitement depuis le menu contextuel (clic droit)

    Vous constaterez l’absence d’une nouvelle version de FileMaker Go. Rien pour lui cette fois-ci.

    Pour finir (ou plutôt pour ne pas finir), un changement des conditions d’utilisation agite la communauté depuis la sortie. On y lit qu’il n’est désormais plus possible d’utiliser la Data API comme alternative à une licence utilisateur. Il faudrait donc en théorie payer une licence pour toute personne se connectant à l’API (alors que le trafic est déjà payant au-delà d’un certain seuil). Ce changement paraît pour le moins étonnant, mais nous attendons confirmation de la part de Claris. Nous mettrons cet article à jour dès que la chose aura été confirmée ou infirmée. Modifié le 8/7/2021 : Claris a précisé le sens de ce changement des conditions d’utilisation : il n’est pas permis de développer une application autonome alternative à FileMaker Pro et d’utiliser la Data API dans le but d’éviter l’achat de licence, mais vous avez toujours le droit de partager les données via la Data API avec les visiteurs de votre site web ou de votre boutique en ligne…

    Voilà, j’espère que cette lecture vous aura permis d’appréhender rapidement les nouveautés.

  • WebDirect et bouton retour…

    WebDirect et bouton retour…

    Modif (Juillet 2025) : cette technique est désormais obsolète car intégrée à FileMaker 2025)

    WebDirect a été introduit par Claris à partir de la version 13 de FileMaker et à su évoluer avec le temps en apportant son lot d’améliorations et d’optimisations jusqu’à aujourd’hui.

    Cette technologie permet d’utiliser vos applications FileMaker depuis un navigateur web via le réseau internet. Claris prenant soin d’apporter une expérience utilisateur très proche de celle de FileMaker Pro.

    Cela représente un avantage certain pour les entreprises qui ne souhaitent pas installer FileMaker Pro sur leurs postes. WebDirect et la solution idéale pour accéder à son application depuis le web. Elle convient aux utilisateurs externes, mais elle permet aussi de créer des portails clients par exemple.

    WebDirect nécessite l’installation de FileMaker Server

    Le problème du bouton “back”

    Un retour utilisateur largement répandu est la déconnexion immédiate quand on clique sur le bouton back (ou retour) du navigateur web. Ce bouton est assez perturbant surtout lorsque l’on est utilisateur de FileMaker Pro, la navigation entre enregistrements s’y trouvant au même endroit, et avec le même aspect.

    La solution

    Et bien sachez, chers amis développeurs que nous avons trouvé une petite parade pour pallier ce comportement. Et je vous rassure, cela ne tient que dans un seul et même fichier !

    Ce fichier HTML va permettre à la connexion d’une solution en WebDirect de désactiver la fonction retour de l’historique du navigateur web. Le fait de désactiver ce bouton d’historique, va faire que le bouton retour de la navigation web ne renverra plus qu’un message indiquant à l’utilisateur qu’il ne peut pas utiliser ce bouton de navigation, vous me suivez ? plus de déconnexion !

    Pour utiliser ce fichier, il vous faut FileMaker Server (WebDirect oblige), et simplement héberger ce fichier sur le même serveur.

    • Sur un système Windows, le fichier est à installer dans le répertoire : FileMaker Server\HTTPServer\conf\
    • Sur un système Mac, le fichier est à installer dans le répertoire : FileMaker Server/HTTPServer/htdocs/

    Repertoire de destination du fichier html

    Ensuite au moyen d’un éditeur de texte, ouvrez le fichier HTML. Au niveau de la variable solution, modifiez le nom de la solution que vous souhaitez ouvrir.

    Fichier html destiné à l'ouverture de la solution en Webdirect

     

    Habituellement, un utilisateur utilise un lien WebDirect du type :

    • https://<Nom de votre serveur>/fmi/webd/Nom_de_votre_solution.fmp12

    Avec cette nouvelle solution, l’utilisateur utilisera un lien du type suivant :

    • https://<Nom de votre serveur>/Nom_de_votre_fichier.html

    Dans notre exemple cela donnerait : https://1mt_server/1mt_Tasks.html

    Ainsi, l’utilisateur ne passe plus par l’interface d’accueil de WebDirect mais se connecte directement à sa solution via l’url. Le lien lui, devient plus simple en s’affranchissant du /fmi/webd/

    NB : Si vous testez cette solution avec une connexion non sécurisée, veillez à modifier dans le fichier HTML la variable uri, le https en http.

    Téléchargez le fichier de démo ici : Zip-file-iconWebDirect_Wrapper.zip

    Si vous avez aimé cet article, partagez le !

     

  • FIleMaker 19 : Obtenir une liste d’identifiants avec Exécuter FileMaker Data API

    FIleMaker 19 : Obtenir une liste d’identifiants avec Exécuter FileMaker Data API

    [ATTENTION: cette video en Anglais est réservée aux geeks :). Elle n’explique pas les détails de la technique. Elle n’est là que pour partager une idée, pas du code prêt à l’emploi]

     

    Une de mes fonctionnalités favorites de FileMaker 19 est la nouvelle instruction de script, non documentée, Exécuter FileMaker Data API.

    Comme je l’ai déjà écrit, elle pourrait être améliorer et j’espère qu’elle le sera dans les prochaines versions, mais c’est déjà en l’état une petite révolution.

    Aujourd’hui je partage une technique qui repose sur elle. J’espère avoir réussi à la rendre compréhensible.

     

    Si la longue introduction où j’explique POURQUOI j’aboutis à cette technique vous ennuie, vous pouvez vous rendre directement au time code 5:40.

  • Extension de la classe Javascript FileMaker.PerformScript

    Extension de la classe Javascript FileMaker.PerformScript

    [vc_row bg_color=””][vc_column][vc_column_text]Avec la sortie de FileMaker 19, il devient plus aisé que jamais (c’était déjà très largement possible avant – j’ai eu l’occasion de montrer le “#hash trick” dans quelques conférences 😉 ) de faire communiquer FileMaker et Javascript. Notamment en exécutant du code Javascript dans un Web Viewer grâce au pas de script Exécuter Javascript dans un Web Viewer (FileMaker demande au Web Viewer d’exécuter un Javascript), et à la classe Javascript FileMaker.PerformScript( “Nom du script FileMaker”, “Paramètre facultatif” );

    Toutefois, il manque à nos yeux quelques possibilités à cette dernière. Nous avons évoqué ici l’impossibilité de reprendre un éventuel script FileMaker qui serait en pause, mais il y a aussi l’absence de possibilité de différencier le script appelé (callback) en fonction du succès ou de l’échec. Cet article développe ce dernier point et apporte une solution.

    La programmation asynchrone

    Aucune bibliothèque (library) n’est nécessaire, mais j’ai dû écrire ma propre classe qui étend un peu FileMaker.PerformScript à FileMaker.PerformScript ( scriptName, parameter, successCallback, errorCallback ).

    Un petit exemple pour faire une interaction bidirectionnelle entre FileMaker et Web Viewer. Il s’agit d’un système de callback et/ou de promesse, une façon dont le Javascript appelle souvent quelque chose de l’extérieur et selon que tout s’est bien passé (succès) ou mal (erreur), vous laissez quelque chose se produire dans votre application Javascript.

    En fait, tout se résume donc à cela : “FileMaker, appelle ce script. Si tout s’est bien passé fais ceci, si tout s’est mal passé fais cela”.

    Un exemple concret avec une intégration de calendrier : si l’utilisateur change le lieu d’un événement, il doit appeler FileMaker et l’enregistrer dans la base de données. Si cela n’a PAS réussi (par exemple, erreur d’écriture dans l’enregistrement), il faut annuler la transaction et remettre l’événement à son emplacement d’origine pour que l’utilisateur voie qu’il n’a pas été enregistré. C’est ce qu’on appelle la programmation asynchrone, et c’est quelque chose qu’il faut absolument comprendre si vous voulez continuer avec Javascript.

    Donc, en dans le calendrier, voici ce qui se passe réellement :

    1. L’action en Javascript est appelée, avec immédiatement les actions : que faire si ça va bien, que faire si ça va mal.
    2. En interne, ces actions sont enregistrées, et Javascript appelle FileMaker.
    3. Le code Javascript ne “tourne” plus, il n’y a plus de pause, nous avons effectivement atteint la fin du code.
    4. FileMaker fait son travail et décide s’il veut dire au Web Viewer si cela s’est bien ou mal passé.
    5. Le Web Viewer exécute les morceaux de code (enregistrés à l’étape 1).

    En code :[/vc_column_text][vc_column_text]

    #BUSINESS LOGIC
    #add as much logic as you want, for instance try to write to a folder
    
    #DEMO: a custom dialog
    Show Custom Dialog [ Title: "Choice"; Message: "Was the record saved?"; Default Button: “Yes”, Commit: “No”; Button 2: “No”, Commit: “No” ]
    
    If [ Get ( LastMessageChoice ) = 1 ]
        #we pass success to the callback
        Set Variable [ $result; Value:JSONSetElement ( "" ;
    [ "id" ; JSONGetElement ( Get ( ScriptParameter ) ; "id" ) ; JSONString ]; [ "success" ; Get ( LastMessageChoice ) = 1 ; JSONString ]
    )]
    Else If [ Get ( LastMessageChoice ) = 2 ]
        #we pass error to the callback
        Set Variable [ $result; Value:JSONSetElement ( "" ;
    [ "id" ; JSONGetElement ( Get ( ScriptParameter ) ; "id" ) ; JSONString ]; [ "error" ; Get ( LastMessageChoice ) = 2 ; JSONString ]
    )]
    End If
    
    #RETURN TO WEB VIEWER
    Perform JavaScript in Web Viewer [ Object Name: "wv"; Function Name: "fmcallback"; Parameter 1: $result ]

    [/vc_column_text][vc_column_text]Comme vous le verrez dans l’exemple, j’y ai mis une bibliothèque. Il m’a fallu beaucoup de sueur et de larmes pour que tout cela fonctionne. J’aimerais vous expliquer comment tout cela fonctionne, mais cela se résume à cela :

    J’ai un peu élargi le FileMaker.performScript de sorte que vous pouvez maintenant inclure un callback de réussite et un callback d’erreur. Je l’enregistre, puis j’appelle le script FileMaker. J’ajuste un peu le paramètre, parce que j’ajoute un autre “id” et ensuite le paramètre tel que passé.
    Voyez cela comme une sorte de “ligne téléphonique sur laquelle le FileMaker peut se rappeler”. Lorsque FileMaker appelle à nouveau le Web Viewer avec cette identification, le Web Viewer sait de quelle action il s’agit.

    En fait, le Web Viewer dit à FileMaker : “Bonjour, je suis l’action 23 et je voudrais que tu conserve cet enregistrement”. Après, FileMaker dit au Web Viewer que l’action 23 s’est très bien passée !

    Et voici un exemple, jouez avec et s’il y a des questions, n’hésitez pas à les poser ci-dessous ! C’est un concept assez difficile, mais une fois que vous avez maîtrisé la programmation asynchrone, vous désirerez en faire de même dans FileMaker 🙂

    Promesses (promise)

    Oh oui, pour les irréductibles : cela fonctionne aussi avec les promesses (sur Mac en tout cas, sur Windows pas sûr), donc vous pouvez faire ça aussi :[/vc_column_text][vc_column_text]

    fm.performScript ( "getData", "" )
        .then ( (data) => {
           //data is script result of getData
           data.sort();
           fm.performScript ( "storeData", data);
         })
        .then ( ( data ) => {
           //data is script result of storeData
           //do things here
        })
        .catch ( ( error ) => {
            //this is the error of getData or storeData, cool isn't it? :)
            alert(error);
     
        })
    

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_button el_text=”Télécharger l’exemple” url=”url:https%3A%2F%2Fwww.1-more-thing.com%2Fwp-content%2Fuploads%2F2020%2F06%2F1MT_javascriptCallBack.zip|title:T%C3%A9l%C3%A9charger%20l’exemple||” size=”big” align=”center” color=”color7″ text_color=”color4″][/vc_column][/vc_row]

  • Covid-19 – arbre de décision pour un service hospitalier

    Covid-19 – arbre de décision pour un service hospitalier

    Comme vous le savez peut-être, 1-more-thing est particulièrement impliquée dans le combat contre le Covid-19. Nous avons notamment monté le projet 1app2recover dans le but d’aider les gouvernements à organiser une sortie du confinement quand ce sera possible.

    Mais il y a parfois des efforts plus directs et plus modestes par leur ampleur qui permettent d’aider très immédiatement les vrais héros de cette lutte : le personnel des services hospitaliers d’accueil des malades Covid-19.

    Hier matin, je trouve dans ma boîte mail un message de Chris Kubica (@chris_kubica), de join::table (@JoinTableTeam), un groupement qui met en relation des développeurs FileMaker avec des organisations sans but lucratif, pour participer à des projets bénévolement (pro-bono)

    Un consultant, Joop Verelzen, de GDPR, travaille auprès d’un hôpital a besoin d’aide pour un projet.

    Je me mets en relation avec lui, et il m’envoie cette photo :

    Hôpital : decision tree

    On y voit un médecin ou un infirmier qui a vraisemblablement décroché un poster du mur, avec un arbre de décision pour orienter les patients.

    On imagine comme la chose s’est faite dans l’urgence, mais aussi à quel point l’utilisation doit être contraignante, ne serait-ce que parce qu’il faut être devant le poster pour savoir quoi faire.

    Ni de une ni de deux, je me mets au travail, et une heure plus tard (ça va vite avec FileMaker) je renvoie à Joop ma copie : une application installable sur FileMaker Pro (que l’hôpital utilise déjà) ou sur FileMaker Go ou en Web Direct pour une mobilité dans le service.

    Elle permet au médecin de modifier l’arborescence facilement et de naviguer de manière très simple dans cet arbre.

    Ci-dessous une petite video sur la solution technique.

    Bien sûr si cette mini-application peut aider un autre hôpital, elle est disponible !

    PS : contrairement à ce que je croyais, l’hôpital en question est en Belgique et non aux Pays-Bas.

  • filemaker2tableau, une nouvelle façon de connecter vos bases FileMaker avec Tableau

    filemaker2tableau, une nouvelle façon de connecter vos bases FileMaker avec Tableau

    Parfois, un leader ne peut se contenter de ce qui est simplement à disposition. En tant que 1-more-thing, leader mondial dans l’intégration FileMaker/Tableau, nous avons ressenti le besoin de développer notre propre connecteur.

    Aujourd’hui, nous avons le plaisir de vous annoncer la mise à disposition gratuite et en Open Source de notre connecteur FileMaker pour Tableau : filemaker2tableau !

    Ce connecteur se base sur la dernière version du Web Data Connector (WDC) de Tableau et bénéficie d’une interface simple et intuitive pour relier vos données FileMaker avec vos tableaux de bord Tableau Software. vous gagnerez ainsi du temps dans la phase de préparation de vos sources de données.

    Les avantages en comparaison du connecteur natif fourni par Claris sont nombreux :

    • Auto-complétion de la liste des bases de données
    • Auto-complétion de la liste des modèles disponibles dans un fichier
    • Connexion “multi-table” : connectez plusieurs modèles à la fois pour tout importer en une fois !

    Pour l’installer, rien de plus simple :

    • Téléchargez la dernière version sur GitHub (et oui c’est gratuit et open source !): https://github.com/1-more-thing/fm2tableau/releases/latest
    • Décompressez son contenu dans un sous dossier du repertoire web de votre serveur FileMaker:
      • Windows :
        C:/program Files/FileMaker/FileMaker Server/HTTPServer/conf
      • macOS:
        /Library/FileMaker Server/HTTPServer/htdocs/httpsRoot
    • Accédez au connecteur dans Tableau en utilisant l’adresse de votre serveur et le nom du dossier dans lequel le connecteur a été installé (ex: https://mon.filemaker.server/fm2tableau)

    Notes importantes :

    • Le connecteur doit être installé sur le serveur FileMaker qui publie les données (restrictions CORS)
    • L’authentification oAuth n’est pas encore supportée (mais ça va venir)
    • Les prérequis sont les même que pour le connecteur natif de FileMaker Server (dataAPI activé sur le serveur et comptes avec le privilège fmrest activé pour l’accès aux données)

    Connectez FileMaker et Tableau en 30 secondes

    filemaker2tableau video

  • Claris Connect : la nouvelle plateforme d’intégration/orchestration

    Claris Connect : la nouvelle plateforme d’intégration/orchestration

    Claris a officialisé aujourd’hui la sortie de sa plateforme d’intégration et d’orchestration : Claris Connect.

    Lors de la DevCon 2020, Brad Freitag (@bradfreitag), CEO de Claris International, annonçait le rachat par Apple/Claris de la startup italienne Stamplay.

    Quelques mois plus tard, Claris Connect est né ! Cette plateforme permet de créer et d’automatiser des flux de données très complexes en quelques instants seulement… et sans compétence technologique particulière.

    Ce qui demandait il y a encore peu des jours de développement pour intégrer différents services web peut désormais se faire très facilement, en incluant de la logique, de la gestion d’erreur, des transformations…

    Giuliano Iacobelli
    Giuliano Icacobelli (@Giuliano84), fondateur de Stamplay & Fabrice Nordmann (@FabriceN), 1-more-thing

    Mais pour mieux comprendre, le mieux est sans doute encore de regarder cette vidéo de présentation en français, par Romain Dunand (@airmoi).

    Dans cet exemple, nous intégrerons un site sous WordPress avec le plugin Woocommerce, FileMaker Server et Office 365. Notez que Claris Connect est tout à fait indépendant du logiciel FileMaker, qui n’est utilisé ici qu’à titre d’exemple.

  • Des apps personnalisées intégrées à un système central : l’exemple de l’UCLouvain

    Des apps personnalisées intégrées à un système central : l’exemple de l’UCLouvain

    [vc_row bg_color=””][vc_column width=”1/4″][ish_image image=”19437″ size=”theme-half”][/vc_column][vc_column width=”3/4″][vc_column_text]Cela fait maintenant 5 ans que nous sommes le consultant de référence pour FileMaker à l’Université Catholique de Louvain (UCLouvain).

    Cette université, répartie sur 7 sites en Belgique, accueille plus de 30 000 étudiants avec à l’affiche pas moins de 240 programmes d’études. Actrice renommée en matière d’enseignement, elle s’illustre également dans le secteur de la recherche.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h3″]Répondre à des besoins variés[/ish_headline][vc_column_text]FileMaker a une place privilégiée sur la scène des applications utilisées au sein de l’UCLouvain. La facilité de prise en main de l’outil a permis aux acteurs de terrain de créer des solutions de gestion adaptées aux besoins spécifiques de l’administration de chaque faculté ou département. Gestion des stages d’études, suivi des mémoires, inscriptions aux travaux de groupes, inventaires de matériel pédagogique, gestion des logements universitaires, offres de job pour les étudiants…les déclinaisons d’apps personnalisées sont aussi nombreuses qu’il y a de métiers et d’approches au sein de l’université.

    Dans notre travail de consultant, nous accompagnons les utilisateurs dans leur processus de création de solutions sur mesure. Nous les formons lors des séances de formation générique à la plateforme FileMaker : une journée de perfectionnement à l’utilisation et cinq demi-journées d’initiation au développement ; nous les coachons pour implémenter ensemble des fonctionnalités dans leurs outils spécifiques ; nous développons les parties plus complexes de leurs solutions.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]Cette année, nous avons une corde de plus à notre arc dans notre palette de modules technologiques : l’intégration des API du système central d’information.
    Pour illustrer cette avancée, prenons le cas de la gestion des étudiants.

    De nombreuses bases de données délocalisées dans les facultés traitent des dossiers étudiants pour des besoins très particuliers à leur faculté. Les stages par exemple ne sont pas gérés à l’identique lorsque l’on est étudiant en kinésithérapie ou en marketing. Cependant certaines données indispensables sont communes aux différentes facultés. La principale étant la signalétique de l’étudiant, son nom, son prénom, ses coordonnées.[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][ish_image image=”19443″ size=”full” stretch_image=”yes”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/1″][ish_headline tag_size=”h3″]Enterprise Services Bus (ESB)[/ish_headline][vc_column_text]Or l’administration centrale dispose d’un système colossal de gestion des dossiers étudiants reprenant toute l’information administrative ainsi que le parcours d’étude.

    Pourquoi ne pas aller puiser dans ce réservoir complet les informations dont les systèmes locaux ont besoin ? Ceci est rendu possible par ce que l’on appelle un ESB pour Entreprise Service Bus. Au départ de la solution FileMaker nous envoyons une question à l’ESB qui nous répond selon un format que FileMaker analyse et comprend. « ESB, quel est le nom de l’étudiant dont le matricule est 123456 ? », quel est son statut d’inscription, quel est son adresse mail, etc. La réponse reçue prend la forme d’un objet JSON que FileMaker peut interpréter grâce à ses fonctions natives d’analyse du format JSON.

    L’avantage est de pouvoir ainsi disposer rapidement d’une information à jour et d’éviter de saisir à nouveau des données existantes au risque de se tromper.[/vc_column_text][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/2″][ish_headline tag_size=”h3″]Authentification Active Directory[/ish_headline][vc_column_text]Nous étendons cette approche qui consiste à s’appuyer sur les systèmes centraux d’information de l’institution aux mécanismes d’authentification pour accéder aux solutions. Par exemple, lorsqu’un·e étudiant·e doit s’inscrire en ligne pour son travail de groupe directement dans la base de données FileMaker, il n’est plus nécessaire de lui avoir créé un compte dans la sécurité du fichier. Nous établissons le lien entre la couche de sécurité du fichier FileMaker et le système central d’authentification de l’université Active Directory. L’étudiant peut donc utiliser son identifiant global UCLouvain pour se connecter à la solution FileMaker. Il n’y a plus de compte et de mot de passe à créer dans chaque fichier, l’étudiant ne doit plus mémoriser plusieurs mots de passe. Le grand annuaire Active Directory de l’Université et les fonctionnalités d’authentification externe de FileMaker Server se charge du job.[/vc_column_text][/vc_column][vc_column width=”1/2″][ish_divider][ish_image image=”19479″ size=”full” stretch_image=”yes”][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][ish_headline tag_size=”h3″]Gains[/ish_headline][vc_column_text]Ces intégrations (lien avec l’ESB et authentification Active Directory) réduisent fortement les traitements à réaliser par les gestionnaires des dossiers étudiants dans les facultés et permettent de mettre toute l’attention sur les fonctionnalités spécifiques du programme local.

    Ce genre d’approche souligne le rôle majeur de la plateforme FileMaker de Claris: proposer des outils de développement rapide pour des solutions personnalisées qui peuvent par ailleurs entrer en communication et interagir avec d’autres systèmes de gestion de données plus génériques. C’est ce qui en fait la technologie de référence dans la catégorie « Workplace Innovation Platform ».[/vc_column_text][/vc_column][/vc_row]

  • Quick Find: the forgotten feature

    Quick Find: the forgotten feature

    Released with FileMaker 11, more than 8 years ago in 2010, Quick Find is probably one of the most underestimated features in FileMaker.

    For some reason, there wasn’t even much emphasis in the product marketing when it was released. Platform evengelists would mention it as a ‘Google-like search engine within FileMaker’, product documentation said ‘search in all fields of current layout’, but it was never said clearly how powerful this feature is.

    And it is extremely powerful.

    First of all, let’s sum up the various implementations of Quick Find in the product.

    • Quick Find search field in the toolbar. This is probably the first thing one would mention while thinking about Quick Find: the Toolbar includes a search field where the user can type criteria and trigger the find hitting Enter. There’s already something to mention about it: this search field is available only in browse mode. It would, I think, make perfect sense to have it also in find mode. It is common to see users first think they want to find something and therefore switch to Find mode, then only to realise they could use Quick Find. They have then to go back to browse mode before they can use it, which is a bit odd and might be a reason why Quick Find isn’t as seamless as it could.
    • Perform Quick Find script step. Does the same as hitting enter while the search field is active, except the criteria can be specified. It is therefore trivial to build your own Quick Find interface, and it works in Find mode too!
    • In layout mode, Quick Find badges at the bottom right of layout objects. The Magnifying glass can be green or orange, depending on how fast FileMaker presumes the find will be. Basically, it’s green for indexed or indexable fields of current table, and orange for unindexed or related fields. Note that I wrote ‘layout object’ and not field: a text object including merge fields can be included in Quick Find index. Other types of objects can’t, even if they include layout level calculations (button bars, web viewers, tab panels) or merge fields (buttons).
    • In the inspector behaviour panel, a checkbox labeled ‘Include field for Quick Find’ is active when a field or a text object containing merge fields is active. Very unfortunately, FileMaker has decided from the beginning that every new field object added to the layout would be included by default in Quick Find. This is, from my point of view, the main reason why this feature is underestimated and, I would say, rather dangerous. Because the first Quick Find performed on a layout will trigger the indexing of all indexable fields included in the Quick Find, having all these fields included will cause a huge, unnecessary index. Quick Find is powerful because you can select which fields are included, but having them selected by default weakens the feature itself: who would like to search in a phone number or in a boolean in the context of a Quick Find? It ends up in returning irrelevant data, and causes the index to grow incredibly.
    • In the layout format dialog, a checkbox labeled ‘Enable Quick Find’, checked by default allows to disable Quick Find on the layout. The badges mentioned above are then greyed out, and the Quick Find search field is disabled in browse mode. Next to this checkbox, a button says ‘Reset Quick Find’, which basically will include all fields for Quick Find, because this is the default setting)
    • Finally, still in layout mode, in the View/Show menu, you can enable or disable the layout badges. By default they are disabled, which is a pity because this is your only chance to avoid having too many fields included in the Quick Find. These show options have to be adjusted before you upload the file on a server, otherwise you’ll have to set them again for every session.

    Tips and tricks

    Here are a few things you should know before we come to the core of this blog post

    • Quick Find doesn’t support operators like *, …, //, =, ==, etc.
    • There is no ‘constrain found set’ or ‘omit record’ equivalents. You can’t use Quick Find to fine tune a previously found set of records.
    • Error trapping is different for Quick Find than with a simple Perform Find. Namely, if you get a 401 error (no records found), the previous found set is preserved, whereas with Perform Find you end up with 0 (zero) record. So if you’re used to trapping the error with Get ( FoundCount ) = 0 instead of Get ( LastError ) = 401 , you’ll have to adapt your scripts for Quick Find.
    • Fields on the right hand side of the layout and therefore not visible in form and list views can be included in Quick Find. A very clear and easy way to manage fields that are included in Quick Find is to select all objects from the left (visible) part of the layout and uncheck the ‘Include field for Quick Find’ box, and on the right part, add a Quick Find zone with only the fields you want to search, and of course include them in Quick Find.
    • If your solution hides the toolbar completely and you’re sure the users won’t use the toolbar Quick Find search field, you can push this logic a bit further and disable Quick Find on the layout and create dedicated layouts with only the fields you want to perform Quick Find on. This way you’re sure than even if you add some fields to your main layout, they won’t be included in Quick Find, because it’s disabled there.

    Now the big thing

    But wait, didn’t I write that the power of Quick Find was underestimated? so where’s this power I was talking about?

    Well, it’s simply the way Quick Find does search. Because we’ve had the classic Find mode and Perform Find script step for so long, many overlooked the Quick Find feature thinking it was just like a find, but on many fields at a time.

    Say I have a Contact table with firstName, lastName, occupation, city, of which firstName is the only field not included in the Quick Find. And I’m looking for a plumber in Cincinatti. What you would do with the classic find is

    • go to find mode
    • enter ‘plumber’ in the occupation field
    • enter ‘Cincinnati’ in the city field
    • hit enter to perform the find

    In the old days, if one wanted to propose a ‘Google-like’ search (even before we’d heard of Google), he could add an indexed calculation field to the table like

    city & " " & lastName & " " & occupation

    and enter ‘plumber Cincinatti’ in find mode, and that’s because FileMaker considers individual words in the same field as criteria with an AND operator.

    But with Quick Find, you don’t have to create this field because what Quick Find does is NOT

    • go to find mode
    • enter ‘plumber cincinatti’ in lastName
    • new request (OR)
    • enter ‘plumber cincinatti’ in occupation
    • new request (OR)
    • enter ‘plumber cincinatti’ in city
    • perform find

    If it was this, then no records would be found because none of the fields contains the 2 words.

    What Quick Find does just cannot be done with Perform Find. It takes each word and does all possible combinations. So with ‘plumber Cincinatti’, it takes the first word (plumber) and finds all records where one of the 3 fields contains ‘plumber’ and then among those, it finds all records where one of the 3 fields contains ‘Cincinatti’. This explanation has nothing to do with HOW it does it (the process is probably very different from this). I’m only trying to explain WHAT it does.

    But the magic doesn’t stop here. This combinatory search also works with related records! So you can for instance search for ‘plumber Cincinatti approved supplier’ where ‘approved supplier’ is a value to be found in the related company table. The only thing you have to do is insert that field on the layout and make sure it’s included in the Quick Find.

    In the attached sample file, you will see a search engine that gets results from multiple tables. In the old days, you would have had to draw complex relationships with a bunch of ≤ and ≥ criteria, calculated fields and all. Look now how simple it is to perform Quick Finds, get the results to a global field and display the result with a simple relationship.

    I hope you learned something with this blog post. Please feel free to drop a line here under in the comments.

    [vc_row color=”color7″ text_color=”color4″ global_atts=”yes” style=”padding-x: 5px; padding-top: 25px; align: center; ” bg_color=””][vc_column width=”1/4″][ish_icon icon=”icon-download” align=”center”][/vc_column][vc_column width=”3/4″][vc_column_text global_atts=”yes” css_class=”btn btn-primary”]Download a sample file here. 1MT_QuickFind.zip

    Please share if you liked this post.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/1″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

  • Master/Detail and Detail/Master

    Master/Detail and Detail/Master

    One of the most important features of FileMaker 17 is the “current found set portal”. It makes it easy and fast to display the list of found records on the layout (Master/Detail).

    Not only does it display them, but it allows to browse records with a single click, without having to write a script or add a button.

    Besides, it reflects the sort order, which means you can now design a real Master/Detail view.

    In this demo file, I’ll show you a few tips, among which:

    • how to use the new Get ( ActiveRecordNumber ) function to highlight the current record in the portal
    • use the found set portal to browse records, and a simple button bar to act as a sortable column header

    But also, on a second layout called Detail / Master, you will see what happens if we inverse the perspective and use the current found set portal as the main item of the layout body. We can suddenly use ‘list views’ on a form layout. Benefits:

    • avoid the annoying “No record message” of FileMaker list view when user clicks on the body
    • edit the record in a form without leaving the list view (right pane)
    • add an action / navigation bar on the whole list height (left pane)
    • you can now adjust the window and control its height

    There is a missing feature though: no sub summary layout parts.

    Enjoy!

    [vc_row color=”color7″ text_color=”color4″ global_atts=”yes” style=”padding-x: 5px; padding-top: 25px; align: center; ” bg_color=””][vc_column width=”1/4″][ish_icon icon=”icon-download” align=”center”][/vc_column][vc_column width=”3/4″][vc_column_text global_atts=”yes” css_class=”btn btn-primary”]Download a sample file here. 1MT_MasterDetail.zip

    Please share if you liked this post.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/1″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

  • Client Side Virtual List

    Client Side Virtual List

    [vc_row bg_color=””][vc_column][vc_column_text]Last June at dotfmp 2018 in Berlin, we had the great honnor to welcome an esteemed Californian member of the FileMaker developer community, Kevin Frank (@FileMakerHacks)

    Besides being a long time friend -I remember the old times when participating in our ‘Friday Night Chat’ at 3AM CET wasn’t an issue for my young, fast-recovering body- he’s always been and still is one of the most talented and clever writers on the topic of FileMaker. I love (I somehow share, I hope) his kind of scientific approach to FileMaker, and his blog FileMaker Hacks is an endless source of information and inspiration.

    At dotfmp, he presented two sessions in a row about virtual lists. I’m not going to repeat everything he said there because some of it is available on FileMaker Hacks already, and I wouldn’t pretend here to be able to fill the gap between what can be read there and what you perceive while listening to someone in person.

    But the magic at dotfmp is that it is an unconference. And the schedule evolves all the time, so a session can be extended in another, or a discussion can be scheduled almost on the spot and everyone notified, thanks to the great web tools Egbert Friedrich (@dotfmp) and Andries Heylen (@AndriesHeylen) have put together.

    Kevin’s virtual list sessions made me think I should show something on the subject, so Laurent Spielmann (@laurent_at_joes) and I pushed a new session to the calendar, and here it goes (thanks to Heidi, room moderator and keeper of the keys 😉 )

    Laurent and I have spent a large part of our time during the two last years working on a big project. The application manages tens of gigabytes, super intensive activity (24/7, 120 users), constant imports from various data sources, 4 servers, 40 files… a beast.

    Why a virtual list?

    InterfaceTo make a long story short, the application is about booking management and all the customer support that goes with it.

    In the main interface used by the greater part of users, there’s a portal showing all the interactions with the customers, providers…

    There is a lot of different things in there: incoming and outgoing e-mail, sms, notes, internal messages… a lot. Each is also displaying data more that 1 table occurrence away (user, department…)

    Because FileMaker portals (and list views) can only represent records, as opposed to a result of a query on various tables (union), we would usually tend to denormalize data and store all these different things in the same table. But with such an amount of data, this would be unimaginable. Not only is the data split accross multiple tables, but also accross multiple files.

    As a result, a virtual list is a good option for the UI.

     

    Previous situation

    In fact, the solution we had designed in the first place was not really a virtual list. It was a somehow-but-not-really-virtual list. For each record in one of the data tables, we would create a record with a minimal amount of data in a UI table. Basically, it contained the booking ID (booking being the main record from which we need to see the related data), and the UID of the related record.

    All the rest (displayed data, tooltips, data used in conditional formatting…) was obtained using unstored calculations. So a record of our interface table could display information coming from an inconming e-mail, an outgoing sms and so on.

    So in a way, this list was virtual because the data it displayed was not stored in its table but using unstored calculations. But on the other side it wasn’t virtual because the records really existed. A booking record had n related records in the view table.

    After a year and a half of production, this almost empty table was about 13 gigabytes (most of which was index). We had to do something.

    previous situation

    Why not a really virtual list?

    At this point, you might wonder why we hadn’t chosen a truly virtual list.

    There are two reasons that combine.

    1. avoid data transfert over the network. An approach of the virtual list is to get all the required data in one or more global fields, and then parse it in different fields or repetitions using unstored calculations. In this application, it is common to load a record of which you see only a few related records, without scrolling to see all related data. Therefore there is no need to download all the data into a global field. With 120 users on the network, downloading so much unnecessary data would have been a problem. So we knew that even if we would go for a virtual list (every user would look at the same records, but each record would display something different, depending on which booking is loaded), the data would have to be unstored and related (i.e. data for an incoming e-mail would still reside in the incoming e-mail table)
    2. given 1, the number of users also has an impact on the unstored calculations. If 120 users are looking at the same records (but viewing different related data), experience tells us an application becomes sluggish. This would not be the case if the data was not related but entirely in the virtual list. But as explained above, it was not possible in our case.

    And suddenly came… FileMaker 16

    Just when we needed to tackle this file size issue, FileMaker 16 was released. And with it the solution to our problem.

    The feature that helped us is the ability to define an External FileMaker Data Source as a variable. To me, it’s the most important change in recent years. It widens the horizon tremendously, with all sorts of uses and contexts.

    In this instance, we used it to eliminate the ‘too many users issue’ by loading the virtual list on each client.

    Here are the steps that we took:

    Change in the data model

    This steps doesn’t apply to most situations. It was necessary in ours, but I could write another blog post just on it.

    In the previous situation we had millions of records with basically foreign keys (one for the booking, one for each source of related data). The rest was all unstored calculated fields.

    We wanted to get rid of them and have only one record per booking with all the required information. We could even have added this to the booking table, but the plan was NOT to make this table heavier (and there are plenty of other reasons why we wouldn’t do that, but they’re off topic).

    So we went for a CLOB-like approach. In our new table, we had of course the booking ID (foreign key), and another text field in which we needed to store everything we need for the virtual list.

    So say that each row of our portal had a id_user, potentially some keys among: id_provider, id_customer, id_incomingEmail, id_outgoingEmail, id_incomingSMS…

    We defined a format, using pipe as separator “|” for fields (which makes it a not-a-CLOB, one could argue), and ¶ for records.

    So for 1 booking we could have


    |user345|||outSMS||
    ||||inEmail2048|||

    and so on. So each row of the future portal would have to look up to 1 line only.

    This is off topic, but once we agreed on the format, we wrote a script to transform our existing data into this new.

    The first time we ran it and measured performance, we concluded that a fast computer would need about 9 months to process all.

    So we tried to optimise. The time fell to 4 months. Better. Not good enough. We were not in an emergency, but I can’t let a computer working for 4 months just to transform some data. No way. No, no, no.

    Then I asked the community. What language would you use to do this? I had the intuition that Python was a good option. Indeed, several people suggested it to me. That was reassuring.

    But two developers that I value immensely, David Wikstrom (@CamelCasedata) and Clément Hoffmann raised their hands and said “R”.

    David wrote a small application in R, and it took exactly 8 minutes to do the job FileMaker was doing in 4 months. So just to say: never let the system beat you. There’s always a way.

    So now instead of having between 1 and 250 records for each booking in the old view table, we have exactly one.

    Of course, this change in the data model had immediate impact: we also needed to modify the processes that used to create/edit/delete records. Now it should only work in this single record (add a line, remove a line, edit a line). But this was quite trivial.

    New situation

    The Local File

    Thank you for reading this all the way, but so far there is really nothing about a ‘Client Side Virtual List’, and this blog entry looks more and more like some link bait.

    Don’t worry, here it comes.

    We created a new file that was to be open (hidden) by the client. It has references to all hosted files it needs to get its data from or resolve unstored calculations. The external references point to the server with an absolute path. (fmnet:/<server>/<filename>)

    As the file will not contain any other data than IDs, we went for a very straight forward security policy with a auto-login defined in the file options.

    The file (Localfile.fmp12), with no data at all was then inserted in a container of the Settings table (a single record table) of the main file.

    Since FileMaker 16, you can define a FileMaker External Data Source using a variable, meaning that each user for instance can have his own source.

    So we defined in the main file (the one with the portal), a variable data source pointing to the client temporary folder, followed by the local file name.

    Note: you need to do this before any call to that datasource is made, even implicitely. Namely, it means that not only should you declare this variable in your startup script, but also you can’t have any reference to the external source in the startup script, because at runtime, FileMaker will resolve all external references when the script begins. Any call to this external source should happen in a subscript.

    Startup script

    1. Startup script begins
    2. A variable is declared: Set Variable [ $$localPath ; Get ( TemporaryPath ) & “Localfile.fmp12”]
    3. Perform script [ Install local file ]
    4. Do other things without any reference to the local file, otherwise the existence of the other file will be resolved in 1. With no chance to declare a variable (2.), and therefore leading to a ‘file missing’ situation.

    Subscript (Install local file)

    1. Go to layout [ Settings ]
    2. Export Field Contents [ containerField ; $$localPath ] // the container field contains the client side file.

    That’s it! Now all we have to do is to load the virtual list. For this we use a simple lookup.

    Then a loop creates as many records as we need to display. And we can delete them on next run (remember it runs locally, there is no impact on other users because they’re working on their own file). The load script is triggered onRecordLoad on the main file.

    An optimisation we made was to split the virtual list into several (1 per ‘column’) before we create the records. This made the system even faster.[/vc_column_text][/vc_column][/vc_row][vc_row color=”color7″ text_color=”color4″ global_atts=”yes” style=”padding-x: 5px; padding-top: 25px; align: center; ” bg_color=””][vc_column width=”1/4″][ish_icon icon=”icon-download” align=”center”][/vc_column][vc_column width=”3/4″][vc_column_text global_atts=”yes” css_class=”btn btn-primary”]Download a sample file here. ClientSideVirtualList.zip

    Please share if you liked this post.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/1″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

  • dotfmp Developer Challenge

    dotfmp Developer Challenge

    At recent dotfmp conference in Berlin (did I already mention this is the best FileMaker conference I know?), a developer challenge was orgnised.

    The challenge was to find the fastest way to download data from a FileMaker hosted database to a FileMaker Pro Client over the network.

    The table had 50K records (10 fields) of which only 10K had to be downloaded.

    But the important thing was that data, once on the client, had to be in any structured, workable, searchable form, not necessarily records/fields.

    @AndriesHeylen and I came up with a solution that I believe was considered interesting by the audience, so I’ll share it here, not to say that this is the best way or that I would necessarily use it in production, but I think it’s valid and it’s a good opportunity to visit some nice tricks.

    I’ll write this post in a kind of story-telling style, because I think the path we followed was as interesting as the solution, if not more.

    To rephrase the challenge, here is what needed to be done:

    1. select 10 000 records among 50 000 (any would do)
    2. transform the data stored in a table into something more appropriate for the next steps
    3. make the data transit over the network from the server to the client
    4. ‘render’ this data as a structured array, if that was not already the case, depending on what we would do during step 2.

    For each of this tasks we had many options in front of us. So because we hadn’t the time to explore them all (oh yes, I forgot to mention that we had approximately 45 minutes to solve this… while eating in a nice Vietnamese restaurant on Kastanienallee)

    So our first approach was to brainstorm about each step independently, so we would only see later how our favorite (supposedly fastest) techniques would combine nicely.

    Before we begin, let’s mention that there was one ‘obvious’ solution that was doing the whole thing: declaring a variable on the client, using ExecuteSQL function.
    ExecuteSQL ( "SELECT * FROM Datset FETCH FIRST 10000 ROWS ONLY" ; "#F#" ; "#R#" )
    Where #F# is a custom field separator and #R# a record separator.
    We didn’t follow that path because… there was no fun, and we still had 44 minutes to go.

    For step 1, selecting the records, we thought about 2 different ways:

    • through the found set
    • through a query

    A SQL query could be used in the context of an ODBC import (Import records from ODBC), but there’s a no go for this: the only output of Import records is… creating/updating records. We knew that this would take too long, so this ‘easy to solve’ first step showed us immediately that our strategy was not perfect.

    Before we could brainstorm on each step independently, we needed to exlude ways that we knew for sure would slow down the process.

    We identified 3 potential bottlenecks that we wanted to avoid

    • A – pre-formatting the data on the server using unstored calculation. Even with a simple calc this would be expensive, and it would make the solution not scalabale.
    • B – parsing data on the client, including creating records: data had to be ready to use or should not need more than a global transformation, not a per record or per field one.
    • C – sending a long text string over the network: we assumed it would take longer than if the string was encapsulated in a file

    Given this, we browsed the 4 steps

    1 – Select the 10K records

    To select the 10K records we could only use the foundset since the SQL Query could happen only in Import Records, and we didn’t want to import records (B)
    So we would run a script like:
    Go to layout [ Data ]
    Show all records
    Go to record [ First ]
    Omit multiple [ 10000 ]
    Show omitted only

    2 – Export records

    To avoid A and C, we thought the best way was to Export records to a text file (CSV)

    This made it clear that the main process (including step 1) should be a server side script because the export would be much faster on the server.

    We chose CSV because we believe this is the fastest, but we knew there was a glitch there: the result would not be very easy to use because the flavor of CSV FileMaker uses for its exports, using comas, double quotes and separator for multiline contents is not easy to parse using FileMaker calculation functions (certainly doable, but not easy)

    So we thought that if we had time (there was still 25 minutes to go), we would use XML/XSLT instead. It wouldn’t make a big difference in terms of performance.

    3 – Make the data transit over the network

    What we know (or think we know, which are two different things) is that sending a long string as a script result would take long. So we wanted to return a text file instead (C). Now that I’m writing this post and that I have much more time, I wonder if we shouldn’t have simply returned the text file as a script result (script results, as script parameters or variables can be of type container). But while on a hurry we went for something different: we created a ‘transfers’ table with a container field and an indexed ID field (serial number)

    So after exporting (2) our process:

    • creates a new record in ‘transfers’
    • inserts the file into the container (using Insert from URL and the file protocol, because Insert File is not server compatible)
    • exits the server side script with the ID of the transfer record as a result (token)
    • the calling (client side) script gets the token using Get ( ScriptResult )
    • goes to the transfers layout
    • finds the transfer record

    I should mention that inserting a file using insert from URL ate a full 5 minute of our time, therefore ruining our hopes to order desert. This was due to a change in FileMaker 16 that we had forgotten: to convert the path to where we export the records to into a URL from which we can insert the file, we have to remove the system drive. But since version 16, Get ( SystemDrive ) returns empty on FileMaker Server on macOS, so we have to extract it from the Temporary Folder path.

    4 – Extract the data into a variable

    OK, so now the client has a text file. It’s stored in a container field of the current record, but it could have been available as a script result.

    What we now have to do is to read this text file and ‘extract’ its content into a string.

    To do this we simply use this not so simple calculation :

    Base64Decode ( Base64Encode ( transfers::file ))

    In fact we could also use simply TextDecode ( transfers::file ; "UTF-8" ), but it only occurred to me later on. And as a matter of fact, we had several questions about the former expression while presenting our solution, so I’ll try to give a bit of explanation.

    Base64 is a encoding algorithm that allows encoding any data. This is very much used to embed binary files in a text, like for example an image in a html e-mail when you don’t want the image visualisation to rely on an internet connection. It is not an encryption method, although a base 64 encoded text is not readable by a human being (that I know, that is to say).

    So basically Base64Encode and Base64Decode are two inverse functions, which means that

    Base64Decode ( Base64Encode ( "abc")) = "abc"

    But it’s not as easy as this and I’ll try to give a clearer explanation that the one I gave when I was asked in Berlin.

    In this process, a text can be in 3 different states:

    • 1⃣ a string (data of type text in FileMaker)
    • 2⃣ Base64 encoded text
    • 3⃣ encapsulated in a text file

    Base64Encode ( data ) converts a string or a file to a Base64 encoded text depending on the parameter it receives (1⃣➡2⃣ or 3⃣➡2⃣)
    Base64Decode ( text {; fileNameWithExtension } ) converts a Base64 encoded text to a string (2⃣➡1⃣) or to a file (2⃣➡3⃣) depending on whether you pass a filename or not.
    So the two functions are inverse, but on two different operations.

    base64 encode Decode diagram
    In our example, Base64Encode translates a file into Base64 (3⃣➡2⃣) and Base64Decode translates the base64 encoded string into a string (2⃣➡1⃣).

    But again, TextDecode (released with FileMaker 16) is the best option.

    That was it, we had 4 minutes left, so just the time to wrap all this in 2 scripts (client side and server side), and add some performance measurement using get ( CurrentTimeUTCMilliseconds ) while paying the restaurant bill, fold the mac and head to the conference room where the solution had to be presented.

    Running on a local machine (with FileMaker Server and Pro Advanced on the same computer), the whole process was taking 0.4 seconds. On a local network (WIFI, quite busy and unstable, it took between 0.6 and 0.8 seconds). Not bad.

    Please do not hesitate to share your ideas or leave a simple comment below.

    client side script

     

    server side script

     

    Download the FileMaker file here: dotFMPcdotFMPchallenge (Admin / 1234)

  • Data Migration Tool : repensons le versioning

    Data Migration Tool : repensons le versioning

    Notre approche en tant que développeurs d’applications sur mesure est d’apporter des solutions évolutives à nos clients.
    Leurs besoins progressent, et ils souhaitent adapter rapidement leur outil à la réalité de leur métier et de leur structure.

    Mises à part quelques petites adaptations mineures qui peuvent être “reportées” en direct dans le fichier de production, la plupart du temps, pour pouvoir mettre en oeuvre de nouvelles fonctionnalités, nous devions nous lancer dans une aventure parfois fastidieuse : le versioning.

    Ceci est bientôt de l’histoire ancienne

    Souvenez-vous de ce à quoi pouvait ressembler un versioning :

    Table par table, nous importions les données dans la nouvelle version.
    En préparation de cet import, il avait fallu régler les correspondances de rubriques entre la table source de production et la table destination du nouveau fichier. L’interface que FileMaker propose pour régler l’import est sans doute le plus indigeste des interfaces de la plateforme : difficulté de positionner les rubriques qui “glissent” de haut en bas, contrôle de correspondance uniquement visuel… cette étape de configuration peut s’avérer gourmande en temps de développement (dans cet article de juin 2010 sur la mise à jour des données, nous revenons sur la méthodologie que nous adoptions dans pareille situation).

    Après avoir réglé la séquence d’import, nous devions penser à mettre à jour les éventuels compteurs basés sur des numéros de série.

    D’autres couches de l’application contiennent également des données qui avaient pu évoluer et être modifiées par les utilisateurs au cours de leur usage du fichier à mettre à jour :

    • la sécurité, dans laquelle des comptes ont pu être créés, modifiés, supprimés;
    • les listes de valeurs personnalisées dont certaines ont pu être adaptées par des utilisateurs disposants des droits pour ce faire.

    Vue la complexité et la lenteur du processus de versioning, nous options souvent pour procéder à ces manoeuvres la nuit, le week-end… prévoyant selon le nombre d’enregistrements à transférer de nombreuses heures où avancerait lentement la barre de progression de la fenêtre d’import.

    Parfois nous n’avions pas le choix, suite à une corruption de fichier, nous devions repartir d’une clone sain et injecter les données de production, en espérant ne pas interrompre trop longtemps le travail en cours des utilisateurs bloqués.

    Un gain de temps considérable

    Avec la version 17 de FileMaker, ceci va changer radicalement ! Mais c’est en dehors de l’application qu’il faut aller chercher cette excitante nouveauté. En accompagnement de FileMaker 17 (dans le package de la Developer Subscription), nous trouvons un petit outil léger en ligne de commande…léger mais d’une puissance telle qu’il va nous permettre de revoir fondamentalement le rythme de mise à jour de nos applications.
    (On peut s’interroger sur la raison d’une attente si longue dans l’histoire de la plateforme pour bénéficier d’un tel outil – Fabrice se souvient que ses demandes à FileMaker pour un système du genre remontent à plus de 10 ans, et les développeurs étaient nombreux à appuyer dans ce sens.)

    Le DMT, data migration tool, est donc un outil en ligne de commande qui permet d’injecter en un temps record les couches de données d’un fichier source vers un clone de la même base, et ce avec un tout petit minimum de préparation de notre part.

    Comme pour le iOS SDK, cet outil vient de le “package” qui accompagne la Developer Subscription (89€HT/an)(Un package qui devient encore plus attractif avec le nouveau modèle de licence…allez jeter un oeil)

    Comment utiliser le DMT

    (Attention, veuillez prendre connaissance de l’article relatif à un bug important de la version actuelle de l’outil) 

    Le principe est simple :

    1. Réalisez un clone de la base de données de destination. Précision importante : un clone est une copie du fichier, dénuée des parties données (enregistrements et données locales). Un clone est un clone tant que le fichier n’est pas ouvert. Dès son ouverture, FileMaker y écrit des paramètres locaux (langue, format de date,…) et il perd dès lors son caractère de clone.
    2. en ligne de commande, appeler l’outil FMDataMigration, identifier la source, le clone et la destination
    FMDataMigration -src_path <path> -clone_path <path> [<other options>]

    Et c’est réglé ! … un journal affiche la progression, les résultats et erreurs éventuelles.

    FmDataMigrationTool Process

    Un cas vécu : le temps de versionning d’un fichier comportant environ 40 tables et des millions d’enregistrements est passé de 3h00 à 10 minutes !!  Et c’est évidement sans compter le temps gagné à ne pas devoir paramétrer la séquence d’importation des données pour chacune des tables.

    Au final, nous récupérons non seulement les enregistrements, mais aussi les comptes utilisateurs et les modifications dans les listes de valeurs personnalisées, ainsi que les polices de caractères intégrées au fichier.

    Ce qui est transféré

    (en fonction des options cfr infra) :

    • les comptes utilisateurs
    • les enregistrements
    • les listes de valeurs personnalisées
    • le numéro de série suivant des rubriques entrée automatique numéro de série
    • les index
    • les ID d’enregistrements
    • les paramètres régionaux (formats de date, langue par défaut…)

    Paramètres de la ligne de commande

    (en gras les paramètres obligatoires)

    -src_path :  le chemin du fichier source
    -src_account : un compte accès intégral dans le fichier source (par défaut = Admin)
    -src_pwd : le mot de passe du compte (par défaut = vide)
    -src_key : l'éventuelle clé d'encryption du fichier source
    
    -clone_path :  le chemin du fichier clone
    -clone_account : un compte accès intégral dans le fichier clone (par défaut = Admin)
    -clone_pwd : le mot de passe du compte (par défaut = vide)
    -clone_key : l'éventuelle clé d'encryption du fichier clone
    
    -target_path : le chemin du fichier de destination (par défaut = chemin de la source avec ajout de 'migrated' )
    -ignore_valuelists : par défaut le DMT va recopier les valeurs des listes de valeurs personnalisées du fichier source. Ajoutez cette option pour ne garder que les valeurs du fichier clone
    -ignore_accounts : par défaut le DMT va recopier les comptes du fichier source ainsi que la clé d'encryption. Ajoutez cette option pour ne garder que les comptes du fichier clone
    -ignore_fonts : par défaut le DMT va recopier les polices du fichier source. Ajoutez cette option pour ne garder que les polices du fichier clone
    
    -v : (verbose) mode avec log de progression qui décrit étape par étape ce que le DMT est en train de faire
    -q : (quiet) mode silencieux
    -force : permet d'écraser un fichier de destination déjà existant

    Quelques remarques et points d’attention:

    Comment se fait la correspondance ?

    Rapidité mais prudencePour la correspondance des tables et rubriques, FM Data Migration Tool procède d’abord par nom et ID identique, puis s’il ne trouve pas par nom identique, puis enfin par ID interne correspondant. Cela signifie par exemple que si vous renommez la rubrique RUBOld en RUBNew et puis que vous créez une rubrique nommée RUBOld, les données de la source contenue dans la rubrique RUBOld seront transférées dans la nouvelle rubrique RUBOld.

    Des conteneurs

    L’outil est prévu pour que le fichier résultat soit ensuite placé au même endroit qu’à l’origine. Ce point doit être pris en considération dans le cas de stockage externe de conteneurs : l’outil ne gère pas de déplacement ou de conversion de ces fichiers.

    Clone tu resteras

    Petit rappel : un  clone reste un clone tant qu’il n’a pas été ouvert !

    Réparation du code ?

    Le DMT n’est pas un outil de réparation. Si on a dans la source une donnée corrompue, elle le restera après versioning.

    Attention plug-in

    Lors du versioning, le DMT “réévalue” les valeurs des rubriques calculs stockées. Ceci peut poser un gros problème si ces calculs font appel à des fonctions issues de plug-in. Le DMT n’ayant pas accès aux plug-in, les résultats de ces calculs sera un ? dans tous les enregistrements. Il faudra par la suite évaluer à nouveau ces calculs en entrant dans la définition de la base de données et en éditant la formule de calcul (y ajouter un espace suffit).

    Sécurité : login et mot de passe

    Dans les instructions en ligne de commande, il faut passer en clair un login et mot de passe du fichier clone et du fichier source. Ce login et mot de passe peut être soit celui d’un compte disposant de l’accès intégral au fichier…dans ce cas, vous exposez aux regards indiscrets et laissez dans l’historique du terminal un mot de passe critique. Soit vous pouvez mentionner un compte et mot de passe qui est associé à un jeu de privilège qui dispose d’un privilège étendu dont le nom commence par “fmmigration”. Le nom du privilège étendu doit être rigoureusement le même dans le fichier source et dans le clone (sensible à la casse).  Le jeu de privilège ne doit disposer d’aucun droit particulier dans la base de données (ni lecture des données, ni accès aux modèles, scripts,…). C’est sans aucun doute la manière la plus sûre de gérer cet aspect sécurité lors de l’usage du DMT.
    Dans l’exemple ci-dessous. Nous avons créé un compte “mig” dont le mot de passe est “123456”; ce compte est associé au jeu de privilège “Mig” qui n’a aucun droit de lecture, d’accès au modèle, scripts,..dans la base. Ce jeu de privilège dispose d’un privilège étendu dont le nom commence par fmmigration : “fmmigrationTest”.

    La commande devient la suivante :

     ./FMDataMigration -src_path Old.fmp12 -src_account mig -src_pwd 123456  -clone_path New.fmp12 -clone_account mig -clone_pwd 123456

    Pour disposer de l’outil Data Migration Tool

    Comme pour le iOS SDK, cet outil vient de le “package” qui accompagne la Developer Subscription (89€HT/an)

     

    Enjoy !