Scripters Club-Aufnahmen: Tipps und TricksVideo 1 @thickey1 : Verwalten von Datentabellen.
- Spaltennamen ändern.
- Alternative Methode zum Referenzieren von Spaltennamen.
- Fügen Sie ein Skript zur Tabelle hinzu bzw. betten Sie es darin ein. Ein Benutzer kann es dann jederzeit ausführen.
(Dateien: Tipps und Tricks und Probe)
Video 2 @Georg : Allgemeine Tipps zum Schreiben von Skripten und zur Verwendung des JMP Script Editors
- Code-Faltung
- Ausdrucksbehandlung
- JSL in Formeln
- eval (eval expr(ein Code mit expr(der zuerst ausgewertet werden soll)))
- Test auf den Variablentyp
- assoziatives Array
(Dateien: 20241120_Scripters_Club_tipps_and_tricks-inspec)
Video 3 @Mauro_Gerber : Für Mehrfachimport öffnen und Pfad eines aktuellen Skripts abrufen
(Dateien: SC-2024_ini und SC-2024_multi-import)
Video 4 @Daniel_Valente : Überblick über den JMP Marketplace
https://marketplace.jmp.com/
Ich habe mich nicht getraut, Ndoubled auf 10 zu setzen : )
Mein Traum: ein schnelles, dynamisches und einfach zu bedienendes :folded_hands: ist in der Spezifikation (Wert)
Im Hinblick auf die Idee, „unseren Code zu rösten“ – irgendwelche Ideen, um die Geschwindigkeit zu verbessern?
Und wie kann dieser Ansatz anderen Benutzern mit weniger JSL-Erfahrung zugänglich gemacht werden?


