BPJA table — BPJA - Project Budget Totals by Fiscal Year
BPJA is the CO/PS totals table holding the cumulative project budget amount for one object (typically a WBS element), one fiscal year, and one value type such as original budget, supplement, return, or transfer. It is built by summing individual budget postings, not by storing them, and it feeds availability control and budget reporting rather than showing who posted what and when.
This page covers what a row in BPJA actually represents, the fields worth restricting a query on, and the joins used to trace a budget figure back to its WBS element or forward to actual costs. It focuses on the ways this totals table gets misread during budget-versus-actual investigations and availability control disputes.
Reviewed by an ERPClimb SAP consultant on 15 Sept 2026· 1,160 words
What it stores
Each record in BPJA represents the total budget value for one CO object, usually a WBS element though the same generic object-number key can also point to a network header or an internal order, for one fiscal year and one value type, summed across every budget posting made against that object in that year. It is a totals table, not a document table: individual budget transactions entered through the project budgeting transactions are aggregated here so reporting and availability control do not have to re-sum every posting each time they run. A row does not record who posted the last change or when. Original budget, supplements, returns, and transfers each produce their own value-type row rather than being netted into a single figure, which is the single most important thing to remember before drawing conclusions from this table.
Key fields
- MANDT - client
- OBJNR - generic object number key; resolves to a WBS element via PRPS, or to a network or order via the corresponding object tables
- GJAHR - fiscal year the totals row belongs to
- WRTTP - value type distinguishing original budget from supplement, return, and transfer postings; one object and year produces several rows, not one
- TWAER - transaction currency of the amounts stored in the row
- period and annual value fields - the cumulative budget amount broken down by period and held in transaction currency, object currency, and controlling area currency, rather than as a single net figure
How it joins the data model
- BPJA-OBJNR = PRPS-OBJNR - resolves the totals row to the WBS element it was budgeted against
- BPJA-OBJNR = PRHI-OBJNR via the project hierarchy - lets a report roll a budget figure up from an individual WBS element to its parent or to the whole project
- BPJA-OBJNR = PROJ-OBJNR - relevant only when budget is held at the project definition level rather than on individual WBS elements
- BPJA-OBJNR = COSPD-OBJNR matched on GJAHR - the standard route to a budget-versus-actual comparison, since COSPD carries the actual and commitment totals for the same object
- BPJA and BPGE share the same OBJNR and WRTTP key but BPGE carries no GJAHR - use BPGE for a lifetime budget figure and BPJA when the figure has to be broken down by fiscal year
How to read it safely
Always restrict on MANDT first, then narrow OBJNR before touching this table directly, since it sits under every project in the controlling area. The practical path is to look up the WBS elements for a project in PRPS, collect their object numbers, and only then select from BPJA; selecting on GJAHR or WRTTP alone with no object restriction returns an unusable volume of rows. Because amounts are split across three currencies and across value types, a raw SE16 dump rarely answers a business question on its own; the standard PS or CO reporting transactions already apply the correct summation logic and currency selection, and reproducing that logic manually is where most reading errors start.
How to prove it in the data
Symptom: a project team insists budget was never entered for a WBS element that is nonetheless throwing an availability control error. Resolve the WBS element to its object number in PRPS, then select BPJA for that OBJNR across all GJAHR and WRTTP. A genuine no-budget situation shows no row at all for the value type reserved for original budget in that fiscal year. A row that exists with a zero total still counts as budget entered and is a different problem, usually a budget that was posted and then fully returned or transferred out.
ECC vs S/4HANA
BPJA is a classic CO/PS totals table that predates the S/4HANA universal journal design, and it continues to exist and be updated for project budgeting on S/4HANA. Project budgeting has not been absorbed into the universal journal the way actual and plan line items have for other CO areas, so there is no known compatibility view that fully replaces BPJA. S/4HANA increasingly surfaces the same figures through CDS-based reporting and Fiori apps built on top of the table, which is the preferred way to query it rather than a direct table read.
Common pitfalls
- Treating BPJA as if it held one net budget figure per object and year: it holds one row per value type, so reading only the original budget row while ignoring supplement, return, and transfer rows understates or overstates the current budget.
- Reading the table directly and picking the wrong currency field: the period and annual amounts are stored in transaction, object, and controlling area currency, and mixing them up produces numbers that look duplicated or scaled incorrectly.
- Assuming a missing row means zero budget: no row exists at all until a budget document of that value type has been posted, which looks identical to a genuine zero unless the underlying budget documents are also checked.
- Comparing BPJA to COSPD actual figures at mismatched granularity: budget is often carried at a higher WBS level than actual costs are posted at, so a line-by-line comparison silently misses cost that is covered further up the hierarchy.
- Believing BPJA is always current: totals only reflect the last update run for that fiscal year, so a recent budget change that has not gone through the relevant year-end or carryforward step can leave BPJA out of step with what availability control is actually enforcing.
- Editing or deleting rows directly in BPJA to fix a discrepancy: this breaks the link between the totals table and the underlying budget documents and corrupts availability control until the totals are rebuilt through the proper transaction.
Whose problem this is
A discrepancy traced to BPJA is a PS functional consultant question first, since budget structure and value types are configured and posted through project budgeting, with FI/CO controlling brought in when currency translation or value type meaning is disputed. Corrections are made by reposting, returning, or transferring budget through the standard budgeting transactions, never by editing the totals table.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/bpjaERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.