Mi piacerebbe ottenere una colonna pass_fail e @txnelson è arrivato alla sceneggiatura.
Ma, t il suo script non funziona se una delle tante colonne non ha una specifica nel mezzo.
Come posso risolverlo?
Names Default To Here( 1 );
dtOrig = current data table();
colNamesList = dtOrig << get column names( continuous, string );
// Create a work table of just the continuous columns
dt = dtOrig << subset( columns( colNamesList ), selected rows( 0 ) );
// Loop across all of the columns and apply a Range Check to eliminate
// all data outside of the upper and lower spec limits
For( theCol = 1, theCol <= N Items( colNamesList ), theCol++,
specs = Column( dt, colNamesList[theCol] ) << get property( "spec limits" );
Eval(
Substitute(
Expr(
Column( dt, colNamesList[theCol] ) << set property(
"Range Check",
(LELE( __LSL__, __USL__ ))
)
),
Expr( __LSL__ ), specs["LSL"],
Expr( __USL__ ), specs["USL"]
)
);
// Now convert the column to numeric
Column( dt, colNamesList[theCol] ) << data type( character );
// Now find all cells where values were eliminated
dt << select where( As Column( dt, colNamesList[theCol] ) == "" );
// If non passing rows were found, process the column to change the passing rows to
// a blank, and non passing to the name of the column
If( N Rows( dt << get selected rows ) > 0,
// Now set all eliminated cells to have the value of the name of the column
Column( dt, colNamesList[theCol] )[dt << get selected rows] = Column( dt, colNamesList[theCol] ) <<
get name;
// Invert the row selection, to select all rows where values passed and set them to a blank
dt << invert row selection;
Column( dt, colNamesList[theCol] )[dt << get selected rows] = "";
, // else set all
Column( dt, colNamesList[theCol] )[Index( 1, N Rows( dt ) )] = ""
);
);
// Now create a new column to hold the information on either that the row Passed or
// which columns failed
dt << New Column( "Pass_Fail", Character );
// Loop across all rows and set the values for the new column
For( theRow = 1, theRow <= N Rows( dt ), theRow++,
If( Trim( Concat Items( dt[theRow, 0, ""] ) ) == "",
:Pass_Fail[theRow] = "Pass"
,
thePass_Fail = Concat Items( dt[theRow, 0], "," );
For( i = Length( thePass_Fail ), i >= 2, i--,
If( Substr( thePass_Fail, i, 1 ) == ",",
If( Substr( thePass_Fail, i - 1, 1 ) == ",",
thePass_Fail = Substr( thePass_Fail, 1, i - 1 ) || Substr( thePass_Fail, i + 1 )
)
)
);
If( Right( thePass_Fail, 1) == ",", thePass_Fail = Left( thePass_Fail, length( thePass_Fail ) - 1 ) );
:Pass_Fail[theRow] = thePass_Fail;
)
);
// Only the new column is what is needed, so delete all other columns
dt << delete columns( eval(colNamesList) );
// Add the new column to the original data table
dtOrig << Update(
With( dt )
);
// Delete the no longer needed work table
close(dt, nosave );
Devo ringraziare @Byron_JMP per aver risposto.Avevo intenzione di rispondere a questa discussione, e prima che lo facessi, è passata a una pagina più vecchia e quindi è uscita dalla mia memoria.La risposta di Byron ha riportato la discussione nel mio NameSpace.
Credo che tutto ciò che devi fare per risolvere il tuo problema sia convalidare che una determinata colonna abbia dei limiti di specifica ad essa associati.E, se non vengono trovati limiti di specifica, non elaborare quella colonna.Di seguito è riportato un cambiamento suggerito un po 'criptico che potrebbe fare ciò che desideri.La base del problema è utilizzare una funzione If() per elaborare il codice solo quando vengono rilevati i limiti delle specifiche Questoèun sostituto per le tue attuali specifiche = riga di codice
clear symbols(specs);
specs = Column( dt, colNamesList[theCol] ) << get property( "spec limits" );
If(isEmpty(specs)==0,
<ALL of="" the="" code="" to="" the="" end="" of="" the="" for="" loop=""></ALL>
Mi piace semplice, come me!
Quindi l'ho semplificato (nessun annidamento richiesto):
If( :Data >= 42, "Too High", :Data < 7, "Too Low", "Just Right")
TXnelson scrive un codice davvero favoloso!
Tuttavia, forse stai cercando una soluzione semplice come:
If( :Data >= 42,"Too High",If( :Data < 7,"Too Low","Just Right"))

questa è solo un'istruzione If nidificata se i valori dei dati sono 42 o superiori, la formula restituisce "Troppo alto", quindi se i dati sono inferiori a 7 restituisce "Troppo basso" e se non è né troppo alto né troppo basso, quindi la formula restituisce "Giusto"
È possibile incollare la formula nell'editor delle formule e quindi sostituirla con il nome, i valori e i messaggi della colonna corretti. (Fai clic con il pulsante destro del mouse sul nome della colonna, fai clic su formula e incolla il JSL sopra nella finestra di dialogo)
Saluti,
B