SAP tableObjectVBAPModuleSD_O2C

VBAP table — Sales Document Item Table

VBAP stores one row per sales document item, meaning one material or service line inside an inquiry, quotation, order, contract, or scheduling agreement. It holds the item category, plant, quantity, net value, currency, and rejection status for that line, and links back to the header in VBAK and forward to schedule lines, status, and business data tables via the same VBELN and POSNR keys.

This page covers what a VBAP row actually represents, which fields carry real diagnostic weight, and how the table joins to header, schedule line, status, and business data tables. It focuses on the failure patterns consultants actually hit when a sales order item looks wrong in the data.

Reviewed by an ERPClimb SAP consultant on 15 Sept 2026· 1,127 words

What it stores

One row in VBAP represents a single item within a sales document, identified by the document number VBELN and the item number POSNR. The item can be a standard material line, a text item, a free goods line, a higher-level item in a bill of materials structure, or a service item. VBAP holds the commercial and logistical attributes of that line: item category, plant, storage location, order quantity, sales unit, net value, currency, route, and rejection reason if the line has been cancelled. It applies uniformly across sales document categories because inquiries, quotations, orders, contracts, and scheduling agreements all use the same header-item structure, VBAK and VBAP. The document category itself is read from VBAK, not from VBAP, so VBAP alone cannot tell what type of document the item belongs to.

Key fields

  • MANDT - client, always the first filter, never omit it in a manual selection
  • VBELN - sales document number, the header key shared with VBAK
  • POSNR - item number within the document, not unique on its own
  • MATNR - material number entered on the line
  • WERKS - delivering plant for this item
  • LGORT - storage location proposed or entered for this item
  • PSTYV - sales document item category, drives pricing, delivery, and billing relevance
  • ABGRU - reason for rejection, blank means the item is still open
  • KWMENG - cumulative order quantity in the sales unit
  • VRKME - sales unit for the item
  • NETWR - net value of the item in document currency
  • WAERK - document currency
  • UEPOS - higher-level item number, populated for BOM sub-items and free goods
  • GRKOR - delivery group, controls whether items must be delivered together
  • ROUTE - route determined for the item
  • ERDAT - date the item was created

How it joins the data model

  • VBAP-VBELN = VBAK-VBELN joins to the document header for sales organization, document type, and sold-to
  • VBAP-VBELN/POSNR = VBEP-VBELN/POSNR joins to schedule lines for delivery dates and confirmed quantities
  • VBAP-VBELN/POSNR = VBUP-VBELN/POSNR joins to item status for delivery, billing, and rejection status flags
  • VBAP-VBELN/POSNR = VBKD-VBELN/POSNR joins to business data for payment terms, incoterms, and pricing date at item level
  • VBAP-VBELN/POSNR = VBFA-VBELV/POSNV (or VBELN/POSNN for the successor side) joins to document flow to trace the item into deliveries and billing
  • VBAK-KNUMV feeding into KONV, then filtering by KPOSN = VBAP-POSNR, recovers the condition records priced for this specific item

How to read it safely

MANDT is implicit in most tools but still the logical first filter. VBELN is highly selective and should be the primary restriction whenever the document number is known; POSNR alone is close to useless since it repeats across every document. Never select on MATNR or WERKS across the whole table without also restricting VBELN or a date range, the table is large in any live SD system and an unrestricted scan on those fields will run for a long time. If the starting point is a customer or date rather than a document number, query VBAK first with VKORG, ERDAT, or KUNNR, extract the VBELN list, then join into VBAP. Watch for leading zeros in VBELN when pasting document numbers manually.

How to prove it in the data

Symptom: a sales order item shows zero net value on the order screen. Select VBAP for that VBELN and POSNR and check NETWR and WAERK directly. If NETWR is genuinely zero and ABGRU is blank, the item priced at zero, which points at the condition records in KONV via VBAK-KNUMV and KPOSN = POSNR, not at VBAP itself. If ABGRU is populated, the item was rejected and a zero value is expected and correct.

ECC vs S/4HANA

VBAP remains a transparent table with essentially the same structure in S/4HANA, it was not replaced or restructured as part of the SD data model simplification. It sits underneath the sales order CDS view layer used by newer Fiori apps and analytical reporting, but that layer reads from VBAP rather than replacing it, so direct table access, ABAP reports, and legacy queries built against VBAP continue to work unchanged. The business partner model change affects customer master tables, not VBAP.

Common pitfalls

  • Treating POSNR as unique or sequential across documents; it only has meaning combined with VBELN, and item numbering can jump by tens or hundreds depending on the increment set in customizing, gaps do not mean deleted items
  • Reading NETWR as the final billed value; NETWR reflects the order item's pricing result at the time it was last processed, not what was actually invoiced, that comparison requires VBRP
  • Assuming a blank ABGRU means the item is still fully open for delivery; the item can still be blocked, fully delivered, or fully billed, that state lives in VBUP, not in VBAP
  • Assuming KWMENG is what will ship; confirmed and delivered quantities live in VBEP and in the delivery tables, KWMENG is the ordered quantity only
  • Forgetting that higher-level items (UEPOS populated) often carry no independent pricing or delivery relevance of their own, the sub-items under them do, so filtering on UEPOS blank misses BOM component lines that need separate attention
  • Pulling PSTYV and assuming it always matches the item category proposed by the item category group on the material master; manual overrides at order entry are common and only the value stored in VBAP for that specific item is authoritative
  • Using VBAP in isolation to explain why a line did not deliver or bill; that always requires VBUP for status and VBFA for what documents were actually created downstream

Whose problem this is

Order management or SD functional consultants own questions about item category determination, pricing results, and rejection reasons stored here. Basis or data management owns table growth and archiving. If the dispute is about what the customer was actually charged rather than what the order line shows, ownership shifts to billing, which means VBRP and VBRK, not VBAP.

Related SAP objects

Reviewed pages this object connects to in the ERPClimb knowledge graph.

Source: ERPClimb — https://erpclimb.com/sap-tables/vbapERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.