🏦 What Are BKPF and BSEG, and Why Does Every SAP Finance Person Need to Know Them?
Today we are discuss BKPF vs BSEG Real Difference? Every time money moves in a company that uses SAP - whether it is paying a vendor, booking a salary, receiving a customer payment, or posting a journal entry - SAP writes a permanent record called a Financial Accounting Document. This one document is actually stored across two tables: BKPF and BSEG. Think of it like a restaurant bill - the top of the bill shows the table number, date, and waiter name (that is BKPF), and the bottom shows each dish you ordered with its price (that is BSEG). You need both parts together to understand the full picture. These two tables are the backbone of SAP FI - every report, every audit, every reconciliation, every payment trace ultimately comes back to BKPF and BSEG. If you work in SAP FI, you will query these tables every single week of your career.This tutorial or document breaks down the process step by step, using simple language and real-world examples to help you master the skill.
One row per accounting document. This is the "who posted it, when, and what kind of document is it" table. It holds the document header - the overall summary information that applies to the whole transaction, not the individual line items.
Multiple rows per accounting document. This is the "what accounts were debited and credited, by how much" table. Every single line item in a document - every debit and every credit - gets its own row here.
They Share One Key
BKPF and BSEG are always joined using Company Code + Document Number + Fiscal Year. This is how SAP links the document header to its line items.
Both Are Permanent
Once posted, neither table can be changed. A mistake is fixed by posting a reversal - which creates a new document in both tables. The original stays forever.
Always Used Together
In audit reports and queries you almost always JOIN BKPF with BSEG. BKPF alone tells you a document exists. BSEG alone tells you amounts but not who posted or when.
🔎 What Exactly Is Stored in Each Table? (Every Important Field Explained Simply)
Instead of showing you a boring list of field names, let us walk through both tables using the example of a real invoice payment: Rajan Manufacturing Ltd in Pune pays their electricity bill of ₹1,85,000 to MSEDCL (Maharashtra State Electricity Distribution Company). The accountant posts this in SAP using T-code FB60. Here is exactly what gets written into BKPF and BSEG.
| Field Name | What It Means in Plain English | Value in Our Example |
|---|---|---|
| BUKRS | Company Code -which company in SAP posted this. Rajan Manufacturing is company code 1100. | 1100 |
| BELNR | Document Number -SAP automatically assigns this unique number when you save. Think of it as the receipt number. | 1900012344 |
| GJAHR | Fiscal Year -which financial year this belongs to. Together with company code and document number, this makes the document 100% unique in the system. | 2025 |
| BLART | Document Type -what kind of financial document is this. KR = Vendor Invoice, KZ = Vendor Payment, SA = G/L Posting, DZ = Customer Payment. This is one of the most important fields for filtering. | KR (Vendor Invoice) |
| BLDAT | Document Date -the date on the actual paper invoice you received. This is what the vendor wrote on their invoice. | 28-Apr-2025 |
| BUDAT | Posting Date -the date the transaction is recorded in the financial books. This affects which accounting period it falls into -a critical field for month-end reporting. | 30-Apr-2025 |
| CPUDT | Entry Date -the exact calendar date when the accountant sat down and typed this into SAP. SAP sets this automatically from the computer clock and no one can change it. This is the most trusted date for audit purposes. | 02-May-2025 |
| CPUTM | Entry Time -the exact time the document was saved in SAP, right down to the second. Together with CPUDT, this creates a perfect timestamp that cannot be manipulated. | 11:24:37 |
| USNAM | Username -the SAP user ID of the person who posted this document. This is the audit trail field -it tells you exactly who touched this transaction. | ACCOUNTS.PRIYA |
| TCODE | Transaction Code -which SAP screen the user used to post this. FB60 = post vendor invoice. FB01 = manual journal entry. F110 = automatic payment run. Auditors check this to see if a transaction was posted the normal way or via a back-door method. | FB60 |
| WAERS | Currency -the currency of the document. INR for Indian Rupee, USD for US Dollar, EUR for Euro. | INR |
| XBLNR | Reference / External Document Number -the vendor's own invoice number. This helps match SAP documents to the actual paper invoices during reconciliation. | MSEDCL/APR25/7823 |
| BKTXT | Document Header Text -a free-text description the accountant types when posting. Useful for explaining what the transaction is about, though some companies leave this blank. | Electricity Apr-2025 |
| STBLG | Reversal Document Number -if this document was later reversed (cancelled), SAP puts the reversal document number here. If this field is blank, the document has never been reversed. | (blank -not reversed) |
Key insight about dates: BLDAT is the date on the vendor's paper invoice (you control this). BUDAT is the date you choose to book it in SAP (you control this). CPUDT is the date SAP records it automatically (nobody can change this). For fraud investigation and audit purposes, always use CPUDT -it is the one date that cannot be backdated or manipulated by any end user.
| Field Name | What It Means in Plain English | Line 1 (Vendor) | Line 2 (Expense) |
|---|---|---|---|
| BUZEI | Line Item Number -the sequence number of this line within the document. Line 1 is the vendor payable, Line 2 is the expense account. | 001 | 002 |
| KOART | Account Type -K = Vendor, D = Customer, S = G/L Account, A = Asset, M = Material. This tells you what kind of account this line item belongs to. | K (Vendor) | S (G/L Account) |
| LIFNR | Vendor Number -the SAP vendor master number for the party you are paying. This is only populated on vendor lines (KOART = K). The vendor MSEDCL has number V-002341. | V-002341 | (blank) |
| HKONT | G/L Account -the general ledger account number that this line posts to. 160000 might be "Accounts Payable – Vendors", 402000 might be "Electricity Expense". Every line item must go to a G/L account. | 160000 (Payable) | 402000 (Expense) |
| DMBTR | Amount in Local Currency -the transaction amount in your company's base currency (INR for Indian companies). This is the main amount field -the actual rupee value of this line. | ₹1,85,000 | ₹1,85,000 |
| SHKZG | Debit/Credit Indicator -S = Debit (Soll), H = Credit (Haben, the German word for "have"). SAP uses German convention here because it was built in Germany. S increases expense accounts and decreases liability accounts. | H (Credit) | S (Debit) |
| KOSTL | Cost Centre -which department or cost centre this expense belongs to. Electricity for the production floor goes to cost centre 1000 (Production). This is how management accounting reports are built. | (blank) | PROD-1000 |
| MWSKZ | Tax Code -the VAT or GST code applied to this line. V1 might mean 18% GST Input, V0 means zero-rated. SAP uses this to calculate tax amounts automatically. | V1 (18% GST) | (blank) |
| ZUONR | Assignment -a reference field often used to store the vendor invoice number, cost object reference, or any string that helps link this line to external systems. Companies use this field in many creative ways. | MSEDCL/APR25 | APR-2025-ELEC |
| SGTXT | Item Text -a free-text note specific to this individual line item (different from the document header text in BKPF). Useful for explaining why this specific line exists. | MSEDCL April 2025 | Factory electricity Apr |
| ZTERM | Payment Terms -the agreed payment terms with the vendor. Z030 might mean "Pay within 30 days." This is used by SAP to calculate the due date for automatic payment runs (F110). | Z030 | (blank) |
| AUGDT | Clearing Date -the date when this open item was cleared (paid). Empty means the invoice has not been paid yet. Filled means it has been cleared -with a reference to the clearing document. | (blank -unpaid) | (blank) |
The Golden Rule of Double-Entry Accounting in BSEG: For every document, the sum of all DMBTR values where SHKZG = 'S' (Debit) must exactly equal the sum of all DMBTR values where SHKZG = 'H' (Credit). SAP will not let you post a document where this is not true -it will throw an error. This is how SAP enforces double-entry bookkeeping automatically. If your BSEG query returns a document where debits do not equal credits, something has gone seriously wrong in the system configuration.
🔍 Real Scenario: "Who Posted This Invoice, and Why Was the Amount Different?"
The most common real-world reason you will open BKPF and BSEG is to trace a suspicious or disputed financial document. Here is a real situation that happens in many Indian companies every month.
Pramod Steel Industries – Finance Team Investigates a Duplicate Vendor Payment
The accounts payable manager at Pramod Steel Industries in Raipur gets a call from their vendor Sharma Iron Suppliers saying they have received two payments of ₹3,42,000 each for the same invoice INV-2025-0334. The vendor is asking for a refund of the duplicate payment. The finance manager needs to trace exactly what happened - which documents were posted, who posted them, when, and whether there was an error or fraud.
The finance manager opens T-code FBL1N (Vendor Line Item Report) and enters the vendor number for Sharma Iron Suppliers. She selects "All Items" and enters the date range April/May 2025. SAP shows her all line items from BSEG for this vendor. She immediately sees two cleared items -both for ₹3,42,000, both referencing external document INV-2025-0334 (stored in BKPF.XBLNR). Two payments against the same invoice number - confirmed duplicate.
▶ T-Code: FBL1N · Reads: BSEG (LIFNR = vendor number, KOART = 'K') joined to BKPF on BUKRS + BELNR + GJAHRShe double-clicks the first payment document to open it in FB03. SAP shows the BKPF header: Document Type KZ (Vendor Payment), Posting Date 15-May-2025, Entry Date 15-May-2025, Username ACCOUNTS.SUNIL, T-Code F110 (automatic payment run). This is the legitimate payment - posted by the automatic payment program F110 as expected. She opens the second document: Document Type KR (Vendor Invoice), Posting Date 15-May-2025, Entry Date 15-May-2025, Username ACCOUNTS.SUNIL, T-Code FB60 (manual invoice entry). This is the problem -someone manually re-entered the invoice on the same day the automatic payment ran.
▶ T-Code: FB03 · Reads: BKPF (BELNR = document number) · Key fields: BLART, USNAM, TCODE, CPUDT, CPUTMUsing SE16N on table BSEG, she filters by BELNR = the second document number and BUKRS = 1200 (Pramod Steel's company code). The result shows two line items: Line 001 -KOART = K (Vendor), LIFNR = Sharma Iron Suppliers, DMBTR = ₹3,42,000, SHKZG = H (Credit -meaning SAP owes the vendor). Line 002 -KOART = S (G/L Account), HKONT = 260000 (Raw Materials expense), DMBTR = ₹3,42,000, SHKZG = S (Debit -expense booked). The duplicate invoice has correctly posted to both accounts -the money has left the company and gone to the vendor. This was not a system error -it was a human error.
▶ SE16N on BSEG · Filter: BUKRS + BELNR · Key fields: KOART, LIFNR, HKONT, DMBTR, SHKZGThe CFO authorises reversal of the manually-entered duplicate invoice using T-code FB08. SAP creates a new reversal document that exactly mirrors the original - it credits the expense account and debits the vendor payable, zeroing out the erroneous posting. Both the original document and the reversal document now permanently exist in BKPF and BSEG -the field BKPF.STBLG (Reversal Document Number) on the original document now points to the reversal. The accounting books are corrected. The vendor receives a debit note for the duplicate amount.
▶ T-Code: FB08 (Reverse Document) · Creates new doc in BKPF + BSEG · Original BKPF.STBLG filled with reversal doc numberWhy did the duplicate get past the system? SAP has a "Duplicate Invoice Check" feature (configured in SPRO) that warns you if the same vendor, same amount, and same external document number are posted twice. This company had the check disabled or ACCOUNTS.SUNIL used a slightly different reference number (INV-2025-334 vs INV-2025-0334) which bypassed the check. Both the BKPF.XBLNR comparison and BSEG.DMBTR check are used by this feature. Always ensure duplicate invoice checks are active in production.
📊 Real Scenario: "Our G/L Balance Doesn't Match the Vendor Statement - Find the Difference"
Every month-end, finance teams at Indian companies do account reconciliations. When a balance in SAP does not match an external statement, BKPF and BSEG are where you go to find the gap -line by line, document by document.
Vikram Textiles Ltd - Accounts Payable Reconciliation for April 2025
The finance controller at Vikram Textiles Ltd in Surat runs the month-end AP reconciliation for April 2025. The SAP balance in account 160000 (Accounts Payable - Creditors) shows ₹2.87 crore as the closing balance. But the manually maintained vendor statement summary shows ₹2.93 crore. There is a gap of ₹6 lakh. The controller needs to find which document or documents explain this difference.
The controller opens FBL3N (G/L Account Line Item Report), enters account 160000, company code 1500 (Vikram Textiles), and sets the posting date to 01-Apr-2025 to 30-Apr-2025. This query reads BSEG where HKONT = '160000' and BUKRS = '1500', joined to BKPF for the posting date filter (BKPF.BUDAT). Result: 94 line items. Opening balance ₹2.42 crore. Total credits (invoices posted): ₹1.82 crore. Total debits (payments made): ₹1.37 crore. Closing balance: ₹2.87 crore -matches SAP perfectly. So the SAP figure is internally consistent.
▶ T-Code: FBL3N · Reads: BSEG (HKONT = account, KOART = 'S') joined to BKPF (BUDAT range) · Tables: BSIS (open items) + BSAS (cleared items)The controller suspects the gap might be invoices that were entered into SAP but not yet posted - they would sit in VBKPF and VBSEG (the parked document tables, not BKPF/BSEG). Using T-code FBV3 (Display Parked Documents), he finds three parked invoices totalling ₹4,12,000 dated April 2025 -they are stuck waiting for a manager's approval. These are not in BKPF or BSEG yet, so they do not appear in the SAP balance. The external statement included them because the vendors sent the invoices in April. Gap partially explained: ₹4,12,000 of the ₹6,00,000 difference.
▶ T-Code: FBV3 (Display Parked Documents) · Parked docs live in VBKPF + VBSEG - NOT in BKPF/BSEG until approved and postedThe remaining ₹1,88,000 gap must come from somewhere else. The controller looks in BKPF for documents where BUDAT (Posting Date) = May 2025 but BLDAT (Document Date / Invoice Date) = April 2025. These are April invoices that the accounts team posted late in May -they show in the vendor statement for April but in SAP's accounting balance for May. A quick SE16N on BKPF with BUKRS = 1500, BLART = 'KR', BLDAT between 01-Apr and 30-Apr, BUDAT between 01-May and 05-May finds two such documents totalling ₹1,88,000. Gap fully explained -₹4,12,000 parked + ₹1,88,000 cross-period = ₹6,00,000 total.
▶ SE16N on BKPF · Filter: BLART = 'KR', BLDAT in Apr, BUDAT in May · Key learning: BLDAT ≠ BUDAT causes period-end reconciliation differencesInterview Question This Scenario Answers: "What is the difference between Document Date, Posting Date, and Entry Date in SAP?" -Document Date (BLKPF.BLDAT) = date on the vendor's invoice. Posting Date (BKPF.BUDAT) = date it hits the G/L books and determines the accounting period. Entry Date (BKPF.CPUDT) = the actual calendar date the accountant typed it into SAP, set by the system clock. A mismatch between BLDAT and BUDAT is the single most common cause of month-end reconciliation differences -and it always lives in BKPF.
🏛️ Real Scenario: "SEBI Wants to See Every Manual Journal Entry Posted by a Specific User"
Luxi Pharmaceuticals Ltd - SEBI Query on Late-Night Manual Postings
SEBI (Securities and Exchange Board of India) has raised a query asking Luxi Pharmaceuticals to explain all manual journal entries (Document Type SA) posted between October and December 2024 by users with system administrator access. The company's internal audit team has 48 hours to produce a complete list with full document details, line item amounts, and proof of who authorised each posting.
The audit team runs SE16N on BKPF with the following filters: BUKRS = 'LPL1' (company code), BLART = 'SA' (General Ledger document type -manual journal entries), CPUDT between 01-Oct-2024 and 31-Dec-2024, USNAM = 'SYSADMIN' (the system administrator user ID). Result: 23 documents. Key BKPF fields extracted: BELNR (document number), GJAHR, CPUDT, CPUTM (entry time), BLDAT, BUDAT, BKTXT (document text), TCODE. Three documents were posted between 11 PM and midnight -immediately flagged for deeper review. BKPF gives you the complete "who, when, which transaction code" picture.
▶ SE16N on BKPF · Filters: BLART + USNAM + CPUDT range · Always start with BKPF first - it is the smaller table and has indexed fieldsThe audit team takes the 23 BELNR (document number) values from Step 1 and queries BSEG filtering by BUKRS = 'LPL1' and BELNR IN (the list of 23 numbers). This returns all the line items -every G/L account, amount, and cost centre for each of those 23 manual journal entries. The three late-night documents show: large credits to account 800000 (Revenue) and debits to account 190000 (Inter-Company Receivables). Revenue recognition entries posted manually at midnight before quarter-end -a classic revenue manipulation pattern. BSEG gives you the "what money moved, to which accounts, in which amounts" detail.
▶ SE16N on BSEG · Filter: BUKRS + BELNR IN (list) · Key fields: HKONT, DMBTR, SHKZG, KOSTL, SGTXT · Join back to BKPF on BUKRS + BELNR + GJAHRTo give SEBI the complete picture in one report, the technical team writes an ABAP program that joins BKPF and BSEG on BUKRS + BELNR + GJAHR and outputs: Document Number, Document Date, Posting Date, Entry Date, Entry Time, Username, T-Code, Document Text, G/L Account, Amount, Debit/Credit indicator, Cost Centre, Line Item Text. This combined view is what auditors want -the document header context (from BKPF) alongside the exact financial movements (from BSEG). The report is exported to Excel and submitted to SEBI within 6 hours.
▶ Custom ABAP: SELECT FROM bkpf INNER JOIN bseg ON bukrs + belnr + gjahr · OR use SQVI (Quick Viewer) to join the two tables visually without code" ═══════════════════════════════════════════════════════════════ " SAP FI Audit Query: BKPF + BSEG Join " Purpose : Extract all manual journal entries (SA) by SYSADMIN " Tables : BKPF (doc header) joined to BSEG (line items) " ═══════════════════════════════════════════════════════════════ REPORT z_bkpf_bseg_audit. "── Selection screen ─────────────────────────────────────────── SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs, s_blart FOR bkpf-blart, s_uname FOR bkpf-usnam, s_cpudt FOR bkpf-cpudt. "── Result structure ──────────────────────────────────────────── TYPES: BEGIN OF ty_result, belnr TYPE bkpf-belnr, " Document number gjahr TYPE bkpf-gjahr, " Fiscal year bldat TYPE bkpf-bldat, " Document date (on invoice) budat TYPE bkpf-budat, " Posting date (accounting period) cpudt TYPE bkpf-cpudt, " Entry date (system clock -cannot be changed) cputm TYPE bkpf-cputm, " Entry time usnam TYPE bkpf-usnam, " Who posted it tcode TYPE bkpf-tcode, " Which T-code was used bktxt TYPE bkpf-bktxt, " Document text buzei TYPE bseg-buzei, " Line item number hkont TYPE bseg-hkont, " G/L account dmbtr TYPE bseg-dmbtr, " Amount in local currency shkzg TYPE bseg-shkzg, " S = Debit, H = Credit kostl TYPE bseg-kostl, " Cost centre sgtxt TYPE bseg-sgtxt, " Line item text END OF ty_result. DATA: lt_result TYPE TABLE OF ty_result. "── The JOIN -ALWAYS start with BKPF, then bring in BSEG ─────── " BKPF is the smaller table. Filter it first. Never start with BSEG. " Joining key: BUKRS + BELNR + GJAHR (all three are mandatory) SELECT h~belnr h~gjahr h~bldat h~budat h~cpudt h~cputm h~usnam h~tcode h~bktxt i~buzei i~hkont i~dmbtr i~shkzg i~kostl i~sgtxt INTO TABLE @lt_result FROM bkpf AS h INNER JOIN bseg AS i ON i~bukrs = h~bukrs AND i~belnr = h~belnr AND i~gjahr = h~gjahr WHERE h~bukrs IN s_bukrs AND h~blart IN s_blart " Document type filter (SA = manual journal) AND h~usnam IN s_uname " User ID filter AND h~cpudt IN s_cpudt. " Date range filter -uses CPUDT (system date) "── Output ───────────────────────────────────────────────────── SORT lt_result BY cpudt cputm belnr buzei. LOOP AT lt_result INTO DATA(ls). WRITE: / ls-belnr, ls-cpudt, ls-cputm, ls-usnam, ls-hkont, ls-dmbtr, ls-shkzg, ls-sgtxt. ENDLOOP.
Performance Warning - BSEG is One of the Largest Tables in SAP: In a production system that has been running for 5+ years, BSEG can easily have 500 million rows or more. Never query BSEG directly without filters on BUKRS (company code) and either BELNR (document number) or GJAHR (fiscal year). Always start by querying BKPF first with your date and document type filters, collect the matching BELNR values, then query BSEG using those BELNR values. Querying BSEG directly with only a date range can crash your production system or run for hours.
💰 Real Scenario: "A Customer Paid ₹50 Lakh - Which Invoices Did This Clear?"
Anand Auto Parts Ltd - Tracing a Customer's Bulk Payment to Individual Invoices
The accounts receivable team at Anand Auto Parts Ltd in Chennai receives a bank statement showing that customer Maruti Components India Ltd transferred ₹49,87,500 on 08-May-2025. This is a bulk payment -the customer has not specified which invoices they are paying. The AR team needs to find which open invoices to clear against this payment in SAP.
The accountant posts the incoming bank receipt using F-28 (Post Incoming Payment). SAP creates a document - in BKPF: Document Type DZ (Customer Payment), BUDAT = 08-May-2025, USNAM = AR.KAVITHA, TCODE = F-28. In BSEG: Line 001 -KOART = D (Customer), KUNNR = Maruti Components customer number, DMBTR = ₹49,87,500, SHKZG = S (Debit -clears the money the customer owes). Line 002 -KOART = S (G/L), HKONT = 112000 (Bank Incoming account), DMBTR = ₹49,87,500, SHKZG = H (Credit -cash came in). The payment document is in BKPF but the invoices are not yet matched.
▶ T-Code: F-28 (Post Incoming Payment) · Creates BKPF (BLART = 'DZ') + BSEG (KOART = 'D' for customer line)Using FBL5N (Customer Line Item Report), the AR team views all open items for Maruti Components. SAP reads BSEG where KOART = 'D' (Customer) and AUGDT is blank (not yet cleared / unpaid). It shows 12 open invoices with various amounts and due dates. The AR team selects invoices totalling exactly ₹49,87,500 -a combination of 7 invoices from March and April -and processes the clearing. SAP then fills the AUGDT (Clearing Date) field in BSEG with 08-May-2025 for each cleared invoice and links all of them to the payment document number via AUGBL (Clearing Document Number).
▶ T-Code: FBL5N · Reads: BSEG (KOART = 'D', AUGDT is blank = open items) · After clearing: BSEG.AUGDT + BSEG.AUGBL filledA quick SE16N on BSEG filtering by KUNNR = Maruti Components customer number and AUGBL = the payment document number shows all 7 invoice line items now marked as cleared -AUGDT = 08-May-2025, AUGBL = the incoming payment document BELNR. The customer's account is now clean. The BKPF of the original invoices still exists unchanged -but BSEG now carries the clearing reference. This is how SAP links payment documents back to the original invoices -through the AUGBL field in BSEG.
▶ SE16N on BSEG · Fields AUGDT (clearing date) + AUGBL (clearing document) are the link between invoice and payment⚠️ Most Common Mistakes People Make with BKPF and BSEG
These mistakes appear again and again in SAP projects -in reports, ABAP programs, and interview answers. Knowing them puts you ahead of 80% of SAP finance consultants.
Querying BSEG first without any BKPF filters: SELECT * FROM bseg WHERE budat = '20250430' - BUDAT is in BKPF, not in BSEG! BSEG does not have a posting date field. This query will either fail or return wrong results.
Always filter BKPF first using date fields, collect document numbers, then query BSEG: SELECT belnr FROM bkpf WHERE budat = '20250430', then SELECT FROM bseg WHERE belnr IN list.
Saying "BKPF stores the amounts" in an interview. BKPF has NO amount fields. The document header is just metadata -who, when, what type. All monetary values are in BSEG. Mixing this up is a very common and visible mistake.
BKPF = Document Header (no amounts -just identity, dates, user, document type). BSEG = Line Items (all amounts in DMBTR, account numbers in HKONT/LIFNR/KUNNR, debit/credit in SHKZG).
Using BLDAT or BUDAT for fraud investigation: "Show me documents posted on 31-Oct-2024." Both these dates can be freely entered by the user. A fraudster can set BUDAT to any date in the open period.
For fraud investigation, always use BKPF.CPUDT (entry date) and BKPF.CPUTM (entry time). These are set by the SAP system clock and cannot be changed by any end user -they are the most trustworthy date fields in the entire FI module.
Forgetting GJAHR (Fiscal Year) in the join: JOIN bseg ON bkpf.bukrs = bseg.bukrs AND bkpf.belnr = bseg.belnr. Document numbers can repeat across fiscal years! Without GJAHR you get cross-year data collisions and completely wrong results.
Always join on all three key fields: ON bukrs AND belnr AND gjahr. The three-part key is what makes every document globally unique in the system. This is the most important technical fact about the BKPF-BSEG relationship.
Top 3 Interview Questions on BKPF and BSEG:
Q1: "What is the relationship between BKPF and BSEG?" - One-to-many. One row in BKPF (the document header) links to two or more rows in BSEG (the line items). They are joined using Company Code + Document Number + Fiscal Year.
Q2: "A document was posted with the wrong amount. How do you fix it in SAP?" - You cannot edit BKPF or BSEG directly. You must reverse the original document (FB08 -creates a mirror image) and post a new correct document. Both the original and the reversal stay permanently in the tables. BKPF.STBLG on the original will hold the reversal document number.
Q3: "Where is the username of the person who posted a document stored?" - In BKPF.USNAM (Username). The T-code they used is in BKPF.TCODE. The exact time it was posted is in BKPF.CPUDT and BKPF.CPUTM. All of this is in the document header table, not in BSEG.
📚 Complete BKPF vs BSEG Quick Reference - Everything on One Page
| Question | BKPF (Header) | BSEG (Line Items) |
|---|---|---|
| What does it store? | The "cover page" of a financial document - overall identity and context | Each individual accounting line -every debit and credit with amounts |
| How many rows per document? | Always exactly one row per document | At least two rows per document (minimum one debit + one credit); often many more |
| Does it have amounts? | No. BKPF has no amount fields at all | Yes. DMBTR = local currency amount. WRBTR = document currency amount |
| Primary key | BUKRS + BELNR + GJAHR (3 fields) | BUKRS + BELNR + GJAHR + BUZEI (4 fields - adds line item number) |
| Who is in this table? | USNAM (who posted), TCODE (which screen used) | LIFNR (vendor), KUNNR (customer), HKONT (G/L account) |
| Which dates are here? | BLDAT (document date), BUDAT (posting date), CPUDT (entry date), CPUTM (entry time) | AUGDT (clearing date), ZFBDT (baseline payment date) -mostly accounting dates |
| Can it be changed? | No. Immutable once posted. Can only be reversed using FB08. | No. Same rule -immutable. AUGDT and AUGBL are filled when cleared, not changed. |
| T-Code to view | FB03 (header tab), SE16N on BKPF | FB03 (line items tab), FBL1N, FBL3N, FBL5N, SE16N on BSEG |
| Related/shadow tables | VBKPF = parked document headers (not yet posted) | VBSEG = parked line items · BSIS = open G/L items · BSAS = cleared G/L items · BSIK = open vendor · BSAK = cleared vendor · BSID = open customer · BSAD = cleared customer |
| Best used for | Finding who posted something, when, which T-code, what document type - the "identity check" | Finding what amounts moved, to which accounts, debit or credit -the "money trail" |
| Table | What It Stores | When You Use It | Linked To |
|---|---|---|---|
| VBKPF | Parked document headers - invoices entered but waiting for approval before they hit the books | Month-end reconciliation when SAP balance differs from vendor statement -parked items are missing from BKPF | Posted via FBV0 → moves to BKPF |
| BSIS | G/L Open Items - a "view" or subset of BSEG showing only lines that have not yet been cleared (AUGDT is blank) | G/L account reconciliation, finding outstanding items | Subset of BSEG · cleared items go to BSAS |
| BSAS | G/L Cleared Items - G/L lines that have been matched and closed. AUGDT has a date in it. | Checking that payments cleared correctly, producing cleared items reports | Subset of BSEG · same data, different selection view |
| BSIK | Open Vendor Items - BSEG lines for vendors that have not yet been paid (invoices still outstanding) | AP aging report, payment run selection, vendor statement matching | Subset of BSEG (KOART = 'K', AUGDT blank) |
| BSAK | Cleared Vendor Items - vendor BSEG lines that have been paid. The payment document number is in AUGBL. | Tracing which invoices a payment cleared, duplicate payment investigation | Subset of BSEG (KOART = 'K', AUGDT filled) |
| BSID | Open Customer Items - money customers owe you that has not yet been received | AR aging report, dunning, customer statement | Subset of BSEG (KOART = 'D', AUGDT blank) |
| BSAD | Cleared Customer Items - customer invoices that have been paid and matched | Confirming customer payments were applied correctly | Subset of BSEG (KOART = 'D', AUGDT filled) |
| BKPF.STBLG | Not a separate table - it is a field inside BKPF. Stores the reversal document number. Empty = never reversed. | Checking if a document has been cancelled, finding reversal pairs for audit | Lives in BKPF itself |
| T-Code | Name | What You See | Main Tables Used |
|---|---|---|---|
| FB03 | Display Document | One complete accounting document - header + all line items side by side | BKPF + BSEG |
| FBL1N | Vendor Line Item Display | All open and cleared invoices and payments for one or more vendors | BSEG (KOART = 'K') + BKPF for dates |
| FBL3N | G/L Account Line Item Display | All postings to a specific general ledger account - open and cleared | BSIS + BSAS (subsets of BSEG) + BKPF |
| FBL5N | Customer Line Item Display | All open and cleared invoices and receipts for one or more customers | BSEG (KOART = 'D') + BKPF |
| FB08 | Reverse Document | Creates a reversal - new rows in both BKPF and BSEG, original BKPF.STBLG filled | Creates in BKPF + BSEG |
| FBV3 | Display Parked Document | Invoices entered but not yet approved - not in BKPF/BSEG yet | VBKPF + VBSEG |
| F110 | Automatic Payment Run | Bulk vendor payments - generates KZ documents in BKPF/BSEG and fills BSEG.AUGDT | Creates in BKPF + BSEG · REGUH + REGUP |
| SE16N | Table Browser | Raw table data - used by auditors and developers to directly query BKPF or BSEG with any filter combination | Direct access to BKPF and/or BSEG |
| SQVI | Quick Viewer | Create simple JOIN reports between BKPF and BSEG without writing ABAP - ideal for one-off audit queries | BKPF JOIN BSEG |
The One Sentence Summary You Need for Any Interview: BKPF is the document's identity card - one row telling you who posted it, when, and what kind it is, with no amounts. BSEG is the document's contents -one row per accounting line showing which accounts moved, how much, and which direction. You always need both. You always join them on Company Code + Document Number + Fiscal Year. BKPF is where you start every query. BSEG is where you find the money.