Ich habe in einer meiner E-Mails einige mögliche Themen erwähnt, aber hier sind einige Ideen:
- Verwenden von Referenzen
- dt = Open()... und so weiter anstelle von Current Data Table()
- Robustes Suchen von Verweisen auf Berichte / in der Berichtsebene
- Namespace/Bereiche verwalten
- Initialisieren von Variablen
- Programmierstil finden
- schreibe Globale in GROSSBUCHSTABEN
- Ausdrücke verwenden
- Versuchen-Fangen
- Protokollierung
- Anzeigen, Schreiben, Drucken, benutzerdefinierter Logger
- Stapel verwenden
- Variablen in Schaltflächen / Fenstern
- Besonders bei der Rückkehr von der Funktion
- Kontextbox(), Fenster:
- Schaltfläche - Pfade
- Verpackungsskripte
- Anstatt umfangreiche, mit JMP erstellte Skripte zu erstellen, können Sie Teile davon in robustere Skripte aufteilen.
- Empfohlene Vorgehensweise
- Vermeiden Sie das Löschen von Symbolen/Globalen
- Lassen Sie keine Clear Log-Skripte
- Sperren von Variablen/Namespaces
- Pfade
- Dateipfad konvertieren
- Standardverzeichnis
- $PATH_VARIABLES
- Spalten referenzieren
- Column(dt, "colname") vs. dt:colname vs. :colname, vs. dt:"colname"n (und AsColumn) und so weiter …
- Gleitkommamathematik
- Erst nachdenken, dann handeln vs. Beim Schreiben von Code ist es einfacher, um Vergebung zu bitten als um Erlaubnis
- Fehlende / Leere Werte
- Ist leer(), Fehlt(), Wenn, WennMZ, N Elemente() > 0
- Suche nach offenen Tabellen, offenen Berichten, bereits geöffneten benutzerdefinierten Fenstern usw.
- << Fenster in den Vordergrund bringen
- Throw() in .jsl vs. jmpaddin
- Benutzerdefinierte modale Fensterfunktion
- Verbessern (und Verwenden) von JMP-Skripten
- Hinzufügen von Referenzen/Variablen
- Verkürzung von mit JMP erstellten Skripten
- Versand vermeiden
- Wie Benutzereinstellungen diese beeinflussen können (was normalerweise sehr große Probleme verursacht)
- Datenstrukturen verstehen und nutzen
- Beispielsweise ist es nicht nötig, alles unter unterschiedlichen Variablennamen zu speichern (insbesondere nicht bei Verwendung von Eval Parse).
- Verwenden Sie Listen/assoziative Arrays
- Wenn es um die Benutzeroberfläche geht, können bei Bedarf Referenzen gegeben werden.
Teilweise verwandte Beiträge (könnten aufgrund der „neuen“ JMP-Community-Seiten äußerst unübersichtlich aussehen)
THX, hier kann ich einiges von meinen teilen, aber das meiste, was ich tue, ist oben bereits erwähnt:
- Try(close(dt_ref,nosave)); dt_ref = Open(...) --> bereinigt eine Tabelle und erzeugt keinen Fehler, wenn das Skript zum ersten Mal ausgeführt wird. Das Problem ist, dass Sie die Tabelle zwar umbenennen können, JSL sie aber trotzdem schließt, da auch die dt-Referenz wechselt.
- Verwenden Sie immer die Tabulatortaste, um größere Schleifen und Funktionen zu identifizieren, damit Sie sich nicht im Code verlieren und nach einem fehlenden ) suchen müssen.
- Erwägen Sie die Umbenennung von Spalten nach einem Tabellierungsschritt, wenn Sie die Möglichkeit für die Verwendung mehrerer Sprachen sehen. Dies kann den Code eines anderen Benutzers beschädigen, aber Ihrer funktioniert einwandfrei.
- 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. -
Ich werde höchstwahrscheinlich etwas wie „angehängt“ verwenden (ich werde definitiv nicht genug Zeit haben, um alles durchzugehen, aber das sollte kein Problem sein). Vielleicht wäre es etwas wie „Tipps für JSL“ geworden, aber es hat schon genug Zeit gekostet, das zu erstellen.
Danke, Jarmo, einige Gedanken zum Skript:
Zeile 103: Ich verwende dies nur, wenn die Schleife sehr kurz ist und nur eine Zeile ausgeführt werden muss. Dadurch bleibt der Code etwas übersichtlicher.
Zeile 109: Bei Kurznamen kann es zu Problemen kommen, wenn Sie eine JMP-Funktion mit einer Variablen wie „Mittelwert = (x1 + x2)/2“ überschreiben möchten. Schreiben Sie besser „m_production_speed“ oder „mean_production_speed“.
Zeile 149: Ich habe mir angewöhnt, zum Code-Falten eine if-Schleife direkt nach dem Komma zu kommentieren:
Wenn Sie den Code wie folgt schreiben:
if(1,//average of x
mean_x = mean(x);
);
und Sie falten den Code, dann sieht er folgendermaßen aus:

