IICS CDI を使って、コントロールブレイク処理をしてみる

この記事は [インフォマティカ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 13 の記事として書かれています。

# はじめに
コントロールブレイクとは、『キー項目の値が切り替わるタイミグで何らかの処理を行う』という他のプログラム言語などでも利用されるアルゴリズムのことです。

ソートされたキー項目値の前レコードと現レコードが違う値になったタイミング(ここを「ブレイク」という)で処理を行うため、「キーブレイク」や「コントロールブレイク」と呼ばれたり、または、改ページやファイル出力で使われるロジックのため、「データペイジング」と呼ばれたりするようです。

直近レコードの特定や最大値などの取り出し、キー項目のグループ毎の集計などに用いられており、具体例としては、以下が挙げられると思います。
- キー項目毎(社員、顧客…などの単位)に帳票出力
- キー項目のグループ毎(店舗、クレジットカード…などの単位)の集計(売上、在庫数、受注数、決済金額…など)
- 最新の契約情報を取り出す
・・・など

本記事では、Informatica Intelligent Cloud Services の データ統合/Cloud Data Integration を使ったTipsとして、そんなコントロールブレイク処理について、CDIでの実装イメージがつかめるように説明します。

# 作成する連携処理について
今回は「column2」のレコード値が切り替わるタイミグでコントロールブレイク処理を行います。

そのために、まず、ソータートランスフォーメーションにて、「column2」を昇順ソートします。
次に、式トランスフォーメーションにて、「column2」をキー項目にコントロールブレイク処理を用いて、フラグを立てます。
そして、トランザクション制御トランスフォーメーションにて、そのフラグを判定に用いて、キー項目毎にファイル出力するという処理を作成します。

上記のデータの流れを図にすると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/27866f16-030d-5aef-ee3c-bb2fea3f194d.png)
それでは、作成していきましょう。
# 1. 接続の作成
はじめに接続を作成します。
今回はソースもターゲットもフラットファイルのため、フラットファイルコネクタで作成します。
- ソース用の接続
<img width=45% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/e04879f2-47d5-a139-d57a-77fad0d8a1c7.png"><br>
- ターゲット用の接続<br><img width=45% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/a2aa6970-a764-819b-57ff-0df330fb9c71.png">

# 2. マッピングの作成
- 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/a3063cb0-81d0-a8fc-3f58-84b72ace867c.png)

## 2-1. ソーストランスフォーメーション
ソース用のフラットファイルコネクタを[接続]に設定し、[オブジェクト]にてソースファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/14615f08-94cc-96f5-f5b6-eec1238a3105.png)

## 2-2. ソータートランスフォーメーション
キー項目「column2」で昇順にソートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/a34a23fe-3174-7bc3-e878-2b6cbe044c76.png)

## 2-3. 式トランスフォーメーション
「column2」をキー項目として、値が切り替わるタイミグでフラグを立てるために、以下の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/f1dd8848-a0ab-41c9-8982-257d8c7579e1.png)

この設定により、どのように処理されているのか説明します。

まず、式トランスフォーメーションが実行されると、データが1レコードずつ読み込まれ、フィールドの上から順番に処理が実行されていきます。また、変数フィールドは、次の処理が実行されるまで、格納された値を保持し続けています。
このように処理が実行されるのを利用しています。

そして、それを利用して、コントロールブレイク処理を行うために、3種類のフィールドを作成します。		
①格納用：1つ前のレコードの値と保持するための変数フィールド
②判定用：1つ前のレコードの値と現レコードの値を比較して、何らかの処理を行うための変数フィールド
③出力用：判定した結果を出力するための出力フィールド
		
そして、3種類のフィールドは、下図の順番で設定します。		
この順番で設定することで、[v_Flag]フィールドの式の判定には、1つ前のレコードの値と現レコードの値の比較を実現しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/e5d50c66-9813-fcfd-a9b6-ff853f3af8ba.png)

