コンテンツにスキップ

SQL 演習:AP 請求書から GL 仕訳まで追跡する

  • 請求書 1 件から GL 仕訳明細まで、7 段の結合で追跡する SQL を書ける
  • 結合で行が増える箇所(明細 → 配分、補助元帳仕訳 → GL 仕訳の集約)を説明し、金額の二重計上を避けられる
  • 請求書・補助元帳仕訳・GL 仕訳の金額を、1 本の SQL で 3 点照合できる
  • 期間内の請求書を「どの段階で止まっているか」で分類する SQL を書ける
  • Fusion 環境がなくても、サンプルデータで SQL を実行して結果を検証できる

仕組みの解説は SLA の仕組みと追跡 SQL、各表の結合キーは 主要テーブルマップ を参照してください。

前提・準備(Fusion 環境あり/なし)

Section titled “前提・準備(Fusion 環境あり/なし)”

サンプル商事株式会社(JP01 営業単位、元帳「サンプル商事 JP 元帳」、通貨 JPY)の 2026 年 9 月の AP 請求書 5 件を調べます。経理担当から「INV-2026-0001 は GL でいくらになっているか」「INV-2026-0003 以降が GL に見当たらないのはなぜか」と頼まれた、という設定です。

請求書番号 金額 状態(答え合わせ用)
INV-2026-0001 165,000 会計済み・GL 転送済み・転記済み。明細 2 は配分が 2 行(勘定が異なる)
INV-2026-0002 44,000 GL に転送済みだが未転記
INV-2026-0003 33,000 最終仕訳は作成済みだが、GL へ未転送
INV-2026-0004 11,000 会計が未作成(会計イベントが未処理)
INV-2026-0005 22,000 ドラフトの仕訳だけがある(GL へは転送されない)

ステップ 0〜6 と 8 は INV-2026-0001(INVOICE_ID = 10001)を、ステップ 7 は 5 件すべてを使います。

追跡の経路は次の 7 段です。右端の「0001 の行数」は、サンプルの INV-2026-0001 で各段が返す行数です。

段 表(1 行が表すもの) 前の段との結合キー 確認 0001 の行数
1 AP_INVOICES_ALL(請求書) — 25D 1
2 AP_INVOICE_LINES_ALL(明細) INVOICE_ID 25D 3
3 AP_INVOICE_DISTRIBUTIONS_ALL(配分) INVOICE_ID+INVOICE_LINE_NUMBER(明細の LINE_NUMBER) 25D 4
4 XLA_EVENTS(会計イベント) 配分の ACCOUNTING_EVENT_ID(= EVENT_ID) 25D 1
5 XLA_AE_HEADERS(補助元帳仕訳ヘッダー) APPLICATION_ID+EVENT_ID 25D 1
6 XLA_AE_LINES(補助元帳仕訳明細) APPLICATION_ID+AE_HEADER_ID 25D 5
7 GL_IMPORT_REFERENCES → GL_JE_LINES(GL 仕訳明細) GL_SL_LINK_ID+GL_SL_LINK_TABLE → JE_HEADER_ID+JE_LINE_NUM 25D → 26A 5 → 4
  • 請求書からイベントへは、XLA_TRANSACTION_ENTITIES(SOURCE_ID_INT_1 = INVOICE_ID)を経由する経路もあります。この演習では、配分が持つ ACCOUNTING_EVENT_ID を使う近道を使います(SLA の仕組みと追跡 SQL)。
  • 配分と補助元帳仕訳明細の対応は XLA_DISTRIBUTION_LINKS が持っています(ステップ 8)。
  • XLA_EVENTS には LEDGER_ID 列がなく、元帳の列は TRANSACTION_LEDGER_ID(NULL 可)です。元帳で絞るときは、XLA_AE_HEADERS の LEDGER_ID を使います(25D)。
  • 公式の説明では、GL_IMPORT_REFERENCES には、ジャーナル・ソースの Import Journal References が Yes のものについて、フィーダー側の取引ごとに 1 行が作られます(25D)。ステップ 7 で GL 側が空になるときは、この設定も確認ポイントです。
  • 「確認」列の見方は 主要テーブルマップ と同じです。
  • BI Publisher のデータモデルを作成できる権限(BI 作成者向けのロール。必要なロールは環境のセキュリティ管理者に確認してください)と、テスト環境。本番では行いません
  • 会計済みで、GL へ転送・転記済みの請求書を 1 件。配分が複数行あるものが望ましいです。請求書番号と BU を控えます
  • BIP のカタログでデータモデルを作り、SQL Query データセットを追加します。データソースは、財務の表を照会できるものを環境で確認します。パラメータ(:P_INVOICE_ID など)は、解答例のものに合わせて作ります(作り方は BIP 演習 を参照)
  • ステップ 0 の結果(APPLICATION_ID など)で、解答例の固定値を置き換えます

環境なしルート(サンプルデータ)

Section titled “環境なしルート(サンプルデータ)”

Python 3 の標準ライブラリ sqlite3 で動く、学習用のサンプルデータを用意しました(動作確認は Python 3.13・SQLite 3.45)。

  1. 下のスクリプトを setup.sql として保存します(サンプルデータの作成)
  2. 実行用スクリプトを run_lab.py として保存します
  3. 自分で書いた SQL(または解答例)を q1.sql のような名前で保存し、パラメータを付けて実行します
SQL ファイルをパラメータ付きで実行する
python run_lab.py q1.sql P_BU_ID=2001 P_INVOICE_NUM=INV-2026-0001
python run_lab.py q2a.sql P_INVOICE_ID=10001
python run_lab.py q7.sql P_BU_ID=2001 P_FROM_DATE=2026-09-01 P_TO_DATE=2026-09-30

解答例の SQL は SQLite で動作確認しています。BIP(Oracle Database)でも使える標準的な書き方にしていますが、実機での動作は確認していません。SQL を実行できない場合でも、各ステップの期待結果と解答例を読み、結合の書き方と行数の変化を確かめれば、考え方は身につきます。