Dadurch spare ich eine Zeile über der For-Schleife oder der If-Anweisung.
Zeile 198: „ Lasst uns die Matrix initialisieren, denn wenn sie im Voraus erstellt wird, lässt sie sich schneller füllen.“ Das hat bei mir mit Copilot 1 Minute gedauert, ich kann mir nicht vorstellen, einen Code mit 200 Kommentaren zu debuggen *g*.
Zeile 212: Ich möchte erwähnen, dass Sie Protokoll und Workflow als Referenz verwenden und den Code dann an Ihren Programmierstil anpassen können. Dies ist insbesondere dann der Fall, wenn ich nicht programmierende Benutzer auffordere, einen Workflow dessen zu erstellen, was sie mit dem Skript erreichen möchten, das ich für sie programmieren soll. So habe ich ein gutes Verständnis davon, was sie wollen, und habe die meisten Funktionen bereits codiert.
Zeile 391: Dies kann das Skript beschleunigen, wenn Sie eine Tabelle durchlaufen, während ein Diagrammerstellungsprogramm geöffnet ist, sodass das Diagramm nicht bei jeder Änderung aktualisiert wird.
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>Zeile 414: Zusätzlich würde ich hinzufügen: Fügen Sie immer eine Tabellenreferenz hinzu, wenn Sie einen festen Namen angeben, wenn Sie Funktionen wie << Subset usw. verwenden. Dies ist sehr hilfreich, wenn der generierte Name bereits vorhanden ist und JMP am Ende automatisch die „2“ hinzufügt. Ohne eine Referenz arbeiten Sie möglicherweise versehentlich an der falschen Tabelle.</SPAN>
<SPAN>Zeile 74: das ist etwas, das ich für meine Skripte klauen werde</SPAN>:)</img>
<SPAN>Zeile 757: Dies kann For-Schleifen manchmal auch sehr verlangsamen. Es ist jedoch beim Umgang mit SQL-Anweisungen nützlich, da das Senden einer Anforderung den Rest des Skripts überholen und einen Fehler verursachen kann, weil das Abrufen der Daten einige Zeit dauern kann. Wenn der Code jedoch zeilenweise ausgeführt wird, funktioniert es einwandfrei.</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">JSL Cookbook - JMP-Benutzer-Community</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">Betreff: Anpassen gekürzter Daten an eine kontinuierliche Verteilung – JMP-Benutzer-Community</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
Linie 787
Dies ist genau der Grund, warum XPath fast immer mit dem HelpKey-Attribut verwendet wird, wenn es verfügbar ist (der Outlinebox-Titel ist mir egal). Es gibt zu viele Möglichkeiten, robuste Referenzen zu erstellen (zu versuchen), als dass ich etwa 20 Minuten mit Beispielen darauf verwenden könnte.
Beispielsweise würde ich bei den Erkennungsgrenzen entweder den HelpKey ODER Platzhalter verwenden (wenn ich wüsste, dass sich der Name des Gliederungsfelds ändern kann …)
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">