【ASTERIA Warp】フロー作成時に注意したいフローやコンポーネントの挙動

ASTERIA Warp

こんにちは。ソリューション開発部の上坂です。

先日ASTERIA Warp初心者の方に向けて下記の記事を書き、基本的な用語やフローの作成方法をお伝えしました。

上記記事の冒頭にもある通り、私は現在参画しているプロジェクトでASTERIA Warpを使用しています。
フローを作成する中で、マニュアルをざっと読んだだけでは気づかないような挙動にも出会いました。
これらの挙動を意識していないと、フローが意図しない動きをしてしまう可能性があるので注意が必要です。

そこで今回は、ASTERIA Warpで実際にフローを作り始める、もしくは作り始めたという方に向けて、フロー作成時に注意したいフローやコンポーネントの挙動をご紹介します。

RDBGetは取得レコード数が0件でもループ処理を実行する

RDBGet」コンポーネントとは、RDBMSへSELECT文を発行する際に使うコンポーネントです。
「RDBGet」コンポーネントには「ループを開始」というプロパティがあり、こちらを「はい」に設定すると、「RDBGet」コンポーネントを起点としたループ処理が作成できます。

「ループを開始」というプロパティを「はい」に設定すると、「RDBGet」コンポーネントを起点としたループ処理が作成できる

ループ処理の終点には「LoopEnd」コンポーネントを置きましょう。
「LoopEnd」コンポーネントとは、ループを終わらせる際に使うコンポーネントです。

「LoopEnd」コンポーネントの配置

テーブルからレコードを取得できると、「RDBGet」コンポーネントから「LoopEnd」コンポーネントまでループ処理が実行されます。
では、テーブルからレコードを1件も取得できなかったときはどのような動きになるでしょうか。

「RDBGet」コンポーネントのプロパティ「レコードが無い場合エラー」を「はい」にしていると例外が発生します。

「レコードが無い場合エラー」を「はい」にしていると例外が発生

一方、「RDBGet」コンポーネントのプロパティ「レコードが無い場合エラー」を「いいえ」にしていると1回はループ処理が実行されます

「レコードが無い場合エラー」を「いいえ」にしていると1回はループ処理が実行される
Mapperコンポーネントの処理を実施

この動きについて、ASTERIA Warp公式サイトでは下記の通り記載されています。

RecordLoopやRDBGetなどで「ループを開始」に「はい」を指定していると、
入力のレコード件数が0件の場合も1回はループ処理が行われます。

ASTERIA Warp公式サイト「RecordLoopやRDBGetで入力レコードが0件の場合も1回はループ処理が実行される」

そのため、テーブルからのレコード取得件数が0件のときに、例外を発生させたくない、けどループ処理も実行したくないという場合は、レコードの取得件数によって処理を分岐させる必要があります。

例えば、「RDBGet」コンポーネントの直後に、条件式の判定結果により分岐処理をする「BranchStart」コンポーネントを置き、「BranchStart」コンポーネントのプロパティ「条件式」に「$stream.RecordCount = 0」(※)と記載すると、取得件数が0件のときとそれ以外のときで処理を分岐させられます。
※条件式の記載方法については、こちらの「条件式について」という項目を参照ください。

例えば下記では、取得件数が0件のときは「Break」コンポーネントを通ることでループ処理から抜け出し、それ以外のときはループ処理を続行するように処理を作成しています。

「Break」コンポーネントを利用した処理の作成

マッパー変数に直前のMapperから値を指定できない

ASTERIA Warpには、外部変数、フロー変数、システム変数などいくつか変数が用意されていますが、その中のマッパー変数に関する事象です。
マッパー変数とは、「Mapper」コンポーネントで定義し「Mapper」コンポーネント内で使用できる変数です。
「Mapper」コンポーネントの「マッパー変数」タブで定義します。

「マッパー変数」の定義

下記のフローにて、上から1つ目の「Mapper」コンポーネントを「Mapper A」とし、2つ目の「Mapper」コンポーネントを「Mapper B」とします。
「Mapper B」ではマッパー変数「hoge」を定義しており、初期値に「あいうえお」を設定しています。

「マッパー変数」の定義と初期値の設定

このとき「Mapper A」をダブルクリックすると下記の画面が開き、右側に「Mapper B」で定義したマッパー変数「hoge」を確認できます。

Mapper変数の確認

ここで右側のマッパー変数「hoge」に対して文字列「ABC」から矢印を引っ張ります。
この状態でフローを動かすと、マッパー変数「hoge」にはどのような値が入るでしょうか。

右側のマッパー変数「hoge」に対して文字列「ABC」から矢印を設定

下記の通りフローをデバッグ実行してみると、「Mapper B」の処理実行後にマッパー変数「hoge」には「あいうえお」が入っています。
つまり、「Mapper A」にてマッパー変数「hoge」に設定した「ABC」ではなく、「Mapper B」にてマッパー変数「hoge」の初期値に設定した「あいうえお」が実際に変数「hoge」の値として設定されています

Mapper変数と初期値の確認

この動きについて、ASTERIA Warp公式サイトでは下記の通り記載されています。

