Création de colonnes de formule dans une boucle ForJ'ai un script qui calcule les taux de non-conformité pour les codes de non-conformité et crée également des graphiques de contrôle pour chaque code sur une plage de dates saisie par l'utilisateur. L'utilisateur peut entrer jusqu'à cinq codes individuels et choisir parmi plus de 50 codes. Une table a été créée. Elle contient la quantité totale non conforme par code et par date, la somme des quantités non conformes de tous les codes entrés et la quantité totale fabriquée par jour (Taux CN par date et par code - Original). Ensuite, j'ajoute à la table en parcourant une boucle l'ajout d'une colonne pour calculer le taux de non-conformité pour chaque code, puis une seconde pour afficher le taux sous forme de pourcentage (Taux CN par date et par code complet). À l'heure actuelle, toutes les colonnes de taux sont identiques et les colonnes de pourcentage ne correspondent pas à la version en pourcentage correcte du taux.
La boucle est fondamentalement identique à celle créée à la toute fin du script pour résumer les données de non-conformité sur toute la plage de dates (Taux global par code CN - Original, Taux global par CN - Complet) qui calcule correctement Dites ce qui ne va pas.
J'ai créé des captures d'écran des tables de discussion et des sections de script (codes = liste de tous les codes entrés sous forme de chaînes, SD et NR sont des références de table)
//NC Rate By Date Per Code Section
//Calculate NC rates and percentages for entered codes if two or more codes are entered
If(NItems(codes)>=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
NR<<NEW column="">=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
SD<<NEW column=""></NEW></NEW>Re: Création de colonnes de formule dans une boucle For @rfeick ,
Il existe une différence entre les fomules des deux dernières colonnes et celles créées dans votre boucle for. Les deux dernières colonnes font référence à la colonne réelle pour effectuer le calcul.
Vous devriez regarder plusieurs des formules de colonnes créées par votre spécification de boucle for (voir ci-dessous).
NR<<NEW column=""></NEW>
La formule ressemblera à ceci, elle n’aura pas la valeur de c et le résultat obtenu sera le résultat de la valeur finale de c.
<SPAN class="token function">Round</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>c<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">/</SPAN> <SPAN class="token punctuation">:</SPAN>Manufactured Qty<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token number">4</SPAN><SPAN class="token punctuation">)</SPAN>
Si vous enregistrez cette table, puis l'ouvrez dans une nouvelle session JMP et que vous réexécutez des formules, ces colonnes seront vides, JMP ne saura pas la valeur de c.
Vous devez soit modifier votre formule pour utiliser une expression qui substitue la valeur de c, soit modifier votre script pour stocker les valeurs calculées à la place de la formule. Le code ci-dessous montre comment utiliser Définir chaque valeur () pour stocker les valeurs et non les formules.
tcol = NR<<NEW column=""></NEW>
Re: Création de colonnes de formule dans une boucle For, Merci pour l'explication. J'ai essayé la méthode Set Each Row et elle a résolu le problème que je voyais lors du calcul des taux de non-conformité par jour. Le seul point sur lequel je suis encore confus est de savoir comment la même théorie a fonctionné dans une section du script, mais pas dans l'autre?Re: Création de colonnes de formule dans une boucle For @rfeick ,
Nous espérons que le script ci-dessous vous aidera à comprendre qu'à partir de JMP14, l'utilisation d'une variable dans une colonne de formule peut produire des résultats erronés car lorsque la valeur de la variable change, les formules (et ses valeurs) changent.
Concernant les deux dernières formules de votre script:
Exécutez le script ci-dessous comme décrit. Il montre ce qui se passe dans vos formules de table, et donc les valeurs. Ce script comprend également une méthode pour remplacer la variable dans la formule par la valeur des variables à l'aide d'expressions. J'utilise généralement Set Each Value (), donc si la colonne source est supprimée, la colonne est intacte. Notez également que ce script utilise c le numéro de colonne. Si je voulais que la formule soit intégrée, je recommande de créer une nouvelle variable cnme = Colonne (c) << obtenir le nom , puis utilisez Colonne (cnme) et expressions. Ensuite, si la table est réorganisée, etc. la formule est comme prévu (intacte). Le script affiché ci-dessous est joint.
Names Default to Here(1);
dt = Open("$Sample_Data/Big Class.jmp");
//will create formula columns for height and weight using a relative column number , c
//c will change, simulating a loop.
//highlight the blocks of code and follow the instructions
//--- Block 0: run this to embed the log window
_cw = Current Window();
_ifb = _cw << Find( If Box( 1 ) );
wait(0);
_ifb << Set( 1 );
//--- end Block 0
//--- Block 1: run it and look at the look at the embedded log
c=4; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 1
//--- Block 2: run it and look at the look at the embedded log
c=5; //weight
dt << rerun formulas;
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 2 See the log, the formula is the same, but c has changed so the formula is now using column 5 (c=5)
// for its calculation
//--- Block 3: run it and look at the look at the log
c=5; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc2 = ncol(dt);
show( c, nc2, (column(nc2) << get formula), column(nc2)[1::5]); //same formula as nc1
show(column(nc1)[1::5], column(nc2)[1::5]);
//--- end Block 3
//will use formula columns for weight and height using expressions column number
//--- Block 4: run it and look at the look at the log
c=4; //height
Eval ( Eval Expr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(expr(c))[] /:age,2) ) )
));
nc3 = ncol(dt);
show( c, nc3, (column(nc3) << get formula), column(nc3)[1::5]);
//--- end Block 4 - note the formula now has the exact column number, it no longer relies on "c"
//--- Block 5: run it and look at the look at the log
c=5; //height
Eval(EvalExpr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(Expr(c))[] /:age,2) ) );
));
nc4 = ncol(dt);
show( c, nc4, (column(nc4) << get formula), column(nc4)[1::5]); //not the same formula as nc3,
show(column(nc3)[1::5], column(nc4)[1::5]);
//--- end Block 5
Re: Création de colonnes de formule dans une boucle ForMerci pour l'explication supplémentaire!