Lorsqu'une spécification est activée, comment puis-je écrire un script lorsque je veux écrire un nom d'échec ?
Salut, j'ai une question.
Lorsqu'une spécification est activée, comment puis-je écrire un script lorsque je veux écrire un nom d'échec ? comme l'image ci-dessus.
Veuillez vous référer à la pièce jointe (juste des échantillons).
Dans les données réelles que j'écris, il y a 1000 colonnes.
Merci
Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?*rappeler
@txnelson
Wow, merci, j'ai encore une question.
Si seules les 100 colonnes du milieu sur 1 000 n'ont pas de spécifications ou aucune valeur, ce script ne fonctionnera pas. Pouvez-vous le résoudre?
Et je veux que la colonne Pass fail soit au premier plan.
Merci beaucoup pour votre aide!Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?Merci beaucoup Michelle G !!
Ce script m'a été d'une grande aide.
Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?Wow, merci, j'ai encore une question.
Si seules les 100 colonnes du milieu sur 1 000 n'ont pas de spécifications, ce script ne fonctionnera pas. Pouvez-vous le résoudre?
Et je veux que la colonne Pass fail soit au premier plan.
Merci beaucoup pour votre aide!Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?Voici mon point de vue sur l'utilisation des limites de spécification dans la propriété de colonne de chaque colonne pour tester chaque ligne.La méthode utilisée pour le test consiste à appliquer un Range Check à chaque colonne.Ceci est utilisé car c'est un moyen très efficace de traiter toutes les données d'une colonne en une seule opération.Compte tenu du nombre de colonnes que vous traitez, cette méthode devrait être plus efficace que de tester chaque cellule.Dans le script, j'utilise la table de données Semiconductor du dossier Sample Data.Il a toutes les limites de spécification définies pour les 128 colonnes de mesure.
Names Default To Here( 1 );
dtOrig = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
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 );Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?D'accord, je ne connais pas ce complément, mais peut-être son auteur @txnelson peut parler de la façon d'intégrer les informations de ce complément ici. J'ai écrit un petit exemple qui ferait ce que vous recherchez, testé par rapport à votre exemple de table à 7 colonnes, et j'espère qu'il est extensible à votre version à 1000 colonnes. Je suppose que nous avons une liste de limites supérieures (UL) et une liste de limites inférieures (LL) qui sont dans le même ordre que les colonnes. Vous pouvez lire dans une colonne à partir d'une table de données, si nécessaire, je ne sais tout simplement pas où accéder à la table de données à partir du complément.
Il existe de nombreuses façons différentes de mettre cela en œuvre. Ce que j'ai écrit n'est qu'un moyen. Le plan général que j'ai utilisé est le suivant : vérifiez chaque colonne par rapport à ses limites respectives. S'il est hors spécifications, ajoutez-le à une liste en le notant. A la fin de la boucle, si la liste est vide, écrivez PASS. Sinon, concaténez tous les éléments de la liste.
dt = current data table(); // Process Measurements.jmp
// I just made these up.
// Assuming they are in the same order as the column names
ul = {10.5, 13.8, 2, 5, 1.1, 0.8, 11.8};
ll = {5.5, 13.4, 0.1, 1, 0.2, 0.2, 7};
col_list = dt << get column names(String);
dt << New Column("Check", Character, Nominal); // make blank column
// note that the new column is not in col_list
For Each Row( // in current data table
failcheck = {}; // initialize empty list
For(c=1, c<=N Items(col_list), c++, // loop over columns in col_list
// check if lower than LL or higher than UL
If(column(dt,col_list[c])[] < ll[c] | column(dt,col_list[c])[] > ul[c],
// if so, add this column to the failcheck list
Insert Into(failcheck, col_list[c])
)
);
If(N Items(failcheck)==0, // is the list empty?
column(dt,"Check")[] = "PASS",
column(dt,"Check")[] = Concat Items(failcheck,", ")
);
);Est-ce que ça a du sens? Faites-moi savoir si vous avez des questions sur ce qui se passe.
Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?Oui! c'est vrai.
Si chaque colonne est dans les spécifications, je veux simplement écrire "PASS".
Il n'y a pas de limites. Si chacun est mauvais, je veux écrire tous ceux qui sont énumérés.
J'ajoute les spécifications LSL, USL à l'aide du programme complémentaire illustré ci-dessous.
https://community.jmp.com/t5/JMP-Add-Ins/Write-Limits-to-a-Data-Table-from-a-Limits-Table/ta-p/35790
Merci beaucoup pour votre aide
Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?D'accord, vous voulez ajouter une colonne où elle répertorie toutes les colonnes de processus spécifiées. Autrement dit, vous souhaitez vérifier chaque colonne et ajouter une chaîne pour cette ligne en fonction du fait qu'une condition est mauvaise ou non pour les données de cette colonne. Droite? Si chaque colonne est conforme aux spécifications, que doit-elle faire ? Y a-t-il une limite au nombre de noms de colonnes que vous voulez lister, ou voulez-vous potentiellement tous les 7 (ou 1000) listés si chacun est mauvais ?
Comment savez-vous quelles colonnes sont spécifiées ? Je demande juste la/les opération(s) mathématique(s), pas les nombres exacts. Je soupçonne qu'il existe une limite de spécification unique (ou des limites) pour chaque colonne. Pour 7 colonnes, nous pourrions simplement le définir dans un tableau sur lequel nous effectuons une boucle, mais pour 1000 colonnes, vous allez probablement le vouloir dans une table de référence dans laquelle vous lisez.Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?La pièce jointe a 7 colonnes et je souhaite en ajouter une afin de vérifier les spécifications des colonnes.
Je voulais juste vous faire savoir qu'il y a 1000 colonnes de données que j'écris dans l'entreprise et que je ne peux pas les télécharger à cause de la confidentialité.
Si vous me faites savoir comment faire cela sur la pièce jointe, je vais le modifier sur mes données.
Merci!
Re : Lorsqu'une spécification est activée, comment écrire un script lorsque je veux écrire un nom d'échec ?Que faites-vous pour déterminer le nom d'échec que vous voulez écrire ? Cela est nécessaire pour vous aider à écrire un script pour le faire. Il semble que vous souhaitiez étiqueter la ligne en fonction de certaines découvertes dans ces 1000 colonnes de processus.