Power BI Drillthrough: Build a Late-Order Action List
A supplier chart flags a problem. A useful detail page tells the buyer which purchase-order lines need a call. Build that journey with sample data, a clear definition of late and checks that stop the detail from contradicting the KPI.
15 October 2026 · UK procurement teams · Power BI Desktop
-
Context retained Supplier and agreed site scope travel into the detail.
-
Late lines only Order, line, due date, remaining quantity and buyer.
-
Action in the source system The buyer records a revised promise and next follow-up.
All dashboard data is an Illustrative example. The chart highlights a proposed selection; this HTML dashboard is a visual example, not a connected Power BI report.
Define the job before the visual
Give the buyer a precise question
Which open lines from this supplier were due before the reporting date, still have quantity outstanding and belong to my selected site?
Agree the grain
One row represents one purchase-order line. A single order can contain several late lines. Keep both the order number and line key so the table cannot silently group distinct lines together.
Agree what late means
This example requires Status = Open, remaining quantity above zero and DueDate earlier than the snapshot date. Due today is not late. Closed and cancelled lines are excluded.
Agree what value means
Remaining quantity × unit price, in GBP excluding VAT. This is outstanding purchase value, not cash lost or a saving available. Do not add different currencies without an agreed conversion policy.
Build it in Power BI Desktop
A repeatable route from chart to order line
Work in a new blank report. Every company, person and transaction below is fictional. The fixed snapshot makes the expected answers repeatable.
Load the teaching dataset
Choose Transform data → New source → Blank query. Open Advanced Editor, replace its contents with the M below and name the query OrderLines. Choose Close & Apply. The query creates eight lines and derives the late flag and remaining value.
let
// Fixed teaching snapshot, not today's live position.
AsOf = #date(2026, 10, 15),
Source = #table(
type table [OrderNo = text, LineNo = number,
Supplier = text, Site = text, DueDate = date,
Status = text, RemainingQty = number,
UnitPriceGBP = number, Buyer = text],
{
{"PO1001",1,"A100 | Arden Components","North",#date(2026,10,9),"Open",20,120,"Alex"},
{"PO1001",2,"A100 | Arden Components","North",#date(2026,10,12),"Open",10,180,"Alex"},
{"PO1002",1,"A100 | Arden Components","South",#date(2026,10,14),"Open",50,100,"Alex"},
{"PO1003",1,"B200 | Beacon Supplies","North",#date(2026,10,8),"Open",30,200,"Sam"},
{"PO1004",1,"C300 | Cedar Industrial","South",#date(2026,10,13),"Open",20,150,"Jo"},
{"PO1005",1,"B200 | Beacon Supplies","North",#date(2026,10,15),"Open",10,70,"Sam"},
{"PO1006",1,"C300 | Cedar Industrial","South",#date(2026,10,5),"Closed",0,100,"Jo"},
{"PO1007",1,"A100 | Arden Components","North",#date(2026,10,2),"Cancelled",10,50,"Alex"}
}
),
Typed = Table.TransformColumnTypes(Source,
{{"LineNo", Int64.Type}, {"UnitPriceGBP", Currency.Type}}),
WithKey = Table.AddColumn(Typed, "OrderLineKey",
each [OrderNo] & "-" & Text.From([LineNo]), type text),
WithValue = Table.AddColumn(WithKey, "RemainingValueGBP",
each [RemainingQty] * [UnitPriceGBP], Currency.Type),
WithLate = Table.AddColumn(WithValue, "IsLate",
each if [DueDate] = null then false else
[Status] = "Open" and [RemainingQty] > 0
and [DueDate] < AsOf, type logical),
WithDays = Table.AddColumn(WithLate, "DaysLate",
each if [IsLate] then Duration.Days(AsOf - [DueDate])
else 0, Int64.Type),
WithSnapshot = Table.AddColumn(WithDays, "SnapshotDate",
each AsOf, type date)
in
WithSnapshot
The snapshot is deliberately fixed at 15 October 2026. In production, replace it with an authoritative business snapshot date delivered alongside the order extract. A new calendar day does not make an imported dataset current. Display the snapshot date prominently and agree the UK reporting cut-off.
Quarantine missing due dates for correction rather than treating them as healthy orders. The sample excludes them from the late flag; monitor their count separately. Validate duplicate line keys, negative quantities and unrecognised statuses before adopting the calculation.
Create the measures
Under New measure, create each definition separately. Format Late Remaining Value GBP as pounds sterling with zero or two decimal places; keep the count measures as whole numbers.
// Create each definition separately using New measure.
Late Lines =
COALESCE(
CALCULATE(COUNTROWS(OrderLines),
KEEPFILTERS(OrderLines[IsLate] = TRUE())), 0)
Late Orders =
COALESCE(
CALCULATE(DISTINCTCOUNT(OrderLines[OrderNo]),
KEEPFILTERS(OrderLines[IsLate] = TRUE())), 0)
Late Remaining Value GBP =
COALESCE(
CALCULATE(SUM(OrderLines[RemainingValueGBP]),
KEEPFILTERS(OrderLines[IsLate] = TRUE())), 0)
Detail Heading =
"Late orders | " &
SELECTEDVALUE(OrderLines[Supplier], "Select one supplier")
KEEPFILTERS intersects the late condition with the current
context. Do not remove supplier or site filters to force a grand total
into the detail page. The distinct order count assumes OrderNo is
unique across the reporting scope; otherwise use a company-plus-order key.
Build the supplier overview
Create a page named Supplier overview. Add cards for
the three numeric measures, a bar chart with
OrderLines[Supplier] on its category axis and
Late Remaining Value GBP as its value, and a slicer
using OrderLines[Site]. Sort the chart by value descending.
With no site selection, expect 5 late lines, 4 late orders and £18,200 — Illustrative example. Use the combined supplier code and name supplied in the sample, rather than assuming supplier names are unique.
Create the detail destination
Add a page named Late order detail. Select its canvas
and find the Drillthrough field well in the
report-building pane. Add the exact OrderLines[Supplier]
column used by the chart. Retain the automatically created Back button.
Add OrderLines[IsLate] to
Filters on this page and select True.
Add a table containing OrderLineKey, OrderNo, LineNo, Supplier, Site,
DueDate, RemainingQty, RemainingValueGBP, DaysLate and Buyer. Set the
raw numeric columns to Don't summarise where applicable
and sort DaysLate descending.
Add a card using Detail Heading, plus cards for late lines and late value. Display SnapshotDate as a date, not its automatic hierarchy. The explicit page filter is essential: filtering inside a measure does not automatically restrict the rows of another visual.
Make navigation discoverable
Right-click the Arden supplier bar and choose Drillthrough → Late order detail. Confirm the supplier heading and use Back to return. Then add a source-page button labelled View late order lines, enable its Action, choose Drillthrough and set the destination.
Place an instruction beside it: “Select one supplier, then view late order lines.” In Desktop editing mode, hold Ctrl while clicking to test the button. Test the enabled and disabled states. A plain page-navigation action is not a substitute for passing drillthrough context. Keep the right-click route available while testing button behaviour.
Prove the filter contract
Compare the report with this acceptance table. All figures are an Illustrative example calculated from the supplied dataset. Clear the destination's temporary design filters before the final test.
| Test context | Late lines | Late orders | Late value | Evidence |
|---|---|---|---|---|
| Overview · all sites | 5 | 4 | £18,200 | Five late lines across three suppliers. |
| Arden detail · all sites | 3 | 2 | £9,200 | PO1001-1, PO1001-2, PO1002-1. |
| North selected → Arden detail | 2 | 1 | £4,200 | Only PO1001-1 and PO1001-2. |
| Beacon detail · all sites | 1 | 1 | £6,000 | PO1003-1 only; PO1005 is due today. |
For the empty-state test, use the Site slicer and a temporary Supplier slicer to select North and Cedar together: there are no matching sample lines. Cards should show zero and the table should be empty; no unrelated supplier should appear. Verify this state using slicers rather than expecting a zero-value bar to provide a drillthrough target.
Best practice before release
Keep navigation, security and action distinct
A hidden page is still a page
Hide the destination from normal tabs if that improves navigation. Apply model security for restricted site access and test a representative viewer. Workspace Admin, Member and Contributor roles are not restricted by Power BI RLS.
A snapshot is not a live promise
Keep refresh ownership with the data owner. Agree when a failed or stale refresh makes the report unsuitable for chasing suppliers. Show the source snapshot and provide a route to check the current purchasing record.
A detail page does not close work
The buyer records the supplier response, revised promise and next follow-up in the purchasing system. Keep the original due date if you need to measure promise reliability; overwriting it can conceal repeated slippage.
These operating choices are Smart Statistics recommendations. Platform security behaviour is documented in Microsoft's row-level security guidance .
Diagnose before changing the model
When the journey gives the wrong answer
| Symptom | Likely failure | Practical check |
|---|---|---|
| No destination appears | Source and destination use different fields. | Use the same unaggregated Supplier column, not a lookalike label from a disconnected table. |
| Cards look right; table looks wrong | Only the measures enforce lateness. | Inspect the IsLate page filter and the underlying line keys. |
| North selection includes South | Site context was not carried, or a measure removes it. | Inspect the destination filter pane; compare the North-to-Arden acceptance case. |
| Production totals multiply | Duplicate line keys or an unsuitable join. | Compare row count and unique line keys before and after merging supplier data. |
Interactive release check
Can a buyer trust the next click?
Tick only checks you have evidenced. This local checklist does not submit or save your answers. Its score supports review; it does not certify the report.
Adoption and business impact
Measure the work the page helps complete
Let a buyer lead the first demonstration: select a supplier, identify one late line and record the next action in the purchasing system. The procurement lead owns escalation rules; the data owner owns definitions and refresh; the report owner maintains navigation and tests.
Measure usability
Observe the time from identifying a supplier problem to finding the correct order line. Record whether users needed another export or help locating the detail. Compare equivalent tasks before and after the change.
Measure follow-through
Track late lines with a named owner and dated next action, plus how long unresolved lines remain open. Do not claim the report reduced supplier lateness without separating reporting changes from supplier and demand changes.
Frequently asked questions
Power BI drillthrough FAQs
Is drillthrough the same as drilling down?
No. Drillthrough opens another report page using the selected context. Drill down explores levels within a visual hierarchy.
Why does the detail table show orders that are not late?
A late-order measure filters its calculation, not every other visual. Apply IsLate = True as a filter on the detail page so its table and cards share the same scope.
Why is my drillthrough destination missing?
Check that the exact Supplier column used in the source visual is also in the destination drillthrough field well. Start by right-clicking one supplier data point.
Does this page update the purchasing system?
No. This tutorial creates a read-only report. Buyers record revised promises and follow-up actions in the agreed purchasing system; those changes appear after the reporting data is refreshed.
Does hiding the detail page secure its data?
No. Hiding a page only changes navigation. Use the appropriate model security and permissions, and test the report with a representative restricted viewer.
Sources and scope
Documented features, explicit teaching assumptions
Microsoft documentation checked on 15 October 2026. The late-order rules, dataset, layout and operating recommendations are original teaching examples. All displayed business figures are an Illustrative example, not customer results. Desktop pane locations can differ by version.
- Microsoft: drillthrough setup, field context and buttons .
- Microsoft: report-page drillthrough design guidance and button actions and testing .
- Microsoft: #table , Table.AddColumn and Duration.Days .
- Microsoft: CALCULATE and KEEPFILTERS behaviour .
- Microsoft: row-level security and workspace roles .