Skip to content
D365 Reference

BOM

main

Bill 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

Module: Production ControlCompany-partitioned (DataAreaId)Header: BOMTable
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/ValidTo effectivity 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.

Header & line

BOM lines join back to their header BOMTable — and the DataAreaId — so a line never fans out across companies.

Fields

21 fields · 2 key

21 fields.

Table fields: key flag, field name, extended data type, description, data type, length, and quirk flags. 21 fields.
KeyFieldEDTDescriptionTypeLengthFlags
KeyBOMIdBOMIdThe BOM header this component line belongs tostring20
KeyLineNumLineNumLine number within the BOMreal
ItemIdItemIdComponent item consumed by the linestring20
BOMTypeLine type — item, phantom, pegged supply, or vendorenum
BOMQtyComponent quantity per the BOM quantity seriesreal
BOMQtySerieQuantity series (per-series denominator) BOMQty applies toreal
UnitIdUnit the component quantity is stated instring10
InventDimIdInventDimIdInventory-dimension combination the component defaults from; join to InventDim to resolve site / warehousestring25
FromDateLine validity start; unset rows carry the 1900-01-01 sentineldate
ToDateLine validity end; unset rows carry the 1900-01-01 sentineldate
OprNumRoute operation the component is consumed atint
PositionPosition reference on the parent itemstring
ConfigGroupIdConfiguration group that decides which product configurations use the linestring
ScrapConstConstant scrap quantity added to the requirementreal
ScrapVarVariable scrap percentage added to the requirementreal
RoundUpHow the calculated consumption is rounded (no rounding, quantity, measurement…)enum
FormulaMeasurement formula used to compute consumption from height / width / depth / densityenum
ProdFlushingPrincipFlushing principle defaulted to production order linesenum
ItemBOMIdBOMIdSpecific sub-BOM to use when the component is itself a BOM itemstring20
ItemRouteIdRouteIdSpecific sub-route to use when the component is producedstring20
VendIdVendAccountVendor for subcontracted (vendor-type) linesstring20

Field provenance: hand-curated.

Boilerplate SQL

Starting point for reading BOM 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

3 parameters not filled: <catalog>, <schema>, <company>

-- ============================================================
-- Table  : BOM Bill 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
-- Purpose: Column-selected read of BOM — auto-generated from field metadata
-- Grain  : One row per company (dataareaid) + BOMId + LineNum
-- 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 "The BOM header this component line belongs to",
  b.linenum AS "Line number within the BOM",
  b.itemid AS "Component item consumed by the line",
  b.bomtype AS "Line type — item, phantom, pegged supply, or vendor",  -- enum: decode b.bomtype via GlobalOptionsetMetadata join — see quirks guide #enums
  b.bomqty AS "Component quantity per the BOM quantity series",
  b.bomqtyserie AS "Quantity series (per-series denominator) BOMQty applies to",
  b.unitid AS "Unit the component quantity is stated in",
  b.inventdimid AS "Inventory-dimension combination the component defaults from; join to InventDim to resolve site / warehouse",
  CASE WHEN CAST(b.fromdate AS DATE) = DATE '1900-01-01' THEN NULL ELSE CAST(b.fromdate AS DATE) END AS "Line 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 "Line validity end; unset rows carry the 1900-01-01 sentinel",  -- 1900-01-01 sentinel → NULL
  b.oprnum AS "Route operation the component is consumed at",
  b.position AS "Position reference on the parent item",
  b.configgroupid AS "Configuration group that decides which product configurations use the line",
  b.scrapconst AS "Constant scrap quantity added to the requirement",
  b.scrapvar AS "Variable scrap percentage added to the requirement",
  b.roundup AS "How the calculated consumption is rounded (no rounding, quantity, measurement…)",  -- enum: decode b.roundup via GlobalOptionsetMetadata join — see quirks guide #enums
  b.formula AS "Measurement formula used to compute consumption from height / width / depth / density",  -- enum: decode b.formula via GlobalOptionsetMetadata join — see quirks guide #enums
  b.prodflushingprincip AS "Flushing principle defaulted to production order lines",  -- enum: decode b.prodflushingprincip via GlobalOptionsetMetadata join — see quirks guide #enums
  b.itembomid AS "Specific sub-BOM to use when the component is itself a BOM item",
  b.itemrouteid AS "Specific sub-route to use when the component is produced",
  b.vendid AS "Vendor for subcontracted (vendor-type) lines"
FROM <catalog>.<schema>.bom 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>'
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

  • BOMTableBOMheader line · 1:N
    ON bomtable.bomid = bom.bomid AND bomtable.dataareaid = bom.dataareaid
  • BOMInventTableforeign key · N:1
    ON bom.itemid = inventtable.itemid AND bom.dataareaid = inventtable.dataareaid
  • BOMInventDimInventDim · N:1
    ON bom.inventdimid = inventdim.inventdimid AND bom.dataareaid = inventdim.dataareaid

Data Entities That Expose This Table

A 'Bill of materials lines V2' export exists in Data management, but its programmatic entity name could not be primary-source verified — land the raw table.

Browse more production tables

More Production Control tables

Maintained by Summit Analytics, a supply chain analytics practice. The tools and references are free — the consulting is selective.

Part of the Summit Analytics reference library.

Work with the practice

Not affiliated with or endorsed by Microsoft. Microsoft, Dynamics 365, and Microsoft Fabric are trademarks of the Microsoft group of companies.