Using the Continue Statement in AL Loops

If you’ve spent any time writing AL, you’ve probably written the same pattern dozens of times: loop through records, check a condition, and either skip the row or wrap the rest of the body inside a big if block. It works, but the indentation creeps up fast, and the intent gets buried.

The continue statement gives us a cleaner way to do that. It’s a small addition to the language, but it’s one of those quality-of-life improvements that make loops noticeably easier to read.

Diagram showing a loop where some iterations are skipped with the continue keyword

What Is the continue Statement?

continue skips the rest of the current iteration of a loop and jumps straight to the next one. The loop itself keeps running—only the remaining statements in the current pass are bypassed.

It works inside the usual AL loop constructs:

  • repeat ... until
  • while ... do
  • for ... do
  • foreach ... in ... do

Think of it as the counterpart to break. Where break exits the loop entirely, continue just says “I’m done with this one—move on.”

Why You Should Care

  • Flattens deeply nested if blocks inside loops
  • Makes filter/skip logic read top-to-bottom instead of inside-out
  • Reduces indentation, which tends to reduce bugs
  • Matches the pattern that developers coming from C#, JavaScript, and most other languages already expect

How It Works

A few things worth knowing before you sprinkle continue everywhere:

  • continue only affects the innermost loop it appears in. If you’re inside a nested loop, it won’t skip the outer loop’s iteration.
  • In a repeat ... until block over a record, you still need Next() to advance the cursor. continue does not call Next() for you—but because Next() is part of the loop condition pattern (e.g., until Customer.Next() = 0), the loop still moves forward correctly when you use it the typical way.
  • continue outside of a loop is a compile error.
  • It’s available in recent runtime versions of AL (rolled out as part of the 2025 release waves), so make sure your project’s runtime target supports it before using it.

Before: The Nested if Pattern

Here’s the kind of code we’ve all written. We want to process customer payments, but skip those that are blocked or have no balance.

if Customer.FindSet() then
    repeat
        if not Customer.Blocked then begin
            Customer.CalcFields("Balance (LCY)");
            if Customer."Balance (LCY)" <> 0 then begin
                // ... do the actual work here ...
                ProcessCustomer(Customer);
            end;
        end;
    until Customer.Next() = 0;

It works, but the meaningful line—ProcessCustomer(Customer)—is buried two levels deep. Add another condition, and you’re fighting the indentation.

What About break?

A quick reminder, since the two often get mentioned in the same breath: break is not a replacement for continue. break exits the loop entirely—the moment it runs, the loop is done and execution moves on to whatever comes after the until (or end). It’s the right tool when you’ve found what you were looking for and there’s no reason to keep iterating, but it’s the wrong tool when you just want to skip the current row.

// `break` stops the whole loop after the first match.
if Customer.FindSet() then
    repeat
        if Customer."No." = 'C00010' then begin
            ProcessCustomer(Customer);
            break; // we're done — don't look at any more customers
        end;
    until Customer.Next() = 0;

Before continue existed, there was no clean equivalent. If you wanted to skip a single iteration, you really had two choices:

  • Wrap the loop body in nested if blocks (the “Before” example above).
  • Extract the body into a procedure and exit early from that procedure when a guard condition is hit.

The procedure trick worked, but felt heavy for what should be a one-line “skip this row” decision. continue finally gives us that one-liner.

After: The continue Version

Same logic, rewritten with continue:

if Customer.FindSet() then
    repeat
        if Customer.Blocked.AsInteger() <> 0 then
            continue;

        Customer.CalcFields("Balance (LCY)");
        if Customer."Balance (LCY)" = 0 then
            continue;

        // The actual work is now at the top level of the loop body.
        ProcessCustomer(Customer);
    until Customer.Next() = 0;

The “skip” rules are listed up front, each one reads as a single sentence, and the real work lives at the natural indentation level. This is the pattern I reach for most often.

continue in Other Loop Types

It works the same way in foreach and for:

foreach Item in ItemList do begin
    if Item.Blocked then
        continue;

    if Item."Unit Price" = 0 then
        continue;

    UpdateItemPrice(Item);
end;
for i := 1 to 100 do begin
    if i mod 2 = 0 then
        continue;

    // Only odd numbers reach this line.
    ProcessOddNumber(i);
end;

