Neuling: Vorgehensweise zum Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungHallo. Ich bin ganz neu. Bevor ich mich in das Erlernen von Scripting stürze, möchte ich eine Bestätigung, dass ich dies richtig angehe. Wir möchten auf einfache Weise den folgenden einfachen Verteilungsbericht erstellen, der für eine vom Benutzer ausgewählte Spalte erstellt werden kann, normalerweise 30 Datenpunkte, die wie das folgende Bild aussieht, und wir hoffen, die Elemente mit den roten Linien zu entfernen:

Ein Beispiel für eine Datentabelle ist:

Unten sehen Sie das Skript, das das System erstellt hat, als ich „Skript speichern/In Datentabelle“ verwendet habe:
Verteilung(
Kontinuierliche Verteilung (
Spalte (:OD),
Horizontales Layout( 1 ),
Histogramm( 0 ),
Vertikal (0),
Prozessfähigkeit(
Verwenden Sie Spalteneigenschaftsspezifikationen,
Prozessfähigkeitsanalyse (Nichtübereinstimmung (0))
)
),
Nur Histogramme,
SendenAnBericht(
Dispatch( {"OD", "Prozessfähigkeit", "OD-Fähigkeit", "Histogramm"}, "1",
ScaleBox,
{Min( 2.1388234375 ), Max( 2.1636765625 ), Inc( 0.005 ),
Kleinere Hilfsstriche (5)}
)
)
);
Ich gehe davon aus, dass dies ohne Skripting nicht möglich ist. Wenn das nicht stimmt, lassen Sie es mich bitte wissen.
Ich möchte lernen, wie man ein Skript erstellt, damit der Benutzer die zu verwendende Spalte auswählen kann, wobei das obige Skript nur die Spalte „OD“ verwendet. Dies würde hoffentlich durch Ausführen des Skripts den oben genannten Basisbericht liefern.
Suchen Sie dann nach Skriptänderungen, um die Einträge zu entfernen, die wir rot durchgestrichen haben.
Ist dieser Ansatz naiv? Gibt es einen besseren Ansatz?
Vielen Dank für jeden Input,
Gewähren
Qualitäts- und ProzesstechnikBetreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungFür Fähigkeitstabellen ist dies relativ einfach, da Sie Filter verwenden können wie
Contains({"Cpk", "Cp"}, Index)
Dies funktioniert jedoch nicht für das Tabellenfeld unter der Prozesszusammenfassung, da es keine Spaltennamen hat. Sie können daher beispielsweise nicht so einfach Voreinstellungen verwenden.
Nutzen Sie also Skripte. Mit Skripten können Sie diese Überschriften zum Tabellenfeld hinzufügen und sie dann zum Filtern verwenden.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
mycol = "NPN1";
dist = dt << Distribution(
Ignore Platform Preferences(1),
Continuous Distribution(
Column(Eval(mycol)),
Quantiles(0),
Summary Statistics(0),
Horizontal Layout(1),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(
Use Column Property Specs,
Process Capability Analysis(Nonconformance(0))
)
)
);
// modify axis
Report(dist)[OutlineBox("Histogram"), AxisBox(1)] << Min(100) << Max(130) << Inc(1) << Minor Ticks(5);
// Filter table boxes
Report(dist)[OutlineBox("Within Sigma Capability"), TableBox(1)] << Filter Where(Contains({"Cpk", "Cp"}, Index));
Report(dist)[OutlineBox("Overall Sigma Capability"), TableBox(1)] << Filter Where(Contains({"Ppk", "Pp"}, Index));
Report(dist)[OutlineBox("Process Summary"), TableBox(1), StringColBox(1)] << Set Heading("Stat");
Report(dist)[OutlineBox("Process Summary"), TableBox(1), NumberColBox(1)] << Set Heading("Value");
Report(dist)[OutlineBox("Process Summary"), TableBox(1)] << Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat));

Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungVielen Dank, Jarmo, dass Sie sich die Zeit dafür genommen haben. Das gibt mir eine großartige Grundlage, die ich an unserem Tisch anwenden kann. Ich bin dankbar für Ihre Hilfe.
Ich werde damit herumspielen und sehen, ob ich herausfinden kann, ob ich eine Benutzereingabeaufforderung für die Zielspalte erstellen kann, da der Name variiert, und darauf aufbauen. Zumindest kann ich das Skript mit meinem aktuellen (begrenzten) Wissen für bestimmte Teilszenarien anpassen. Für unsere Benutzer ist das möglicherweise sogar besser. Trotzdem, nochmals vielen Dank.
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungWenn Sie erst einmal mit JSL angefangen haben, ist es ziemlich einfach, eine einfache Benutzeroberfläche für so etwas zu erstellen (noch einfacher, wenn Sie Column Dialog() verwenden, aber das mag ich persönlich nicht). Dieses Beispiel enthält einige fortgeschrittenere Techniken, wird aber höchstwahrscheinlich das tun, was Sie tun möchten. Es gibt einige Plausibilitätsprüfungen, die Sie möglicherweise hinzufügen möchten, z. B. die Überprüfung auf Spezifikationsgrenzen, aber so etwas kann als Ausgangspunkt dienen
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
run_custom_dist = Expr(
dist = dt << Distribution(
Ignore Platform Preferences(1),
Continuous Distribution(
Column(Eval(mycol)),
Quantiles(0),
Summary Statistics(0),
Horizontal Layout(1),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(Use Column Property Specs, Process Capability Analysis(Nonconformance(0)))
)
);
// modify axis
Report(dist)[Outline Box("Histogram"), AxisBox(1)] << Min(100) << Max(130) << Inc(1) << Minor Ticks(5);
// Filter table boxes
Report(dist)[Outline Box("Within Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Cpk", "Cp"}, Index));
Report(dist)[Outline Box("Overall Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Ppk", "Pp"}, Index));
Report(dist)[Outline Box("Process Summary"), Table Box(1), String Col Box(1)] << Set Heading("Stat");
Report(dist)[Outline Box("Process Summary"), Table Box(1), Number Col Box(1)] << Set Heading("Value");
Report(dist)[Outline Box("Process Summary"), Table Box(1)] << Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat));
);
nw = New Window("UI",
H List Box(
Panel Box("Pick Columns",
window:fcs = Filter Col Selector(dt, << Character(0))
),
Panel Box("Cast",
Lineup Box(N Col(2),
Button Box("Column", << Set Function(function({this},
(this << sib) << Append(window:fcs << get selected)
))),
window:clb = Col List Box(dt, Min Items(1), Max items(1), N Lines(2), << Modeling Type({"Continuous"}))
)
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
sel = window:clb << get items;
If(N Items(sel) > 0,
mycol = sel[1];
run_custom_dist;
window:fcs << close window;
);
),
Button Box("Cancel", window:fcs << close window);
)
)
)
);
Write();
Der Scripting Guide ist eine gute Quelle für den Einstieg in JSL
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungDanke Jarmo! Ich habe mit dem Scripting Guide angefangen. Wahrscheinlich bin ich nicht geduldig genug, aber ich arbeite mich weiter durch.:)
Könnte ich Sie bitten, mir noch eine Änderung zu zeigen? Ich denke, das würde mir sehr helfen. Könnten Sie das Skript so ergänzen, dass unterhalb der Sigma-Funktionen (im Grunde ganz unten) ein gleitendes Durchschnittsdiagramm hinzugefügt wird? Ich habe unten ein Beispiel mit dem NPN1 aus der Halbleiterdatei gemacht. Mir fehlt etwas in den Skriptbeschriftungen und ich denke, das wird mir helfen, es zu verstehen.

