mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-10-06 23:26:55 +01:00
81 lines
4 KiB
Markdown
81 lines
4 KiB
Markdown
---
|
||
bc-version: [all]
|
||
domain: architecture
|
||
keywords: [dimensions, dimensionmanagement, global-dimension, shortcut-dimension, default-dimension, validateshortcutdimcode, createdim, captionclass]
|
||
technologies: [al]
|
||
countries: [w1]
|
||
application-area: [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.
|