Power BI · SAP S/4HANA data · SODOLO Automotive

From an SAP extract to an answer on margin

A Power BI reference build for SODOLO Automotive, a fictional carmaker whose sales grew while its margin fell. It starts from tables in SAP S/4HANA format, reconciles them to the general ledger, and shows the board, the CFO and each plant where the margin went — on synthetic data, so every page can be shown in full.

Access is by invitation. If Power BI asks you to sign in, ask me for access.

Type
Reference build
For
Board, CFO, plant, supply chain and sales leaders
Data
100% synthetic, in SAP S/4HANA format
Scope
3 companies · 3 plants · 120 dealers
Built with
Power BI and Python, with Claude Code

What this is, plainly

SODOLO Automotive does not exist. It is a fictional carmaker that I invented so I could build a report the way I would for a manufacturer, without exposing anyone's data. It has two plants in Vietnam that stamp, paint and assemble a sedan, an SUV, a pickup and an electric car, a battery plant in Thailand, 120 dealers and an export company. Every vehicle, dealer, supplier and dollar in it is synthetic, generated by a script, so the whole dataset can be rebuilt exactly.

The data is laid out the way SAP S/4HANA stores it: the same table and field names, the same key padding, date formats and sign conventions. It is a simulated extract, not a connection to a live SAP system. What it lets you judge is the path from those tables to a report, which is the part of the work a description cannot show.

What the report tells the leadership team

I wrote eight business stories into the data on purpose, and wrote down the answers before the report was built. The question the report has to answer is the chief executive's: are we growing profitably? Some of what it shows, as at 30 September 2026:

  • The headline: from FY2023 to FY2025, units grew 28% and net revenue 34%, while EBIT margin fell from 7.3% to 2.5%. In the first nine months of FY2026 it is 5.8%, against a budget of 8.8%.
  • The most profitable model is the one the plant cannot build fast enough. The paint shop runs at 96% of capacity, buyers of the D7 SUV wait 57 days, and 3,629 orders were cancelled in nine months — $88.9M of revenue forgone.
  • One supplier stopped the line. The main wiring-harness supplier fell to 69% on-time delivery in FY2024, which cost 8,399 minutes of line stops and $4.5M of premium freight. Supplier delivery warns two months before deliveries to dealers slip.
  • A saving that cost more than it saved. Plant 1020 cut preventive maintenance by 40% in FY2024. The cut saved $2.1M and cost $9.9M in repairs and overtime.
  • The electric car sells at 51% of its business case, so the battery plant uses 37% of its capacity. Cost per kWh has fallen to $122 and is still $14 above plan — a volume problem, not an efficiency one.
  • A fleet contract added volume and lost money: each fleet pickup loses $1,129, while an SUV sold through a dealer earns $6,492.
  • Part of one year's volume was borrowed from the next. In the last quarter of FY2025, dealers in the South received 1,644 more cars than they sold. Their stock of the D5 sedan peaked at 128 days of sales, and they now take 37 days to pay.

From SAP tables to a number Finance can sign

Most of the work in a report like this happens before the first chart. The extract has 50 tables in SAP's own formats: keys padded with zeros, dates as eight digits, amounts stored as text, and revenue held as a negative number in the ledger. A transform turns them into a star schema of 13 dimensions and 19 fact tables that a report can read.

  • Eight of the 50 tables are not SAP's own. They hold feeds from the systems around it: line downtime from the manufacturing execution system, dealer sales from the dealer management system, the vehicle register, defects and warranty claims, and targets from the planning tool. The downtime feed has its own line codes and the dealer feed its own dealer codes, so both are mapped before anything joins.
  • Three currencies. The Vietnamese company keeps its books in dong, the Thai company in baht and the export company in US dollars. The group view is in dollars, and revenue is also shown at last year's exchange rates, so that currency does not pass for growth.
  • Sales between group companies are removed. The Thai plant sells to the Vietnamese company and the Vietnamese company sells cars to the export company. Both are eliminated in the group view, and a check proves that the two sides net to zero.
  • Eight reconciliations hold the tables together. Billed revenue, intercompany invoices, purchase price variance and warranty expense must each equal what the general ledger says. Vehicles built must equal vehicles recorded, and each dealer's closing stock must equal opening stock plus cars received minus cars sold.
  • History is kept where it changes the answer. Materials and work centres keep every version of a record with its dates, so a past year is costed at that year's standard cost and measured against that year's line capacity.

What this proves, and what it does not

Because I planted the stories, this shows that the report can bring a known answer to the surface, and that the path from SAP-format tables to that answer is tested from end to end. It does not show that the same transform would run unchanged on your system. Every SAP installation has its own custom fields, its own configuration and its own history of exceptions. Extracting from a live system — which interface, how often, with whose approval — is a project decision this build does not make.

How the report is organised

