AI エージェントに自社の ERP を覚えさせる:JD Edwards データ、CData ドライバー、再利用できるスキル
AI エージェントの役割は、一般的な質問に答えることから、業務の中で実際の仕事をこなすことへと広がりつつあります。そして、その仕事の多くは ERP データに支えられています。仕入先への支払いはいくら残っているか。期日が近い請求書はどれか。与信限度額を超えている顧客は誰か。多くの企業では、こうした問いの答えが Oracle JD Edwards EnterpriseOne の中にあります。
JD Edwards は Application Interface Services(AIS)Server を通じてデータを公開しており、そのデータモデルはシステムコードごとに整理された数千ものテーブルとビジネスビューで構成されています。新しい CData Driver for JD Edwards は、これをリレーショナルなビューに変換します。JDBC、ODBC、ADO.NET、Python に対応したツールであれば、わかりやすいカラム名と本来の日付型を備えたビューに標準 SQL でクエリを実行できます。つまり、AI エージェントがデータに直接、標準的な方法でアクセスできるようになるのです。
一方で、JD Edwards の環境は企業ごとにそれぞれ異なります。どのモジュールを運用するか、ユーザー定義コードをどう使うか、会社や通貨をどう設定するか、どのレポートをチームが重視するかは企業によってさまざまです。エージェントは探索を通じてその多くを把握できますが、会話のたびに同じ作業を繰り返す必要はありません。その知見を残しておく便利な方法のひとつが、エージェントスキルです。エージェントスキルとは、エージェントが自社環境について学んだコンテキストを記録しておく、再利用可能な短いファイルのことです。質問に答えるためのビュー、チームで使っているコード、実際にうまくいったクエリなどを記録しておけば、次のセッションはそこから始められます。
この記事では、まず JD Edwards ドライバーとその公開内容をご紹介します。続いて、エージェントが CData JD Edwards JDBC Driver(CData CLI 経由)で JD Edwards を探索し、買掛金について学んだ内容をスキルとして保存し、そのスキルを使って財務に関する質問に答えるまでの例を順に見ていきます。
ERP データを AI エージェントにつなぐ理由
企業では AI アシスタントの全社展開が進んでおり、財務部門や業務部門から最初に上がる要望はたいてい同じです。「ERP のデータを見られるようにしてほしい」というものです。私たちが耳にする要望は、主に次のようなパターンに分かれます。
- データを手作業でコピーしている財務チーム:アナリストが ERP データをスプレッドシートにエクスポートし、それを AI アシスタントに貼り付けて質問しています。手作業ではなく、ガバナンスの効いたライブ接続を求めています。
- 自社製品にエージェントを組み込むソフトウェアベンダー:調達やサプライチェーンのプラットフォームでは、ERP ごとに個別の連携を構築・保守することなく、顧客の発注書、仕入先、請求書といった ERP データをエージェントに読み取らせたいと考えています。
- アクセス方法を標準化したい IT チーム:AI アシスタントを幅広く展開している組織では、ERP 自体の権限を適用したうえで、エージェントが業務システムにアクセスするためのガバナンスの効いた統一的な方法を求めています。
JD Edwards の場合は、これらに加えて独自の課題もあります。
- データモデルの規模:JD Edwards はテーブルとビジネスビューを数百のシステムコードに分類しています。財務モジュールだけでも 1,000 を超えるビューが含まれることがあり、その多くはワークテーブルや印刷ドライバー、パージファイルなど、業務ユーザーがクエリすべきでないものです。
- コードに込められた意味:ステータス値や伝票タイプをはじめ、多くのフィールドは短いコードで格納されており、その意味はユーザー定義コード(UDC)テーブルに保存されています。
CData Driver for JD Edwards のご紹介
接続に必要なもの
ドライバーは、JD Edwards のユーザー ID とパスワードを使って JD Edwards AIS Server 経由で接続します。
jdbc:jdedwards:URL=https://jde-ais.example.com:8300;User=<user>;Password=<password>;
| プロパティ | 必須 | 説明 |
|---|---|---|
| URL | はい | AIS Server のベース HTTPS URL |
| User、Password | はい | JD Edwards の認証情報 |
| Environment | いいえ | セッションで使用する JD Edwards 環境。PD920(本番)や DV920(開発)などを指定します。デフォルトは AIS Server のデフォルト環境です。 |
| Role | いいえ | セッションで使用する JD Edwards のロール。ロールによって権限とデータアクセスの範囲が決まります。 |
| DeviceName | いいえ | AIS Server での監査やログ記録に使われる識別子 |
| Jasserver | いいえ | クラスタ環境で、特定の JAS インスタンスを経由してリクエストをルーティングします |
初回接続時、ドライバーは認証情報を AIS のセッショントークンと交換し、キャッシュします。セッションがタイムアウトに近づくと、新しいトークンを自動で取得します。すべてのリクエストは JD Edwards のユーザーとロールで AIS を経由するため、セッションには JD Edwards 自体の権限がそのまま適用されます。
データモデル
JD Edwards では、テーブルとビジネスビューがシステムコード(製品コードとも呼ばれます)ごとに整理されています。たとえば、買掛金管理は 04、一般会計は 09 です。ドライバーは各システムコードをそれぞれ独立した SQL スキーマとして公開するため、完全修飾名は AccountsPayable.AccountsPayableLedger のようになります。
データモデル全体は非常に大きいため、表示するスキーマは次の 2 つの接続プロパティで制御します。
| プロパティ | 説明 |
|---|---|
| DataModel | 1 つ以上の ERP モジュールを選択します。各モジュールは複数のシステムコードをまとめたものです。指定できる値には、FinancialManagement(デフォルト)、HumanCapitalManagement、Logistics、Manufacturing、OrderManagement、ProjectManagement、RealEstateManagement、AddressBook、Foundation、Standard(全 17 モジュール)、All(インスタンス内のすべてのシステムコード)があります。 |
| SystemCodes | 選択したモジュールに加えて、個別のシステムコードを追加します。たとえば、受注管理と調達を追加する場合は SystemCodes=42,43 と指定します。 |
デフォルトの FinancialManagement データモデルでは、デモ環境で 13 のスキーマが公開されました。
SELECT * FROM sys_schemas
| スキーマ | システムコード | ビュー数 |
|---|---|---|
| GeneralAccounting | 09 | 363 |
| EnhancedAccountsReceivable | 03B | 281 |
| AccountsPayable | 04 | 230 |
| FixedAssets | 12 | 111 |
| FinancialReporting | 10 | 73 |
| ExpenseReimbursment | 09E | 59 |
| ProfitManagementEPS | 16 | 56 |
| MultiCurrency | 11 | 30 |
| ModelingPlanningBudgeting | 14 | 26 |
| AccountsReceivable | 03 | 18 |
| CashBasis | 11C | 3 |
| CreditManagement, MultiSiteConsolidations | 0301, 10C | 0 |
財務だけで、約 1,250 ものビューがあることになります。
これらのビューは、JD Edwards の生のテーブルよりもずっと扱いやすくなっています。主なポイントは次のとおりです。
- 読みやすい名前:カラムには、JD Edwards のデータディクショナリのエイリアスではなく、DocumentNumber、InvoiceDate、OpenAmount、PayStat といった名前が付いています。
- 本来の日付型:日付カラムは SQL の DATE 値として返されます。ユリウス日付の変換処理を書く必要はありません。
- サーバーサイドでのフィルタリング:ドライバーは WHERE 条件を JD Edwards の Query By Example(QBE)フィルタに変換するため、フィルタは AIS Server 上で実行されます。テキストカラムでは =、!=、LIKE、IN を、数値カラムと日付カラムではさらに <、<=、>、>= を使用できます。同じ日付カラムに 2 つの条件を指定すれば、期間の範囲指定も可能です。
- 読み取り専用のビュー:テーブルとビジネスビューは読み取り専用のビューとして公開されます。そのため、エージェントに ERP データへのアクセスを安全に提供できます。
- 操作はストアドプロシージャ経由:たとえば AddressBook.GetContactData は、住所録エントリの Who's Who 連絡先の詳細を返します。ExposeBusinessFunctions=true を設定すると、JD Edwards のビジネスファンクション(BSFN)もストアドプロシージャとして公開されます。ビジネスファンクションは非常に数が多くなることがあるため、特定の DataModel と組み合わせて使うのがおすすめです。
探索から再利用可能なスキルへ
ドライバーの実際の動きを見ていただくために、毎週のように寄せられる財務の質問を AI エージェントに投げてみました。
「承認済みの伝票で、支払残高が最も多い仕入先はどこですか?また、今後 30 日以内に支払期日を迎えるものは何ですか?」
今回は、Oracle JD Edwards のデモ環境に対して、CData JDBC Driver for JD Edwards と CData CLI を組み合わせて使用しました。同じドライバーは CData の他のエディションでも提供しています。
コーディングエージェントにおまかせ
クエリは手書きしていません。Claude Code と CData CLI のスキルを使いました。CData CLI のスキルは、CData ドライバーのインストール、接続、クエリ実行をコマンドラインから行う方法をコーディングエージェントに教えてくれるものです。
CData CLI と関連スキルのダウンロード方法は、こちらをご覧ください:CData CLI:Claude Code、Cursor、Copilot で CData ドライバーを使う
まずは、次のような平易な言葉でゴールを伝えました。
「/cdata-cli を使って JD Edwards の買掛金データを探索してください。そのうえで、学んだ内容を、別のエージェントが買掛金に関する質問に答えられるようなスキルとして保存してください。」
そこから先は、エージェントがスキーマを見つけ、ドライバーのドキュメントを読み、サンプルクエリを実行し、学んだ内容を書き留めていきました。私たちの役割は、JD Edwards の認証情報を入力すること(エージェントのセッションに渡らないよう、自分のターミナルで入力しました)と、質問を決めることだけです。
ステップ 1:CData CLI で接続して探索する
# Confirm the driver is installed
cdatacli drivers list
# Save an encrypted connection (run this in your own terminal so the
# password stays private)
cdatacli connection create --driver "JD Edwards" --name jde \
--connectionstring "URL='https://<ais-server>';User='<user>';Password='<password>';ReadOnly=true"
# Explore the schema
cdatacli query sql --connection jde --sql "SELECT * FROM sys_schemas"
cdatacli metadata tables --connection jde --schema AccountsPayable
cdatacli metadata columns --connection jde --schema AccountsPayable --table AccountsPayableLedger
ステップ 2:エージェントが学んだこと
AccountsPayable スキーマだけでも、1099APWorktable、PurgeAccountsPayableLedger、PrintAutomaticPaymentsStandardFormat などを含む 230 のビューがあります。エージェントはその中から、未払残高の把握に必要なビューである AccountsPayableLedger(JD Edwards テーブル F0411)に絞り込み、サンプルを取得しました。
SELECT [DocumentNumber], [DoTy], [AddressNumber], [InvoiceNumber],
[DueDate], [PayStat], [OpenAmount], [CurCod], [Co]
FROM [AccountsPayable].[AccountsPayableLedger]
WHERE [OpenAmount] > 0
LIMIT 3
| DocumentNumber | DoTy | AddressNumber | InvoiceNumber | DueDate | PayStat | OpenAmount | CurCod | Co |
|---|---|---|---|---|---|---|---|---|
| 11 | PV | 4343 | KLO-6 | 2004-11-30 | H | 200.00 | USD | 00001 |
| 13 | PV | 4343 | KLO-8 | 2004-11-30 | H | 200.00 | USD | 00001 |
| 14 | PV | 4343 | KLO-9 | 2004-11-30 | H | 80.00 | USD | 00001 |
データは読み取れましたが、この最初の結果から、財務チームに回答する前にエージェントが解決すべき疑問がいくつか浮かび上がりました。各伝票は仕入先を番号で参照しているが、名前はどこにあるのか。ステータスフィールドには短いコードが入っているが、それぞれ何を意味するのか。異なる会社の金額は、どのように合計すべきか。
エージェントはどの疑問にも同じ手順で取り組みました。ドライバーのドキュメントを読み、必要なシステムコードを接続に追加し、小さなクエリを実行して結果を確認するという流れです。その過程で、数百あるビューのうち買掛金の質問に実際に役立つのはどれか、JD Edwards のコードをどう読み解くか、金額をどう正しく合計するかを学んでいきました。こうした発見と、実際にうまくいったクエリをまとめたものが、スキルになりました。
ステップ 3:スキルとして保存する
エージェントは、こうした発見をひとつの会話の中だけに残しておくのではなく、スキルとして保存しました。スキルとは、どのような場面で読み込むべきかを今後のエージェントに伝える短い説明付きの Markdown ファイルです。Claude Code では、スキルはプロジェクト単位なら .claude/skills/<name>/SKILL.md、ユーザー単位なら ~/.claude/skills/<name>/SKILL.md に配置されます。他のエージェントにも同様の仕組みがあります。
スキルの内容はごく短いものです。接続設定、使用する 3 つのビュー、ステップ 2 でエージェントが学んだルール、そして検証済みのクエリが記載されています。
---
name: cdata-jdedwards-ap
description: Answer accounts payable questions (open vouchers, supplier balances,
upcoming payments) from JD Edwards EnterpriseOne through the CData JD Edwards
driver and the CData CLI.
---
## Connection
DataModel=FinancialManagement;SystemCodes=00,01
## Where the data lives
| Need | View |
|---|---|
| Vouchers and open balances (F0411) | [AccountsPayable].[AccountsPayableLedger] |
| Supplier names (F0101) | [AddressBook].[AddressBookMaster] |
| Code descriptions (F0005) | [FoundationEnvironment].[UserDefinedCodesSYRTKYDL01DL02] |
## Rules
1. Open items: OpenAmount > 0
2. PayStat 'A' = Approved for Payment, 'H' = Held, '#' = Payment In Process
3. OpenAmount is in the company's base currency. Never total across companies.
4. UDC values are right-justified. Compare with TRIM([UserDefCode]).
5. Dates are real DATE values; WHERE filters run on the JD Edwards server.
スキルに記録するのは、エージェントが簡単には推測できないことや、一から調べ直すとコストがかかることです。具体的には、どのビューが重要か、それをどう読み解くか、どう正しく合計するかといった内容です。接続処理やページネーション、カラム一覧など、ドライバーがすでに提供している情報を繰り返す必要はありません。
ステップ 4:質問してみる
スキルを読み込んだエージェントは、適切なビューにすぐにたどり着けます。質問の前半は、スキーマをまたいだ 1 つの結合クエリで答えられます。
SELECT l.[Co], a.[AlphaName], COUNT(*) AS items, SUM(l.[OpenAmount]) AS openAmt
FROM [AccountsPayable].[AccountsPayableLedger] l
INNER JOIN [AddressBook].[AddressBookMaster] a ON l.[AddressNumber] = a.[AddressNumber]
WHERE l.[OpenAmount] > 0 AND l.[PayStat] = 'A'
GROUP BY l.[Co], a.[AlphaName]
ORDER BY openAmt DESC
LIMIT 5
| Co | AlphaName | items | openAmt |
|---|---|---|---|
| 00022 | Supplier A | 7 | 113786705.00 |
| 00022 | Supplier B | 27 | 102716302.00 |
| 00001 | Supplier C | 38 | 79016979.57 |
| 00022 | Supplier D | 9 | 68211197.00 |
| 00001 | Supplier E | 84 | 54767506.32 |
この結果に含まれる 2 社は、どちらも USD を基準通貨としています。金額は Oracle のデモデータによるものです。
後半は、同じ結合に日付の範囲指定を加えるだけです。
SELECT l.[Co], a.[AlphaName], l.[InvoiceNumber], l.[DueDate], l.[OpenAmount], l.[CurCod]
FROM [AccountsPayable].[AccountsPayableLedger] l
INNER JOIN [AddressBook].[AddressBookMaster] a ON l.[AddressNumber] = a.[AddressNumber]
WHERE l.[OpenAmount] > 0 AND l.[PayStat] = 'A'
AND l.[DueDate] >= '2026-10-06' AND l.[DueDate] <= '2026-11-05'
ORDER BY l.[DueDate]
| Co | AlphaName | InvoiceNumber | DueDate | OpenAmount | CurCod |
|---|---|---|---|---|---|
| 00001 | Supplier F | FACT 0001 | 2026-10-10 | 12000.00 | USD |
| 00001 | Supplier G | MK789 | 2026-10-11 | 100.00 | USD |
どちらのクエリも 10 秒以内に結果が返ってきました。エージェントはスキルのルールに従い、住所番号ではなく仕入先名を示し、合計は会社ごとに通貨を添えて報告し、支払承認済みの伝票のみを集計対象としたことも明記しています。
エージェントの回答は次のとおりです。
承認済み伝票の未払残高が大きい仕入先(支払ステータス A – 支払承認済み、未払残高がゼロより大きいもの)。金額は各社の基準通貨建てで、以下の 2 社はいずれも USD です。
会社 仕入先 未払伝票数 未払残高(USD) 00022 Supplier A 7 113,786,705.00 00022 Supplier B 27 102,716,302.00 00001 Supplier C 38 79,016,979.57 00022 Supplier D 9 68,211,197.00 00001 Supplier E 84 54,767,506.32 今後 30 日以内に支払期日を迎えるもの(2026年10月6日~11月5日):承認済みの伝票が 2 件あり、いずれも会社 00001 のもので、合計は 12,100.00 USD です。
支払期日 仕入先 請求書番号 未払残高(USD) 2026年10月10日 Supplier F FACT 0001 12,000.00 2026年10月11日 Supplier G MK789 100.00 各社の金額はそれぞれの基準通貨建てであるため、合計は会社ごとに示しており、会社をまたいで合算していません。
使用した技術スタックをわかりやすく整理
| 構成要素 | 役割 |
|---|---|
| CData JDBC Driver for JD Edwards | JD Edwards AIS Server を SQL のスキーマとビューに変換します。サーバーサイドでのフィルタリング、読みやすい名前、型付きの日付に対応しています |
| CData CLI | エージェントがコマンドラインから接続テスト、スキーマの参照、クエリの検証を行えるようにします |
| Claude Code | データを探索し、スキルを作成し、質問に回答した AI エージェント |
| エージェントスキル(SKILL.md) | 使用すべきビューとその読み解き方のルールを記録した短い Markdown ファイル。次のセッションを、必要な知識を備えた状態から始められます |
まとめ
ERP データは、AI エージェントにとって最も価値のあるコンテキストのひとつです。そして JD Edwards には、仕入先、伝票、元帳、資産など、そうしたデータが豊富に蓄積されています。CData Driver for JD Edwards を使えば、AIS API のコードを一切書くことなく、標準 SQL でこれらのデータを利用できます。JD Edwards の認証情報で AIS Server 経由で接続し、DataModel と SystemCodes で必要なモジュールを選ぶだけで、読みやすい名前と本来の日付型を備え、JD Edwards サーバー上でフィルタが実行される読み取り専用のビューにクエリを実行できます。
ドライバーはエージェントにアクセス手段を与え、スキルは判断力を与えます。今回の例では、エージェントが 1 回のセッションで買掛金データの所在と読み解き方を学び、その知識を数十行の Markdown として保存しました。以降のセッションはすべて、適切なビュー、適切なコード、適切な金額の合計方法を把握した状態から始められます。この手法は JD Edwards のどのモジュールにも、そして CData が接続できる数百もの他のデータソースにも応用できます。
さっそく始めましょう:CData Driver for JD Edwards をダウンロード