Assegna un valore alla cella nel ciclo For Each Row, dopo che le è già stato assegnato un valore nello stesso cicloHo una funzione "For Each Row" che lavora su una tabella dati. Esegue una serie di istruzioni If valutando i valori in alcune colonne e poi, in base ai risultati, assegna un valore a una colonna :Correct_Process.
Attualmente l'ho configurato così.
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"
);
);
Quando eseguo lo script, se il valore di :CPMC_Conductivity è "13,2" e quello di :Actual è 13,5, alla colonna :Correct_Process viene comunque assegnato il valore "Incorrect". È interessante notare che il log mostra "Evaluated Correct" a causa dell'istruzione show(), quando me lo aspetterei, il che significa che le istruzioni If vengono valutate correttamente, ma a :Correct_Process non viene assegnato il valore "Correct".
Presumo sia perché assegno la colonna :Correct_Process per impostazione predefinita con la prima istruzione If annidata, per poi provare a sovrascrivere con un controllo più specifico nella terza istruzione If annidata. Tuttavia, ho controlli simili all'interno di questo gruppo, dopo questo, che sembrano in grado di sovrascrivere correttamente in altre condizioni (come la seconda istruzione If annidata), quindi mi chiedo cosa mi stia sfuggendo.
Automazione e scriptingFinestreRe: Assegna un valore alla cella nel ciclo For Each Row, dopo che le è già stato assegnato un valore nello stesso cicloC'è un motivo per sovrascrivere lo stesso valore di cella più volte all'interno del ciclo?
Re: Assegna un valore alla cella nel ciclo For Each Row, dopo che le è già stato assegnato un valore nello stesso cicloPuoi anche fornire un esempio di set di dati?
Controllo rapido che funzioni bene
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";
);
);
Potresti anche voler utilizzare << Inizia aggiornamento dati e << Termina aggiornamento dati
Re: Assegna un valore alla cella nel ciclo For Each Row, dopo che le è già stato assegnato un valore nello stesso cicloLe 3 funzioni If() sotto la prima funzione If() verranno eseguite indipendentemente l'una dall'altra. Ognuna di esse verrà valutata per ogni riga, se la prima funzione If() è True.
Io userei il debugger JSL e analizzerei il codice passo passo cercando di capire quando il valore cambia. Ti mostrerà dove la logica del codice non funziona come vorresti.
Se puoi fornire una tabella di dati di esempio, la comunità potrebbe essere in grado di approfondire il problema
Re: Assegna un valore alla cella nel ciclo For Each Row, dopo che le è già stato assegnato un valore nello stesso cicloNo, sto lavorando sullo script di qualcun altro e sto cercando di ristrutturarlo, ma non sapevo come ottenere questo risultato. La tua domanda mi ha dato un'idea, ho approfondito la questione e ho scoperto che questa parte dello script funziona come previsto, solo che veniva sovrascritta più avanti nello script. @txnelson Ho usato il debugger per individuare la terza sovrascrittura, quindi grazie per il suggerimento!