Gotchas and Recommended Approach

  • Nested loops: continue skips only the innermost loop. If you need to skip an outer loop’s iteration, you’ll need a flag variable or to refactor the inner loop into its own procedure.
  • Don’t forget Next(): In a repeat ... until Rec.Next() = 0 block, the until clause still runs after continue, so the cursor advances normally. Just don’t accidentally write a loop that depends on a manual Next() call inside the body before the continue—the continue will skip past it.
  • Use it for guard clauses, not control flow gymnastics: continue shines when you’re filtering or short-circuiting at the top of the loop. If you’re using it deep in the middle of complex branching, the loop body is probably trying to do too much—consider extracting it into a procedure instead.
  • Runtime version: Confirm your app.json runtime target supports continue before using it in a project that needs to deploy to older environments.

Wrapping Up

continue is a small language feature, but it pays off every time you write a loop that has to skip some rows. The “guard clause” style—list the skip conditions at the top, then write the real work at one level of indentation—reads better, reviews better, and tends to be easier to extend.

If you’ve been waiting for AL to catch up to the loop patterns you use in other languages, this is one of those nice ones to finally have.

Learn more:

Note: The code and information discussed in this article are for informational and demonstration purposes only. Always test in a sandbox first. The continue statement is available starting with the AL runtime version introduced in the Microsoft Dynamics 365 Business Central 2025 release wave 1.

Permanent link to this article: https://www.dvlprlife.com/2026/05/using-the-continue-statement-in-al-loops/

May 2026 Cumulative Updates for Dynamics 365 Business Central

The May updates for Microsoft Dynamics 365 Business Central are now available.

Before applying the updates, you should confirm that your implementation is ready for the upgrade and ensure compatibility with your modifications. Work with a Microsoft Partner to determine if you are ready and what is needed for you to apply the update.

Please note that Online customers will automatically be upgraded to version 28.0 over the coming days/weeks and should receive an email notification when upgraded.

Direct links to the cumulative updates are listed here:

Dynamics 365 Business Central On-Premises 2026 Release Wave 1 – 28.1 (May 2026)

Dynamics 365 Business Central On-Premises 2025 Release Wave 2 – 27.7 (May 2026)

Dynamics 365 Business Central On-Premises 2025 Release Wave 1 – 26.13 (May 2026)

Dynamics 365 Business Central On-Premises 2024 Release Wave 2 – 25.18 (April 2026)

 


If you’re looking for information on older updates, review the list here.

Permanent link to this article: https://www.dvlprlife.com/2026/05/may-2026-cumulative-updates-for-dynamics-365-business-central/

Weekly Review: Business Central AL Development – May 3–9, 2026

Highlighting posts and resources from the Business Central development community — May 3–May 9, 2026

A strong week for AL tooling and AI-assisted development. Vjeko ships AL MCP Bridge so any agent — Claude Code, Cursor, Codex — can drive the AL Language Server, and Javi Armesto introduces BCQuality, an open repo of remedial knowledge for AL coding agents. Gerardo Rentería pushes VS Code Agent Hooks onto Copilot, Steven Renders maps each AI assistant to the AL work where it actually pulls its weight, and Amol Salvi previews Clarity AI for decoding cryptic BC error messages.


Recent Posts (May 3–9, 2026)

➡️ 1. The MCP Bridge: AL Language Tools for Every Agent

📇 Author: Vjeko Babić
🗓️ Date: May 3, 2026
🌎 Link: vjeko.com
📝 Summary: The official AL extension for VS Code keeps every coding agent that doesn’t live inside VS Code — Claude Code, Cursor, Codex, you name it — locked out of the AL Language Server. Vjeko’s AL MCP Bridge fixes that by exposing the AL Language Server’s capabilities (diagnostics, symbol lookup, hover, definition, code actions, completions) through MCP so any agent can drive the same tooling Copilot uses. The result is a tight feedback loop in your agent of choice — compile errors, type info, and refactor suggestions stop being string-matched against shipped .app files and start coming from the real compiler.


➡️ 2. BCQuality: An Agentic Vision for AL Development

📇 Author: Javi Armesto (also appeared in the April 26–May 2 newsletter)
🗓️ Date: May 3, 2026
🌎 Link: techspheredynamics.com
📝 Summary: Public preview of BCQuality, an open repository of remedial knowledge for AL development agents. Built on an “admission rule” — only include guidance the LLM doesn’t already know — the repo is structured in three layers (Microsoft baseline, community, custom) and ships action skills for code review across performance, security, privacy, upgrade, style, and UI. The initial Microsoft layer includes 99 knowledge files covering things like SetLoadFields ordering, FindSet(true) locking semantics, and other patterns where general-purpose models tend to drift.


➡️ 3. VS Code Agent Hooks: Give Copilot Context Before the First Message