### 参考：1行目から6行目までを読み込んだ時のデータの流れ
データの流れを図にすると、以下のようになります。
- 初期値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/ba9f1460-49ba-f51a-768c-94e46907d1ec.png)
- 1行目を読み込んだ時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/01109611-64bb-43da-0c98-0eb9d5ef8c78.png)
- 2～5行目を読み込んだ時(前レコードと現レコードが一致している状態)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/0ae8349e-ef1e-5f91-9c0c-830d29df2bb6.png)
- 6行目を読み込んだ時(前レコードと現レコードが不一致になった状態)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/9806828c-5238-f4fb-fc39-8274ccb6797c.png)

## 2-4.トランザクション制御トランスフォーメーション
式トランスフォーメーションで設定した「Flag_Control」のフラグを判定に用いて、キー項目毎にファイル出力するという処理を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/17491306-1c0a-9fed-6632-45cca3697286.png)
「v_Flag」項目の値が出力されており、"1"のフラグが立っているレコードが読み込まれた時、直前までのレコードをファイル出力し、現在のレコードから新しいファイルに書き出されていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/bcce9a4d-abf1-7954-0441-963d7e671910.png)

## 2-5.ターゲットトランスフォーメーション
まず、[ターゲット]プロパティにて、ファイルに出力する項目を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/2844dc0a-2d98-27fb-c996-7bef535b4e41.png)<img width=60% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/4579137b-7119-2009-595b-788d64bab6ef.png">
次に、ターゲット用のフラットファイルコネクタを[接続]に設定し、[オブジェクト]の選択を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/e0540933-603d-1b0b-b09f-4a0863df78ec.png)

そして、以下の式トランスフォーメーションで作成したファイル名を使用するために以下の設定を行います。
①「実行時に新規作成」にチェック後、「動的ファイル名を使用」にチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/6a8531b1-ac1a-af15-e284-44c696d5135f.png)
②「動的ファイル名フィールドを除外」にチェックし、式にファイル名を作成した「FileName」項目を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/3d181a60-a1d5-86bb-1ce6-525aed7c2ca4.png)

ここまで作成出来たら、マッピングを保存します。

# 3. 実行結果
それでは、実行してみましょう。
下記フォルダにソースファイルを格納して、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/706b7099-5357-7d79-ceab-51a0dc7c89f3.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/b56bfea4-127a-40ad-91f7-e49189ab9f7f.png)
実行完了後、出力先のフォルダを確認すると、「column2」のキー項目値毎にファイルが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/a600ba29-21f0-01bc-9f12-c956f5f05f8c.png)
また、ファイルに出力されているデータを確認すると、同一キー項目のレコードが出力されています。
- キー項目の値：A01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/3ee3161e-66bb-538c-d2e4-2eeea3e06a67.png)
- キー項目の値：B01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/99f281f3-cc04-ec0d-6cde-5927e3e71f59.png)
- キー項目の値：C01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/ec42d362-6a9b-070b-eee9-48639b74c3cb.png)
- キー項目の値：D01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/aa71559b-cd73-6d23-ab36-97e83c2c5496.png)
- キー項目の値：E01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/052e4057-f41d-d47e-cfd9-a98f6691b33e.png)

# ４．最後に
コントロールブレイク処理を実装して実行してみましたが、いかがでしたでしょうか？

アグリゲータトランスフォーメーションやルータートランスフォーメーションを使う方が簡単な場合もありますが、複雑な仕様がある際には、こちらで対応できるということがあります。
また、ロジックは知っていても、CDIでどう実装すれば良いか分からないという場合もあったりするかと思います。

こちらの記事がお読みいただいた皆様の連携処理を検討する上での一助となれば幸いです。

## 参考サイト
- IICS CDI(Cloud Data Integration)のマニュアル
https://docs.informatica.com/integration-cloud/cloud-data-integration/current-version.html

- KB：FAQ: What is the use of Exclude Dynamic File Name Field option in the flat file connector in CDI?
https://knowledge.informatica.com/s/article/000186188?language=en_US

- ■Windows版Perlの細道・けもの道
http://a011w.broada.jp/wbaefznh35st/perl/perl022.html