前回に引き続きエラー検知の話です。前回と同じユースケースを使います。すでにお読みの方はユースケースパートは飛ばしてください。今回はフォーミュラツールを使ったエラー検知を行います。
ユースケース
インプットとしては以下のようなTransactionと、
以下のようなProductマスターを考えてみましょう。
Transactionの集計を行うにはマスターをProductIDで結合し、Unit PriceとQtyを掛け算して集計を行う必要があります。
また、ワークフロー内でのチェックポイントは結合ツールのL出力です。Product Masterに登録されていないデータがあると、結合ツールのL側に出てきます。
フォーミュラツールを使ったエラー検知
フォーミュラツールにはMessage()関数が用意されています。これは、ログにメッセージを出しつつ、何かしらの値をフィールドに残す、といった複合的な機能を持っています。
Message()関数
Message()関数は、特殊カテゴリの中の関数の一つです。フォーマットとしては、
Message(messageType, message, returnValue)
という形です。messageTypeは以下のいずれかの整数値を取ります。
- 1:メッセージ
- 2:警告
- 3:エラー
- 5:変換エラー(フィールド変換エラー)
- 8:ファイル入力
- 9:ファイル出力
メッセージツールの「メッセージタイプ」と同じようなイメージで捉えて良いと思います。
messageの部分は文字列で表示したい文字を指定します。returnValueはこの関数が返す値です。
例えば、上記ワークフローですが、Product Masterがない場合は一旦計算結果を0として入れておきつつエラーも出す、といったことが可能です。ワークフローとしてはユニオンツールを組み合わせて、以下のようにいわゆる左結合を行います。
これにより、フォーミュラツールの直前では、以下のように結合ツールのL出力側から出てきたレコードのProduct Masterで得られる部分がNullになります。
このNull部分はProduct Masterが存在していないデータになるので、この部分をエラーとして出るようにMessage()関数を使います。
IF IsNull([Product Name]) THEN
Message(3, "ProductID is not exist : " +ToString([ProductID]), 0)
ELSE [Qty]*[Unit Price]
ENDIF
これによって、以下のようにエラーログが出るようになります。
しかしながら、NullのところのSalesは無事に0になっています。
Message()関数を使ってファイル保存をしてみる
実際にはエラーとしつつもエラー内容をファイルに保存したい、という要望はよくあることです。フォーミュラツールでなくともできますが、message関数を使った場合はしっかりエラー内容がこれだ、という項目を一つ作れるという利点があります(かなり無理矢理ですが・・・)。
この場合は、フォーミュラツール内ではシンプルにmessage関数を書くことができます。
Message(3, "Product Master Error : "+ToString([ProductID]), [ProductID])
ただし、この場合、エラーが存在しない場合でもファイルが生成されてしまいます。エラーが存在しない場合はファイルを作りたくない、ということであればデータ出力ツールをバッチファイル内に配置し、動作を制御する必要があります。ワークフローとしては以下のようになります。
ポイントは、コントロールパラメータ入力でレコード数を入力することで、値が0ならアクションツールでデータ出力ツールをDisableにすることです(最近のDesignerではデータ出力ツールをDisableにする機能が追加されています。古いバージョンの場合はコントロールコンテナを使って制御してください)。
アクションツールの設定は以下のようになります。更新する値または属性では「Disable」を選択。
フォーミュラは以下のとおりです。
IF [#1]="0" THEN "True" ELSE "False" ENDIF
ただし、この場合も少し問題があり、過去のエラー出力ファイルが残ったままになっているとエラーが出ていると勘違いしやすいことでしょうか(Serverで動かすのであれば気にならないかと思います)。
不要なファイルを削除するためには、さらにマクロ側で工夫できます。ファイル削除のバッチファイルを作成しコマンド実行ツールでバッチファイルを実行してからファイルを生成するようにできます。
詳細はサンプルワークフローを御覧ください。
まとめ
- フォーミュラツールのmessage関数を使ってエラー検知を行う方法を紹介しました
- 正直若干使い所が難しく、メッセージツールでいいのでは?と思います
- 使い方次第だとは思いますが、メッセージツール不要で数式に組み込める、という利点は存在するかと思います
- サンプルワークフローのマクロは結構作り込んでいるので様々な場面で応用が効くと思います
サンプルワークフローダウンロード
次回
次回もエラー検知の話です。
ところで、2023年7月10日から始めた本シリーズも、ようやく50回を迎えることができました。最低目標は100と考えているのでようやく半分に達した、ということになります。だいたいほぼ1年ということでこのペースだと1年でだいたい50くらい、ということになります(まぁ、1年が52週くらいなのでそんなもんですね、、、という計算はせずに投稿していたので改めてそんなもんかー、といった感じです)。とはいえ、ペースとしては本シリーズ以外の投稿も行っているので1週間に2~3本は公開しているということになります・・・(少なくとも本シリーズの英訳版も公開しているので確実に毎週2本書いているということになります)。
どこまで続くかわかりませんが、今後ともよろしくお願いします。
コメント