Skip to main content

BC Symptom → Root Cause Catalogue

BC-specific symptoms mapped to their most likely root causes. Use this during Step 1 triage to narrow hypotheses before reading code.


1. Wrong value shown on page

1.1 FlowField shows 0 or stale value

Root causes by probability:

#Root causeProbabilitySignal
1CalcFields not called in code pathHIGHValue correct in table, wrong on page in code context
2SetLoadFields excludes the FlowFieldHIGHOther fields load fine, only this one is 0
3CalcFormula filter references wrong fieldMEDIUMValue is a number but wrong amount
4Missing SumIndexFields key for CalcFormulaLOWCorrect on small datasets, wrong on large ones
5Circular FlowField dependency (AL0896)LOWCompiler warning present

Quick check: Does the field show the right value in the BC UI but wrong in code? → CalcFields missing.


1.2 Regular field shows wrong value

Root causes by probability:

#Root causeProbabilitySignal
1SetLoadFields truncating the field listHIGHOther fields on the same record also suspicious
2xRec used instead of Rec in triggerHIGHValue correct on first open, wrong after edit
3Wrong filter applied before Get/FindMEDIUMDifferent records show same wrong value
4Field modified in event subscriber without intentMEDIUMValue was correct before an extension was installed
5Data migration ran with wrong valuesLOWAll existing records wrong, new records correct

1.3 Decimal shows 0 after calculation

Root causes by probability:

#Root causeProbabilitySignal
1Integer division — both operands are Integer typeHIGHFormula looks right but result is always 0 or truncated
2Round function rounding to 0MEDIUMSmall values always 0, large values correct
3Field not validated — Validate not calledMEDIUMRelated fields not updated after assignment

Quick check: Cast one operand to Decimal explicitly: Result := Rec.Qty * 1.0 / Rec.Total.


2. Record not found

2.1 Get returns false unexpectedly

Root causes by probability:

#Root causeProbabilitySignal
1Wrong company contextHIGHWorks in one company, fails in another
2Key fields in wrong order or incompleteHIGHOnly some records fail
3SetRange filter active before GetMEDIUMGet ignores filters — but a preceding SetRange on a global variable persists
4Record deleted by concurrent processLOWIntermittent failure
5Permission — no Read on tableLOWError is actually a permission error surfaced as not found

Quick check: Get ignores filters. If you set SetRange on a record variable and then call Get, the filter is irrelevant to Get but may affect subsequent FindSet. Check if the variable is reused.


2.2 FindSet / FindFirst returns empty

Root causes by probability:

#Root causeProbabilitySignal
1Filter too restrictive — wrong field or valueHIGHRemoving one filter makes it work
2SetRange on a Date field with wrong formatHIGHDate comparison fails silently
3Wrong SecurityFilter scopeMEDIUMWorks for admin, fails for regular user
4DataPerCompany = false table accessed with company filterLOWTenant-wide table filtered by company
5TableRelation filter applied implicitlyLOWRelated record exists but filtered out

3. Action / trigger not executing

3.1 Event subscriber not firing

Root causes by probability:

#Root causeProbabilitySignal
1Signature mismatch — parameter name, type, or order wrongHIGHNo compile error but subscriber never called
2Wrong ObjectType or ObjectId in attributeHIGHEasy to get wrong on table vs codeunit
3IsHandled = true set by a prior subscriberMEDIUMOther subscribers for same event DO fire
4SkipOnMissingLicense skipping silentlyMEDIUMWorks in some user contexts, not others
5Extension not published / not activeLOWCheck extension list

Quick check: The subscriber attribute [EventSubscriber(ObjectType::Table, Database::"Customer", 'OnAfterInsert', '', false, false)] — the ObjectId must be the exact table/codeunit, the event name must be spelled exactly, including case.


3.2 OnValidate trigger not firing

Root causes by probability:

#Root causeProbabilitySignal
1Field assigned directly (Rec.Field := value) instead of Rec.Validate(Field, value)HIGHValue changes but related fields don't update
2IsHandled set to true in another subscriberMEDIUMTrigger fires for some users, not others
3Trigger in tableextension but base table trigger runs first and errorsMEDIUMError before tableextension trigger executes

3.3 Action on page does nothing

Root causes by probability:

#Root causeProbabilitySignal
1Enabled expression evaluates to falseHIGHAction visible but greyed out or click has no effect
2Visible expression hides it but layout glitch shows itMEDIUMInconsistent across records
3Missing permission on codeunit called by actionMEDIUMWorks for admin, fails silently for users
4CurrPage.Update() not called after action — UI not refreshedLOWAction runs but page looks unchanged

4. Posting failures

4.1 Error during posting — unexpected validation

Root causes by probability:

#Root causeProbabilitySignal
1Event subscriber in OnBefore posting event errorsHIGHError message mentions an unexpected codeunit
2Missing mandatory field added by extensionHIGHError mentions a field that is custom
3TestField on a field not populated by the posting flowMEDIUMField exists but was never required before
4G/L account or posting group missingMEDIUMConfiguration error, not code
5Commit inside event subscriber conflicting with posting transactionLOWIntermittent, only under load

4.2 Posting succeeds but ledger entry wrong

Root causes by probability:

#Root causeProbabilitySignal
1Amount calculation error before posting codeunitHIGHAmount visible on document before posting is already wrong
2Event subscriber modifies amount in OnBefore postingMEDIUMAmount correct before subscriber fires, wrong after
3Wrong G/L account resolved from posting groupMEDIUMPosted to wrong account, right amount
4Rounding difference not handledLOWOff by 1 cent on large amounts

5. Permission errors

5.1 "You do not have permission to read table X"

Root causes by probability:

#Root causeProbabilitySignal
1Missing permission set entry for custom tableHIGHNew table added, permission set not updated
2Indirect permission not declared on codeunitMEDIUMCodeunit accesses table on behalf of user, no Permissions property
3Wrong InherentPermissions on codeunitMEDIUMInherentPermissions = X without data permissions
4User assigned wrong permission setLOWWorks in SaaS for admin, fails for real user

6. Performance symptoms

6.1 Page loads slowly

Root causes by probability:

#Root causeProbabilitySignal
1FlowField CalcFields called inside repeat...until loopHIGHPerformance degrades linearly with record count
2Missing SetLoadFields — all fields loadedHIGHNetwork/DB time high, all field values available
3Too many FlowFields on list page (>4)MEDIUMEach FlowField fires a query per visible row
4OnAfterGetRecord trigger doing expensive operationsMEDIUMSame slow pattern on every record
5Missing index for filter fieldLOWFilter on unindexed field causes full table scan

7. Data integrity issues

7.1 Duplicate records

Root causes by probability:

#Root causeProbabilitySignal
1Number series allows manual entry AND auto-entryHIGHDuplicates only when number entered manually
2Insert called without checking existenceHIGHBatch process creates duplicates on re-run
3Race condition — two sessions insert same key simultaneouslyLOWIntermittent, only under load

7.2 Orphan records after delete

Root causes by probability:

#Root causeProbabilitySignal
1Missing OnBeforeDelete cleanup in tableextensionHIGHRelated custom records persist after parent deleted
2DeleteAll used instead of Delete(true) — triggers don't fireHIGHWorks with single delete, fails with bulk delete
3Missing CalcFields/CalcSums reset on related tableLOWAggregation wrong after delete