Je voudrais obtenir une colonne pass_fail, et @txnelson l'a fait au script.
Mais, t son script ne fonctionne pas si l'une des nombreuses colonnes n'a pas de spécification au milieu.
Comment puis-je résoudre ce problème ?
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 );
je dois remercier @Byron_JMP pour répondre.J'avais l'intention de répondre à cette discussion, et avant que je ne le fasse, elle est passée à une page plus ancienne et elle est donc tombée de ma mémoire.La réponse de Byron a renvoyé la discussion dans mon NameSpace.
Je pense que tout ce que vous avez à faire pour résoudre votre problème est de valider qu'une colonne donnée est associée à des limites de spécification.Et, si aucune limite de spécification n'est trouvée, ne traitez pas cette colonne.Vous trouverez ci-dessous une suggestion de modification quelque peu énigmatique qui peut faire ce que vous voulez.La base du problème est d'utiliser une fonction If() pour ne traiter le code que lorsque les limites des spécifications sont trouvées Ceci remplace vos spécifications actuelles = ligne de code
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>
J'aime la simplicité, comme moi !
Je l'ai donc simplifié (pas d'imbrication requise):
If( :Data >= 42, "Too High", :Data < 7, "Too Low", "Just Right")
TXnelson écrit un code vraiment fabuleux !
Cependant, peut-être recherchez-vous une solution simple comme :
If( :Data >= 42,"Too High",If( :Data < 7,"Too Low","Just Right"))

il s'agit simplement d'une instruction If imbriquée si les valeurs de données sont de 42 ou plus, la formule renvoie "Trop élevé", puis si les données sont inférieures à 7, elles renvoient "Trop bas", et si ce n'est ni trop haut ni trop bas, alors la formule renvoie "Just Right"
Vous pouvez coller la formule dans l'éditeur de formule, puis la remplacer par le nom de colonne, les valeurs et les messages corrects. (Cliquez avec le bouton droit sur le nom de la colonne, cliquez sur la formule et collez le JSL ci-dessus dans la boîte de dialogue)
Acclamations,
B