Weisen Sie der Zelle in der For Each Row-Schleife einen Wert zu, nachdem ihr in derselben Schleife bereits ein Wert zugewiesen wurdeIch habe eine „For Each Row“-Funktion, die in einer Datentabelle arbeitet. Sie durchläuft eine Reihe von „If“-Anweisungen, wertet Werte in einigen Spalten aus und weist dann basierend auf den Ergebnissen einer Spalte „:Correct_Process“ einen Wert zu.
Derzeit habe ich es so eingerichtet.
For Each Row(
dt,
If( :Module == "M05" & :Measurement == "Conductivity",
If(:Actual > m5_cond_hi | :Actual < m5_cond_low,
:Correct_Process = "Incorrect",
:Correct_Process = "Correct"
);
If( splits_detected == 1 & Contains( col_name_list, "PMC_FreeForm" ),
If( :PMC_FreeForm == "DI" | Contains(:PMC_FreeForm, "Mod 5 pump off"),
If( :Actual != 0,
:Correct_Process = "Incorrect",
:Correct_Process = "Correct"
);
);
);
If( splits_detected == 1 & Contains( col_name_list, "CPMC_Conductivity" ),
num_cond = Num(:CPMC_Conductivity);
lim_hi = num_cond + 0.6;
lim_low = num_cond - 0.6;
If( :Actual > lim_hi | :Actual < lim_low,
show("Evaluated Incorrect");
:Correct_Process = "Incorrect",
show("Evaluated Correct");
:Correct_Process = "Correct"
);
);
Wenn ich das Skript ausführe und der Wert von :CPMC_Conductivity „13,2“ und :Actual 13,5 beträgt, wird der Spalte :Correct_Process dennoch der Wert „Falsch“ zugewiesen. Interessanterweise zeigt das Protokoll aufgrund der show()-Anweisung erwartungsgemäß „Korrekt ausgewertet“ an. Das bedeutet, dass die If-Anweisungen korrekt ausgewertet werden, :Correct_Process jedoch nicht den Wert „Korrekt“ zugewiesen bekommt.
Ich vermute, das liegt daran, dass ich die Spalte :Correct_Process standardmäßig mit der ersten verschachtelten If-Anweisung zuweise und dann versuche, sie mit einer spezifischeren Prüfung in der dritten verschachtelten If-Anweisung zu überschreiben. Ich habe jedoch ähnliche Prüfungen innerhalb dieser Gruppe nach dieser, die unter anderen Bedingungen (wie der zweiten verschachtelten If-Anweisung) erfolgreich überschreiben zu können scheinen. Daher frage ich mich, was ich hier übersehe.
Automatisierung und SkriptingWindowsBetreff: Weisen Sie einer Zelle in der For Each Row-Schleife einen Wert zu, nachdem ihr in derselben Schleife bereits ein Wert zugewiesen wurdeGibt es einen Grund, denselben Zellenwert innerhalb der Schleife mehrmals zu überschreiben?
Betreff: Weisen Sie einer Zelle in der For Each Row-Schleife einen Wert zu, nachdem ihr in derselben Schleife bereits ein Wert zugewiesen wurdeKönnen Sie außerdem einen Beispieldatensatz bereitstellen?
Schnelle Überprüfung, ob das funktioniert
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
For Each Row(dt,
If(:height > 60,
Write("\!N", Row(), " 1: If");
:sex = "A";
,
Write("\!N", Row(), " 1: Else");
:sex = "B";
);
If(:weight > 70,
Write("\!N", Row(), " 2: If");
:sex = "AA";
,
Write("\!N", Row(), " 2: Else");
:sex = "BB";
);
);
Sie können auch << Datenaktualisierung beginnen und << Datenaktualisierung beenden verwenden.
Betreff: Weisen Sie einer Zelle in der For Each Row-Schleife einen Wert zu, nachdem ihr in derselben Schleife bereits ein Wert zugewiesen wurdeDie drei If()-Funktionen unter der ersten If()-Funktion werden unabhängig voneinander ausgeführt. Das heißt, jede von ihnen wird für jede Zeile ausgewertet, wenn die erste If()-Funktion True ist.
Ich würde den JSL-Debugger verwenden und den Code schrittweise durchgehen und nach Wertänderungen suchen. So werden Ihnen die Stellen angezeigt, an denen die Codelogik nicht wie gewünscht funktioniert.
Wenn Sie eine Beispieldatentabelle bereitstellen können, kann die Community möglicherweise tiefer in das Problem einsteigen.
Betreff: Weisen Sie einer Zelle in der For Each Row-Schleife einen Wert zu, nachdem ihr in derselben Schleife bereits ein Wert zugewiesen wurdeNein, ich arbeite mit dem Skript einer anderen Person und versuche, es umzustrukturieren, war aber verwirrt, wie dieses Ergebnis zustande kam. Ihre Frage brachte mich jedoch auf eine Idee, und ich habe genauer nachgeforscht und festgestellt, dass dieser Teil des Skripts wie vorgesehen funktioniert. Er wurde nur später im Skript erneut überschrieben. @txnelson Ich habe den Debugger verwendet, um die dritte Überschreibung zu finden. Danke für den Tipp!