How does Power BI actually connect to JD Edwards?
Through the database underneath the application, because Power BI ships no JD Edwards connector and does not need one. EnterpriseOne stores business data in ordinary relational tables on Oracle Database, Microsoft SQL Server or IBM Db2 for i, and Power BI reaches each of those with a standard connector through an on-premises data gateway. World is IBM i only, so it always takes the Db2 route. The JDE application layer — security, business functions, the data dictionary — is bypassed entirely, which is why the modeling work described further down exists: the database knows nothing about what a UDC means or how many decimals an amount carries.
Two decisions shape the rest of the project. The first is direct read versus extract. A read-only login against the production schema is the fastest start and fine for most mid-market volumes in import mode, but some DBAs will not permit any external reader on the transactional database, and a nightly extract into a SQL Server or warehouse copy you own is the right answer there. The second is the driver on the gateway machine: Microsoft's Oracle Database connector (opens in new tab) requires Oracle Client for Microsoft Tools to be installed wherever the connection runs, and Db2 for i normally needs IBM's ODBC driver. Neither is difficult, but both are the sort of thing that costs a week when nobody owns it.
JD Edwards access routes and when each one is the right choice
| Route |
What it is |
When we use it |
| Oracle Database connector |
Power BI's native Oracle connector reading the EnterpriseOne business data schema under a read-only account |
The default for E1 on Oracle — import mode, refreshed through the gateway off-peak |
| SQL Server connector |
The same pattern against E1 installed on Microsoft SQL Server, optionally through DBA-owned views |
E1 on SQL Server, or any JDE extract landed into a SQL Server reporting database |
| IBM Db2 for i |
The Db2 or ODBC connector reading JDE libraries on IBM i, using IBM's driver on the gateway machine |
JD Edwards World, and EnterpriseOne installations that kept the IBM i database |
| Scheduled extract |
A nightly job copying the tables the model needs into a SQL Server, Fabric or warehouse database you own |
Where the DBA will not allow external reads on production, or history should be retained beyond JDE purges |
| Orchestrator and AIS REST |
EnterpriseOne's REST services exposing orchestrations and application queries over HTTPS |
Small, near-real-time reads such as today's order status; not a bulk extraction route for the ledger |
| An existing warehouse copy |
JDE already landed into SQL Server, Snowflake, Databricks or Microsoft Fabric by an internal pipeline |
Always our first question — it is faster to refresh, cheaper to model and easier to join to non-JDE data |
A note on DirectQuery, because it is often the first thing a JDE administrator asks for. It keeps every visual as a live query against your ERP, which is exactly the load most sites want to avoid, and the Julian and UDC decoding has to be pushed into views for it to perform. We choose import mode unless there is a real current-minute requirement; the trade-offs are set out in Microsoft's DirectQuery documentation (opens in new tab) and in our own guide to DirectQuery vs Import mode.
Why do JDE tables need decoding before they can be modeled?
Because the schema was designed for the application, not for a person reading it, and three conventions in particular defeat a straight load into Power BI. Each is mechanical once you know it, and each is invisible until you do — the classic symptom is a dashboard whose revenue is a hundred times too large and whose dates all fall in the 1970s.
The JD Edwards conventions we resolve in Power Query before modeling
| Convention |
What you see in the table |
What we do with it |
| Julian dates (CYYDDD) |
A six-digit integer: century digit, two-digit year, day of year. 124001 is 1 January 2024; 0 means no date |
Converted to a true date column, zero mapped to blank, then related to one date table built on your fiscal date pattern (F0008) |
| Implied decimals |
Amounts and quantities stored as whole numbers; 1250000 may mean 12,500.00 |
Divided by the display decimals defined in the data dictionary for each field, checked against a JDE report before anything else is built |
| User defined codes (UDCs) |
Short codes such as SO, 520, 999 in status, type and category columns; descriptions live in F0005 keyed by system, record type and code |
Trimmed and joined to F0005 descriptions, so a slicer shows “Sales Order” and “Invoiced” instead of codes |
| Column prefixes |
Every column carries a two-character table prefix: GLAA, SDAN8, ABALPH, IMLITM |
Renamed to business names with the prefix dropped, and documented in a mapping you keep |
| Ledger types |
F0911 and F0902 rows for AA (actual), BA (budget), CA (foreign currency) and others sit in the same table |
Filtered and separated so actuals, budget and currency views are explicit measures, never accidentally summed |
| Account structure |
Business unit, object and subsidiary held as separate columns and as a short account ID |
Joined to the account master into a hierarchy — company, business unit, object, subsidiary — with level-of-detail used for subtotals |
The Julian conversion itself is a one-line Power Query expression — #date(1900 + Number.IntegerDivide(j, 1000), 1, 1) + #duration(Number.Mod(j, 1000) - 1, 0, 0, 0) with a guard for zero — but it has to be applied to every date column on every table, and the fiscal calendar has to be built from your date pattern rather than the calendar year, or period-to-date figures will never match the JDE financial reports your controller already trusts. The padded-key problem on UDC joins is the other one that quietly ruins a first attempt: the code column in F0005 is space-padded, so a join on the raw value returns nothing and every description comes back blank.
Which JD Edwards tables sit behind the dashboard?
A short list, in practice. JDE has thousands of tables, but a finance and operations pack draws on a couple of dozen, and the ones below cover the large majority of what leadership asks for. We confirm exact names against your installation during scoping, because customized systems sometimes carry the same data in a custom table with a different number.
Core JD Edwards tables and their role in the Power BI model
| Table |
What it holds |
Role in the model |
| F0911 Account Ledger |
Every posted and unposted journal line, with GL date, ledger type, account, amount and document |
The finance fact table — P&L, cost centre and drill-to-transaction reporting |
| F0902 Account Balances |
Period buckets of net postings per account, ledger type and fiscal year, plus the prior-year cumulative |
Fast balance-sheet and trend reporting where transaction detail is not needed |
| F0901 Account Master and F0006 Business Unit Master |
Chart of accounts with object, subsidiary and level of detail; business units with company and category codes |
Account and business unit dimensions — the hierarchy every finance page rolls up through |
| F4211 Sales Order Detail |
One row per order line: customer, item, branch, quantity, unit price, unit cost, statuses and request, promise and ship dates |
The sales fact — revenue, gross margin, open orders, backlog and on-time delivery |
| F4201 Sales Order Header and F42119 Sales Order History |
Order-level attributes, and lines moved out of F4211 by sales update |
Header attributes joined to the detail; history appended so closed periods stay reportable |
| F4101 Item Master and F4102 Item Branch |
Item numbers, descriptions and sales and purchasing category codes; per-branch planning and GL class |
Item dimension — the category codes are usually the best product hierarchy you already have |
| F41021 Item Location and F4111 Item Ledger |
Quantity on hand, committed and on order by location; the Cardex of every inventory movement |
Inventory snapshot and movement facts — turns, aging and dead stock |
| F0101 Address Book |
One record per customer, supplier, employee and business unit address, with search type and category codes |
Customer and supplier dimensions, both cut from the same address book by search type |
| F4311 Purchase Order Detail and F0411 AP Ledger |
Purchase lines with supplier, item, quantities and dates; supplier invoices and payments |
Purchasing and payables facts — vendor lead time, price variance and AP aging |
| F03B11 Customer Ledger |
Customer invoices and receipts in EnterpriseOne (F0311 in World) |
Receivables fact — AR aging, days sales outstanding and collection trend |
Modeled this way, the JDE schema turns into a conventional star: F0911 and F4211 as facts, the account, business unit, item, address book and date tables as dimensions. That is the pattern in Microsoft's star schema guidance (opens in new tab), and the general craft is walked through in our star schema guide. The detail worth calling out is the address book: because customers, suppliers and employees share one table, it has to be filtered by search type into separate dimensions, or a supplier slicer will offer you your own staff.
What changes between JD Edwards World and EnterpriseOne?
Less than you might expect at the table level, which is the good news for World sites that have put off reporting. EnterpriseOne inherited World's schema, so F0911, F4211, F4101 and F0101 carry the same names and largely the same columns, and Julian dates, implied decimals and UDCs are identical conventions on both. The differences that matter for a Power BI build are about where the data sits and how it is reached.
How a JD Edwards World build differs from an EnterpriseOne build
| Aspect |
JD Edwards World |
JD Edwards EnterpriseOne |
| Database |
IBM Db2 on IBM i only |
Oracle Database, SQL Server or Db2 for i, chosen at installation |
| Connector and driver |
Db2 or ODBC connector with IBM's driver on the gateway machine |
Native Oracle or SQL Server connector, or the Db2 route above |
| Where the tables live |
Libraries on IBM i, one per environment |
Schemas per data source, typically a production business data schema and a control schema for UDCs |
| Customer ledger |
F0311 |
F03B11, with a different structure for invoices and receipts |
| REST access |
None natively |
Orchestrator and AIS REST services, useful for small near-real-time reads |
| Modeling approach |
The same: Julian conversion, decimal restoration, UDC decoding, then a star schema over the ledger, order and item tables |
Sites in the middle of a World-to-EnterpriseOne upgrade, or running both during a transition, are a case we scope explicitly. Because the model is built on business names rather than physical table locations, repointing it from one environment to the other after the upgrade is a Power Query change, not a rebuild.
Which measures does the dashboard carry?
The set below is what finance and operations leadership at JDE sites consistently ask for, and each embeds a definition someone has to agree before the number means anything. We write them as documented DAX measures over the star schema and the fiscal date table, then validate every total against a JDE report or an existing spreadsheet your team already trusts — the ledger against the trial balance, sales against the sales update, inventory against the stock status report. That discipline is the Power BI data modeling and DAX work every build sits on.
Core measures we build over the JD Edwards model
| Measure |
Source tables |
How it is defined |
| Net income and P&L by business unit |
F0911, F0902, F0901, F0006 |
Actual ledger only, rolled up through object and subsidiary, by fiscal period from your date pattern |
| Budget vs actual |
F0902 (AA and BA ledger types) |
Budget ledger against actual per account and period, with variance and variance percent as explicit measures |
| Revenue and gross margin |
F4211, F42119 |
Extended price less extended cost per invoiced line, by customer, item category, branch and salesperson |
| Open orders and backlog |
F4211 |
Lines whose next status precedes invoicing, valued at extended price, aged from request date |
| On-time shipment |
F4211 |
Actual ship date against promised date and against requested date, reported separately because they are different questions |
| Inventory value and turns |
F41021, F4111, F4102 |
On-hand quantity at unit cost by branch and location; cost of goods over average inventory for turns |
| AR and AP aging |
F03B11, F0411 |
Open amounts bucketed from due date as of the selected date, so month-end aging is reproducible |
| Vendor lead time and price variance |
F4311, F4101 |
Receipt date less order date per supplier; PO unit cost against the item's standard cost |
How are refresh, the gateway and security set up?
The model is published to your Power BI workspace and refreshed through an on-premises data gateway installed on a server that can see the JDE database — configuration is covered in Microsoft's on-premises data gateway documentation (opens in new tab) and our own gateway setup guide. Refresh runs on a schedule that matches how the data moves, usually nightly after the JDE batch jobs finish, and on the ledger and sales history tables we configure incremental refresh (opens in new tab) so only recent periods are re-read from the database each cycle. That is what keeps a multi-year F0911 from turning every refresh into a full table scan of production.
Security follows the structure JDE already uses. Row-level security is driven by company and business unit, so a plant controller sees their business units, a regional sales manager sees their branches and the CFO sees everything, all from one published report. Where JDE row security or a multi-company setup already encodes those rules, we mirror them rather than inventing a second set. Everything is under credentials your administrator provisions, and the model, the report and the documentation are yours from day one.
What does the build cost, and how long does it take?
Prepaid Flex hours that never expire: Starter 20 hours at $125/hr ($2,500), Growth 40 hours at $115/hr ($4,600), Power 80 hours at $100/hr ($8,000), with hourly work from $100/hour on the largest block. A first build covering the connection, the Julian and UDC decoding, the ledger and sales order facts and their shared dimensions, plus the finance and sales pages, usually fits a Growth block, because the decoding and validation are front-loaded. A narrower build — one fact, one subject area, from a database your DBA has already exposed through views — can fit Starter. Adding inventory, purchasing and receivables, or reconstructing history from a warehouse copy, typically takes the work into a Power block.
Most tasks ship within 3–5 business days of scope approval, and you get a scope and hours estimate before anything starts. Our guide to Power BI dashboard development cost covers what moves the number, how prepaid Flex hours work explains the model in full, and custom Power BI dashboard development describes the wider service this build sits inside. There is no warehouse programme to fund first, and no packaged JDE content to license.
Who is this for, and where do the neighbouring pages fit?
Manufacturers, distributors, and construction and real estate businesses running EnterpriseOne or World with a controller, operations director or IT manager who is tired of re-keying JDE reports into spreadsheets each month. The industry framing for those sectors is on Power BI for manufacturing and logistics and Power BI for wholesale distributors, and the finance pack that usually comes first — budget vs actual, cash, aging — is described on Power BI for finance teams.
Two adjacent pages are worth distinguishing. If your reporting data already sits in a SQL Server database that is not an ERP, or you want the generic database route without any of the JDE-specific decoding, our SQL Server Power BI dashboard development page covers that: views, storage mode, gateway and refresh for any schema. This page is the ERP-schema-specific version. And if what you are really replacing is Oracle Business Intelligence sitting on top of JDE — an RPD, Answers and dashboards — the OBIEE to Power BI migration page covers rebuilding that BI layer; the source-system work here is the same either way, and the two are frequently one engagement. Contact is form-only — send your request and we'll reply with a scope estimate.