knowledge 【注意点】「IF」および「LOOP」アクションは実行エラーを無視して継続するとロジックが破綻するため「エラー時」タブを使用することができない

本記事では、「IF」アクションや「LOOP」アクションにおける注意点を記載します。

ステップが実行エラーになった場合、「エラー時」タブの設定で「次のステップに進む」などを設定して実行エラーになっても継続させる設定が出来ます。
一方で、それらの設定は「IF」アクションおよび「LOOP」アクションにおいて使用することは出来ません。

本来、「IF」および「LOOP」のステップは、ロジックでYES/NOを判断したり、繰り返し処理の継続管理をしたりするものであり、実行エラーになることを想定していないアクションです。
仮に実行エラーになった場合に無視して継続した場合、対応するEND IFやEND LOOPのステップが迷子になり実行エラーになる等、ロジックとして破綻する為、どちらにせよ予期しない結果で終了します。

「IF」や「LOOP」のステップで実行エラーになる可能性は以下のようなケースで考えられますが、いずれの場合も当該ステップを経由する前に別のIFブロックでデータチェックを実施する等、「無視して継続」以外の方法を取る必要があります。

■1. 存在しない変数・配列・データセットの要素を参照した場合
(一例)

<AMARRAY NAME="array1" ROWS="3" />
<AMARRAY ACTIVITY="set" NAME="array1" STARTINDEXZERO="YES"><SETTER INDEX="0" VALUE="A" /><SETTER INDEX="1" VALUE="B" /><SETTER INDEX="2" VALUE="C" /></AMARRAY>
<AMIF EXPRESSION="%array1(4)% = &quot;E&quot;" />
<AMSHOWDIALOG MESSAGE="IFブロックを通りました" />
<AMIF ACTIVITY="end" />

上記の場合、そもそも配列の定義と参照対象が誤っているので、「IF」アクションのエラー時設定で回避すべきではなく、ロジックの改修を正しく行わなくてはなりません。
また、上記がデータセットの場合は、「データセット名.TotalRows」と比べるインデックスを先に別のIF文で比較してからIF文を通るようにするといった対処が必要です。

■2. 比較する変数のタイプが正しくない(Type mismatch)
(一例)

<AMVARIABLE NAME="var_1" VALUE="2" TYPE="number" />
<AMVARIABLE NAME="var_2" VALUE="四" TYPE="text" />
<AMIF EXPRESSION="%(var_1 - var_2) &lt;= 0%" USECOMPLEXUI="YES" />
<AMSHOWDIALOG MESSAGE="var_1はvar_2よりも小さい" />
<AMIF ACTIVITY="end" />

引き算を実施していますが、片方が数字ではないので引き算をしているIFアクションで実行エラーになっています。
この場合も、事前に「IsNumber」関数を使ったり、見た目は数字でも実行エラーになる場合は「Val」関数を使ったりする等して対処を行う必要があります。

IFアクションやLOOPアクションなど、タスクのロジック制御を行うステップで実行エラーになるタスクの作りは他のロジックを入れるなどして回避しなくてはなりません。