bcquality/community/knowledge/upgrade/no-series-bc24-migration.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

3.1 KiB

bc-version domain keywords technologies countries application-area
24..
upgrade
no-series
noseriesmanagement
codeunit-310
getnextno
peeknextno
testmanual
arerelated
no-series-batch
business-foundation
obsolete-codeunit
al
w1
all

Migrate No. Series Calls From NoSeriesManagement To The BC24 No. Series Module

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

Description

In BC24 (2024 Wave 1) Microsoft moved number generation into the Business Foundation No. Series codeunit (310) and obsoleted the legacy NoSeriesManagement codeunit (396). Code that still declares Codeunit NoSeriesManagement or calls its methods compiles only against the temporary obsolete shim and will break once Microsoft removes it. The new API is not a drop-in rename: the facade exposes a small, specific set of real methods, parameter shapes changed, and the old single method that both previewed and consumed a number was split into two. Getting the mapping wrong silently consumes numbers when you only meant to preview, leaving gaps in the sequence.

Best Practice

Replace the NoSeriesManagement variable with Codeunit "No. Series" and map each call deliberately using the facade's actual methods — GetNextNo, PeekNextNo, GetLastNoUsed, TestManual, IsManual, and AreRelated. Use GetNextNo(SeriesCode, RefDate) only when you intend to consume and advance the series for a committed document, and PeekNextNo(SeriesCode, RefDate) for any display, validation, or preview-posting path where you must not consume. Replace InitSeries with a guarded if "No." = '' then "No." := NoSeries.GetNextNo(...). Map SelectSeries to LookupRelatedNoSeries, relationship checks the old code did by hand to AreRelated, and both TestManual and ManualNoAllowed to TestManual (which now raises its own error). For multi-document allocation use Codeunit "No. Series - Batch" and persist its state once with SaveState instead of committing per iteration. Treat the migration as an opportunity to add preview-posting support, since PeekNextNo now makes that trivial.

Anti Pattern

Mechanically swapping the codeunit reference while keeping the old boolean call shape. The legacy GetNextNo(Series, Date, false) meant "peek" and GetNextNo(Series, Date, true) meant "consume"; the new GetNextNo always consumes and takes no boolean. Equally common is inventing validation helpers such as IsValidNo, VerifySeriesExists, IsValidForDate, or TryGetNextNo — these names are not on the No. Series or No. Series - Batch codeunits and will not compile, a frequent LLM hallucination for this migration. A reviewer can detect the defect by the residual third boolean argument, by any lingering NoSeriesMgt/NoSeriesManagement identifier, by a fabricated method name, or by an OnBeforeGetNextNo/OnAfterGetNextNo subscriber — those events were removed without replacement, so that logic must be rewritten as inline pre/post procedures, not re-subscribed. A subtler signal is GetNextNo used merely to display a preview, which silently advances the series and creates number gaps; that should be PeekNextNo.