Nouvelle option de purge pour l’action de script “Boucle” / “Loop” de FileMaker

Selon les notes de mise à jour de FileMaker Pro de Claris pour la version 20.3.1,

L’option Purge comprend les trois valeurs suivantes :
1. Systématique : lors de la définition d’une rubrique dans une boucle, le lien est purgé avec les données de jointure.
2. Minimale : lors de la définition d’une rubrique dans une boucle, les données minimales sont purgées.
3. Différée : lors de la définition d’une rubrique dans une boucle, les données et les données de lien ne sont purgées qu’après avoir quitté la boucle.

Qu’est-ce que cela signifie et quel est l’impact sur vos solutions FileMaker ?

La nouvelle option de purge pour l’action de script Boucle

Comprendre les liens et les données de jointure

Nous pouvons utiliser les liens pour récupérer et afficher des données provenant de tables liées.

Dans ce scénario, considérez le lien comme un tunnel allant de l’enregistrement actuel de la table courante à la table liée, ce qui nous aide à localiser les enregistrements liés.

Chaque fois qu’un lien est établi, FileMaker l’utilise pour identifier les enregistrements liés, interroger les données liées et mettre en cache le résultat de la requête. Ces données d’enregistrements liés mises en cache sont appelées données de jointure.

Si nous mettons à jour la valeur de l’une des rubriques utilisées du côté gauche du lien, FileMaker devra rétablir le lien (trouver à nouveau des enregistrements liés) et interroger à nouveau les données de jointure (récupérer à nouveau les données des enregistrements liés via le lien).

Par exemple, j’ai un lien illustré dans la capture d’écran ci-dessous. Elle est utilisée pour afficher une liste d’enregistrements liés dans une table externe. Sur le côté gauche de la relation, j’utilise un champ global, zgtProjectCategoryFilter, pour n’afficher que les enregistrements liés dont la catégorie de projet correspond.

Une relation utilisée pour un portail filtrable

Dans le modèle, l’utilisateur peut définir la valeur de zgtProjectCategoryFilter sur l’une des trois valeurs à l’aide de ces boutons :

Chaque fois qu’un utilisateur modifie la valeur, FileMaker doit vider les données de jointure mises en cache, rétablir le lien et interroger à nouveau les données de jointure pour que la table externe affichée sur le modèle puisse obtenir l’effet de  » filtrage « .

Implication sur les performances

Maintenant que nous comprenons les relations et les données de jointure, quelles sont les implications de la nouvelle option de vidage ?

Imaginez que vous ayez un script qui tourne en boucle. Chaque fois qu’il boucle, il met à jour un champ sur le côté gauche d’une relation. Imaginez que cette rubrique soit utilisée dans plusieurs liens et qu’une grande quantité de données de jointure soit récupérée par l’intermédiaire de ces liens. Par défaut, FileMaker effectue une purge et une nouvelle requête chaque fois que la rubrique de gauche est mise à jour. Cela peut avoir de sérieuses répercussions sur les performances de votre solution, en particulier si elle est exécutée sur un réseau étendu/WAN (regardez cette vidéo pour comprendre pourquoi).

Avant la version 20.3.1, nous disposions d’un certain contrôle, mais limité, sur le moment où FileMaker mettait à jour les données de jointure (avec l’action de script Actualiser la fenêtre), mais pas lorsqu’il s’agit d’une boucle qui définit les rubriques utilisées dans les liens. Dans le cas d’un scénario en boucle, FileMaker procède toujours à une actualisation et à une nouvelle interrogation, quelle que soit la nécessité.

Avec la version 20.3.1, cette nouvelle fonctionnalité permet aux développeurs de contrôler le moment où FileMaker doit rétablir le lien et actualiser les données de jointure. Elle nous permet d’éviter les opérations de purge coûteuses lorsqu’elles ne sont pas nécessaires.

Jetons un second coup d’œil aux notes de mise à jour ; cette fois, vous devriez disposer d’un peu plus de contexte :

L’option Purge comprend les trois valeurs suivantes :
1. Systématique : lors de la définition d’une rubrique dans une boucle, le lien est purgé avec les données de jointure.
2. Minimale : lors de la définition d’une rubrique dans une boucle, les données minimales sont purgées.
3. Différée : lors de la définition d’une rubrique dans une boucle, les données et les données de lien ne sont purgées qu’après avoir quitté la boucle.

L’option Systématique est celle que nous avions avant cette version et c’est l’option par défaut. Si vous ouvrez une solution FileMaker utilisant la version 20.3.1+ de FileMaker Pro pour la première fois, toutes les options de vidange de la boucle seront définies sur Systématique. Cette option n’est pas utilisée lorsque c’est nécessaire, mais lorsqu’elle peut l’être.

Différée est rapide. Son comportement est simple : il essaiera de ne rien purger avant de sortir de la boucle. Il n’y aura qu’une seule purge, au total, à la fin.

Minimum est un peu mystérieux. Au moment de la publication de cet article, il n’y a pas de documentation officielle sur cette fonctionnalité autre que ce qui est cité ci-dessus. Le nom semble indiquer que cette option fait quelque chose d’intelligent pour minimiser la quantité de données de jointure purgées pendant la boucle. Sur la base de mes tests, je pense que son comportement se situe entre Systématique et Différée; Minimale essaie d’effectuer le moins de purge possible, à moins que d’autres actions de script dans la boucle ne requièrent une actualisation des liens.

Tests de comportement et de performance

Méthode de test

Pour tester cette fonctionnalité, j’ai utilisé un scénario similaire à celui que j’ai décrit ci-dessus : un champ qui fait partie de neuf relations différentes est mis à jour de manière répétée.

