bcquality/microsoft/knowledge/scm/derive-base-quantities-through-the-line-unit-of-measure.md
Stefano Demiliani 4287233f80
Strengthen review contracts and add AL reliability guidance (#196)
* Strengthen review contracts and HTTP guidance

- add outbound HttpClient transport and HTTP status review rules with paired fixtures`n- resolve layered action-skill overrides deterministically across enabled layers`n- validate findings reports and enforce measurable changed-fixture coverage

* Add data handling and test isolation guidance

- add SCM guidance for deriving base quantities through line unit-of-measure validation`n- add security guidance for parameterizing SetFilter with external text`n- add test isolation guidance for resetting per-test state before initialization guards`n- add web-service guidance for JSON null handling and invariant standard format 9`n- route and cover all five rules with paired evaluation fixtures

* Fix findings report rollup validation

* Validate findings report rollups

* Enforce merged finding identity

* Fix locationless finding deduplication

* Reject conflicting merged corrections

* Detect conflicting leaf corrections

* Route HTTP error checks to canonical web-services knowledge

Let the Error Handling leaf conditionally retrieve the existing HTTP owner articles, preserving applicability and exact-path provenance. Add deterministic source-contract and retrieval regressions without duplicating knowledge rules.

Copilot-Session-Id: a92a7788-103e-4651-9b84-19e34caffb94

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: wenjiefan <wenjiefan@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jesper Schulz-Wedde <jesper.schulzwedde@microsoft.com>
2026-09-29 13:03:39 +02:00

3.8 KiB

bc-version domain keywords technologies countries application-area
all
scm
quantity-base
qty-per-unit-of-measure
unit-of-measure-code
unit-of-measure-management
calcbaseqty
getqtyperunitofmeasure
qty-rounding-precision
item-journal-line
al
w1
all

Derive base quantities through the line's unit of measure

Description

Inventory, item ledger entries, reservations, item tracking, and warehouse quantities are measured in the item's base unit of measure. Document and journal lines hold Quantity in the line's "Unit of Measure Code", together with "Qty. per Unit of Measure" and base-unit fields such as "Quantity (Base)". Ten boxes of twelve pieces are 120 base units, not 10. When a line's Quantity is validated, the table derives the base quantity through its CalcBaseQty procedure. That procedure calls "Unit of Measure Management".CalcBaseQty with the line's quantity rounding precision and raises an error when rounding would turn a non-zero quantity into a zero base quantity. Code that bypasses this conversion creates a line whose quantity and base quantity disagree, or makes a stock decision in the wrong unit.

Best Practice

On a document or journal line, validate "Unit of Measure Code" before Quantity, and validate both. Validating the unit of measure sets "Qty. per Unit of Measure" from the item unit of measure; validating the quantity then fills the base fields with the correct rounding. Compare line quantities with inventory or availability in base units, for example "Quantity (Base)" or "Outstanding Qty. (Base)".

Outside a line, get the factor with "Unit of Measure Management".GetQtyPerUnitOfMeasure(Item, UnitOfMeasureCode) and convert with its CalcBaseQty or CalcQtyFromBase procedures instead of multiplying by hand. Pass the item unit's quantity rounding precision where the available overload accepts it.

Reading these fields for display, reporting, or a temporary buffer that is never posted is not a conversion defect. Code that proves the line uses the base unit of measure ("Qty. per Unit of Measure" equal to 1) is also correct, but don't assume this from the item alone, because a line can use another unit.

See sample: derive-base-quantities-through-the-line-unit-of-measure.good.al.

Anti Pattern

Assigning Quantity directly on an item journal, sales, purchase, or transfer line and then inserting, modifying, or posting it. Also assigning a base field such as "Quantity (Base)" := Quantity, multiplying by a hard-coded or separately looked-up factor without the line's rounding, or comparing a line's Quantity with Item.Inventory or another base-unit value. Detection signal: a direct := to Quantity, "Qty. per Unit of Measure", or a (Base) quantity field on a persisted or posted line, or a comparison between a non-base line quantity and an inventory quantity.

See sample: derive-base-quantities-through-the-line-unit-of-measure.bad.al.

References