bcquality/custom/knowledge/architecture/dimension-support-must-follow-dimensionmanagement-wiring-pattern.md

4 KiB
Raw Blame History

bc-version domain keywords technologies countries application-area
all
architecture
dimensions
dimensionmanagement
global-dimension
shortcut-dimension
default-dimension
validateshortcutdimcode
createdim
captionclass
al
w1
all

Dimension support must follow the DimensionManagement wiring pattern

Description

Wiring a new custom master table or document table into Business Central's dimension system isn't a matter of adding a Code[20] field and calling it done — it requires a specific set of hooks into DimensionManagement (codeunit 408) so the value is validated, persisted, and flows into transactions the same way it does for every standard master/document table. Skipping any one of these hooks produces a dimension field that looks right in the designer but silently fails to save, validate, or carry through to postings.

Wiring a Master Table (e.g. a new "Instructor" or "Course" table)

  1. Fields: add Global Dimension 1 Code / Global Dimension 2 Code (Code[20]), each with TableRelation = "Dimension Value".Code where("Global Dimension No." = const(1/2), Blocked = const(false)) and CaptionClass set to '1,1,1' / '1,1,2' — this is what lets Codeunit 42 (Caption Class) show the company's actual dimension name (e.g. "Department Code") instead of the generic field name.
  2. Validation: add a ValidateShortcutDimCode function that calls DimensionManagement.ValidateDimValueCode then DimensionManagement.SaveDefaultDim; call it from each dimension field's OnValidate trigger.
  3. Lifecycle: the table's OnInsert/OnDelete triggers must call DimensionManagement to create/delete the corresponding Default Dimension (table 352) records tied to that master record — the master record and its default dimensions must be created and destroyed together.
  4. Table ID registration: if the master table's key is referenced through a TypeToTableID-style option in DimensionManagement (SetupObjectNoList/TableIDArray), that logic must be extended to include the new table, or dimension lookups involving it will resolve to the wrong table.

Wiring a Document Table (header/line)

Add Shortcut Dimension 1 Code / Shortcut Dimension 2 Code fields (the remaining six shortcut dimensions are entered through a separate Dimensions window, not as physical fields). Call ValidateShortcutDimCode from each field's OnValidate. Call a CreateDim function — which pulls dimension values from the related master record — whenever the field that attaches the document to a master record changes (e.g. when Bill-to Customer No. changes on a header, or when a line's Type/No. changes). This is the same model the Sales Header table uses when the Bill-to Customer changes.

Review Checklist

  1. Do the dimension fields have the correct TableRelation filtered to Global Dimension No. = 1/2 and Blocked = false, and the matching CaptionClass?
  2. Is ValidateShortcutDimCode wired to each dimension field's OnValidate — not left to a bare TableRelation with no validation?
  3. Do OnInsert/OnDelete create/delete the Default Dimension records, so master records and their dimensions can't get out of sync?
  4. If the table is referenced via a TypeToTableID-style option, was SetupObjectNoList/TableIDArray actually extended?
  5. For a document table: does CreateDim run whenever the master-record-attaching field changes, so dimensions flow in automatically rather than requiring the user to re-enter them?

Source

CURABIS Academy course "The Developers Guide through AL" (rev. July 2022), Chapter 8: Dimensions & Debugging, "Code Walkthrough - Dimension Management Codeunit", "Solution Design - DimensionManagement Codeunit", "Solution Design - Global Dimension Fields", "Dimensions in Documents", "Solution Design - Shortcut Dimension Fields" (p. 262–268). Cross-checked against the current Base Application DimensionManagement codeunit (408) and the Customer/Sales Header table wiring as of 2026-08-13 — the pattern still holds.