1. はじめに
IBM App Connect Enterprise(ACE)の開発において、変換ロジックを記述するESQLの実装は、正確な構文理解とデータ構造の把握が求められ、IT技術者でないと開発できない領域でした。
しかし、生成AIの進化により、そのプロセスが劇的に変わろうとしています。今回は、IBMのAIアシスタント「IBM Bob」を使い、「仕様書やロジック図の画像」から直接ESQLを生成させる手法をご紹介します。
2. 解決したい課題
従来の開発フローでは、以下のプロセスでミスや工数が発生していました。
仕様の読み取り: Excelやパワーポイントの図解を人間が解釈する際の誤解。
タイピングロス: 複雑なフィールド名やネスト構造をESQLに書き起こす際の手間。
構文エラー: SET句やCAST、相関名の記述ミスによるデバッグ工数。
これらを「画像の直接読み込み」で解決します。
3. 実践:画像からコードへの変換
① 入力とする「ロジック指示画像」

② IBM Bobへの指示(プロンプト)
#指示 ESQL.jpgファイルを読み取って、ACEのCompute NodeのESQLのコードを作ってください。
#注意事項
・データベース定義は事前に行われている
・データベースは、myschemaというスキーマに定義されています
・SET文を使って出力レコードを作成してください
・ESQLのファイル名は、BOBTransformFlow_Compute.esqlというファイル名で作成してください。
#入力フォーマット
・DFDLスキーマファイル「orderIn.xsd」です。
このDFDLスキーマは、注文データ(orderIn)を処理するためのフォーマット定義です。
基本設定
- エンコーディング: Shift_JIS
- レコード区切り: 改行(CR/LF)と空白文字
- フィールド区切り: カンマ(,)
データ構造
1. ヘッダー部(header) - 開始記号: "H,"
1 H,<注文ID>,<注文日付>,<営業担当者>
- orderId (文字列): 注文ID
- orderDate (日付): 注文日付 (形式: yyyyMMdd)
- salesRep (文字列): 営業担当者名
2. 明細部(body) - 開始記号: "D," ※複数行可能
1 D,<商品ID>,<数量>,<単価>,<配送日>
- itemId (文字列): 商品ID
- quantity (整数): 数量
- price (小数): 単価 (形式: 0.###)
- dlvDate (日付): 配送日 (形式: yyyyMMdd)
3. トレーラー部(trailer) - 開始記号: "T,"
1 T,<明細件数>
- itemNum (整数): 明細行数
特徴
- ヘッダー・明細・トレーラー構造の典型的な商取引データフォーマット
- 各レコードタイプは先頭の識別子(H/D/T)で区別
- 日本語環境向け(Shift_JIS)
- IBM Integration Bus/App Connectでの使用を想定
#出力フォーマット
・出力用のDFDLスキーマファイル「orderOut.xsd」です。
このスキーマは出力用のCSV形式を定義しており、以下の構造です。
レコード構造(複数行可能)
- orderId: 注文ID(文字列)
- orderDate: 注文日(日付)
- salesRep: 営業担当者(文字列)
- itemId: 商品ID(文字列)
- quantity: 数量(整数)
- price: 価格(小数)
- dlvDate: 配送日(日付)
特徴:
- フラットなCSV形式(ヘッダー/ボディ/トレーラーの区別なし)
- エンコーディング:Shift_JIS
- 区切り文字:カンマ(,)
- レコード区切り:CR/LF
# ESQLについての指示
ESQLファイル作成手順
1. ファイルの基本構造
- ファイル名: BOBTransformFlow_Compute.esql
- モジュール名: BOBTransformFlow_Compute
2. 主要な機能
Main関数の実装
1 CREATE FUNCTION Main() RETURNS BOOLEAN
- メッセージヘッダーをコピー
- 入力メッセージ(orderIn)のbody配列をループ処理
- 各レコードを出力メッセージ(orderOut)に変換
データ変換ロジック
1. ヘッダー情報のコピー:
- orderId
- orderDate
- salesRep
- Dateは日付型にしてください。
2. 明細情報の変換:
- itemId: データベース(CODEMASTER)から変換コードを取得
- quantity, price, dlvDate: そのままコピー
- Dateは日付型にしてください。
3. データベースクエリ:
テーブルには、エリアスをつけてください
THE関数でSELECT文を作ってください。
THE()ステートメントは SELECT の戻りが一意に決まることを指定する関数です
SELECT に続く ITEM 構文は戻り値をリテラル型(レコードではなく通常の CHAR や INT 等)として扱うために必要な構文です
ヘルパープロシージャ
1. CopyMessageHeaders():
- InputRootからOutputRootへメッセージヘッダーをコピー
- CARDINALITY関数で要素数を取得してループ処理
2. CopyEntireMessage():
- メッセージ全体をコピー(現在はコメントアウト)
3. 重要なポイント
- DFDLパーサーを使用した構造化データの処理
- データベース参照による商品コード変換
- 配列インデックスの管理(i変数)
- FOR...END FORループによる明細処理
4. 前提条件
- DFDLモデル(orderIn.xsd, orderOut.xsd)が定義済み
- データベース接続が設定済み
- CODEMASTERテーブルが存在し、BEFORECODE/AFTERCODEカラムを持つ
③Bobに指示を与えてみます
VSCodeに統合された、Bobの画面で、TERMINALから指示を与えます。

Enter your promptの所に前述の指示を与えます。

最初に、指示の内容からタスクを分析し、主な要件をリストアップします。
その後、画像(ESQL.jpg)を読み取ります。

画像ファイルを読み取って、ESQLの構造を確認しています。

WriteFileとあるように、指示したとおり、BOBTransformFlow_Compute.esqlファイルを作成しています。

④生成された、ESQLの確認をしてみると、指示した通りのロジックにはなっています。
CREATE COMPUTE MODULE BOBTransformFlow_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
-- メッセージヘッダーをコピー
CALL CopyMessageHeaders();
-- 出力メッセージの初期化
DECLARE outRef REFERENCE TO OutputRoot;
-- 入力メッセージの参照を取得
DECLARE inRef REFERENCE TO InputRoot.DFDL.orderIn;
-- 出力メッセージのルート作成
CREATE LASTCHILD OF OutputRoot DOMAIN 'DFDL';
CREATE LASTCHILD OF OutputRoot.DFDL AS outRef NAME 'orderOut';
-- ヘッダー情報を取得
DECLARE vOrderId CHARACTER inRef.header.orderId;
DECLARE vOrderDate DATE CAST(inRef.header.orderDate AS DATE FORMAT 'yyyyMMdd');
DECLARE vSalesRep CHARACTER inRef.header.salesRep;
-- 明細データをループ処理
DECLARE i INTEGER 1;
DECLARE bodyCount INTEGER CARDINALITY(inRef.body[]);
FOR bodyItem AS inRef.body[] DO
-- 出力レコードの作成
CREATE LASTCHILD OF outRef AS outRecord NAME 'record';
-- ヘッダー情報を設定
SET outRecord.orderId = vOrderId;
SET outRecord.orderDate = vOrderDate;
SET outRecord.salesRep = vSalesRep;
-- データベースから変換後の商品IDを取得
DECLARE vBeforeCode CHARACTER bodyItem.itemId;
DECLARE vAfterCode CHARACTER;
-- THE関数を使用してデータベースクエリを実行
SET vAfterCode = THE(
SELECT ITEM cm.AFTERCODE
FROM Database.myschema.CODEMASTER AS cm
WHERE cm.BEFORECODE = vBeforeCode
);
-- 明細情報を設定
SET outRecord.itemId = vAfterCode;
SET outRecord.quantity = bodyItem.quantity;
SET outRecord.price = bodyItem.price;
SET outRecord.dlvDate = CAST(bodyItem.dlvDate AS DATE FORMAT 'yyyyMMdd');
-- カウンタをインクリメント
SET i = i + 1;
END FOR;
RETURN TRUE;
END;
CREATE PROCEDURE CopyMessageHeaders() BEGIN
DECLARE I INTEGER 1;
DECLARE J INTEGER;
SET J = CARDINALITY(InputRoot.*[]);
WHILE I < J DO
SET OutputRoot.*[I] = InputRoot.*[I];
SET I = I + 1;
END WHILE;
END;
CREATE PROCEDURE CopyEntireMessage() BEGIN
SET OutputRoot = InputRoot;
END;
END MODULE;
4. App Connect Enterpriseに取り込んで確認してみる
① App Connect EnterpriseのToolkitに生成されたESQLを取り込む

以下のようなエラーが発生していることがわかります。
識別子 " outRecord " は解決できない。
以下のようにエラーの内容から、適切に修正してくれました。

修正した結果を知らせてくれています。

③再度App Connect Enterpriseに取り込みます。
エラーは修正され、問題はなくなりました。

④App Connect EnterpriseのBARファイルを作成
ビルドして保存をクリックします。

⑤BARをApp Connect EnterpriseのACE13SERVERにデプロイします。
BOBApplicationBAR.barをACE13SERVERにドラッグ&ドロップ

5. テスト実行
①テスト用のファイルは以下のようなものになります。

②このファイルを、c:\students\File\Inに置きます。

③App Connect EnterpriseがFileDataを取得して、c:\students\File\OutにCSVファイルを出力します。
FileData.csvファイルができていて、CSV形式で出力されています。

6. Bobのメリット
| 内容 | メリット |
|---|---|
| 開発スピード | ゼロからコードを書く必要がなく、下書きが数秒で完成する。 |
| 精度の向上 | フィールド名のスペルミスなど、単純なヒューマンエラーが激減する。 |
| ナレッジ共有 | 「図を見ればコードが作れる」状態になり、ESQLに不慣れなメンバーでも開発に参画しやすくなる。 |
まとめ
IBM BobをACE開発に組み込むことで、「ドキュメント(画像)=コード」という直感的な開発サイクルが実現します。
もちろん、最終的な動作確認や例外処理の追加といった人間によるレビューは必要ですが、開発の「最初の一歩」をAIが担うことで、私たちはより高度なアーキテクチャ設計や業務ロジックの検討に集中できるようになります。
IBM Bobのマルチモーダル能力(画像解析)を利用することで、ACEのESQL開発は劇的にスピードアップします。もちろん、生成されたコードのユニットテストは不可欠ですが、ゼロからコーディングする時代は終わりつつあるのかもしれません。



