Salut,
J'ai un problème avec le script.
J'obtiens une colonne vide lorsque j'essaie d'utiliser la boucle.
Quand je n'utilise pas de boucle, ça marche.
col = dt << get column names;
For(i = 1, i <= N Items(col), i++,
c = "c" || Char(i);
Eval(Parse(Eval Insert("^c^= column(dt,i)<<GET values=""></GET>New Column( "Flag",<BR /> Character,<BR /> Nominal,<BR /> Formula(for(i=1,i<3,i++,<BR /> if(c2[i]>:LSL[i],"Pass","Failed"))));<BR />
La première chose que je dirais, c'est qu'il s'agit d'un Problème XY . Mais pour répondre à la question de savoir comment faire en sorte qu'un indicateur vérifie un nombre dynamique de colonnes, je construirais la formule en dehors de la formule elle-même.
names default to here(1);
dt = New Table( "Test",
Add Rows( 5 ),
Set Header Height( 46 ),
New Column( "System",
Character,
"Nominal",
Set Values( {"F_T_F_S", "F_T_F_R", "F_T_F_T", "F_T_F_U", "F_T_F_V"} )
),
New Column( "01/09/2019",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [500, 450, 900, 358, 500] )
),
New Column( "01/10/2019",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [666, 120, 280, 852, 456] )
),
New Column( "01/11/2019",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [520, 500, 450, 520, 520] )
),
New Column( "01/12/2019",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [450, 666, 120, 450, 450] )
),
New Column( "LSL",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [500, 800, 800, 0, 0] )
),
New Column( "USL",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [980, 1100, 1100, 3700, 3700] )
)
);
//build the formula outside of the formula itself
ANDExpr = Expr(AND()); // we're going to throw all relavent columns into this AND Expression
for(i=2, i<=5, i++,
col = Column(i);
insert into(ANDExpr,
EvalExpr(:LSL < Expr(col)[] < :USL) // for each column check that it's between LSL & USL
);
);
f = EvalExpr(
if(Expr(nameexpr(ANDExpr)),
"Pass",
"Fail"
)
);
show(nameexpr(f));
Eval(EvalExpr(dt << New Column("Flag", formula(Expr(nameexpr(f)))) ));
Vous pouvez également faire une liste de noms au lieu de chiffres.
Merci pour votre réponse.
* Selon votre script, cela ne fonctionne pas si bien - j'obtiens la même réponse à chaque ligne, car vous imprimez après la boucle.
* Quant au gros problème -
Que proposez-vous de faire ?
Je dois vérifier que chaque ligne (sur toutes les colonnes) entre le LSL et l'USL - Mais le problème est que le nom des colonnes change tout le temps.

Je soupçonne que votre réussite/échec n'est pas renvoyé comme la dernière valeur calculée.Le réglage suivant peut résoudre votre problème.
col = dt << get column names;
For( i = 1, i <= N Items( col ), i++,
c = "c" || Char( i );
Eval( Parse( Eval Insert( "^c^= column(dt,i)<<GET values=""> :LSL[i],
x = "Pass",
x = "Failed"
)
);
x;
)
);</GET>
Cependant, vous avez un problème plus important. Votre formule repose sur une variable de mémoire appelée "c2" pour qu'elle fonctionne.Si jamais vous modifiez ou supprimez la valeur de cette variable, la formule utilisera la valeur modifiée pour calculer la formule, ou si elle a été supprimée, la formule ne fonctionnera plus du tout.