setup.sql(サンプルデータの作成スクリプト)を表示
setup.sql(学習用。Fusion の表を簡略化した SQLite 用スクリプト)
-- ============================================================
-- 学習用サンプルデータ(架空)
-- Fusion の表を、この演習で使う列だけに簡略化しています。実機の表の列とは一致しません。
-- SQLite 前提(他のデータベースでは型を読み替えてください)
-- 固定値(200、'AP_INVOICES'、'INVOICE VALIDATED'、'AP_INV_DIST'、'ITEM EXPENSE' など)は
-- この演習で決めたサンプルの値です。実機の値は環境で確認します(ステップ 0)。
-- ============================================================
-- 名称・マスタ
CREATE TABLE fun_all_business_units_v (bu_id INTEGER, bu_name TEXT);
CREATE TABLE gl_ledgers (ledger_id INTEGER, name TEXT, currency_code TEXT);
CREATE TABLE poz_suppliers (vendor_id INTEGER, party_id INTEGER, segment1 TEXT);
CREATE TABLE hz_parties (party_id INTEGER, party_name TEXT);
CREATE TABLE gl_code_combinations (
code_combination_id INTEGER, segment1 TEXT, segment2 TEXT, segment3 TEXT, segment4 TEXT);
-- AP(請求書・明細・配分)
CREATE TABLE ap_invoices_all (
invoice_id INTEGER, invoice_num TEXT, vendor_id INTEGER, org_id INTEGER, set_of_books_id INTEGER,
invoice_date TEXT, gl_date TEXT, invoice_amount INTEGER, invoice_currency_code TEXT);
CREATE TABLE ap_invoice_lines_all (
invoice_id INTEGER, line_number INTEGER, line_type_lookup_code TEXT, amount INTEGER);
CREATE TABLE ap_invoice_distributions_all (
invoice_distribution_id INTEGER, invoice_id INTEGER, invoice_line_number INTEGER,
distribution_line_number INTEGER, amount INTEGER, accounting_date TEXT,
dist_code_combination_id INTEGER, posted_flag TEXT, accounting_event_id INTEGER);
-- SLA(会計イベント・補助元帳仕訳)
CREATE TABLE xla_transaction_entities (
entity_id INTEGER, application_id INTEGER, entity_code TEXT, source_id_int_1 INTEGER,
transaction_number TEXT);
CREATE TABLE xla_events (
event_id INTEGER, application_id INTEGER, entity_id INTEGER, event_type_code TEXT,
process_status_code TEXT);
CREATE TABLE xla_ae_headers (
ae_header_id INTEGER, application_id INTEGER, ledger_id INTEGER, entity_id INTEGER,
event_id INTEGER, accounting_date TEXT, accounting_entry_status_code TEXT,
gl_transfer_status_code TEXT);
CREATE TABLE xla_ae_lines (
ae_header_id INTEGER, ae_line_num INTEGER, application_id INTEGER, code_combination_id INTEGER,
accounting_class_code TEXT, accounted_dr INTEGER, accounted_cr INTEGER,
gl_sl_link_id INTEGER, gl_sl_link_table TEXT);
CREATE TABLE xla_distribution_links (
application_id INTEGER, event_id INTEGER, ae_header_id INTEGER, ae_line_num INTEGER,
source_distribution_type TEXT, source_distribution_id_num_1 INTEGER);
-- GL(仕訳明細と、補助元帳仕訳明細との対応)
CREATE TABLE gl_import_references (
je_header_id INTEGER, je_line_num INTEGER, gl_sl_link_id INTEGER, gl_sl_link_table TEXT);
CREATE TABLE gl_je_lines (
je_header_id INTEGER, je_line_num INTEGER, ledger_id INTEGER, period_name TEXT,
code_combination_id INTEGER, accounted_dr INTEGER, accounted_cr INTEGER, status TEXT);
-- マスタ
INSERT INTO fun_all_business_units_v VALUES (2001, 'JP01 営業単位');
INSERT INTO gl_ledgers VALUES (1001, 'サンプル商事 JP 元帳', 'JPY');
INSERT INTO poz_suppliers VALUES (3001, 4001, '1001'), (3002, 4002, '1002');
INSERT INTO hz_parties VALUES (4001, 'サンプル部品株式会社'), (4002, 'テスト物流株式会社');
INSERT INTO gl_code_combinations VALUES
(6001, '101', '1000', '5120', '000'), -- 消耗品費(総務部)
(6002, '101', '2000', '5130', '000'), -- 通信費(営業部)
(6003, '101', '0000', '1850', '000'), -- 仮払消費税
(6004, '101', '0000', '2110', '000'); -- 買掛金
-- AP 請求書 5 件
INSERT INTO ap_invoices_all VALUES
(10001, 'INV-2026-0001', 3001, 2001, 1001, '2026-09-10', '2026-09-10', 165000, 'JPY'),
(10002, 'INV-2026-0002', 3001, 2001, 1001, '2026-09-12', '2026-09-12', 44000, 'JPY'),
(10003, 'INV-2026-0003', 3002, 2001, 1001, '2026-09-15', '2026-09-15', 33000, 'JPY'),
(10004, 'INV-2026-0004', 3002, 2001, 1001, '2026-09-18', '2026-09-18', 11000, 'JPY'),
(10005, 'INV-2026-0005', 3001, 2001, 1001, '2026-09-20', '2026-09-20', 22000, 'JPY');
INSERT INTO ap_invoice_lines_all VALUES
(10001, 1, 'ITEM', 100000), (10001, 2, 'ITEM', 50000), (10001, 3, 'TAX', 15000),
(10002, 1, 'ITEM', 40000), (10002, 2, 'TAX', 4000),
(10003, 1, 'ITEM', 30000), (10003, 2, 'TAX', 3000),
(10004, 1, 'ITEM', 10000), (10004, 2, 'TAX', 1000),
(10005, 1, 'ITEM', 20000), (10005, 2, 'TAX', 2000);
INSERT INTO ap_invoice_distributions_all VALUES
(20001, 10001, 1, 1, 100000, '2026-09-10', 6001, 'Y', 30001),
(20002, 10001, 2, 1, 30000, '2026-09-10', 6001, 'Y', 30001), -- 明細 2 は配分 2 行に分割
(20003, 10001, 2, 2, 20000, '2026-09-10', 6002, 'Y', 30001),
(20004, 10001, 3, 1, 15000, '2026-09-10', 6003, 'Y', 30001),
(20005, 10002, 1, 1, 40000, '2026-09-12', 6001, 'Y', 30002),
(20006, 10002, 2, 1, 4000, '2026-09-12', 6003, 'Y', 30002),
(20007, 10003, 1, 1, 30000, '2026-09-15', 6001, 'Y', 30003),
(20008, 10003, 2, 1, 3000, '2026-09-15', 6003, 'Y', 30003),
(20009, 10004, 1, 1, 10000, '2026-09-18', 6001, 'N', 30004),
(20010, 10004, 2, 1, 1000, '2026-09-18', 6003, 'N', 30004),
(20011, 10005, 1, 1, 20000, '2026-09-20', 6001, 'N', 30005),
(20012, 10005, 2, 1, 2000, '2026-09-20', 6003, 'N', 30005);
-- SLA:エンティティ・イベント・仕訳ヘッダー・仕訳明細(application_id 200 を AP の例とする)
INSERT INTO xla_transaction_entities VALUES
(40001, 200, 'AP_INVOICES', 10001, 'INV-2026-0001'),
(40002, 200, 'AP_INVOICES', 10002, 'INV-2026-0002'),
(40003, 200, 'AP_INVOICES', 10003, 'INV-2026-0003'),
(40004, 200, 'AP_INVOICES', 10004, 'INV-2026-0004'),
(40005, 200, 'AP_INVOICES', 10005, 'INV-2026-0005');
INSERT INTO xla_events VALUES
(30001, 200, 40001, 'INVOICE VALIDATED', 'P'),
(30002, 200, 40002, 'INVOICE VALIDATED', 'P'),
(30003, 200, 40003, 'INVOICE VALIDATED', 'P'),
(30004, 200, 40004, 'INVOICE VALIDATED', 'U'), -- 未処理(会計が作られていない)
(30005, 200, 40005, 'INVOICE VALIDATED', 'D'); -- ドラフト
INSERT INTO xla_ae_headers VALUES
(50001, 200, 1001, 40001, 30001, '2026-09-10', 'F', 'Y'), -- 最終・GL 転送済み
(50002, 200, 1001, 40002, 30002, '2026-09-12', 'F', 'Y'), -- 最終・GL 転送済み
(50003, 200, 1001, 40003, 30003, '2026-09-15', 'F', 'N'), -- 最終・GL 未転送
(50005, 200, 1001, 40005, 30005, '2026-09-20', 'D', 'N'); -- ドラフト
INSERT INTO xla_ae_lines VALUES
(50001, 1, 200, 6001, 'ITEM EXPENSE', 100000, NULL, 90001, 'XLAJEL'),
(50001, 2, 200, 6001, 'ITEM EXPENSE', 30000, NULL, 90002, 'XLAJEL'),
(50001, 3, 200, 6002, 'ITEM EXPENSE', 20000, NULL, 90003, 'XLAJEL'),
(50001, 4, 200, 6003, 'TAX', 15000, NULL, 90004, 'XLAJEL'),
(50001, 5, 200, 6004, 'LIABILITY', NULL, 165000, 90005, 'XLAJEL'),
(50002, 1, 200, 6001, 'ITEM EXPENSE', 40000, NULL, 90011, 'XLAJEL'),
(50002, 2, 200, 6003, 'TAX', 4000, NULL, 90012, 'XLAJEL'),
(50002, 3, 200, 6004, 'LIABILITY', NULL, 44000, 90013, 'XLAJEL'),
(50003, 1, 200, 6001, 'ITEM EXPENSE', 30000, NULL, 90021, 'XLAJEL'),
(50003, 2, 200, 6003, 'TAX', 3000, NULL, 90022, 'XLAJEL'),
(50003, 3, 200, 6004, 'LIABILITY', NULL, 33000, 90023, 'XLAJEL'),
(50005, 1, 200, 6001, 'ITEM EXPENSE', 20000, NULL, 90041, 'XLAJEL'),
(50005, 2, 200, 6003, 'TAX', 2000, NULL, 90042, 'XLAJEL'),
(50005, 3, 200, 6004, 'LIABILITY', NULL, 22000, 90043, 'XLAJEL');
-- 配分と仕訳明細の対応(配分 1 行 → 費用・税の仕訳明細 1 行 + 買掛金の仕訳明細)
INSERT INTO xla_distribution_links VALUES
(200, 30001, 50001, 1, 'AP_INV_DIST', 20001), (200, 30001, 50001, 5, 'AP_INV_DIST', 20001),
(200, 30001, 50001, 2, 'AP_INV_DIST', 20002), (200, 30001, 50001, 5, 'AP_INV_DIST', 20002),
(200, 30001, 50001, 3, 'AP_INV_DIST', 20003), (200, 30001, 50001, 5, 'AP_INV_DIST', 20003),
(200, 30001, 50001, 4, 'AP_INV_DIST', 20004), (200, 30001, 50001, 5, 'AP_INV_DIST', 20004),
(200, 30002, 50002, 1, 'AP_INV_DIST', 20005), (200, 30002, 50002, 3, 'AP_INV_DIST', 20005),
(200, 30002, 50002, 2, 'AP_INV_DIST', 20006), (200, 30002, 50002, 3, 'AP_INV_DIST', 20006),
(200, 30003, 50003, 1, 'AP_INV_DIST', 20007), (200, 30003, 50003, 3, 'AP_INV_DIST', 20007),
(200, 30003, 50003, 2, 'AP_INV_DIST', 20008), (200, 30003, 50003, 3, 'AP_INV_DIST', 20008),
(200, 30005, 50005, 1, 'AP_INV_DIST', 20011), (200, 30005, 50005, 3, 'AP_INV_DIST', 20011),
(200, 30005, 50005, 2, 'AP_INV_DIST', 20012), (200, 30005, 50005, 3, 'AP_INV_DIST', 20012);
-- GL 仕訳明細(ヘッダー 70001 は転記済み、70002 は未転記)
INSERT INTO gl_je_lines VALUES
(70001, 1, 1001, 'Sep-26', 6001, 130000, NULL, 'P'), -- 補助元帳仕訳明細 1・2 を集約
(70001, 2, 1001, 'Sep-26', 6002, 20000, NULL, 'P'),
(70001, 3, 1001, 'Sep-26', 6003, 15000, NULL, 'P'),
(70001, 4, 1001, 'Sep-26', 6004, NULL, 165000, 'P'),
(70002, 1, 1001, 'Sep-26', 6001, 40000, NULL, 'U'),
(70002, 2, 1001, 'Sep-26', 6003, 4000, NULL, 'U'),
(70002, 3, 1001, 'Sep-26', 6004, NULL, 44000, 'U');
INSERT INTO gl_import_references VALUES
(70001, 1, 90001, 'XLAJEL'), (70001, 1, 90002, 'XLAJEL'),
(70001, 2, 90003, 'XLAJEL'), (70001, 3, 90004, 'XLAJEL'), (70001, 4, 90005, 'XLAJEL'),
(70002, 1, 90011, 'XLAJEL'), (70002, 2, 90012, 'XLAJEL'), (70002, 3, 90013, 'XLAJEL');
run_lab.py(SQL 実行用スクリプト)を表示
run_lab.py
import sqlite3
import sys
from pathlib import Path
# 使い方: python run_lab.py <SQL ファイル> [パラメータ名=値 ...]
# 例 : python run_lab.py q1.sql P_BU_ID=2001 P_INVOICE_NUM=INV-2026-0001
con = sqlite3.connect(":memory:")
con.executescript(Path("setup.sql").read_text(encoding="utf-8"))
sql = Path(sys.argv[1]).read_text(encoding="utf-8")
params = {}
for arg in sys.argv[2:]:
name, value = arg.split("=", 1)
params[name] = int(value) if value.lstrip("-").isdigit() else value
cur = con.execute(sql, params)
print("\t".join(d[0] for d in cur.description))
rows = cur.fetchall()
for row in rows:
print("\t".join("" if v is None else str(v) for v in row))
print(f"({len(rows)} rows)")

