Inventory Adjustments: Shrink, Damage & Reason Codes
The physical world is messy. Goods get stolen, broken in transit, or expire on the shelf. When physical counts do not match system records, retailers must perform Inventory Adjustments. Learn how RMS uses Reason Codes to map these losses to the correct financial accounts.
In a perfect world, inventory only decreases when a customer buys it. In reality, retail operations suffer from shrinkage (theft), damage, spoilage, and administrative errors. When a store manager realizes they have 8 units on the shelf but RMS says they have 10, they must bring the system back to reality.
Oracle RMS handles this through Inventory Adjustments. This guide covers how adjustments impact the ITEM_LOC_SOH table, why Reason Codes are the most critical component for finance, and how inventory statuses isolate unsellable stock.
1. The Adjustment Workflow
An inventory adjustment is a transaction that directly manipulates STOCK_ON_HAND without an associated sale or receipt.
- Trigger: A user (or integration via SIM/Store Inventory Management) submits an adjustment of
-2units for an item. - Physical Update: RMS updates
ITEM_LOC_SOH.STOCK_ON_HANDby-2. - Financial Log: RMS writes a record to
TRAN_DATAwithTRAN_CODE = 22. - Valuation: The
TOTAL_COSTon theTRAN_DATArecord is calculated using the location's current Weighted Average Cost (WAC) multiplied by the-2units. This represents the total financial loss.
2. Reason Codes & GL Mapping
From a physical perspective, an adjustment of -2 units is identical regardless of why it happened. From a financial perspective, the "why" is everything.
Did the goods spoil? Were they stolen? Were they damaged by a forklift in the warehouse?
When submitting an adjustment, the user must select an Inventory Adjustment Reason Code (e.g., Reason Code 15 = Spoilage). RMS uses the FIF_GL_CROSS_REF table to map this specific Reason Code to a specific General Ledger (GL) expense account.
- Shrinkage might hit the "Store Operations Expense" GL.
- Warehouse damage might hit the "Supply Chain Overhead" GL.
Blank Reason Codes
If integrations push adjustments into RMS without valid reason codes, the month-end salmth batch will dump the financial value into a generic Suspense Account. Finance teams will then have to manually investigate and re-classify massive sums of money, delaying the month-end financial close.
3. Inventory Status Changes
Not all adjustments remove stock from the building. Sometimes, stock is physically present but cannot be sold—for example, if an item is recalled, expired, or pending repair.
RMS manages this through Inventory Statuses. Instead of adjusting STOCK_ON_HAND down, a user performs an Inventory Status Change.
- The user moves 5 units from "Available" to "Trouble" status.
STOCK_ON_HANDremains the same.INV_STATUS_QTY.QTYfor the "Trouble" status code increases by 5.- RMS aggregates all non-available statuses and updates
ITEM_LOC_SOH.NON_SELLABLE_QTYby +5.
This removes the 5 units from the calculable Inventory Position, triggering replenishment to replace them, while keeping the financial asset value on the books until they are officially written off or returned to the vendor.
4. Core Tables Reference
GL Cross Reference (FIF_GL_CROSS_REF)
| Column | Type | Description |
|---|---|---|
DEPT | NUMBER(4) | The merchandise department. |
TRAN_CODE | NUMBER(2) | Always 22 for Inventory Adjustments. |
TRAN_CODE_REASON | VARCHAR2(6) | The specific reason code (e.g., '15'). |
GL_ACCOUNT | VARCHAR2(250) | The destination account string in Oracle Financials. |
5. SQL Deep Dives
Auditing High-Value Adjustments
This query isolates adjustments (Tran Code 22) that resulted in a financial loss greater than $1,000 in a single transaction, grouping them by reason code.
6. Official Oracle Resources
For further reading, consult the official Oracle documentation:


