Scenario 16 — Batch Management (Steel Grade & Heat Number Tracking)
Every step in Part A and most of Part B was run end to end on the real system, and the document numbers are printed in each step. Where something could not be completed here, the step says so plainly and gives the reason. Nothing on this page is guessed.
The tabbed "enjoy" screens (MM01, MSC1N, MIGO) are typed by you, marked ✋ your turn. Hit a snag? Troubleshooting Center.
📊 Business Case
Batch Management lets you track stock of a single material in distinct, traceable lots — by heat number, grade, purity, manufacture date or expiry. Iron ore quality varies shipment to shipment (different sulfur/phosphorus content), so PakSteel must know exactly which batch went into which finished product. The moment a customer's rebar fails QC, you trace it back to the exact iron-ore batch. The same pattern protects pharma (shelf life), food (production date), and chemicals (purity).
🕐 When to use it
Whenever a material's units are not interchangeable — different shipments carry different quality, expiry, or origin and must be tracked, picked, and recalled by lot.
❓ Why it matters
Traceability, expiry control, and recalls. Track each lot by heat/grade so a failed product traces back to its source batch, expiring stock is picked first, and a recall touches only the affected batches — not your whole inventory.
👤 Who triggers it
Storekeepers assign a batch on every goods movement; QC links test results to a batch; planners use batch determination (FEFO/FIFO) to pick the right lot at goods issue.
🔁 The key distinction
A plain material is one anonymous pile of stock. A batch-managed material is the same code split into identifiable lots — every movement asks "which batch?", and stock is reported per batch (MCHB) on top of the total.
💰 Financial Impact — The Easy-Money Example
PakSteel holds 200 TO of iron ore across two heats. HEAT-26-01 (high sulfur, suitable only for a 90-day window) and a fresher HEAT-26-02. Without batches the storekeeper grabs whichever pile is nearest. Here is what batch tracking saves:
📖 These are story numbers — the business reason, not values you will type. And one honest note: iron ore has no expiry date, so on this system we sort lots by manufacture date (oldest made, first out). It is the same mechanism; a material with a real shelf life sorts on the expiry date instead — see B4.
🧭 How this page works — read this before anything else
Batch management is not one setting. It is one small core plus a shelf of optional extras. Most people get lost because courses mix them together. This page keeps them apart:
PART A · MUST DO
The basic batch implementation. 5 steps. At the end, stock is stored and reported lot by lot. If you only ever do one thing, do Part A.
⏱️ ~45 min · every step proven live
PART B · OPTIONAL
Seven add-ons. Each one is separate and starts with "Use this when…". Do only the ones your business actually needs. Skipping all of them still leaves you with working batch management.
⏱️ 15–60 min each
PART C · CUSTOMISATION
What to do when configuration runs out. What we could not do here, why, and how a functional consultant takes it forward — no ABAP knowledge needed.
⏱️ reading, ~15 min · nothing to post
| If somebody asks for… | Do this | Needs first | ⏱️ | Status on our IDES |
|---|---|---|---|---|
| "Track our stock by delivery / lot" | A Part A — the basic cycle | — | 45 m | 🎯 proven live |
| "Record the lab test result on each lot" | B1 Quality data per batch | A | 30 m | 🎯 proven live (sulfur 0.05) |
| "Stop staff typing lot numbers by hand" | B2 Automatic batch numbers | A | 30 m | 🎯 proven live (0000000002) |
| "The number should show which product family it is" | B3 Number bands per material type | B2 | 15 m | 🎯 proven live (HALB 2…, FERT 3…) |
| "Always use the oldest stock first" | B4 FEFO auto-pick | A + B1 + 2 batches with different dates | 60 m | 🎯 proven live (doc 4900423478) |
| "Every single roll / bundle must be identifiable" | B5 One batch per piece | A | 25 m | 🎯 proven live (BDL-26-001/2/3) |
| "Track each individual machine, with its service history" | B6 Serial numbers — not batch management | a material with base unit PC/EA | 45 m | ⛔ blocked here (error M3 419) |
| "How does the worker know which batch a roll is?" | B7 Barcode labels → Scenario 27 | A | separate page | see Scenario 27 |
"The batch number must literally read RM-LL-00001" | C1 read C1 first — config already gets you 90% there | B2, B3 | read | 📐 analysed live |
| "Block a purchase order that breaks our rule" | 📘 MM Customisation Guide | — | read | 📐 verified live |
Reading the status column: 🎯 proven live = we ran it end-to-end here and the real document numbers are on this page · ⛔ blocked = tested and it genuinely cannot run here, with the reason · 📐 analysed = investigated live, but the final step needs a developer.
| Batch material (you create it in A2) | RM-IRON-HEAT-01 | new ROH, copy of RM-IRON-01, Batch Management ✓ |
| Blocked material — do NOT use | RM-IRON-01 | has 105 TO stock → batch flag can't change (M3 530) |
| Plant · Purchasing org | PK01 · PKLO | same org as PakSteel raw materials |
| Storage location | RAWM ("Raw material") | ⚠️ RMT is NOT a storage location — a common mix-up. PK01's real ones are BLKD · FNGD · QHLD · RAWM · RTRN · VPK1 · WIPS (verified in T001L) |
| Purchasing group | RMT ("Raw Materials") | ⚠️ RMT is the purchasing GROUP, not a store. Verified in T024 and on our real PO 4500032789 |
| Vendor · info record | MUGHAL21 · 5300079965 | supplier, and the info record that prices the PO |
| Batch level t-code | OMCT | = Material level here. OMCD is the WRONG code |
| Batch class type | 023 | the "batch" flavour of classification (CT04 / CL02) |
| Our characteristic · class · sort rule | PS_SULFUR_PCT · PS_IRON_BATCH · PS_FEFO | built in B1 and B4 |
| Example batch numbers | HEAT-26-01 · HEAT-26-02 | the two heats in the money example (max 10 characters) |
| Key tables (check via SE16) | MARC-XCHPF · MCH1 · MCHB · TCUCH | batch flag · batch master (material level) · batch stock (CLABS) · batch level |
PART A · MUST DO The basic batch implementation
Five steps, in this exact order. Each one depends on the one before it. When you finish A5 you have working batch management — you can stop there and still be correct.
| Step | T-code | What it does | Why this step must exist | Who does it |
|---|---|---|---|---|
| A1 | OMCT | Check how wide a batch number is unique (ours = Material level) | the whole system needs one rule before any batch can exist | 👁️ look only |
| A2 | MM01 | Create a fresh zero-stock material with Batch Management ticked | each material must opt in — and only an empty material may | ✋ your turn |
| A3 | MSC1N | Create the lot HEAT-26-01 | stock needs a named lot to land in | ✋ your turn |
| A4 | ME21N → MIGO 101 | Buy the ore and receive it into that exact lot | goods must be filed by lot, not as one pile | ✋ your turn |
| A5 | MMBE / SE16 | See stock reported per lot | proof that it worked | 👁️ check |
① A material with ZERO stock
- 🎯 What it's for: the material you will batch-enable.
- ❓ Why: batch management says "from now on, every unit belongs to a named lot". Stock that is already sitting in the yard belongs to no lot, so SAP refuses to switch the flag on and leave orphan stock behind.
- 💥 What breaks without it: message M3 530 — "Batch management requirement cannot be changed", with a Display errors button listing what is in the way. SAP checks the current AND the previous period, plus special stock (consignment, sales order, project, subcontracting) and open documents (PO, PR, reservation, production order, delivery, RFQ, WM transfer order).
- ✅ How you'll know: MMBE shows nothing for the material. On our IDES
RM-IRON-01holds 105 TO, so we build a brand-newRM-IRON-HEAT-01instead (step A2).
② A vendor AND a purchasing info record, so the material can actually be bought
- 🎯 What it's for: A4 receives the ore against a purchase order. No PO, no goods receipt.
- ❓ Why: PakSteel's purchasing pricing schema takes the base price only from condition
PB00, which is filled automatically from an info record. You cannot type a price by hand on this system. - 💥 What breaks without it: "Net price must be greater than 0" and "No condition record found for PB00" — the PO will not save. And if the new material has no Accounting view you get ME047 "not maintained by accounting department" first.
- ✅ How you'll know: vendor
MUGHAL21exists as a Business Partner (BP Guide), and after A2 you create info record ME11 → MUGHAL21 / RM-IRON-HEAT-01 / PKLO / PK01, net price250000per TO. (Ours:5300079965.)
③ The batch level is already decided (and on our system, frozen)
- 🎯 What it's for: one system-wide rule saying how wide a batch number counts as unique.
- ❓ Why: it decides which table holds the batch (
MCH1at material level,MCHAat plant level) — and that choice changes which transactions work later. - 💥 What breaks if you assume the wrong one: in B1 you would reach for CL20N and get "Object type MCHA not defined as classifiable object"; in B2 you would maintain the wrong number-range object and nothing would happen.
- ✅ How you'll know: A1 shows you. Ours is Material level and cannot be changed — 200+ batches already exist, and SAP locks the level once any batch exists.
A1 · MUST DO Check the batch level · OMCT 👁️ LOOK ONLY here
⚡ This step will: show you the one system-wide rule — how wide an area a batch number counts as unique in. On a brand-new project you set it once; on our IDES it is already fixed at Material level and locked, so you only look. 📄 paper: — · 📦 stock: no change · 💰 money: no posting
What you'll see: OMCT opens with 6 buttons, which is where newcomers freeze. You need only the first one. The other five belong to batch STATUS management, a different feature (Quality Management — Scenario 18), or are migration tools that are greyed out.
| Button on OMCT | What it does — in plain words | When it's used | What YOU do here |
|---|---|---|---|
| 1. Batch level | Sets how wide a batch name must be unique — one plant, all plants (material), or the whole company (client). | Once, at project start. | ✅ Click it → just LOOK. Ours = Material level, locked. Press Back. This is the only button Part A needs. |
| 2. Batch status management | A switch: may batches be marked unrestricted (OK to use) or restricted (blocked)? A traffic light on each lot. | Quality scenarios where stock waits for a lab test. | Leave OFF (Inactive). |
| 3. Plants with batch status management | Picks which plants use that traffic light. | Only when button 2 is on. | Nothing. (Live message: "Batch status management is not defined at plant level".) |
| 4. Initial status of a new batch | Decides if a brand-new batch is born "OK to use" or "blocked — wait for test". | Quality scenarios (with button 2 on). | Nothing. |
| 5. Batch level → conversion | A big tool that changes the level later and re-labels every existing batch. | Rare — a data-migration project. | Nothing — it is greyed out. |
| 6. Batch status management → conversion | A big tool to turn the traffic light on/off across all existing batches. | Rare — migration only. | Nothing — greyed out. |
Inside button 1 — the three levels, and what each means for the batch number B-500:
| Radio button | Ours | What it means — in plain words | Why it matters — and the impact |
|---|---|---|---|
| Batch unique at plant level | — | B-500 in Karachi and B-500 in Dubai are two different, unrelated lots. Like a house number: the same number on another street is a different house. | Simplest; good when plants run independently. Move stock to another plant and it becomes a fresh batch record there. Batches live in table MCHA. |
| Batch unique at material level | ✅ selected (locked) | B-500 of iron ore is one single lot everywhere — same quality data in Karachi and Dubai, and it keeps its identity when transferred. (You could still reuse B-500 for coal.) | Best for company-wide traceability and recalls — the usual real-project choice. Batches live in table MCH1. This one detail decides several later steps (B1 uses MSC2N not CL20N; B2 uses object BATCH_MAT). |
| Batch unique at client level | — | B-500 can exist only once in the whole system — if iron ore uses it, coal cannot. | Strictest, rare, heavy to run. |
✅ How you'll know: the radio "Batch unique at material level" is filled. (Stored as TCUCH-KZDCH = 1. Trust the radio button on screen, not the raw table value.)
A2 · MUST DO Create the batch-managed material · MM01 ✋ YOUR TURN
⚡ This step will: create a brand-new material RM-IRON-HEAT-01 that is batch-managed from birth — from its very first movement, every receipt and issue demands a batch number. 📄 paper: new material master · 📦 stock: no change · 💰 money: no posting
Fastest way: copy an existing material so every view is pre-filled, then change the number and tick one box.
| Where on screen · Field | Fill | What it asks — in plain words | Why — and the impact if wrong |
|---|---|---|---|
| Initial screen · Material | RM-IRON-HEAT-01 | The new material's name. | A fresh code with no stock, so batch management is allowed. Impact: reuse an existing code and MM01 becomes an "extend", inheriting the stock block |
| Initial screen · Industry sector / Material type | Industry M (Mechanical) · type ROH (raw) | What kind of material is it? ROH = raw material, bought not sold. | Same family as RM-IRON-01. Impact: the type controls which views exist — the wrong type can hide the Accounting view you need in a moment |
| Initial screen · Copy from… (reference) | RM-IRON-01 | Which existing material to copy all settings from? | Pre-fills units, purchasing, MRP so you change only what differs. Impact: skip it and you fill every view by hand |
| Select View(s) popup | tick Basic Data 1, Purchasing, General Plant Data / Storage 1, Accounting 1 | Which "pages" of the material do you want to fill? | The batch tick lives on Purchasing; the price lives on Accounting 1. Impact: miss Purchasing → no batch box; miss Accounting 1 → error ME047 when you try to buy it |
| Organizational Levels popup | Plant PK01 · Storage location RAWM · Purch org PKLO | Which plant / store / buying team does this data belong to? | Same org as PakSteel raw materials. Impact: the wrong plant creates the data where nobody will find it |
| ⭐ Purchasing view → Batch management ("Purchasing view" = one page of the material master. It is not the purchase order.) | ✓ tick | Should THIS material be tracked lot by lot? A switch on one product only. | This single tick is the whole scenario. Impact: forget it and every later step does nothing — the batch field never appears |
| Accounting 1 view · Valuation class · Price control · Moving price · Price unit | 3000 · V · 250000 · 1 | How is this material valued in the books? | Mirrors RM-IRON-01. Impact: leave it blank and the purchase order stops with ME047 — "not maintained by accounting department" |
| Save (Ctrl+S) | — | Commit the new material. | SAP returns "Material RM-IRON-HEAT-01 created". Impact: from now on its POs, GRs and issues all carry a batch field — a place to write the lot number. (A number only. The lot's measured values are a separate thing and live on the batch record — see B1.) |
Yes — but only if the material is completely empty. This is prerequisite ① in practice:
| ✅ You CAN tick it in MM02 when the material has… | ❌ You CANNOT (M3 530) when it has… |
|---|---|
| Zero stock now (current period) | Stock on hand now (our RM-IRON-01 = 105 TO) |
| Zero stock in the previous period too | Stock in the previous period (SAP checks 2 periods — you can still post to last month) |
| No special stock | Consignment, sales-order, project or subcontracting stock |
| No open documents | Open PO, PR, reservation, production/PM order, delivery, RFQ, WM transfer order |
Best practice: decide batch management when you first create a material. Converting a used one means emptying it for two periods and closing every open document — a lot of work for no benefit.
MUGHAL21 · Material RM-IRON-HEAT-01 · Purch. org PKLO · Plant PK01 → Net price 250000 / TO · Standard qty 100 · Planned deliv. time 5 days → Save.
✅ How you'll know: SE16 → table MARC → material RM-IRON-HEAT-01 → field XCHPF = X. Or re-open MM03 → Purchasing and see the box ticked.
A3 · MUST DO Create the batch (the lot itself) · MSC1N ✋ YOUR TURN
⚡ This step will: create the lot — after saving, HEAT-26-01 exists as a record with its dates and supplier, ready to receive stock but holding none yet. 📄 paper: batch master record · 📦 stock: no change · 💰 money: no posting
Initial screen: 4 fields — Material · Batch · Plant · Storage Location (storage location may stay blank). Press Enter and the batch record opens with 5 tabs: Basic Data 1 · Basic Data 2 · Classification · Material Data · Changes.
📌 These 5 tabs belong to the batch record only. A "tab" is one page inside a screen, and every SAP screen has its own tabs. The purchase-order screen has completely different ones, and Classification is not among them — see the note in A4. Two different papers in one folder: the order says what you buy; the batch record says what the lot is like. Lab values live on the batch record.
⚠️ There is no "description" field for a batch. The text you see under the material number is the material's description, and it is read-only. A batch is identified by its number alone.
| Where on screen · Field | Fill | What the field asks — in plain words | Why we choose this — and the impact if wrong |
|---|---|---|---|
| Initial screen · Material | RM-IRON-HEAT-01 | Which material is this lot an instance of? | Ties the batch to the ore. Impact: a wrong material creates the lot under the wrong product and A4 will not find it |
| Initial screen · Batch | HEAT-26-01 | The lot's name. Maximum 10 characters — so "HEAT-2025-001" will not fit. | The mill's heat number IS the batch id. Impact: at Material level (A1) this number must be unique for this material across all plants |
| Initial screen · Plant | PK01 | WHERE will this lot's stock sit? | The receiving plant. Impact: the wrong plant shows the batch stock in the wrong location |
| Initial screen · Storage Location | leave blank (or RAWM) | Which store inside the plant? | Optional — the batch record itself is not per storage location. Impact: none for this exercise |
| ⭐ Basic Data 1 → box Shelf Life Expiration/Best Before Date · Date of Manufacture | the date the lot was made, e.g. 22.07.2026 | WHEN was this lot produced? | ⭐ This is the date FEFO reads (B4). Impact: a wrong date makes batch determination pick the wrong lot first — exactly the ₨2.5M saving lost. Give your two batches different dates or B4 has nothing to sort |
| Basic Data 1 · SLED/BBD | optional — the expiry date, e.g. 26.07.2026 | Shelf Life Expiration Date / Best Before Date — when does this lot go out of spec? | Used instead of manufacture date when you sort by true expiry. Impact: only fills automatically if the material master carries a shelf-life setting; otherwise type it |
| Basic Data 1 · Available From · Period Indicator | e.g. 24.07.2026 · D (days) | From when may this lot be used, and in which time unit is shelf life counted? | Housekeeping fields. Impact: low — but "Available From" in the future can hide the batch from determination |
| Basic Data 1 → box Batch Status | leave Unrestricted | Is this lot free to use, or held pending a test? | The "traffic light" from OMCT button 2 — switched off on our system, so Unrestricted is the only real option. Impact: none here; it becomes live in Scenario 18 (QM) |
| Basic Data 1 → box Trading Data · Supplier | MUGHAL21 | WHO supplied this lot? | The recall and audit trail. Impact: blank here and a failed lot cannot be traced back to its mill |
| Basic Data 1 · Supplier Batch | the mill's own lot number, if different | What did the supplier call this lot on their certificate? | ⭐ Keep the supplier's number here when SAP generates your own number (B2). Impact: this is how you get speed and traceability at the same time |
| Basic Data 1 · Ctry/Reg of Origin | the origin country | WHERE did this lot come from? | Customs and imported-ore traceability. Impact: a wrong origin misreports customs data |
| Classification tab (this tab belongs to the batch record) | skip for now | The lot's measured values — for example "sulfur 0.05 %". | This tab stays empty until you build the class in B1. ⭐ Where to come back to: MSC2N → the same Material · Batch · Plant → Classification tab. Not the purchase order — a purchase order never shows this tab. Impact: nothing now; the batch saves fine without it |
| Save | — | Commit the batch master. | The lot now exists and can receive stock. Impact: without it the GR in A4 has no pre-made lot (SAP can still create one on the fly, but with empty data) |
- Pre-create it (this step) — when the number comes from outside (a mill's heat number on a test certificate) and you want the lot's data ready before the truck arrives.
- Type it at the goods receipt — SAP creates the batch on the fly. Fastest, but the lot's data starts empty.
- Let SAP invent the number — see B2. No typing at all.
A4 · MUST DO Buy it and receive it into the batch · ME21N → MIGO 101 ✋ YOUR TURN
⚡ This step will: bring the ore IN and file it under one exact lot — the shelf fills at PK01 AND the first money document posts. 📄 paper: purchase order, then material + accounting document · 📦 stock: ↑ at PK01 inside batch HEAT-26-01 · 💰 money: Dr Inventory / Cr GR-IR
Part 1 — the purchase order (ME21N)
| Where · Field | Fill | What it asks | Why — and the impact if wrong |
|---|---|---|---|
| Top bar · Document type · Supplier | NB · MUGHAL21 | What kind of order, and from whom? | Standard PO from our ore supplier. Impact: the supplier must match the info record or the price will not be found |
| Header → Org. Data tab · Purch. Org · Purch. Group · Company Code | PKLO · RMT · PSPK | Which buying team is ordering? | Karachi local buying team. RMT here is the purchasing group "Raw Materials" — do not confuse it with the storage location RAWM. Impact: the Purch. Org must match the info record's, or the price will not be found |
| Item line · Material · PO Quantity · Plant | RM-IRON-HEAT-01 · 100 TO · PK01 | What, how much, where to? | 100 TO is the money example. Impact: the plant must be the one you batch-enabled |
| Item line · Net Price | do not type it — it fills itself (250,000) | What does one tonne cost? | Comes from info record 5300079965 via condition PB00. Impact: if it stays 0, your info record is missing or its org data does not match — see prerequisite ② |
| Item detail → Invoice tab · Tax code | I0 | Which VAT rule applies? | ⚠️ Mandatory on this system. Impact: the PO will not save without it |
| Item detail → Material Data tab | nothing to fill | This is where a purchase order keeps batch information: Batch, Supplier Batch, and a Create Batch button. | ℹ️ A number only — never the lab values. ⭐ Verified live on our system: the PO item has exactly 15 tabs (Material Data · Quantities/Weights · Delivery Schedule · Delivery · Invoice · Conditions · Texts · Delivery Address · Confirmations · Condition Control · Retail · Pricing History · Spec2000/SC · Incoterms · Custom Fields) and the PO header exactly 11 (Delivery/Invoice · Conditions · Texts · Address · Communication · Partners · Additional Data · Org. Data · Status · Payment Processing · Incoterms). Neither list contains Classification, and the Environment menu has no batch or classification entry either. Impact: none — leave this tab alone |
| Save | — | Commit the order. | Answer Yes to "No message record found… Save anyway?" — harmless. Note the PO number. |
Part 2 — the goods receipt (MIGO)
| Where · Field | Fill | What it asks — in plain words | Why — and the impact if wrong |
|---|---|---|---|
| Top bar · Action · Reference · Movement type | Goods Receipt · Purchase Order · 101 → type the PO number → Enter | Start a normal receipt against the order. | Referencing the PO copies quantity, price and account assignment. ⚠️ Check the small box beside the movement type is EMPTY — a leftover P (pipeline) from another scenario silently breaks everything |
| Item detail → Where tab · Storage Location | RAWM | Which store inside the plant? | The line must be valid before the batch field accepts input. Impact: skip it and the batch field misbehaves |
| ⭐ Item grid · Batch column (mandatory) | HEAT-26-01 | WHICH lot is this stock landing in? Like a parcel that cannot be shelved until you write the shelf on it. | Compulsory now, because the material is batch-managed (A2). Impact: SAP will not post without it. This one answer is what makes later tracing possible |
| Header → Head.data · Delivery Note | e.g. DN-26-001 | The supplier's delivery-note number. | ⚠️ Mandatory on this system. Impact: posting fails with "Enter Delivery Note" |
| Item line · Item OK tick | ✓ | Confirm this line is ready to post. | Impact: an unticked line is silently skipped — the most common reason a post "does nothing" |
| Post 💾 | — | Commit the receipt. | Stock is booked into that specific batch, not just the material total. Impact: MMBE now shows quantity per batch on top of the overall figure |
5000047744 — 100 TO of RM-IRON-HEAT-01 posted into batch HEAT-26-01 at PK01 (verified in MCHB: CLABS = 100.000).
A5 · MUST DO Prove it — stock is now reported per lot · MMBE 👁️ CHECK
⚡ This step will: show you the difference batch management made. Nothing is posted — you are only reading. 📄 paper: — · 📦 stock: no change · 💰 money: no posting
- MMBE → material
RM-IRON-HEAT-01, plantPK01→ expand the tree. Each batch appears on its own line under the plant/storage location, on top of the material total. On a non-batch material there is no such line. - SE16 →
MCHB→ material → a row per batch, fieldCLABS= the unrestricted quantity in that batch. - SE16 →
MCH1→ the batch master records themselves (material level — this is whyMCH1and notMCHA). - MB51 → the material document shows the batch on the line.
PART B · OPTIONAL Add-ons — do only what you need
Seven independent extras. Each begins with "Use this when…" and lists what it needs first. They can be done on different days, in almost any order — the only hard rule is that B4 (FEFO) needs B1 (quality data).
B1 · OPTIONAL Quality data on every lot · CT04 → CL02 → MSC2N 🎯 PROVEN LIVE
⚡ This step will: build the blank label that every lot will carry, then write real values onto one lot. 📄 paper: characteristic + class (master data) · 📦 stock: no change · 💰 money: no posting
The idea in three words: a characteristic is one blank on a form ("sulfur ___ %"). A class is the whole form. Classifying a batch is filling that form in for one lot.
✅ You WILL see it in: MSC2N → Classification tab (to type the values) · MSC3N → Classification tab (to read them) · CL30N or BMBC (to search lots by value).
❌ You will NOT see it in the purchase order. ME21N / ME22N / ME23N have no Classification tab — not on the item, not on the header. This is normal SAP, not a fault, and no setting turns it on. The order is the order letter: what, how much, what price. The batch record is the lab report for one lot.
⭐ At the goods receipt you CAN type the values too — and on our system it is already switched on. MIGO item detail has a Batch tab with a Classification button, and SAP can also open the Classification screen by itself as you post. That behaviour is controlled per movement type by the field Classif.batches (V_156_VC-KZCLA), which lives in OMJJ → movement type → box Entry Control — right beside Create New Batch.
| Classif.batches | What SAP does at the goods receipt |
|---|---|
| blank | No Branching to Batch Classification — you never see the screen |
1 | Classification Carried Out in Background (All Batches) |
2 | Classific. Only in Foreground for Mand. Chars (All Batches) |
3 ← ours for 101 | Classification Always Invoked in Foreground (All Batches) |
4 | Classification Invoked in Foreground for New Batches Only |
⭐ Because ours is 3, MIGO opens a Classification screen for EVERY batch on the receipt, one after another — even batches that already exist. That is not a fault, and it is the single most confusing thing about batch classification at a goods receipt. Set it to 4 if you only want to be asked about brand-new batches, or leave it blank to be left alone completely.
So what is the right moment to type the values? Whenever the number becomes known and you trust it: at the goods receipt if the supplier's mill certificate arrives with the truck (controlled by Classif.batches in OMJJ — ours is 3, so it already asks), or after the goods receipt in MSC2N if your own lab must test first. ⚠️ One hard deadline either way: classify the batch BEFORE it is used, because an unclassified batch has no value to sort on and B4's FEFO rule pushes it to the bottom of the list with a ?.
Step 1 — create the characteristic · CT04 (type the name, press the Create button — do NOT just press Enter, or you get "not yet created")
| Where on screen · Field | Fill | What it asks — in plain words | Why — and the impact if wrong |
|---|---|---|---|
| Initial screen · Characteristic | PS_SULFUR_PCT | The internal name of this blank. | Start custom names with your own prefix. Impact: SAP's own names begin LOBM_ — never overwrite one |
| Basic data tab · Description | Sulfur content % | The label a user reads on screen. | This exact text is what appears on the batch's Classification tab. Impact: cosmetic, but this is the only text the storekeeper sees |
| Basic data · Status | 1 Released | Is this blank ready to be used? | ⚠️ Impact: any other status and the characteristic cannot be put into a class — a very common beginner block |
| Basic data · Char. Group · Auth.Group | leave blank | Optional grouping / authorisation. | Housekeeping only. Impact: none |
| Format box · Data Type | NUM (Numeric Format) | What kind of answer goes in this blank — number, text, date, time or currency? | Sulfur is a measured number. Impact: pick CHAR and you can never sort or compare it numerically |
| Format · Number of Chars · Decimal Places | 5 · 2 | How long is the number, and how many digits after the point? | 5 characters incl. 2 decimals gives 0.05 up to 99.99. Impact: too small and the lab value will not fit |
| Format · Unit of Measure | % | In what unit is the value measured? | Shows as "0.05 %" everywhere. Impact: a missing unit makes the value ambiguous on reports |
| Format · Template · Exp. display | fills itself (___.__ · 0 No exponent) | How the number is displayed. | Leave the defaults. Impact: none |
| Value assignment box | Single-value | Can a lot have one answer, or several? | A lot has one sulfur reading. Impact: "Multiple Values" is for things like "colours available", and it breaks sorting |
| Value assignment · Entry Required | leave unticked | Must every lot answer this blank? | Tick it only if a lot without the value is genuinely invalid. Impact: ticking it blocks saving a batch that has no reading yet |
| Save | — | Commit. | "Characteristic PS_SULFUR_PCT saved" |
You will need a date characteristic for FEFO in B4. Do not build one. SAP ships LOBM_HSDAT — "Date when Batch Was Produced". Open it in CT04 → Addnl data tab and you see why it is special:
| Field on Addnl data | Value on LOBM_HSDAT | What that does |
|---|---|---|
| Reference to Table Field → Table Name | MCH1 | reads straight from the batch master table — and MCH1 is the material-level table, matching our batch level from A1 (on a plant-level system it would be MCHA) |
| Reference to Table Field → Field Name | HSDAT | the Date of Manufacture you typed in A3 — so the value copies itself onto the batch |
| Procedure for Value Assignment → Not Ready for Input | ✓ ticked | you cannot type into it, on purpose — the batch master is the single source of truth |
💡 The lesson: a characteristic with a table reference is a window onto a real field, not a place to store data twice. Other useful ones: LOBM_VFDAT (expiry / SLED), LOBM_LFDAT (goods receipt date), LOBM_LWEDT (last GR), LOBM_ZUSTD (batch status).
Step 2 — create the class · CL02 (again: type the name and class type, then press Create)
| Where on screen · Field | Fill | What it asks — in plain words | Why — and the impact if wrong |
|---|---|---|---|
| Initial screen · Class | PS_IRON_BATCH | The form's name. | One class can serve many materials. Impact: none if you rename, but keep it obvious |
| ⭐ Initial screen · Class type | 023 (SAP shows "Batch") | What kind of object is this form for? | SAP has dozens of class types for different objects; 023 is the one for batches. Impact: any other type and the class will simply not attach to a batch — you will get "class type not allowed" |
| Basic data tab · Description | Iron ore batch quality | Plain-words name for the form. | Appears in F4 help. Impact: cosmetic |
| Basic data · Status | 1 (Released) | Is the form ready for use? | ⚠️ Impact: an unreleased class cannot be used to classify anything |
| Basic data · Valid From / Valid to | today / 31.12.9999 | For how long is this form valid? | Defaults are fine. Impact: a Valid From in the future hides the class |
| Basic data → box Same classification | Warning message (the default) | What if two lots end up with identical values? | Warn, don't block — two heats can legitimately test the same. Impact: "Check with error" would refuse to save the second lot |
| ⭐ Char. tab | row 1 PS_SULFUR_PCT · row 2 LOBM_HSDAT | Which blanks belong on this form? One characteristic per row. | SAP fills Description / Data type / Length / Unit automatically once you press Enter — that is your confirmation the name was right. Impact: ⚠️ add every characteristic you will ever need BEFORE you start classifying batches. Add one later and every already-classified batch shows ? for it (see the Errors table) |
| Save | — | Commit the class. | "Class PS_IRON_BATCH created" |
Step 3 — write the values onto a lot · MSC2N
MCHA and fails with "Object type MCHA not defined as classifiable object". Our system is at Material level, where a batch is the MCH1 object. MSC2N uses the right object — and no config change is needed. (This is the single most useful consequence of knowing your batch level from A1.)
| Where on screen · Field | Fill | What it asks | Why — and the impact if wrong |
|---|---|---|---|
| MSC2N initial · Material · Batch · Plant | RM-IRON-HEAT-01 · HEAT-26-01 · PK01 | Which lot are you filling in? | Same keys as A3. Impact: — |
| Classification tab → box Classification of Batch · Class | PS_IRON_BATCH | Which form applies to this lot? | Type it and press Enter — Class Type fills itself with 023. Impact: until you name a class, the value grid stays empty |
| Grid "Values for Class … " → General tab | Sulfur content % = 0.05 · Date when Batch Was Produced = fills itself | The real measured values for THIS lot. | The grid shows the Characteristic Description, not the technical name. The date is greyed out because it mirrors the batch's Date of Manufacture. Impact: wrong readings mislead every later pick and trace |
| Bottom-right status button | watch it | SAP tells you the health of this classification. | It reads "Inconsistent" when the class gained a characteristic after this batch was classified. Impact: ⭐ pressing Save re-syncs it — this is the fix for the FEFO ? problem in B4 |
| Save | — | Commit. | The lot now carries its own facts |
✅ Proven live: characteristic PS_SULFUR_PCT (NUM, 5, 2, %) + LOBM_HSDAT in class PS_IRON_BATCH (type 023, status 1) → batch HEAT-26-01 classified with Sulfur = 0.05 % and produced date 22.07.2026. Check it any time in MSC3N → Classification.
B2 · OPTIONAL Let SAP invent the batch number · OMCZ → SNRO → OMJJ 🎯 PROVEN LIVE
C (row 3 below) means "automatic, no manual creation" — after that, SAP will not let you type BDL-26-001 by hand on that movement type any more. It is a one-field change you can undo (set it back to blank), but it surprises people. Blank = automatic OR manual · C = automatic only.
⚡ This step will: make the Batch field optional at goods receipt — leave it blank and SAP creates the batch itself. 📄 paper: customizing · 📦 stock: no change · 💰 money: no posting
| # | Where on screen · Field | Fill | What it asks — in plain words | Why — and the impact if wrong |
|---|---|---|---|---|
| 1 | OMCZ screen: "Activate Internal Batch Number Assignment" — it opens straight onto one box, no popup |
in box Automatic Batch Number Assignment pick radio Active (only other option: Inactive) → Save (Ctrl+S) |
Should SAP invent batch numbers when you don't supply one? | Turns the feature on. Impact: it is client-wide — every batch-managed material is affected, so treat it as a project decision, not a personal preference. ✅ Ours is already Active |
| 2 | SNRO screen: "Number Range Object Maintenance" |
field Object Name = BATCH_MAT → then press the Display button (the three buttons are Display · Change · Create — there is no Enter-and-go) |
Which pool of numbers should SAP draw from? SNRO asks for an "object" name. | ⚠️ The object depends on your batch level (A1): BATCH_CLT = client · BATCH_MAT = material ← ours · BATCH_PLT = plant. Impact: maintain the wrong object and nothing happens at all, with no error to tell you why |
| 2b | the screen that opens: "Number Range Object BATCH_MAT: Display" two tabs: Intervals | Customizing |
nothing to fill — just read it | What kind of numbers does this object hold, and what splits them into groups? | ⭐ This screen proves what the "subobject" is. On the Intervals tab: Number Length Domain = CHARG, % Warning = 10.0, and Subobject Data Element = MTART — and MTART is the material type. That one field is the whole answer to "what is a subobject here?" |
| ⭐ 2c | press Interval editing (F7) in the button row just under the title | — | How do I get from the object to the actual number bands? | ⭐ The step that gets everybody lost. There is no button called "Number Ranges" — it is called Interval editing and it is an icon with no text, so it is easy to miss. Pressing it jumps you into a different transaction, SNUM. (The other icon there is Change documents (F6) — not what you want.) |
| 2d | screen: "Edit Intervals: Batch Number Assgnmt, Object BATCH_MAT" | field Material Type = ROH → press the Intervals button with the pencil (change) |
Which kind of material are these numbers for? | ⭐ The field is labelled "Material Type", not "Subobject". SAP renames it using MTART's own text, so the word "subobject" never appears — which is exactly why people cannot find where to type ROH. ⚠️ There are two buttons both called Intervals: the one with glasses only displays, the one with a pencil lets you edit. A third, NR Status, sets the counter |
| 2e | screen: "Edit Intervals: … Object BATCH_MAT, Subobject ROH" columns: Number Range No. · From No. · To Number · NR Status · External |
press Insert Line (F6) → fill 01 · 0000000001 · 9999999999 · leave External unticked → Save |
Which numbers, for which kind of material? | ⚠️ The button is "Insert Line", not "Insert Interval", and it only appears after you press Display <-> Change (Ctrl+F1) — in display mode there is nothing to press and Save is greyed out. Each material type gets its own counter. Impact: our BATCH_MAT already had 38 intervals for custom Z* types but none for ROH, so a receipt with a blank batch failed until we added it. ⭐ NR Status is the live counter — ours read 6 right after SAP handed out batch 0000000006, which is how you prove the range is really being used |
| ⭐ 3 | OMJJ → answer two short popups → you land on Change View "Movement Type": Details, header 101 GR goods receiptthe field is in box Entry Control, left column, third row down |
Popup 1 "Field Selection" → tick Movement Type → Enter. Popup 2 "Determine Work Area: Entry" → From: 101 → Enter.Then field Create New Batch: leave blank for normal use, or C only to forbid typing a batch by hand → Save (Save asks for a customizing transport request) |
For THIS movement type, may the user type a batch, or must SAP generate one? ⭐ Why 101? The setting is per movement type, not a global switch. 101 is simply the movement you are testing with. The decision block below shows how to work out your own list. |
⚠️ Two traps here, and each one costs hours. Trap 1 — where the field is. The tree on the left has a node called Update control / WM movement types, and the name sounds exactly right. It is the wrong place. Create New Batch is in the Entry Control box on the main Details screen. Impact: you search the tree, decide the field does not exist in your release, and abandon automatic numbering that was available all along. Trap 2 — what blank means. Blank is "Automatic / manual without check", so automatic is already switched on. Verified here: 101 is blank and SAP still generated 0000000006. Impact: people set C thinking that is what turns automation on. It is not — it only removes the users' ability to type a supplier's heat number, which in steel, food and pharma is the number that must appear on the certificate. Pick C only when you have a reason to forbid manual entry.Full list from F4 — blank Automatic/manual without check · A + check against external number range · B + check in USER EXIT · C Automatic / no manual creation · D Manual without check · E Manual + external range check · F Manual + USER EXIT · G No creation |
| 4 | Test: MIGO goods receipt 101 against a PO | leave the Batch field blank → tick Item OK → Post | Does it work? | SAP assigns the number at posting, so the field stays blank while you work — there is nothing to see on screen. Impact: people think it failed. Check afterwards in MMBE, MB51 or MCHB, and watch NR Status in step 2e tick up by one. ⚠️ In MIGO the button is called Post, not Save — and it stays greyed until Item OK is ticked |
They cannot be skipped. OMJJ maintains a view cluster, so it must first ask which key you want to work by. Press Enter on popup 1 without ticking anything and SAP answers SV 032 "Position the cursor on a valid entry" — it simply will not move on. So this is two Enters, not a procedure.
⭐ Popup 2 gives you a choice, and it changes where you land:
| In popup 2, From: | You land on | Use it when |
|---|---|---|
type 101 |
Details — the single-movement screen with all three boxes (Entry Control, Updating Control, Internal Control) | You know which movement you want and you want to read or change its fields. This is the route the table above uses. |
| ⭐ leave it blank | Overview — a grid of all 322 movement types, 27 rows at a time, with the settings as columns | ⭐ You want to SEE the pattern. Both batch fields are columns here — Classif.batches and Create New Batch — so you can read 101, 102, 121, 201 … side by side and watch which movements SAP switched on and which it left blank. Double-click any row to open its Details. |
💡 Do the blank one once. It is the fastest way to understand that these settings are a delivered pattern you are auditing, not a blank form you must fill in — the point the decision block below is built on. The Overview also shows the other 14 fields as columns, which is a quick way to compare any movement type against another.
What this screen actually is. OMJJ is the rule sheet for one movement type. Movement 101 is "goods receipt against a purchase order" — the single most used movement in the whole system.
💡 Everyday picture: it is like the settings on the company's main gate. Every delivery for every plant comes through that gate. Change a setting and you have changed it for everybody, not just for your practice material.
⚠️ The blast radius: these settings are not per plant, not per material, not per user. They apply to every company code and every plant in the client. Saving asks for a customizing transport request, because SAP treats it as a change that must travel to the production system. In a real project this is a change request with an approval, not something a consultant edits on a whim.
✅ The good news — for batch work only TWO of the ~20 fields matter: Create New Batch and Classif.batches. Everything else on this screen belongs to other topics (printing, costing, statistics, physical inventory). Look at them, understand them, change nothing else.
👀 Safest way to practise: reach the screen, read the fields against the table below, then leave with F3 — do not press Save. On our system everything needed for auto-numbering is already set, so you lose nothing by only looking.
🔍 The whole screen, field by field — every value list below was read from the live F4 help on this system, and the "Ours" column is what movement 101 actually holds today.
The screen has three boxes plus a tree on the left. The tree nodes (Short Texts · Allowed Transactions · Help Texts · Field selection · Update control / WM movement types · Account Grouping · Reversal/follow-on movements · Reason for Movement · Deactivate QM inspection · LIS Statistics Group) are separate sub-screens, and none of them holds the batch fields. The node called Update control / WM movement types is the one that misleads everybody, because the name sounds like where batch behaviour would live. Everything this step needs is in the three boxes on the main screen.
Box 1 — Entry Control (what the user may type, and what SAP checks, while the document is being entered)
| Field | Ours | What it does — plain words | What to choose, and when |
|---|---|---|---|
Print itemKZDRU |
1 |
Which paper slip SAP offers to print for this movement. | 8 options: blank No Document Printout · 1 Material Document Printout · 2 Return Delivery · 3 GR/GI Slip for Subcontracting · 4 Inventory List W/o Sales Price · 5 Inventory List w. Sales Price · 6 Matl Doc. Printout for GR/GI · 7 Transfer Posting. Leave it. Nothing to do with batches |
Selection parameterSELPA |
WE101 |
Which screen layout / default profile MIGO uses for this movement. | Never change. SAP ships one per movement (WE101 = the goods-receipt layout). Changing it makes MIGO look wrong for everyone |
⭐ Classif.batchesKZCLA |
3 |
Does SAP ask you for the batch's characteristic values while you post? | blank No Branching to Batch Classification · 1 Background (All Batches) · 2 Foreground only for Mandatory Chars · 3 Always Invoked in Foreground (All Batches) ← ours · 4 Foreground for New Batches Only.When to pick what: use 4 in a real plant — you only want to be asked about batches nobody has valued yet. Use 3 for training, so you always see the screen. Use blank if the lab enters values later in MSC2N instead. ⚠️ 3 is why MIGO opens one Classification screen per batch, existing batches included |
⭐ Create New BatchCHNEU |
blank | May the user type their own batch number, or must SAP generate it? | blank Automatic / manual without check · A + check against external number range · B + check in USER EXIT · C Automatic / no manual creation · D Manual without check · E Manual + external range check · F Manual + USER EXIT · G No creation.When to pick what: keep blank for a steel plant — the storekeeper types the mill heat number when there is one, and SAP invents a number when there is not. Pick C only when numbers must be machine-generated with no exceptions (audit or pharma discipline). Pick G to forbid creating batches on this movement altogether |
Ext. Classific.XKCFC · tick box |
☐ | Hands classification to a program instead of a person — "extended classification" via a customer function. | Leave unticked unless a developer has actually written that function. Ticking it with no code behind it means values are simply never filled |
Copy CharsMILL_CPCONF |
blank | Copies characteristic values from a configurable material into the batch automatically. | blank Do not copy characteristics · 1 Copy only classification characteristics · 2 Copy only configuration characteristics · 3 From configuration (priority) and classification · 4 From classification (priority) and configuration.Leave blank — it only helps if you use variant configuration (made-to-order products). Our iron ore is not configurable |
Check SLExpir.dateKZMHD |
1 |
Shelf-life expiry date — must the storekeeper enter it, and should SAP refuse goods that are already too old? | blank No check · 1 Enter and check ← ours · 2 Enter only · 3 No check at goods issue.Genuinely batch-related. Use 1 for food, chemicals, paint, medicine — anything that expires. Iron ore does not expire, so the field only appears if the material master has a minimum remaining shelf life filled in |
Account controlKZKON |
blank | Forces the movement to a particular kind of account assignment. | FI/CO territory. Leave it. Wrong value here posts your goods receipt to the wrong account |
Control ReasonKZGRU |
- |
Whether a reason for movement may or must be entered (e.g. "damaged in transit"). | - means not used here. Turn it on for scrapping and returns, where you want the why recorded. The reason codes themselves live in the tree node Reason for Movement |
Stck Determation RuleRULES |
blank | Which stock determination rule applies — SAP choosing which stock to take (own vs consignment, which plant). | Only 0001 exists on this system. Different feature from batch determination (B4), which is chosen by the search procedure in OMCG. Leave blank |
RevGR despite IRXWSBR · tick box |
☐ | May a goods receipt be reversed after the supplier's invoice has already been posted? | Leave unticked to keep goods and invoices in step. Tick it only if your finance team accepts reversals out of order |
Box 2 — Updating Control (what else SAP updates in the background when the document posts)
| Field | Ours | What it does — plain words | What to choose, and when |
|---|---|---|---|
Create SLoc. automat.XLAUT | ☑ | If you receive into a storage location that has never been used for this material, SAP creates the storage-location record for you instead of erroring. | Keep ticked. Untick it and receipts fail with "storage location not maintained" until somebody extends the material by hand |
Ind. rqmts reductionXPBED | ☑ | Reduces the planning requirement when the goods actually arrive, so MRP stops asking for them again. | Keep ticked. Planning field, not a batch field |
Generate ph.inv.doc.XINVB | ☐ | Creates a physical-inventory (stock count) document automatically. | Leave unticked — it belongs to cycle counting, not goods receipt |
Automatic POXNEBE | ☐ | Lets SAP invent a purchase order for a receipt that arrived without one. | Leave unticked. Tick it only for the deliberate "goods receipt without PO" process, which needs its own controls |
Statistically relev.KZSTR | 2 | Whether this movement feeds reporting / analytics. | blank Not relevant · 2 Document evaluations and standard analyses ← ours · 3 Standard analyses only. Leave it — changing it silently breaks reports |
Consumption postingKZVBU | G | Whether the movement counts as consumption (used up) for planning and costing. | blank No consumption update · G Planned withdrawal (total consumption) ← ours · R Planned if there is a reservation, otherwise unplanned · U Unplanned withdrawal. Leave it |
StoreXOARC | ☐ | Archives the document image (optical archive link). | Leave unticked unless your project uses document archiving |
Box 3 — Internal Control — and SAP labels this box, in its own words, "(Please Do Not Change)"
XSTBW, CostElem account XKOKO) are greyed out so you cannot. The rest — Mvt type category, Debit/Credit Ind. (ours S = debit, stock going up), Reserv. cat., GR Blocked Stock, Direction Indicator — are how SAP itself recognises movement 101. Changing one does not "customise" the movement; it breaks it, and the damage shows up as wrong accounting months later.
🧠 How to actually DECIDE these values — not just where to type them
Knowing where a field lives is the easy half. The half that makes you a consultant is knowing which value to pick, on what basis. Here is the honest answer, and it starts with something reassuring.
We read table T156 on this system for every movement type from 101 to 565 — 153 movement types — and looked at what SAP shipped:
| Field | What SAP shipped across 153 movement types | What that tells you |
|---|---|---|
Create New BatchCHNEU |
Blank on 152 of 153. The only non-blank row is 561 = C — and that one was changed by us, experimenting. SAP's own delivered value is blank everywhere. |
⭐ You almost never touch this field. Blank already means "automatic or manual", so automatic numbering works out of the box. If your instinct is to change it, that instinct is usually wrong |
Classif.batchesKZCLA |
31 movement types = 3 (always ask, foreground) · 2 = 4 (ask for new batches only: 310, 501) · 1 = 1 (background) · 119 = blank (never ask) |
SAP already asks for quality data on the movements where a batch typically arrives, and stays quiet on the rest. Your job is to check whether that matches your process — not to fill in 153 rows |
💡 The lesson: this screen is not a blank form waiting for you. It is a sensible default you audit. A consultant who changes nothing here, and can explain why, has done the job correctly.
Decision 1 — Create New Batch: ask one question about your business
| Ask yourself… | If the answer is… | Choose | Real example | What it costs you |
|---|---|---|---|---|
| "Is the batch number ever supposed to come from OUTSIDE my company?" i.e. printed on a supplier's certificate, a mill heat number, a customer's lot id |
Yes, sometimes — a supplier's heat number must be kept | blank | PakSteel buying iron ore: Mughal Steel's certificate says heat H-4471. The storekeeper must be able to type it. |
Nothing. Staff may type, and if they leave it empty SAP still invents one. This is the right answer for us. |
| Never — every lot is created inside our own factory, and nobody outside names it | C |
A dairy bottling plant: every batch is one shift's production. No outside party ever supplies a lot number. | Staff lose the ability to type a batch on that movement. If a supplier certificate ever needs recording, you are stuck. | |
| Never, AND an auditor must be able to prove no human invented a number | C + tell the auditor |
Pharma: the regulator wants proof that lot ids are machine-generated and unbroken. | Same as above, and now the number range itself becomes an audited object. |
C because it sounds more automatic. It is not — blank is already automatic. C only removes a freedom from your users. Ask "do I need to forbid manual entry?" — if you cannot name a reason, leave it blank.
💡 Best of both worlds: leave it blank, let SAP number the batch, and record the supplier's number in the batch's Supplier Batch field (see A3). Speed and traceability, no lost freedom.
Decision 2 — Classif.batches: who knows the quality number, and when?
| Ask yourself… | If the answer is… | Choose | Real example | What goes wrong if you pick another |
|---|---|---|---|---|
| "At the exact moment the stock is booked in, does the person at the keyboard already KNOW the quality values?" | Yes — the certificate is in their hand, and it is a new lot | 4 (new batches only) |
Ore arrives with a mill certificate. Storekeeper types sulfur as they book it in. Existing batches are not re-asked. | This is the best real-plant setting. With 3 they get nagged about batches that were already valued weeks ago |
| Yes, and I want to see it every single time while learning | 3 (always) |
Our system, movement 101. Good for practice because the screen never hides from you. | ⚠️ In production this is irritating: one Classification screen per batch on every receipt, existing lots included | |
| No — our own lab tests it a day later | blank | PakSteel testing ore in-house. The storekeeper knows nothing yet, so asking them is pointless. QC types it later in MSC2N. | With 3 or 4 the storekeeper meets a screen they cannot fill, and learns to press past it — which is how empty classifications happen |
|
| No — a program fills it from a lab system | 1 (background) |
An interface posts results automatically; no human should be interrupted. | A foreground value stops an automated posting dead, waiting for a human who is not there |
4). If no → don't (blank), and collect the values later. Everything else follows from that.
Decision 3 — which movement types do I even have to look at?
This is the question the step table cannot answer for you, because the answer is your process. You do not configure 153 movement types. You configure the handful your material will actually experience. Build the list like this:
- Draw the life of one batch, from the gate to the customer. Where does it come in? Where does it move? Where does it leave?
- Write down the movement type for each arrow. If you do not know it, post the movement once in a test client and read it off the material document in MB51.
- Only the arrows where a batch is BORN need Create New Batch thinking — a batch cannot be created on a movement that only takes stock away.
- Only the arrows where somebody knows the quality values need Classif.batches thinking.
| PakSteel's batch life | Movement | Batch born here? | SAP's shipped Classif.batches | Is that right for us? |
|---|---|---|---|---|
| Ore arrives from Mughal Steel against a PO | 101 | ✅ yes | 3 — always ask | ⚠️ ask, but 4 would be kinder in production |
| Ore issued into the furnace | 261 | ❌ no — stock leaves | 3 | Values already exist; nothing to type. Harmless |
| Ore issued to a cost centre | 201 | ❌ no | blank — never ask | ✅ correct. This is also the movement B4's FEFO rule runs on |
| Billets received from production | 101 / 531 | ✅ yes | 3 on both | ✅ correct — a new lot with new quality data |
| Transfer Karachi → Lahore | 301 / 311 | ❌ no (at material level the batch keeps its identity — see A1) | blank / 3 | ✅ fine either way |
| Scrap an out-of-spec lot | 551 | ❌ no | 3 | ✅ fine — and a good place to record why it failed |
| Load opening stock at go-live | 561 | ✅ yes | blank | ⚠️ the one to watch — see below |
Auto-numbering does not work on movement 561 (loading opening stock). The natural reaction is "a setting must be missing", and the natural fix is to set Create New Batch to C on 561. That does not work either — and now the movement type carries a changed value that nothing needs.
The real reason is a known SAP limitation, KBA 3604498: 561 simply does not auto-generate batches, whatever you set. A goods receipt against a PO (101) does — and 101 is still sitting on blank to this day.
Two habits to take from that:
- Before changing a field, check what SAP shipped and ask why. If 152 of 153 rows are blank, blank is probably correct and your problem is somewhere else.
- When a setting "does not work", search for a KBA before you keep turning knobs. A leftover
Con 561 is now permanent noise in this system — a small mess left behind by guessing.
0000000002 by itselfA goods receipt (mvt 101) against a PO for RM-IRON-HEAT-01 with the Batch field empty → SAP created batch 0000000002 holding 10 TO (verified in MCHB). A purely numeric batch number is the giveaway that the system, not a person, produced it.
📌 Where to see the number afterwards: MMBE (own line) · MB51 (Batch column) · MSC3N · SE16 → MCHB. The counter NRIV-NRLEVEL also ticks up — proof the number came from your interval.
⚠️ Known SAP quirk: movement 561 in MIGO does not auto-generate a batch even with all three settings right (SAP KBA 3604498). Use a normal PO receipt (101) to test. Impact: test on 561 and you will conclude your three settings are broken when they are correct — hours lost chasing configuration that was never the problem.
📌 A harmless popup you WILL see in SNRO: "The intervals are not included in automatic recording of customizing changes…" — an information notice, not an error. Press the green ✓ and carry on.
B3 · OPTIONAL Make the number reveal the product family · SNRO 🎯 PROVEN LIVE
⚡ This step will: give each material type its own number band, so the first digit of any batch number tells you the product family. 📄 paper: number-range intervals · 📦 stock: no change · 💰 money: no posting
| Where · Field | Fill | What it asks | Why — and the impact |
|---|---|---|---|
SNRO → BATCH_MAT → Interval editing (F7) → Material Type → Insert Line | Subobject HALB · From 2000000001 To 2999999999 | Which band for semi-finished goods? | Every semi-finished batch now starts with 2. ✅ exists live — verified in NRIV |
| same, next interval | Subobject FERT · From 3000000001 To 3999999999 | Which band for finished goods? | Starts with 3. ✅ exists live — verified in NRIV |
⚠️ same, fix the ROH interval | change ROH from 0000000001–9999999999 to 1000000001–1999999999 | Which band for raw materials? | ⚠️ Live finding: our ROH interval is still the full 0000000001–9999999999, which overlaps the HALB and FERT bands and is why B2 produced 0000000002 instead of 1000000002. Narrow it and the first digit becomes meaningful. Impact: leave it wide and the scheme only half works |
RMLL000001?" — tested live: no, not by configurationWe tried it: SNRO → BATCH_MAT → Interval editing → Material Type ROH → interval RMLL000001–RMLL999999 → rejected with NR 560: "Specify numeric interval limits." Batch number ranges are numeric only, even though the batch field itself is a 10-character text field.
And the grouping is by material TYPE, not by individual material: table TNRO shows BATCH_MAT's subobject data element is MTART — hard-wired by SAP. There is no per-material option.
👉 A true text prefix needs an enhancement. Read C1 before you promise it to anyone — including why we advised against it.
B4 · OPTIONAL FEFO — let SAP pick the oldest lot · CU70 → MBC1 → MIGO 🎯 PROVEN LIVE
⚡ This step will: hand the choice of lot from the storekeeper to SAP — at goods issue the oldest heat is proposed automatically. 📄 paper: material + accounting document · 📦 stock: ↓ from the oldest batch · 💰 money: Dr Consumption / Cr Inventory
The problem SAP had to solve. "Pick the oldest batch" is not one rule. A warehouse picks differently from a factory, which picks differently from a sales delivery. And even inside the warehouse, one material may need a special rule while everything else follows the default. SAP could not hard-code that, so it reused the same machinery it uses for pricing: the condition technique — a chain of four layers where each layer answers one question.
The four layers, top to bottom:
| Layer | Answers the question | Ours | Who creates it | Where |
|---|---|---|---|---|
| 1. Search procedure | "For this movement type, should SAP even try to find a batch — and using which rulebooks?" | ME0001 |
SAP delivers it; you assign it to a movement type | OMCG |
| 2. Strategy type | "Which kind of rule is this, and what may it be keyed by?" | ME01 |
SAP delivers it. You select it. | chosen on the first screen of MBC1 |
| 3. Access sequence (the key combinations) | "In what order should SAP look — most specific rule first, most general last?" | ME01, 6 steps |
SAP delivers it. You pick which step to write on. | the Key Combination popup in MBC1 |
| ⭐ 4. Condition record | "For THIS movement, THIS plant, THIS material — which batches qualify, and in what order?" | 201/PK01/RM-IRON-HEAT-01 + class PS_IRON_BATCH + sort PS_FEFO |
⭐ YOU create this. It is the only layer you build | MBC1 · change MBC2 · display MBC3 |
💡 An everyday picture. Think of a company phone directory. The search procedure says "when a call comes in, look people up". The strategy type says which directory to open. The access sequence is the order you search it — try the person's direct line first, then their team, then the switchboard. The condition record is one actual line in the book. You do not print the directory; you add your own entry to it.
🏫 The example that makes all four click: a school's emergency contact list.
A child is unwell. The office must reach somebody. Watch how the school does it — it is the same four layers, in the same order.
| At school | Which SAP layer | In our scenario |
|---|---|---|
| 1. "Is this the kind of situation where we phone anyone?" A grazed knee → no. A fever → yes, follow the illness procedure. A fire → the emergency procedure. The situation decides whether to look at all, and which rulebook to open. |
Search procedure attached to the movement type |
Movement 201 has ME0001, so SAP looks. A movement with none simply never searches — and says nothing. |
| 2. Which list do we use — the family list, or the class-teacher list? Each list is organised by different things. | Strategy type you choose it in MBC1 |
ME01 — the list organised by movement, plant and material. An SD list is organised by customer, so it is no use here. |
| ⭐ 3. In what order do we ring? Mother's mobile → father's mobile → grandmother → neighbour. Stop at the first one who answers. Most specific first, most general last. This is the fallback. |
Access sequence the Key Combination popup |
⭐ 6 steps. SAP tries MovType/Plant/Material first. No record? It tries a looser key. Still none? Looser again — down to a rule for the movement type alone. |
| ⭐ 4. The actual line in the book: "Ahmed Khan → mother → 0300-1234567." Somebody had to write that line. Without it the list is empty no matter how good the rules are. | ⭐ Condition record what MBC1 creates |
⭐ Your line: 201 / PK01 / RM-IRON-HEAT-01 → class PS_IRON_BATCH, sorted by PS_FEFO. |
Now the failures make sense too — and notice none of them is an error message:
- Nobody attached a procedure to "fever" → the office never phones anyone. = no search procedure on the movement type: the button does nothing.
- No line in the book for this child → they work down the list and reach the end. = no condition record: nothing is proposed.
- The line exists but has no phone number → you found the entry and still cannot call. = record with no Selection criteria: empty batch list, and the Log… button says "Strategy contains no selection specifications".
- No agreed order → the office rings the neighbour before the mother. = no Sort: batches come back in random order and FEFO quietly fails.
💡 And the reason SAP built it this way: the school does not write a new rulebook for every child — it writes one set of rules and then one line per child. That is exactly why you never create a strategy type: you add your line to a book SAP already wrote. Same machinery runs pricing, so learning this once teaches you two things.
All 11 strategy types SAP delivers (read live from T685T, usage H = batch determination — every one is SAP standard, there are no custom ones on this system)
| Area | Type | Keyed by | Search procedure | A business example |
|---|---|---|---|---|
| Goods movements application ME | ME01 | MovType / Plant / Material | ME0001 | ⭐ Ours. "When issuing iron ore to production at Karachi, take the oldest heat." Precise — one movement, one plant, one material |
ME02 | Plant | "At the Lahore plant, always take the oldest batch of anything." One rule for a whole site | ||
| Production application CO | CO01 | OrdType / Plant / Material | CO0001 | "For rework orders, use the returned batches first, not fresh stock" |
CO02 | Production material | "Whenever billets are consumed by any order, take the oldest heat" | ||
| Sales & delivery application V | SD01 | Customer / Material | SD0001 | "This customer's contract says minimum 6 months shelf life remaining" |
SD02 | Customer / Matl / Plant | Same, but only when shipped from one specific plant | ||
SD03 | CountryOfDest / MatGrp | ⭐ "Anything going to the EU must be a batch that meets EU spec" — export rules by destination | ||
SD04 | Customer hierarchy | "All companies in this buying group get the same batch rule" | ||
SD05 | Cust. hierarchy / material | Same, narrowed to one product | ||
| Warehouse application WM | WM01 | Warehouse Number | WM0001 | "In this warehouse, picking always takes the nearest expiring pallet" |
WM02 | WarehouseNo. / MovType | WM0002 | Same, but only for certain movements — e.g. picking, not stock transfers |
⭐ Read the pattern: the four areas exist because the question "which batch?" is asked at four different moments — when stock moves, when production consumes, when a customer is served, and when a picker walks the aisle. Each moment knows different facts. A sales delivery knows the customer and destination country; a goods issue knows only the movement, plant and material. That is why the keys differ — and it is the reason you cannot use an SD strategy for a goods movement.
What actually happens when you press "Stock Determination" in MIGO — the chain running, in order:
| # | SAP asks | Where it looks | On our system |
|---|---|---|---|
| 1 | "Is this movement type set up for batch determination at all?" | the movement type's search procedure | mvt 201 → ME0001 ✅ already assigned |
| 2 | "Which strategy types does that procedure contain?" | the procedure's step list | ME01 |
| 3 | "For ME01, in what order do I search?" | access sequence ME01 — 6 steps, most specific first | tries MovType/Plant/Material first, then progressively looser keys |
| 4 | "Is there a record for these exact values?" | your condition record | 201/PK01/RM-IRON-HEAT-01 — found at the first step, so it stops there |
| 5 | "Which batches qualify?" | the record's Selection criteria | class PS_IRON_BATCH, values empty = any batch of that class |
| 6 | "In what order do I list them?" | the record's Sort | PS_FEFO → LOBM_HSDAT ascending = oldest first |
| 7 | "Show the list or pick silently?" | Dialog batch determin. on the record | ticked → the window appears so you can see it work |
⚠️ Break any link and the whole chain goes quiet — with no error. No procedure on the movement (step 1) → the button does nothing. No record (step 4) → nothing proposed. No selection criteria (step 5) → empty list, and the Log… button says "Strategy contains no selection specifications". No sort (step 6) → batches come back in random order and FEFO silently fails. That is why this scenario builds them bottom-up and tests at the end.
🛠️ Can you create your own strategy type? Yes — they are condition types, so a new one can be built in customizing (condition table → access sequence → strategy type → search procedure), exactly like a new pricing condition. In practice almost nobody does: the 11 delivered types already cover the four moments above. If you need a wider or narrower rule, change the key combination, not the strategy type.
People get lost here because two of the pieces sound the same. They are not:
- Sort rule (CU70) — says HOW to order the batches. "Oldest date first."
- Selection criteria (inside MBC1) — says WHICH batches qualify at all. "Any batch carrying our class."
- Search strategy (MBC1) — the record that says WHEN to apply them: for this movement, this plant, this material.
⚠️ A sort rule with no selection criteria selects nothing, so there is nothing to sort and the batch list comes back empty. That is the #1 FEFO failure.
FEFO means "pick the oldest". With only one batch there is nothing to compare, and you will never see it work. So before anything else, create HEAT-26-02 with a later manufacture date:
- MSC1N → material
RM-IRON-HEAT-01· batchHEAT-26-02· plantPK01→ Date of Manufacture = a date a few days LATER than HEAT-26-01's (ours:25.07.2026vs22.07.2026) → Save. - Put stock in it: repeat A4 with a small purchase order (e.g. 50 TO) and enter
HEAT-26-02as the batch on the goods receipt. - Classify it: MSC2N →
HEAT-26-02→ Classification → classPS_IRON_BATCH→ Save. Both batches must be classified or the unclassified one drops to the bottom of the list.
⚠️ Do not use movement 561 as a shortcut to load the second batch. It looks easier (no PO needed) but on our system it fails with "G/L account 399999 does not exist in company code PSPK", and it also never auto-numbers. A small PO plus a 101 receipt is what a real plant does anyway.
Step 1 — the sort rule · CU70 (display later with CU72, change with CU71)
| Where on screen · Field | Fill | What it asks | Why — and the impact if wrong |
|---|---|---|---|
| Initial screen · Sort Sequence | PS_FEFO | The rule's name. | There is also a Copy Template button if you want to clone an existing rule. Impact: — |
| Basic Data · description | FEFO by manufacture date | Plain-words name. | Cosmetic |
| Basic Data · Status | 1 | Is the rule released for use? | ⚠️ Impact: an unreleased sort rule is ignored silently |
| toolbar → Characteristics button | press it | Which facts do we sort on? | The Basic Data screen has no list — the list is behind this button. Impact: people save an empty rule and wonder why nothing sorts |
| ⭐ Characteristics screen · row 1 | Characteristic LOBM_HSDAT · Ascending ✓ | Sort on the batch's production date, smallest (oldest) first. | The grid has exactly two tick columns, Ascending and Descending. Ascending = oldest first = FEFO/FIFO. Impact: tick Descending and you consume the freshest stock first — the exact opposite, and the write-off comes back |
| Save | — | Commit the rule. | 💡 Sort on LOBM_VFDAT (expiry) instead if your material has a real shelf-life date |
Step 2 — the search strategy · MBC1 (display with MBC3, change with MBC2)
| Where on screen · Field | Fill | What it asks — in plain words | Why — and the impact if wrong |
|---|---|---|---|
| Initial screen · Strategy Type | ME01 | Which area of SAP is this rule for? | ME01 = Inventory Management (goods movements). Sales deliveries use a different type. Impact: the wrong type never fires in MIGO |
| ⭐ Key Combination popup — 6 choices | pick Movement Type/Plant/Material | How precisely do you want to target the rule? The other five are: Matl Type · Plant/Material · Movement Type/Material · Movement Type/Plant · Movement Type. | Most precise = safest while learning: it only ever fires for one movement, one plant, one material. Impact: choose "Movement Type" alone and your rule applies to every material in the company on that movement |
| Selection screen · Movement Type · Plant · Material | 201 · PK01 · RM-IRON-HEAT-01 | Exactly when should this rule apply? | 201 = goods issue to a cost centre, the movement we test with. Impact: the rule is silent on any other movement type |
| Fast Entry grid · No. batch splits | 0 | How many different batches may one line be split across? 0 = no limit. | Set 1 if a line must come from a single lot. Impact: too low a number and SAP cannot fill the quantity |
| Fast Entry · Changes allowed | ✓ | May the user overrule SAP's proposal? | Keep it on while learning. Impact: unticked, the storekeeper cannot correct a bad proposal |
| Fast Entry · Dialog batch determin. | ✓ | Should the proposal be shown on screen for confirmation? | ⭐ This is what makes the batch-selection window appear. Impact: unticked, everything happens invisibly and you cannot see FEFO working |
| Fast Entry · Quantity proposal | 1 | Should SAP propose quantities as well as batches? | 1 = propose the full quantity from the chosen batches. Impact: blank means you type quantities yourself |
| Fast Entry · DisplayUoM · Overdelivery allowed | B · unticked | Which unit to show; may it propose more than asked? | Defaults are fine. Impact: low |
| ⭐ toolbar → Selection criteria (F7) | enter Class PS_IRON_BATCH, class type 023 · leave all characteristic values empty | Which batches are even allowed to be considered? | Empty values = "accept any value" = every batch of this class qualifies. Impact: ⚠️ skip this and the batch list is empty, with the log saying "Strategy contains no selection specifications". The grid column Selection shows ✓ once it is set |
| ⭐ toolbar → Sort | enter sort sequence PS_FEFO | In what order should the qualifying batches be listed? | Links Step 1 to Step 2. Impact: without it batches come back in random order. The grid column Sort seq. shows ✓ once it is set |
| Save | — | Commit the strategy. | — |
Step 3 — check the procedure is assigned · OMCG (usually already done)
Search procedure ME0001 must be assigned to your movement type. On our system it already was, for movement 201 — verified live. If it is missing, nothing will ever be proposed no matter how good your strategy is.
Step 4 — see it fire · MIGO goods issue 201
| Where · Action | Do / see | What it asks | Why — and the impact if wrong |
|---|---|---|---|
| Top bar | Action Goods Issue · Reference Other · movement 201 · the small box beside it EMPTY | What kind of movement? | ⚠️ A leftover P (pipeline) in that box makes SAP search pipeline stock, which has no batches. The header text must read "GI for cost center", not "GI pipel.for cst cnt" |
| Item line · Batch column | leave blank on purpose | Which lot leaves? | Leaving it empty is the whole test. Impact: type one and you have skipped the exercise. ⚠️ Do not type * — that gives error MIGO046 |
| ⭐ Button row under the item table · Stock Determination for all items | press it — the last of the three small icons just after Contents | Ask SAP to apply the rule now. | MIGO never runs batch determination by itself. By design: typing a batch = "I choose", pressing the button = "SAP, you choose". Impact: the per-item icon in the grid is often greyed out — use the "for all items" one |
| Batch determination window | SAP lists HEAT-26-01 first and proposes its quantity | Did the rule pick the oldest lot? | Check the Characteristic Sorting column shows real dates. A ? means that batch has no value for the sort characteristic and it drops to the bottom — fix by re-saving it in MSC2N (see Errors table) |
| Log… (F6) button | press it whenever the list is empty | Why did nothing come back? | ⭐ The best diagnostic on this screen — it names the exact reason in one line |
| Post | — | Commit the issue. | Stock leaves the oldest lot, in spec, before it can expire |
Sort rule PS_FEFO (LOBM_HSDAT ascending) + strategy type ME01, key Movement Type/Plant/Material = 201/PK01/RM-IRON-HEAT-01, selection criteria = class PS_IRON_BATCH. In MIGO, SAP listed HEAT-26-01 FIRST (date 22.07.2026) ahead of HEAT-26-02 (25.07.2026) and proposed its quantity. Posted as material document 4900423478 — the older batch consumed, the newer untouched.
Full chain on this material: GR 5000047744 (101 → HEAT-26-01, 100 TO) · 4900423477 (561 → HEAT-26-02, 50 TO) · GI 4900423478 (201 → HEAT-26-01, FEFO).
✅ Verify: MMBE → the HEAT-26-01 line has dropped while HEAT-26-02 is untouched.
B5 · OPTIONAL One batch per piece / bundle · MIGO → Distribute Quantity 🎯 PROVEN LIVE
⚡ This step will: receive 3 TO of ore as three separate bundles, each with its own batch — per-item identity without changing the base unit or creating a new material. 📄 paper: 1 material + 1 accounting document (3 batch lines) · 📦 stock: 3 batches × 1 TO · 💰 money: Dr Inventory / Cr GR-IR
Step 1 — a purchase order for the total quantity (ME21N) — exactly as in A4, but quantity 3 TO. Note the PO number.
Step 2 — the goods receipt, split into 3 batches (MIGO)
- MIGO → Action
Goods Receipt· ReferencePurchase Order→ the PO number → Enter. ⚠️ Check the small box beside the movement type is empty. - Where tab → Storage Location
RAWM→ Enter. The line must be valid before the batch fields work. - Click the item line, then press Distribute Quantity — ⭐ the FIRST of the small icons immediately after "Contents" in the button row under the item table. (2nd = Expand BOM, 3rd = Stock Determination. Hover to confirm the tooltip.)
- A popup opens: "Distribute Quantity: 3 TO for Item 0001". Fill three rows:
⚠️ Batch names are max 10 characters. 💡 If you have already done B2: leave the Batch cells empty and SAP numbers them itself — and note that with OMJJ set to
Row Qty in UnE Batch 1 1BDL-26-0012 1BDL-26-0023 1BDL-26-003Cyou can no longer type these names by hand at all. - Press Check ("Already distributed" should total 3 TO) → then Adopt.
- Back on the item list you now see 3 lines, 1 TO each. ⚠️ Tick "OK" on ALL three — they come back unticked after Adopt, and a missed tick is the most common reason the post fails.
- Expand Head.data → field Delivery Note → e.g.
DN-26-001. Mandatory on our system. - Post 💾 → "Material document … posted".
Step 3 — check, and (optionally) give each bundle its own quality data
- MMBE → each bundle on its own line with 1 TO · SE16 →
MCHB→ three rows,CLABS = 1.000each. - MSC2N → batch
BDL-26-001→ Classification → its own Sulfur % / date → Save. Repeat per bundle. Now FEFO (B4) can sort between individual bundles — per-item tracking, still in tonnes.
4500032789 (3 TO) → GR split via Distribute Quantity → 3 batches of exactly 1 TO: BDL-26-001 · BDL-26-002 · BDL-26-003 (verified in MCHB). Base unit stayed TO throughout.
PC-based material) or Handling Units. Use B5 when volumes are modest, or when you genuinely need batch features (characteristics, FEFO, shelf life) on each piece.
B6 · NOT BATCH MANAGEMENT Serial numbers — where batches stop · OIS2 ⛔ BLOCKED on our system
PC/EA). ⏱️ ~45 min.They are a completely separate SAP function. They share no tables and no configuration with batches:
| Batch management | Serial numbers | |
|---|---|---|
| Module | MM — Materials Management | PM/CS — Plant Maintenance |
| Switched on by | the "Batch management" tick | the Serial Number Profile field |
| Data lives in | MCH1 / MCHB | equipment records (EQUI) |
| Transactions | MSC1N MSC3N MMBE | IQ01 IQ03 IQ09 |
| Config | OMCT OMCZ | OIS2 |
| Answers the question | "which delivery is this from?" | "which exact piece is this?" |
So why is it on this page? Because it marks the boundary where batch management stops. The moment somebody asks "can each single unit have its own identity and history?", batches are the wrong tool and you must recognise it. A material can have batches, serial numbers, both, or neither.
Rule of thumb: if you can weigh or pour it → batch. If you can count it and it has a nameplate → serial number.
Putting profile 0001 on FERT-REBAR-01 failed with M3 419: "Serial numbers can be managed only if base unit of measure is discrete."
Why: a serial number identifies one countable thing. FERT-REBAR-01's base unit is TO (tonnes) — a weight, divisible into kg and grams. Half a tonne is still ore; half a serial number is meaningless. SAP only allows dimensionless units: PC, EA, PAL.
Checked live — no existing PakSteel material qualifies: FERT-REBAR-01 & FERT-REBAR-GALV-01 = TO · PIPE-GAS-01 = M3 · RM-IRON-01 / RM-IRON-HEAT-01 = TO · PAPER = KG. Only OFFC-PAPER-01 is EA, but its type NLAG holds no stock. → To practise this you must create a new material with base unit PC. Plan serialisation before creating a material — the base unit is very hard to change later.
💡 This error IS the lesson: SAP itself enforces "batches for bulk, serial numbers for countable pieces."
0001 Integrated serial no · 0002 Serial numbers in SD · 0003 Stock check ⭐ (closest to "find each piece in the warehouse") · 0004 HU processing · 0005 Purchasing · plus GG00, GG01, J001, SPL.
| Where · Field | Fill | What it asks | Why — and the impact |
|---|---|---|---|
| OIS2 · pick a profile | 0003 (Stock check) | Which rulebook do serial numbers follow — when are they required, is stock validated? | The profile decides how strict SAP is. Impact: a stock-validating profile refuses movements when serial records don't match stock — strong control, but it blocks sloppy data |
| Material master · MM02 → Work Scheduling or General Plant Data / Storage 2 → Serial Number Profile | 0003 | Should THIS material be tracked piece by piece? | Like the batch tick, but for individual pieces. Impact: ⛔ fails with M3 419 unless the base unit is PC/EA |
| Goods receipt · MIGO → Serial Numbers tab | type or scan one serial per piece | Which exact pieces arrived? | 10 pieces = 10 serial numbers. Impact: SAP creates an equipment record per piece and will not post until the count matches the quantity |
| Check it · IQ03 / IQ09 | — | Where is this exact piece, and what happened to it? | Full history per piece. Impact: a warranty claim is traced to one unit, not a whole lot |
🎯 Which for PakSteel? Iron ore = batches. Motors, weighbridges, forklifts = serial numbers. Many plants use both: the batch says which heat the steel came from, the serial number says which machine is on which line.
B7 · OPTIONAL Barcode labels — so the worker can read the batch off the item → Scenario 27
Batch management only pays off if the number is readable on the item itself. That is barcode labelling, and it is big enough to have its own page: Scenario 27 — Barcode Labels & Scanning covers SAP's built-in barcodes (SE73), printing a label automatically at goods receipt (NACE application ME + MN21), and scanning it back in — which needs no configuration at all, because a scanner is just a very fast keyboard.
Scenario 27 also marks clearly which steps belong to MM, which to Basis, and which to ABAP — useful when you have to tell a client who does what.
PART C · WHEN CONFIG IS NOT ENOUGH
Nothing here is needed to make batch management work. It is the part most courses skip — and the part interviewers ask about. Read it once; there is nothing to post.
C1 What configuration could NOT do — and what happens next
RMLL000001 for Rebar LL, RMAA000001 for Rebar AA — with the serial running automatically." A completely normal request from a warehouse manager.
We tested three standard options on the real system before saying "no" to any of them:
| Idea | How we tested it | Result |
|---|---|---|
Letters inside the number range — RMLL000001–RMLL999999 | SNRO → typed it → Enter | ❌ NR 560 "Specify numeric interval limits" — batch ranges are numeric only |
| A separate range per individual material | SE16 → TNRO | ❌ the range is keyed to material TYPE (MTART), hard-wired by SAP — there is no per-material option |
| ⭐ Numeric bands per material type | SNRO → intervals | ✅ Works, no code — 2… = semi-finished, 3… = finished. This is B3, and it delivers about 90% of the value at zero risk |
One more finding worth saying out loud: we checked, and the hook does not currently work on this system. It exists on paper, but a missing piece of technical plumbing means nobody could build it here today without Basis help first. Confirming that before promising a date is exactly the kind of check that separates a careful consultant from an optimistic one.
You do not write the code. You do these five things, then hand the result to a developer:
- Prove configuration cannot do it — exactly as in the table above. Always first.
- Find the official hook and read what it offers. For batch numbers there is one, and SAP even built a movement-type setting to switch it on.
- Check the hook really works on your system — not just that it exists. This is the step everybody skips, and it is what caught us out here.
- Write a short functional spec: when it fires, what data it receives, what it must return, and what it must not touch.
- Agree the cost — testing at every upgrade, forever.
👉 All five steps, the exact searches, and the real batch hooks are on one page:
📘 MM Customisation Guide → Batch management — including two hooks you have not met yet, which fill batch data and propose batch numbers automatically at goods receipt.
Also there: the 6-step test for "can this be customised?" · what must be in place before any code is written · the full catalogue of MM hooks (purchase orders, goods movements, invoices, material master, release strategy, output).
C2 Which layer solves which requirement — the decision you actually make
A consultant's real skill is not knowing every setting. It is knowing which layer a requirement belongs to, and stopping at the cheapest layer that works.
| If the business asks for… | Layer | Code? | Where |
|---|---|---|---|
| "Track our stock by delivery / lot" | Configuration + master data | ❌ none | Part A |
| "Record test results per lot" | Master data | ❌ none | B1 |
| "Stop staff typing lot numbers" | Configuration | ❌ none | B2 |
| "The number should show the product family" | Configuration | ❌ none | B3 |
| "Always use the oldest stock first" | Configuration | ❌ none | B4 |
| "Every roll must be identifiable" | Master data | ❌ none | B5 |
| "Track each individual machine" | Master data — but a different module | ❌ none | B6 |
| "Block a purchase order that breaks our rule" | Enhancement | ✅ small | 📘 Customisation Guide → Purchase orders |
| "Refuse to save a material that breaks our data rules" | Enhancement | ✅ small | 📘 Customisation Guide → Material master |
"The number must literally read RM-LL-00001" | Enhancement ⚠️ | ✅ yes | C1 above — and ask whether it is worth it |
That shows config knowledge, enhancement knowledge, and commercial judgement.
🐞 Errors we hit live — and how to fix them
These are the real blocks we met running this scenario on our IDES (DEV / 250). Each one teaches you to read SAP's "error language" and tie it back to a cause.
| Step · Where | What SAP shows | What it means & why it happens | How to fix it |
|---|---|---|---|
| A1 · OMCD | Opens a screen titled "Default: 'Delivery-Completed' Indicator" — nothing about batches | On S/4HANA OMCD is not the batch-level transaction (older notes used it). Wrong code → wrong screen. | Use OMCT → button "Batch level". |
| A1 · OMCT | The batch-level radios are effectively fixed; a change won't stick | Once any batches exist, SAP locks the batch level — changing it is a data-conversion project. Our system has 200+ batches, so it is frozen at Material level. | Nothing to fix — check, don't change. Only a brand-new sandbox with zero batches can pick freely. |
A2 · MM02 on RM-IRON-01 |
"Batch management requirement cannot be changed" — M3 530 (with a 'Display errors' button) | You tried to turn batch management on for a material that has stock (105 TO). SAP blocks the flag unless stock is zero for two consecutive periods — old stock has no batch to belong to. | Create a fresh, zero-stock material that is batch-managed from birth — step A2. (Or empty the old one for two periods first.) |
| A4 · ME21N | "Material RM-IRON-HEAT-01 not maintained by accounting department" — ME047 | The new material has no Accounting view (no valuation class / price). A PO needs a price to value the goods. Copying from another material does not always carry the accounting data across. | Add Accounting 1 in MM02 for plant PK01: Valuation class 3000, Price control V, Moving price 250000, Price unit 1. Then create the PO again. |
| A4 · ME21N | "Net price must be greater than 0", and the price field won't keep a typed value ("No condition record found for PB00") | PakSteel's purchasing pricing schema takes the base price only from PB00 (automatic), which reads a purchasing info record. With no info record PB00 = 0, and a manually typed price is not retained. |
Create the info record (ME11): MUGHAL21 / RM-IRON-HEAT-01 / PKLO / PK01 → Net price 250000/TO, Std Qty 100, Planned deliv. 5 days. (Ours: 5300079965.) |
| A4 / B5 · MIGO | Post does nothing, or "Enter Delivery Note" | Two separate causes: the item's OK tick is missing (it clears itself after Adopt in B5), or the mandatory Delivery Note header field is empty. | Tick OK on every line, and expand Head.data → fill Delivery Note. |
| B1 · CT04 / CL02 | "Class type 023: Class PS_IRON_BATCH not yet created" | You typed the name and pressed Enter. Enter means "open the existing one" — and it does not exist yet. | Type the name, then press the Create button (the blank-page icon), not Enter. |
| ⭐ 16.7 · OMJJ — cannot get started | OMJJ opens on a tick-box list titled "Field Selection", not on a movement type. Pressing the green tick without ticking anything goes nowhere. | Not an error. OMJJ maintains a view cluster, so it first asks which key do you want to filter by. There are two popups: "Field Selection", then "Determine Work Area: Entry". | Popup 1: tick Movement Type → green tick. Popup 2: From: 101 → green tick. Now you land on Change View "Movement Type": Details. |
⭐ 16.7 · SNRO — no "Number Ranges" button, nowhere to type ROH |
You reach "Number Range Object BATCH_MAT: Display" and there is no button with that name, and no field called "Subobject". | Two naming problems. The button is Interval editing (F7) and it is an icon with no label. And on the next screen (transaction SNUM) the subobject field is relabelled "Material Type", because SAP borrows the text of the data element MTART. |
Press Interval editing (F7) → field Material Type = ROH → the Intervals button with the pencil → Display <-> Change (Ctrl+F1) → Insert Line (F6) → Save. "Insert Interval" does not exist either. |
| ⭐ B1 · MIGO Classification screen — Save is greyed out | You type the characteristic values, and there is no way to save. The Inconsistent button is red and cannot be clicked, and the status bar shows no message. | Nothing is wrong. This screen is a sub-screen MIGO borrows from Classification (SAPLCLFM/SAPLCTMS), and a borrowed sub-screen has no Save of its own — the owner document saves it. Inconsistent is a display-only status label, not an error. |
Press F3 (Back). ⚠️ F3 does not exit — it moves to the NEXT batch's classification screen (watch the Batch field change). Keep pressing until MIGO reappears. Then tick Item OK and press Post — the classification is written together with the material document. Clear the Inconsistent flag afterwards with MSC2N → Classification → Save. |
| ⭐ A4 / B1 · ME21N (not an error — a misunderstanding, and a very common one) | "I created the characteristic, the class and the batch. Now I make the purchase order and there is no Classification tab on it." | Nothing is wrong. A purchase order never had one. ⭐ Checked live on our system: the PO item has 15 tabs, the PO header has 11, and Classification is in neither; the Environment menu has no batch or classification entry; and the one batch button that does exist on the item's Material Data tab is Create Batch, which answered "Batch … for material … in plant PK01 already exists" — it only creates a batch, it never classifies one. Why: a purchase order is a buying document. At order time the goods do not exist yet, so there is nothing to measure. Classification describes real stock, so it lives on the batch. |
Open MSC2N (change) or MSC3N (display) → Material · Batch · Plant PK01 → Classification tab → Class PS_IRON_BATCH → your values are there. To search many lots by value use CL30N (class type 023) or BMBC → Classification tab. To type values at the goods receipt instead, that is the Classif.batches field in OMJJ → movement type → Entry Control — ours is 3 = "Classification Always Invoked in Foreground", so MIGO already asks, once per batch. |
| B1 · CL20N (wrong tool) | "Object type MCHA not defined as classifiable object" | CL20N tried to classify the batch as a plant-level object (MCHA). Our system is at Material level, where a batch is the MCH1 object — and class type 023's object list here contains MCH1, not MCHA. Wrong tool, not broken config. |
Use MSC2N → Classification tab. It uses the correct MCH1 object, and needs no config change. (On a plant-level system it would be MCHA.) |
| B2 · SNRO | A popup: "The intervals are not included in automatic recording of customizing changes…" | An information notice, not an error. Number-range intervals are data, not customizing, so they are not auto-transported. | Press the green ✓ and carry on. To move them later use Interval → Transport. |
| B2 · MIGO still asks for a batch | Batch field remains mandatory although OMCZ is Active | Only 1 of the 3 settings is done. Most often the missing one is OMJJ → Create New Batch = C; sometimes the SNRO interval for your material type is missing. |
Work through all three rows of the B2 table in order. Then test with 101, not 561. |
| B2 · SNRO — letters in the interval | NR 560 "Specify numeric interval limits" | Batch number ranges are numeric only, even though the batch field itself is 10 characters of text. | Use numeric bands per material type (B3), or take the enhancement route (C1). |
B4 · MIGO — typing * in the Batch field |
"Use button for stock or batch determination" — MIGO046 | MIGO never runs batch determination by itself. The old MB1A accepted *; MIGO deliberately does not. Typing a batch = "I choose"; pressing the button = "SAP, you choose". |
Click Stock Determination for all items — the last of the three small icons just after Contents. (The per-item icon in the grid is often greyed out.) |
| B4 · determination returns an empty list | Batch Selection is blank; Log… (F6) says "Strategy contains no selection specifications" | The strategy had a Sort rule but no Selection criteria. The sort rule only says how to order; the selection criteria say which batches qualify. With none, nothing is selected, so nothing can be sorted. | MBC2 → select the material line → Selection criteria (F7) → enter class PS_IRON_BATCH (type 023) → leave the characteristic values empty → Back → Save. 💡 The Log… button is the best diagnostic on that screen. |
| B4 · wrong batch proposed (newer instead of older) | The older batch shows ? in the Characteristic Sorting column and is listed last |
? means that batch has no value for the sort characteristic. It happens when the batch was classified before LOBM_HSDAT was added to the class — its classification is stale, and the batch master shows status "Inconsistent". Batches with no sort value drop to the bottom. |
Open the batch in MSC2N → Classification (the date auto-fills from Date of Manufacture) → Save. Best practice: define all characteristics before classifying any batch. |
| B4 · MIGO mvt 201 — wrong movement text | Header reads "GI pipel.for cst cnt" instead of "GI for cost center", and no batches are ever found | The Special Stock indicator (the small box next to the movement type) still held P = pipeline, left over from Scenario 11 — MIGO remembers it. SAP was searching pipeline stock, which has no batches. |
Clear the small box next to the movement type → Enter → the text must read "GI for cost center". Always check that box when a movement behaves oddly after a special-stock scenario. |
| B4 · MIGO mvt 561 | "G/L account 399999 does not exist in company code PSPK" | Movement 561 posts Dr Inventory / Cr an offsetting account, and SAP's default initial-stock account 399999 was never created in PSPK. Nothing wrong with the batch steps. |
Either bring the 2nd batch in the normal way (small PO → MIGO 101) — what a real plant does anyway — or have FI create G/L 399999 (FS00, copy from company code 0001). |
| B6 · MM02 serial number profile | M3 419 "Serial numbers can be managed only if base unit of measure is discrete" | You cannot serialise something measured by weight or volume. Half a serial number is meaningless. | Create a material whose base unit is PC / EA. Or use B5 (one batch per piece) instead — that works on a tonne-based material. |
| C1 · trying to build the batch-number prefix | DS027 — SAP refuses to create the place where the custom logic would live | The enhancement exists on paper, but a piece of technical plumbing behind it was never generated on this system. "The hook exists" does not mean "the hook is usable." | Not something you fix as an MM consultant — it is a Basis/developer task, and it often needs an access key from SAP. Check this before you promise a date. Full explanation: Customisation Guide → step 5. |
📖 Words and codes used on this page
Every term is explained where it first appears, but here they are all in one place. Look anything up without losing your spot.
| Word | What it means — in plain words |
|---|---|
| Batch (= lot) | One delivery, or one production run, of the same material — kept separate so you can tell it apart from the next one. In steel it is called a heat number. |
| Batch level | How wide a batch number must be unique: one plant, one material everywhere, or the whole system. Set once, system-wide (A1). |
| Characteristic | One blank on a form — "sulfur ___ %". Built in CT04. |
| Class / class type 023 | The whole form that holds the blanks. Class type says what kind of object the form is for; 023 is the batch kind. |
| Classification | Filling that form in for one particular lot. Typed in MSC2N, read in MSC3N — never in a purchase order. |
| Batch determination | Letting SAP choose which lot leaves the warehouse, instead of the storekeeper choosing. |
| FEFO / FIFO | First Expired First Out / First In First Out — two rules for "use the oldest stock first". |
| Unrestricted / restricted | Stock that is free to use / stock that is held back, e.g. waiting for a lab test. |
| "Enjoy" screen | A modern SAP screen with tabs — MM01, MIGO, MSC1N, ME21N. Older screens have no tabs. ⚠️ Every screen has its OWN tabs — same word, different pages. MSC1N has a Classification tab; ME21N does not. |
| Number range / subobject | A pool of numbers SAP hands out one at a time. The subobject divides that pool — for batches it is the material type. |
| Movement type | A 3-digit code saying what kind of stock movement it is: 101 receive against a PO · 201 issue to a cost centre · 261 issue to a production order · 561 load opening stock. |
| TO · UnE · PC/EA | Tonnes (how ore is weighed) · unit of entry (the unit you are typing in) · piece / each (countable units). |
| Info record | The agreed price of one material from one supplier. Without it, our purchase orders cannot find a price. |
| Valuation class | Decides which general-ledger accounts a material posts to. Ours is 3000 for raw materials. |
| KBA | SAP Knowledge Base Article — a support note on SAP's own website. |
| Enhancement | An official place SAP leaves open so you can add your own logic without changing SAP’s program. Two kinds: BAdI (modern) and user exit (older). See the Customisation Guide. |
| T-code | What it does | T-code | What it does |
|---|---|---|---|
| OMCT | batch level (A1) | CT04 | characteristic (B1) |
| MM01/MM02/MM03 | create / change / display a material | CL02/CL03 | class — change / display (B1) |
| ME11 | create a purchasing info record | CU70/CU71/CU72 | sort rule — create / change / display (B4) |
| MSC1N/MSC2N/MSC3N | batch — create / change / display | MBC1/MBC2/MBC3 | batch search strategy — create / change / display (B4) |
| ME21N | create a purchase order | OMCG | which movements run batch determination |
| MIGO | post a goods movement | OMCZ | switch automatic batch numbers on (B2) |
| MMBE | stock overview, per batch | OMJJ | movement-type settings (B2) |
| MB51 | list of material documents | SNRO | number ranges (B2, B3) |
| SE16 | look inside any table | OIS2 | serial number profiles (B6) |
✅ Verification
- MSC3N → batch
HEAT-26-01→ Basic Data 1 shows its dates and supplier; Classification shows its characteristic values - ⚠️ Do not look for classification in ME21N / ME22N / ME23N. A purchase order has no Classification tab (verified live: 15 item tabs, 11 header tabs, neither includes it). The batch number only, on item detail → Material Data.
- MMBE →
RM-IRON-HEAT-01→ per-batch stock, each heat on its own line - SE16 →
MCH1(batch master — material level) andMCHB(batch stock, fieldCLABS) - SE16 →
MARC→XCHPF = Xproves batch management is on for the material - MB51 → material documents, with the batch on each line
- ✅ Part A end to end: material
RM-IRON-HEAT-01(batch mgmt ON) → batchHEAT-26-01(MSC1N) → Accounting view + info record5300079965→ PO → GR5000047744(MIGO 101) → 100 TO inside batchHEAT-26-01(MCHB:CLABS = 100.000). - ✅ B1: characteristic
PS_SULFUR_PCT(NUM 5.2 %) +LOBM_HSDATin classPS_IRON_BATCH(type 023) →HEAT-26-01classified with Sulfur 0.05 via MSC2N. - ✅ B2: SAP generated batch
0000000002from a 101 receipt with the Batch field left blank. - ✅ B3: number bands verified in
NRIV— HALB2…, FERT3…. - ✅ B4: FEFO proposed the older heat and posted goods issue
4900423478againstHEAT-26-01, leavingHEAT-26-02untouched. - ✅ B5: PO
4500032789→ three 1 TO batchesBDL-26-001/2/3in one receipt. - Batch level = Material, confirmed on the OMCT → Batch level radio. The system already carries 200+ live batches, all class type 023.
- ⛔ B6 blocked: no material on this system has a discrete base unit (M3 419). 📐 C2 blocked: customer function group
XVBZmissing (DS027).
🎓 Interview-Ready Answers
Q: What is the absolute minimum to get batch management working?
Four things: (1) know your batch level (OMCT — plant, material or client; it is system-wide and locked once batches exist); (2) tick Batch management on the material's Purchasing view — only possible while the material has zero stock in the current and previous period; (3) have a batch to receive into, either pre-created in MSC1N or typed at the goods receipt; (4) post the goods movement with the batch filled. Everything else — classification, FEFO, automatic numbering — is optional.
Q: What are the three batch levels and which is most common?
Set/checked in OMCT → "Batch level": Plant (unique only within one plant; batches live in MCHA), Material (unique per material across all plants; batches live in MCH1), Client (unique across the whole client). Material level is the most common — and it is what our IDES uses. The choice is system-wide and hard to reverse: once batches exist SAP locks it, so it is decided up front. It also decides practical things later — at material level you classify a batch with MSC2N (object MCH1), not CL20N (object MCHA), and the number-range object is BATCH_MAT.
Q: What is the difference between a batch and a batch characteristic?
The batch is the identifier for a physical lot (e.g. HEAT-26-01), and SAP tracks stock per batch in MCHB. Characteristics (sulfur %, manufacture date, expiry) are classification values attached to the batch via class type 023 — they describe the lot and drive batch determination. Some characteristics are yours (created in CT04); others are SAP's, like LOBM_HSDAT, which is a window onto the batch master field MCH1-HSDAT and fills itself.
Q: How does FEFO picking actually work — what are the moving parts?
Three pieces. A sort rule (CU70) says how to order batches — e.g. LOBM_HSDAT ascending. Selection criteria inside the search strategy say which batches even qualify — typically "any batch carrying our class". A batch search strategy (MBC1, strategy type ME01 for inventory management) ties them to a key combination such as Movement Type/Plant/Material. At goods issue you leave the batch blank and press Stock Determination; SAP proposes the oldest qualifying lot. The classic mistake is a sort rule with no selection criteria — the list comes back empty because nothing was selected to sort.
Q: A client wants each individual roll tracked, but the material is in tonnes. What do you propose?
Serial numbers are impossible — SAP rejects them unless the base unit is discrete (PC/EA), error M3 419. The workaround that needs no new material and no configuration is one batch per roll: receive with MIGO's Distribute Quantity and give each physical piece its own batch. You then get per-piece identity, per-piece characteristics and per-piece FEFO while still buying and reporting in tonnes. The honest caveat: thousands of pieces means thousands of batch master records, so for high volume propose Handling Units or a redesign with a countable base unit instead.
Q: Does activating batch management change the accounting of a goods receipt?
No — the FI posting (Inventory Dr / GR-IR Cr at 101) is unchanged. Batch management adds a mandatory batch on every movement and splits the stock record per batch (MCHB) on top of the material total. Value is still held at valuation-area level unless you combine it with split valuation.