質問
集計したいフィールドの値が全て空文字/nullの場合(集計結果が0件の場合)、後続処理でエラー(OTHER0002E)が発生します。原因と、データが0件であることの判定方法を教えてください。
回答
■ エラーの原因
集計処理は入力データが0件でもエラーにはならず、0件のまま後続処理へ流れます。
ただし、後続のマッピング処理で集計結果の値を取得しようとすると、参照先のデータが存在しないためエラー(OTHER0002E)が発生し、ジョブが異常終了します。
■ 空レコードの除外方針
集計前に「position」が空・ブランクのレコードを除外する現行方式を継続することを推奨します。理由は以下のとおりです。
・除外しない場合、空の position が「空という値のグループ」として集計結果に含まれてしまいます。
・集計対象に空の値が含まれると、集計関数によってはエラーとなる場合があります。
・除外しておくことで「全て空=集計結果0件」となり、判定条件がシンプルになります。
■ データが0件であることの判定方法
以下の2つの方法で判定できます。
【方法1】繰り返し処理で判定する
集計結果を繰り返し処理にかけ、一度でも実行されたかどうかで判定します。
(1)スクリプト変数を作成する
名前:hasData / 型:整数型 / 初期値:0
(2)集計処理の後ろに「繰り返し処理(データ件数)」を配置し、入力データに集計処理のコンポーネントを指定する
(3)繰り返し処理の内側に「変数代入」を配置し、hasData に 1 を設定する
(4)繰り返し処理の後ろに「条件分岐」を配置し、以下でルートを分ける
・hasData が 0 → データなし(position が全て空)のルート
・hasData が 0 以外 → 通常処理のルート
集計結果が0件の場合は繰り返しが一度も実行されないため、hasData は初期値の0のままとなります。これをもって「データなし」と判定します。
メリット:現行の構成にコンポーネントを追加するだけで済み、中間ファイルが不要です。
デメリット:「ある/ない」しか分からず、件数は取得できません。
【方法2】抽出後の件数を取得して判定する
抽出処理の結果を一旦作業用ファイルに書き出し、その件数で判定します。
(1)スクリプト変数を作成する
名前:validCount / 型:整数型 / 初期値:0
(2)スペース除去+抽出を行うマッピングの出力先をCSV書き込みに変更し、作業用ファイルに書き出す
(3)CSV読み取りを配置し、集計処理の入力データに指定する
(4)「変数代入」を配置し、CSV書き込みのコンポーネント変数「count」(書き込んだデータの件数)を validCount に格納する
(5)「条件分岐」で以下のようにルートを分ける
・validCount が 0 → データなし(position が全て空)のルート
・validCount が 0 以外 → 通常処理のルート
メリット:有効なデータが何件あったかを数値で取得でき、ログに残せます。中間ファイルが残るため、問題発生時に調査が容易です。
デメリット:ファイルの読み書きが増えるため処理時間は方法1より長くなります。また、作業用ファイルの配置先や同時実行時のファイル名重複を防ぐ考慮が別途必要になります。
【注意事項】
上記2つの方法はあくまで実装の一例です。実際の実装にあたっては、実データや処理要件に合わせた調整が必要です。
コメント
0件のコメント
記事コメントは受け付けていません。