Grüße, ich bin auf Situationen gestoßen, in denen ich Rohdaten in eine Datentabelle (dt1) importiere und dann eine andere Datentabelle öffne, die beispielsweise Spezifikationsgrenzen aufweist (dt2).Die Spezifikationsgrenzwerttabelle enthält nur eine USL und eine LSL.Ich füge eine neue berechnete Spalte in dt2 ein, die das Zielspezifikationslimit darstellt (Mittelwert (USL, LSL)).Ich durchlaufe dann alle Zeilen meiner Rohdaten dt1 und wenn ich eine Übereinstimmung zwischen dem Namen des Tests und den Spezifikationsgrenzen erhalte, lege ich die Spalteneigenschaften mit den Spezifikationsgrenzen fest (z. B. col << Set Property( "Spec Limits", { LSL( myLSLx ),USL( myUSLx ),Target( mytargetx ), );)... Dann die Spezifikationsdatei dt2 schließen, kein Speichern.
Ich denke, das Problem, das ich habe, besteht darin, dass die berechnete Spalte (dt2:_Target) nicht schnell genug ist und ich beim Versuch, sie zu lesen, direkt nach dem Erstellen der neuen berechneten Spalte („_Target“...) alle leeren Werte erhalte.Wenn ich die dt2-Datei geöffnet lasse, sehe ich die korrekten Werte in der berechneten Spalte „_Target“.Ich habe mit dem dt2<< Begin data Update; und das funktioniert auch nicht, aber vielleicht platziere ich das an einer falschen Stelle im Skript?Die einzige Lösung, die ich habe, besteht darin, keine Formel für die neue Spalte zu verwenden, sondern den Zielwert in einem Skript zu berechnen und ihn durch Indizieren aller Zeilen in die Spezifikationsdatei einzufügen.
Der Kern meiner Frage lautet: Kann ich warten, bis alle Spalten mit Berechnungen abgeschlossen sind, bevor ich versuche, einen bestimmten Wert in einer Zeile/Spalte zu lesen?
Funktioniert nicht
Z.B,
New Column( "_Target",Numeric,"Continuous",Format( "Best", 12 ),Formula(If( Is Missing( :_LSL ) | Is Missing( :_USL ),
Empty(),
Mean( :_LSL, :_USL )
)
Problemumgehung
Z.B,
dt2 = current data table();
New Column( "_Target", Numeric, "Continuous");
dt2_rows = nrows();
for (i=1, i<=dt2_rows, i++,
if(or(!is missing(dt2:_LSL[i]),!is missing(dt2:_USL[i])),
dt2:_Target[i] = ((dt2:_LSL[i]) + (d2t:_USL[i])) / 2;
,
);
Dies ist ein einfacher „Anhäufung“-Kommentar.@txnelson Die Formel von wird fetter ausfallen als die von Ihnen angegebene.Spaltenformeln werden schneller ausgeführt als eine for-Schleife. Außerdem ist die bedingte Anweisung nicht erforderlich, da JMP in jeder Berechnung, die einen leeren Wert hat, ein empty() zurückgibt. Somit ist (:USL + :LSL)/2 leer, wenn einer oder beide Werte leer sind.
Dies ist nur eine Info.
Sie haben Recht, dass diese Meldung nicht im Scripting Guide beschrieben wird. Es wird im JSL Syntax Guide beschrieben. Das erste Buch ist keine vollständige Beschreibung aller Funktionen und Nachrichten in JSL, aber das zweite Buch sollte vollständig sein. Die beiden Bücher sollen einander ergänzen und gemeinsam genutzt werden.
Die Nachricht wird auch im Scripting Index behandelt, mit einem Link zur Hilfe dazu. Eine Suche nach „Formel“ würde eine Liste mit den Meldungen „<< Formeln ausführen“ und „<< Formeln erneut ausführen“ zurückgeben.
„Wiederholung“ war mir auch nicht bekannt. Es sieht so aus, als ob die Formeln dadurch neu bewertet werden, ob sie es brauchen oder nicht. Wenn Sie in Ihren Formeln Zufallszahlen verwenden, können Sie den Unterschied erkennen. In den meisten Fällen würde ich <
Nachfolgend finden Sie eine einfache Änderung, die für Sie funktionieren sollte.Erstens wird durch das Entfernen der If()-Klausel die Verarbeitung beschleunigt, und zweitens wird die
dt << Formeln erneut ausführen;
zwingt JMP dazu, die Verarbeitung der Formeln abzuschließen, bevor fortgefahren wird
dt = Current Data Table();
dt << New Column( "_Target",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( (:LSL + :USL) / 2 )
);
dt << rerun formulas;
Versuchen Sie, Ihrer Tabelle eine „Formeln ausführen“-Nachricht zu senden:
dt << runFormulas;