bcquality/community/knowledge/performance/load-common-fields-before-branching-on-case.md
Jesper Schulz-Wedde 9a4198eb28 Add [all] sentinel to bc-version; apply to version-agnostic knowledge
Most of the corpus — FindSet/SetLoadFields/CalcFields patterns, permission
sets, SingleInstance codeunits, DataClassification, IsolatedStorage,
transaction scope, SecretText — describes BC platform behaviour that is
identical across supported versions. The seed [26..28] range on every
file implied a version-specificity the content does not actually have,
and there was no way to express "applies to every version" in the
schema the way [w1] and [all] already do for countries and
application-area.

Extend the v1 schema with a universal sentinel for bc-version, parallel
to the sentinels already defined for the other dimensions:

  bc-version: [all]         # applies to every BC version

[all] is mutually exclusive with explicit versions. Range shorthand
([26..28]) and explicit lists ([26, 27, 28]) continue to work for files
genuinely tied to a version-gated API or deprecation.

Update read.md (field definition, matching semantics, partial-context
rule), write.md (default to [all], use ranges only with a concrete
reason), README.md (frontmatter example), and the CI validator. All
forty existing knowledge files and the three action skills convert to
[all]; none of the current content is version-gated. Validator passes.
2026-04-23 16:00:03 +02:00

1.7 KiB

bc-version domain keywords technologies countries application-area
all
performance
setloadfields
case
conditional
branch
field-loading
al
w1
all

Load common fields before branching on case

Seed article. Ported from BC Code Intelligence to seed the community corpus. Community contributors are invited to expand or refine.

Description

When record processing branches on state, different branches typically read different fields. A single SetLoadFields at the top listing every field any branch might touch pulls more data than any individual execution path needs — on the hot path, the rest is loaded for nothing. A two-tier approach matches loading to actual usage: load the fields the case expression evaluates plus any fields every branch uses, then add a branch-local SetLoadFields inside each branch for that branch's extra fields.

Best Practice

Before the case, call SetLoadFields with the minimal set — the discriminator field and fields common to every branch. Inside each branch, before the first access to a branch-specific field, add a second SetLoadFields covering those fields. The platform honors the in-branch call for the next record operation, so the extra data is fetched only when the branch runs.

See sample: load-common-fields-before-branching-on-case.good.al.

Anti Pattern

A single top-level SetLoadFields enumerating every field any branch might read. On records whose state routes them to the fast common branch, the rarely-needed fields are still loaded — the optimization becomes a net-neutral or net-negative change on the hot path.

See sample: load-common-fields-before-branching-on-case.bad.al.