D365 Reference
BOMVersion
mainBOM version — the link that assigns a BOM header to a finished item for a validity period, quantity range, and site; the Active flag decides which version planning and orders pick
Module: Production ControlCompany-partitioned (DataAreaId)
What the badges mean
- main
- Table group: how F&O categorizes the table's role — main entity, group/header, transaction, worksheet header, worksheet line, reference, parameter, or framework.
- Shared across companies
- The table carries no
DataAreaId— rows aren’t partitioned per company, so a query never needs (and can’t use) a company filter here (see the quirks guide). - Date-effective
- The table carries a
ValidFrom/ValidToeffectivity window — a join without a date filter multiplies every key by its history (see the quirks guide).
In field listings, K marks a key field.
Fields
10 fields · 2 key
10 fields.
| Key | Field | EDT | Description | Type | Length | Flags |
|---|---|---|---|---|---|---|
| Key | BOMId | BOMId | BOM header this version assigns | string | 20 | |
| Key | ItemId | ItemId | Finished item the BOM is assigned to | string | 20 | |
| Active | Whether this version is the active one planning and order creation pick | enum | ||||
| Approved | Whether the version is approved | enum | ||||
| Approver | RecId | RecId of the worker who approved the version | int64 | |||
| FromDate | Version validity start; unset rows carry the 1900-01-01 sentinel | date | ||||
| ToDate | Version validity end; unset rows carry the 1900-01-01 sentinel | date | ||||
| FromQty | Minimum order quantity the version applies from | real | ||||
| InventDimId | InventDimId | Dimension scope of the assignment (typically the site); join to InventDim | string | 25 | ||
| Name | Version name | string | 60 |
Field provenance: hand-curated.
Boilerplate SQL
Starting point for reading BOMVersion on Databricks — enums are decoded, 1900-01-01 dates are wrapped to NULL, and the DataAreaId anchor is in place. Set your Unity Catalog location, company, and filter values below; they’re substituted into the SQL and the copy button.
Query parameters
4 parameters not filled: <catalog>, <schema>, <company>, <ItemId>
-- ============================================================
-- Table : BOMVersion BOM version — the link that assigns a BOM header to a finished item for a validity period, quantity range, and site; the Active flag decides which version planning and orders pick
-- Purpose: Column-selected read of BOMVersion — auto-generated from field metadata
-- Grain : One row per company (dataareaid) + BOMId + ItemId
-- Notes : Auto-generated skeleton for Synapse Link / Fabric Link-landed F&O data (lowercase column names). Enums decoded inline where verified; datetimes stored in UTC; 1900-01-01 dates are sentinels mapped to NULL. System/audit columns omitted — see the quirks guide.
-- ============================================================
SELECT
b.bomid AS "BOM header this version assigns",
b.itemid AS "Finished item the BOM is assigned to",
b.active AS "Whether this version is the active one planning and order creation pick", -- enum: decode b.active via GlobalOptionsetMetadata join — see quirks guide #enums
b.approved AS "Whether the version is approved", -- enum: decode b.approved via GlobalOptionsetMetadata join — see quirks guide #enums
b.approver AS "RecId of the worker who approved the version",
CASE WHEN CAST(b.fromdate AS DATE) = DATE '1900-01-01' THEN NULL ELSE CAST(b.fromdate AS DATE) END AS "Version validity start; unset rows carry the 1900-01-01 sentinel", -- 1900-01-01 sentinel → NULL
CASE WHEN CAST(b.todate AS DATE) = DATE '1900-01-01' THEN NULL ELSE CAST(b.todate AS DATE) END AS "Version validity end; unset rows carry the 1900-01-01 sentinel", -- 1900-01-01 sentinel → NULL
b.fromqty AS "Minimum order quantity the version applies from",
b.inventdimid AS "Dimension scope of the assignment (typically the site); join to InventDim",
b.name AS "Version name"
FROM <catalog>.<schema>.bomversion b
-- Dimension expansion: uncomment to resolve site / warehouse / location / batch
-- LEFT JOIN <catalog>.<schema>.inventdim id ON id.inventdimid = b.inventdimid AND id.dataareaid = b.dataareaid
WHERE
b.dataareaid = '<company>'
-- AND b.itemid = '<ItemId>'
ORDER BY b.bomid;Verified September 2026
Relationships
Diagram of 1-hop neighbors — join details below. RecId and InventDim edges are highlighted; they’re the joins newcomers most often get wrong.
Join details
ON bomversion.bomid = bomtable.bomid AND bomversion.dataareaid = bomtable.dataareaidON bomversion.itemid = inventtable.itemid AND bomversion.dataareaid = inventtable.dataareaidON bomversion.inventdimid = inventdim.inventdimid AND bomversion.dataareaid = inventdim.dataareaid
Data Entities That Expose This Table
A 'Bill of materials versions' export exists in Data management, but its programmatic entity name could not be primary-source verified — land the raw table.
More Production Control tables
- ProdBOMProduction order BOM line — the materials a specific production order plans to consume, copied from the item's active BOM at order creation and then adjusted per order
- ProdTableProduction order header — one row per order carrying the item being built, order status and type, scheduled and actual dates, and the BOM and route it was created from
- RouteRoute operation sequence — one row per operation number on a route, ordering the operations and linking each to the next; operation times live on the related RouteOpr table
- RouteTableRoute header — one row per route identifier with its name and approval state; route versions assign it to items, and Route rows hold its operation sequence
- RouteVersionRoute version — the link that assigns a route to a finished item for a validity period, quantity range, and site, mirroring how BOMVersion assigns a BOM
- BOMBill of materials line — one component per row under a BOM header, with quantity per unit, validity dates, scrap factors, and the operation it is consumed at