📇 Author: Gerardo Rentería
🗓️ Date: May 3, 2026
🌎 Link: gerardorenteria.blog
📝 Summary: VS Code Agent Hooks (SessionStart, PreCompact, and friends) let you run code at well-defined lifecycle points so Copilot has the context it needs before the first user message. Gerardo’s worked example uses an onboarding questionnaire that captures the developer’s experience level (junior / mid / senior) and writes a behavior profile to JSONL — so when the conversation gets compacted, the profile is reloaded on the next SessionStart and the agent doesn’t lose its tone or constraints. Includes the .github/hooks/ folder layout and a PowerShell executor pattern.


➡️ 4. How Do I: Choose the Right AI Assistant for AL Development?

📇 Author: Steven Renders
🗓️ Date: May 4, 2026
🌎 Link: thinkaboutit.be
📝 Summary: Steven compares the AI assistants AL developers reach for and matches each to the work where it pulls its weight: GitHub Copilot for inline completions and codebase-aware edits inside VS Code; Claude.ai / Claude Desktop for architecture and reasoning-heavy questions where you don’t want a model multiplier on every turn; Copilot Agent mode for multi-file refactors where the editor context justifies the cost. Sets up the June 1 usage-based billing change and previews how sub-agent model selection will start showing up on the invoice.


➡️ 5. Meet Clarity AI: The AI Assistant That Explains Your Business Central Errors

📇 Author: Amol Salvi (also appeared in the April 26–May 2 newsletter)
🗓️ Date: May 4, 2026
🌎 Link: bcaihub.com
📝 Summary: Building on last week’s piece on why BC errors are hard to decode, Amol previews Clarity AI — an assistant that takes a raw BC error message, correlates it with telemetry, source AL, and recent code changes, and returns a plain-language root cause and a candidate fix. The post sketches the workflow (paste the error, get the explanation, drill into the offending event subscriber or table extension) and frames it as the “first responder” tier between user-facing error text and a developer opening the debugger.


Community Resources

Official Resources

GitHub Repositories

  • microsoft/BCApps – Repository for collaboration on Microsoft Dynamics 365 Business Central applications.
  • microsoft/BCTech – Business Central technology samples.
  • microsoft/ALAppExtensions – Repository for collaboration on Microsoft AL application add-on and localization extensions for Microsoft Dynamics 365 Business Central.
  • microsoft/AL – Home of the Dynamics 365 Business Central AL Language extension for Visual Studio Code.
  • StefanMaron/MSDyn365BC.Code.History – Contains the Microsoft Business Central Code. Updated each month.

Follow on Social Media


Stay Connected

The Business Central AL development community stays active with valuable content on AL development, upgrades, integrations, and tooling improvements. Following #MSDyn365BC and #BusinessCentral on Twitter/X is a great way to catch new posts as they’re published.


Note: This review is compiled from publicly available blog posts and community resources. Links to external blog posts are provided for your information only and do not constitute endorsement or validation of their content. Publication information and availability are subject to change. Always verify information against official documentation for production use.

Permanent link to this article: https://www.dvlprlife.com/2026/05/weekly-review-business-central-al-development-may-3-9-2026/

The right-click menu lands in Markdown Foundry 0.5.0

I shipped 0.5.0 of Markdown Foundry — my VS Code extension for markdown people — and the headline change is something I should have built first: a right-click menu.

By 0.4.0, the extension had grown to forty commands. Tables, headings, lists, links, images, a TOC, half a dozen formatting toggles. Every one of them was reachable from the Command Palette, which is fine if you remember the names. A user who installed the thing yesterday probably doesn’t remember the names. They open a markdown file, right-click, see VS Code’s standard menu, and have no idea any of those commands exist.

So 0.5.0 fixes the discoverability gap.

The right-click submenu showing the five sections

What’s in the menu

Right-click anywhere in a markdown file, and there’s now a Markdown Foundry submenu with everything in it, grouped into five sections:

  • Inline — Bold, Italic, Bold+Italic, Strikethrough, Inline Code
  • Block — Blockquote, Block Code, Bullet List, Numbered List, Task List
  • Heading — Heading 1–6, Promote, Demote
  • Insert — Horizontal Rule, Insert Link to File, Paste Link, Paste Image, Insert Table, TOC
  • Table — Align, Insert/Delete/Move Row & Column, Sort

VS Code renders horizontal dividers between groups, so it scans cleanly. The Table section disappears when the cursor isn’t inside a table — there’s no point showing “Move Column Right” while you’re typing a paragraph. That uses the same markdownFoundry.inTable context key already powering Tab navigation between cells, so it costs nothing extra.