マッパー変数はマッパーの処理開始時に変数が初期化されるため、1つ目のマッパーで値をマッピングしても2つ目のマッパーの処理開始時に変数が初期化されます。そのため、1つ目のマッパーでマッピングした値ではなく、2つ目のマッパー変数で設定されている初期値が使用されます。

ASTERIA Warp公式サイト「マッパー変数へ初期値をマッピングしても使用されません」

よって、直前の「Mapper」コンポーネントで値を何かしら変数に格納し、次の「Mapper」コンポーネントでその変数を使う場合には、マッパー変数ではなく他の変数(フロー変数など)を使いましょう。

サブフローで定義したフロー変数は、同じSubFlowコンポーネントでの呼び出し2回目以降初期化されない

ASTERIA Warpでは、フローの中に「SubFlow」コンポーネントを置くことで、異なるフローを呼び出せます。
このとき、呼び出すフローをメインフロー、呼び出されるフローをサブフローと呼びます。
またフロー変数とは、フローで定義し、同一のフローの内のみで使用できる変数です。フロー右下の「変数」タブから設定します。

フロー変数の設定

下記では「Flow1」(メインフロー)が同じプロジェクト内の「Flow2」(サブフロー)を呼び出しています。

指定した「SubFlow」の呼び出し

今回「SubFlow」コンポーネントの1つ手前にある「RDBGet」コンポーネントで取得できるレコード数を2件としましょう。
すると、「RDBGet」コンポーネント から「LoopEnd」コンポーネントまでは2回ループ処理を行うため、「Flow2」を2回呼び出します。

また、「Flow2」ではフロー変数「fuga」を定義しており、初期値に「0」を設定しています。

フロー変数の定義と初期値の設定

そして「Mapper」コンポーネントの中ではフロー変数「fuga」に1を足しています。

「Mapper」コンポーネント内のフロー変数「fuga」に1を追加

このとき「Flow1」を実行すると、「Flow2」で定義したフロー変数「fuga」の値はどのように変わるでしょうか。
「Flow1」をデバッグ実行しながらフロー変数「fuga」の値を追います。

まず「Flow1」から初めて「Flow2」を呼び出したとき、「Flow2」の「Start」コンポーネント時点では、フロー変数「fuga」の値は初期値に設定した「0」になっています。

フロー変数「fuga」の値は初期値に設定した「0」になる

次の「Mapper」コンポーネントの中では、フロー変数「fuga」に1を足しているため、フロー変数「fuga」の値は「1」になっています。

フロー変数「fuga」に1を足しているため、フロー変数「fuga」の値は「1」になる

次に「Flow1」から「Flow2」を呼び出したとき、「Flow2」の「Start」コンポーネント時点では、フロー変数「fuga」の値は「1」になっています。
つまり、初期値に設定した「0」ではなく、前回に呼び出したときに設定した値が引き継がれています

「Flow2」の「Start」コンポーネント時点では、フロー変数「fuga」の値は「1」になる

この動きについて、ASTERIA Warp公式サイトでは下記の通り記載されています。

フローがサブフローとして実行される場合、そのサブフローコンポーネントごとにフロー変数の領域が確保されます。この領域はループ内で呼び出された場合は初回呼出し時にのみ初期化されますので、このタイミングでフロー変数の初期値が設定されます。

2回目以降の実行では初期化されないので、フロー変数の初期値は設定されません。初回のサブフロー内の処理でフロー変数を初期値から変更した場合、2回目のサブフロー実行時には変更した値が引き継がれます。

ASTERIA Warp公式サイト「ループ内で実行されるサブフローでフロー変数の初期値が使用されないことがあります」

よって、同じ「SubFlow」コンポーネントでサブフローを呼び出す度に変数の値を初期化したい場合は、変数の値を初期化する処理を書く必要があります。
例えば下記では、フロー変数「fuga」の値を初期化するための「Mapper」コンポーネントを追加し、その「Mapper」コンポーネント内でフロー変数「fuga」に「0」を設定しています。

変数を初期化するための「Mapper」を追加
フロー変数「fuga」に「0」を設定

ちなみに、別の「SubFlow」コンポーネントで同じフローを呼び出す場合は、それぞれの「SubFlow」コンポーネントで呼び出した際にフロー変数の値が初期化されます。
そのため下記では、「SubFlow A」で呼び出した際も「SubFlow B」で呼び出した際も、「Flow2」のフロー変数「fuga」の値は初期値に設定している「0」から始まります。

別の「SubFlow」コンポーネントで同じフローを呼び出す場合、それぞれの「SubFlow」コンポーネントで呼び出した際にフロー変数の値が初期化される

最後に

ASTERIA Warpでは、基本的にコンポーネントを置くだけでフローを作成できるため、コンポーネントを並べた時点で思い通りの処理を作成できたと考えてしまいがちです。
しかし実際に動かしてみると、特定の条件下では思うような処理になっていなかった、というケースを過去に私も経験しました。
そのため、開発の基本にはなりますが、フローを作成したら実際に動かしてみて、思い通りの処理になっているか都度確認することが重要であると考えています。

本記事がASTERIA Warpで開発を進める方の参考になれば幸いです。

  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix