Tony Cosentino
8 minute read

You may have a requirement for purpose-built reporting that requires data extraction from a Dynamics 365 product, like Business Central, FinOps (Finance And Operations), or Dynamics 365 CRM/CE.  While Power BI has excellent connectors to Dynamics 365 products, it fails in that it’s very slow to run report queries over large entities containing your data. Therefore, a data warehouse is required to really optimise your data for reporting.

You have a few choices in when it comes to extracting data:

1)     Use the Web API (See https://api.businesscentral.dynamics.com/v2.0 /<your tenant name>/api/v2.0/companies(<your tenant id>)/   )


1)     Use the Microsoft Graph API (currently in BETA, see https://graph.microsoft.com/beta/financials)

2)     Use the out of the box OData feed API (See https://api.businesscentral.dynamics.com/v2.0/<your tenant id>/BC_Sandbox/ODataV4/)

3)     Write your own custom API (see https://docs.microsoft.com/en-us/dynamics365/get-started/developers ). Business Central uses AL code.

4)     If you’re using FinOps, or Dynamics CRM/CE you can do a live data export to a SQL Server in Azure which replicates all your data. This option is not available in Business Central at this stage, however, Business Central does support OData API.

In this article, I will be using the OData extraction method as it’s been around for many years, and is the Microsoft standard in accessing system data, including the Microsoft 365 cloud.

Business Central >> OData >> DataFlow Staging >> DataFlow Transformation >> Power BI


Business Central has an array of out-of-the-box OData APIs ready to use, with no coding needed. All pages in Business Central can be converted into an OData query. In other words, if you need a list of all the items you stock, you can go to the items page, add the fields you need, then add it as an OData API. Microsoft have advised version 4.0 of OData is way faster than 3.0, so please ensure you use 4.0.

DataFlows – Staging: According to Microsoft best practices, this is used to stage all your data and load it into CDM format, which include creating CSV files, along with meta data. Each entity in business central must have an audit column if you need to configure incremental refresh, where only data that has changed will be loaded.

DataFlows – Transformation: Since all your business data is pre-loaded into CDM format, this becomes the DataFlow cache.  And reading from cache is always going to be faster than reading a query from the source system.

Also, this is the place where what I call the “Corporate Data Model” will live. It must be modeled as a STAR schema and optimised for high performance by using methods like aggregations, DirectQuery and the Enhanced Compute Engine. 

This foundation DataFlow layer is important as your customers will be using self-service BI to eventually create and manage their own reports via Microsoft TEAMS.

Business Central Data Extraction
From an OData perspective, and for incremental refresh to work, you will need to have the data source with a System Date Time stamp column. That is, whenever a record is updated, then this column (maintained by source system), is automatically updated.

Here is a list Out Of The Box hidden pages in Business Central that actually have a System Data Time column, called SystemModifiedAt:

Object Page ID Page Name
page  30014 APIV2 - Accounts
page  30011 APIV2 - Company Information
page  30027 APIV2 - Countries/Regions
page  30019 APIV2 - Currencies
page  30055 APIV2 - Customer Payments
page  30009 APIV2 - Customers
page  30013 APIV2 - Cust. Paym. Journals
page  30021 APIV2 - Dimensions
page  30040 APIV2 Dimension Values Entity
page  30017 APIV2 - Employees
page  30018 APIV2 - G/L Entries
page  30025 APIV2 - Item Categories
page  30008 APIV2 - Items
page  30049 APIV2 - JournalLines
page  30016 APIV2 - Journals
page  30020 APIV2 - Payment Methods
page  30023 APIV2 - Payment Terms
page  30042 APIV2 - Purchase Invoices
page  30066 APIV2 - Purchase Orders
page  30064 APIV2 - Purchase Receipts
page  30038 APIV2 - Sales Credit Memos
page  30012 APIV2 - Sales Invoices
page  30028 APIV2 - Sales Orders
page  30037 APIV2 - Sales Quotes
page  30062 APIV2 - Sales Shipments
page  30024 APIV2 - Shipment Methods
page  30036 APIV2 - Tax Areas
page  30015 APIV2 - Tax Groups
page  30041 APIV2 - Time Registr. Entries
page  30030 APIV2 - Units of Measure
page  30060 APIV2 - Vendor Payments
page  30061 APIV2 - Vendor Paym. Journals
page  30010 APIV2 - Vendors

 If you are after a page that just does not have a System Date Time stamp, then you will need to fire up Visual Studio Code, and publish some AL code to Business Central. For example, lets add SystemModifiedAt to the “Chart Of Accounts” page.

pageextension 50102 GlAccountExt extends "Chart of Accounts"
        addafter("Gen. Bus. Posting Group")
            field(SystemModifiedAt; rec.SystemModifiedAt)
            {  }

After uploading the extension in Business Central instance, you will need to reload the OData web service:

Then browse the chart of account OData web service url and you can see the SystemModifiedAt field is there:

If you'd like to learn more about Power BI capabilities and what it could do for your business, get in touch with us today to discuss your requirements and how to get started. 

Email Fiona - f[email protected] or call on 0415 870 135

Tony Cosentino

Tony Cosentino

Senior Consultant
Tony has worked as a Solutions Architect for over 11 years and has been integral to a number of key SharePoint, RecordPoint, Office 365 and Power BI projects. He has experience working with major clients in some of the largest SharePoint solutions that have ever been rolled out, inclusive of Fusion Retail Brands, the Bureau of Meteorology and Fujitsu Australia. This professional experience is further complemented by his impressive resume in the motivational speaking realm, inclusive of being a TEDx Public Speaker coach.