---
id: object/codeunit/5402
type: object
title: Codeunit 5402 "Unit of Measure Management"
summary: Codeunit 5402 "Unit of Measure Management" in Base Application (Microsoft.Foundation.UOM). 19 public procedures, 9 events, 2 event subscribers. Present since at least BC23, still in BC30, changed in BC25-26.
tier: official
language: en
tags:
  - codeunit
  - base application
versions:
  introduced: null
  last_changed: "26"
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: bd920c591591f522c4ce55702d35f31f6bbd28885219bd0841ef338309e48b4f
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Foundation/UOM/UnitofMeasureManagement.Codeunit.al
    title: src/Layers/W1/BaseApp/Foundation/UOM/UnitofMeasureManagement.Codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations: []
  videos: []
  posts: []
  guidelines: []
object_type: codeunit
object_id: 5402
name: Unit of Measure Management
namespace: Microsoft.Foundation.UOM
app: Base Application
extends: null
first_version: "23"
last_version: "30"
present_in:
  - "23"
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "25"
  - "26"
source_major: "29"
obsolete: null
countries: []
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 30
  events: 9
  subscribers: 2
relations:
  out: 0
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 0
  calls: 0
  called_by: 145
  implements: 0
---

# Codeunit 5402 "Unit of Measure Management"

> Codeunit 5402 "Unit of Measure Management" in Base Application (Microsoft.Foundation.UOM). 19 public procedures, 9 events, 2 event subscribers. Present since at least BC23, still in BC30, changed in BC25-26.

Base Application · Microsoft.Foundation.UOM · BC23-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Foundation/UOM/UnitofMeasureManagement.Codeunit.al) · facts from BC29

## Properties

| Property | Value |
|---|---|
| SingleInstance | true |

## Events published

- `OnAfterCalcBaseQtyPerUnitOfMeasure(ItemNo: Code[20]; VariantCode: Code[10]; UOMCode: Code[10]; QtyBase: Decimal; QtyPerUOM: Decimal; var QtyRounded: Decimal)` (integration)
- `OnAfterCalcQtyFromBasePerUnitOfMeasure(ItemNo: Code[20]; VariantCode: Code[10]; UOMCode: Code[10]; QtyBase: Decimal; QtyPerUOM: Decimal; var QtyRounded: Decimal)` (integration)
- `OnAfterRoundToItemRndPrecision(Qty: Decimal; ItemRndPrecision: Decimal; var Result: Decimal)` (integration)
- `OnBeforeGetQtyPerUnitOfMeasure(Item: Record Item; UnitOfMeasureCode: Code[10]; var QtyPerUnitOfMeasure: Decimal; var IsHandled: Boolean)` (integration)
- `OnBeforeGetResQtyPerUnitOfMeasure(Resource: Record Resource; ResUnitOfMeasureCode: Code[10]; var QtyPerUnitOfMeasure: Decimal; var IsHandled: Boolean)` (integration)
- `OnBeforeCubageRndPrecision(var RoundingPrecision: Decimal)` (integration)
- `OnBeforeQtyRndPrecision(var RoundingPrecision: Decimal)` (integration)
- `OnBeforeTimeRndPrecision(var RoundingPrecision: Decimal)` (integration)
- `OnBeforeWeightRndPrecision(var RoundingPrecision: Decimal)` (integration)

## Event subscriptions

- ClearItemUnitOfMeasureRec subscribes to Table "Item Unit of Measure" OnBeforeModifyEvent
- ClearResourceUnitOfMeasureRec subscribes to Table "Resource Unit of Measure" OnBeforeModifyEvent

## Procedures

