Oracle RMS Item Creation Workflow
Creating an item in Oracle RMS is not a single INSERT. It is a seven-step pipeline spanning multiple tables — from generating an item number to writing the final ITEM_LOC row that makes the item available at a physical location. This guide walks every step with the SQL to match.
Overview — The Item Creation Pipeline
In Oracle RMS, a "created item" is not simply a row in a table. It is a chain of related records across multiple tables, each unlocking a capability the item needs to participate in retail operations — to be described, to be ordered, to hold stock, and finally to be sold at a location.
The full creation pipeline has seven distinct steps. Some steps are always mandatory. Some are conditional. One step — ranging — is the final gate that makes an item commercially operational at a specific store or warehouse.
An item number is reserved from the sequence or assigned manually. This becomes the primary key for all downstream records.
The root row is written. Item type, level, merchandise hierarchy (DEPT/CLASS/SUBCLASS), and pack indicators are all set here.
At least one description row is written in the base language. Additional rows for each supported language follow.
The item is linked to at least one active supplier. Unit cost, lead time, and pack sizes are set. One supplier must be flagged as primary.
User Defined Attributes are assigned if the item's department requires them. Season, brand, material — retailer-defined attributes live here.
Item status is promoted from Candidate to Active. This is the approval gate. Only Active items can appear on purchase orders and transfers.
The item is ranged to one or more stores or warehouses. ITEM_LOC and ITEM_LOC_SOH rows are created. The item is now orderable and stockable at those locations.
Items can be created through the Oracle RMS Forms-based UI (one at a time, manually) or through an integration pipeline (bulk, programmatic). Both paths must satisfy the same data requirements across the same tables. The integration path uses a staging table layer — covered in the Integration-Based Item Creation section below.
Prerequisites — What Must Exist Before You Start
Before a single item can be created, the following foundation data must already exist and be in Active status. Attempting to create an item against missing foundation data will either fail immediately with an integrity constraint error or silently produce an incomplete record that fails downstream.
The DEPT, CLASS, and SUBCLASS that the item will belong to must all exist as valid, active rows in DEPS, CLASS, and SUBCLASS respectively. The composite combination must be valid — you cannot reference a CLASS that belongs to a different DEPT than the one you are using.
-- Validate that a dept/class/subclass combination exists before item creation
SELECT s.dept, s.class, s.subclass,
dp.dept_name, c.class_name, s.sub_name
FROM subclass s
JOIN class c ON c.dept = s.dept AND c.class = s.class
JOIN deps dp ON dp.dept = s.dept
WHERE s.dept = :v_dept
AND s.class = :v_class
AND s.subclass = :v_subclass;At least one active supplier must exist in SUPS before Step 4 (ITEM_SUPPLIER). The item itself can be created in ITEM_MASTER without a supplier, but it cannot be activated or ordered until the supplier link is in place. Getting this dependency wrong is the most common cause of items stuck in Candidate status.
If you are creating a style with child SKUs differentiated by colour, size, or other attributes, the differentiator type must exist in the DIFF_TYPE table and values must exist in DIFF_IDS. Without valid diff records, you cannot create child-level items that reference those differentiators. This only applies to multi-level item structures — single-level transaction items have no differentiators.
For Step 7 (ranging), every location you intend to range the item to must exist in either STORE (with STATUS = 'A') or WH. Ranging to an inactive or non-existent location will fail at the constraint level. For warehouse ranging, ensure you are targeting a Physical warehouse — virtual warehouses cannot directly receive ranged items in all RMS configurations.
Step 1 — Item Number Generation
The item number is the primary key of ITEM_MASTER — declared as VARCHAR2(25). Every downstream table that references an item uses this number. Getting it right at the start matters because it cannot be changed once created.
Oracle RMS supports two item numbering approaches:
Auto-generated numbers — Most implementations use a database sequence (ITEM_NO_SEQ) to generate item numbers automatically. The RMS front-end calls ITEM_NO_SEQ.NEXTVAL when a new item is initiated. Numbers are typically numeric strings, often zero-padded to a fixed width (e.g. '0000100050').
Manual / externally assigned numbers — Some retailers bring item numbers from an upstream system (ERP, PLM). In this case the item number is passed in directly. The RMS import layer inserts this value as-is into ITEM_MASTER.ITEM.
The moment an item number like '000012345' is cast to a number, the
leading zeros are lost and it becomes 12345. That is a completely
different value. Every external system, every spreadsheet, every API endpoint
that handles item numbers must preserve them as strings. This is one of the
most common and most damaging integration bugs in Oracle RMS projects.
Step 2 — Creating the ITEM_MASTER Record
The ITEM_MASTER row is the root record. Everything else in the creation workflow is a child or satellite record of this row. When creating via integration, this is the first INSERT of the pipeline.
Not all 80+ columns on ITEM_MASTER need to be set at creation time, but the following columns are always required for a valid, non-rejected record:
| Column | Type | Description |
|---|---|---|
ITEMPK | VARCHAR2(25) | Item number — from sequence or external assignment |
ITEM_DESC | VARCHAR2(250) | Short description. Also stored in ITEM_DESC table. |
ITEM_LEVEL | NUMBER(1) | Position in hierarchy: 1 (standalone), 2 (child of style), 3 (child of level-2) |
TRAN_LEVEL | NUMBER(1) | Transaction level: must equal ITEM_LEVEL for transaction items |
DEPTFK | NUMBER(4) | FK → DEPS.DEPT. Must be a valid active department. |
CLASSFK | NUMBER(4) | FK → CLASS(DEPT,CLASS). Composite FK with DEPT. |
SUBCLASSFK | NUMBER(4) | FK → SUBCLASS(DEPT,CLASS,SUBCLASS). Three-column composite FK. |
STATUS | VARCHAR2(1) | Set to 'C' (Candidate) at creation. Promoted to 'A' in Step 6. |
SELLABLE_IND | VARCHAR2(1) | Y = can be sold. N = internal/component only. |
ORDERABLE_IND | VARCHAR2(1) | Y = can be placed on purchase orders. |
PACK_IND | VARCHAR2(1) | N for regular items. Y for simple or complex packs. |
UNIT_OF_MEASURE | VARCHAR2(4) | EA (each), KG, LT, etc. Must match a valid UOM code. |
For child items in a style hierarchy (Level 2 or Level 3), two additional columns must be set at creation:
| Column | Type | Description |
|---|---|---|
PARENT_ITEMFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM. Points to the immediate parent. NULL for Level 1 items. |
DIFF_1 | VARCHAR2(10) | First differentiator value (e.g. colour code 'BLK'). Must exist in DIFF_IDS. |
DIFF_TYPE_1 | VARCHAR2(6) | The type for DIFF_1 (e.g. 'COLOUR'). Must exist in DIFF_TYPE. |
DIFF_2 | VARCHAR2(10) | Second differentiator value (e.g. size code 'XL'). Optional second dimension. |
DIFF_TYPE_2 | VARCHAR2(6) | The type for DIFF_2 (e.g. 'SIZE'). |
It is technically possible to INSERT an ITEM_MASTER row with
STATUS = 'A' via direct SQL. Do not do this. The RMS application
layer performs validation checks when promoting from Candidate to Active —
checking for supplier linkage, descriptions, and mandatory attributes. Skipping
this gate by inserting directly as Active leaves items that may be missing
critical data in a fully operational state, which causes silent downstream
failures.
Step 3 — Item Descriptions (ITEM_DESC)
The ITEM_DESC table stores the translatable, multilingual description for every item. At minimum, one row must exist in the base language of the RMS instance. The base language is found in COMPHEAD.LANG.
The composite primary key is ITEM + LANG. Inserting without the correct LANG value is a common integration error — the row is created but the RMS UI cannot find it because it queries by the base language code.
| Column | Type | Description |
|---|---|---|
ITEMPKFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM |
LANGPK | NUMBER(6) | Language code. Get base language from: SELECT lang FROM comphead |
ITEM_DESC | VARCHAR2(250) | Primary display description. Used in RMS screens and most reports. |
SHORT_DESC | VARCHAR2(120) | Abbreviated description for space-constrained contexts (labels, till receipts). |
SECONDARY_DESC | VARCHAR2(250) | Secondary marketing description. Used in some storefront integrations. |
LONG_DESC | VARCHAR2(4000) | Long-form description. Available in newer RMS versions for e-commerce feeds. |
-- Insert ITEM_DESC in the base language — the minimal required description row
INSERT INTO item_desc
(item, lang, item_desc, short_desc)
SELECT :v_item,
ch.lang,
:v_item_desc,
:v_short_desc
FROM comphead ch;Step 4 — Item-Supplier Setup
An item without a supplier cannot be ordered from anyone. Step 4 creates the commercial link between the item and its source of supply. This step involves two tables: ITEM_SUPPLIER (the trading agreement) and ITEM_SUPP_COUNTRY (the country of origin and FOB cost).
One row per item-supplier combination. If the item has multiple suppliers, there is one row here per supplier. Exactly one row must have PRIMARY_SUPP_IND = 'Y' — the default source of replenishment.
| Column | Type | Description |
|---|---|---|
ITEMPKFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM |
SUPPLIERPKFK | NUMBER(10) | FK → SUPS.SUPPLIER |
UNIT_COST | NUMBER(20,4) | Agreed unit cost from this supplier in supplier's currency |
LEAD_TIME | NUMBER(4) | Lead time in days for this item from this supplier. Overrides SUPS.LEAD_TIME. |
SUPP_PACK_SIZE | NUMBER(12,4) | Outer case quantity — units per carton as shipped by this supplier |
INNER_PACK_SIZE | NUMBER(12,4) | Inner pack quantity within each case |
PRIMARY_SUPP_IND | VARCHAR2(1) | Y = default supplier. Exactly one 'Y' allowed per item across all ITEM_SUPPLIER rows. |
PRIMARY_COUNTRY_ID | VARCHAR2(3) | Default country of origin for this item-supplier combination |
ROUND_TO_INNER_PKG | VARCHAR2(1) | Y = PO quantities must be multiples of INNER_PACK_SIZE |
ROUND_TO_CASE | VARCHAR2(1) | Y = PO quantities must be multiples of SUPP_PACK_SIZE |
One row per item-supplier-origin_country combination. Stores the FOB (Free on Board) cost at the point of origin. The same supplier may manufacture the same item in multiple countries at different costs. The composite PK is ITEM + SUPPLIER + ORIGIN_COUNTRY_ID.
| Column | Type | Description |
|---|---|---|
ITEMPKFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM |
SUPPLIERPKFK | NUMBER(10) | FK → SUPS.SUPPLIER |
ORIGIN_COUNTRY_IDPK | VARCHAR2(3) | ISO 3166-1 alpha-3 country code — e.g. 'IND', 'CHN', 'BGD' |
UNIT_COST | NUMBER(20,4) | FOB cost at origin in supplier currency. Used as base for landed cost calculation. |
SUPP_PACK_SIZE | NUMBER(12,4) | Pack size from this country's factory — may differ from ITEM_SUPPLIER |
PRIMARY_SUPP_IND | VARCHAR2(1) | Y = this is the default sourcing country for this item-supplier pair |
DUTY_PCT | NUMBER(12,4) | Import duty percentage applicable from this country of origin |
Step 5 — UDA Assignment (Optional)
User Defined Attributes (UDAs) allow retailers to capture item attributes that are not covered by the standard RMS data model — things like season, brand tier, material composition, or fit type. UDAs are department-specific: a department may have mandatory UDAs that must be set before an item in that department can be activated.
There are three types of UDAs, each stored in its own table:
| Column | Type | Description |
|---|---|---|
Date | UDA_ITEM_DATE | Stores a date value for the UDA. Example: launch date, end-of-life date. |
List of Values (LOV) | UDA_ITEM_LOV | Stores a code value from a predefined list. Example: Season = 'SS26', Brand Tier = 'PREMIUM'. |
Free Form (FF) | UDA_ITEM_FF | Stores a free-text value. Example: marketing tagline, special handling instructions. |
Some departments require mandatory UDA values before an item can be activated.
The UDA_TYPE table has a REQUIRED_IND column that flags
mandatory UDAs. Any item activation script should check that all required UDAs
for the item's department are populated before attempting to promote status from
'C' to 'A'.
Step 6 — Status Activation (Candidate → Active)
Until an item's status is 'A' (Active), it cannot appear on purchase orders, transfers, or any stock movement document. The status promotion from 'C' (Candidate) to 'A' is the approval gate that confirms the item's core setup is complete.
The activation validates — at minimum — that:
- The item has at least one
ITEM_SUPPLIERrow withPRIMARY_SUPP_IND = 'Y' - At least one
ITEM_DESCrow exists in the base language - All mandatory UDAs for the department are set
- For child items (Level 2/3): the parent item is also Active
The promotion itself is a simple UPDATE:
-- Promote item from Candidate to Active
-- Always validate prerequisites before running this
UPDATE item_master
SET status = 'A'
WHERE item = :v_item
AND status = 'C';Bulk-activating items by updating STATUS without checking prerequisites leaves broken items in Active state. An Active item without a primary supplier will fail when any replenishment batch tries to raise a purchase order against it. Always run the prerequisite validation query (see Practical SQL section) before any bulk activation.
Step 7 — Ranging to Locations (ITEM_LOC)
Ranging is the act of making an item available at a specific location. Until an ITEM_LOC row exists for an item at a store or warehouse, that item does not exist at that location from RMS's perspective — it cannot be ordered to that location, cannot receive stock there, and cannot be sold there.
Each ITEM_LOC row represents one item at one location. Creating this row also triggers the creation of a corresponding ITEM_LOC_SOH row with zero stock on hand.
The composite primary key is ITEM + LOC + LOC_TYPE. The LOC_TYPE is 'S' for stores and 'W' for warehouses. Every column in this row has a business meaning — it is not just a link table.
| Column | Type | Description |
|---|---|---|
ITEMPKFK | VARCHAR2(25) | FK → ITEM_MASTER.ITEM |
LOCPK | NUMBER(10) | Location number. STORE.STORE or WH.WH depending on LOC_TYPE. |
LOC_TYPEPK | VARCHAR2(1) | 'S' = Store · 'W' = Warehouse. Always filter by both LOC and LOC_TYPE. |
STATUS | VARCHAR2(1) | A = Active (normal). I = Inactive (no new orders but can hold stock). |
UNIT_RETAIL | NUMBER(20,4) | Current selling price at this location. Can differ by location if price zones are used. |
SELLING_UNIT_RETAIL | NUMBER(20,4) | Retail price per selling unit (differs from UNIT_RETAIL for variable-weight items). |
PRIMARY_SUPPFK | NUMBER(10) | FK → SUPS.SUPPLIER. The primary supplier for replenishment at this specific location. |
PRIMARY_CNTRY | VARCHAR2(3) | Primary country of origin for ordering at this location. |
STORE_ORD_MULT | NUMBER(12,4) | Order multiple for store replenishment. Must be a multiple of INNER_PACK_SIZE. |
MEAS_OF_EACH | NUMBER(12,4) | Measure per each (for catch-weight items). NULL for standard unit items. |
TI | NUMBER(12,4) | Tier quantity (units per layer in a pallet). Used in warehouse space planning. |
HI | NUMBER(12,4) | High quantity (layers per pallet). Used with TI for full pallet ordering. |
When a ranging record is created, RMS also creates the companion ITEM_LOC_SOH row initialised with zero stock:
-- After ITEM_LOC insert, verify ITEM_LOC_SOH was created with zero SOH
SELECT ils.item,
ils.loc,
ils.loc_type,
ils.stock_on_hand,
ils.av_cost,
ils.unit_retail
FROM item_loc_soh ils
WHERE ils.item = :v_item
AND ils.loc = :v_loc
AND ils.loc_type = :v_loc_type;The same item-to-location thinking that Oracle RMS applies to store ranging is what RC:OMS applies to channel management — every item ranged to every channel with real-time inventory sync. Double-entry ledger accuracy. No overselling. Built for Indian multi-channel sellers.
Launch RC:OMS Demo →Integration-Based Item Creation
When creating items in bulk through an external integration — from an ERP, a PLM system, or a migration — the direct table-insert approach is replaced by a staging-table pipeline. This is the standard Oracle Retail integration architecture: data lands in staging, is validated, and is then promoted into the live tables by a batch process.
The relevant staging tables for item creation are:
The primary staging table for ITEM_MASTER data. External systems write item records here with a STATUS of 'W' (waiting). The RMS batch processes reads these rows, validates them, and on success writes to ITEM_MASTER and updates staging status to 'P' (processed). Failures are recorded with status 'E' (error) and a message in the error column.
| Column | Type | Description |
|---|---|---|
ITEM | VARCHAR2(25) | Item number. May be pre-assigned or populated by the batch if auto-generated. |
STATUS | VARCHAR2(1) | W = Waiting · P = Processed · E = Error. Poll this column to track progress. |
ERROR_MSG | VARCHAR2(2000) | Error description populated when STATUS = 'E'. This is your first debugging stop. |
Always validate staging data against the live foundation tables before
submitting to the RMS batch. The three checks that catch 90% of integration
failures: (1) DEPT + CLASS + SUBCLASS exists in SUBCLASS,
(2) SUPPLIER exists in SUPS with SUP_STATUS = 'A',
(3) item number is unique — no existing row in ITEM_MASTER with the
same value. Run these checks before the batch, not after.
Key Tables — Quick Reference
Practical SQL Examples
1. Pre-activation validation — check all prerequisites for a Candidate item
-- Full prerequisite check before activating a Candidate item
-- Returns one row per check with PASS/FAIL status
SELECT 'Hierarchy exists' check_name,
CASE WHEN s.dept IS NOT NULL THEN 'PASS' ELSE 'FAIL' END AS result
FROM item_master im
LEFT JOIN subclass s ON s.dept = im.dept
AND s.class = im.class
AND s.subclass = im.subclass
WHERE im.item = :v_item
UNION ALL
SELECT 'Primary supplier exists' check_name,
CASE WHEN is2.supplier IS NOT NULL THEN 'PASS' ELSE 'FAIL' END
FROM item_master im
LEFT JOIN item_supplier is2 ON is2.item = im.item
AND is2.primary_supp_ind = 'Y'
WHERE im.item = :v_item
UNION ALL
SELECT 'Base language description exists' check_name,
CASE WHEN id.item IS NOT NULL THEN 'PASS' ELSE 'FAIL' END
FROM item_master im
LEFT JOIN item_desc id ON id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
WHERE im.item = :v_item
UNION ALL
SELECT 'Item is in Candidate status' check_name,
CASE WHEN im.status = 'C' THEN 'PASS'
WHEN im.status = 'A' THEN 'ALREADY ACTIVE'
ELSE 'FAIL' END
FROM item_master im
WHERE im.item = :v_item;
2. Check ranging completeness — which locations has an item been ranged to
-- Ranging status across all stores and warehouses for an item
SELECT il.loc,
il.loc_type,
CASE il.loc_type
WHEN 'S' THEN s.store_name
WHEN 'W' THEN w.wh_name
END loc_name,
il.status ranging_status,
il.unit_retail,
il.primary_supp,
ils.stock_on_hand
FROM item_loc il
LEFT JOIN store s ON s.store = il.loc AND il.loc_type = 'S'
LEFT JOIN wh w ON w.wh = il.loc AND il.loc_type = 'W'
LEFT JOIN item_loc_soh ils ON ils.item = il.item
AND ils.loc = il.loc
AND ils.loc_type = il.loc_type
WHERE il.item = :v_item
ORDER BY il.loc_type, loc_name;3. Find Candidate items with missing supplier (stuck in pipeline)
-- Candidate items that cannot be activated — missing primary supplier
SELECT im.item,
id.item_desc,
im.dept,
dp.dept_name,
im.status,
im.create_datetime
FROM item_master im
LEFT JOIN item_desc id ON id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
LEFT JOIN deps dp ON dp.dept = im.dept
WHERE im.status = 'C'
AND NOT EXISTS (
SELECT 1
FROM item_supplier is2
WHERE is2.item = im.item
AND is2.primary_supp_ind = 'Y'
)
ORDER BY im.create_datetime DESC;4. Items Active but not ranged to any location
-- Active items with zero ranging records
-- Common data quality issue after bulk activation without ranging
SELECT im.item,
id.item_desc,
im.dept,
dp.dept_name
FROM item_master im
LEFT JOIN item_desc id ON id.item = im.item
AND id.lang = (SELECT lang FROM comphead)
LEFT JOIN deps dp ON dp.dept = im.dept
WHERE im.status = 'A'
AND im.item_level = im.tran_level -- transaction items only
AND NOT EXISTS (
SELECT 1
FROM item_loc il
WHERE il.item = im.item
)
ORDER BY im.dept, im.item;5. PL/SQL — Full item creation validation procedure
-- Validate all item creation prerequisites and return an error list
-- Designed for integration pipelines — call before submitting to staging batch
PROCEDURE validate_item_creation (
p_item IN item_master.item%TYPE,
p_dept IN item_master.dept%TYPE,
p_class IN item_master.class%TYPE,
p_subclass IN item_master.subclass%TYPE,
p_supplier IN item_supplier.supplier%TYPE,
p_errors OUT VARCHAR2
) IS
l_count PLS_INTEGER;
l_errors VARCHAR2(4000) := NULL;
BEGIN
-- 1. Item number must not already exist
SELECT COUNT(1) INTO l_count
FROM item_master WHERE item = p_item;
IF l_count > 0 THEN
l_errors := l_errors || 'ITEM_EXISTS; ';
END IF;
-- 2. Dept/Class/Subclass combination must be valid
SELECT COUNT(1) INTO l_count
FROM subclass
WHERE dept = p_dept
AND class = p_class
AND subclass = p_subclass;
IF l_count = 0 THEN
l_errors := l_errors || 'INVALID_HIERARCHY; ';
END IF;
-- 3. Supplier must exist and be active
SELECT COUNT(1) INTO l_count
FROM sups
WHERE supplier = p_supplier
AND sup_status = 'A';
IF l_count = 0 THEN
l_errors := l_errors || 'INVALID_SUPPLIER; ';
END IF;
p_errors := NVL(RTRIM(l_errors, '; '), 'OK');
END validate_item_creation;
Common Gotchas for Developers
- !
Ranging an item before activating it. An item with
STATUS = 'C'(Candidate) can technically receive anITEM_LOCrow — the database will not always prevent it. But RMS batches that process ranged items (replenishment, price change, transfer) check item status before processing. A Candidate item at a live location will cause silent skips or errors across multiple batch jobs. Always activate before ranging. - !
Missing ITEM_DESC base language row. The RMS UI looks up item names by joining
ITEM_DESCon the base language code fromCOMPHEAD. If theITEM_DESCrow is missing or has the wrongLANGvalue, the item appears in the system with a blank description. It looks like a data error, but the item itself is fine — the description simply wasn't written to the right table with the right language key. - !
Ranging to a Virtual Warehouse instead of a Physical one. Virtual warehouses (
WH_TYPE = 'VA') are logical partitions within a Physical warehouse. In most RMS configurations, replenishment orders are raised to Physical warehouses, not Virtual ones. Ranging an item to a Virtual WH and then trying to raise a PO to that WH will fail at the PO validation stage with a warehouse type mismatch error. - !
Duplicate PRIMARY_SUPP_IND = 'Y' rows in ITEM_SUPPLIER. If an integration INSERT creates two rows with
PRIMARY_SUPP_IND = 'Y'for the same item, replenishment batches that select the primary supplier will return two rows and fail with a TOO_MANY_ROWS exception. RMS enforces this constraint at the application layer in the UI, but not always at the database level via a constraint — raw SQL inserts bypass the check silently. - !
Setting TRAN_LEVEL incorrectly for a style parent. For a Level 1 style item whose children are the transaction units, the correct values are
ITEM_LEVEL = 1andTRAN_LEVEL = 2. SettingTRAN_LEVEL = 1on a style tells RMS this item is itself the transaction unit — you can then technically place it on a PO. This creates order lines against an item that has no stock and no SKU children, producing receiving and inventory calculation failures. - !
Not setting STORE_ORD_MULT correctly on ITEM_LOC. The
STORE_ORD_MULTcolumn onITEM_LOCdefines the minimum order multiple for store replenishment at that location. If it is set to zero or left NULL, automated replenishment batches will calculate a zero-quantity order and skip the item entirely. Set it toITEM_SUPPLIER.INNER_PACK_SIZEat minimum. - !
ITEM_LOC_SOH not being queried after ranging, only ITEM_LOC.
When ranging occurs, RMS creates both the
ITEM_LOCrow and the companionITEM_LOC_SOHrow. Integration scripts that check ranging status by querying onlyITEM_LOCare looking at the ranging configuration. To confirm the item is fully operational and carries a stock position (even a zero one), always verify theITEM_LOC_SOHrow also exists.
Key Takeaways
- ✓Item creation in Oracle RMS is a seven-step pipeline across multiple tables — not a single INSERT. Each step unlocks a specific capability: description, ordering, costing, UDAs, transactions, and stock.
- ✓Items start life as Candidates (STATUS = 'C'). They must be validated and activated (STATUS = 'A') before any purchase order, transfer, or replenishment can reference them.
- ✓ITEM_DESC requires at least one row in the base language (from COMPHEAD.LANG). Always use the comphead language code — never hardcode it.
- ✓Exactly one ITEM_SUPPLIER row must have PRIMARY_SUPP_IND = 'Y' per item before activation. Missing this row is the most common cause of items stuck in Candidate status.
- ✓Ranging creates both ITEM_LOC (configuration) and ITEM_LOC_SOH (stock position, initially zero). An un-ranged Active item cannot be ordered, received, or sold at any location.
- ✓In integrations, always validate DEPT+CLASS+SUBCLASS, SUPPLIER status, and item number uniqueness before submitting to the staging batch — not after. 90% of integration failures are caught by these three checks.
- ✓STORE_ORD_MULT on ITEM_LOC must be set correctly (≥ INNER_PACK_SIZE). A zero or NULL value causes replenishment batches to silently skip the item.