Ich kann mir vorstellen, dass du die Augen verdrehen wirst da diese nächste Frage grundsätzlich zeigt, dass ich JMP nicht gut verstehe. Ist es sinnvoller, ein Skript wie dieses als Skriptdatei zu haben, die ein Benutzer öffnet und ausführt, oder ist es sinnvoller, dieses Skript in der Datentabelle zu speichern und von dort aus auszuführen? Ist das nur eine Vorliebe oder gibt es einen Vorteil?
Wenn es außer einem Kudo noch eine andere Möglichkeit gibt, mich für Ihre Hilfe zu bedanken, lassen Sie es mich bitte wissen. Ihre Hilfe hat mir viel Kopfzerbrechen erspart.
Nochmals vielen Dank,
Gewähren
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungSie können so etwas mit dem Workflow Builder erstellen. Je nachdem, was Sie tun, kann dies also eine gute Idee sein (und es ist eine gute Vorgehensweise bei der Verwendung von JMP).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
run_custom_dist = Expr(
vlb = V List Box(
dist = dt << Distribution(
Ignore Platform Preferences(1),
Continuous Distribution(
Column(Eval(mycol)),
Quantiles(0),
Summary Statistics(0),
Horizontal Layout(1),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(Use Column Property Specs, Process Capability Analysis(Nonconformance(0)))
)
),
ccb = dt << Control Chart Builder(
Show Two Shewhart Charts(0),
Include Missing Categories(0),
Show Limit Summaries(0),
Show Capability(0),
Variables(Y(Eval(mycol))),
Chart(Points(Statistic("Moving Range")), Limits(Sigma("Moving Range"))),
Show Control Panel(0)
)
);
// modify axis
Report(dist)[Outline Box("Histogram"), AxisBox(1)] << Min(100) << Max(130) << Inc(1) << Minor Ticks(5);
// Filter table boxes
Report(dist)[Outline Box("Within Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Cpk", "Cp"}, Index));
Report(dist)[Outline Box("Overall Sigma Capability"), Table Box(1)] << Filter Where(Contains({"Ppk", "Pp"}, Index));
Report(dist)[Outline Box("Process Summary"), Table Box(1), String Col Box(1)] << Set Heading("Stat");
Report(dist)[Outline Box("Process Summary"), Table Box(1), Number Col Box(1)] << Set Heading("Value");
Report(dist)[Outline Box("Process Summary"), Table Box(1)] << Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat));
nw = new window("",
vlb
);
);
nw = New Window("UI",
H List Box(
Panel Box("Pick Columns",
window:fcs = Filter Col Selector(dt, << Character(0))
),
Panel Box("Cast",
Lineup Box(N Col(2),
Button Box("Column", << Set Function(function({this},
(this << sib) << Append(window:fcs << get selected)
))),
window:clb = Col List Box(dt, Min Items(1), Max items(1), N Lines(2), << Modeling Type({"Continuous"}))
)
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
sel = window:clb << get items;
If(N Items(sel) > 0,
mycol = sel[1];
run_custom_dist;
window:fcs << close window;
);
),
Button Box("Cancel", window:fcs << close window);
)
)
)
);
Write();
Wie so etwas verwendet werden soll, bleibt Ihnen überlassen. Für mich wäre es vielleicht am sinnvollsten, einen Workflow dafür zu haben (die Verteilung zu korrigieren könnte ohne JSL für den Workflow allerdings etwas schwierig sein) ODER ein Add-In zu erstellen, das der Benutzer bei Bedarf auf seiner eigenen Tabelle ausführen kann. Für Add-In-Zwecke würde ich den Benutzer höchstwahrscheinlich mehr als eine Spalte auswählen lassen oder einen Spaltenumschalter verwenden, und es wäre eine gute Idee, einige zusätzliche Prüfungen zu implementieren (ist die Tabelle offen, haben die ausgewählten Spalten Spezifikationsgrenzen usw.).
Bearbeiten: Fest codierter Wert aus Control Chart Builder korrigiert
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungJarmo, danke. Das gibt mir eine tolle Grundlage, auf die ich hinarbeiten kann. Ich habe den Code geändert und er hilft wirklich. Als ich den neuen Fenstercode sah, war mir etwas wirklich klar, das mir fehlte.
Ich werde auch diesen Workflow-Builder durcharbeiten. Den hatte ich mir noch gar nicht angeschaut. Letztendlich scheint mir, soweit ich weiß, ein Add-In das Beste für unsere Gruppe zu sein, wenn ich erst einmal dort bin ...
Nochmals, ich bin wirklich dankbar für Ihre Hilfe und kann Ihnen nicht genug danken,
Gewähren
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungIch dachte, es wäre sinnvoller, hier zu fragen, anstatt ein neues Thema zu eröffnen ...
Ich habe gute Prozesse entwickelt und ein Add-In für unsere Gruppe erstellt, das verwendet wird. Um mehr zu erfahren, möchte ich nur die Zeile „Total Outside“ und nur die Spalte „Expected Overall PPM“ aus dem Abschnitt „Nonconformance“ hinzufügen (im folgenden Screenshot rot unterstrichen):

Ich kann das Feld anzeigen, aber es werden keine Werte angezeigt ... Unten sehen Sie den Abschnitt des Skripts (Zeilen 50–52) hierzu und einen Screenshot:
Report(dist)[Outline Box("Nonconformance"), Table Box(1), String Col Box(1)] << Set Heading("Portion");
Report(dist)[Outline Box("Nonconformance"), Table Box(1), Number Col Box(1)] << Set Heading("Expected Overall PPM");
Report(dist)[Outline Box("Nonconformance"), Table Box(1)] << Filter Where(Contains({"Total Outside"}, Expected Overall PPM));
Beachten Sie, dass im Screenshot auch die Spalten „Erwartet innerhalb von %“ und „Erwartet insgesamt %“ hinzugefügt wurden, die ich nicht möchte.

Ich weiß, dass mir etwas Grundlegendes fehlt ... Ich habe versucht, die Eigenschaften der Elemente zu verwenden, um zu vergleichen, was unterschiedlich ist, aber ich sehe keinen Wert. Ich habe auch das Tool „Skript speichern“ ausprobiert, um zu sehen, ob das einen Hinweis liefert, aber es verwendet einen Dispatch-Befehl, und ich kann das auch nicht zum Laufen bringen ...
Ist es außerdem möglich, den Abschnitt „Nichtübereinstimmung“ direkt unter „Prozesszusammenfassung“ und über „Gesamt-Sigma-Fähigkeit“ zu platzieren? Nach meiner Recherche war das nicht der Fall, aber vielleicht übersehe ich auch da etwas.

Danke schön,
Gewähren
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungSie können die Spalten, die Sie zuerst anzeigen möchten, ändern, indem Sie JMP verwenden und das von JMP erstellte Skript überprüfen, um zu sehen, OB JMP erfassen kann, was Sie tun möchten (in diesem Fall ist es das). Sie können es dann entweder dem Verteilungsskript überlassen oder außerhalb davon verschieben.

Und in Ihrem Skript könnte es ungefähr so aussehen
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Observed %")] << Visibility("Collapse");
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Expected Within %")] << Visibility("Collapse");
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Expected Overall %")] << Visibility("Collapse");
Report(dist)[Outline Box("Nonconformance"), NumberColBox("Expected Overall PPM")] << Visibility("Visible");
Report(dist)[Outline Box("Nonconformance"), Table Box(1)] << Filter Where(Portion == "Total Outside");
Sie können auch die Klonbox verwenden, um die Nichtübereinstimmung zu "kopieren".
ncob = Report(dist)[Outline Box("Nonconformance")];
(Report(dist)["Process Capability","? Capability","Process Summary"] << parent) << Append(
ncob << clone box;
);
(ncob << parent) << Set(0);
</CODE><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_1-1729017828517.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_1-1729017828517.png" style="width: 321px;"><img src="https://us.v-cdn.net/6038925/uploads/images/69147iBECE0693438ABAB9/jthi_1-1729017828517.png" role="button" title="jthi_1-1729017828517.png" alt="jthi_1-1729017828517.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P>Wenn Sie die Funktionen dieser JMP-Plattformen jedoch nicht benötigen, würde ich in Betracht ziehen, benutzerdefinierte Berichte aus verschiedenen Teilen zu erstellen. Auf diese Weise können Sie das Erscheinungsbild des Berichts einfacher steuern und Benutzer versuchen nicht versehentlich, Funktionen zu verwenden, die möglicherweise nicht richtig funktionieren.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-805889" slang="en-US" mode="CREATE">Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und Prozesszusammenfassung</LINGO-SUB><LINGO-BODY id="lingo-body-805889" slang="en-US" mode="CREATE"><P>Ah! Ich werde versuchen, Ihre Nachricht zu verstehen und damit herumzuspielen. Ich habe die Sichtbarkeitsflags im Dispatch-Skript gesehen (sieht genauso aus wie das, was Sie hatten), aber ich habe nicht verstanden, wie ich sie wie Sie vernetzen kann.</P><P> </P><P>Was hat Sie dazu bewogen,</P><PRE class="language-jsl"><CODE>Filter Where(Portion == "Total Outside");
und kein Listen-Callout wie bei einigen anderen. Beispiel:
Filter Where(Contains({"LSL", "Target", "USL", "N", "Sample Mean"}, Stat))
Danke, Jarmo!
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungIch habe
Filter Where(Portion == "Total Outside");
Sie können aber trotzdem „Contains“ verwenden, wenn Sie möchten (in Ihrem Skript lag das Problem nicht bei „Contains“, sondern bei der Verwendung der falschen Spalte „Expected Overall PPM“ anstelle von „Portion“ für den Vergleich).
Report(dist)[Outline Box("Nonconformance"), Table Box(1)] << Filter Where(Contains({"Total Outside"}, Portion));
Ich habe den Gleichheitsvergleich verwendet, weil Sie nur eine einzelne Zeile der Tabelle anzeigen möchten. „Enthält“ kann für mehrere Elemente verwendet werden und ist unnötig, wenn Sie nur ein einzelnes Element haben (wie in diesem Fall).
Der Grund für die Änderung war etwa dieser:
Sie denken vielleicht: „Aber ist es wichtig, ob es funktioniert?“. Im Grunde ist es das nicht, ABER wenn Sie (oder zumindest ich) anfangen, über den Code nachzudenken, wird es ein wenig wichtig. Für mich wäre es jetzt offensichtlich, dass es in dieser Tabelle nie mehr als ein Element geben wird (oder wenn es mehr als eines gibt, muss die Idee der Filterung geändert werden, und das wird Sie ein wenig innehalten lassen).
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungJarmo, danke für die hervorragende Erklärung.
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungDer Auslöser für gute Community-Posts sind gute Fragen .
Danke, @GM-FPP .
Betreff: Neuling: Vorgehensweise beim Anpassen von Histogramm, Sigma-Fähigkeit und ProzesszusammenfassungVielen Dank, @hogi, ich freue mich über Ihre Nachricht.