A few commands didn’t make the cut. The cell-navigation triggers (Next Cell, Previous Cell, Next Row) live on Tab, Shift+Tab, and Enter inside tables — putting them in a right-click menu would be noise. Convert Selection to Table is a paste-flow command, not a cursor-position one, so it stays in the palette. Everything else is in the menu.

The other 0.5.0 changes

The submenu is the photogenic feature. Three smaller things shipped alongside it.

Insert Link to File opens a quick-pick of every file in the workspace (current folder first, then alphabetical) and inserts a relative-path link at the cursor. If the file is an image, you get ![alt](path); otherwise [text](path). When a selection is made, the selection becomes the link text. I built it to scratch a specific itch: writing a markdown post that links back to another file in the same repo, and being tired of typing the relative path by hand.

Toggle Task List Item used to operate on the cursor’s line only, even with a multi-line selection active. The two sibling commands — Toggle Bullet List and Toggle Numbered List — have already been applied to selections. Now, Toggle Task List does too. Plain lines become unchecked, unchecked become checked, checked become unchecked, all in one keystroke. Empty lines stay empty. With no selection, behavior is identical to before.

Paste Link got broader clipboard tolerance. It used to accept URLs from the clipboard. Now it also accepts absolute file paths and file:// URIs, which many file managers and screenshot tools drop on the clipboard. Image extensions become ![alt](path); everything else becomes [text](path). Paths that don’t exist on disk are rejected, so a typo can’t sneak through.

On building this in the open

Most of the code that landed in 0.5.0 was written by Claude Code, working through a queue of GitHub issues — a planner agent reviews the issue, a worker agent writes the PR, a reviewer agent checks it against the acceptance criteria and our CLAUDE.md conventions before I merge. The submenu was a good test of the loop: a package.json-only change with a sharp acceptance criterion (the Table section must appear and disappear correctly), and the reviewer agent caught the one thing I missed — a missing PR link in the CHANGELOG entry — without me having to read the diff line-by-line.

The agent loop isn’t the post, but the velocity it enables is part of why these changes are showing up so quickly.

Markdown Foundry 0.5.0 is live on the marketplace. Right-click into it.

Permanent link to this article: https://www.dvlprlife.com/2026/05/the-right-click-menu-lands-in-markdown-foundry-0-5-0/

Selection Count 0.1.1

Selection Count v0.1.1

Selection Count 0.1.1 shipped today. No new features — three behavior corrections that surfaced during a post-v0.1.0 code-and-docs review and got fixed in a single afternoon. The extension is at marketplace.visualstudio.com/items?itemName=dvlprlife.selection-count. Full release notes in CHANGELOG.md.

For context: Selection Count is a tiny VS Code extension that puts live counts of the current selection — characters, words, letters, numbers, special characters — into the status bar. v0.1.0 shipped a week ago.

What’s fixed