各ステップは「課題 → ヒント → 期待結果 → 確認すること」の順です。まず自分で SQL を書いて結果を期待結果と照合し、行き詰まったら「解答例」を見ます。期待結果の空白は NULL です。表示の整形が違っても、行数と値が合っていれば正解です。

実装でも最初の作業です。SQL に書く固定値(アプリケーション ID、エンティティ・コード、配分タイプ)は、推測せずに環境で確かめます。

課題:請求書 1 件(:P_INVOICE_ID)について、次の 2 つを返す SQL を書いてください。

  1. その請求書の会計エンティティの APPLICATION_ID と ENTITY_CODE
  2. その請求書の配分に結び付く XLA_DISTRIBUTION_LINKS の SOURCE_DISTRIBUTION_TYPE(重複なし)

ヒント:エンティティは SOURCE_ID_INT_1 が請求書の INVOICE_ID です。配分リンクは、配分の ACCOUNTING_EVENT_ID を EVENT_ID に結び付けます。重複を除くには SELECT DISTINCT を使います。

期待結果(P_INVOICE_ID = 10001)

application_id entity_code
-------------- -----------
200 AP_INVOICES
(1 rows)
source_distribution_type
------------------------
AP_INV_DIST
(1 rows)

確認すること:サンプルでは 200、AP_INVOICES、AP_INV_DIST です。これは演習で決めた値で、実機の値は自分の環境の結果を使います。以降の SQL に出てくる固定値も、実機では確認した値に置き換えます。他の種類の取引と SOURCE_ID_INT_1 が偶然同じ値になることがあるため、結合ではアプリケーション ID とエンティティ・コードの両方を条件にします。

