bcquality/microsoft/knowledge/error-handling/fielderror-default-message-logic.md
Jesper Schulz-Wedde 2b5550c346
Some checks failed
Validate knowledge index / validate-index (push) Has been cancelled
Validate AL review fixtures / validate-review-fixtures (push) Has been cancelled
Validate frontmatter and structure / validate (push) Has been cancelled
Improve partner onboarding and documentation navigation (#174)
Lead with a complete plugin quick start and add task-oriented usage, troubleshooting, customization, and contribution guides. Preserve the broader plugin framing, correct conflicting contract guidance, support Agents folder reviews, and align repository validation. Convert existing sample references to clickable links without changing knowledge rules.

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

2.4 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

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.

See sample: fielderror-default-message-logic.good.al.

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.

See sample: fielderror-default-message-logic.bad.al.