JSLコードに明示的なテーブル参照を追加すると予期しない結果が生じる大規模な自動ワークフローに追加したい短いJSLスクリプトがあります。列(layer_type)の値を反復処理し、SSOD以外の値が見つかった場合は1を返すようにしたいです。列のすべての値が「SSOD」の場合は0を返すようにしたいです。これは、ワークフロー内のif/else分岐でエラーをスローするために使用しています。もし、より良いコーディング方法があれば、ぜひ教えてください。
既存のコードを参考に、ワークフローから取り出してデバッグしました。JSLウィンドウで適切なデータテーブルを選択して実行すると、コードは意図したとおりに動作します。しかし、ユーザー向けのワークフローに挿入するため、データテーブル名を明示的に指定することでより堅牢性が高まると考えたため、コードの最初の行を追加すると意図したとおりに動作しなくなりました。実行はされますが、列の値に関係なく常に「1」が返されます。
以下のJSLをスクリプトウィンドウで実行し、添付の表を参照すると、期待どおりの結果が得られます。添付の表は「0」を返すことに注意してください。「layer_type」列の1行の値を他の値に変更すると、1が返されます。

Summarize( meas = by( :layer_type ) );
result = 0;
For( i = 1, i <= N Items( meas ), i++,
If( meas[i] != "SSOD",
result = 1;
Break();
)
);
result;
However, when I modify only the beginning of the JSL to explicitly reference the table it no longer works - when I change a single value in the 'layer_type' column to anything other than SSOD it continues to return '0'. In fact I've tested this both ways by commenting out the Data Table( "layer_type_forum_help" ) << code and it seems it always returns what was previously returned when the block started with the 'Summarize' command
Data Table( "layer_type_forum_help" ) << Summarize( meas = by( :layer_type ) );
result = 0;
For( i = 1, i <= N Items( meas ), i++,
If( meas[i] != "SSOD",
result = 1;
Break();
)
);
result;
先回りしてご協力いただきありがとうございます!
自動化とスクリプトRe: JSLコードに明示的なテーブル参照を追加すると予期しない結果が生じるSummary() 関数の構文が正しくありません。定義、構文、例については、スクリプトインデックスを参照してください。
Summarize(Data Table( "layer_type_forum_help" ), meas = by( :layer_type ) );
result = 0;
For( i = 1, i <= N Items( meas ), i++,
If( meas[i] != "SSOD",
result = 1;
Break();
)
);
result;
Re: JSLコードに明示的なテーブル参照を追加すると予期しない結果が生じる関数呼び出しを単純に使用できると思います。
N Items( meas )
答えを確定するには、この列で単一の値を検索します。したがって、Summarize() 関数の呼び出しでは単一のグループが返されるはずです。項目数が1より大きい場合、少なくとも1つの行に異なる文字列が含まれています。
Data Table( "layer_type_forum_help" ) << Summarize( meas = By( :layer_type ) );
result = N Items( meas ) > 1;
Re: JSLコードに明示的なテーブル参照を追加すると予期しない結果が生じるありがとう@Mark_Bailey、私はこれを考慮しましたが、エラー チェックでは、目的の値 (SSOD) ではない値が 1 つ存在する可能性があるので、それを区別したいと思います。
Re: JSLコードに明示的なテーブル参照を追加すると予期しない結果が生じる*** 追記:下記の返信についてお詫び申し上げます。誰かの参考になるかもしれませんが、ご要望には沿っていません。何を求めているのでしょうか?不一致な値が最初に出現した後に、一致しない値があるかどうかを確認し、その値を返すようにしたいのでしょうか?
「より大規模な自動化ワークフローに追加したい短い JSL スクリプトがあります。その目的は、列 (layer_type) の値を反復処理し、SSOD 以外の値が見つかった場合は1を返すことです。列のすべての値が 'SSOD' の場合は 0 を返す必要があります。 」とおっしゃいました。
Summarize( meas = By( :layer_type ) );
result = N Items( meas ) > 1;
この場合は値「SSOD」のみが表示されるため、0 を返す必要があります。

結果は0です:

別のケースでは「SSOD:」以外の値が表示されるため、1を返す必要があります。

結果は1です:

Re: JSLコードに明示的なテーブル参照を追加すると予期しない結果が生じる@マーク・ベイリー - 心配しないでください。それは間接的に関連していますし、私はその投稿でそれについて尋ねましたので、お時間をいただきありがとうございます。
この解決策が期待どおりの結果を返さない箇所について、より詳しく説明できます。最新の投稿の例は正確で、期待どおりの結果が得られています。3つ目のシナリオは、列に含まれる値がすべてSSODではない場合です。例えば、layer_typeの値が「NAIL」で埋められているとします。この場合、コードは0を返すはずです。ただし、期待どおりの結果は1です(すべての値がSSODではないため)。