ステップ 1 請求書ヘッダーに名称を付ける

Section titled “ステップ 1 請求書ヘッダーに名称を付ける”

課題:BU の ID が 2001、請求書番号が INV-2026-0001 の請求書について、BU 名・元帳名・請求書 ID・請求書番号・仕入先番号・仕入先名・請求書金額・通貨を 1 行で返してください。

ヒント

  • 業務の表には ID しかありません。BU 名は BU のビュー、元帳名は GL_LEDGERS、仕入先名は POZ_SUPPLIERS から HZ_PARTIES をたどって取ります(BI Publisher の SQL 実践)
  • 元帳は、請求書の SET_OF_BOOKS_ID で結び付けます
  • 請求書番号だけでは請求書を特定できない場合があります。BU も条件にし、結果が 1 行かを確かめて、以降は INVOICE_ID で追います

期待結果(P_BU_ID = 2001、P_INVOICE_NUM = 'INV-2026-0001')

bu_name ledger_name invoice_id invoice_num supplier_no supplier_name invoice_amount cur
------------- -------------------- ---------- ------------- ----------- -------------------- -------------- ---
JP01 営業単位 サンプル商事 JP 元帳 10001 INV-2026-0001 1001 サンプル部品株式会社 165000 JPY
(1 rows)

確認すること:1 行だけ返り、請求書 ID が 10001 であること。名称の表を INNER JOIN にすると、名称が取れない請求書は結果から消えます。

ステップ 2 明細と配分をたどり、金額を突き合わせる

Section titled “ステップ 2 明細と配分をたどり、金額を突き合わせる”

課題 2a:請求書 10001 の明細と配分を結合し、明細番号・明細タイプ・明細金額・配分番号・配分金額・勘定組合せ ID・会計済みフラグ・会計イベント ID を返してください。

課題 2b:請求書ヘッダーの金額、明細金額の合計、配分金額の合計を 1 行で返してください。

ヒント

  • 配分は、請求書 ID と、配分側の INVOICE_LINE_NUMBER(明細の LINE_NUMBER)で明細に結び付きます
  • 2b は、明細と配分を同じ結合の中で合計しないでください。それぞれ別に集計します(サブクエリを使います)

期待結果(P_INVOICE_ID = 10001)

line_number line_type line_amount dist_no dist_amount ccid posted_flag event_id
----------- --------- ----------- ------- ----------- ---- ----------- --------
1 ITEM 100000 1 100000 6001 Y 30001
2 ITEM 50000 1 30000 6001 Y 30001
2 ITEM 50000 2 20000 6002 Y 30001
3 TAX 15000 1 15000 6003 Y 30001
(4 rows)
header_amount lines_total dists_total
------------- ----------- -----------
165000 165000 165000
(1 rows)

確認すること

  • 明細 2(50,000)が配分 2 行(30,000+20,000)に分かれ、2a では明細金額が 2 行に繰り返されます。2a の明細金額を足すと 215,000 になり、請求書金額 165,000 と合いません。これが 1 つ目の二重計上の落とし穴です
  • 配分は全行が会計済み(POSTED_FLAG = Y)で、会計イベント ID(30001)は 1 つです。次のステップへ使います
  • 2b では 3 つの金額が 165,000 で一致します

ステップ 3 勘定組合せをセグメントに分解する

Section titled “ステップ 3 勘定組合せをセグメントに分解する”

課題:請求書 10001 の配分ごとに、勘定組合せのセグメント 1〜4 を返してください。

ヒント:配分の DIST_CODE_COMBINATION_ID を GL_CODE_COMBINATIONS.CODE_COMBINATION_ID に結び付けます。どの列が会社・部門・勘定かは COA の設計で決まります。サンプルでは、セグメント 1 が会社、2 が部門、3 が勘定科目、4 が補助科目です。

期待結果(P_INVOICE_ID = 10001)

dist_id line_no dist_no amount company department account sub_account
------- ------- ------- ------ ------- ---------- ------- -----------
20001 1 1 100000 101 1000 5120 000
20002 2 1 30000 101 1000 5120 000
20003 2 2 20000 101 2000 5130 000
20004 3 1 15000 101 0000 1850 000
(4 rows)

確認すること:明細 2 の 2 つの配分は、部門セグメントが 1000 と 2000 で異なります。配分は、このように勘定組合せごとに分かれます。セグメント値の名称(科目名など)は値セットから取りますが、この演習では取りません。

ステップ 4 会計イベントから補助元帳仕訳をたどる

Section titled “ステップ 4 会計イベントから補助元帳仕訳をたどる”

課題:請求書 10001 の会計イベントについて、イベント(ID・タイプ・ステータス)、補助元帳仕訳ヘッダー(ID・ステータス・GL 転送ステータス)、補助元帳仕訳明細(行番号・会計クラス・勘定組合せ・借方・貸方)を返してください。

ヒント

  • 請求書の配分が持つ会計イベント ID の一覧を副問合せで取り、イベントを絞ります
  • イベントの条件と、各結合の条件には APPLICATION_ID を入れます(ステップ 0 の値)
  • ヘッダーと明細は LEFT JOIN でつなぎます。仕訳が作られていない請求書でも、イベントまでは残るようにするためです(この請求書は全段そろっています)

期待結果(P_INVOICE_ID = 10001)

event_id event_type_code ev_status ae_header_id entry_status transfer ae_line_num accounting_class_code ccid accounted_dr accounted_cr
-------- ----------------- --------- ------------ ------------ -------- ----------- --------------------- ---- ------------ ------------
30001 INVOICE VALIDATED P 50001 F Y 1 ITEM EXPENSE 6001 100000
30001 INVOICE VALIDATED P 50001 F Y 2 ITEM EXPENSE 6001 30000
30001 INVOICE VALIDATED P 50001 F Y 3 ITEM EXPENSE 6002 20000
30001 INVOICE VALIDATED P 50001 F Y 4 TAX 6003 15000
30001 INVOICE VALIDATED P 50001 F Y 5 LIABILITY 6004 165000
(5 rows)

