Hallo,
Ich habe ein Problem mit dem Skript.
Ich erhalte eine leere Spalte, wenn ich versuche, die Schleife zu verwenden.
Wenn ich keine Schleife verwende, funktioniert es.
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 />
Das erste, was ich sagen würde, ist, dass dies eine ist XY-Problem . Aber um die Frage zu beantworten, wie Sie ein Flag dazu bringen, eine dynamische Anzahl von Spalten zu überprüfen, würde ich die Formel außerhalb der Formel selbst erstellen.
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)))) ));
Sie können auch eine Liste mit Namen anstelle von Nummern erstellen.
Thx für deine Antwort.
* Laut Ihrem Skript funktioniert es nicht so gut - ich bekomme in jeder Zeile die gleiche Antwort, weil Sie nach der Schleife drucken.
* Was das große Problem betrifft -
Was schlagen Sie vor?
Ich muss überprüfen, ob jede Zeile (zu allen Spalten) zwischen LSL und USL - Aber das Problem ist, dass sich der Name der Spalten ständig ändert.

Ich vermute, dass Ihr Pass/Failed nicht als letzter berechneter Wert zurückgegeben wird.Die folgende Anpassung kann Ihr Problem lösen.
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>
Sie haben jedoch ein größeres Problem. Ihre Formel ist auf eine Speichervariable namens "c2" angewiesen, damit sie funktioniert.Wenn Sie jemals den Wert dieser Variablen ändern oder löschen, verwendet die Formel den geänderten Wert, um die Formel zu berechnen, oder wenn er gelöscht wurde, funktioniert die Formel überhaupt nicht mehr.