Attribuer une valeur à une cellule dans la boucle For Each Row, après qu'une valeur lui ait déjà été attribuée dans la même boucleJ'ai une fonction « Pour chaque ligne » qui fonctionne sur une table de données. Elle exécute une série d'instructions « If » pour évaluer les valeurs de certaines colonnes, puis, en fonction des résultats, attribue une valeur à une colonne :Correct_Process.
Actuellement, je l'ai configuré comme ceci.
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"
);
);
Lorsque j'exécute le script, si la valeur de :CPMC_Conductivity est « 13,2 » et celle de :Actual est « 13,5 », la colonne :Correct_Process conserve la valeur « Incorrect ». Il est intéressant de noter que le journal affiche « Évalué correct » en raison de l'instruction show() alors que je m'y attendais, ce qui signifie que les instructions If sont évaluées correctement, mais que la valeur « Correct » n'est pas attribuée à :Correct_Process.
Je suppose que c'est parce que j'affecte la colonne :Correct_Process par défaut à la première instruction If imbriquée, puis que j'essaie de l'écraser avec une vérification plus spécifique dans la troisième instruction If imbriquée. Mais j'ai des vérifications similaires dans ce groupe après celle-ci, qui semblent pouvoir écraser avec succès dans d'autres conditions (comme la deuxième instruction If imbriquée), donc je me demande ce qui m'échappe ici.
Automatisation et scriptsWindowsRe : Attribuer une valeur à une cellule dans la boucle For Each Row, après qu'une valeur lui ait déjà été attribuée dans la même boucleExiste-t-il une raison d'écraser la même valeur de cellule plusieurs fois dans la boucle ?
Re : Attribuer une valeur à une cellule dans la boucle For Each Row, après qu'une valeur lui ait déjà été attribuée dans la même bouclePouvez-vous également fournir un exemple d’ensemble de données ?
Vérification rapide que cela fonctionne bien
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";
);
);
Vous pouvez également utiliser << Commencer la mise à jour des données et << Terminer la mise à jour des données
Re : Attribuer une valeur à une cellule dans la boucle For Each Row, après qu'une valeur lui ait déjà été attribuée dans la même boucleLes trois fonctions If() de la première fonction If() seront exécutées indépendamment les unes des autres. Autrement dit, chacune d'elles sera évaluée pour chaque ligne, si la première fonction If() est vraie.
J'utiliserais le débogueur JSL et j'explorerais le code pas à pas pour identifier les changements de valeur. Cela vous indiquerait où la logique du code ne fonctionne pas comme prévu.
Si vous pouvez fournir un exemple de tableau de données, la communauté pourrait peut-être approfondir le problème.
Re : Attribuer une valeur à une cellule dans la boucle For Each Row, après qu'une valeur lui ait déjà été attribuée dans la même boucleNon, je travaillais à partir du script de quelqu'un d'autre et j'essayais de le restructurer, mais je ne comprenais pas comment ce résultat était obtenu. Votre question m'a donné une idée et, en creusant plus profondément, j'ai découvert que cette partie du script fonctionnait comme prévu ; elle était simplement écrasée plus tard. @txnelson J'utilisais le débogueur pour localiser le troisième écrasement, alors merci pour la suggestion !