確認すること

  • 配分 4 行から、費用・税の借方 4 行と、買掛金(LIABILITY)の貸方 1 行の、計 5 行の仕訳明細が作られています
  • 借方の合計(100,000+30,000+20,000+15,000)と貸方(165,000)が一致し、請求書金額 165,000 とも一致します
  • ヘッダーは最終(F)で GL 転送済み(Y)です。イベントのステータスは P(処理済)です

ステップ 5 GL 仕訳明細までたどる

Section titled “ステップ 5 GL 仕訳明細までたどる”

課題:ステップ 4 に、GL_IMPORT_REFERENCES と GL_JE_LINES を結び付け、補助元帳仕訳明細ごとに、対応する GL 仕訳明細(仕訳ヘッダー ID・行番号・借方・貸方・転記ステータス)を並べてください。

ヒント

  • 補助元帳仕訳明細の GL_SL_LINK_ID+GL_SL_LINK_TABLE を、GL_IMPORT_REFERENCES の同名の列に結び付けます。そこから JE_HEADER_ID+JE_LINE_NUM で GL_JE_LINES に進みます
  • 未転送の請求書も一覧に残せるよう、GL 側は LEFT JOIN にします
  • 補助元帳側の金額(sla_dr・sla_cr)と、GL 側の金額(gl_dr・gl_cr)を並べて、行数と金額を比べます

期待結果(P_INVOICE_ID = 10001)

ae_line_num accounting_class_code sla_dr sla_cr je_header_id je_line_num gl_dr gl_cr gl_status
----------- --------------------- ------ ------ ------------ ----------- ------ ------ ---------
1 ITEM EXPENSE 100000 70001 1 130000 P
2 ITEM EXPENSE 30000 70001 1 130000 P
3 ITEM EXPENSE 20000 70001 2 20000 P
4 TAX 15000 70001 3 15000 P
5 LIABILITY 165000 70001 4 165000 P
(5 rows)

確認すること

  • 補助元帳仕訳明細は 5 行、GL 仕訳明細は 4 行です。ae_line_num の 1 と 2 は、どちらも GL 仕訳明細の 1 行目(130,000)に集約されています。1 対 1 ではなく、多対 1 です
  • そのため、この結果の gl_dr をそのまま合計すると、130,000 が 2 回数えられます。2 つ目の二重計上の落とし穴です
  • GL 仕訳明細は全行が転記済み(P)です

ステップ 6 請求書・補助元帳仕訳・GL 仕訳を 3 点照合する

Section titled “ステップ 6 請求書・補助元帳仕訳・GL 仕訳を 3 点照合する”

課題:請求書の配分合計、補助元帳仕訳の借方・貸方の合計、GL 仕訳の借方・貸方の合計を、1 行で返す SQL を書いてください。GL 側は、ステップ 5 の結合の金額を足さず、先に GL 仕訳明細のキー(JE_HEADER_ID+JE_LINE_NUM)を重複なしにしてから GL_JE_LINES と結合して合計します。

あわせて、ステップ 5 と同じ結合のまま GL の借方を合計した場合の値を求め、正しい値との違いを説明してください。

ヒント:WITH 句で「配分合計」「補助元帳仕訳合計」「GL 仕訳キー」「GL 仕訳合計」に分けると読みやすくなります。金額が NULL の行(借方だけ、貸方だけの行)は COALESCE(列, 0) で 0 にして合計します。

期待結果(P_INVOICE_ID = 10001)

ap_total sla_dr sla_cr gl_dr gl_cr
-------- ------ ------ ------ ------
165000 165000 165000 165000 165000
(1 rows)
誤った書き方(結合のまま GL の借方を足した値)の結果:
gl_dr_wrong
-----------
295000
(1 rows)

確認すること:正しい合計は 5 つとも 165,000 で一致します。誤った書き方では 295,000 になり、GL 側だけ 130,000 分多くなります(集約された仕訳明細が 2 回数えられるため)。

同じ SQL を、他の請求書でも実行します。

請求書 配分合計 補助元帳仕訳(借方) GL 仕訳(借方) 読み取り
INV-2026-0001 165,000 165,000 165,000 3 点が一致(転記済み)
INV-2026-0002 44,000 44,000 44,000 3 点が一致(GL 仕訳明細はあるが未転記)
INV-2026-0003 33,000 33,000 なし GL 仕訳がない(GL へ未転送)
INV-2026-0004 11,000 なし なし 補助元帳仕訳がない(会計が未作成)
INV-2026-0005 22,000 22,000 なし ドラフトの仕訳だけがある

3 点照合は、金額が一致するかを見るもので、状態は見ていません。INV-2026-0002 は一致していても未転記で、INV-2026-0005 の補助元帳仕訳はドラフトです。状態の確認はステップ 7 で行います。

ステップ 7 期間内の請求書を、止まっている段階で分類する

Section titled “ステップ 7 期間内の請求書を、止まっている段階で分類する”

課題:JP01 営業単位(BU の ID が 2001)の GL 日付が 2026 年 9 月の請求書について、請求書番号・金額・イベント ID・イベントのステータス・補助元帳仕訳ヘッダー ID・仕訳ステータス・GL 転送ステータス・GL 仕訳明細のステータスと、下の表の「段階」を 1 行ずつ返してください。

段階 判定 意味 次に確認すること
0 会計イベントがない 検証前など、会計の対象になっていない 請求書の検証・承認の状況
1 イベントはあるが仕訳ヘッダーがない Create Accounting が未実行、またはエラー イベントのステータス(U か E)、Create Accounting の出力
2 仕訳ヘッダーがドラフト ドラフトは GL へ転送されない 最終モードで会計を作成する
3 最終だが GL へ未転送 転送が行われていない Transfer to General Ledger の指定、転送の実行
4 転送済みだが GL 仕訳明細がない 想定外の状態 転送後の GL 側の処理結果(スケジュール済プロセス)を調べる
5 GL 仕訳明細が未転記 GL での転記待ち GL の転記の実行、転記の設定
6 GL 仕訳明細が転記済み 完了 —

ヒント

  • 請求書から GL 仕訳明細まで、すべて LEFT JOIN でつなぎます。どこで途切れても、請求書の行が残ります
  • GL 仕訳明細のステータスは、請求書ごとに 1 つにまとめます。GROUP BY で MAX(ステータス) を取ると、未転記(U)が 1 行でもあれば U になります(U が P より後ろに並ぶことを使った書き方です)
  • 段階の判定は CASE で、途切れた位置が早い順に書きます。先に当てはまった条件が採用されます

期待結果(P_BU_ID = 2001、P_FROM_DATE = '2026-09-01'、P_TO_DATE = '2026-09-30')