The report follows the same rules as the SenMinh reference build: every page prints the business question it answers, every chart title states its conclusion, and no number appears without a comparison. What is particular to this one:

  • Three tiers. One page for the board; six that each diagnose one branch of the margin — profitability, sales and dealers, manufacturing, supply chain and quality, the electric-vehicle programme, working capital; and three for action: a profile of one plant, a profile of one dealer, and a watch list.
  • Like for like. FY2026 has nine months, so it is always compared with the same nine months of FY2025 and with the budget to September, never with a full year.
  • A watch list with a reason on every row: 41 vehicles on dealer orders past their confirmed date, 6 suppliers delivering under 90% on time, 5 dealers more than 30 days overdue.
  • One report for every audience. A plant director sees one plant, a sales director one company, an area manager one dealer region, and the board the whole group.

Inside the report

Ten pages, as rendered.

Captured in Power BI Desktop with FY2026 to September selected, all companies. Every page carries a footer stating that the client is fictional and the data synthetic. Select an image to open it at full size.

Report cover on the brand gradient: 'Group performance report' for SODOLO Automotive Manufacturing Co., Ltd., marked fictional, with eleven page tiles, each showing its business question, and a footer stating that the data is synthetic.
The cover. Eleven pages, each named by the question it answers, with the period, the source and the data status on the first screen.
Group Pulse page: a headline on growth without profit, six KPI tiles with change against prior year and budget, revenue and EBIT margin by year, the EBIT bridge from budget to actual, a table of KPIs against target and four forward-looking tiles.
Group Pulse, for the chief executive and the board. The headline is a sentence: units up 28%, EBIT margin down from 7.3% to 2.5%. Eleven of twelve KPIs miss their target or budget, listed worst first.
Profitability and Mix page: five KPI tiles, a net revenue bridge from the prior year, an EBIT margin walk from FY2023, contribution per vehicle by model and channel, incentives per vehicle by model, and revenue growth reported against constant currency.
Profitability and Mix, for the CFO. Each fleet pickup loses $1,129 while an SUV sold through a dealer earns $6,492, and currency hid 6.2 points of growth between FY2023 and FY2025.
Sales and Dealer Network page: five KPI tiles, order-to-delivery days by model, cancelled D7 orders by year and reason, on-time-in-full delivery by month, cars shipped minus cars sold by region and quarter, and D5 dealer stock days by region.
Sales and Dealer Network. Buyers of the D7 SUV wait 57 days and 3,629 orders were cancelled. In the South, dealers were shipped 1,644 more cars than they sold in one quarter.
Manufacturing Operations page: six KPI tiles, utilisation by shop and year, OEE by plant and year, downtime hours by reason and plant, preventive maintenance orders against breakdown hours at plant 1020, and the cost of the maintenance cut by year.
Manufacturing Operations. The paint shop is at 96% of capacity. At plant 1020, a 40% cut in preventive maintenance saved $2.1M and cost $9.9M in repairs and overtime.
Supply Chain and Quality page: six KPI tiles, monthly line-stop minutes against the harness supplier's on-time delivery, critical suppliers by premium freight, the correlation of supplier delivery with dealer delivery up to four months later, paint first-time-through by month and paint claims per 1,000 by build quarter.
Supply Chain and Quality. One harness supplier fell to 69% on time in FY2024. Cars built from July 2024 to March 2025 drew 30.3 paint claims per 1,000, twice the 14.9 of FY2023 builds.
EV and Battery Programme page: six KPI tiles, EV units per quarter against the business case, contribution per EV by quarter, battery cost per kWh against plan, battery plant utilisation by quarter, and a panel stating what this means and the decision.
EV and Battery Programme. Sales run at 51% of the business case and the battery plant at 37% of capacity. The page ends with the decision: fill the plant before adding capacity.
Working Capital page: six KPI tiles, days sales outstanding by dealer region, inventory by stage at each month-end, overdue dealer receivables by region, the cash conversion cycle by year and components idle for more than 180 days.
Working Capital. South dealers take 37 days to pay, up from 18, and hold 95% of overdue dealer receivables — the cash cost of the stock push.
Watch List page: dealer orders past their confirmed date with the reason each was flagged, suppliers delivering under 90% on time, dealers more than 30 days overdue, and a panel explaining the rules. Every dealer and supplier name is generated.
Watch List, for the people who act this week. Three lists sorted by money at risk, each row with the reason it was flagged. Every dealer and supplier name was generated by the script.
Metric Glossary and Data Notes page: a catalogue of metrics with definition, SAP source table and owner, a panel on how the report is built, and data notes stating that the data is 100% synthetic.
Glossary and Data Notes. Each metric has one definition, an owner and the SAP table it comes from, so a figure can be traced to its source.

Outcome

What the build delivers.

50 → 32 SAP-format tables turned into a star schema
122 automated data checks, none failing
8 business stories traced to their cause
12 business questions answered within three clicks

For technical readers

How it was built.

The data layer, the model and the report as code, and the checks every change had to pass.

