Skip to content
D365 Reference

InventTableModule

main

Per-module item settings — one row per released item per module (inventory, purchase, sales), holding that module's default unit, base price and price unit, discount groups, tax item group, and over/under-delivery tolerances; a fully set-up item normally has exactly three rows per company

Module: Product InformationCompany-partitioned (DataAreaId)
Notes

ModuleType (0 inventory, 1 purchase, 2 sales) is the pivot key: a raw-table export lands three rows per item, so conditional aggregation on ModuleType is the first thing every model over this table does. Unit price is Price / PriceUnit, never Price alone. Lead time is not here despite the name — purchase, sales, and inventory lead times live on the InventItemPurchSetup / InventItemSalesSetup / InventItemInventSetup order-settings tables, which are outside this reference's table scope. The over/under-delivery tolerances here are overwritten in place — scoring historical receipts against the tolerance in force on their date needs a type-2 history the ERP does not keep.

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.

Fields

13 fields · 2 key

13 fields.

Table fields: key flag, field name, extended data type, description, data type, length, and quirk flags. 13 fields.
KeyFieldEDTDescriptionTypeLengthFlags
KeyItemIdItemIdThe item number the module settings apply to — the join back to InventTablestring20
KeyModuleTypeWhich module this row's settings belong to — 0 inventory, 1 purchase, 2 sales; the column every query over this table pivots onenum
UnitIdUnitOfMeasureSymbolDefault unit of measure the module transacts the item in — the sales unit on the sales row, the purchase unit on the purchase rowstring
PriceBase price for the module — the sales list price on the sales row, the standard purchase price on the purchase row; it is the price for PriceUnit units, not for onereal
PriceUnitNumber of units Price is quoted for; unit price is Price / PriceUnit, and skipping the division is the classic costing error on this tablereal
PriceQtyQuantity the fixed charges in Markup are spread acrossreal
PriceDateDate the module's price was last changed; never-priced rows carry the 1900-01-01 sentineldate
MarkupFixed charges added to the price once per invoice, on top of Pricereal
OverDeliveryPctPercentage above the ordered quantity that may still be received or delivered — the tolerance behind over-receipt analysisreal
UnderDeliveryPctPercentage below the ordered quantity that still counts as complete — the tolerance behind short-ship and fill-rate analysisreal
TaxItemGroupIdTaxItemGroupItem sales tax group applied to the item in this module; sales and purchase rows commonly differstring
LineDiscInventLineDiscCodeLine discount group the item belongs to for this module's price agreementsstring
MultiLineDiscInventMultiLineDiscCodeMultiline discount group the item belongs to — the grouping that qualifies several lines together for a volume breakstring

Field provenance: hand-curated.

Boilerplate SQL

Starting point for reading InventTableModule 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  : InventTableModule Per-module item settings — one row per released item per module (inventory, purchase, sales), holding that module's default unit, base price and price unit, discount groups, tax item group, and over/under-delivery tolerances; a fully set-up item normally has exactly three rows per company
-- Purpose: Column-selected read of InventTableModule — auto-generated from field metadata
-- Grain  : One row per company (dataareaid) + ItemId + ModuleType
-- 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
  i.itemid AS "The item number the module settings apply to — the join back to InventTable",
  CASE i.moduletype WHEN 0 THEN 'Inventory' WHEN 1 THEN 'Purchase order' WHEN 2 THEN 'Sales order' ELSE CAST(i.moduletype AS STRING) END AS "Which module this row's settings belong to — 0 inventory, 1 purchase, 2 sales; the column every query over this table pivots on",  -- enum: ModuleInventPurchSales
  i.unitid AS "Default unit of measure the module transacts the item in — the sales unit on the sales row, the purchase unit on the purchase row",
  i.price AS "Base price for the module — the sales list price on the sales row, the standard purchase price on the purchase row; it is the price for PriceUnit units, not for one",
  i.priceunit AS "Number of units Price is quoted for; unit price is Price / PriceUnit, and skipping the division is the classic costing error on this table",
  i.priceqty AS "Quantity the fixed charges in Markup are spread across",
  CASE WHEN CAST(i.pricedate AS DATE) = DATE '1900-01-01' THEN NULL ELSE CAST(i.pricedate AS DATE) END AS "Date the module's price was last changed; never-priced rows carry the 1900-01-01 sentinel",  -- 1900-01-01 sentinel → NULL
  i.markup AS "Fixed charges added to the price once per invoice, on top of Price",
  i.overdeliverypct AS "Percentage above the ordered quantity that may still be received or delivered — the tolerance behind over-receipt analysis",
  i.underdeliverypct AS "Percentage below the ordered quantity that still counts as complete — the tolerance behind short-ship and fill-rate analysis",
  i.taxitemgroupid AS "Item sales tax group applied to the item in this module; sales and purchase rows commonly differ",
  i.linedisc AS "Line discount group the item belongs to for this module's price agreements",
  i.multilinedisc AS "Multiline discount group the item belongs to — the grouping that qualifies several lines together for a volume break"
FROM <catalog>.<schema>.inventtablemodule i
WHERE
  i.dataareaid = '<company>'
  -- AND i.itemid = '<ItemId>'
ORDER BY i.itemid;

Verified August 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

  • InventTableModuleInventTableforeign key · N:1
    ON inventtablemodule.itemid = inventtable.itemid AND inventtablemodule.dataareaid = inventtable.dataareaid

Data Entities That Expose This Table

There is no entity over this table on its own — EcoResReleasedProductV2Entity has already pivoted its three rows into Sales*- and Purchase*-prefixed columns. Synapse Link / Fabric Link export the raw table, so pivot it yourself.

Browse more product tables

More Product Information 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.