bcquality/community/knowledge/error-handling/fielderror-default-message-logic.md
Jeremy Vyska 4119417ce4
Some checks failed
Validate knowledge index / validate-index (push) Has been cancelled
Validate frontmatter and structure / validate (push) Has been cancelled
Add 15 community knowledge articles from BC Code Intel ingest (#66)
* Add 15 community knowledge articles from BC Code Intel ingest

Ingests net-new /community knowledge from BC Code Intelligence, surviving
the admission test, gray-zone salvage, and dedup against the full corpus.

Domains: ui (6), error-handling (3), performance (2), upgrade (1),
appsource (1), security (1), telemetry (1). The two BC24 No. Series
migration drafts are merged into one article.

Adds good/bad AL samples for the clean-fit articles (error-handling,
performance, security, telemetry). UI and appsource remain knowledge-only.

Validator and knowledge-index checks pass (207 articles).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Correct SetLoadFields JIT-load article to match MS docs

The draft claimed accessing an unlisted field "reloads the entire row"
per record. Microsoft's partial-records docs say otherwise: the platform
does an implicit Get that loads the missing field(s), and in a direct var
loop the first JIT updates the enumerator so later iterations do not
re-load. The genuine per-row penalty is the pass-by-value case, where the
copy's enumerator is not updated.

Rewrite the article around JIT loading and the by-value footgun, rename
the slug from ...full-reload to ...jit-load, and fix the good/bad samples
to demonstrate the by-value repetition accurately.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Jeremy Vyska <jeremy@sparebrained.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 14:31:50 +02:00

2.3 KiB

bc-version domain keywords technologies countries application-area
all
error-handling
fielderror
testfield
error-message
field-caption
lowercase-convention
record-context
validation
al
w1
all

Rely On FieldError's Auto-Generated Context And Pass Only A Lowercase Predicate

Contributions welcome — open a PR to refine or extend this article.

Description

Rec.FieldError(FieldNo) does not just print the text you give it. Business Central automatically prepends the field caption, appends the current field value (when non-blank), and suffixes the table name and primary-key values for record identification. The optional second argument is only the middle predicate of that sentence — e.g. "must be unique", not a whole self-contained message. Misunderstanding this leads to messages that duplicate the caption and value or read as broken grammar, because the framework's surrounding text is built to join a lowercase fragment.

Best Practice

For a plain required-field check, prefer TestField, which tests the condition and raises the error in one call. When the condition is non-trivial and has already been evaluated, call FieldError(FieldNo) with no message to get the localized default (must have a value, is not valid, etc.), or pass a short lowercase predicate such as FieldError(FieldNo, 'must be a positive number'). Start the custom text with a lowercase letter so it reads as one sentence with the auto-inserted caption, and use a field-number reference (or the field token) rather than a hard-coded field name so captions and translations stay correct. Let the framework supply the caption, value, table, and key context for you.

Anti Pattern

Re-testing a condition you already evaluated, or passing a fully formed sentence like 'The Amount field must be positive.' to FieldError. The result reads as Amount The Amount field must be positive. in Gen. Journal Line ... — capital letter mid-sentence, caption and value repeated, and a stray trailing clause. Reviewer signals: a FieldError argument that names the field, restates the current value, starts with a capital letter, or ends with a period. Each is a sign the author treated FieldError like Error instead of as a predicate slotted into framework-generated context.