These articles capture BC-specific mechanics agents still invert: partial-record JIT on writes, Reset clearing SetLoadFields, HttpClient inside write transactions, and batched number series, plus negative guidance that stops over-eager Query and IsEmpty "fixes". Co-authored-by: Cursor <cursoragent@cursor.com>
1.5 KiB
| bc-version | domain | keywords | technologies | countries | application-area | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
performance |
|
|
|
|
Pass the iterated record var so a JIT load updates the enumerator
Contributions welcome — open a PR to refine or extend this article.
Description
A FindSet/Next loop builds an enumerator from the fields selected for load. Accessing an unloaded field triggers a JIT load. When the record is passed by value, the copy does not share that enumerator: the JIT loads the copy and leaves the enumerator unchanged, so every later Next() JIT-loads again. Passing var lets the first JIT update the enumerator. AddLoadFields on the original record before a by-value call is the other fix. This is independent of whether SetLoadFields was ordered before filters.
Best Practice
Helpers that read extra fields on an in-flight iterator must take the record as var, or the caller must AddLoadFields those fields before the loop. Prefer declaring the extra fields up front so no JIT is needed.
See sample: pass-var-record-to-preserve-partial-load-enumerator.good.al.
Anti Pattern
A SetLoadFields loop that passes the iterator by value into a helper which then reads a field that was not loaded. The first row pays one JIT; every subsequent row pays it again because the enumerator never learned the extra field.
See sample: pass-var-record-to-preserve-partial-load-enumerator.bad.al.