invoice_num invoice_amount event_id ev_status ae_header_id entry_status transfer gl_line_status stage
------------- -------------- -------- --------- ------------ ------------ -------- -------------- -------------------------------
INV-2026-0001 165000 30001 P 50001 F Y P 6 GL 転記済み
INV-2026-0002 44000 30002 P 50002 F Y U 5 GL 転送済み・未転記
INV-2026-0003 33000 30003 P 50003 F N 3 最終仕訳済み・GL 未転送
INV-2026-0004 11000 30004 U 1 未会計(仕訳ヘッダーなし)
INV-2026-0005 22000 30005 D 50005 D N 2 ドラフト(GL へ転送されない)
(5 rows)

確認すること:5 件が 5 つの異なる段階(6・5・3・1・2)に分類されます。イベントのステータスが E(エラー)でも、仕訳ヘッダーがないため段階 1 に入ります。U と E の見分けは ev_status の列で行います。1 つの請求書にイベントが複数あれば(検証と取消など)、イベントごとに行が出ます。

ステップ 8(発展)配分単位で追跡する

Section titled “ステップ 8(発展)配分単位で追跡する”

課題:請求書 10001 の配分 1 行ごとに、どの補助元帳仕訳明細になったかを返してください(配分 ID・配分金額・仕訳ヘッダー ID・行番号・会計クラス・借方・貸方)。

ヒント:XLA_DISTRIBUTION_LINKS を使います。配分の ACCOUNTING_EVENT_ID を EVENT_ID に、配分の INVOICE_DISTRIBUTION_ID を SOURCE_DISTRIBUTION_ID_NUM_1 に結び付け、AE_HEADER_ID+AE_LINE_NUM で補助元帳仕訳明細へ進みます。配分の種類を区別する SOURCE_DISTRIBUTION_TYPE の条件は、ステップ 0 で確認した値で加えます。

期待結果(P_INVOICE_ID = 10001)

dist_id dist_amount ae_header_id ae_line_num accounting_class_code accounted_dr accounted_cr
------- ----------- ------------ ----------- --------------------- ------------ ------------
20001 100000 50001 1 ITEM EXPENSE 100000
20001 100000 50001 5 LIABILITY 165000
20002 30000 50001 2 ITEM EXPENSE 30000
20002 30000 50001 5 LIABILITY 165000
20003 20000 50001 3 ITEM EXPENSE 20000
20003 20000 50001 5 LIABILITY 165000
20004 15000 50001 4 TAX 15000
20004 15000 50001 5 LIABILITY 165000
(8 rows)

確認すること:どの配分も、自分の費用・税の借方明細と、買掛金(LIABILITY)の貸方明細の 2 行に結び付いています。買掛金の貸方 165,000 は 4 つの配分すべてに結び付くため、配分単位で仕訳金額を合計するときに貸方を足すと、165,000 × 4 = 660,000 になります。配分単位の分析では、会計クラスで行を絞ります。

  • ステップ 0 で確かめた固定値(アプリケーション ID など)を、SQL に反映した
  • 各段を結合するたびに、行数を確認した(請求書 1 → 明細 3 → 配分 4 → 補助元帳仕訳明細 5 → GL 仕訳明細 4)
  • 明細金額を、配分と同じ結合の中で合計していない
  • GL の金額は、GL 仕訳明細のキーを重複なしにしてから合計した(165,000 になる。295,000 ではない)
  • 補助元帳側の結合に APPLICATION_ID を入れた
  • 途切れた請求書も一覧に残るよう、後続の表を LEFT JOIN にした
  • 5 件の請求書が、期待どおりの段階(6・5・3・1・2)に分類された
  • 実機で行った場合は、テスト環境で、BU の条件を入れて実行した

自分の SQL と、結果の行・値が一致すれば、書き方が違っても正解です。実機では、列名と固定値を環境の値に置き換えます。

解答例 0:固定値の確認(ステップ 0)を表示
アプリケーション ID とエンティティ・コード
SELECT DISTINCT xte.application_id, xte.entity_code
FROM xla_transaction_entities xte
JOIN ap_invoices_all aia ON aia.invoice_id = xte.source_id_int_1
WHERE aia.invoice_id = :P_INVOICE_ID
配分タイプ
SELECT DISTINCT xdl.source_distribution_type
FROM xla_distribution_links xdl
JOIN ap_invoice_distributions_all aida
ON aida.accounting_event_id = xdl.event_id
WHERE aida.invoice_id = :P_INVOICE_ID
解答例 1:請求書ヘッダーに名称を付ける(ステップ 1)を表示
BU 名・元帳名・仕入先名つきの請求書ヘッダー
SELECT bu.bu_name,
gl.name AS ledger_name,
aia.invoice_id,
aia.invoice_num,
ps.segment1 AS supplier_no,
hp.party_name AS supplier_name,
aia.invoice_amount,
aia.invoice_currency_code AS cur
FROM ap_invoices_all aia
JOIN fun_all_business_units_v bu ON bu.bu_id = aia.org_id
JOIN gl_ledgers gl ON gl.ledger_id = aia.set_of_books_id
JOIN poz_suppliers ps ON ps.vendor_id = aia.vendor_id
JOIN hz_parties hp ON hp.party_id = ps.party_id
WHERE aia.org_id = :P_BU_ID -- 番号だけでは特定できない場合があるため、BU も条件にする
AND aia.invoice_num = :P_INVOICE_NUM

BU 名・元帳名・仕入先名は、ID から名称の表を結合して取ります。仕入先の名称は POZ_SUPPLIERS にはなく、PARTY_ID で HZ_PARTIES をたどって取ります。

解答例 2:明細と配分、金額の突き合わせ(ステップ 2)を表示
2a:明細と配分を結合する
SELECT aila.line_number,
aila.line_type_lookup_code AS line_type,
aila.amount AS line_amount,
aida.distribution_line_number AS dist_no,
aida.amount AS dist_amount,
aida.dist_code_combination_id AS ccid,
aida.posted_flag,
aida.accounting_event_id AS event_id
FROM ap_invoice_lines_all aila
JOIN ap_invoice_distributions_all aida
ON aida.invoice_id = aila.invoice_id
AND aida.invoice_line_number = aila.line_number
WHERE aila.invoice_id = :P_INVOICE_ID
ORDER BY aila.line_number, aida.distribution_line_number
2b:ヘッダー・明細・配分の金額を別々に集計する
SELECT aia.invoice_amount AS header_amount,
(SELECT SUM(aila.amount)
FROM ap_invoice_lines_all aila
WHERE aila.invoice_id = aia.invoice_id) AS lines_total,
(SELECT SUM(aida.amount)
FROM ap_invoice_distributions_all aida
WHERE aida.invoice_id = aia.invoice_id) AS dists_total
FROM ap_invoices_all aia
WHERE aia.invoice_id = :P_INVOICE_ID

2b は、明細と配分を結合してから合計せず、サブクエリで階層ごとに集計しています。この書き方なら、配分の行数に左右されません。

