Whenever you have worked with a technology for a number of years, certain words get hardwired. So when a user asks for a “report” I wanna give them a report (Object Type Report). But in 2023, that might not be the right answer. See the video for how a 2023 response to the question could be:

In this video, Erik explores a philosophical question that every Business Central consultant and developer should consider: when a client says “I need a report,” what do they actually mean in 2023? The answer might surprise you — and it might save you from writing unnecessary code. Erik also demonstrates the powerful Analysis Mode feature and shows how report substitution works when you do need a traditional report.
Rethinking What “Report” Means
Erik was inspired by a conversation with a co-worker where a client asked for a report, and a developer chose not to create a traditional report object as the answer. This raises an important philosophical question: what is a report in 2023?
For those of us who have been in the Business Central (and NAV) world for a long time, our brains are hardwired — the word “report” triggers a mental image of a report object that prints out on paper. We have an object type literally called “report” in Business Central, and for many years, that’s exactly what it did.
But what clients actually need in most cases is to present data in a specific way — not necessarily to deliver it on paper. And in 2023, we have many different ways to present data without ever touching a printer.
Analysis Mode: The Game Changer
One of the most exciting features to arrive in Business Central recently is the Analysis Mode for list pages. If you’re on a list view and you see an “Analyze” checkbox, you already have access to it.
Enabling the Feature
If you don’t see the Analyze option, it may need to be enabled through Feature Management. Look for the feature called “Feature Preview: Analysis Mode” — described as “Quickly analyze data directly in Business Central” — and enable it.
There’s an important asterisk here: when enabled, it’s turned on for everybody on all pages that Microsoft considers compatible. There’s currently no way for a developer or system admin to say “Peter isn’t allowed to use this” or “it should be available on this page but not that one.” That level of control is expected to come in BC version 23.
Security warning: Be aware that Analysis Mode can potentially expose data that you may have filtered out or hidden through other mechanisms. Columns that are on the page but not visible can still be accessed in Analysis Mode. If you’ve hidden fields because certain users shouldn’t see them, those users could see them here.
The Row Count — A Simple but Huge Feature
When you turn on Analysis Mode, the first thing you’ll notice at the bottom is a row count telling you how many rows are in the current view. This sounds trivial, but Erik can’t count how many times he’s seen someone set up a filter, click “Open in Excel,” scroll to the last row, and figure out there are 7,000 records — just because they needed to know how many records matched their criteria.
Erik even considered building a simple AppSource app whose sole purpose was to show record counts on list views. That customization request came up constantly. Now it’s built right in.
This alone might be the “report” someone needs: “How many items do we have over $100 in unit price?” Set the filter, hit Analyze, and you have your answer.
Two Layers of Filtering
Analysis Mode works with two layers of filters:
- Page filters — the standard filters that determine which records are loaded from the database into the view. There’s a hard limitation of 100,000 rows; if you have millions of records, you’ll still need Power BI or another tool.
- Analysis filters — an additional set of filters that work on the in-memory dataset already loaded in the browser. Note that the filter syntax is slightly different from standard Business Central filters (for example, date ranges use a different approach rather than the familiar “..” notation).
Column Selection and Saved Views
In the Analysis Mode sidebar, you can manage which columns are visible. You can remove columns you don’t care about — similar to personalization, but specific to each analysis view.
Each analysis view can be saved with a name. For example, you might rename the default “Analysis 1” to something meaningful like “Demo 12.” You can create multiple saved views per page, and they’re saved per user. In BC version 23, there’s an option to share analysis views with other users.
The available columns include all columns on the page, even ones that aren’t currently visible. So you might see fields like Debit Amount and Credit Amount even if only Amount is shown on the standard page view.
Row Grouping and Pivot Mode
The real power comes from the Row Groups area. You can drag fields into this area to create groupings:
- Drag the G/L Account Number down to Row Groups, and you get a collapsible fold-in/fold-out view grouped by account
- Add Posting Date as a second level, and you get two levels of grouping with subtotals
- Numeric fields like Amount are automatically summed at each group level
You can also switch to Pivot Mode, which shows just the summarized data — sums by account in a cleaner, more compact view. It’s a different way to look at the same data depending on your needs.
One current limitation: there’s no option to export the pivot view directly to Excel as a pivot table. Erik also hopes Microsoft will eventually add date abstractions so date fields can be grouped by month or period rather than individual dates.
When You Still Need a Traditional Report
Of course, there are still cases where a traditional report object is the right answer — particularly when data needs to be printed on paper or when the report requires complex data processing. The provided source code shows an example of a Customer Top 10 List report and demonstrates a useful pattern: report substitution.
Report Substitution with Event Subscribers
The Sub Reports.al file shows how you can replace a standard Business Central report with your own custom version using the OnAfterSubstituteReport event:
codeunit 54100 "Sub Reports YT"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::ReportManagement, 'OnAfterSubstituteReport', '', true, true)]
local procedure MyProcedure(ReportId: Integer; var NewReportId: Integer)
begin
if ReportId = Report::"Customer - Top 10 List" then
NewReportId := Report::"Customer - Top 10 List (YT)";
end;
}
This approach intercepts calls to the standard “Customer – Top 10 List” report and redirects them to a custom version. This is a clean, upgrade-safe way to customize reports without modifying the base application.
The Custom Report Object
The custom report itself follows a familiar pattern for Business Central reports:
report 54100 "Customer - Top 10 List (YT)"
{
DefaultLayout = RDLC;
RDLCLayout = './CustomerTop10List.yt.rdlc';
Caption = 'Customer - Top 10 List (YT)';
PreviewMode = PrintLayout;
UsageCategory = None;
dataset
{
dataitem(Customer; Customer)
{
DataItemTableView = SORTING("No.");
RequestFilterFields = "No.", "Customer Posting Group", "Currency Code", "Date Filter";
trigger OnAfterGetRecord()
begin
Window.Update(1, "No.");
CalcFields("Sales (LCY)", "Balance (LCY)");
if ("Sales (LCY)" = 0) and ("Balance (LCY)" = 0) then
CurrReport.Skip();
CustAmount.Init();
CustAmount."Customer No." := "No.";
if ShowType = ShowType::"Sales (LCY)" then begin
CustAmount."Amount (LCY)" := -"Sales (LCY)";
CustAmount."Amount 2 (LCY)" := -"Balance (LCY)";
end else begin
CustAmount."Amount (LCY)" := -"Balance (LCY)";
CustAmount."Amount 2 (LCY)" := -"Sales (LCY)";
end;
CustAmount.Insert();
if (NoOfRecordsToPrint = 0) or (i < NoOfRecordsToPrint) then
i := i + 1
else begin
CustAmount.Find('+');
CustAmount.Delete();
end;
TotalSales += "Sales (LCY)";
TotalBalance += "Balance (LCY)";
end;
}
// Integer dataitem outputs the sorted top N results
dataitem("Integer"; "Integer")
{
DataItemTableView = SORTING(Number) WHERE(Number = FILTER(1 ..));
// ... columns for display
}
}
// ...
}
Key aspects of this report design include:
- Temporary record pattern — The report uses a temporary
CustAmountrecord to collect and sort customer data, keeping only the top N records by deleting the smallest when the limit is exceeded - Two dataitems — The first (
Customer) processes and ranks the data; the second (Integer) outputs the sorted results - Request page options — Users can choose to sort by Sales or Balance, specify how many customers to show, and select between bar chart and pie chart
- RDLC layout — The report uses an RDLC layout that includes both a tabular data view and embedded charts (bar and pie) that toggle based on user selection
A Real-World Example
Erik shares that he uses Analysis Mode extensively for his own business at AppSource. He needs to see how many apps are sold, where, how, and when. Rather than building formal reports, he created a table that holds all the purchase and subscription information, built a list page on top of it, and uses Analysis Mode to explore the data interactively. When he finds a useful view, he saves it and comes back to it whenever he needs to check numbers.
Conclusion
The next time a client says "I need a report," take a moment to understand what they actually need. In many cases, the answer in 2023 is: "You already have it — click Analyze, select these fields, group by that field, and you're done." In other cases, you might need to create a list page with the right columns and data, then hand it to the client with instructions to use Analysis Mode. And yes, sometimes people truly need something printed on paper — but those cases are becoming increasingly rare. The key takeaway is to challenge the assumption that "report" always means a report object, and consider the full range of data presentation options that Business Central now offers.