Betreff: Scripters Club-Aufnahmen: Tipps und TricksDieses ist schneller, löst aber kein Update aus, wenn die Spezifikationen angepasst werden.
Im Moment also: kein wirklicher Vorteil gegenüber
für jedes (... dt[0,Spaltenname] = ...)
oder neue Spalte (Werte festlegen())
Names Default To Here( 1 );
Ndoubled = 10;
dynamic = 1;
Try( Close( cdt, NoSave ) );
cdt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
Wait( 0 );
bigger = Expr(
cdt = cdt << concatenate( cdt, append to first table( 1 ) )
);
For( I = 1, i <= Ndoubled, i++, bigger );
col_lst = cdt << get column group( "Processes" );
Wait( 0 );
cdt << New Table Variable( "trigger update", 1 ); // can this be used to force an update?
cdt << begin data update();
t0 = HP Time();
If( dynamic,
col_lst = cdt << get column group( "Processes" );
For Each( {col}, col_lst,
col_Name = col << get name() || "_inSpecDynamic";
colnew = New Column( col_Name, Nominal );
col_Name = colnew << get name();
Eval(
Substitute(
Expr(
Column( col_Name ) << set Formula(
Local(
{t0 = As Constant(
dt = Current Data Table();
limits = _col_ << get property( "Spec Limits" );
nr = nrows(dt);
usl = limits["USL"];
lsl = limits["LSL"];
myRows = Where( _col_ > lsl & _col_ < usl );
NmyRows = N Items( myRows );
dt[0, _col_Name_] = J( nr, 1, 0 );
If( NmyRows,
dt[myRows, _col_Name_] = J( NmyRows, 1, 1 )
);
1
)},
Stop();
)
)
),
Expr( _col_ ), Name Expr( col ), Expr(_col_name_), col_name
)
);
cdt << move selected columns( {Column( col_name )}, after( col ) );
);
);
cdt << run formulas() << end data update();
Show( (HP Time() - t0) / 1000000 );
Wait( 0 );
Caption( "Process screening - don't dare ..." );
Stop();
// TEST THE RESULT
// check result in table visually
ps = cdt << Process Screening( Process Variables( Eval( col_lst ) ), Spec Limits Dialog( "No (skip columns with no spec limits)" ) );
ps << Color Out Of Spec Values( 1 );
ps << Close Window;
cdt << Clear Select << Clear Column Selection;
Betreff: Scripters Club-Aufnahmen: Tipps und TricksDer @hogi , danke, dass du dir den Code und die zusätzliche Implementierung angesehen hast. Für die Präsentation habe ich nicht zu sehr auf Geschwindigkeit usw. geachtet, mein Fokus lag darauf, verschiedene Wege und Ansätze aufzuzeigen. Im wirklichen Leben hängt die beste Implementierung von deinen Randbedingungen ab, es ist also, wie ich denke, fallspezifisch.
Wenn Sie sich den Programmablauf ansehen, ist es vielleicht nicht ideal, Spezifikationsgrenzen in jeder Zeile mithilfe des Formelansatzes herauszuziehen, aber in manchen Fällen kann es nützlich sein. JMP kann das Programm jedoch intern zur Laufzeit verbessern und unnötige Berechnungen vermeiden. Es ist mir unmöglich, alle diese Details zu kennen, aber deshalb müssen wir verschiedene Ansätze ausprobieren.
Wenn es um Geschwindigkeit geht, würde ich grundsätzlich die Möglichkeiten der Plattform nutzen, zB über Farben in der Prozessabtastung, da ich davon ausgehe, dass diese für große Datenmengen optimiert sind.
Vielleicht können wir uns das während der Roasting-Serie noch einmal ansehen. Und ja, ich denke, in_spec wäre eine sehr nette eingebaute Funktion. Nur die Implementierung könnte schwierig werden, wenn man sich um alle Details kümmern muss – hoffe, die Entwickler finden einen guten Weg.
Betreff: Scripters Club-Aufnahmen: Tipps und TricksUm die Leistung mit der der offiziellen Plattform zu vergleichen, löschen oder kommentieren Sie bitte stop().
Betreff: Scripters Club-Aufnahmen: Tipps und TricksBei Spezifikationsgrenzen muss man bedenken, dass es einseitige Spezifikationen gibt. Sie können alle möglichen lustigen Probleme verursachen.
Betreff: Scripters Club-Aufnahmen: Tipps und Tricksja, richtig.
Der Einfachheit halber halte ich es für in Ordnung, beidseitige Angaben zu verwenden.
Die Berücksichtigung unseitiger Spezifikationen (oder Spalten ohne Spezifikationen) ist ziemlich unkompliziert – man sollte es aber auf keinen Fall vergessen.
Kennen Sie einen Trick, wie man die Berechnung beschleunigen – und dynamisch gestalten – kann?
Betreff: Scripters Club-Aufnahmen: Tipps und TricksHöchstwahrscheinlich hängt es stark von dem zu lösenden Problem ab (die Lösung hängt also stark vom Anwendungsfall ab).
Betreff: Scripters Club-Aufnahmen: Tipps und TricksAnwendungsfall:
eine neue Spalte mit einer Formel zum Generieren von 0/1-Werten für Werte außerhalb/innerhalb der Spezifikation.
Wenn in den Spezifikationen ein Tippfehler vorliegt oder der Benutzer die Spezifikation anpassen möchte, sollten die Werte der Spalte automatisch aktualisiert werden (sollten nicht bei den alten Einstellungen stecken bleiben).
vielleicht für 10–30 Spalten.
100.000 – 10 Millionen Zeilen.
Eine Lösung, die problemlos mit neuen Kollegen geteilt werden kann, die JMP zur Analyse von Pass/Fail-Informationen verwenden möchten.
Betreff: Scripters Club-Aufnahmen: Tipps und TricksDies geht vielleicht etwas vom Thema ab:
Ihnen fehlen einige Angaben(?) (Ich halte mich für einen professionellen XY-Problemlöser und glaube nicht, dass Sie einer sein wollen):
- Eingabe: nur eine Datentabelle
- ALLE Spalten verwenden, für die Spezifikationsgrenzen festgelegt sind?
- Bedenken Sie jedoch, dass diese möglicherweise falsch eingestellt sind (meiner Meinung nach ein viel größeres Problem).
- Inwieweit sind sie falsch? Können bei beiden Werte fehlen? Bei beiden dieselben Werte, auch wenn wir eine kontinuierliche Messung durchführen? Oder einfach „fehlerhafte“ Werte (früher konnten Sie in JMP „nicht ausgewertete“ Werte als Spezifikationsgrenzen haben, die trotzdem als korrekte numerische Werte angezeigt wurden. Ich bin nicht sicher, ob das bei JMP18 immer noch der Fall ist).
- Ein gesonderter Fall besteht darin, dass der Benutzer diese möglicherweise anpassen möchte (ich würde diesen Anwendungsfall als anders betrachten als eine einzelne Spalte mit 0/1).
- Was ist der Anwendungsfall? Ich bin ziemlich sicher, dass Benutzer nicht 30 Spalten und 10 Millionen Zellen visuell aus einer Tabelle analysieren werden
- Wie nutzen sie die Ergebnisse? Könnte die Berechnung dort implementiert werden? -> Haben Sie eine benutzerdefinierte Plattform für diese Art von Arbeit?
Wenn ich in diesem Fall „ ein Problem lösen“ müsste, würde ich zunächst die falschen Spezifikationsgrenzen oder vielleicht eher die Situation lösen, in der sie geändert werden. Was möchten Sie wirklich sehen? Ich bezweifle wirklich, dass es eine Spalte mit 0/1 basierend auf Spezifikationsgrenzen gibt, wenn Sie 10 Millionen Datenzeilen haben.
Sie (oder ich) könnten eine Funktion zum Erstellen einer solchen Spalte erstellen (bin mir nicht sicher, wie schnell Sie das machen könnten), aber ist das wirklich die Lösung des Problems ? Wenn Sie nur eine 0/1-Spalte basierend auf den aktuellen Spezifikationsgrenzen für ALLE Spalten haben möchten, muss sie meiner Meinung nach nicht dynamisch sein (sofort aktualisieren). Der Benutzer kann im Menü eine einzelne Taste drücken, um die Ergebnisse zu aktualisieren (ich denke an ein Add-In, das bestimmte Spaltennamen oder vielleicht Tabellenvariablen verwendet). Wenn der Zweck darin besteht, Spezifikationen anzupassen, hat es (meiner Meinung nach) keinen Wert, wenn sich 0 in 1 ändert, wenn Sie 10 Zeilen haben (erstellen Sie NUR für diesen Anwendungsfall eine spezielle Plattform, wenn nichts anderes und Sie „nur“ an der Geschwindigkeit interessiert sind, wird es höchstwahrscheinlich schneller sein).
Oder ist das nur eine theoretische Frage, wie man das schnell machen kann?
Betreff: Scripters Club-Aufnahmen: Tipps und TricksHallo Jarmo, danke für deine Kommentare.
Sie haben Recht, mit Hilfe eines einzigen „Klicken Sie hier, um zu aktualisieren“ verschwinden alle Probleme.
Aber um ehrlich zu sein, gefällt mir der Ansatz „Graph Builder – richten Sie ihn einfach ein und JMP kümmert sich um die Details“.
Es ist nicht nötig, die Details über die Community zu diskutieren/implementieren (es ist klar, wie man eine Formel so erweitert, dass sie auch für einseitige Spezifikationen funktioniert). Hier bevorzuge ich sogar einen kurzen Code, der das Konzept zeigt.
Abgesehen davon besteht kein Grund zu zweifeln, ob ein schnelles, dynamisches und benutzerfreundliches :folded_hands: in der Spezifikation (dem Wert) für etwas Nützliches verwendet wird.
Also, bis :folded_hands: in der Spezifikation (Wert) ist, ist es verfügbar – Wenn jemand eine bessere Lösung hat, wie man es manuell einrichtet, werde ich mich sehr freuen und sie sofort verwenden. Es ist keine theoretische Frage:)