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 (dt2) hat.Die Tabelle der Spezifikationsgrenzen enthält nur eine USL und eine LSL.Ich füge eine neue berechnete Spalte in dt2 ein, die die Zielspezifikationsgrenze (Mittelwert (USL, LSL)) ist.Dann durchlaufe ich alle Zeilen meiner Rohdaten dt1 und wenn ich eine Übereinstimmung des Namens der Test- und Spezifikationsgrenzen erhalte, setze ich die Spalteneigenschaften mit den Spezifikationsgrenzen (z. B. col << Set Property( "Spec Limits", { LSL( meinLSLx ),USL( meinUSLx ),Ziel( meinZielx ), );)... Schließen Sie dann die Spezifikationsdatei dt2, ohne zu speichern.
Ich denke, das Problem, das ich habe, ist, dass die berechnete Spalte (dt2:_Target) nicht schnell genug ist, und ich bekomme alle leeren Werte, wenn ich versuche, sie zu lesen, direkt nachdem ich die neue berechnete Spalte ("_Target"...) erstellt habe.Wenn ich die dt2-Datei geöffnet halte, sehe ich die korrekten Werte in der berechneten Spalte "_Target".Ich habe mit dem dt2 gespielt<< Datenaktualisierung beginnen; und das funktioniert auch nicht, aber vielleicht setze ich das an einer falschen Stelle im Skript ein?Die einzige Arbeit, die ich habe, besteht darin, keine Formel für die neue Spalte zu verwenden, sondern den Zielwert in einem Skript zu berechnen und ihn in der Spezifikationsdatei zu platzieren, indem alle Zeilen indiziert werden.
Die Wurzel meiner Frage ist, 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 "Haufen"-Kommentar.@txnelson Die Formel von wird dicker 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. Daher ist (:USL + :LSL)/2 leer, wenn einer oder beide Werte leer sind.
Dies ist nur ein FYI.
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 sich gegenseitig ergänzen und gemeinsam genutzt werden.
Die Meldung wird auch im Scripting Index behandelt, mit einem Link zur entsprechenden Hilfe. Eine Suche nach „Formel“ würde eine Liste zurückgeben, die die Meldungen << Formeln ausführen und << Formeln erneut ausführen enthält.
"Wiederholung" war mir auch nicht bekannt. Sieht so aus, als würden die Formeln neu bewertet, ob sie es brauchen oder nicht. Wenn Sie in Ihren Formeln Zufallszahlen verwenden, können Sie den Unterschied sehen. Ich würde <
Unten ist eine einfache Modifikation, die für Sie funktionieren sollte.Erstens beschleunigt das Entfernen der If()-Klausel die Verarbeitung und zweitens die
dt << Formeln wiederholen;
zwingt JMP, 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 "Formel ausführen"-Nachricht zu senden:
dt << runFormulas;