How the SODOLO report gets from SAP-format tables to a Power BI report An extract of 50 tables in SAP S/4HANA format covers finance and sales, plants and purchasing, and feeds from other systems such as the manufacturing execution system, the dealer management system and warranty. A transform resolves keys, signs and exchange rates and loads a star schema of 13 dimensions and 19 fact tables. 122 automated data checks then run in three groups: 81 on structure, 8 reconciliations back to the general ledger and 33 that prove the planted business stories. Only when all pass is the data committed and read by the semantic model, written in TMDL with 544 measures, and the report, written in PBIR with 15 pages. A failing check sends the work back to the transform. Claude Code wrote the generator, the transform, the checks and the model and report generators; I set the questions and reviewed the result. Extract · 50 tables Finance and sales ACDOCA · VBRK · VBAK Plants and purchasing AFRU · MATDOC · EKPO Other systems MES · DMS · warranty Transform Transform to star Keys · signs · FX Star schema 13 dimensions 2 keep history (SCD2) 19 fact tables Group USD + local Data checks · 122 Structure 81 · keys and history Reconciliation 8 · back to the ledger Planted stories 33 · each story proven Model and report Semantic model TMDL · 544 measures Report PBIR · 15 pages A failing check stops the commit — the script is fixed and all 122 run again Written by Claude Code · questions and review are mine The data generator · the transform · the checks · the model and report generators
The path from the extract to the report. The data checks sit between the star schema and the model: new data is committed only when all 122 pass. Claude Code wrote the scripts; I set the questions and reviewed the result.

Every layer is a script

Nothing in the report was built by dragging visuals onto a canvas. Claude Code wrote Python that generates each layer as text files: the SAP-format extract, the transform to the star schema, the semantic model as TMDL and the report as PBIR. Rebuilding any layer is a script run, and every change is a reviewable diff in Git.

  • Data: a generator in which the tables are linked by cause and effect — supplier delivery drives line stops, line stops drive late deliveries to dealers, paint rework takes capacity from the model in highest demand. It writes 50 tables and about 2.6 million rows, the same on every run.
  • Star schema: 13 dimensions and 19 fact tables joined on surrogate keys, with full history on two dimensions.
  • Semantic model: 42 tables, 83 relationships, 544 measures in display folders that follow the KPI tree, dynamic row-level security at group, company, plant and dealer-region level, and a Time Comparison calculation group that gives every KPI its prior-year and target comparison.
  • Report: 12 pages and 3 tooltip pages on the EthanCorp design system. Chart titles are measures, so the sentence above a chart changes with the year selected.
  • Verification: 122 data checks, the PBIR validated against Microsoft's published JSON schemas, the model loaded through the Tabular Object Model, and Power BI Desktop opened, refreshed and captured page by page for review. Twelve business questions were then checked against the screenshots; each is answered within three clicks of the cover.
  • Process: one feature branch per phase, 33 commits between 9 October and 9 November 2026.

Constraints

  • The extract is simulated. Getting data out of a live SAP system — the interface, the schedule, the authorisations — is not exercised here, and on a real project it is a large part of the work.
  • Synthetic data is cleaner than real data. The awkward parts were written in on purpose: cancelled invoices and their reversals, credit memos, deletion flags, year-end write-downs. They are the ones I thought of, not the ones a real system would surprise me with.
  • The twelve questions were checked by the assistant against screenshots, not by people who did not know the answers. Until a real viewer has run them, the claim is that the answers can be found, not that people find them.
  • Access by role is defined for fourteen invented users. How it maps to real accounts is decided when a report is deployed for an organisation.
  • The published copy on the Power BI Service opens only for people I have given access to.

Lessons

What I would tell the next team.

  • Reconcile to the ledger before you draw anything. A margin report that Finance cannot tie to the general ledger gets argued about, not used, and the argument is cheaper to settle in a script than in a board meeting.
  • Put the leading indicator next to the result. Supplier delivery moved two months before deliveries to dealers did, and the maintenance budget was cut a year before the breakdowns peaked. A report that shows only the result tells you what has already been lost.
  • Model the chain of cause, not the source tables. The stories here cross purchasing, production, sales, warranty and finance. A report organised as one page per SAP module would have every number and none of the causes.
Dat Tran, founder of EthanCorp

Dat TranEnterprise Data & AI Analytics Architect — the person behind EthanCorp.

All case studies

Questions

Common questions about the SODOLO report.

Can I open the report?

It is published on the Power BI Service, and access is by invitation. If you would like to explore it, ask through the contact page and I will share it with you.

Is this connected to a real SAP system?

No. The data is synthetic and laid out in SAP S/4HANA table and field formats. On a real project the extract comes from your system through an interface agreed with your SAP team, and the transform is adapted to your configuration and custom fields.

Could EthanCorp build this on our data?

Yes — that is the service this demonstrates. On real data the work usually starts with a fixed-scope review: the Integration & Migration Review for the source side, or the KPI Definition Audit for the definitions. That is where real projects spend their time, and where synthetic data cannot help.

Have a data, analytics or automation problem that should not need another workaround?

Tell me what is breaking and what you have already tried. If EthanCorp is not the right fit, I will say so and point you somewhere better.

Response time
Within two business days
Based in
Ho Chi Minh City, Vietnam — working across Asia and remote