For ループを使用して新しい列を作成するやあ
forループを使用して新しい列を作成しようとしています
names default to here (1);
dt = current data table ();
summarize (PN=by (:Name("~DEVICE TYPE" )));
for (i=1, i <= N items(PN), i++,
new column("Cnt "||PN[i],
formula(If( :Name( "~DEVICE TYPE" ) == PN[i],
If( :SERIAL_NO || :TIME_DATE == Lag( :SERIAL_NO || :TIME_DATE, -1 ),0,1)
))));
新しい列を作成できますが、式が機能しません。 ログ ファイルには、以下のエラー メッセージが表示されます。
Column Cnt TRB100BC-08 Formula Interrupted
Subscript Range 1 times At rows: 2 Operation: PN[i], PN[/*###*/i]
Formula evaluation errors have been ignored
Re: For ループを使用して新しい列を作成するありがとうRe: For ループを使用して新しい列を作成するあなたが抱えている主な問題は、 New Column() 関数内の Formula 要素が処理前に評価されないため、仕様 PN[i] を数式に配置し、ループ時に変数 "i" が変化するためです。作成している各列の式が変更されます。したがって、式を静的な値に変更する必要があります。つまり、インストールされた数式に PN[i] を持たせるのではなく、実際に評価された PN[i] の値を持たせたいということです。Substitution() 関数はこれを可能にします。以下のスクリプトはあなたが望むことをすると思います
Names Default To Here( 1 );
dt = Current Data Table();
Summarize( PN = by( :Name( "~DEVICE TYPE" ) ) );
PN={"X"}
For( i = 1, i <= N Items( PN ), i++,
Eval(
Substitute(
Expr(
New Column( __name__,
formula(
If( :Name( "~DEVICE TYPE" ) == __PN__,
If(
:SERIAL_NO || :TIME_DATE ==
Lag( :SERIAL_NO || :TIME_DATE, -1 ),
0,
1
)
)
)
)
),
Expr( __name__ ), "Cnt " || PN[i],
Expr( __PN__ ), PN[i]
)
)
);