| Conférencier |
Transcription |
| Wendy Murphy |
Bonjour et merci de votre participation à notre présentation aujourd'hui. Nous sommes ravis de discuter avec vous des scénarios courants rencontrés par les auteurs de scripts de tous niveaux. |
| |
Notre objectif est d'expliquer ce qui se passe afin que vous disposiez des outils et des connaissances nécessaires pour éviter ces erreurs. Alors, commençons. |
| |
Peut-être parce qu'il n'est pas ouvert par défaut, il est facile d'oublier de consulter les messages dans le journal. Pourtant, ce journal contient des informations utiles sur les exécutions récentes de scripts. Examinons donc cet exemple dans JMP de plus près. |
| |
Ici, nous voyons que le script ouvre simplement une table de données et tente de sélectionner une ligne. Lorsque nous exécutons ce script, |
| |
Nous obtenons un message d'erreur interactif en cas d'erreur fatale, c'est-à-dire lorsque votre script s'arrête à cause de l'erreur. La fenêtre contextuelle est une nouveauté de JMP 15, et elle peut être désactivée dans les préférences. |
| |
Lorsque nous fermons ce message, nous pouvons vérifier le journal et nous voyons le même message dans la fenêtre, mais nous voyons également le numéro de ligne |
| |
et le nom du fichier script pour nous guider vers la zone problématique. Ne vous fiez pas uniquement à ces fenêtres contextuelles, car d'autres messages importants apparaîtront également dans le journal. |
| |
et ils ne provoquent pas forcément l'apparition d'une fenêtre contextuelle. Prenons un autre exemple. |
| |
Dans ce script, l'auteur tente d'ouvrir une table, de créer une analyse et d'imprimer un message dans le journal. |
| |
Et lorsque nous exécutons ce script, nous remarquons tout de suite que notre analyse n’a pas été générée. |
| |
Donc encore une fois, nous vérifions le journal |
| |
et nous voyons qu'il y avait une colonne qui n'a pas été trouvée dans la table de données, mais le script a continué et a imprimé notre message dans le journal. |
| |
Il est donc important de toujours vérifier le journal, surtout si le résultat ne correspond pas à vos attentes. Il peut s'agir simplement d'une erreur dans le nom d'une colonne. |
| |
Le concept de table de données courante est souvent décrit comme la table active. Mais qu'est-ce qui fait d'une table une table de données active ou courante et pourquoi est-ce important pour votre script ? |
| |
Lorsqu'une table est ouverte, créée ou utilisée d'une autre manière, elle devient la table de données courante. Cependant, il existe d'autres façons de rendre une table courante à l'exécution, que vous, l'auteur du script, n'auriez peut-être pas anticipées. |
| |
Les tâches que JMP traite en arrière-plan. Par exemple, JMP peut avoir besoin d'évaluer une formule ou de mettre à jour une fenêtre. |
| |
Ce sont ces processus d'arrière-plan qui peuvent entraîner l'activation d'une table différente de celle que vous souhaitiez activer à l'exécution. Cela peut entraîner l'échec de votre script, ou pire, vous faire ignorer que JMP a utilisé la mauvaise table. |
| |
Nous avons donc ici fourni quelques |
| |
Bonnes pratiques pour créer vos scripts à partir de références spécifiques aux tables de données. Cela vous permettra de garantir l'utilisation de la bonne table, quelle que soit celle active à l'exécution. |
| |
Dans cet exemple, nous montrons comment vous pouvez envoyer un appel bivarié à une table de données spécifique pour garantir que les données de cette table sont utilisées pour votre analyse. |
| |
Vous pouvez également utiliser la nouvelle colonne comme message vers une table de données spécifique, ce qui garantira que votre nouvelle colonne est créée dans la table souhaitée et qu'elle n'ira pas vers ce qui est actuel. |
| |
Vous pouvez également utiliser des références facultatives à des tables de données. Nous allons ici simplement vous montrer comment les utiliser pour référencer des colonnes et nous reviendrons plus en détail sur le référencement des colonnes ultérieurement. |
| |
Vous pouvez également utiliser des références de table de données facultatives dans les fonctions ; pour chaque ligne et pour résumer, il y en a deux où cela est disponible. |
| |
Nous vous suggérons également d'éviter d'utiliser une table de données et d'y assigner une référence via la fonction de table de données courante dans vos scripts de production. Dans cet exemple, nous joignons deux tables de données et souhaitons y assigner une référence. |
| |
Créée à partir de la jointure, la jointure renvoie une référence à la table nouvellement créée. Ainsi, au lieu d'affecter la table de données actuelle, nous souhaitons affecter la référence lors de la création de la jointure. |
| |
Donc ici, nous faisons simplement notre affectation lorsque nous appelons la jointure, et lorsque nous exécutons ceci |
| |
nous pouvons voir qu'en effet notre nouvelle variable DT fait référence à la table souhaitée et qu'elle n'est pas affectée par la table actuelle. |
| |
Être capable d'identifier une colonne à l'aide d'une variable JSL est une tâche courante et la méthode que vous utilisez dépend de l'utilisation prévue. |
| |
La fonction column renvoie une référence à la colonne entière. Elle accepte divers arguments, tels que le nom de la colonne (une chaîne ou une variable de chaîne). |
| |
Un index ou une variable numérique représentant un index. Il peut être indexé pour référencer la valeur de la colonne sur une ligne spécifique. |
| |
Certains endroits où vous pouvez utiliser la fonction de colonne sont dans les appels de plateforme, l'envoi de messages à une colonne ou l'attribution d'une référence de variable à une colonne. |
| |
La fonction as column renvoie une référence à la valeur de la ligne actuelle |
| |
de la colonne spécifiée. Elle accepte les mêmes arguments que la fonction de colonne, mais il est important de comprendre que dans JMP, la ligne courante est toujours nulle, sauf indication contraire. |
| |
La fonction « as column » est particulièrement utile dans les formules, pour chaque ligne et « select where », car elle contrôle la ligne et évalue chaque ligne de par sa conception. Prenons un exemple. |
| |
Nous ouvrons ici un exemple de table de données. Nous avons attribué une variable JSL au nom d'une colonne et nous essayons d'utiliser la fonction column dans notre select where. |
| |
Lorsque nous exécutons ce script, nous constatons qu'aucune ligne n'a été sélectionnée. Pourquoi ? Parce que select where est évalué sur chaque ligne. |
| |
L'utilisation de la fonction de colonne sans indice ne sélectionnera aucune ligne. De plus, rappelons que la fonction de colonne renvoie une référence à la colonne entière ; une colonne entière de données ne sera donc jamais égale à 14. |
| |
Les solutions consistent donc à utiliser la fonction de colonne avec un indice de ligne (et cet indice de ligne signifie simplement la ligne actuelle, quelle qu'elle soit pendant l'évaluation de select where), ou vous pouvez utiliser la fonction as column pour sélectionner vos lignes. |
| |
L'utilisation d'une variable JSL dans des formules peut être problématique pour plusieurs raisons. La durée de vie d'une variable JSL est limitée à la session JMP en cours, et le résultat de la formule peut varier en fonction de la valeur de la variable. |
| |
Et à moins de regarder la formule dans l’éditeur de formules, vous ne vous rendrez peut-être pas compte que vous avez un problème. |
| |
Prenons notre exemple. Ici, j'ouvre simplement une table de données et je crée une liste de colonnes à additionner. |
| |
Je crée ma nouvelle colonne de formules et j'utilise ma variable JSL dans ma fonction somme. Exécutons-la. Nous constatons que notre nouvelle colonne a été créée et renseignée. Regardons l'éditeur de formules. Nous n'avons jamais précisé que notre variable JSL était utilisée dans la fonction somme. |
| |
Et lorsque nous rejetons cela et que nous apportons une modification à l’une des colonnes dépendantes, nous avons également remarqué que notre formule de colonne n’était pas automatiquement mise à jour. |
| |
Alors sauvegardons et fermons JMP, sauvegardons cette table et fermons JMP. |
| |
Et nous recommencerons. |
| |
Rappelons maintenant que la durée de vie de cette variable JSL était limitée à la session JMP précédente. Ouvrons la table et observons ce qui se passe. |
| |
Nous avons constaté que nos formules de colonne variable… n'étaient toujours pas évaluées. En y regardant de plus près, nous voyons toujours notre variable JSL, mais une ligne rouge apparaît en dessous. En passant la souris dessus, nous voyons l'erreur « nom non résolu ». |
| |
Si nous essayons de réévaluer la formule, nous obtenons un message d'erreur. Ignorer ces erreurs entraînera la perte de toutes nos données. Comment résoudre ce problème ? |
| |
Lorsque vous utilisez une variable dans une formule, vous devez indiquer à JMP de remplacer la variable par sa valeur avant d'évaluer la formule. Vous pouvez utiliser la fonction « substitut », mais aujourd'hui, nous allons illustrer les fonctions d'expression. Fermons donc ce tableau. |
| |
Nous allons ouvrir une nouvelle copie de la table et rétablir notre liste de colonnes. |
| |
Et maintenant, voyons comment nous pouvons contourner ce problème. |
| |
Ainsi, la fonction d'expression eval indique à JMP d'évaluer et de remplacer toutes les variables présentes dans son argument qui sont encapsulées dans une fonction EXPR. |
| |
Il renverra ensuite l'expression non évaluée. Dans ce code, JMP remplacera l'expression « Scores SAT » par notre liste de colonnes. |
| |
Exécutons donc cette section et voyons ce qui se passe. Nous constatons que la fonction somme contient désormais la liste des colonnes à additionner, au lieu de la variable. |
| |
Mais la colonne n'a pas été créée pour nous. L'expression a simplement été renvoyée. Pour l'évaluer, nous ajoutons une fonction d'évaluation autour de notre fonction d'expression d'évaluation. |
| |
Cela obligera JMP à évaluer l'intégralité de la nouvelle expression de colonne après le remplacement. En résumé, l'e-mail indique : exécutez ce qui est renvoyé par l'expression d'évaluation, soit ceci. |
| |
Exécutons-le donc et nous pouvons voir que notre colonne a maintenant été créée et que nous avons les données comme nous l'attendons. |
| |
Et notre formule n'a plus notre variable, elle a notre liste de colonnes. |
| |
Et lorsque nous apportons une modification aux données d’une colonne dépendante, notre formule se met désormais à jour automatiquement. |
| |
Je vais maintenant laisser la parole à Justin pour qu'il parle de quelques erreurs supplémentaires à éviter. |
| Justin Chilton |
Bon, une autre erreur que l'on voit souvent concerne la définition des propriétés des colonnes, et la syntaxe peut être un peu complexe. Avant d'entrer dans les détails, |
| |
Parlons maintenant de ce qu'est une colonne en termes de propriétés. En résumé, une colonne est simplement un |
| |
référentiel pour ces informations de propriété. Aucune vérification de syntaxe n'est effectuée pour garantir que |
| |
Ce que vous lui donnez est correct, ce qui lui permet de stocker tout ce que vous souhaitez. Cela signifie que le consommateur de la propriété s'attend à un format spécifique, qu'il s'agisse d'une plateforme JMP, d'une propriété de colonne ou même d'une application JSL. |
| |
Prenons donc un exemple rapide. |
| |
Ici, nous allons ouvrir une table appelée « propriétés de colonne », uniquement à des fins de test. Nous avons une colonne appelée NPN1 et une colonne appelée « test ». Cette colonne possède des limites de spécification et une propriété d'accès. Nous souhaitons |
| |
Ajoutez les propriétés de limite de spécification à tester. Voici donc ce que nous pensons. |
| |
La syntaxe correcte pour définir les propriétés de la colonne « limites de spécification » est la suivante. Nous l'exécutons sans générer d'erreur, mais lorsque nous |
| |
regardez la colonne, il y a des limites de spécifications sur cette colonne. |
| |
Et c'est possible, mais on voit bien que ce n'est pas correct. Quand nous avons demandé une analyse de capabilité du processus avec nos limites de spécifications, |
| |
Lorsque nous exécutons cette commande, nous obtenons une valeur pour NPN1, mais pas pour la colonne de test. Cela est dû au fait que les valeurs stockées dans la propriété de limites de spécification pour la colonne de test sont incorrectes. |
| |
Donc, une façon de procéder si vous savez déjà comment utiliser les limites de spécification des propriétés définies, |
| |
Vous pouvez simplement envoyer le message de propriété à la colonne NPN1, celle que nous savons être correcte. Ainsi, en exécutant uniquement cette ligne, nous obtenons la syntaxe correcte. |
| |
Cela montre que la requête doit être présentée sous forme de liste plutôt que d'arguments séparés. Si vous ne connaissez pas la propriété get, vous pouvez également accéder à la colonne que vous connaissez et copier ses propriétés. |
| |
Vous pouvez ensuite coller ces informations dans votre script et vous constaterez que vous avez ajouté des propriétés de colonne et défini quelques propriétés. L'ajout de propriétés de colonne permet donc de regrouper plusieurs propriétés définies. Nous pouvons supprimer cela et supprimer l'accès supplémentaire. |
| |
Propriété. Une fois cette propriété supprimée, nous pouvons utiliser cette propriété set pour l'envoyer à notre colonne de test avec l'opérateur send. Lorsque nous exécutons ceci, |
| |
nous... c'est... cela a écrasé nos limites de spécifications, mais nous pouvons le confirmer en exécutant notre même distribution en utilisant nos limites de spécifications. |
| |
Vous pouvez voir ici que nous avons notre analyse de capacité de processus pour nos deux colonnes. Ce n'est qu'un exemple d'obtention des limites de spécification, mais cela peut s'appliquer à toute propriété de colonne dont vous devez appliquer la syntaxe en JSL. |
| |
L'erreur suivante que nous allons aborder concerne la manipulation des commandes de répartition. Qu'est-ce qu'une commande de répartition ? |
| |
C'est ce qui apparaît dans votre script enregistré lorsque vous effectuez l'enregistrement dans la fenêtre de script ou l'enregistrement dans le presse-papiers du menu du triangle rouge. |
| |
Elle apparaît lorsque vous ajoutez une ligne de référence ou modifiez un élément, comme la fermeture d'un cadre. Cette commande a été développée pour permettre à JMP de recréer des graphiques en interne. |
| |
avec la personnalisation que vous avez effectuée. Et il n'était pas prévu que les utilisateurs |
| |
Personnalisez ceci avec des variables dynamiques. Cela signifie que certains arguments de la commande dispatch n'acceptent pas les variables JSL. Voyons un exemple où cela pourrait se produire. Voici un script. Nous avons un |
| |
table et une variable chaîne que nous utiliserons plus tard. Voici donc le résultat de la fenêtre d'enregistrement du script. Ainsi, lorsque nous exécutons ceci : |
| |
nous pouvons voir que notre commande de répartition qui définit le min max et l'incrément pour l'axe de mesure |
| |
La valeur est définie ici de zéro à 1,4. Nous pouvons maintenant constater que la commande dispatch repose sur |
| |
Le titre de la zone de contour est ici, mais ce titre est en fait basé sur notre entrée Y. Imaginons que nous souhaitions une entrée dynamique d'un utilisateur et que nous disposions uniquement de cette variable. Nous pourrions utiliser cette variable pour Y. |
| |
Mais nous devons également utiliser le nom de cette colonne. Lors de l'exécution, vous constaterez que les paramètres d'axe (0,4 à 1,2) ne sont pas corrects, ce qui signifie que l'envoi n'a pas été traité. |
| |
Il existe plusieurs solutions. La première consiste à utiliser la solution d'expression d'évaluation dont Wendy a parlé il y a quelques minutes. Nous avons ici la même expression d'évaluation. Nous souhaitons en fait encapsuler la concaténation que nous avons essayée dans l'exemple précédent. |
| |
ici. |
| |
Ainsi, l'expression eval indiquera d'évaluer l'ensemble. Ainsi, lorsque nous exécuterons eval EXPR, |
| |
il remplace simplement tout cela par notre chaîne concaténée et ensuite, rappelez-vous quand nous faisons l'évaluation, |
| |
Il exécute cette expression. Ici, nous avons 0 à 1,4. C'est donc une façon de procéder. |
| |
Mais parfois, cela peut devenir un peu délicat. Comment manipuler ces commandes de répartition ? On les utilise toujours et il faut savoir comment elles fonctionnent. La méthode la plus courante consiste donc à supprimer complètement cette commande. |
| |
Nous utilisons donc ce que nous appelons l'indexation des zones d'affichage. Je vais donc exécuter cette commande avec la commande dispatch supprimée, et nous obtenons nos paramètres d'axe d'origine. |
| |
Et puis, avant, on ne sait pas vraiment comment écrire, rien qu'en le regardant, on va aller sur cette icône, ce cadre, et faire un clic droit. |
| |
Modifier et afficher l'arborescence. Ceci nous montre l'arborescence de la zone d'affichage dans ce cadre. Dans ce cadre, vous pouvez voir que la zone d'axe est celle que nous souhaitons modifier. Dans ce cadre se trouve également la zone d'axe 1. |
| |
Nous pouvons alors écrire notre script. Nous utilisons cette fonction de rapport pour obtenir la couche de rapport de la plateforme, OBJ1. |
| |
Ensuite, nous souscrivons pour obtenir le titre de la zone de contour que nous savons qu'il devrait être, en fonction du nom de notre colonne. |
| |
Et puis, dans ce cadre, nous voulons... et nous voulons être aussi précis que possible, de sorte que si les choses changent dans une future version de JMP, nous soyons moins susceptibles d'avoir des problèmes. |
| |
Donc, dans ce cadre, nous voulons la boîte d'axe 1 et c'est ainsi que nous obtenons cette boîte d'axe, puis nous pouvons prendre les mêmes éléments d'information de la commande dispatch et simplement les convertir en messages que nous envoyons à la boîte d'axe. |
| |
Et puis vous pouvez voir ici que maintenant nos paramètres d'axe vont de zéro à 1,4. |
| |
Une autre méthode plus puissante consiste à utiliser XPath. Ce processus fonctionne de la même manière, mais peut être un peu plus complexe, tout en offrant une plus grande flexibilité pour les futures versions de JMP, car il permet d'utiliser les données sous-jacentes d'une boîte. |
| |
La dernière erreur que nous allons aborder est l'utilisation exclusive de l'espace de noms global. |
| |
Vous l'ignorez peut-être, mais lorsque vous créez un symbole sans préciser son emplacement, il est placé dans l'espace de noms global. C'est donc idéal pour les scripts rapides, notamment pour la création d'une maquette pour votre usage personnel. |
| |
mais ce n'est peut-être pas une bonne idée pour les scripts que vous envoyez à des collègues ou les scripts que vous publiez ou les modules complémentaires que vous publiez sur la Communauté. |
| |
Voici quelques détails supplémentaires sur le fonctionnement de la portée et de la recherche de nom dans JMP. Commencez par le bas de ce diagramme. La portée locale peut être constituée de n'importe quel nombre de portées, parmi lesquelles des fonctions et une boîte locale. |
| |
Donc au-dessus de cela, s'il ne trouve pas le symbole ou si vous ne l'avez pas spécifié pour aller en local selon que vous écrivez ou lisez, |
| |
Ensuite, il y a la portée « ici », qui existe essentiellement une par fichier. Et il y a la portée globale, qui correspond essentiellement à une portée pour votre session JMP. Et enfin, à droite, nous avons la portée de l'espace de noms, qu'il faut rechercher explicitement pour |
| |
Accès. Prenons un exemple. Cela va simplement supprimer tous mes symboles et, comme je n'ai pas spécifié où les placer, ils seront placés dans les variables globales. Donc x vaut 5. Mais que se passe-t-il si quelqu'un d'autre a un script qui dit : « Eh bien, moi aussi » |
| |
avoir un |
| |
La variable x que je souhaite utiliser. Je ne vais pas préciser où la placer. Je vais donc la définir à 10. |
| |
Mais ensuite, lorsque vous revenez à votre script et que vous avez peut-être défini une variable, vous avez un rappel sur un bouton... bouton |
| |
action qui s'appuie sur cette variable, puis vous allez l'utiliser et la variable a changé sur vous et ce n'est probablement pas souhaité. |
| |
Comment pouvons-nous résoudre ce problème ? Le plus simple est d'utiliser les noms par défaut here(1). Cela signifie que rien ne sera placé dans la portée globale, sauf si vous lui indiquez explicitement d'y aller. Voyons cela. |
| |
à ce sujet |
| |
Exemple. Nous avons simplement ajouté ce nom par défaut à here(1). Il peut être placé… généralement en haut de votre script, mais il peut être placé n'importe où. |
| |
Je vais nettoyer mes symboles et définir cette variable x égale à 5. Nous avons donc ici un autre passage des Écritures qui est |
| |
dit que je veux accéder à ton x. Mais en réalité, ce x ne peut jamais accéder à ce x dans cet espace de noms. Donc |
| |
copions une partie du script et faisons X égal à 50. |
| |
Le X du script de droite est donc 50, mais cela n'a aucun effet sur le X de notre script de gauche. C'est donc un excellent moyen de distinguer facilement vos symboles des autres scripts et applications. |
| |
L'autre option consiste à utiliser un espace de noms personnalisé. C'est un peu plus complexe, mais cela peut s'avérer très puissant. Me revoilà donc… |
| |
symboles, puis créer un nouvel espace de noms, y définir une variable x et l'afficher. Sa valeur est donc cinq. |
| |
Et vous avez un autre script ici. C'est peut-être l'un de vos scripts et vous savez que |
| |
myNS existe. Vous pouvez donc essayer d'y accéder, et c'est tout à fait possible, car vous connaissez son nom. Mais il est beaucoup moins probable qu'une personne malveillante modifie votre symbole à votre insu. |
| |
Je peux changer ce symbole et ce sera toujours 10, mais si je fais juste X, cela n'aura pas vraiment d'effet sur le résultat du X de l'espace de noms. |
| |
Je vais renvoyer la parole à Wendy, qui va nous parler de certaines ressources négligées. |
| Wendy Murphy |
Merci, Justin. De nombreuses ressources sont à votre disposition pour en savoir plus sur JSL, et beaucoup sont gratuites. Nous vous proposons ici quelques-unes des ressources les plus courantes pour en savoir plus sur JSL. |
| |
Nous proposons également une assistance technique à laquelle vous pouvez faire appel, ainsi que quelques ouvrages sur le sujet. Bien entendu, nous vous encourageons à consulter nos ressources de formation et les plans qui vous sont proposés. |
| |
N'oubliez pas de consulter l'article associé à cette présentation sur la communauté JMP, car il contient quelques erreurs supplémentaires que nous avons abordées pour vous, mais que nous n'avons pas eu le temps d'aborder aujourd'hui. Merci de votre attention. |