Formelspalten in einer For-Schleife erstellenIch habe ein Skript, das Nichtkonformitätsraten für Nichtkonformitätscodes berechnet und auch Kontrolldiagramme für jeden Code über einen vom Benutzer eingegebenen Datumsbereich erstellt. Der Benutzer kann bis zu fünf individuelle Codes eingeben und es stehen über 50 Codes zur Auswahl. Es wird eine Tabelle erstellt, die die gesamte fehlerhafte Menge pro Code pro Datum, die Summe der fehlerhaften Mengen aller eingegebenen Codes und die pro Tag hergestellte Gesamtmenge enthält (NC-Rate nach Datum pro Code - Original). Dann füge ich der Tabelle etwas hinzu, indem ich eine Schleife durchlaufe, um eine Spalte hinzuzufügen, um die Nichtkonformitätsrate für jeden Code zu berechnen, und dann eine zweite, um die Rate als Prozentsatz anzuzeigen (NC Rate By Date Per Code – Complete).Im Moment sind alle Kursspalten identisch, ebenso wie die Prozentspalten, jedoch nicht die korrekte prozentuale Version des Kurses.
Die Schleife ist im Grunde identisch mit einer Schleife, die ganz am Ende des Skripts erstellt wurde, um die Nichtkonformitätsdaten über den gesamten Datumsbereich zusammenzufassen (Gesamt-NC-Rate pro Code – Original, Gesamt-NC-Rate pro Code – vollständig), die korrekt berechnet wird, und ich kann es nicht sagen was schief läuft.
Ich habe Screenshots der angegebenen Tabellen und der Skriptabschnitte angehängt (Codes = Liste aller eingegebenen Codes als Zeichenfolgen, SD und NR sind Tabellenreferenzen)
//NC Rate By Date Per Code Section
//Calculate NC rates and percentages for entered codes if two or more codes are entered
If(NItems(codes)>=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
NR<<NEW column="">=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
SD<<NEW column=""></NEW></NEW>Betreff: Formelspalten in einer For-Schleife erstellenDanke für die zusätzliche Erklärung!
Betreff: Formelspalten in einer For-Schleife erstellen@rfick ,
Das folgende Skript hilft Ihnen hoffentlich zu verstehen, dass ab JMP14 die Verwendung einer Variablen in einer Formelspalte zu fehlerhaften Ergebnissen führen kann, da sich die Formeln (und ihre Werte) ändern, wenn sich der Wert der Variablen ändert.
In Bezug auf die letzten beiden Formeln in Ihrem Skript:
Führen Sie das folgende Skript wie beschrieben aus. Es zeigt, was mit Ihren Tabellenformeln und damit Werten passiert. Dieses Skript enthält auch eine Methode, um die Variable in der Formel mithilfe von Ausdrücken durch den Variablenwert zu ersetzen.Normalerweise verwende ich Set Each Value(), wenn also die Quellspalte gelöscht wird, ist die Spalte intakt.Beachten Sie auch, dass dieses Skript verwendet c die Spaltennummer. Wenn ich die Formel eingebettet haben möchte, empfehle ich, eine neue Variable zu erstellen cnme = Column(c) << Namen abrufen , verwenden Sie dann Column(cnme) und Ausdrücke. Wenn dann die Tabelle neu organisiert wird usw., ist die Formel wie erwartet (intakt). Das unten angezeigte Skript ist beigefügt.
Names Default to Here(1);
dt = Open("$Sample_Data/Big Class.jmp");
//will create formula columns for height and weight using a relative column number , c
//c will change, simulating a loop.
//highlight the blocks of code and follow the instructions
//--- Block 0: run this to embed the log window
_cw = Current Window();
_ifb = _cw << Find( If Box( 1 ) );
wait(0);
_ifb << Set( 1 );
//--- end Block 0
//--- Block 1: run it and look at the look at the embedded log
c=4; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 1
//--- Block 2: run it and look at the look at the embedded log
c=5; //weight
dt << rerun formulas;
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 2 See the log, the formula is the same, but c has changed so the formula is now using column 5 (c=5)
// for its calculation
//--- Block 3: run it and look at the look at the log
c=5; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc2 = ncol(dt);
show( c, nc2, (column(nc2) << get formula), column(nc2)[1::5]); //same formula as nc1
show(column(nc1)[1::5], column(nc2)[1::5]);
//--- end Block 3
//will use formula columns for weight and height using expressions column number
//--- Block 4: run it and look at the look at the log
c=4; //height
Eval ( Eval Expr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(expr(c))[] /:age,2) ) )
));
nc3 = ncol(dt);
show( c, nc3, (column(nc3) << get formula), column(nc3)[1::5]);
//--- end Block 4 - note the formula now has the exact column number, it no longer relies on "c"
//--- Block 5: run it and look at the look at the log
c=5; //height
Eval(EvalExpr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(Expr(c))[] /:age,2) ) );
));
nc4 = ncol(dt);
show( c, nc4, (column(nc4) << get formula), column(nc4)[1::5]); //not the same formula as nc3,
show(column(nc3)[1::5], column(nc4)[1::5]);
//--- end Block 5
Betreff: Formelspalten in einer For-Schleife erstellen@gzmorgan0 , Danke für die Erklärung. Ich habe die Methode Set Each Row ausprobiert und sie hat das Problem behoben, das ich bei der Berechnung der Nichtkonformitätsraten pro Tag gesehen habe. Der einzige Punkt, bei dem ich immer noch verwirrt bin, ist, wie hat dieselbe Theorie in einem Abschnitt des Drehbuchs funktioniert, aber nicht im anderen?Betreff: Formelspalten in einer For-Schleife erstellen@rfick ,
Es gibt einen Unterschied zwischen den Formeln der letzten beiden Spalten und denen, die in Ihrer for-Schleife erstellt wurden. Die letzten beiden Spalten beziehen sich auf die eigentliche Spalte, um die Berechnung durchzuführen.
Sie sollten sich einige der Spaltenformeln ansehen, die von Ihrer for-Schleifenspezifikation erstellt wurden (siehe unten).
NR<<NEW column=""></NEW>
Die Formel sieht so aus, sie hat nicht den Wert von c, also ist das Ergebnis, das Sie erhalten, das Ergebnis des endgültigen Werts von c.
<SPAN class="token function">Round</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>c<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">/</SPAN> <SPAN class="token punctuation">:</SPAN>Manufactured Qty<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token number">4</SPAN><SPAN class="token punctuation">)</SPAN><CODE>
Wenn Sie diese Tabelle speichern und später in einer neuen JMP-Sitzung öffnen und Formeln erneut ausführen, sind diese Spalten leer, und JMP kennt den Wert von c nicht.
Sie müssen entweder Ihre Formel ändern, um einen Ausdruck zu verwenden, der den Wert von c ersetzt, oder Ihr Skript ändern, um die berechneten Werte anstelle der Formel zu speichern. Der folgende Code demonstriert, wie Set Each Value() verwendet wird, um die Werte und nicht die Formeln zu speichern.
tcol = NR<<NEW column=""></NEW>