Comment fonctionne la formule réussite/échec ?J'ai un problème où les formules renvoient des valeurs nulles.
La table brute contient les données brutes et une table de spécifications permet de déterminer si les données brutes sont conformes à la table de spécifications. J'ai écrit un JSL. Aidez-moi à identifier le problème. Merci.
Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
LSL = dtbz[0, 3];
USL = dtbz[0, 4];
dtbz << New Column( "combine", formula( :Project || :Item ) );
// Create separate judgment columns for the columns to be judged
items = Design( dtbz:Item << get values(), <
<LEVELS>
0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "A" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "A" || it )[1]], :Project == "B" & N Items( Loc( dtbz:combine << get as matrix(), "B" || it ) ) > 0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "B" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "B" || it )[1]], :Project == "C" & N Items( Loc( dtbz:combine << get as matrix(), "C" || it ) ) > 0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "C" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "C" || it )[1]], :Project == "D" & N Items( Loc( dtbz:combine << get as matrix(), "D" || it ) ) > 0, dtbz:LSL[Loc( dtbz:combine << get as matrix(), "D" || it )[1]] <= Column( dt1, items[i] ) <= dtbz:USL[ Loc( dtbz:combine << get as matrix(), "D" || it )[1]], ) ) ) );
</LEVELS>
Automatisation et scriptsRe : Comment fonctionne la formule réussite/échec ?Voici une refonte de votre script qui je pense le simplifie, et vous fournit toujours vos rendements

Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
LSL = dtbz[0, 4];
USL = dtbz[0, 5];
//dtbz << New Column( "combine", formula( :Project || :Item ) );
dtbz << New Column( "combine", character, formula( :Project || :Item ) );
// Create separate judgment columns for the columns to be judged
// items = Design( dtbz:Item << get values(), <<LEVELS> 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "A" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "A" || it )[1]],
:Project == "B" & N Items( Loc( dtbz:combine << get as matrix(), "B" || it ) ) > 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "B" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "B" || it )[1]],
:Project == "C" & N Items( Loc( dtbz:combine << get as matrix(), "C" || it ) ) > 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "C" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "C" || it )[1]],
:Project == "D" & N Items( Loc( dtbz:combine << get as matrix(), "D" || it ) ) > 0,
dtbz:USL[Loc( dtbz:combine << get as matrix(), "D" || it )[1]] <= Column( dt1, items[i] )
<= dtbz:USL[Loc( dtbz:combine << get as matrix(), "D" || it )[1]],
)
)
);*/
Eval(
Substitute(
Expr(
dt1 << New Column( it || "—yield",
formula(
curProject = :Project;
Try( dtbzRow = (dtbz << get rows where( dtbz:Project == curProject & dtbz:item == __it__ ))[1], 0 );
If( dtbzRow > 0,
If( dtbz:LSL[dtbzRow] <= As Column( dt1, __it__ ) <= dtbz:USL[dtbzRow],
1,
0
)
);
)
)
),
Expr( __it__ ), it
)
);
);</LEVELS>
Re : Comment fonctionne la formule réussite/échec ?Merci beaucoup pour votre réponse rapide, ça marche.
Re : Comment fonctionne la formule réussite/échec ?Salut Jim , un autre petit problème est que lorsque l'USL et le LSL correspondants ne sont pas trouvés dans la table de spécifications, la valeur nulle doit être renvoyée, mais ce code s'exécute et renvoie 0. Je ne sais pas ce qui se passe.
Re : Comment fonctionne la formule réussite/échec ?La modification originale que j'ai fournie supposait que toutes les limites de spécification seraient disponibles.Pour tenir compte du potentiel de limites manquantes, les formules doivent être modifiées pour gérer ces cas.Le JSL ci-dessous s'adapte à quelques cas possibles, mais vous devrez peut-être en ajouter d'autres, comme :
L'USL est inférieur au LSL
Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
// Create separate judgment columns for the columns to be judged
// items = Design( dtbz:Item << get values(), <<LEVELS> 0 & Is Missing( dtbz:LSL[dtbzRow] ) == 0 & Is Missing( dtbz:USL[dtbzRow] ) == 0,
If( dtbz:LSL[dtbzRow] <= As Column( dt1, __it__ ) <= dtbz:USL[dtbzRow],
1,
0
),
.
);
)
)
),
Expr( __it__ ), it
)
);
);</LEVELS>Re : Comment fonctionne la formule réussite/échec ?Merci, mais j'ai une question, pourquoi le code précédent avait-il ce problème? Je vois que la logique du code précédent est la suivante : s'il est trouvé dans la table SPEC, alors le jugement, introuvable et il n'y a pas de code, devrait être la valeur vide ah, pourquoi le juge-t-il encore ?
Re : Comment fonctionne la formule réussite/échec ?Les valeurs calculées persistent d'une ligne à l'autre, donc si une condition de la ligne 2 n'apporte pas de modification à la valeur calculée, la valeur qui a été calculée pour la ligne 1 reste inchangée.
Re : Comment fonctionne la formule réussite/échec ?Merci! Je l'ai essayé et en effet sous le code précédent, s'il n'est pas trouvé dans la table SPEC, il passera par le dtbzRow de la ligne précédente. Il est clairement introuvable, mais il appuie toujours sur la valeur de la ligne précédente. Je ne trouve pas cela dans les formules de routine, est-ce que cela se produit uniquement lorsque j'utilise une recherche d'une autre table ?
Re : Comment fonctionne la formule réussite/échec ?Les variables de mémoire dans JMP restent persistantes jusqu'à ce qu'elles soient modifiées.Voici un script qui crée une nouvelle colonne et formule qui définit une variable "a" sur la ligne 1, puis la modifie à la ligne 10. Vous pouvez voir que la valeur de "a" ne change pas jusqu'à la ligne 10, mais reste à la valeur de consigne initiale jusque-là.
Names Default To Here( 1 );
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: Column 6
Data Table( "Big Class" ) << New Column( "test",
Numeric,
"Continuous",
Format( "Best", 12 )
);
dt:test << set formula(
If( Row() == 1, a = 1 );
If( Row() == 10, a = a + 1 );
:test = a;
);
Re : Comment fonctionne la formule réussite/échec ?Je vois, c'est parce que s'il ne peut pas être trouvé dans l'instruction try, il ne lui sera pas attribué, ce qui donnera la valeur d'origine, mais il ne peut pas être trouvé dans la première ligne au début, alors comment est il a attribué?
Re : Comment fonctionne la formule réussite/échec ?J'ai annoté le script dans le but d'en faciliter la lecture.J'ai également apporté une modification mineure à la fonction Try(), en la déplaçant pour fournir un résultat à dtbzRow.
Voir si cela aide à comprendre
Names Default To Here( 1 );
//raw data
dt = Data Table( "raw data001" );
dt1 = dt << subset( all rows, all columns );
//spec table
dtbz = Data Table( "Spec" );
// Create separate judgment columns for the columns to be judged
// items = Design( dtbz:Item << get values(), <<LEVELS> 0 & Is Missing( dtbz:LSL[dtbzRow] ) == 0 &
Is Missing( dtbz:USL[dtbzRow] ) == 0,
// If the column's value is between the LSL and USL
// the value is set to 1, if outside one of the
// limits it is set to 0
If(
dtbz:LSL[dtbzRow] <= As Column( dt1, __it__ ) <= dtbz
:USL[dtbzRow],
1,
0
),
.
);
)
)
),
Expr( __it__ ), it
)
);
);</LEVELS>Re : Comment fonctionne la formule réussite/échec ?Je comprends, merci pour votre patience !