- `GetQtyPerUnitOfMeasure(Item: Record Item; UnitOfMeasureCode: Code[10]): Decimal`
- `GetQtyRoundingPrecision(Item: Record Item; UnitOfMeasureCode: Code[10]): Decimal`
- `GetResQtyPerUnitOfMeasure(Resource: Record Resource; UnitOfMeasureCode: Code[10]): Decimal`
- `CalcBaseQty(Qty: Decimal; QtyPerUOM: Decimal): Decimal`
- `CalcBaseQty(ItemNo: Code[20]; VariantCode: Code[10]; UOMCode: Code[10]; QtyBase: Decimal; QtyPerUOM: Decimal): Decimal`
- `CalcBaseQty(ItemNo: Code[20]; VariantCode: Code[10]; UOMCode: Code[10]; QtyBase: Decimal; QtyPerUOM: Decimal; QtyRndingPrecision: Decimal): Decimal`
- `CalcBaseQty(ItemNo: Code[20]; VariantCode: Code[10]; UOMCode: Code[10]; QtyBase: Decimal; QtyPerUOM: Decimal; QtyRndingPrecision: Decimal; BasedOnField: Text; FromFieldName: Text; ToFieldName: Text): Decimal`
- `CalcQtyFromBase(QtyBase: Decimal; QtyPerUOM: Decimal): Decimal`
- `CalcQtyFromBase(ItemNo: Code[20]; VariantCode: Code[10]; UOMCode: Code[10]; QtyBase: Decimal; QtyPerUOM: Decimal): Decimal`
- `RoundQty(Qty: Decimal): Decimal`
- `RoundQty(Qty: Decimal; QtyRndingPrecision: Decimal): Decimal`
- `RoundQty(Qty: Decimal; QtyRndingPrecision: Decimal; Direction: Text): Decimal`
- `RoundAndValidateQty(Qty: Decimal; QtyRndingPrecision: Decimal; FieldName: Text): Decimal`
- `ValidateQtyIsBalanced(TotalQty: Decimal; TotalQtyBase: Decimal; QtyToHandle: Decimal; QtyToHandleBase: Decimal; QtyHandled: Decimal; QtyHandledBase: Decimal)`
- `RoundToItemRndPrecision(Qty: Decimal; ItemRndPrecision: Decimal): Decimal`
- `QtyRndPrecision(): Decimal`
- `CubageRndPrecision(): Decimal`
- `TimeRndPrecision(): Decimal`
- `WeightRndPrecision(): Decimal`

## Triggers

OnRun

## Called by

From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an `Object::"Name"` argument. Interface dispatch and calls through events are not counted, so the list is not complete.