Dans l’exemple précédent, je n’ai montré qu’une seule relation avec le champ global. En réalité, j’en ai neuf.

Neuf relations qui utilisent le champ zgtProjectCategoryFIlter sur le côté gauche

Ce n’est probablement pas la façon la plus intelligente de construire une vue en grille dans FileMaker, mais elle est parfaite pour tester cette nouvelle fonctionnalité.

Le script de test que j’ai utilisé est illustré dans la capture d’écran ci-dessous. Il s’exécute à partir d’un modèle qui utilise ces liens pour afficher des données liées dans des tables externes. Le script effectue de nombreuses boucles et définit à chaque fois la rubrique zgtProjectCategoryFilter avec une valeur différente ; à la fin, il affiche le temps total nécessaire et la liste des données connexes récupérées.

Processus de test et données

Cas de test 1 – 999 boucles, récupération des données de jointure au milieu de la boucle et évaluation des portails

Pour le premier test, à l’intérieur de chaque boucle, j’ai essayé de récupérer une donnée de jointure et de l’enregistrer.

Script utilisé

Scénario de testSystématiqueMinimaleDifférée
1999 boucles
9 relations
23 enregistrements liés au maximum
2023-11-26
22 secondes
Les données récupérées en milieu de boucle sont exactes
18 secondes
Les données récupérées en milieu de boucle sont exactes
1 seconde
Les données récupérées en milieu de boucle ne sont PAS exactes.
2999 boucles
9 relations
13 enregistrements liés au maximum
2023-12-10
21 secondes
Les données récupérées en milieu de boucle sont exactes
18 secondes
Les données récupérées en milieu de boucle sont exactes
~0 seconde
Les données récupérées en milieu de boucle ne sont PAS exactes.
3999 boucles
5 relations
13 enregistrements liés
2023-12-24
21 secondes
Les données récupérées en milieu de boucle sont exactes
18 secondes
Les données récupérées en milieu de boucle sont exactes
~0 seconde
Les données récupérées en milieu de boucle ne sont PAS exactes.

Test 2 – 999 boucles, évaluation des portails uniquement

Maintenant, je vais désactiver l’étape qui récupère les données connexes au milieu de la boucle, en ne laissant que la mise en page qui utilise les données de jointure.

Script utilisé

Scénario de testSystématiqueMinimaleDifférée
1999 boucles
9 relations
23 enregistrements liés au maximum
1 seconde~0 seconde~0 seconde
2999 boucles
9 relations
13 enregistrements liés au maximum
~0 seconde~0 seconde~0 seconde
3999 boucles
5 relations
13 enregistrements liés
~0 seconde~0 seconde~0 seconde

Cas de test 3 – 99 900 boucles, évaluation des portails uniquement

Pour tester la surcharge introduite par les mises en page pendant les boucles, j’ai multiplié par cent le nombre total de boucles pour atteindre 99900.

Scénario de testSystématiqueMinimaleDifférée
199900 boucles
9 relations
23 enregistrements liés au maximum
50 secondes10 secondes8 secondes
299900 boucles
9 relations
13 enregistrements liés au maximum
49 secondes9 secondes9 secondes
399900 boucles
5 relations
13 enregistrements liés
47 secondes9 secondes9 secondes

Test bonus – 99 900 boucles, évaluation des portails uniquement et visualisation des données laissée accidentellement ouverte avec l’option « évaluation automatique » activée

Le fait d’avoir accidentellement laissé la visionneuse de données ouverte a considérablement ralenti le processus. Même si je ne l’utilise pas pour regarder des données de jointure pertinentes pour mon test.

Conclusions et considérations d’utilisation

  1. L’option Différée n’efface pas du tout les données de jointure au milieu de la boucle. C’est pourquoi, dans le cas de test 1, les données de jointure au milieu de la boucle récupérées avec l’option Différée sont inexactes.
    1. Cela confirme le comportement mentionné dans les notes de version.
    2. Cela explique également pourquoi cette option est la plus rapide des trois.
    3. Nous ne devrions utiliser l’option Différée que lorsque les données de jointure ne sont pas pertinentes pour la logique de la boucle. Sinon, nous obtiendrons des données erronées.
  2. L’option Systématique est la plus lente, comme nous nous y attendions.
  3. Les performances de l’option Minimale se situent entre Systématique et Différée.
    1. Elle tente de maintenir la précision de l’évaluation des données de jointure au milieu de la boucle, comme le montre le cas de test 1.
    2. Cependant, plus il y a de « données de jointure évitables », plus cette option devient performante, au point d’être comparable aux performances de l’option Différée (comparez les résultats des cas de test 1 et 3).
    3. Cela semble être l’option la plus évidente, mais ne me citez pas sur ce point. Attendons la documentation officielle qui clarifie le comportement avant de l’adopter en masse.
  4. Les différentes opérations qui s’appuient sur les relations ont des surcoûts de performance différents.
    1. La récupération explicite des données de jointure dans le script introduit un surcoût de performance beaucoup plus important que l’affichage des champs liés dans les modèles (comparez les résultats des cas de test 1 et 2).
    2. Le nombre de relations touchant le champ de mis à jour n’a pas beaucoup d’importance. Le nombre d’enregistrements liés a un peu d’importance. Cela est logique car le nombre d’enregistrements liés détermine le nombre de données de jointure pouvant être extraites (cas test 3).
    3. Le visualiseur de données modifie le comportement de FileMaker en matière d’évaluation et de purge (scénario de test bonus).

Une dernière chose

Inspiré par ce fil de discussion, nous pourrions utiliser cette nouvelle option de purge avec la technique de boucle à passage unique pour contrôler le comportement de la purge des données de jointure de l’ensemble du script.

J’espère que cet article vous éclairera sur cette nouvelle fonctionnalité.