Toggle / Configure now respect workspace scope (#22). Before this release, both Selection Count: Toggle Visibility and Selection Count: Configure Display wrote unconditionally to user (Global) settings. If you’d ever overridden any selectionCount.* setting at the workspace level, the workspace value kept winning after the Global write — the command appeared to silently no-op. The fix is config.inspect(key) to find the active scope, then write there.

Character count is now Unicode code points (#23). Previously text.length (UTF-16 code units), which counts an emoji like 🎉 as 2. With every other counter using \p{...}/u (code points), the totals didn’t reconcile — a selection of 🎉🎉🎉 reported chars: 6, special: 3 and the rest were 0. Switched to [...text].length. Now chars = letters + numbers + special + whitespace for any selection. Combining marks still count as separate characters; full grapheme-cluster counting (Intl.Segmenter) is a deferred follow-up.

Settings descriptions say “number,” not “digit” (#24). The number counter matches \p{N} — decimal digits and fractions like ½, superscripts like ², Roman numerals, etc. The README’s own example used ² while still calling the category “Unicode digits,” which read as a contradiction. Cheap fix; aligns the copy with what the code actually does.

If you’ve installed v0.1.0 already, VS Code will pick up 0.1.1 automatically. If not, grab it from the marketplace.

Permanent link to this article: https://www.dvlprlife.com/2026/05/selection-count-0-1-1/

Quick Tips: Debug Copilot Agent Session Logs in VS Code

Welcome to Quick Tips — a fast, focused series designed to help you work smarter.

Each post will give you one practical insight you can apply immediately, whether you’re coding, configuring your tools, or improving your workflow.

Here’s today’s Quick Tip:

Turn On Agent Debug Logs to See What Copilot Actually Did

VS Code 1.116 added the ability to view the Agent Debug Log for previous chat sessions, not just the one you’re in. With one setting enabled, every agent session is persisted to disk so you can go back and inspect tool calls, LLM requests, prompt file discovery, token usage, and errors after the fact.

If you’ve ever finished a long agent run and wondered “wait — which instructions actually loaded?” or “why did it skip that tool?”, this is the switch you want flipped.

Agent Debug Logs panel in VS Code

How to Enable File Logging

  • Open Settings (Cmd + , on macOS, Ctrl + , on Windows/Linux)
  • Search for github.copilot.chat.agentDebugLog.fileLogging.enabled
  • Check the box to enable it

Or drop this directly into your settings.json:

{
  "github.copilot.chat.agentDebugLog.fileLogging.enabled": true
}

How to Open a Past Session

  • Click the ellipsis (...) menu in the Chat view and select Show Agent Debug Logs — or run Developer: Open Agent Debug Logs from the Command Palette
  • Pick a session from the list
  • Switch between Logs, Agent Flow Chart, and Summary views

Agent Debug Logs Flow Chart in VS Code

Export and Import Sessions

The Agent Debug Logs panel toolbar has Export and Import icons in the top-right.

  • Export writes the current session to an OpenTelemetry JSON (OTLP) file — handy for sharing a repro with a teammate or archiving a tricky run for later analysis
  • Import loads a previously exported JSON file back into the panel, complete with its overview and metrics, just like a live session

Heads up: importing files larger than 50 MB triggers a warning. If you hit it, trim the file or export a shorter session.

Why It Helps

  • Debug custom agents, prompt files, and MCP tools without having to reproduce the issue live
  • See exactly which customizations loaded (and which were skipped) for any past run
  • Audit token usage and tool-call patterns to tune your workflow
  • Share repeatable bug reports by exporting a session log instead of pasting screenshots

Agent Debug Logs Flow Chart in VS Code

Note: the Agent Debug Log panel is currently in preview, and logs are stored locally on disk — keep that in mind if your sessions include sensitive context.

Learn more in the Debug chat interactions docs.

Got a favorite shortcut or workflow tweak? Share it in the comments and subscribe to dvlprlife.com for more Quick Tips like this one!

Permanent link to this article: https://www.dvlprlife.com/2026/05/quick-tips-debug-copilot-agent-session-logs-in-vs-code/

Round Two: Another VS Code Extension

Selection Count — live counts in the VS Code status bar, in text and icon formats

After Markdown Foundry shipped, I had no plans to immediately go again. Then I noticed the same blind spot every time I selected text in VS Code: the bottom-right corner shows the cursor position and the length of the selection, but nothing about what’s actually in it. How many words is this paragraph? How many digits in this CSV column? How many non-letter, non-digit characters in this filename? VS Code shows (351 selected) and stops there.

I wanted more. Specifically, five categories — characters, words, letters, numbers, and special characters — visible in the status bar, toggleable per-category, in either plain text or codicons.

So I vibe-coded a second extension: Selection Count.

Install from the MarketplaceSource on GitHub

What it does

The status bar shows live counts for whatever you have selected. By default it shows characters and words; via the Selection Count: Configure Display command you can toggle on letters, digit-counts, and special characters. Multi-cursor selections aggregate across every range. Empty selection hides the indicator entirely — the whole feature is selection count.

The format setting flips between plain text — 351 chars, 57 words, 281 letters, 0 nums, 11 special — and codicons, where the labels are replaced with VS Code’s built-in glyphs (symbol-string, whole-word, case-sensitive, symbol-number, symbol-operator). Either way, hovering the indicator shows a long-form breakdown.

The counters are Unicode-aware: é counts as a letter, ² counts as a number. That last detail tripped me up — see below.

How round two went

Same agentic workflow as Markdown Foundry: an agents/ directory, a CLAUDE.md rulebook, and the issue → planner → worker → reviewer cycle. The big difference this time was muscle memory. I knew where the friction was, what to write down up front, and which conventions to put in CLAUDE.md so the agents wouldn’t re-litigate them every PR. Three things stood out.

Drafting the issue body really matters. For each piece of work, I wrote a complete acceptance-criteria checklist before letting the agent loop touch it. That up-front investment removed almost all of the “wait, what did you mean by X” questions during implementation. The plan-driven cadence is the unlock — without a tight plan, agents wander.

The reviewer caught a real bug. The counter spec called for \p{L} and \p{N} (Unicode letter / number categories), but the README still described them as ASCII-only — A–Z and 0–9. The drift was flagged during a README review pass and we shipped a fix before publish. That’s exactly the failure mode a written rulebook plus a reviewer pass is supposed to catch.

Scope narrowing is fine. The original plan for the README demo section called for four GIFs. By the time we got there, three screenshots and one GIF told the story well enough, so we shipped that and tracked the rest as follow-ups. Not every ideal plan survives the reality of polishing a weekend extension. Cutting scope to ship beats polishing in private.

What’s next

A few obvious follow-ups are tracked but deferred:

  • Default keybindings for the Toggle Visibility and Configure Display commands.
  • Debouncing the status bar update for very large selections (a 100k-line select-drag currently runs five regexes per move tick).
  • A multi-cursor demo GIF, since the static screenshots don’t show aggregation.

None of these are urgent. The extension does its job at v0.1.0; sharper UX can land in 0.1.x as feedback comes in.

If you live in selections and want a tighter readout than VS Code’s built-in (N selected), grab it from the marketplace. And if you’ve been on the fence about agentic development workflows: writing the rules down once and letting the agents follow them really is the unlock.

Permanent link to this article: https://www.dvlprlife.com/2026/05/round-two-another-vs-code-extension/

Weekly Review: Business Central AL Development – April 26–May 2, 2026

Highlighting posts and resources from the Business Central development community — April 26–May 2, 2026

A quieter week in the community, but a few posts stood out. Amol Salvi takes on the perennial pain of cryptic Business Central errors and shows how AI can shorten the diagnosis loop. Yun Zhu shares a no-customization tip for opening Excel-layout reports straight in Excel for the web via OneDrive system features. Javi Armesto argues the shift to agents is breaking the flat per-user AI pricing model and looks at what comes next for partners and customers.


Recent Posts (April 26–May 2, 2026)

➡️ 1. Decoding Business Central Errors: Why They’re Hard—and How AI Can Fix It

📇 Author: Amol Salvi
🗓️ Date: April 27, 2026
🌎 Link: bcaihub.com
📝 Summary: Amol takes on the perennial pain of cryptic Business Central error messages — the kind that surface mid-posting with no clear pointer to the offending field, table, or extension. He walks through why BC errors are structurally hard to interpret (deep call stacks, layered events, generic system messages, multi-extension interactions) and shows how AI assistants can shorten the loop by correlating the error text with telemetry, source AL, and recent code changes to surface a likely root cause and a candidate fix.


➡️ 2. How to View Excel Reports (Excel Layout) Directly from the Web Without Downloading Files (Excel Online)

📇 Author: Yun Zhu
🗓️ Date: April 27, 2026
🌎 Link: yzhums.com
📝 Summary: Yun walks through getting Business Central to open Excel-layout reports straight in Excel for the web instead of downloading the .xlsx file. The key is the OneDrive Setup assisted setup wizard: turn on Use OneDrive for system features, and the Open in Excel / Edit in Excel actions on list pages — plus saving any report to an Excel or Word file — will copy the file to OneDrive and open it in the browser instead. Includes the standard caveats: works on Windows and macOS browsers, but the Excel desktop integration for OneDrive-hosted files is Windows-only, and BC caps the exported workbook at 100 columns when OneDrive system features are configured.


➡️ 3. Agents Changed the Game: The End of Flat AI Pricing

📇 Author: Javi Armesto
🗓️ Date: April 28, 2026
🌎 Link: techspheredynamics.com
📝 Summary: Javi argues that the flat per-user AI subscription model is on its way out. As soon as agents start running long-lived, multi-step jobs on a customer’s behalf — booking purchases, reconciling entries, drafting documents — token consumption decouples from headcount and starts looking a lot more like a metered utility. The piece walks through what this shift means for partners pricing AI-powered Business Central solutions and for customers budgeting for agent-driven workloads, and pushes back on the assumption that today’s all-you-can-eat Copilot pricing will survive the transition.


Community Resources

Official Resources

GitHub Repositories

  • microsoft/BCApps – Repository for collaboration on Microsoft Dynamics 365 Business Central applications.
  • microsoft/BCTech – Business Central technology samples.
  • microsoft/ALAppExtensions – Repository for collaboration on Microsoft AL application add-on and localization extensions for Microsoft Dynamics 365 Business Central.
  • microsoft/AL – Home of the Dynamics 365 Business Central AL Language extension for Visual Studio Code.
  • microsoft/BC-Bench – SWE-Bench–style benchmark dataset and evaluation pipeline for AI coding agents on Business Central.

Follow on Social Media


Stay Connected

The Business Central AL development community stays active with valuable content on AL development, upgrades, integrations, and tooling improvements. Following #MSDyn365BC and #BusinessCentral on Twitter/X is a great way to catch new posts as they’re published.


Note: This review is compiled from publicly available blog posts and community resources. Links to external blog posts are provided for your information only and do not constitute endorsement or validation of their content. Publication information and availability are subject to change. Always verify information against official documentation for production use.

Permanent link to this article: https://www.dvlprlife.com/2026/05/weekly-review-business-central-al-development-april-26-may-2-2026/

Dynamics 365 Business Central 2026 Wave 1 – Download Symbols From a NuGet Feed

If you’ve worked on an AL project where the sandbox was offline, the launch.json pointed to a tenant you no longer had access to, or you just wanted to spin up a quick proof-of-concept without provisioning anything, you’ve felt the friction of how symbols used to work. The standard flow — AL: Download symbols, hit a Business Central environment, pull from there — falls apart the moment that environment isn’t reachable or a version mismatch occurs. (yes, copying the symbols from another folder works, but it’s a hassle and not something you want to rely on regularly).

Business Central 2026 Wave 1 (v28), paired with AL Language extension v17, adds a much better option: pull symbols straight from Microsoft’s public NuGet feed (or your own).

Download Symbols from NuGet Feed

What’s New?

There’s a new VS Code command:

AL: Download Symbols from Global Sources

Run it from the Command Palette and the AL extension downloads the application packages your project depends on from Microsoft’s public NuGet feed — matched to whatever version you’ve set in the application tag of your app.json. No environment, no launch.json, no tenant required.

It also opens the door to two things the old flow couldn’t do cleanly:

  • Pulling from custom NuGet feeds (your own AppSource mirror, internal package feed, etc.).
  • Picking a specific country/region package at download time, instead of being tied to whatever localization the connected tenant happens to have.

Why You Should Care

  • Onboarding is faster. A new dev can clone the repo, open VS Code, and have working symbols without anyone provisioning a sandbox first.
  • Localized development is easier. Switching between W1, US, DE, etc. is a setting, not a tenant change.
  • Build agents stop being a special case. CI pipelines no longer need credentials to a BC environment just to resolve symbols.
  • Custom feeds give you supply-chain control. You can host your own dependencies on a private feed and lock the resolver to it.

How It Works

The command looks at app.json for the application version, then queries:

  1. Microsoft’s built-in public NuGet feeds (unless you turn them off).
  2. Any custom feeds you’ve added in settings.json, in the order they’re listed.

Symbols land in your .alpackages folder the same way they always have — the difference is purely where they came from.

Download Symbols from NuGet Feed

Three new settings drive the behavior, all under the al.* namespace:

SettingPurpose
al.nugetFeedsArray of custom NuGet v3 feed URLs to search after Microsoft’s built-in feeds.
al.useOnlyCustomFeedsWhen true, skip Microsoft’s feeds entirely and use only al.nugetFeeds.
al.symbolsCountryRegionCountry/region for the localized package — ISO 3166-1 alpha-2 (us, de, dk, …) or w1 for worldwide. If unset, you’ll be prompted at download time.

Example

A typical settings.json for a project that pulls W1 symbols from Microsoft’s feed:

{
  "al.symbolsCountryRegion": "w1"
}

Add a custom feed alongside Microsoft’s:

{
  "al.nugetFeeds": [
    "https://pkgs.dev.azure.com/myorg/myproject/_packaging/myfeed/nuget/v3/index.json"
  ],
  "al.symbolsCountryRegion": "us"
}

Lock everything to your internal feed only:

{
  "al.nugetFeeds": [
    "https://pkgs.dev.azure.com/myorg/myproject/_packaging/myfeed/nuget/v3/index.json"
  ],
  "al.useOnlyCustomFeeds": true,
  "al.symbolsCountryRegion": "us"
}

Download Symbols from NuGet Feed

Points to Note

  • Custom feeds must be public NuGet v3 feeds without authentication. If your feed needs credentials, the resolver won’t be able to use it as-is.
  • Version is driven by app.json. The application (and dependency) versions in your manifest are what the feed resolves against — check there first if you get unexpected symbol versions.
  • Country/region must match what’s actually published to the feed. ISO alpha-2 only, or w1 for worldwide.
  • Pin the country in settings.json for any project that’s targeting a specific localization. Relying on the prompt is fine for one-offs, but it’s inconsistent when multiple devs work on the same repo.
  • The old AL: Download symbols command still works — this is an additional option, not a replacement. Use whichever fits the situation: the global-sources command for offline/CI/quick-start scenarios, the classic command when you need symbols from a specific live tenant (e.g., it has a per-tenant extension installed).

Wrapping Up

Tying symbol downloads to a live BC environment was always a workflow tax — useful when the environment was the source of truth, painful when it wasn’t. Pulling straight from NuGet removes that coupling in most cases, and the custom-feed support makes it usable for organizations that need to keep dependency resolution within their own walls.

If you haven’t tried AL: Download Symbols from Global Sources yet, give it a run on your next project — odds are it’ll become the command you reach for first.

Learn more:

Note: The code and information discussed in this article are for informational and demonstration purposes only. Always test in a sandbox first. This content was written referencing Microsoft Dynamics 365 Business Central 2026 release wave 1 (v28) and AL Language extension v17.

Permanent link to this article: https://www.dvlprlife.com/2026/05/dynamics-365-business-central-2026-wave-1-download-symbols-from-a-nuget-feed/

Markdown Foundry 0.4.0

Markdown Foundry 0.4.0 shipped today. Three new commands, four new settings, and a meaningful test gate for the first time since the test infrastructure was added (which is its own story — separate post).

Markdown Foundry

The extension is at marketplace.visualstudio.com/items?itemName=dvlprlife.mdfoundry. Full release notes in CHANGELOG.md. For context, Markdown Foundry is a VS Code extension focused on table-centric editing — align, sort, navigate, convert CSV/TSV — plus formatting toggles for everyday Markdown authoring. 0.4.0 widens the authoring surface beyond tables for the first time.

What’s new

Insert Table. Pick a size from a quick-pick — preset 2×2 through 5×4, or Custom... for free-form dimensions — and get a pre-aligned empty Markdown table at the cursor. The first header cell is selected, so typing immediately overwrites it; the second cell is one Tab away. Until this release, the only way to create a table was to type CSV/TSV first and run Convert Selection to Table. That’s fine when you already have data, but it’s friction when you’re starting from “I need a quick comparison table.” The new command reuses the existing formatter, so the inserted output is already aligned — no follow-up Align Table needed. Header cells default to Column 1, Column 2, … which you’d normally rename, but selecting the first cell on insert makes the rename feel automatic rather than a separate step.

Insert Table

The grid sizes were chosen by sampling the tables I’d written in the previous month: most were 2- or 3-column, 3- to 5-row, with the occasional 4×3 or 5×4 for comparison matrices. The presets cover the common cases without forcing a custom dimension prompt for the 80% case.

Toggle Bullet List / Toggle Numbered List. Line-oriented toggles that turn plain lines into - bullet or 1./2./3. numbered items, and re-invoke to strip the prefix. Indentation is preserved so nested lists round-trip cleanly. The bullet toggle accepts -, *, or + on the way out — whichever character your existing list uses — but always emits - on the way in for consistency. The numbered toggle increments globally across the selection: indented sub-items still advance the count rather than restarting at 1, which matches how every Markdown renderer I’ve seen handles a list of mixed-depth items. Both palette-only because Ctrl+L and Ctrl+Shift+L are claimed by VS Code’s selection commands, and overriding stock keybindings on a frequently-used chord seems hostile.

This closes a gap from the formatting toggles that shipped in 0.2.0 and 0.3.0 — those covered emphasis (bold/italic/strikethrough), code blocks, blockquote, headings, task lists, and horizontal rule, but skipped plain bullet and numbered lists. The task list (- [ ] item) was already in, but the unchecked bullet case had to be done by hand.

Insert/Update Table of Contents. Scans the document, generates a nested Markdown list of links, wraps it in <!-- markdownfoundry-toc --> markers. If those markers already exist when you re-invoke the command, it replaces only the content between them — no duplicate TOCs, no loss of surrounding text. Headings inside fenced code blocks (``` and ~~~) and HTML comments are skipped, so example Markdown inside your prose doesn’t pollute the index. Slugs are GitHub-compatible: lowercase, whitespace-to-hyphen, drop punctuation outside [a-z0-9_-]. Duplicate headings get -1/-2/… suffixes in document order, again matching GitHub’s rendering.

Four new settings come with it: markdownFoundry.toc.minDepth (default 2 — skip the H1 since most docs have a single title), maxDepth (default 6), indent (default 2 spaces per depth level), and includeMarkers (default true; turn it off if you want one-shot insertion with no in-place update).

Getting it

ext install dvlprlife.mdfoundry from the command palette, or the marketplace listing. If it’s already installed, VS Code will pick up 0.4.0 on the next auto-update. Issues and feature requests at github.com/dvlprlife/Markdown-Foundry.

Permanent link to this article: https://www.dvlprlife.com/2026/05/markdown-foundry-0-4-0/