SAP tableObjectMCHBModuleMM_P2P

MCHB table — Batch Stock at Storage Location Level

MCHB holds the quantity of a specific batch of a material, broken down by stock category, at plant and storage location level. Each row is one material-plant-storage location-batch combination, with separate quantity fields for unrestricted, quality inspection, blocked, restricted-use, and blocked returns stock. It is the batch-level counterpart to MARD.

MCHB is the stock quantity table for batch-managed materials at storage location level, mirroring the structure of MARD but adding the batch dimension. This page covers its key fields, how it joins to the material and batch master, and the recurring mistakes made when reading it for stock and batch investigations.

Published 15 Sept 2026· 1,157 words

What it stores

One row in MCHB represents the on-hand quantity of one batch of one material in one plant and storage location, split across stock categories. It exists because plain storage-location stock (MARD) has no batch field, and any material flagged as batch-managed needs its quantities tracked per batch as well as per storage location. The table carries no movement history and no valuation amount; it is a current-quantity snapshot maintained by goods movement postings. A material can have many MCHB rows for the same plant and storage location, one per batch currently held there, plus historical rows for batches whose quantity has since gone to zero but which have not been physically deleted. Batches themselves are described in the batch master, not in MCHB; this table only tells how much of a given batch sits where, in which status.

Key fields

  • MANDT - client, always part of the key and the first restriction in any selection
  • MATNR - material number, part of the key
  • WERKS - plant, part of the key
  • LGORT - storage location, part of the key
  • CHARG - batch number, part of the key and the field that distinguishes this table from MARD
  • CLABS - valuated unrestricted-use stock quantity for the batch
  • CINSM - stock quantity in quality inspection for the batch
  • CSPEM - blocked stock quantity for the batch
  • CEINS - restricted-use stock quantity for the batch
  • CRETE - blocked returns stock quantity for the batch
  • LVORM - deletion flag set when the combination is marked for deletion, does not itself mean the quantity is zero

How it joins the data model

  • MCHB-MATNR = MARA-MATNR to reach material type, base unit and material group
  • MCHB-MATNR and MCHB-WERKS = MARC-MATNR and MARC-WERKS to reach plant-level material data such as MRP type and batch management indicator
  • MCHB-MATNR, MCHB-WERKS, MCHB-LGORT = MARD-MATNR, MARD-WERKS, MARD-LGORT to reach the storage-location total that MCHB rows for that material should sum up to
  • MCHB-MATNR, MCHB-WERKS, MCHB-CHARG = MCHA-MATNR, MCHA-WERKS, MCHA-CHARG to reach the plant-level batch stock record and confirm the batch exists at that plant
  • MCHB-WERKS = T001W-WERKS to resolve the plant description and validate the plant is in use

How to read it safely

MANDT is implicit in most systems and should not be forgotten in native SQL access outside the ABAP layer. The table is keyed on material, plant, storage location and batch together, so any selection restricted only by MATNR on a material with many batches and locations returns far more rows than intended. Always restrict by WERKS and, where the investigation is location-specific, by LGORT, before pulling CHARG-level detail. A row with all quantity fields at zero is not necessarily a bug; it means the batch existed there at some point and the record has not been physically deleted, which is normal on a table that is never purged as part of routine operations. Do not filter on LVORM as a proxy for zero stock; check the quantity fields directly.

How to prove it in the data

To confirm whether a specific batch shows unrestricted stock at a given storage location, select MCHB with MATNR, WERKS, LGORT and CHARG all specified and read CLABS. A non-zero CLABS with zero in CINSM, CSPEM, CEINS and CRETE confirms the batch is fully available for unrestricted use at that location. If the row does not exist at all for that combination, the batch has never carried stock there, which is different from having carried stock and been consumed to zero, a distinction that matters when reconciling against a goods movement that references that storage location.

ECC vs S/4HANA

In S/4HANA, MCHB is not a physically maintained transaction table in the same way it was in ECC. Stock quantities are derived from the universal journal of material movements, and MCHB is exposed as a compatibility view that computes the same field structure on the fly for programs and queries still coded against the classic table. Existing reports, custom ABAP and interfaces that select from MCHB continue to work, but the read now goes through an aggregation layer rather than a stored quantity, which changes performance characteristics on large selections and makes direct table-level locking arguments from ECC obsolete.

Common pitfalls

  • Reading CLABS as available-to-promise stock: it is unrestricted-use quantity only, with no regard to reservations, purchase order commitments or MRP-relevant blocks recorded elsewhere
  • Summing MCHB rows across storage locations without checking WERKS first, which silently mixes stock from different plants when a material number happens to repeat across plant boundaries in test or migrated data
  • Treating a missing MCHB row as proof the batch never existed, when it may simply have never held stock at that particular plant or storage location while existing fine at another one covered by MCHA
  • Assuming the sum of MCHB rows for a material-plant-storage location combination always equals the corresponding MARD total; timing of updates during parallel postings or after manual stock corrections can leave them briefly inconsistent, and a real discrepancy calls for checking the movement history rather than editing either table
  • Ignoring CEINS and reading only CLABS when the material is under a special stock arrangement, then concluding stock is unavailable when it is simply restricted-use and requires a different withdrawal reference
  • Forgetting that LVORM being blank does not mean the batch is still active for procurement or production; that status lives on the batch master and material master, not on this quantity table
  • Querying MCHB directly in an S/4HANA system with heavy custom reporting instead of the released reporting views, which behaves differently under load because the underlying data model has changed

Whose problem this is

Stock discrepancies traced to MCHB are an inventory management functional question first, owned by whoever configures storage locations, batch management and movement types for the plant in question. Batch master data content and batch determination logic sit with the same team or with quality management if inspection-related statuses are involved. A technical performance problem reading the table at scale, especially post-migration, belongs with basis or the S/4 data model owner.

Related SAP objects

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

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