解答例 3:勘定組合せのセグメント(ステップ 3)を表示
配分の勘定組合せをセグメントに分解する
SELECT aida.invoice_distribution_id AS dist_id,
aida.invoice_line_number AS line_no,
aida.distribution_line_number AS dist_no,
aida.amount,
gcc.segment1 AS company, -- 例:どの列が何のセグメントかは COA の設計で決まる
gcc.segment2 AS department,
gcc.segment3 AS account,
gcc.segment4 AS sub_account
FROM ap_invoice_distributions_all aida
JOIN gl_code_combinations gcc
ON gcc.code_combination_id = aida.dist_code_combination_id
WHERE aida.invoice_id = :P_INVOICE_ID
ORDER BY aida.invoice_line_number, aida.distribution_line_number
解答例 4:会計イベントから補助元帳仕訳(ステップ 4)を表示
イベント → 仕訳ヘッダー → 仕訳明細(XLA_ の列は 25D で確認済み)
SELECT xe.event_id,
xe.event_type_code,
xe.process_status_code AS ev_status,
xah.ae_header_id,
xah.accounting_entry_status_code AS entry_status,
xah.gl_transfer_status_code AS transfer,
xal.ae_line_num,
xal.accounting_class_code,
xal.code_combination_id AS ccid,
xal.accounted_dr,
xal.accounted_cr
FROM xla_events xe
LEFT JOIN xla_ae_headers xah
ON xah.application_id = xe.application_id
AND xah.event_id = xe.event_id
LEFT JOIN xla_ae_lines xal
ON xal.application_id = xah.application_id
AND xal.ae_header_id = xah.ae_header_id
WHERE xe.application_id = 200 -- AP の例(ステップ 0 で確かめた値)
AND xe.event_id IN (SELECT aida.accounting_event_id
FROM ap_invoice_distributions_all aida
WHERE aida.invoice_id = :P_INVOICE_ID)
ORDER BY xe.event_id, xah.ae_header_id, xal.ae_line_num

イベントの絞り込みは、請求書の配分が持つ会計イベント ID の副問合せで行っています。XLA_TRANSACTION_ENTITIES を経由する経路は、SLA の仕組みと追跡 SQL の SQL を参照してください。

解答例 5:GL 仕訳明細まで(ステップ 5)を表示
補助元帳仕訳明細 → GL 仕訳明細(GL_IMPORT_REFERENCES の列は 25D で確認済み)
SELECT xal.ae_line_num,
xal.accounting_class_code,
xal.accounted_dr AS sla_dr,
xal.accounted_cr AS sla_cr,
gjl.je_header_id,
gjl.je_line_num,
gjl.accounted_dr AS gl_dr,
gjl.accounted_cr AS gl_cr,
gjl.status AS gl_status
FROM xla_events xe
JOIN xla_ae_headers xah
ON xah.application_id = xe.application_id
AND xah.event_id = xe.event_id
JOIN xla_ae_lines xal
ON xal.application_id = xah.application_id
AND xal.ae_header_id = xah.ae_header_id
LEFT JOIN gl_import_references gir
ON gir.gl_sl_link_id = xal.gl_sl_link_id
AND gir.gl_sl_link_table = xal.gl_sl_link_table
LEFT JOIN gl_je_lines gjl
ON gjl.je_header_id = gir.je_header_id
AND gjl.je_line_num = gir.je_line_num
WHERE xe.application_id = 200 -- ステップ 0 で確かめた値
AND xe.event_id IN (SELECT aida.accounting_event_id
FROM ap_invoice_distributions_all aida
WHERE aida.invoice_id = :P_INVOICE_ID)
ORDER BY xah.ae_header_id, xal.ae_line_num
解答例 6:3 点照合(ステップ 6)を表示
請求書・補助元帳仕訳・GL 仕訳の合計を 1 行で比べる
WITH inv_events AS (
SELECT DISTINCT aida.accounting_event_id AS event_id
FROM ap_invoice_distributions_all aida
WHERE aida.invoice_id = :P_INVOICE_ID
),
ap_amt AS (
SELECT SUM(aida.amount) AS ap_total
FROM ap_invoice_distributions_all aida
WHERE aida.invoice_id = :P_INVOICE_ID
),
sla_amt AS (
SELECT SUM(COALESCE(xal.accounted_dr, 0)) AS sla_dr,
SUM(COALESCE(xal.accounted_cr, 0)) AS sla_cr
FROM xla_ae_headers xah
JOIN xla_ae_lines xal
ON xal.application_id = xah.application_id
AND xal.ae_header_id = xah.ae_header_id
WHERE xah.application_id = 200
AND xah.event_id IN (SELECT event_id FROM inv_events)
),
gl_keys AS ( -- 先に GL 仕訳明細を一意にしてから合計する
SELECT DISTINCT gir.je_header_id, gir.je_line_num
FROM xla_ae_headers xah
JOIN xla_ae_lines xal
ON xal.application_id = xah.application_id
AND xal.ae_header_id = xah.ae_header_id
JOIN gl_import_references gir
ON gir.gl_sl_link_id = xal.gl_sl_link_id
AND gir.gl_sl_link_table = xal.gl_sl_link_table
WHERE xah.application_id = 200
AND xah.event_id IN (SELECT event_id FROM inv_events)
),
gl_amt AS (
SELECT SUM(COALESCE(gjl.accounted_dr, 0)) AS gl_dr,
SUM(COALESCE(gjl.accounted_cr, 0)) AS gl_cr
FROM gl_keys k
JOIN gl_je_lines gjl
ON gjl.je_header_id = k.je_header_id
AND gjl.je_line_num = k.je_line_num
)
SELECT ap_amt.ap_total,
sla_amt.sla_dr, sla_amt.sla_cr,
gl_amt.gl_dr, gl_amt.gl_cr
FROM ap_amt, sla_amt, gl_amt
比較用:誤った合計(結果は 295,000)
-- 誤った例:結合で重複した GL 仕訳明細を、そのまま合計している
SELECT SUM(COALESCE(gjl.accounted_dr, 0)) AS gl_dr_wrong
FROM xla_ae_headers xah
JOIN xla_ae_lines xal
ON xal.application_id = xah.application_id
AND xal.ae_header_id = xah.ae_header_id
JOIN gl_import_references gir
ON gir.gl_sl_link_id = xal.gl_sl_link_id
AND gir.gl_sl_link_table = xal.gl_sl_link_table
JOIN gl_je_lines gjl
ON gjl.je_header_id = gir.je_header_id
AND gjl.je_line_num = gir.je_line_num
WHERE xah.application_id = 200
AND xah.event_id IN (SELECT aida.accounting_event_id
FROM ap_invoice_distributions_all aida
WHERE aida.invoice_id = :P_INVOICE_ID)

正しい SQL は、GL 仕訳明細のキーを DISTINCT で重複なしにしてから、GL_JE_LINES を結合して合計しています。誤った SQL は、補助元帳仕訳明細ごとに GL 仕訳明細が結合されるため、集約された行(130,000)が 2 回数えられます。

