Conférencier | Transcription |
| wendymurphrey | Bonjour et merci d'avoir participé à notre présentation aujourd'hui. Nous sommes ravis de discuter avec vous des scénarios courants rencontrés par les auteurs de scripts à différents niveaux d'expérience. |
| Notre intention 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 vérifier le journal pour les messages. Mais le journal contient des informations utiles sur les exécutions récentes de scripts. Examinons donc de plus près cet exemple dans JMP. |
| Ici, nous pouvons voir que le script ouvre simplement une table de données et tente de faire une sélection de ligne. Lorsque nous exécutons ce script, |
| nous obtenons un message d'erreur interactif pour l'erreur fatale, c'est-à-dire les situations où votre script s'arrête en raison de l'erreur. La fenêtre contextuelle est un nouveau comportement pour JMP 15, et cela peut être désactivé dans les préférences. |
| Lorsque nous rejetons ce message, nous pouvons vérifier le journal et nous voyons le même message de la fenêtre, mais nous voyons également le numéro de ligne |
| Trouvez le nom du fichier de script pour nous guider vers la zone problématique. Maintenant, 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 nécessairement une fenêtre contextuelle. Prenons donc 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. |
| 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. |
| Donc, le point important à retenir ici est de toujours vérifier le journal, surtout lorsque ce qui se passe ne répond pas à vos attentes. Cela peut être aussi simple qu'un nom de colonne mal orthographié. |
| Le concept de table de données courante est souvent décrit comme la table active. Mais qu'est-ce qui fait de la table la table de données active ou actuelle 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 actuelle. Mais il existe d'autres façons pour une table de devenir courante au moment de l'exécution que vous, en tant qu'auteur du script, n'auriez peut-être pas anticipées. |
| Leurs 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 provoquer une table différente de celle que vous vouliez activer au moment de l'exécution. Et cela peut entraîner l'échec de votre script, ou pire, vous ne réalisez même pas que JMP a utilisé la mauvaise table. |
| Donc ici, nous avons fourni quelques |
| meilleures pratiques pour concevoir vos scripts à l'aide de références spécifiques à des tables de données. C'est ainsi que vous pouvez vous assurer que la table correcte est utilisée, quelle que soit la table active au moment de l'exécution. |
| Dans cet exemple, nous montrons comment vous pouvez envoyer un appel bivarié à une table de données spécifique pour vous assurer 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 dans ce qui est actuel. |
| Vous pouvez également utiliser des références de table de données facultatives. Ici, nous montrons simplement comment vous pouvez l'utiliser pour référencer des colonnes et nous allons parler plus en détail du référencement des colonnes dans un instant. |
| Vous pouvez également utiliser des références de table de données facultatives dans les fonctions ; pour chaque ligne et résumer sont deux là où cela est disponible. |
| Nous aimerions également vous suggérer d'éviter d'utiliser une table de données... d'attribuer une référence de table de données à l'aide de la fonction de table de données actuelle dans vos scripts de production. Dans cet exemple, nous joignons deux tables de données et nous aimerions attribuer une référence à cette table |
| qui est créé à partir de la jointure. Maintenant, join renvoie une référence à la table nouvellement créée. Ainsi, au lieu d'attribuer à la table de données actuelle, nous souhaitons attribuer 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 de désir 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 votre utilisation prévue. |
| La fonction de colonne renvoie une référence à la colonne en tant qu'unité entière. Il accepte une variété d'arguments, tels que le nom de la colonne est une chaîne ou une variable de chaîne, |
| un index ou une variable numérique représentant un index. Il peut être indicé 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 les appels de plateforme, l'envoi de messages à une colonne ou l'affectation 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 tous les mêmes arguments que la fonction de colonne, mais il est important de comprendre que dans JMP, la ligne actuelle est toujours nulle, sauf gestion contraire. |
| Ainsi, certains bons endroits pour utiliser la fonction en tant que colonne sont dans les formules, pour chaque ligne, et sélectionnez où, car ils contrôlent la ligne au fur et à mesure qu'ils évaluent sur chaque ligne par leur conception. Jetons donc un coup d'œil à un exemple de ce que nous voulons dire. |
| Ici, nous ouvrons 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 de colonne dans notre select where. |
| Maintenant, lorsque nous exécutons ce script, nous constatons qu'aucune ligne n'a été sélectionnée. Pourquoi donc? Parce que sélectionnez où évalue sur chaque ligne, |
| l'utilisation de la fonction de colonne sans aucun indice ne sélectionnera aucune ligne. Et nous nous souvenons que la fonction de colonne renvoie une référence à la colonne en tant qu'unité entière, donc une colonne entière de données ne sera 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 les 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, à mesure que la valeur de la variable change, le résultat de la formule peut également changer. |
| Et à moins que vous ne regardiez la formule dans l'éditeur de formules, vous ne réaliserez peut-être pas que vous avez un problème. |
| Reprenons donc notre exemple. Ici, j'ouvre simplement une table de données et j'établis une liste de colonnes que je voudrais additionner. |
| Je crée ma nouvelle colonne de formule et j'utilise ma variable JSL dans ma fonction somme. Alors lançons ça. Et nous pouvons voir que notre nouvelle colonne a été créée et remplie de données. Mais regardons l'éditeur de formule. Nous n'avons jamais dit que notre variable JSL était utilisée dans la fonction somme. |
| Et lorsque nous rejetons cela et que nous modifions l'une des colonnes dépendantes, nous avons également remarqué que notre, notre formule de colonne n'était pas automatiquement mise à jour. |
| Alors, sauvegardons et fermons JMP, sauvegardons cette table et fermons JMP. |
| Et nous recommencerons. |
| N'oubliez pas que la durée de vie de cette variable JSL était limitée à la session JMP précédente. Alors ouvrons la table et regardons ce qui se passe. |
| Nous avons remarqué que nos formules de variable... de colonne n'étaient toujours pas évaluées à nouveau. Lorsque nous examinons cela, nous voyons toujours notre variable JSL, mais nous avons maintenant une ligne rouge en dessous. Et nous le survolons, nous voyons le nom d'erreur non résolue. |
| Si nous essayons de réévaluer la formule, nous obtenons le message d'erreur et en ignorant les erreurs, toutes nos données seront changées en manquantes. Alors, comment résoudre ce problème ? |
| Lorsque vous utilisez une variable dans une formule, vous devez faire quelque chose pour demander à JMP de remplacer la variable par sa valeur avant d'évaluer la formule. Vous pouvez utiliser un substitut pour cela, mais aujourd'hui, nous allons démontrer les fonctions d'expression. Fermons donc ce tableau. |
| Nous allons ouvrir une nouvelle copie du tableau et rétablir notre liste de colonnes. |
| Et maintenant, regardons comment nous travaillons autour de cela. |
| Ainsi, la fonction d'expression eval indique à JMP d'évaluer et de remplacer toutes les variables qu'il contient... dans son argument qui sont enveloppées dans une fonction EXPR. |
| Et puis il renverra l'expression non évaluée. Donc, dans ce code, JMP va remplacer l'expression scores SAT et la remplacer par notre liste de colonnes. |
| Exécutons donc uniquement cette section et voyons ce qui se passe. Et nous voyons que la fonction sum a maintenant notre liste de colonnes que nous voulons additionner au lieu de la variable. |
| Mais cela n'a pas créé la colonne pour nous. Il est simplement retourné cette expression. Donc, pour évaluer cela, nous ajoutons une fonction eval autour de notre fonction d'expression eval. |
| Et cela obligera JMP à évaluer l'intégralité de la nouvelle expression de colonne une fois le remplacement effectué. Donc, essentiellement, l'e-mail dit, exécutez... exécutez ce qui est renvoyé par l'expression eval, c'est-à-dire ceci. |
| Alors exécutons-le et nous pouvons voir que notre colonne a été créée et que nous avons les données comme prévu. |
| Et notre formule n'a plus notre variable, elle a notre liste de colonnes. |
| Et lorsque nous modifions les données d'une colonne dépendante, notre formule se met désormais à jour automatiquement. |
| Alors maintenant, je vais passer la parole à Justin pour parler de quelques erreurs supplémentaires à éviter. |
| Justin Chilton | D'accord, donc une autre erreur que nous voyons les gens faire est quand ils vont définir les propriétés de la colonne et la syntaxe peut être un peu délicate. Alors avant d'entrer dans les détails, |
| parlons de ce qu'est une colonne en termes de propriétés de colonne. Donc, essentiellement, une colonne n'est qu'un |
| référentiel pour ces informations de propriété. Il ne fait aucune vérification de syntaxe pour s'assurer que |
| ce que vous lui donnez est correct et cela lui permet de stocker tout ce que vous souhaitez. Et cela signifie que c'est parce que le consommateur de la propriété s'attend à ce que quelque chose soit dans un format spécifique, que ce soit une plate-forme JMP, en utilisant une propriété de colonne ou même une application JSL. |
| Jetons donc un coup d'œil à un exemple rapide. |
| Et ici, nous allons ouvrir une table que nous avons appelée propriétés de colonne, juste pour tester. Nous avons une colonne appelée NPN1 et une colonne appelée test. Et cette colonne a des limites de spécification et une propriété d'accès, mais nous voulons |
| ajoutez les propriétés de limite de spécification à tester. Donc nous avons ici, ce que nous pensons |
| est la syntaxe correcte pour définir les propriétés de colonne des limites de spécification. Nous exécutons ceci et ne nous donne pas d'erreur mais quand nous |
| regardez la colonne, il y a des limites de spécification sur cette colonne. |
| Et vous pouvez, mais vous pouvez dire que ce n'est pas correct. Lorsque nous avons demandé une analyse de capacité de processus avec nos limites de spécifications, |
| lorsque nous exécutons cela, nous en obtenons un pour NPN1 et nous n'en obtenons pas pour la colonne de test. C'est parce que ce qui est stocké dans la propriété spec limits pour la colonne de test n'est pas correct. |
| Donc, une façon de le faire 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, qui est la colonne que nous savons être correcte. Donc, si nous n'exécutons qu'une seule ligne, nous obtenons la syntaxe correcte. |
| Et cela nous montre en fait que cela devrait vraiment être sous forme de liste au lieu d'arguments séparés. Donc, d'une autre manière, si vous n'êtes pas familier avec la propriété get, vous pouvez accéder à la colonne dont vous savez qu'elle est correcte et copier les propriétés de la colonne. |
| Et ensuite, vous pouvez coller cela dans votre script et vous verrez que vous avez ajouté des propriétés de colonne ainsi que quelques propriétés définies. Donc, ajouter des propriétés de colonne n'est qu'un moyen de regrouper plusieurs propriétés d'ensemble. Nous pouvons supprimer cela et nous pouvons supprimer l'accès supplémentaire |
| propriété. Donc, une fois que nous avons fini de supprimer cela, nous pouvons utiliser cette propriété set pour l'envoyer à notre colonne de test avec l'opérateur d'envoi. Alors maintenant, quand nous exécutons ceci, |
| nous... c'est... il a écrasé nos limites de spécification, mais nous pouvons le confirmer en exécutant notre même distribution en utilisant nos limites de spécification. |
| Donc, et vous pouvez voir ici que nous avons notre analyse de capacité de processus pour nos deux colonnes. Ce n'est donc qu'un exemple de la façon d'obtenir des limites de spécification, mais la même chose peut s'appliquer à toute propriété de colonne que vous devez appliquer et obtenir la syntaxe pour JSL. |
| Donc, la prochaine erreur dont nous allons parler est la manipulation des commandes de répartition. Alors, qu'est-ce qu'une commande d'expédition ? |
| C'est la chose qui apparaît dans votre script enregistré lorsque vous enregistrez dans la fenêtre de script du menu triangle rouge ou dans le presse-papiers. |
| Et il apparaît lorsque vous ajoutez quelque chose comme une ligne de référence ou que vous modifiez autre chose comme la fermeture d'une zone de contour. Et cette commande a été développée comme un moyen interne pour JMP de pouvoir recréer des graphiques |
| avec la personnalisation que vous avez faite. Et il n'était pas prévu que les utilisateurs |
| personnalisez-le avec des variables dynamiques. Cela signifie donc que certains des arguments de la commande dispatch n'acceptent pas les variables JSL. Jetons donc un coup d'œil à un exemple où cela pourrait se produire. Voici donc un script. Nous avons un |
| table et une variable chaîne qui servira un peu plus tard. Et puis c'est essentiellement ce qui serait renvoyé par la fenêtre de sauvegarde dans le script. Donc, quand nous exécutons ceci, |
| nous pouvons voir que notre commande dispatch qui définit le min max et l'incrément pour l'axe de mesure |
| ici est réglé de zéro à 1,4. Nous pouvons maintenant voir que la commande dispatch s'appuie sur le |
| titre de la boîte de contour ici, mais ce titre de boîte de contour est en fait basé sur notre entrée y. Alors disons que nous voulions que ce soit une entrée dynamique d'un utilisateur et tout ce que nous avons, c'est cette variable. Nous pourrions utiliser la variable pour le Y. |
| Mais alors nous aurions également besoin d'utiliser le nom de cette colonne ici. Ainsi, lorsque nous exécutons cela, vous verrez en fait que nous n'obtenons pas les bons paramètres d'axe 0,4 à 1,2, ce qui n'est pas... ce qui signifie que ce que nous avons envoyé n'a pas été traité. |
| Il existe donc plusieurs façons de résoudre ce problème. Et le premier va utiliser la solution d'expression eval dont Wendy a parlé il y a quelques minutes. Donc ici vous voyez que nous avons la même expression eval. Nous voulons en fait envelopper la concaténation que nous avons essayée dans l'exemple précédent |
| ici. |
| Et donc l'expression eval dira évaluer tout cela. Ainsi, lorsque nous exécutons 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. Nous avons donc ici 0 à 1,4. C'est donc une façon. |
| Mais parfois, cela peut encore devenir un peu délicat. Et comment vous devriez vraiment manipuler ces commandes de répartition, car vous utilisez toujours les commandes de répartition et vous devez savoir comment elles fonctionnent. Donc, la façon la plus courante de procéder consiste à supprimer complètement cette commande this dispatch. |
| Donc, et utilisez ce que nous appelons l'indice de boîte d'affichage. Donc, ici, je vais exécuter ceci avec la commande dispatch supprimée et nous avons nos paramètres d'axe d'origine. |
| Et puis ce que nous allons faire c'est, avant que nous ne sachions vraiment comment écrire ceci, simplement en le regardant. Nous allons donc aller sur cette icône, cette boîte de contour, clic droit |
| modifier et afficher l'arborescence. Donc, cela nous montre la structure arborescente de la boîte d'affichage dans cette boîte de contour et dans cette boîte de contour, vous pouvez voir que cette boîte axix est celle que nous voulons changer. Donc, dans cette boîte de contour se trouve la boîte de l'axe un. |
| Alors nous pouvons aller écrire notre script. Nous utilisons cette fonction de rapport pour obtenir la couche de rapport de la plate-forme, OBJ1. |
| Ensuite, nous inscrivons pour obtenir le titre de la boîte de contour que nous savons qu'il devrait être, en fonction du nom de notre colonne. |
| Et puis, à l'intérieur de cela, 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 risquons moins d'avoir des problèmes. |
| Donc, à l'intérieur de cela, 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 informations de la commande dispatch et simplement les convertir les messages que nous envoyons à la boîte d'axe. |
| Et puis vous pouvez voir ici que maintenant nos paramètres d'axe sont de zéro à 1,4. |
| Donc, un autre moyen plus puissant de le faire consiste à utiliser XPath. Cela fait la même chose, mais peut être un peu plus compliqué, mais permet également plus de flexibilité pour les futures versions de JMP car vous pouvez utiliser des données sous-jacentes sur une boîte. |
| Donc, la dernière erreur dont nous allons discuter est d'utiliser uniquement l'espace de noms global. Donc |
| vous ne le savez peut-être pas, mais lorsque vous créez un symbole sans spécifier où il va, il va dans l'espace de noms global. C'est donc idéal pour les scripts rapides lorsque vous vous moquez de quelque chose 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 compléments que vous publiez sur la Communauté. |
| Donc, un peu plus de détails sur le fonctionnement de la portée et de la recherche de nom dans JMP. Vous commencez en bas ici dans ce diagramme. La portée locale peut être n'importe quel nombre de portées, avec lesquelles se trouvent 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, |
| puis il y a la portée ici, et qui existe essentiellement une par fichier. Et il y a la portée globale, qui est essentiellement une portée pour votre session de JMP. Et puis à droite, nous avons la portée de l'espace de noms, ce que vous devez vraiment rechercher explicitement afin de |
| accéder. Prenons un exemple. Cela va juste supprimer tous mes symboles et puisque je n'ai pas précisé où ils doivent aller, ça va aller dans les globals. Donc x vaut 5. Mais que se passe-t-il si quelqu'un d'autre a un script là-bas qui est comme, eh bien, moi aussi |
| avoir un |
| variable x que je veux utiliser. Et je ne vais pas préciser où le mettre. Je vais donc le mettre à 10. |
| Mais ensuite, lorsque vous revenez à votre script et qu'il s'agit peut-être d'une variable que vous avez définie, vous avez ensuite un rappel sur un bouton ... bouton |
| action qui repose sur cette variable, alors vous allez l'utiliser et la variable a changé sur vous et ce n'est probablement pas souhaité. |
| Alors, quels sont les moyens par lesquels nous pouvons résoudre ce problème ? Eh bien, la façon la plus simple de le faire est d'utiliser les noms par défaut ici (1). Cela signifie que rien ne se retrouvera dans la portée globale, à moins que vous ne lui disiez explicitement d'y aller. Alors jetons un coup d'oeil |
| à ceci |
| exemple. Donc, tout ce que nous avons fait est d'ajouter ce nom par défaut ici (1). Ça peut aller avec... généralement ça va en haut de votre script, mais ça peut vraiment aller n'importe où. |
| Je vais, je vais nettoyer mes symboles et mettre cette variable x égale à 5. Alors nous avons une autre écriture ici qui est |
| dit que dit que je veux accéder à votre, votre x. Mais vraiment, ce x ne peut jamais accéder à ce x dans cet espace de noms ici. Donc |
| copions une partie du script et faisons X égal à 50. |
| Et puis le X dans le script de droite est 50, mais cela n'a eu aucun effet sur le X dans notre script de gauche. C'est donc un excellent moyen de séparer facilement vos symboles des autres scripts et applications. |
| L'autre option consiste à utiliser un espace de noms personnalisé. C'est un peu plus avancé, mais cela peut être très puissant. Alors me revoici... efface mon |
| symboles, puis en créant un nouvel espace de noms, en définissant une variable x dans l'espace de noms et en l'affichant. Il a donc une valeur de 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 vous pouvez très bien le faire, car vous connaissez le nom de cela. Mais il est beaucoup moins probable qu'une personne malveillante modifie votre symbole à votre insu. Donc |
| Je peux changer ce symbole et ça va toujours être 10 mais si je fais juste X, ça 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. |
| wendymurphrey | Merci Justin. De nombreuses ressources sont à votre disposition pour en savoir plus sur JSL, et nombre d'entre elles sont gratuites. Ici, nous avons lié pour vous certains des endroits les plus courants pour rechercher et en savoir plus sur JSL. |
| Nous proposons également un support technique auquel vous pouvez vous adresser, et il existe également quelques livres sur le sujet. Bien sûr, nous vous encourageons toujours à consulter nos ressources de formation et les plans qu'ils ont là pour vous. |
| N'oubliez pas de consulter l'article associé à cette présentation sur la communauté JMP, car nous y avons abordé quelques erreurs supplémentaires, dont nous n'avons pas eu le temps de parler aujourd'hui. Merci d'avoir regardé. |