Deuxième épisode de la mini série consacrée au tri dans FileMaker.
Configurer les différents tris possibles dans un mode liste, en cliquant sur les libellés en tête des colonnes, peut s’avérer rapidement laborieux à faire, d’autant plus si votre solution comporte de nombreux modèles en mode liste avec le même système de tri.
En effet, FileMaker ne propose malheureusement aucun mécanisme natif permettant de choisir les rubriques de tri de manière dynamique, ce qui force à concevoir des scripts de tri remplis de très nombreuses conditions afin de lancer le bon tri suivant l’en-tête de colonne cliquée, et donc la valeur passée en paramètre au script de tri.
Par bonheur, quelques techniques existent pour contourner partiellement cette limitation et ainsi bénéficier d’un choix dynamique pour les rubriques de tri.
Dans cet article nous allons explorer l’une de ces techniques, elle ne concernera que les développeurs et utilisateurs de FileMaker (FM) sous environnement macOs, car elle est basée sur la technologie AppleScript (AS).
Exécuter du code AppleScript dans et depuis FileMaker Pro est possible depuis les toutes premières versions du logiciel, cela reste encore l’un de ses points forts sous macOS (même si, pour des raisons de compatibilité avec d’autres plate-formes, il est hélas souvent délaissé dans les projets professionnels).
Nous allons donc voir comment mettre rapidement en place un script de tri dynamique et générique, utilisable tel quel dans tous vos modèles liste, avec juste un zeste de code AppleScript.
Pour commencer, de quoi allons nous avoir besoin ?
De très peu de choses : juste de deux rubriques globales de travail, qui peuvent être crées dans n’importe quelle table, mais qui trouveraient une place naturelle dans une table « Paramètres » (ou « Settings »).
Voici quelques explications à propos de ces deux rubriques (le suffixe « _g » est pour signaler leur portée globale) :
ObtenirCommeBooleen ( Contenu )
) ;Le principe est simple : on passe le nom complet (table::rubrique) de la rubrique à trier en paramètre au script FileMaker de tri, si ce nom est identique à celui déjà mémorisé dans la rubrique globale « tri_rubrique_g », alors on inverse tout simplement l’ordre de tri de la rubrique « tri_ordre_g ».
Si le nom passé en paramètre est différent de celui mémorisé, alors on mémorise ce nouveau nom dans la rubrique « tri_rubrique_g » et on règle la valeur de l’ordre de tri « tri_ordre_g » à 1 (tri ascendant par défaut).
Bon, pas trop compliqué jusqu’à là… voyons maintenant quel code AppleScript nous allons utiliser et comment l’exécuter…
FileMaker propose deux mécanismes pour exécuter un code AppleScript au sein d’un script avec l’action « Exécuter AppleScript » (présent dans la section « Divers » de la liste des actions) :
Nous allons donc utiliser du code AppleScript calculé, plus simple à implémenter avec le passage des paramètres.
Plusieurs techniques sont possibles, comme :
Comme ici nous travaillons en local, la solution 2 avec la rubrique globale est celle que nous allons utiliser, plus simple d’accès pour notre démo. En revanche, pour une utilisation avec des fichiers hebergés dans un serveur, la solution 3 avec une fonction personnalisée semble la plus appropriée.
Dans tous les cas, le code AppleScript demeure le même, seule la technique du passage des paramètres diffère.
Voyons donc notre code AppleScript avec quelques commentaires (précédés de deux tirets « –« ) pour bien comprendre le rôle de chaque instruction :
-- Structure 'try' de contrôle au cas où une erreur se produisait pendant l'exécution try -- On récupère les valeurs de la rubrique et de l'ordre de tri dans des variables AS -- Pour ce faire, on utilise deux balises, délimitées par deux caractères dièse "##", -- qui seront remplacées par les valeurs issues des rubriques globales de travail -- Le nom complet (table::rubrique) de la rubrique de tri set sRubrique to "##tri_rubrique##" -- Le numéro booléen correspondant à l'ordre de tri set nOrdre to ##tri_ordre## -- On active FileMaker pour lancer le tri tell current application -- On récupère la bonne propriété d'ordre de tri à utiliser set pOrdre to contents of item (nOrdre + 1) of {descending, ascending} -- On lance le tri dans le modèle actif sur la bonne rubrique et le bon ordre sort current layout by field sRubrique in order pOrdre end tell on error err_mssg number err_num -- On affiche un dialogue d'infos si une erreur se produit lors de l'exécution display dialog ("" & err_num & " : " & err_mssg) end try
Les deux balises « ##tri_rubrique## » et « ##tri_ordre## » seront remplacées avec la fonction « Substituer() », au sein du script FileMaker, par les valeurs issues des rubriques globales de travail « tri_rubrique_g » et « tri_ordre_g » respectivement.
Voyons maintenant de quoi il sera fait le code de notre script FileMaker…
Nous allons commencer par initialiser une variable « $rubrique » avec la valeur passée en paramètre au script. En effet, chaque bouton qui fera appel à ce script de tri, passera en paramètre le nom complet (table::rubrique) de la rubrique de tri.
Si le paramètre est vide, alors on annule le tri.
Comme expliqué plus haut, on défini l’ordre de tri selon que la valeur de la variable « $rubrique » et le contenu de la rubrique globale « tri_rubrique_g », si elles sont identiques, alors on se contente d’inverser l’ordre de tri, sinon, on règle l’ordre de tri à la valeur par défaut = 1 (tri ascendant).
Ensuite on rensigne la rubrique globale « tri_rubrique_g » avec la variable « $rubrique », on peut désormais faire le remplacement des balises « ## » dans le code AppleScript avant de lancer son exécution.
Voici le code du script FileMaker complet avec les commentaires :
# Commandes de contrôle… comme d'hab… Gestion erreurs [ Oui ] Autor. annulation utilisateur [ Non ] # # On récupère le paramètre de script et on efface tout éventuel espace de bord inutile Définir variable [ $rubrique ; Valeur: SupprimerEspace ( Obtenir ( ParamètreScript ) ) ] # # Si une touche morte est enfoncée ou si la rubrique de tri est vide, alors on initialise les rubriques globales, on annule le tri et on active le premier enregistrement Si [ ( Obtenir ( TouchesSpécialesActives ) ) Or ( EstVide ( $rubrique ) ) ] Définir rubrique [ Settings::tri_rubrique_g ; "" ] Définir rubrique [ Settings::tri_ordre_g ; 1 ] Annuler tri des enreg. Afficher enreg/requête/page [ Premièr(e) ] Fin de script [ Résultat de texte: "Annulation du tri…" ] Fin de si # # On défini et mémorise l'ordre de tri dans sa rubrique globale selon la rubrique de tri choisie : si même rubrique, alors on inverse l'ordre de tri, sinon on utilise la valeur par défaut 1 (ordre ascendant) Définir rubrique [ Settings::tri_ordre_g ; ObtenirCommeBooleen ( Si ( EstEgal ( $rubrique ; Settings::tri_rubrique_g ) ; Not Settings::tri_ordre_g ; 1 ) ) ] # # On mémorise la nouvelle rubrique de tri choisie dans sa rubrique globale Définir rubrique [ Settings::tri_rubrique_g ; $rubrique ] # # On valide tout ça… Valider enreg./requêtes [ Avec boîte de dialogue: Non ] # # On initialise une variable avec le code AppleScript à exécuter, en remplaçant au passage les balises par les vraies valeurs de travail Définir variable [ $applescript ; Valeur: Substituer ( Settings::tri_applescript_g ; [ "##tri_rubrique##" ; Settings::tri_rubrique_g ] ; [ "##tri_ordre##" ; Settings::tri_ordre_g ] ) ] # # On exécute le tri avec un AppleScript calculé Exécuter AppleScript [ $applescript ] # # À la fin du tri, on active le premier enregistrement Afficher enreg/requête/page [ Premièr(e) ] # Fin de script [ Résultat de texte: "Tri effectué…" ] # # Code récupéré grâce au plugin MBS
Petite subtitilité ergonomique, nous avons ajouté un test sur les éventuelles touches spéciales actives lors du clic sur les boutons de tri, cela permet d’annuler le tri par simple clic d’un en-tête de colonne avec une touche morte enfoncée (commande, contrôle, option ou shift), cela évite de passer par un bouton dédié (même si cela reste toujours intéressant à proposer, surtout nécessaire si votre solution est utilisée avec FileMaker Go).
Voyons maintenant comment implémenter tout ceci dans notre modèle…
Nous allons donc construire un modèle liste, dans notre fichier de démo (communes de France), nous avons placé 4 rubriques, à savoir :
Nous disposons donc, pour nos tests de tri, de deux rubriques de type texte (1 et 2) et de deux rubriques de type nombre (3 et 4).
Chaque en-tête de colonne sera donc un bouton qui lancera notre script FileMaker de tri, en passant comme paramètre le nom complet (table::rubrique) de la rubrique à trier (nous utilisons ici la fonction native ObtenirNomRubrique ( table::rubrique )
pour s’assurer d’avoir toujours le nom correct, quelque soient les modifications ultérieures).
Nous pouvons ajouter une mise en forme conditionnelle qui, en comparant le nom de la rubrique à trier avec celui existant dans la rubrique globale « tri_rubrique_g », pourra changer l’aspect du bouton pour bien visualiser sur quelle colonne le tri a bien été effectué.
Nous pouvons également ajouter un indicateur de l’ordre de tri, dans notre fichier de démo nous utilisons la valeur de la rubrique globale « tri_ordre_g » comme affichage booléen avec deux caractères unicode représentant des flêches, une vers le haut « ▲ » (tri ascendant), l’autre vers le bas « ▼ » (tri descendant). L’affichage de cet indicateur sera géré par un masquage conditionnel sur le même principe, mais inversé, que celui de la mise en forme conditionnelle.
Voilà, nous avons pratiquement fini, il suffit d’ajouter des sous-récapitulatifs après tri sur les rubriques dont nous désirons faire des regroupements, tel qu’illustré par Tanguy dans le premier opus de cette mini série sur le tri.
AppleScript offre beaucoup de possibilités avec FileMaker, comme celle présentée ici, même si d’autres solutions de tri dynamiques existent pour ce type d’utilisations en mode liste, certains natives FileMaker.
En tout cas, n’hésitez-pas à décortiquer le fichier de démo en pièce jointe ci-dessous, pour bien visualiser et comprendre toutes les techniques décrites ici, vous pourrez ensuite nous faire part de toutes vos questions et remarques dans les commentaires ci-dessous.
Téléchargez le fichier de démo ici : 1MT_Tri_S02E01.fmp12