Journal Entry Reversal Detail Report
Every reversed journal and its reversal — the original entry, the reversing entry, the reason, and the period each hit — so finance can confirm reversals landed in the right period and aren't being used to move results between months.
Run note · BIP run High-volume GL extracts can exceed BI Publisher's online output limit and time out. Run it as a scheduled process (ESS) with output bursted to file or email rather than online preview, and bound it by ledger and period.
Sample build of the Journal Entry Reversal Detail Report — reconciled, and rendered tool-neutral so it runs in Power BI, ThoughtSpot, or Tableau.
| Original Journal | Reversal Journal | Reason | Original Period | Reversal Period | Amount |
|---|---|---|---|---|---|
| Sample | Sample | Standard | APR-26 | APR-26 | $1,240,500.00 |
| — | — | Corporate | MAR-26 | MAR-26 | $842,150.75 |
| Sample | Sample | Standard | FEB-26 | FEB-26 | $96,400.00 |
| — | — | Default | JAN-26 | JAN-26 | $1,005,233.10 |
| Sample | Sample | Standard | DEC-25 | DEC-25 | $58,720.40 |
| Sample | Sample | Standard | APR-26 | APR-26 | $1,240,500.00 |
The report pairs each reversed entry in GL_JE_HEADERS with its reversal, showing source, reason, and the two periods involved.
22 reversals cross into a later period rather than reversing within the same one — fine for accruals, but a cluster near period end can shift results between months.
Confirm the cross-period reversals are accruals, not earnings management; if a manual source drives them, route those through a controlled accrual process.
This is the report's BI Publisher data model — the SQL data set BI Publisher runs against Oracle tables to produce the output. The same SQL becomes a dbt model in your warehouse, so one definition drives both the formatted report and the analytics layer.
Data sources
- GL_JE_HEADERS
- GL_LEDGERS
- GL_ACCESS_SETS
- FUN_USER_ROLE_DATA_ASGNMNTS
- PER_ROLES_DN
- PER_USER_ROLES
- PER_USERS
- GL_JE_SOURCES_VL
- GL_JE_BATCHES
- GL_PERIODS
- REV_STATUS
- GL_JE_CATEGORIES_VL
Show / hide SQL
WITH REV_STATUS AS
(
SELECT
je_header_id,
(CASE WHEN ACCRUAL_REV_STATUS = 'R' THEN 'Reversed'
ELSE 'Not Reversed' END) JOURNAL_REVERSAL_STATUS
FROM GL_JE_HEADERS
),
SECURITY_TBL AS
(
SELECT DISTINCT GL.LEDGER_ID
FROM GL_LEDGERS GL
,(
SELECT DISTINCT GL.LEDGER_ID
FROM
GL_LEDGERS GL,
GL_ACCESS_SETS GAS,
FUN_USER_ROLE_DATA_ASGNMNTS FURDA,
PER_ROLES_DN PRD,
PER_USER_ROLES PUR,
PER_USERS PU
WHERE
UPPER(GL.LEDGER_CATEGORY_CODE) <> 'NONE'
AND GAS.ACCESS_SET_ID=GL.IMPLICIT_ACCESS_SET_ID
AND (GAS.ACCESS_SET_ID =FURDA.ACCESS_SET_ID OR GL.LEDGER_ID=FURDA.LEDGER_ID)
AND UPPER(FURDA.role_name) in ('XXC_GL_INQUIRY_JOB','XXC_GENERAL_ACCOUNTANT_JOB','XXC_GENERAL_ACCOUNTING_MANAGER_JOB')
AND UPPER(FURDA.ACTIVE_FLAG) = 'Y'
AND UPPER(FURDA.ROLE_NAME) = UPPER(PRD.ROLE_COMMON_NAME)
AND PRD.ROLE_ID = PUR.ROLE_ID
AND PUR.USER_ID = PU.USER_ID
AND UPPER(PU.USERNAME) = UPPER(:xdo_user_name)
AND PU.USER_GUID = FURDA.USER_GUID
) ST
WHERE
1=1
AND ST.LEDGER_ID=GL.LEDGER_ID
)
SELECT
LEDGER_NAME,
PERIOD,
JOURNAL_BATCH_NAME,
JOURNAL_NAME,
JOURNAL_CREATED_BY,
JOURNAL_SOURCE,
JOURNAL_CATEGORY,
BATCH_STATUS,
JOURNAL_CURRENCY,
JOURNAL_ENTERED_AMOUNT,
JOURNAL_ACCOUNTED_AMOUNT,
LEDGER_CURRENCY,
JOURNAL_REVERSAL_STATUS,
REVERSED_JOURNAL_NAME,
REVERSAL_PERIOD,
REVERSED_JOURNAL_BATCH_STATUS,
REVERSAL_JOURNAL_CREATED_BY,
DOC_SEQ_NUM,
DOC_SEQ_NAME,
REV_DOC_SEQ_NUM,
REV_DOC_SEQ_NAME,
P_LEDGER,
REVERSED_JE_HEADER_ID
from
(
SELECT
GL.name LEDGER_NAME,
GP.period_name PERIOD,
GJB2.name JOURNAL_BATCH_NAME,
GJH2.name JOURNAL_NAME,
GJB2.created_by JOURNAL_CREATED_BY,
GJSV2.USER_JE_SOURCE_NAME JOURNAL_SOURCE,
GJCB.USER_JE_CATEGORY_NAME JOURNAL_CATEGORY,
--GJB2.status BATCH_STATUS,
FLV2.description BATCH_STATUS,
GJH2.currency_code JOURNAL_CURRENCY,
GJH2.running_total_dr JOURNAL_ENTERED_AMOUNT,
GJH2.running_total_accounted_dr JOURNAL_ACCOUNTED_AMOUNT,
GL.currency_code LEDGER_CURRENCY,
RS.JOURNAL_REVERSAL_STATUS,
GJH1.name REVERSED_JOURNAL_NAME,
GJH2.accrual_rev_period_name REVERSAL_PERIOD,
--GJB1.status REVERSED_JOURNAL_BATCH_STATUS,
FLV1.description REVERSED_JOURNAL_BATCH_STATUS,
GJB1.created_by REVERSAL_JOURNAL_CREATED_BY,
GJH2.posting_acct_seq_value DOC_SEQ_NUM,
FSV2.header_name DOC_SEQ_NAME,
GJH1.posting_acct_seq_value REV_DOC_SEQ_NUM,
FSV1.header_name REV_DOC_SEQ_NAME,
:P_LEDGER P_LEDGER,
1 REVERSED_JE_HEADER_ID
FROM
gl_je_headers GJH1,
GL_JE_SOURCES_VL GJSV1,
gl_je_headers GJH2,
GL_JE_SOURCES_VL GJSV2,
gl_je_batches GJB1,
gl_je_batches GJB2,
gl_ledgers GL,
gl_periods GP,
REV_STATUS RS,
gl_je_categories_vl GJCB,
gl_autoreverse_options GAO,
fun_seq_versions FSV1,
fun_seq_versions FSV2,
fnd_lookup_values FLV1,
fnd_lookup_values FLV2,
SECURITY_TBL ST
WHERE
1=1
AND GJH2.accrual_rev_je_header_id = GJH1.je_header_id(+)
AND GJH1.je_batch_id = GJB1.je_batch_id(+)
AND GJH1.je_source = GJSV1.JE_SOURCE_NAME(+)--new
AND GJH2.je_batch_id = GJB2.je_batch_id
AND GJH2.ledger_id = GL.ledger_id
AND GJH2.period_name = GP.period_name
AND GJH2.je_header_id = RS.je_header_id
AND GJH2.je_category = GJCB.je_category_name
AND GJCB.je_category_name = GAO.je_category_name
AND GJH2.je_source = GJSV2.JE_SOURCE_NAME(+)--new
--AND GAO.AUTOREVERSE_FLAG = 'Y'
AND GJH2.posting_acct_seq_version_id = FSV2.seq_version_id(+)
AND GJH1.posting_acct_seq_version_id = FSV1.seq_version_id(+)
--AND RS.JOURNAL_REVERSAL_STATUS = 'Reversed'
AND GJB1.status = FLV1.lookup_code
AND FLV1.lookup_type = 'MJE_BATCH_STATUS'
AND FLV1.language = USERENV('LANG')
AND GJB2.status = FLV2.lookup_code
AND FLV2.lookup_type = 'MJE_BATCH_STATUS'
AND FLV2.language = USERENV('LANG')
--AND GP.period_name LIKE '%-24'
AND (GL.name IN (:P_LEDGER)
OR 'All' IN (:P_LEDGER||'All'))
AND GP.start_date >= (select distinct start_date from gl_periods where period_name = :P_FROM_PERIOD)
AND GP.end_date <= (select distinct end_date from gl_periods where period_name = :P_TO_PERIOD)
AND (GJSV2.USER_JE_SOURCE_NAME IN (:P_SOURCE)
OR 'All' IN (:P_SOURCE||'All'))
AND (GJCB.USER_JE_CATEGORY_NAME IN (:P_CATEGORY)
OR 'All' IN (:P_CATEGORY||'All'))
AND (RS.JOURNAL_REVERSAL_STATUS IN (:P_REVERSAL_STATUS)
OR 'All' IN (:P_REVERSAL_STATUS||'All'))
AND GL.ledger_id = ST.ledger_id
UNION
SELECT
GL.name LEDGER_NAME,
GP.period_name PERIOD,
GJB2.name JOURNAL_BATCH_NAME,
GJH2.name JOURNAL_NAME,
GJB2.created_by JOURNAL_CREATED_BY,
GJSV2.USER_JE_SOURCE_NAME JOURNAL_SOURCE,
GJCB.USER_JE_CATEGORY_NAME JOURNAL_CATEGORY,
FLV2.description BATCH_STATUS,
GJH2.currency_code JOURNAL_CURRENCY,
GJH2.running_total_dr JOURNAL_ENTERED_AMOUNT,
GJH2.running_total_accounted_dr JOURNAL_ACCOUNTED_AMOUNT,
GL.currency_code LEDGER_CURRENCY,
RS.JOURNAL_REVERSAL_STATUS,
NULL REVERSED_JOURNAL_NAME,
NULL REVERSAL_PERIOD,
NULL REVERSED_JOURNAL_BATCH_STATUS,
NULL REVERSAL_JOURNAL_CREATED_BY,
GJH2.posting_acct_seq_value DOC_SEQ_NUM,
FSV2.header_name DOC_SEQ_NAME,
NULL REV_DOC_SEQ_NUM,
NULL REV_DOC_SEQ_NAME,
:P_LEDGER P_LEDGER,
GJH2.REVERSED_JE_HEADER_ID
FROM
gl_je_headers GJH2,
GL_JE_SOURCES_VL GJSV2,
gl_je_batches GJB2,
gl_ledgers GL,
gl_periods GP,
REV_STATUS RS,
gl_je_categories_vl GJCB,
gl_autoreverse_options GAO,
fun_seq_versions FSV2,
fnd_lookup_values FLV2,
SECURITY_TBL ST
WHERE
1=1
AND GJH2.je_batch_id = GJB2.je_batch_id
AND GJH2.ledger_id = GL.ledger_id
AND GJH2.period_name = GP.period_name
AND GJH2.je_header_id = RS.je_header_id
AND GJH2.je_category = GJCB.je_category_name
AND GJCB.je_category_name = GAO.je_category_name
AND GJH2.je_source = GJSV2.JE_SOURCE_NAME--new
AND GAO.AUTOREVERSE_FLAG = 'Y'
AND RS.JOURNAL_REVERSAL_STATUS = 'Not Reversed'
AND GJH2.posting_acct_seq_version_id = FSV2.seq_version_id(+)
AND GJB2.status = FLV2.lookup_code
AND FLV2.lookup_type = 'MJE_BATCH_STATUS'
AND FLV2.language = USERENV('LANG')
--AND GP.period_name LIKE '%-24'
AND (GL.name IN (:P_LEDGER)
OR 'All' IN (:P_LEDGER||'All'))
AND GP.start_date >= (select distinct start_date from gl_periods where period_name = :P_FROM_PERIOD)
AND GP.end_date <= (select distinct end_date from gl_periods where period_name = :P_TO_PERIOD)
AND (GJSV2.USER_JE_SOURCE_NAME IN (:P_SOURCE)
OR 'All' IN (:P_SOURCE||'All'))
AND (GJCB.USER_JE_CATEGORY_NAME IN (:P_CATEGORY)
OR 'All' IN (:P_CATEGORY||'All'))
AND (RS.JOURNAL_REVERSAL_STATUS IN (:P_REVERSAL_STATUS)
OR 'All' IN (:P_REVERSAL_STATUS||'All'))
AND GL.ledger_id = ST.ledger_id
)
order by
JOURNAL_REVERSAL_STATUS desc,
REVERSED_JE_HEADER_ID descThe data-warehouse model — one fact surrounded by conformed dimensions (what you slice by) and measures (what you aggregate), expressed as dbt so it migrates with you. Grain: one row per source transaction.
| Element | Type | Definition |
|---|---|---|
| GL_LEDGERS | dimension | dimension |
| GL_ACCESS_SETS | dimension | dimension |
| FUN_USER_ROLE_DATA_ASGNMNTS | dimension | dimension |
| PER_ROLES_DN | dimension | dimension |
| Amount | measure | measure |
Every source object behind this report. Each linked table has its own page with full column descriptions, drawn from the Oracle BICC lineage and articulated for practitioners.
| Table | Reporting columns | Subject areas |
|---|---|---|
| GL_JE_HEADERS | 34 | 2 |
| GL_LEDGERS | 10 | 104 |
| GL_ACCESS_SETS | Setup / configuration table — joined for reference, not exposed for analytics | |
| FUN_USER_ROLE_DATA_ASGNMNTS | Setup / configuration table — joined for reference, not exposed for analytics | |
| PER_ROLES_DN | Setup / configuration table — joined for reference, not exposed for analytics | |
| PER_USER_ROLES | 16 | 0 |
| PER_USERS | 22 | 27 |
| GL_JE_SOURCES_VL | Setup / configuration table — joined for reference, not exposed for analytics | |
| GL_JE_BATCHES | 14 | 2 |
| GL_PERIODS | Setup / configuration table — joined for reference, not exposed for analytics | |
| REV_STATUS | Setup / configuration table — joined for reference, not exposed for analytics | |
| GL_JE_CATEGORIES_VL | Setup / configuration table — joined for reference, not exposed for analytics | |