解答例 7:止まっている段階の分類(ステップ 7)を表示
請求書ごとに、止まっている段階を分類する
SELECT t.invoice_num,
t.invoice_amount,
t.event_id,
t.ev_status,
t.ae_header_id,
t.entry_status,
t.transfer,
t.gl_line_status,
CASE
WHEN t.event_id IS NULL THEN '0 会計イベントなし(未検証など)'
WHEN t.ae_header_id IS NULL THEN '1 未会計(仕訳ヘッダーなし)'
WHEN t.entry_status <> 'F' THEN '2 ドラフト(GL へ転送されない)'
WHEN t.transfer <> 'Y' THEN '3 最終仕訳済み・GL 未転送'
WHEN t.gl_line_status IS NULL THEN '4 GL 転送済み・GL 仕訳なし(要調査)'
WHEN t.gl_line_status = 'U' THEN '5 GL 転送済み・未転記'
ELSE '6 GL 転記済み'
END AS stage
FROM (SELECT aia.invoice_num,
aia.invoice_amount,
xe.event_id,
xe.process_status_code AS ev_status,
xah.ae_header_id,
xah.accounting_entry_status_code AS entry_status,
xah.gl_transfer_status_code AS transfer,
MAX(gjl.status) AS gl_line_status -- U が 1 行でもあれば U
FROM ap_invoices_all aia
JOIN ap_invoice_distributions_all aida
ON aida.invoice_id = aia.invoice_id
LEFT JOIN xla_events xe
ON xe.application_id = 200
AND xe.event_id = aida.accounting_event_id
LEFT JOIN xla_ae_headers xah
ON xah.application_id = xe.application_id
AND xah.event_id = xe.event_id
LEFT JOIN xla_ae_lines xal
ON xal.application_id = xah.application_id
AND xal.ae_header_id = xah.ae_header_id
LEFT JOIN gl_import_references gir
ON gir.gl_sl_link_id = xal.gl_sl_link_id
AND gir.gl_sl_link_table = xal.gl_sl_link_table
LEFT JOIN gl_je_lines gjl
ON gjl.je_header_id = gir.je_header_id
AND gjl.je_line_num = gir.je_line_num
WHERE aia.org_id = :P_BU_ID
AND aia.gl_date BETWEEN :P_FROM_DATE AND :P_TO_DATE -- 時刻を持つ列なら範囲比較にする
GROUP BY aia.invoice_num, aia.invoice_amount, xe.event_id, xe.process_status_code,
xah.ae_header_id, xah.accounting_entry_status_code, xah.gl_transfer_status_code) t
ORDER BY t.invoice_num, t.event_id

内側のサブクエリで、請求書・イベント・仕訳ヘッダー単位に行をまとめ、外側の CASE で段階を決めています。補助元帳仕訳明細と GL 仕訳明細は、MAX(gjl.status) で 1 つのステータスに集約しています。

解答例 8:配分単位の追跡(ステップ 8)を表示
配分 1 行ごとの、補助元帳仕訳明細への対応(XLA_DISTRIBUTION_LINKS の列は 26A で確認済み)
SELECT aida.invoice_distribution_id AS dist_id,
aida.amount AS dist_amount,
xal.ae_header_id,
xal.ae_line_num,
xal.accounting_class_code,
xal.accounted_dr,
xal.accounted_cr
FROM ap_invoice_distributions_all aida
JOIN xla_distribution_links xdl
ON xdl.application_id = 200
AND xdl.event_id = aida.accounting_event_id
AND xdl.source_distribution_id_num_1 = aida.invoice_distribution_id
-- 実機では SOURCE_DISTRIBUTION_TYPE の値を確認して条件に加える
JOIN xla_ae_lines xal
ON xal.application_id = xdl.application_id
AND xal.ae_header_id = xdl.ae_header_id
AND xal.ae_line_num = xdl.ae_line_num
WHERE aida.invoice_id = :P_INVOICE_ID
ORDER BY aida.invoice_distribution_id, xal.ae_line_num
症状 原因と対処
ORA-00942: table or view does not exist 表名の誤り、または選んだデータソースでは参照できない表です。データソースと表名を確認します
ORA-00904: invalid identifier 列名の誤りです。Tables and Views で列名を確認します。たとえば XLA_EVENTS に LEDGER_ID 列はなく、元帳の列は TRANSACTION_LEDGER_ID です(25D)
合計が請求書金額より大きい 明細と配分、補助元帳仕訳明細と GL 仕訳明細の結合で行が増えています。階層ごとに別々に集計するか、キーを重複なしにしてから合計します
途中の段から行が消える LEFT JOIN した表の列を WHERE で条件にすると、INNER JOIN と同じになります。条件は ON に書きます
結果が 0 行になる ステップ 0 の固定値と合っていません。請求書が未会計の場合は、ステップ 7 で段階を確認します
他の補助元帳の行が混ざる、または遅い 結合条件に APPLICATION_ID が入っていません。補助元帳の表を結合するときは必ず入れます
全 BU の請求書が見える BIP の SQL にはデータセキュリティが自動では効きません。BU の条件を SQL に入れ、実行できる人を絞ります(BI Publisher の SQL 実践)
You did not supply a value for binding parameter サンプルで実行したときのエラーです。SQL の :P_... と同じ名前で、パラメータを渡します
  1. 支払の追跡:AP_INVOICE_PAYMENTS_ALL の ACCOUNTING_EVENT_ID を起点に、同じ経路で支払の仕訳をたどります(請求書の検証とは別のイベントです)
  2. エンティティ経由の経路:請求書 → XLA_TRANSACTION_ENTITIES → XLA_EVENTS の経路でステップ 4 を書き直し、結果が同じになることを確かめます
  3. 逆引き:GL 仕訳明細から請求書番号へ。SLA の仕組みと追跡 SQL の逆引き SQL を、サンプルで P_JE_HEADER_ID = 70001 として実行し、INV-2026-0001 が返ることを確かめます
  4. 副元帳と報告通貨:補助元帳仕訳ヘッダーは元帳ごとに作られます。ステップ 6 に LEDGER_ID の条件を入れ、元帳別に照合する SQL に直します
  5. 月次の差異分析:ステップ 7 の結果から、段階が 3・5 の請求書だけを返し、段階別の件数と金額を集計します
  6. BIP 化:ステップ 7 を、BU と日付の範囲をパラメータにしたデータモデルにして、Excel で出力します(BIP 演習 の手順)。出力を段階で絞り込める形にします

本サイトは学習目的で個人が作成した非公式の教材であり、Oracle Corporation およびその関連会社とは関係ありません。内容の正確性は保証しません。最新の仕様・試験範囲は必ず公式ドキュメントと Oracle University の情報で確認してください。

模擬テストの問題は公開されている出題範囲(Exam Topics)と公式ドキュメントをもとに独自に作成したもので、実際の試験問題ではありません。

Oracle、Java、MySQL は Oracle Corporation およびその子会社、関連会社の米国およびその他の国における登録商標です。その他の製品名・会社名は各社の商標です。

© 2026 Fusion ERP 実装ラボ