Skip to content
SAP Reference

MD04

DisplayS/4 · Active

Display Stock/Requirements List

Boilerplate SQL

Databricks SQL

Starting point for querying the tables behind this transaction. Adjust the WHERE clause for your scenario.

-- ============================================================
-- T-Code : MD04 Display Stock/Requirements List
-- Purpose: Netted live view of current stock vs. open supply and demand by material/plant
-- Grain  : One row per MRP element per material/plant (stock, supply, demand)
-- Tables : MARD, MCHB, MSKA, VBEP, LIPS, EBAN, EKET, AFPO, PLAF, RESB
-- Notes  : MD04 is a *live* SAP calculation. The authoritative way to reproduce
--          it outside the GUI is the BAPI MD_STOCK_REQUIREMENTS_LIST_API.
--          This query unions the same source tables and will drift vs. the
--          screen because ABAP netting / ATP / firming logic is not reproduced.
-- ============================================================
WITH stock AS (
  SELECT
    MANDT                 AS client,
    MATNR                 AS material_number,
    WERKS                 AS plant,
    'Stock: Unrestricted' AS mrp_element,
    LABST                 AS quantity,
    CAST(NULL AS DATE)    AS element_date
  FROM mard
  WHERE MANDT = '100'

  UNION ALL

  SELECT
    MANDT                 AS client,
    MATNR                 AS material_number,
    WERKS                 AS plant,
    'Stock: Batch'        AS mrp_element,
    CLABS                 AS quantity,
    NULL                  AS element_date
  FROM mchb
  WHERE MANDT = '100'

  UNION ALL

  SELECT
    MANDT                 AS client,
    MATNR                 AS material_number,
    WERKS                 AS plant,
    'Stock: Sales Order'  AS mrp_element,
    KALAB                 AS quantity,
    NULL                  AS element_date
  FROM mska
  WHERE MANDT = '100'
),
supply AS (
  SELECT
    MANDT                          AS client,
    MATNR                          AS material_number,
    WERKS                          AS plant,
    'Supply: PO Schedule Line'     AS mrp_element,
    (MENGE - WEMNG)                AS quantity,
    EINDT                          AS element_date
  FROM eket
  WHERE MANDT = '100'
    AND (MENGE - WEMNG) > 0

  UNION ALL

  SELECT
    MANDT                          AS client,
    MATNR                          AS material_number,
    WERKS                          AS plant,
    'Supply: Purchase Requisition' AS mrp_element,
    MENGE                          AS quantity,
    LFDAT                          AS element_date
  FROM eban
  WHERE MANDT = '100'
    AND LOEKZ = ''
    AND EBELN = ''

  UNION ALL

  SELECT
    MANDT                          AS client,
    MATNR                          AS material_number,
    DWERK                          AS plant,
    'Supply: Production Order'     AS mrp_element,
    (PSMNG - WEMNG)                AS quantity,
    LTRMI                          AS element_date
  FROM afpo
  WHERE MANDT = '100'
    AND (PSMNG - WEMNG) > 0

  UNION ALL

  SELECT
    MANDT                          AS client,
    MATNR                          AS material_number,
    PWWRK                          AS plant,
    'Supply: Planned Order'        AS mrp_element,
    GSMNG                          AS quantity,
    PEDTR                          AS element_date
  FROM plaf
  WHERE MANDT = '100'
),
demand AS (
  SELECT
    MANDT                         AS client,
    MATNR                         AS material_number,
    WERKS                         AS plant,
    'Demand: Sales Schedule Line' AS mrp_element,
    WMENG                         AS quantity,
    EDATU                         AS element_date
  FROM vbep
  WHERE MANDT = '100'
    AND WMENG > 0

  UNION ALL

  SELECT
    MANDT                         AS client,
    MATNR                         AS material_number,
    WERKS                         AS plant,
    'Demand: Delivery'            AS mrp_element,
    LFIMG                         AS quantity,
    ERDAT                         AS element_date
  FROM lips
  WHERE MANDT = '100'
    AND LFIMG > 0

  UNION ALL

  SELECT
    MANDT                         AS client,
    MATNR                         AS material_number,
    WERKS                         AS plant,
    'Demand: Reservation'         AS mrp_element,
    BDMNG                         AS quantity,
    BDTER                         AS element_date
  FROM resb
  WHERE MANDT = '100'
    AND KZEAR = ''
    AND XLOEK = ''
)
SELECT
  mrp.client       AS "Client",
  mrp.material_number AS "Material Number",
  mt.MAKTX         AS "Material Description",
  mrp.plant        AS "Plant",
  pt.NAME1         AS "Plant Name",
  mrp.mrp_element  AS "MRP Element",
  mrp.element_date AS "Date",
  mrp.quantity     AS "Quantity"
FROM (
  SELECT * FROM stock
  UNION ALL SELECT * FROM supply
  UNION ALL SELECT * FROM demand
) mrp
LEFT JOIN makt mt
  ON  mt.MANDT = mrp.client
  AND mt.MATNR = mrp.material_number
  AND mt.SPRAS = 'E'
LEFT JOIN t001w pt
  ON  pt.MANDT = mrp.client
  AND pt.WERKS = mrp.plant
WHERE mrp.material_number = '<MATNR>'
  AND mrp.plant = '<WERKS>'
ORDER BY mrp.element_date NULLS FIRST, mrp.mrp_element;