- [Table 39 "Purchase Line"](../table/39.md) (10 calls: `AssignFieldsForQtyPerUOM → GetQtyRoundingPrecision`, `AssignFieldsForQtyPerUOM → QtyRndPrecision`, `CalcBaseQty → CalcBaseQty`, …)
- [Table 7302 "Bin Content"](../table/7302.md) (9 calls: `CalcQtyAvailToPutAway → QtyRndPrecision`, `CalcQtyAvailToTakeUOM → GetQtyPerUnitOfMeasure`, `CalcQtyAvailToTakeUOM → QtyRndPrecision`, …)
- [Table 901 "Assembly Line"](../table/901.md) (9 calls: `CalcAvailToAssemble → QtyRndPrecision`, `CalcBaseQty → CalcBaseQty`, `CalcBOMQuantity → RoundToItemRndPrecision`, …)
- [Codeunit 6500 "Item Tracking Management"](../codeunit/6500.md) (8 calls: `AdjustQuantityRounding → QtyRndPrecision`, `CheckQtyToInvoiceMatchItemTracking → QtyRndPrecision`, `CheckWhseItemTrkg → QtyRndPrecision`, …)
- [Codeunit 7312 "Create Pick"](../codeunit/7312.md) (8 calls: `CheckReservation → QtyRndPrecision`, `CreateBreakBulkTempLines → QtyRndPrecision`, `CreateWhseDocPlaceLine → RoundQty`, …)
- [Codeunit 6620 "Copy Document Mgt."](../codeunit/6620.md) (7 calls: `AddRemainingQtyToPurchItemCharge → QtyRndPrecision`, `AddRemainingQtyToSalesItemCharge → QtyRndPrecision`, `ConvertFromBase → QtyRndPrecision`, …)
- [Table 5407 "Prod. Order Component"](../table/5407.md) (7 calls: `CalcBaseQty → CalcBaseQty`, `CalculateQuantity → QtyRndPrecision`, `CopyFromPlanningComp → QtyRndPrecision`, …)
- [Table 5870 "BOM Buffer"](../table/5870.md) (7 calls: `CalcOvhdCost → GetQtyPerUnitOfMeasure`, `GetItemCosts → GetQtyPerUnitOfMeasure`, `GetItemUnitCost → GetQtyPerUnitOfMeasure`, …)
- [Codeunit 5812 "Calculate Standard Cost"](../codeunit/5812.md) (6 calls: `CalcAssemblyItem → GetQtyPerUnitOfMeasure`, `CalcAssemblyItem → GetResQtyPerUnitOfMeasure`, `CalcProdBOMCost → GetQtyPerUnitOfMeasure`, …)
- [Codeunit 5870 "Calculate BOM Tree"](../codeunit/5870.md) (6 calls: `BinarySearchOptimal → QtyRndPrecision`, `CalcAvailability → QtyRndPrecision`, `GenerateBOMCompSubTree → GetQtyPerUnitOfMeasure`, …)
- [Table 5902 "Service Line"](../table/5902.md) (6 calls: `CalcBaseQty → CalcBaseQty`, `CheckApplFromItemLedgEntry → QtyRndPrecision`, `GetUnitCost → GetQtyPerUnitOfMeasure`, …)
- [Codeunit 1019 "Job-Explode BOM"](../codeunit/1019.md) (5 calls: `AssingJobPlannigLineDataFromBOMComp → GetQtyPerUnitOfMeasure`, `ValidateQtyAndUoMForDifferentTypes → GetQtyPerUnitOfMeasure`, `ValidateQtyAndUoMForDifferentTypes → GetQtyRoundingPrecision`, …)
- [Codeunit 63 "Sales-Explode BOM"](../codeunit/63.md) (5 calls: `ExplodeBOMCompLines → GetQtyPerUnitOfMeasure`, `ExplodeBOMCompLines → GetResQtyPerUnitOfMeasure`, `ExplodeBOMCompLines → QtyRndPrecision`, …)
- [Codeunit 80 "Sales-Post"](../codeunit/80.md) (5 calls: `AdjustQtyToAssignForSalesLine → QtyRndPrecision`, `RoundAmount → CubageRndPrecision`, `RoundAmount → WeightRndPrecision`, …)
- [Codeunit 900 "Assembly-Post"](../codeunit/900.md) (5 calls: `PostCorrectionItemJnLine → QtyRndPrecision`, `RecreateAsmOrderWithUndo → QtyRndPrecision`, `RoundQuantity → QtyRndPrecision`, …)
- [Page 5510 "Production Journal"](../page/5510.md) (5 calls: `CalcActualConsumpQty → QtyRndPrecision`, `CalcActualConsumpQty → RoundToItemRndPrecision`, `GetActTimeAndQtyBase → QtyRndPrecision`, …)
- [Table 246 "Requisition Line"](../table/246.md) (5 calls: `AssignItemUnitCostAndQuantitiesForUOM → GetQtyPerUnitOfMeasure`, `AssignItemUnitCostAndQuantitiesForUOM → GetQtyRoundingPrecision`, `AssignItemUnitCostAndQuantitiesForUOM → QtyRndPrecision`, …)
- [Codeunit 90 "Purch.-Post"](../codeunit/90.md) (4 calls: `AdjustQtyToAssignForPurchLine → QtyRndPrecision`, `RoundAmount → CubageRndPrecision`, `RoundAmount → WeightRndPrecision`, …)
- [Codeunit 912 "Calculate Assembly Cost"](../codeunit/912.md) (4 calls: `CalcAssemblyItem → GetQtyPerUnitOfMeasure`, `CalcAssemblyItem → GetResQtyPerUnitOfMeasure`, `DoCalcAssemblyItemPrice → GetQtyPerUnitOfMeasure`, …)
- [Table 7321 "Warehouse Shipment Line"](../table/7321.md) (4 calls: `CalcBaseQty → CalcBaseQty`, `CalcQty → RoundQty`, `SetQuantityBase → CalcBaseQty`, …)
- [Codeunit 1026 "Job Link Usage"](../codeunit/1026.md) (3 calls: `CreateJobPlanningLine → CalcQtyFromBase`, `HandleMatchUsageSpecifiedJobPlanningLine → CalcQtyFromBase`, `MatchUsageUnspecified → CalcQtyFromBase`)
- [Codeunit 20441 "Qlty. Disp. Purchase Return"](../codeunit/20441.md) (3 calls: `CreatePurchaseReturnOrderLine → CalcQtyFromBase`, `CreatePurchaseReturnOrderLine → GetQtyPerUnitOfMeasure`, `FindPurchaseReceiptLineForInspection → CalcBaseQty`)
- [Codeunit 22 "Item Jnl.-Post Line"](../codeunit/22.md) (3 calls: `SetupSplitJnlLine → CalcBaseQty`, `SetupSplitJnlLine → CalcQtyFromBase`, `SetupSplitJnlLine → RoundQty`)
- [Codeunit 5407 "Prod. Order Status Management"](../codeunit/5407.md) (3 calls: `InitItemJnlLineFromProdOrderComp → QtyRndPrecision`, `RoundQtyToPost → RoundToItemRndPrecision`, `SetTimeAndQuantityOmItemJnlLine → TimeRndPrecision`)
- [Codeunit 5510 "Production Journal Mgt"](../codeunit/5510.md) (3 calls: `ConsumptionItemJnlLineValidateQuantity → QtyRndPrecision`, `ConsumptionItemJnlLineValidateQuantity → RoundToItemRndPrecision`, `InsertOutputItemJnlLine → RoundQty`)
- [Codeunit 5805 "Item Charge Assgnt. (Purch.)"](../codeunit/5805.md) (3 calls: `AssignByAmount → QtyRndPrecision`, `AssignEqually → QtyRndPrecision`, `AssignPurchItemCharge → QtyRndPrecision`)
- [Codeunit 5807 "Item Charge Assgnt. (Sales)"](../codeunit/5807.md) (3 calls: `AssignByAmount → QtyRndPrecision`, `AssignEqually → QtyRndPrecision`, `AssignSalesItemCharge → QtyRndPrecision`)
- [Codeunit 73 "Purch.-Explode BOM"](../codeunit/73.md) (3 calls: `ExplodeBOMCompLines → GetQtyPerUnitOfMeasure`, `ExplodeBOMCompLines → GetResQtyPerUnitOfMeasure`, `ExplodeBOMCompLines → QtyRndPrecision`)
- [Codeunit 7307 "Whse.-Activity-Register"](../codeunit/7307.md) (3 calls: `CheckBinContentQtyToHandle → GetQtyPerUnitOfMeasure`, `CheckBinContentQtyToHandle → QtyRndPrecision`, `CheckSourceDocumentForAvailableQty → CalcBaseQty`)
- [Codeunit 99000773 "Calculate Prod. Order"](../codeunit/99000773.md) (3 calls: `Calculate → GetQtyPerUnitOfMeasure`, `TransferBOMProcessItem → GetQtyRoundingPrecision`, `TransferBOMProcessItem → QtyRndPrecision`)
- [Codeunit 99000774 "Calculate Routing Line"](../codeunit/99000774.md) (3 calls: `CalcCostInclSetup → QtyRndPrecision`, `CalculateRoutingLine → QtyRndPrecision`, `ReplanRoutingLine → QtyRndPrecision`)
- [Codeunit 99000781 "Mfg. Calculate BOM Tree"](../codeunit/99000781.md) (3 calls: `GenerateProdCompSubTree → GetQtyPerUnitOfMeasure`, `GenerateProdCompSubTree → QtyRndPrecision`, `GetQtyPerBOMHeaderUnitOfMeasure → GetQtyPerUnitOfMeasure`)
- [Codeunit 99000822 "Mfg. Item Jnl.-Post Line"](../codeunit/99000822.md) (3 calls: `PostConsumption → QtyRndPrecision`, `PostFlushedConsumption → QtyRndPrecision`, `PostFlushedConsumption → RoundToItemRndPrecision`)
- [Codeunit 99000845 "Reservation Management"](../codeunit/99000845.md) (3 calls: `AutoReserveItemLedgEntry → QtyRndPrecision`, `InsertReservationEntries → QtyRndPrecision`, `SetQtyToReserveDownToTrackedQuantity → CalcQtyFromBase`)
- [Codeunit 99000854 "Inventory Profile Offsetting"](../codeunit/99000854.md) (3 calls: `PrepareTempTracking → QtyRndPrecision`, `Track → QtyRndPrecision`, `UpdateReqLineQuantity → QtyRndPrecision`)
- [Codeunit 99000891 "Mfg. Item Tracking Mgt."](../codeunit/99000891.md) (3 calls: `CopyProdOrderLineFieldsToTempProdOrdLineTrackingBuff → QtyRndPrecision`, `CreateWhseItemTrackingForProdOrderLine → QtyRndPrecision`, `UpdateQtySplitForPutAwayOnProdOrdLineTrackingBuffer → QtyRndPrecision`)
- [Report 4810 "Intrastat Report Get Lines"](../report/4810.md) (3 calls: `InsertFALedgerLine → QtyRndPrecision`, `InsertItemLedgerLine → QtyRndPrecision`, `InsertJobLedgerLine → QtyRndPrecision`)
- [Table 210 "Job Journal Line"](../table/210.md) (3 calls: `CalcBaseQty → CalcBaseQty`, `CalcBaseQtyForJobPlanningLine → CalcBaseQty`, `CalcQtyFromBaseQty → QtyRndPrecision`)
- [Table 37 "Sales Line"](../table/37.md) (3 calls: `CalcBaseQty → CalcBaseQty`, `CheckApplFromItemLedgEntry → QtyRndPrecision`, `GetUnitCost → GetQtyPerUnitOfMeasure`)
- [Table 5741 "Transfer Line"](../table/5741.md) (3 calls: `CalcBaseQty → CalcBaseQty`, `ValidateQuantityReceiveIsBalanced → ValidateQtyIsBalanced`, `ValidateQuantityShipIsBalanced → ValidateQtyIsBalanced`)
- [Table 5767 "Warehouse Activity Line"](../table/5767.md) (3 calls: `CalcBaseQty → CalcBaseQty`, `CalcQty → QtyRndPrecision`, `ValidateQuantityIsBalanced → ValidateQtyIsBalanced`)
- [Table 7326 "Whse. Worksheet Line"](../table/7326.md) (3 calls: `AvailableQtyToPick → QtyRndPrecision`, `CalcBaseQty → RoundQty`, `CalcQty → QtyRndPrecision`)
- [Table 83 "Item Journal Line"](../table/83.md) (3 calls: `CalcBaseQty → CalcBaseQty`, `GetUnitAmount → GetQtyPerUnitOfMeasure`, `RecalculateUnitAmount → GetQtyPerUnitOfMeasure`)
- [Table 99000772 "Production BOM Line"](../table/99000772.md) (3 calls: `GetBOMHeaderQtyPerUOM → GetQtyPerUnitOfMeasure`, `GetBOMLineQtyPerUOM → GetQtyPerUnitOfMeasure`, `GetQtyPerUnitOfMeasure → GetQtyPerUnitOfMeasure`)
- [Codeunit 311 "Item-Check Avail."](../codeunit/311.md) (2 calls: `ConvertQty → QtyRndPrecision`, `ConvertQtyToBaseQty → QtyRndPrecision`)
- [Codeunit 550 "VAT Rate Change Conversion"](../codeunit/550.md) (2 calls: `AddNewPurchaseLine → QtyRndPrecision`, `AddNewSalesLine → QtyRndPrecision`)
- [Codeunit 5780 "Whse. Cross-Dock Management"](../codeunit/5780.md) (2 calls: `SubtractExistingCrossDockOppQtysToSource → QtyRndPrecision`, `UpdateQtyToCrossDock → QtyRndPrecision`)
- [Codeunit 5813 "Undo Purchase Receipt Line"](../codeunit/5813.md) (2 calls: `PostItemJnlLine → CalcBaseQty`, `UpdateBlanketOrder → QtyRndPrecision`)
- [Codeunit 5836 "Cost Calculation Management"](../codeunit/5836.md) (2 calls: `CalcSalesLineRcptAdjCostLCY → QtyRndPrecision`, `CalcSalesLineShptAdjCostLCY → QtyRndPrecision`)
- [Codeunit 5986 "Serv-Amounts Mgt."](../codeunit/5986.md) (2 calls: `RoundAmount → CubageRndPrecision`, `RoundAmount → WeightRndPrecision`)
- and 95 more: data/code/graph/29/calls.json

## Across versions

- Present in: BC23-30
- Changed (declaration) in: BC25-26

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "codeunit", object_name: "Unit of Measure Management")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
