J'ai mentionné quelques sujets possibles dans l'un de mes e-mails mais voici quelques idées :
- Utiliser des références
- dt = Open()... et ainsi de suite au lieu de Current Data Table()
- Trouver des références aux rapports/dans la couche de rapport de manière robuste
- Gestion des espaces de noms/portées
- Initialisation des variables
- Trouver un style de programmation
- écrire les globales en MAJUSCULES
- Utiliser des expressions
- Essayer-Catch
- Enregistrement
- Afficher, écrire, imprimer, enregistreur personnalisé
- Utiliser la pile
- Variables dans les boutons/fenêtres
- Surtout au retour de fonction
- Boîte de contexte(), fenêtre :
- Bouton - Chemins
- Scripts d'empaquetage
- Au lieu d'avoir un script massif créé par JMP, séparez les parties de celles-ci dans des scripts plus robustes.
- Les meilleures pratiques
- Évitez d'effacer/supprimer les symboles/globaux
- Ne quittez pas les scripts Clear Log dans
- Verrouillage des variables/espaces de noms
- Chemins
- Convertir le chemin du fichier
- Répertoire par défaut
- $PATH_VARIABLES
- Référencement des colonnes
- Column(dt, "colname") vs dt:colname vs :colname, vs dt:"colname"n (et AsColumn) et ainsi de suite...
- Mathématiques à virgule flottante
- Regardez avant de vous lancer vs Il est plus facile de demander pardon que la permission lors de l'écriture de code
- Valeurs manquantes/vides
- Est vide (), est manquant (), si, IfMZ, N éléments () > 0
- Vérification des tables ouvertes, des rapports ouverts, des fenêtres personnalisées déjà ouvertes,...
- << Amener la fenêtre au premier plan
- Throw() dans .jsl vs jmpaddin
- Fonction de fenêtre modale personnalisée
- Améliorer (et utiliser) les scripts créés par JMP
- Ajout de références/variables
- Raccourcir les scripts créés par JMP
- Éviter l'expédition
- Comment les préférences des utilisateurs peuvent les affecter (ce qui provoque généralement de très gros problèmes)
- Comprendre et utiliser les structures de données
- Par exemple, pas besoin de tout stocker dans des noms de variables différents (surtout pas lors de l'utilisation d'Eval Parse)
- Utiliser des listes/tableaux associatifs
- Si vous parlez d'interface utilisateur, pourriez-vous faire référence à des références lorsqu'elles sont nécessaires
Messages partiellement liés (pourraient paraître extrêmement compliqués en raison des "nouvelles" pages de la communauté JMP)
THX, ici, je peux partager certains des miens, mais la plupart de ce que je fais est déjà mentionné ci-dessus :
- Essayez(close(dt_ref,nosave)); dt_ref = Open(...) --> nettoie une table et ne produit pas d'erreur lorsque le script est exécuté pour la première fois. Le problème est que vous pouvez renommer la table mais JSL la fermera toujours puisque la référence dt change également.
- Utilisez toujours l'onglet pour identifier les boucles et fonctions les plus importantes afin de ne pas vous perdre dans le code et de rechercher un élément manquant );
- Pensez à renommer les colonnes après une étape de tabulation si vous voyez la possibilité d'une utilisation multilingue. Cela peut casser le code d'un autre utilisateur, mais le vôtre fonctionne correctement.
- Try to dynamically work with reference in platform to avoid user inputs.
You could do this:
dt << Process screening(Process Variables({:Column 4, :Column 6, :Column 7}));
But you can also use this:
dt = current data table();
col_names = dt << get column names();
spec_list = {};
for(k=1,k<=nitems(col_names),k++,
if(!isempty(column(dt,k) << Get Property("Speclimits")),insertinto(spec_list,col_names[k]);););
dt << Process screening(Process Variables(eval(spec_list)));
altering a column name will then not break the code and the question about missing spec limits will not be triggered. -
Je vais probablement choisir quelque chose comme "attaché" (je n'aurai certainement pas assez de temps pour les parcourir tous, mais cela ne devrait pas poser de problème). J'aurais peut-être fini avec quelque chose comme "conseils pour JSL", mais il m'a fallu suffisamment de temps pour créer cela.
Merci Jarmo, quelques réflexions sur le script :
ligne 103 : je l'utilise uniquement lorsque la boucle est très courte avec une seule ligne à exécuter. Cela garde le code un peu plus à jour.
ligne 109 : avec des noms courts, vous pouvez rencontrer le problème de remplacer une fonction JMP par une variable comme mean = (x1 + x2) / 2 ; il est préférable d'écrire m_production_speed ou mean_production_speed.
ligne 149 : j'ai pris l'habitude de commenter une boucle if juste après la virgule pour le pliage du code :
Si vous écrivez le code comme ceci :
if(1,//average of x
mean_x = mean(x);
);
et vous pliez le code, il ressemblera à ceci :

Cela m'épargne une ligne au-dessus de la boucle for ou de l'instruction if.
ligne 198 : " Initialisons la matrice, car si elle est créée à l'avance, son remplissage sera plus rapide ". ça m'a pris 1 minute avec copilot, je ne peux pas imaginer déboguer un code avec 200 commentaires *g*.
ligne 212 : Je voudrais mentionner que vous pouvez utiliser le journal et le flux de travail comme référence, puis modifier le code selon votre style de programmation. C'est particulièrement le cas lorsque je demande à un utilisateur non-programmeur de créer un flux de travail de ce qu'il souhaite réaliser avec le script que je dois programmer pour lui. J'ai donc une bonne compréhension de ce qu'il veut et j'ai déjà codé la plupart des fonctions.
ligne 391 : cela peut accélérer le script lorsque vous parcourez une table tout en ayant un générateur de graphiques ouvert afin qu'il ne mette pas à jour le graphique à chaque modification.
Names Default To Here( 1 );
try(close(dt,nosave));
dt = new table("test");
dt << New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
<<SET initial="" data="https://community.jmp.com/"></SET><SPAN>ligne 414 : En plus de cela, j'ajouterais : ajoutez toujours une référence de table lorsque vous donnez un nom fixe lorsque vous utilisez des fonctions comme << Subset et ainsi de suite) cela est très utile lorsque le nom de génération existe déjà et que JMP ajoute automatiquement le « 2 » à la fin. Sans référence, vous risquez de travailler accidentellement sur la mauvaise table.</SPAN>
<SPAN>ligne 74 : c'est quelque chose que je vais voler pour mes scripts</SPAN>:)</img>
<SPAN>ligne757 : cela peut également parfois ralentir les boucles for. mais c'est utile lorsqu'il s'agit d'instructions SQL, car l'envoi d'une requête peut dépasser le reste du script et provoquer une erreur car l'obtention des données peut prendre un certain temps, mais cela fonctionne bien lors de l'exécution du code ligne par ligne.</SPAN>
line 780: maybe referencing to the JSL cook book? <A href="https://community.jmp.com/t5/JSL-Cookbook/tkb-p/jmp-scripting" target="_blank">Livre de recettes JSL – Communauté d'utilisateurs JMP</A>
line 787: Just be aware that this will also break when a report reference name contains a variable.
This is what happened here: <A href="https://community.jmp.com/t5/Discussions/fitting-truncated-data-to-a-continuous-distribution/m-p/772495#M95287" target="_blank">Ré: Adaptation de données tronquées à une distribution continue - Communauté d'utilisateurs JMP</A>
the detection limits is added with censored data in the title and can change depending on the data set.
THX a lot for the script.<BR /><BR />Regards<BR /> Mauro
ligne 787
C'est exactement la raison pour laquelle j'utilise presque toujours XPath avec l'attribut helpKey s'il est disponible (je ne me soucie pas du titre de la zone de contour). Il y a tellement de façons (d'essayer) de construire des références robustes que je pourrais passer environ 20 minutes avec des exemples à ce sujet.
Par exemple, avec les limites de détection, j'utiliserais soit la clé d'aide, soit des caractères génériques (si je savais que le nom de la zone de contour peut changer...)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
Column(dt, "height") << Set Property("Detection Limits", {60, 100});
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Process Capability(0),
Fit Normal
)
);
obs = Report(dist) << XPath("//OutlineBox[@helpKey='FitDistributions']");
show(obs << get title);
// Or
ob = Report(dist)[OutlineBox("Fitted Normal Distribution?")];
show(ob << get title);
// Or
obs2 = Report(dist) << XPath("//OutlineBox[contains(text(), 'Fitted Normal Distribution')]");
show(ob << get title);
</CODE></P>
<P>I also added few things based on your comments. Thanks!<CODE class=" language-jsl">