Setup Step 1 — Create & Configure Company Code
🎯 Why this setting exists
💡 Easy example
The factories and warehouses (plants) are inside this company — they are where work happens, but they are not the legal entity. PakSteel can have a Karachi factory, a Lahore factory and a Dubai DC, yet all of their money rolls up into the company's single set of books. One company, many sites. (The UAE arm, PSAE — "PakSteel Trading FZ-LLC" in AED — is a second company code, built once PSPK works.)
🔗 How this connects to everything else
The company code sits at the very bottom of the build. Nothing in MM is useful until a CC exists for its stock to be valued against — and once it exists, it is the silent backstop behind every posting you will ever make. Here is the web of what it needs, what it unlocks, and how it reaches into the other modules.
⬆️ Depends on (must exist first)
- Nothing built by you — this is the first step of the whole guide.
- It only needs two pre-delivered objects that already exist in IDES: the Chart of Accounts INT (the master list of G/L numbers) and a Fiscal Year Variant (K4, Jan–Dec). Both ship with the system, so there is no prerequisite step.
⬇️ Enables (what this unlocks)
- Step 2 — Test the CC (F-02): the smoke test that proves these settings work
- Step 3 — Create Plants: a plant is only useful once it can be assigned to a CC
- Step 8 — Purchasing Orgs: a purch org buys for a company code
- Step 15 — OBYC Account Determination: posts goods movements into this CC's G/Ls
- Step 19 — Controlling: CO needs the CC linked to a controlling area
- And every posting and scenario — from Scenario 1 onward
🧩 Who owns it & why MM cares
FI Basis FI and Basis configure the company code — it is FI's foundation, not MM's. But every PO, goods receipt and invoice posts into it, so an MM consultant must understand its moving parts: the posting periods (OB52 / OMSY), the tolerances, the Material Ledger and the number ranges. When any of those is missing, it is MIGO / MIRO that throws the error — so MM must be able to read it and point FI at the right sub-step.
🔮 Links to other modules (now & later)
- FI The company code is the books — every financial document lives here.
- CO Controlling needs the CC plus a controlling area (Step 19) before cost postings work.
- ML The Material Ledger (S/4 valuation engine) reads the CC's ledger currencies — sub-step 1O must match 1H.
- SD Sales documents post revenue into the same CC; a delivering plant rolls up to it.
- PP Production order settlement and WIP land in this CC's books too.
🔧 Configuration — fields & steps
OX02 OBBP OB52 OBC4 OBY6 FBN1 OBA4 FINSC_LEDGER FS00 OMSY EC01
This step is 16 sub-steps (1A–1P), not one click. SAP does not auto-create most of these — you build them one by one, each before the thing that references it. Three sub-steps (1H, 1I, 1J) are S/4HANA-specific — they did not exist in ECC but are mandatory in the Universal Journal architecture. Skip them and F-02, MIGO and MIRO all fail.
- Universal Journal (ACDOCA) — a single unified ledger replacing the separate FI/CO/ML tables → requires a Ledger assignment per CC (1H)
- Accounting Principle per CC×Ledger — every CC must declare IFRS / Local GAAP → required field in FINSC_LEDGER (1H)
- Document Splitting always-on — every G/L must be classified (Cash / Vendor / Material / etc.) → required at chart level (1I)
- FS00 G/L extension — even though the chart has G/Ls, they must be extended to your CC before posting (1J)
📋 The 16 sub-steps at a glance (1A–1P)
Each is a collapsible block below. The most important are open by default; click any summary to expand.
| # | T-code | What it does | Time | Flavor |
|---|---|---|---|---|
| 1A | OX02 | Create the CC shell (name, country, currency, address) | 5 min | Universal |
| 1B | OBBP / SM30 | Create Posting Period Variant (the label only) | 3 min | Universal |
| 1C | OB52 | Open the actual posting periods (current + future) | 5 min | Universal |
| 1D | OBC4 | Create Field Status Variant (copy from 0001) | 5 min | Universal |
| 1E | OBY6 | Assign all 4 variants to the CC (Global Parameters) | 5 min | Universal |
| 1F | FBN1 | Create the FI Document Number Ranges (Year 9999 = evergreen) | 15 min | Universal |
| 1G | OBA4 | Configure FI Tolerance Groups (posting limits) | 5 min | Universal |
| 1H ⚡ | FINSC_LEDGER | Assign CC to Leading Ledger 0L + Accounting Principle | 10 min | S/4 only |
| 1I ⚡ | SPRO path | Classify G/L Accounts for Document Splitting | 10 min | S/4 only |
| 1J | FS00 | Extend G/L accounts from chart to YOUR CC | 10 min | Universal |
| 1K ⚡ | OMSY | MM Period Initialization — without it MM01/MIGO fail with "CC not maintained" | 3 min | Universal (MM-side) |
| 1L | Various | 10-point verification — includes F-02 smoke test + MM period check | 10 min | Universal |
| 1M 🚀 | EC01 | BONUS: fast-copy for the 2nd+ CC (PSAE) — skip 1A-1K | 10 min | Universal |
| 1N ⚠️ | OMR6/OMC0/SPRO | Tolerance Keys (PE/PP/VP/BD…) — "how much variance is acceptable"; PO/GR/Invoice fail without them | 15 min | Universal |
| 1O ⚡ | OMX3→OMX1→CKMSTART | Material Ledger startup — open the plant's "value diary"; ALL goods movements blocked without it | 15 min | S/4 only |
| 1P 🏁 | OMRG·OMC0·FS00·FBN1 | First-GR Readiness (4 Gates) — T169P row, VP tolerance, OBYC G/Ls in CC, FI doc intervals | 15 min | Universal |
💡 Why this order: dependencies are built BEFORE they are referenced. 1B/1D create variants → 1E references them. 1H needs the CC + ledger to exist. 1I classifies G/Ls before they are used. 1J extends G/Ls before F-02 needs them. For the 2nd company onwards → jump to 1M (EC01 copy) instead of redoing 1A-1J.
🗺️ MASTER CONFIGURATION MAP — what each config is FOR, which module OWNS it, and how everything LINKS
🧱 Layer 1 — FI Foundation (Module: FI · "the company's books")
| Config | Needed by | Purpose in plain words | Must exist BEFORE | Feeds into |
|---|---|---|---|---|
| OX02 Company Code (1A) | EVERYTHING | The legal entity — owns the balance sheet, files taxes | Nothing — this is first | Plants (OX10), Purch Orgs, all postings |
| OBBP+OB52 Periods (1B/1C) | Every posting's DATE check | "Which months is the cash register open?" | CC (1A) | F-02, MIGO, MIRO all validate posting date against this |
| OBC4 Field Status (1D) | Every FI line item | Which fields are required/optional when posting to each account type | — | FS00 accounts reference its groups (G001, G006…) |
| OBY6 Global Params (1E) | Every FI posting | Wires CC to its rule set: Chart INT + Fiscal Year + Periods + Field Status | 1A–1D | Everything FI validates against these 4 assignments |
| FBN1 Doc Number Ranges (1F + 1P Gate 4) | EVERY FI document | "Ticket rolls" — each doc type (WE/RE/KZ/SA) numbers its documents from its own roll | CC | MIGO→WE, MIRO→RE, F-53→KZ |
| FINSC_LEDGER (1H) ⚡S/4 | First FI posting ever | Registers the CC in the Universal Journal (ACDOCA) + declares IFRS/local GAAP | CC + OBY6 | ALL postings; also ML currency setup reads it |
| Doc Splitting classify (1I) ⚡S/4 | Posting balance checks | Tags every G/L with a category so SAP can balance documents by segment | Chart assigned (OBY6) | Each FI document's splitting logic |
| FS00 G/L extension (1J + 1P Gate 3) | Posting to EACH account | Chart = song catalog; each CC must add the song to ITS playlist before playing it | OBY6 (chart known) | OBYC's target accounts MUST be extended or MIGO fails (M7055) |
| OBA4 FI Tolerance Groups (1G) | Manual FI entries | Per-user posting limits ("clerks may post up to X") | CC | F-02 and all manual FI |
| OBB8 Payment Terms (Step 18F) | Vendor master, MIRO, F-53 | "When is the invoice due + early-payment discount" (e.g., 0003 = 14d 2%/30d net) | — | Cash discount auto-calculated at payment |
🔗 Layer 2 — MM↔FI Integration (Module: MM-IM/LIV + CO-ML · "goods movements become accounting")
| Config | Needed by | Purpose in plain words | Must exist BEFORE | Feeds into |
|---|---|---|---|---|
| OMSY MM Periods (1K) | MM01, MIGO | Starts MM's own month-clock for the CC (separate from FI's OB52!) | CC + fiscal year variant | Material master create + every goods movement date check |
| OMS2 Qty/Value update | Material creation | "Does this material TYPE carry value in this plant?" — if no, SAP demands manual account assignment (ME062) | Plants exist | Whether Accounting view is possible/needed per material |
| OMWM/OMWD Valuation Grouping (Step 6) | OBYC lookup | Groups plants under one code (0001) so ONE set of account rules serves many plants | Plants | OBYC reads VGC to find the right rule row |
| OBYC Acct Determination (Step 7) | MIGO, MIRO auto-posting | The translator: "GR of raw material (class 3000) → Dr 300000, Cr 191100" — no human picks accounts | VGC + valuation classes + FS00-extended G/Ls | EVERY automatic FI line from goods movements |
| OMX3→OMX1→CKMSTART ML (1O) ⚡S/4 | FIRST goods movement | Opens the plant's "value diary" — S/4 refuses any stock posting until productive | Plants + FINSC_LEDGER currencies | All stock valuation; ACDOCA material values |
| OMRG T169P (1P Gate 1) | MIGO + MIRO | One settings row per CC for invoice-check behavior — even GR reads it | CC | Duplicate-invoice + amount checks |
| Tolerances: SPRO-PE / OMR6-PP / OMC0-VP (1N + 1P Gate 2) | ME21N / MIRO / MIGO | "How much price/qty variance is acceptable before SAP blocks?" — no rules = NOTHING posts | CC | PO save, invoice post, GR post checks |
🏠 Layer 3 — Org Units & Master Data (Module: MM · "rooms and furniture you use daily")
| Config | Needed by | Purpose in plain words | Must exist BEFORE | Feeds into |
|---|---|---|---|---|
| OX10+OX18 Plant→CC (Steps 3-4) | All MM activity | The factory/warehouse + "whose books does it post to" | CC | Materials, stock, MRP, MIGO derive CC from plant |
| OX09 Storage Locations (Step 5) | MIGO | WHERE inside the plant the stock physically sits (RAWM, FG01…) | Plant | Stock per bin area; MMBE views |
| OX08+OX01+OX17+OMKI Purch Org (Steps 8-12) | PR/PO | WHO buys (OX08), for which company (OX01), for which plants (OX17 M:M), and which is each plant's DEFAULT (OMKI 1:1) | CC + plants | Vendor purchasing views (LFM1), info records, every PO header |
| BP config: BUCF/BUC2/CVI/XKN1/OBAS (Step 18) | Vendor creation | Numbering + the bridge that auto-creates classic vendor records (LFA1/LFB1/LFM1) when you save a BP | Account groups | Every vendor → used in source lists, info records, POs |
| Material Master (MM01) | Whole P2P | WHAT you buy/stock/value — views per area (Basic/Plant/Purchasing/Accounting) | Org units + OMS2 + valuation class (OMSK) | PR/PO/MIGO/MIRO all read it; Accounting view drives OBYC |
| ME11 Info Record | PO pricing | "Vendor X sells material Y at price P" — auto-fills PO price | Material + vendor | PO net price; updated back by each PO (Info Update flag) |
| ME01 Source List (Scenario 14) | Source determination | The APPROVED-vendors list per material+plant; Fixed flag = auto-pick | Material + vendor (+info rec) | PR/MRP auto vendor selection |
MIGO Post button → reads Material's valuation class (Layer 3) → via plant's VGC finds OBYC rule (Layer 2) → posts to G/L accounts that must exist in the CC, into an open period, numbered from a FBN1 ticket roll, recorded in the Universal Journal + Material Ledger (Layer 1). One click — seven configs fire. When ANY link is missing, you get one of the 9 Gauntlet errors in the Issues section below.
1A. Create the CC shell — OX02 (direct create, not EC01 copy)
What this does: Creates the bare CC record in table T001 with its identity — code, name, country, currency, language, address. Nothing else yet; no variants linked.
Why direct create (and NOT EC01 / Copy CC): EC01 ("Copy Company Code") brings dependent customizing from the source CC. Convenient — but in learning you do not know what got copied silently, so when something fails later you cannot pinpoint why. Direct create via OX02 = you explicitly own every assignment. Recommended for learning. Real projects often use EC01 for speed.
Action sequence:
- Run OX02
- Two options appear — click "Edit Company Code Data" (NOT "Copy, delete, check")
- Click "New Entries" (or Ctrl+F4)
- Fill the 6 identity fields below
- Click the "Address" button (icon at top) → fill the address screen → Enter to confirm
- Back on the main row, save (Ctrl+S) → save as Local Object ($TMP) for learning, or to a Transport Request for real projects
- Repeat for CC
PSAE(UAE entity, AED currency)
Identity fields:
| Field | PSPK value | PSAE value | Why this matters |
|---|---|---|---|
| Company Code* | PSPK | PSAE | 4-char unique ID. Used in every FI doc forever — cannot change after first posting. PSPK = PakSteel Pakistan, PSAE = PakSteel UAE. |
| Company Name* | PakSteel Industries (Pvt) Ltd | PakSteel Trading FZ-LLC | Legal name on tax/statutory docs. Must match SECP (PK) / DED (UAE) registered name. |
| City* | Karachi | Dubai | Registered city. Used in tax determination & output documents. |
| Country* | PK | AE | Drives ALL country-specific behavior — tax codes, statutory reports, language defaults. Cannot practically change later. Wrong country = legal/audit disaster. |
| Currency* | PKR | AED | Books currency. Once posted, conversion is a multi-month project. Pick statutory currency, NOT parent's reporting currency. |
| Language* | EN | EN | Default output language. Urdu/Arabic translations added later via material/customer master. |
Address fields (click Address button):
| Field | PSPK example | Why |
|---|---|---|
| Street + House # | Plot 12-A, Industrial Area, Korangi | Address on PO / Invoice printouts |
| Postal Code | 74900 | Required field for valid address |
| Region* | SD (Sindh) | Drives provincial sales tax (SRB Sindh, PRA Punjab, KPRA, BRA) — wrong region = wrong tax |
| Time Zone | PKST (UTC+5) | Document timestamps; matters for multi-country reporting |
| Tax Number 1 (NTN) | 1234567-8 | FBR National Tax Number — appears on tax invoices. Field STCD1. |
| Tax Number 2 (STRN) | 03-99-9999-001-46 | Sales Tax Registration Number — required for B2B tax invoices. Field STCD2. |
Common errors at 1A (full fixes in the Issues section): "Company code already exists" → pick another code or delete via OX02 · "Currency XXX not defined" → OY03 (PKR/AED usually pre-delivered) · "Country XX not maintained" → table T005, rare in IDES · "Choose Transport Request" → click Local Object ($TMP) for learning.
Verify 1A: Run SE16N → table T001 → BUKRS = PSPK → one row with BUTXT, LAND1, WAERS populated. KTOPL/PERIV/FSTVA are still empty — they get filled in 1E.
1B. Create Posting Period Variant — OBBP or SM30 view V_T010O
What this does: Creates just the name of the variant (e.g., "PSPK"). Think of it as an empty folder — the actual period rules get added in 1C via OB52.
Why it's a separate object: Multiple CCs can share one Posting Period Variant. If PSPK and PSAE follow the same close calendar, they can share one. SAP stores it independently from the CC so it's reusable.
Action sequence (primary — OBBP):
- Run OBBP
- Click "New Entries"
- Posting Period Variant:
PSPK - Name:
PakSteel PK Periods - Save
- Repeat for
PSAE/ "PakSteel UAE Periods"
If OBBP shows no "New Entries" button (restricted view in S/4HANA):
- Run SM30
- Table/View name:
V_T010O - Click Maintain → New Entries → same fields as above
- Save
💡 SM30 universal fallback: Whenever a T-code restricts editing in S/4, SM30 on the underlying view name almost always works. Useful views: V_T010O (period variant), V_T001B (period rules), V_T004V (field status), V_001S (plants).
1C. Open the actual posting periods — OB52
What this does: Now that variant PSPK exists (from 1B), tells SAP "for variant PSPK, periods 1-12 of years 2025-2030 are OPEN for posting." Without this, every posting fails with "period not open."
Why so many years: Closing periods is a real business decision (month-end close). For learning, open broadly so nothing blocks you. Real projects open only current + previous month.
Action sequence:
- Run OB52
- Click "New Entries"
- Add 6 rows (one per Account Type) — see table below
- Save
The 6 rows to add for variant PSPK:
| Var | A | From Acct | To Acct | From Per | Year | To Per | Year |
|---|---|---|---|---|---|---|---|
PSPK | + | blank | blank | 1 | 2025 | 12 | 2030 |
PSPK | A | 0 | ZZZZZZZZZZ | 1 | 2025 | 12 | 2030 |
PSPK | D | 0 | ZZZZZZZZZZ | 1 | 2025 | 12 | 2030 |
PSPK | K | 0 | ZZZZZZZZZZ | 1 | 2025 | 12 | 2030 |
PSPK | M | 0 | ZZZZZZZZZZ | 1 | 2025 | 12 | 2030 |
PSPK | S | 0 | ZZZZZZZZZZ | 1 | 2025 | 12 | 2030 |
Field meanings:
| Field | What it controls |
|---|---|
| Variant | Which Posting Period Variant this rule belongs to. Must match what OBY6 will reference for the CC in 1E. |
| A (Account Type) | + = all accounts, A = Assets, D = Customers, K = Vendors, M = Materials, S = G/L. Lets you close vendor postings before G/L, etc. |
| From / To Account | Range of account numbers. When A = + (wildcard), MUST be BLANK — wildcard already means "all" and a range contradicts it. When A is anything else, use 0 to ZZZZZZZZZZ. |
| From Period 1 + Year | Earliest open period. Period 1 = Jan under K4 (calendar year) fiscal variant. |
| To Period 1 + Year | Latest open period. 12 = Dec. Year 2030 gives lots of buffer. |
| From / To Period 2 | Special periods 13-16 for year-end adjustments. Skip for learning. |
Common error: "Do not enter an account for a masked account type" → you typed numbers in From/To Account when A = +. Clear those fields.
Verify 1C: SE16N → table T001B → variant PSPK → 6 rows visible. Repeat for variant PSAE (6 more rows).
1D. Create Field Status Variant — OBC4 (copy from 0001)
What this does: Field Status Variant (FSV) = the master rulebook saying "for this type of G/L, field X is mandatory, field Y is optional, field Z is hidden." Every FI posting checks against this.
Why COPY from 0001 (not create blank): SAP-delivered variant 0001 contains 80+ field status groups (G001 bank, G003 material consumption, G007 inventory, G030 reconciliation, etc.). Building these from scratch = days of work, easy to break. Copy gives you the full SAP-blessed template ready to use.
Action sequence:
- Run OBC4
- Select existing variant
0001 - Click "Copy As..." (F6) — small copy icon in toolbar
- Change variant key to
PSPK, name toPakSteel PK FSV - Press Enter → popup asks "Copy all dependent entries?" → click Copy all (copies all 80+ groups in one go)
- Save
- Repeat: copy 0001 →
PSAE, name "PakSteel UAE FSV"
If variant 0001 not in your client (rare in IDES): ask Basis to copy from client 000 via SCC1, OR copy any other variant present (they all have the same field status groups).
Verify 1D: OBC4 → double-click variant PSPK → 80+ field status groups visible.
1E. Link all variants to CC — OBY6 (Global Parameters)
What this does: ONE screen that shows ALL the CC's financial assignments. Connects PSPK to: Chart of Accounts, Fiscal Year Variant, Posting Period Variant (from 1B/1C), Field Status Variant (from 1D), and a few smaller settings.
Why one screen, not 5: You could use OB62 (chart), OB37 (FY), OBBP_ASSIGN (period variant), OBC5 (field status) separately. OBY6 collapses them into one view — easier to verify, faster to set up.
Action sequence:
- Run OBY6
- Select CC
PSPK→ click 🖉 Details (or double-click the row) - Fill the fields below
- Save
- Repeat for PSAE
| Field | Value PSPK | Why |
|---|---|---|
| Chart of Accounts | INT | SAP's international chart — works for Pakistan. The master list of G/L account numbers. Without it, no G/L postings possible. |
| Country Chart of Accts | blank | Optional alternate chart for local GAAP. Skip for learning. |
| Credit Control Area | blank | For credit limit management on customers. Skip if not using. |
| Fiscal Year Variant | K4 | K4 = Jan-Dec calendar year. Standard for Pakistani private companies. Government uses Jul-Jun (variant V3). Hard to change after postings. |
| Posting Period Variant | PSPK | The variant you created in 1B + opened in 1C. |
| Field Status Variant | PSPK | The variant you copied in 1D. |
| VAT Registration Number | blank for PK | EU concept. Pakistan uses NTN/STRN on address tab (set in 1A). |
| Document Entry Screen Variant | 2 | Standard layout with cost accounting fields visible. |
| Maximum Exchange Rate Deviation | 10 % | Warns if posting uses rate >10% off OB08 daily rate. Safety check. |
| Workflow Variant | blank | For approval workflows. Skip for learning. |
Common errors at 1E: "Chart of Accounts INT not defined" → OB13 (delivered in IDES) · "Fiscal Year Variant K4 not defined" → OB29 (SAP standard) · "Posting Period Variant PSPK not defined" → you skipped 1B · "Field Status Variant PSPK not defined" → you skipped 1D.
Verify 1E: Re-open OBY6 → PSPK → all fields show your values. Or SE16N → T001 → fields KTOPL, PERIV, XPERV, FSTVA all populated for PSPK.
1F. Create FI Document Number Ranges — FBN1 (manual, most reliable)
What this does: Every FI document (vendor invoice, payment, GR posting, GI, journal) needs a unique number. Number ranges = the "pools" SAP draws from. Without these, FI postings fail with "Document number not in range XX defined for CC YYYY."
Why this is the #1 missed step: Number ranges are NOT auto-created with a new CC. OX02 only writes to T001; ranges in table NRIV stay empty. SAP delivers them for CC 0001 — your new CC starts empty.
Why OBH1 (copy from 0001) often does nothing in S/4HANA: Modern S/4 restricts cross-CC copy of number ranges for transport safety. The transaction "succeeds" silently without copying. Manual FBN1 is more reliable.
Action sequence (manual):
- Run FBN1
- Company Code:
PSPK - Click "Change Intervals" (NOT "Maintain Groups")
- For each range below, click "Insert Interval" (Shift+F1) → enter values → Enter
- Save (truck icon) → dismiss "Transport Number Range Intervals" info popup with ✓
- Repeat all ranges for CC
PSAE
The 8 ranges to create (use Year 9999 for evergreen — no future maintenance):
| No. | Year | From Number | To Number | Doc Types using this | Purpose |
|---|---|---|---|---|---|
01 | 9999 | 1900000000 | 1999999999 | KR, KG | Vendor invoice / credit memo (MIRO) |
15 | 9999 | 1500000000 | 1599999999 | KZ | Vendor payment (F110, F-53) |
17 | 9999 | 1700000000 | 1799999999 | AB | Clearing documents |
19 | 9999 | 5100000000 | 5199999999 | RE, RN | Logistics invoice verification |
39 | 9999 | 3900000000 | 3999999999 | SA (in some IDES) | G/L doc — used in many IDES for F-02 SA type |
49 | 9999 | 5000000000 | 5099999999 | WE | Goods Receipt (MIGO mvt 101) |
50 | 9999 | 4900000000 | 4999999999 | WA, WI, WL | Goods Issue / inventory movements |
51 | 9999 | 100000000 | 199999999 | SA, SK | G/L document (general journal) |
⚠️ Why range 39 is included: Many IDES installations map doc type SA (G/L journal) to range 39 instead of 51 via OBA7. To be safe, create BOTH. To verify which range your SA actually uses: OBA7 → SA → check "Number range" field.
⚡ IMPORTANT — Year column behavior: The Year column is YEAR-SPECIFIC, not "valid through." If you enter 2030, the range is ONLY valid for fiscal year 2030 — postings in 2026 fail with "number range XX missing for year 2026". Best practice: use Year 9999 — SAP treats this as "valid for ALL fiscal years" (evergreen).
Field meanings: No. = range key (must match doc type's OBA7 mapping) · Year = use 9999 evergreen · From/To Number = 10-digit pool boundaries · Current Number = leave 0 · Ext (External Flag) = leave UNCHECKED for MM (SAP auto-assigns).
Popups you'll see: "Define Selection Options" (OBH1) → click = · "Variant Attributes" (OBH1) → F3 to back out, do NOT save · "Transport Number Range Intervals" (info) → dismiss with ✓ (ranges deliberately do NOT transport, to protect production's current-number counter).
Verify 1F: FBN1 → CC PSPK → Change Intervals → all 8 ranges visible with Year 9999. Or SE16N → table NRIV → SUBOBJECT = PSPK → 8 rows.
1G. Configure FI Tolerance Groups — OBA4
What this does: Sets posting authority limits per user. SAP needs to know "how much can this user post in a single document, and what payment differences are acceptable?" The blank group is the default catch-all for any user not assigned to a specific group.
Why mandatory: Without ANY tolerance group, users either get blocked entirely OR can post unlimited amounts (audit nightmare).
Action sequence:
- Run OBA4
- Click "New Entries"
- Fill all fields below
- Save → Repeat for PSAE (currency AED)
| Field | Value | What it controls |
|---|---|---|
| Group | (BLANK) | Blank = default group. Applies to all users not assigned to a specific group. For learning, this catches everyone. |
| Company Code | PSPK | Tolerance applies only to this CC. |
| Currency | PKR (auto) | Currency of all amount limits below. |
| Upper limits for posting procedures | ||
| Amount per document | 9999999999.99 | Max TOTAL amount in one FI doc. ~10 billion = effectively unlimited for practice. Real projects tier this per role. |
| Amount per open item account item | 9999999999.99 | Max amount on a single line within a doc. |
| Cash discount per line item | 10.00 % | Max cash discount % user can grant per line. |
| Permitted payment differences — Revenue (when receiving money) | ||
| Revenue · Amount | 9999.99 | Max absolute difference when customer pays MORE than invoice. E.g., ₨50,005 received vs ₨50,000 invoice = ₨5 diff auto-accepted. |
| Revenue · Percent | 10.00 % | Max % difference allowed. |
| Revenue · Cash Discnt Adj. | 99.99 | Max cash discount adjustment in this direction. |
| Permitted payment differences — Expense (when paying money) | ||
| Expense · Amount | 9999.99 | Max absolute difference when paying LESS than invoice. E.g., ₨49,995 paid vs ₨50,000 = ₨5 diff auto-accepted. |
| Expense · Percent | 10.00 % | Max % difference allowed. |
| Expense · Cash Discnt Adj. | 99.99 | Max cash discount adjustment in this direction. |
How users get assigned to a tolerance group: SU01 → user → Parameters tab → parameter TGR. If blank, user falls into the blank default group automatically.
💡 Real-world tiering: Junior buyer = 1M PKR/doc · Manager = 10M · Director = 100M · CFO = unlimited. Each tier = its own group, assigned per user via SU01.
Verify 1G: SE16N → table T043T → CC PSPK → one row with all your values.
1H. ⚡ S/4HANA ONLY: Assign CC to Leading Ledger + Accounting Principle — FINSC_LEDGER
What this does: S/4HANA uses the Universal Journal (table ACDOCA) — a single unified ledger replacing the separate FI + CO + ML tables from ECC. Every Company Code must be: (1) assigned to a Ledger (default Leading Ledger = 0L), and (2) linked to an Accounting Principle (IFRS, Local GAAP, etc.).
Why mandatory: ACDOCA stores every posted line with a ledger + accounting principle reference. Without these for your CC, the Universal Journal engine rejects all postings.
Action sequence:
- Run FINSC_LEDGER (or SPRO → FI → FA Global Settings → Ledgers → Ledger → Define Settings for Ledgers and Currency Types)
- On the Ledger overview, click row 0L (Leading Ledger) to highlight it
- In the LEFT tree, double-click "Company Code Settings for the Ledger"
- Check if
PSPKis already in the list (0001, 1000, 2000 etc. usually are) - If PSPK is NOT listed → New Entries, add row with values below
- If PSPK IS listed but Accounting Principle is BLANK → click the cell → type
60→ Enter - Save (Ctrl+S) → Local Object / TR
- Repeat for PSAE (or use EC01 copy method — see 1M)
| Field | Value | Why |
|---|---|---|
| Company Code | PSPK | Your CC |
| Fiscal Year Variant | K4 | Same as in OBY6 |
| Posting Period Variant | PSPK | Same as in OBY6 |
| Accounting Principle | 60 (typically IFRS in IDES) | CRITICAL — F4 dropdown for available options |
| 1st FI Currency | 10 | Company Code currency |
| 2nd FI Currency | (blank or 30) | Optional — group currency for multi-currency reporting |
Common errors at 1H: "Accounting principle 60 not defined" → F4 in cell, pick from your IDES (may be 01, IFRS, LGAAP) · "Posting period variant empty" → 1B not done · "Consistency check warnings about other CCs" → pre-existing IDES issues, dismiss with ✓ · "Customizing is inconsistent: Postings of journal entries not possible" → Acctg Principle missing/wrong.
Verify 1H: Run SE16N → table FINSC_LD_CMP → BUKRS = PSPK → one row with RLDNR = 0L and ACCOUNT_PRINCIPLE filled.
1I. ⚡ S/4HANA ONLY: Classify G/L Accounts for Document Splitting — SPRO path
What this does: Document Splitting splits every FI doc by characteristics (Profit Center, Segment, Business Area) for fine-grained reporting. To work, every G/L account must be classified into an Item Category (Cash, Vendor, Customer, Material, Asset, Expense, Revenue, etc.). The splitter uses the category to decide HOW to allocate the line.
Why mandatory: Without classification, the splitter doesn't know what kind of account a G/L is → rejects the posting.
Important — this is CHART-LEVEL config: Once you classify a G/L for chart INT, it applies to ALL CCs using INT. You do this ONCE for the chart, not per CC. PSAE benefits automatically.
Action sequence:
- Run SPRO → click SAP Reference IMG
- Navigate: Financial Accounting → General Ledger Accounting → Business Transactions → Document Splitting → Classify G/L Accounts for Document Splitting
- Click 🕓 execute icon
- Chart of Accounts:
INT→ Enter - Click New Entries → add classifications (ranges save time):
| Account from | Account to | Category | Covers |
|---|---|---|---|
100000 | 129999 | 04000 Cash Account | Petty cash, bank accounts |
140000 | 149999 | 02000 Customer | AR reconciliation accounts |
160000 | 169999 | 03000 Vendor | AP reconciliation accounts |
191000 | 199999 | 01000 Balance Sheet | GR/IR clearing & other clearing |
300000 | 399999 | 06000 Material | Raw materials, trading goods, inventory |
790000 | 799999 | 06000 Material | Unfinished + finished goods |
400000 | 499999 | 20000 Expense | Consumption, expenses (when created) |
800000 | 899999 | 30000 Revenue | Sales revenue (when created) |
Save (Ctrl+S) → Local Object / TR. If category codes differ: press F4 in the Category field — different IDES/S4 versions use different numbering. Pick by NAME ("Cash Account", "Vendor", "Material").
Common errors at 1I: "View V_FAGL_SPLITGL not in directly" → use the SPRO IMG path (view name varies by release) · "Category 04000 not defined" → F4, pick valid code · Document Splitting node missing → expand "Business Transactions" first, or try Financial Accounting → FA Global Settings → Document → Document Splitting.
Verify 1I: SE16N → table T8G17A → KTOPL = INT → your classifications visible. Better: try F-02 (Step 2) — if it posts, classifications work.
1J. Extend G/L Accounts from Chart to Your CC — FS00
What this does: G/L accounts exist at TWO levels:
| Table | Level | Contents |
|---|---|---|
SKA1 | Chart of Accounts (e.g., INT) | The "template" definitions for all CCs using this chart |
SKB1 | Company Code (e.g., PSPK) | The CC-level instance that's actually usable for posting |
When you create a new CC via OX02, its SKB1 is EMPTY. You must extend chart-level G/Ls down to your CC before any FI posting can use them. FS00 is the T-code.
How many G/Ls to extend now: minimum for the F-02 smoke test (Step 2) = just 2 (bank/cash); for the full MM journey = ~15-20 (cash, vendor recon, customer recon, GR/IR, inventory, consumption, revenue).
Action sequence (per G/L):
- Run FS00
- G/L Account:
100000· Company Code:PSPK - Click "Create with Template" icon (paper-with-pencil at top)
- Reference popup: G/L Account
100000(same) · Company Code0001(or1000,2000if 0001 lacks it) - Press Enter → all tabs auto-populate from source
- Quick review: Type/Description (name, account group) · Control Data (Account currency PKR or blank, Line Item Display ✓, Sort Key 001) · Create/bank/interest (Field Status Group = G005 Bank or G001 General)
- Save (Ctrl+S) → success: "Account 100000 was created in PSPK"
Minimum 2 G/Ls for F-02 (do these now):
| G/L # | INT chart name | Use in F-02 |
|---|---|---|
100000 | Petty cash | Line 1 debit (PstKy 40) |
113100 | Bank 1 (domestic) | Line 2 credit (PstKy 50) |
Full set for all MM scenarios (extend as you reach each scenario):
| G/L # | Name (INT chart) | Needed for |
|---|---|---|
100000 | Petty cash | F-02, expense advances |
113100 | Bank 1 (domestic) | F-02, F-53 payments |
113200 | Bank 2 | Multi-bank scenarios |
140000 | AR domestic (Customer recon) | Inter-co STO (Sc 8), 3rd-party (Sc 12) |
160000 | AP domestic (Vendor recon) | ALL P2P scenarios (MIRO → vendor balance) |
191100 | GR/IR clearing ext proc | CRITICAL — every GR + IV |
300000 | Raw material 1 | Stock procurement (Sc 1) |
300010 | Raw material 2 | Alternative raw mat |
303000 | Operating supplies | Spare parts, MRO |
304000 | Spare parts | Return scenarios (Sc 2) |
310000 | Trading goods | Consignment (Sc 10) |
790000 | Unfinished products | WIP, subcontracting (Sc 9) |
792000 | Finished goods | STO (Sc 7,8), production |
177000 | Withholding tax payable | WHT scenario (Sc 24) |
176000 | Salaries payable | Payroll-related |
2000 | Buildings | Asset procurement (Sc 6) |
11000 | Machinery & equipment | Asset procurement (Sc 6) |
Bulk method (15+ G/Ls): FS15 (Send G/L Master via ALE) or copy all SKB1 entries from a source CC.
Common errors at 1J: "Account XXXXXX does not exist in chart INT" → not in SKA1; SE16N → SKA1 → KTOPL=INT to see what exists · "Account XXXXXX does not exist in source CC 0001" → try a different source CC (SE16N → SKB1 → SAKNR=XXXXXX shows which CCs have it) · "Field Status Group G005 not defined in variant PSPK" → re-copy FSV from 0001 via OBC4.
Verify 1J: SE16N → table SKB1 → BUKRS=PSPK → rows visible for extended G/Ls.
1K. ⚡ MM Period Initialization — OMSY (per CC, required for ANY material creation)
What this does: OMSY sets the CURRENT period for Materials Management (per CC, per year). This is separate from FI posting periods (OB52) — MM tracks its own "current month" for material valuation, stock movements, period closing.
Why it's separate from OB52: MM has its own monthly closure cycle (MMPV) and needs its own period state per CC. Without OMSY, MM doesn't know "what month is open" → blocks ALL material activity.
Action sequence:
- Run OMSY (or SPRO → MM → Logistics General → Material Master → Basic Settings → Maintain Company Codes for Materials Management)
- Find your CC. PSPK is likely NOT initialized yet (no Year/Period set)
- Click the PSPK row → enter values directly OR click New Entries if PSPK not listed
- Fill the fields below
| Field | Value | Why |
|---|---|---|
| Company Code | PSPK | Your CC |
| Year | current year (e.g., 2026) | Current FY |
| Pe (Period) | current month (e.g., 6 for June) | Current MM period |
| FYr (1st) / M. / FYr (2nd) / LM | Leave blank (or 0) | Previous period tracking — auto-fills after first MMPV run |
| ABp (Allow Backposting) | ✅ CHECKED | Allows posting in previous period (e.g., post a May invoice in June) |
| DBp (Disallow Backposting) | ❌ UNCHECKED | MUTUALLY EXCLUSIVE with ABp — if both checked, save fails with "combination does not make sense" |
Repeat for PSAE — same year + period (and same ABp/DBp settings). Save (Ctrl+S) → Local Object / TR.
Common errors at 1K: "This combination of entries does not make sense" → both ABp and DBp checked; uncheck DBp · "Period 6 not allowed" → must match current calendar month + valid year · "Entry already exists" → OMSY run before, check Display mode · "Cannot save with no posting period variant" → OBY6 (1E) didn't assign PPV.
Verify 1K: Run MMRV → enter CC PSPK → shows current + previous period. Or SE16N → table MARV → BUKRS=PSPK → row exists with PERYR and PERIO set.
1L. ✅ Verify CC is FULLY FUNCTIONAL — 10-point check
Run these 10 checks IN ORDER. If all pass, the CC is ready for plant creation (Step 3). If any fails, the table tells you which sub-step to revisit.
| # | T-code / Table | What to check | Pass criteria | If fails → revisit |
|---|---|---|---|---|
| 1 | OBY6 | All 4 variants assigned | Chart of Accounts, FY Variant, Posting Period Variant, Field Status Variant all filled for PSPK | 1E (and 1B/1D if variants missing) |
| 2 | OB52 | Current period open | Today's date falls within an open period row for variant PSPK | 1C |
| 3 | OBC4 | Field Status Variant PSPK exists | 80+ field status groups visible inside PSPK | 1D |
| 4 | FBN1 | Number ranges exist for current FY | Ranges (01, 15, 17, 19, 39, 49, 50, 51) visible with Year covering current FY (use 9999 for evergreen) | 1F |
| 5 | OBA4 | Tolerance group exists | One row for CC PSPK with all values populated | 1G |
| 6 ⚡ | FINSC_LEDGER / SE16N FINSC_LD_CMP | CC assigned to ledger 0L | PSPK row with Acctg Principle = 60 (or IFRS) | 1H |
| 7 ⚡ | SE16N T8G17A | G/L doc splitting classifications | Rows for chart INT covering ranges 100000-129999 (cash), 160000-169999 (vendor), etc. | 1I |
| 8 | SE16N SKB1 | G/L accounts extended to PSPK | At least 100000 + 113100 visible for BUKRS = PSPK | 1J |
| 9 ⚡ | MMRV / SE16N MARV | MM period initialized | PSPK row shows current Year + Period (e.g., 2026/6) — required for material creation | 1K |
| 10 | F-02 | Test post a G/L journal | 1000 PKR doc saves with a number → CC fully works | Step 2 covers this in detail |
Quick database-level sanity check: SE16N → table T001 → BUKRS = PSPK. The row should show: BUKRS=PSPK · BUTXT=PakSteel Industries · LAND1=PK · WAERS=PKR · KTOPL=INT · PERIV=K4 · XPERV=PSPK · FSTVA=PSPK.
If all 10 checks pass → the CC is FULLY FUNCTIONAL for both FI AND MM. Move to Step 2 (F-02 smoke test) or directly to Step 3 (Plants).
1M. 🚀 BONUS: Create the 2nd+ CC via EC01 Copy — skip 1A-1K for PSAE
Why use EC01: You just spent ~2 hours configuring PSPK through 11 sub-steps. Doing it all again for PSAE is painful. EC01 is SAP's official "Copy Company Code" transaction — it brings ~80% of customizing in one click. You then change only the country-specific essentials (currency, country, address, tax IDs).
| Method | Use when | Time | Pros | Cons |
|---|---|---|---|---|
| OX02 direct (1A) | First CC, fresh system | ~2 hrs | Explicit control over every assignment | 11+ sub-steps to do |
| EC01 copy (1M) | 2nd, 3rd, Nth CC after first works | ~10-15 min | Inherits all variants, ranges, tolerances, classifications | Must change country/currency/address; FINSC_LEDGER still manual |
📋 What EC01 COPIES automatically
| Object | Auto-copied? | Notes |
|---|---|---|
| CC master data (T001 row) | ✅ Yes | Creates target CC with source's settings — change identity fields after |
| Global parameters (OBY6 assignments) | ✅ Yes | Chart, FYV, Posting Period Variant, FSV — all linked |
| Address tab | ✅ Yes (then edit) | Copies PSPK's Pakistan address — overwrite with Dubai details |
| Number ranges (FBN1) | ✅ If checkbox selected | EC01 popup asks — check this option |
| Tolerance Groups (OBA4) | ✅ Yes | Inherits same tolerances |
| FI Document Types (OBA7) | ✅ Yes | Standard types — same as source |
| Tax codes (FTXP) | ✅ If checkbox selected | ⚠️ But UAE tax codes differ from Pakistan — edit after |
| G/L Account extensions (SKB1) | ✅ If checkbox selected | Highly recommended — copies all extended G/Ls to target CC |
| Customizing tables (account assignments) | ✅ Yes | OBYC, FI account determination inherited |
| Document Splitting classifications | ✅ Already done | Chart-level (1I) — works for any CC using INT |
| FINSC_LEDGER assignment | ❌ NO — Manual! | You MUST add the target CC in FINSC_LEDGER → 0L Company Code Settings after copy. Critical S/4HANA step. |
| Posting Period Variant (the variant itself) | ⚠️ Reuses source's (PSPK) | Keep sharing OR create new via OBBP then reassign in OBY6 |
| Field Status Variant (the variant) | ⚠️ Reuses source's (PSPK) | Usually OK to share unless different field rules needed |
⚠️ What you MUST CHANGE after EC01 copy
| Field | From PSPK (Pakistan) | To PSAE (UAE) | Why |
|---|---|---|---|
| Company Code key | PSPK | PSAE | Different legal entity |
| Company Name | PakSteel Industries (Pvt) Ltd | PakSteel Trading FZ-LLC | UAE entity name |
| Country | PK | AE | Different jurisdiction → different tax/legal rules |
| Currency | PKR | AED | Local statutory currency for UAE — once posted, can't easily change |
| City | Karachi | Dubai | Registered city |
| Region / Emirate | SD (Sindh) | DU (Dubai) or other Emirate code | For UAE VAT determination |
| Postal Code | 74900 | UAE postal (e.g., 12345) | Address validity |
| Time Zone | PKST (UTC+5) | GULFST (UTC+4) | UAE is 1 hour behind Pakistan |
| Tax Number 1 (STCD1) | NTN (FBR Pakistan) | TRN (UAE Tax Reg #) | Different fiscal regime |
| Tax Number 2 (STCD2) | STRN (Pakistan Sales Tax) | (blank — or UAE VAT #) | Pakistan STRN doesn't apply to UAE |
| Language | EN | EN (keep) or AR (Arabic) | For Arabic outputs |
🔄 EC01 Action Sequence (5-10 min)
- Run EC01
- Copy button → Source Company Code
PSPK, Target Company CodePSAE - Press Enter → confirmation popup with copy options. Tick ✅: Copy G/L master records · Copy number ranges · Copy tax codes · Copy account assignments. Leave unticked ☐: Copy customer master · Copy vendor master (usually empty)
- Execute → wait 1-2 minutes → success message lists what was copied
- Save (Ctrl+S) → Local Object / TR
🛠️ Post-Copy Adjustments (5-10 min)
- Change identity fields via OX02: select PSAE → Edit Company Code Data → Currency
AED, CountryAE, CityDubai, NamePakSteel Trading FZ-LLC→ Address button → update street, postal, region (Emirate), tax numbers (TRN instead of NTN/STRN) → Save - ⚡ Run FINSC_LEDGER for PSAE (does NOT auto-copy): Ledger 0L → Company Code Settings → New Entries → CC
PSAE, FYVK4, PPVPSAE(or PSPK if sharing), Acctg Principle60, 1st FI Currency10→ Save - Decide on Posting Period Variant: keep PSAE on PSPK's variant (simple), or create a new PSAE variant via OBBP → OB52 → reassign in OBY6 (independent)
- Update tax numbers: UAE uses TRN for VAT → STCD1 = UAE VAT registration; STCD2 blank
⚠️ Note: Even with EC01, the S/4HANA-specific FINSC_LEDGER step (1H) must be done manually for each new CC. Doc-splitting classifications (1I) are chart-level so apply automatically.
1N. ⚠️ CRITICAL: Tolerance Keys for a new CC — OMR6 + SPRO + OMC0
| 🧩 Module owner | MM — split across 3 areas: Purchasing (PE/SE keys), Logistics Invoice Verification (PP/BD/DQ/VP via OMR6), Inventory Management (B1/B2/VP via OMC0) |
| ⚙️ Needed by process | P2P — ME21N (PO save checks PE) · MIGO (GR checks VP/B1/B2) · MIRO (invoice checks PP/BD/DQ). Each transaction checks ITS OWN keys |
| 🎯 Purpose (plain) | "How much price/quantity difference is acceptable before SAP complains?" — rules are per company code; a new CC has NO rules, and for SAP no rules = nothing posts |
| 📋 Pre-config required | Only the CC itself (1A). But to actually CHECK price variance, the material needs an Accounting view with a price to compare against |
| 🔗 Links to / feeds | PE compares PO price ↔ material master price (MBEW) · PP/DQ power the MIRO 3-way match vs PO+GR · resulting messages can be softened E→W via OMRM |
Why this is critical: tolerance keys control price/quantity variance checks. A NEW CC has no keys, so the first PO/MIGO/MIRO fails with errors like M8 215 "Maintain tolerance limits for tolerance key PE (CoCode PSPK)" at PO save, or M8 462 "Tolerance key PP not maintained" at MIRO. This step PREVENTS them.
📋 All MM Tolerance Keys — what each controls
| Key | Name | Purpose | Used In | Recommended (Learning) |
|---|---|---|---|---|
PE | Price Variance Purchasing | PO net price vs material moving avg price | ME21N (PO) | 20% / 50,000 PKR both ways |
SE | Stochastic Errors | Random sample invoice checking | ME21N + MIRO | Do Not Check (skip) |
PP | Price Variance Invoice | Invoice price vs PO price | MIRO | 10% / 10,000 PKR |
BD | Form Small Differences | Auto-clear tiny rounding diffs | MIRO | 1% / 100 PKR |
BR | % OPUn variance (IR before GR) | Order price unit variance before GR | MIRO | 5% |
BW | % OPUn variance (GR before IR) | Order price unit variance after GR | MIRO | 5% |
DQ | Quantity Variance | Invoice qty vs GR qty | MIRO | 10% / 100 PKR |
DW | Qty Variance when GR qty = 0 | Invoice without GR yet | MIRO | Do Not Check |
KW | Variance from condition value | Invoice condition price check | MIRO | 10% |
LA | Amount of blanket PO | Validation for FO doc type (limit) | ME21N | 20% / 100,000 PKR |
LD | Blanket PO time limit exceeded | Date validation for FO docs | ME21N | 30 days |
PS | Price variance: estimated price | Estimated price check | MIRO | 15% |
ST | Date variance (value × days) | Late delivery × value check | MIGO + MIRO | Do Not Check |
VP | Moving average price variance | Material valuation alert | MIRO | 10% |
AN | Amount for item without order ref | Direct FI invoice limit | FB60 | 50,000 PKR |
AP | Amount for item with order ref | PO-based invoice limit | MIRO | 1,000,000 PKR |
🛠️ Configuration Path — Three T-codes for different tolerances
| T-Code | What it configures | Used For Keys |
|---|---|---|
| OMR6 | Logistics Invoice Verification tolerances | AN, AP, BD, BR, BW, DQ, DW, KW, LA, LD, PP, PS, ST, VP (Invoice context) |
| SPRO IMG: MM → Purchasing → Purchase Order → Set Tolerance Limits for Price Variance | PO Price Variance specifically | PE, SE (PO context) |
| OMC0 | Goods Movement tolerances | B1, B2, VP (GR context) |
1N.1 — Configure PE (PO Price Variance) via SPRO
- /oSPRO → SAP Reference IMG
- Navigate: Materials Management → Purchasing → Purchase Order → Set Tolerance Limits for Price Variance
- Click the 🕒 Activity icon → New Entries → fill: Tolerance Key
PE· Company CodePSPK· Amounts inPKR· Lower Limit Absolute (Check Limit ✓, Value50000) · Lower Limit Percentage (Check Limit ✓, %20) · Upper Limit Absolute (✓,50000) · Upper Limit Percentage (✓,20) - Save → Local Object → repeat for SE if needed
1N.2 — Configure PP, BD, DQ, VP, AN, AP (Invoice Verification) via OMR6
- /oOMR6 → for each key, New Entries:
| Tol Key | CC | Lower Abs/% | Upper Abs/% |
|---|---|---|---|
| PP | PSPK | 10,000 / 10% | 10,000 / 10% |
| BD | PSPK | 100 / 1% | 100 / 1% |
| DQ | PSPK | 100 / 10% | 100 / 10% |
| VP | PSPK | 10% | 10% |
| AN | PSPK | Do Not Check | 50,000 PKR |
| AP | PSPK | Do Not Check | 1,000,000 PKR |
1N.3 — Configure GR Tolerances (B1, B2, VP) via OMC0
- /oOMC0 → New Entries → add B1, B2, VP for CC PSPK with relaxed limits
🪂 ALTERNATIVE — OMRM Workaround (change Error to Warning)
If you can't configure tolerances properly (F4 issues, "Enter values for non-key fields" errors), use OMRM to change message severity from Error to Warning so PO/MIRO save with a warning instead of blocking.
- /oOMRM (Configure System Messages — MM)
- Change Area at top (M8, 06, ME…)
- New Entries → MsgNo
215(PE) · User Name blank · OnlineW· BatchIW· StandardW→ Save
Severity reference: M8 215 (PE), M8 462 (PP), M8 463 (BD), 06 207 (tolerance variant) — all default E, change to W only in a training environment. For production, never bypass via OMRM — configure proper tolerances.
🇵🇰 Pakistani industry recommended tolerances
| Industry | PE % | PP % | Reasoning |
|---|---|---|---|
| Steel mills (volatile commodity) | 25% | 15% | Iron ore prices fluctuate daily |
| Cement (stable) | 10% | 5% | Tightly controlled pricing |
| Pharma (DRAP-regulated) | 5% | 3% | Government price ceilings |
| Textile (export) | 20% | 10% | Forex impact on cotton |
| For Learning IDES | 20% | 10% | Generous + realistic |
📚 Verified against saponlinetutorials — Tolerance Limits · SAP Community — PE Tolerance F4 · SAP Help — Tolerance Limits for Invoice Postings.
1O. ⚠️ S/4HANA MANDATORY: Material Ledger Production Startup — OMX3 → OMX1 → CKMSTART
| 🧩 Module owner | CO-PC / Material Ledger (Controlling — Product Cost) — but it BLOCKS MM goods movements, so MM consultants must know it. True cross-module config |
| ⚙️ Needed by process | The FIRST (and every) goods movement per plant: MIGO, MB1C, STO, physical inventory — anything that touches stock value |
| 🎯 Purpose (plain) | Opens the plant's "value diary" so stock values can be written into the Universal Journal in multiple currencies. Optional in ECC — MANDATORY in S/4HANA |
| 📋 Pre-config required | Plant exists + assigned to CC (OX10/OX18) · FINSC_LEDGER (1H) — the ML Type's currency types must match the CC's ledger currencies (mismatch = FML_CUST033) |
| 🔗 Links to / feeds | ACDOCA material values · the "ML Act." flag you see in MM03 Accounting 1 view · with Price Det. 3 also month-end Actual Costing (CKMLCP) — we use Det. 2 (simple) |
❌ FML_CUST097 — "ML is not productive for any valuation area of company code PSPK"
Why does S/4HANA force this? In old ECC, Material Ledger was optional. In S/4HANA it is mandatory because stock values now live inside the Universal Journal (ACDOCA) in multiple currencies — and the Material Ledger is the engine that feeds it. No engine = no postings.
🛠️ The fix is 3 layers, IN THIS ORDER (each unlocks the next)
Layer 1 — Assign an ML "Type" to your plants — OMX3
Plain words: the ML Type is the diary's format (which currencies it tracks). Without a type assigned, the activation checkbox in OMX1 is GREYED OUT.
- OMX3 (Assign Material Ledger Types to Valuation Area)
- Rows PK01 / PK02 / PK03 / AE01 → Mat. Ledger Type =
Y001(the type all working IDES plants use — proven compatible) - Save → Local Object
Layer 2 — Activate ML — OMX1
- OMX1 → your plant rows now show the ML Type → checkbox is editable
- Tick ML Act. ✓ for each plant
- Price Deter. =
2(Transaction-Based — the simple mode, works like classic moving average. Mode 3 = Actual Costing needs month-end CKMLCP — skip for learning) - Save → warning "live data must be converted" → confirm
Layer 3 — The "opening ceremony" — CKMSTART
Plain words: activation is just a flag. CKMSTART actually converts the data and flips the productive switch. Run it twice: test first, then real.
- CKMSTART → Plant
PK01(use multi-select ➡️ to add all plants at once) - Exchange Rate Type: blank · Background Processing: ☐ UNTICK (online is instant for new plants) · Test Run: ✓
- Execute → log must show "Plant can be set as productive" + 0 errors
- F3 back → UNTICK Test Run → Execute again
- Log now says "Plant is now productive" ✅ — done forever (irreversible, but it's mandatory anyway)
🚨 Gotchas hit live
| Problem | Real cause | Fix |
|---|---|---|
| ML Act. checkbox greyed out in OMX1 | No ML Type assigned yet | OMX3 first (Layer 1) — then OMX1 unlocks |
| "Valuation area PK01 unable to be locked" | Your OWN other session (MIGO with PO loaded, MM03…) holds a lock | Close all other SAP windows → SM12 → delete YOUR stale locks → rerun |
| Log says "No data found in valuation area" | Plant is brand new — nothing to convert | Normal! Not an error |
| "Processing was ended without job scheduling" | Background job never scheduled | Untick Background Processing — run online |
📚 Verified: SAP Community — CKMSTART preparation steps · saponlinetutorials — Activate ML for Valuation Areas
1P. 🏁 First Goods Movement Readiness — the 4 gates every NEW CC must pass (OMRG · OMC0 · FS00 · FBN1)
| 🧩 Module owner | Mixed — Gate 1 MM-LIV (T169P) · Gate 2 MM-IM (OMC0) · Gate 3 FI-GL (FS00) · Gate 4 FI document numbering (FBN1) |
| ⚙️ Needed by process | The FIRST MIGO in a new CC — and silently by every MIGO/MIRO afterwards |
| 🎯 Purpose (plain) | The last 4 per-company rows/rules SAP checks before it can physically WRITE your goods receipt and its FI document |
| 📋 Pre-config required | Everything above: CC foundation (1A-1J) · OMSY (1K) · tolerances (1N) · ML productive (1O) · OBYC rules (Step 7) — because OBYC DECIDES which accounts Gate 3 must extend |
| 🔗 Links to / feeds | Gate 3 G/Ls = exactly OBYC's BSX/WRX targets · Gate 4 intervals match OBA7 doc-type→range mapping · MIRO later reuses Gate 1 rules + interval 51 · F-53 uses interval 15 |
🚪 Gate 1 — Invoice Verification: the TWIN tables T169P + T169V — OMRG + OMR2
❌ M7 001 — "Check table 169P: entry PSPK does not exist" (hits at MIGO)
❌ M8 100 — "Table T169V: entry PSPK does not exist" (hits later at MIRO!)
Plain words: two tiny one-row-per-company "rulebook" tables for invoice verification. T169P = checking rules (duplicate invoices, amount checks) — even a goods receipt reads it. T169V = default values (which tax code MIRO pre-fills). New CC = no rows = blocked. Fix BOTH at once — they fail at different transactions, days apart, and confuse everyone.
- T169P: OMRG (or SM30 → view
V_169P_S) → New Entries → CoCdPSPK(+PSAE) — leave Threshold/Percentage blank → Save - T169V: OMR2 (Maintain Default Values for Tax Codes) → New Entries → CoCd
PSPK(+PSAE) · Default tax codeI0→ Save. Bonus: MIRO now pre-fills the tax code
🚪 Gate 2 — Stock-posting tolerances — OMC0
❌ M8 215 — "Maintain tolerance limits for tolerance key VP (CoCode PSPK)"
Plain words: VP = "how much may this goods receipt move my material's average price before SAP complains?" A new CC has NO rules — and for SAP, no rules means 'nothing goes'. ⚠️ Read the small print: for stock postings it's OMC0 (Inventory Management), NOT OMR6 (invoices). Same M8215 number, different config place!
- OMC0 → New Entries → 3 rows for the CC:
| Key | What it checks | Learning values |
|---|---|---|
VP | Moving average price swing at GR | Check Limit · 50% |
B1 | Order price qty variance (error) | Check Limit · 50% / 100000 |
B2 | Order price qty variance (warning) | Check Limit · 30% / 50000 |
Remember the radio-button rule from 1N: every section with a typed value needs its "Check Limit" radio selected — else "Enter values in work area" error.
🚪 Gate 3 — G/L accounts must exist IN the company code — FS00
❌ M7 055 — "G/L account 300000 does not exist in company code PSPK"
Plain words: the chart of accounts (INT) is a song catalog — the song exists, but each company code must add it to its own playlist. OBYC points your GR to 300000 (inventory) and 191100 (GR/IR) — BOTH must be extended to the CC, because one GR posts to both at once.
- FS00 → G/L
300000· CCPSPK→ With Template button (don't press Enter first — "does not exist" on Enter is normal, it's why you're here!) - Template:
300000/ CC0001(or1000) → Enter - Repeat for
191100
⚠️ The 2 checkbox gotchas that bite later:
| Checkbox | Set to | Why (plain words) |
|---|---|---|
| Posting without tax allowed (Control Data) | ✓ TICK | Movements with NO tax code (561 initial stock, 201 GI to cost center, 309 transfers, 701/702 count diffs) post here. Unchecked = they ALL fail with "tax code missing" |
| Post automatically only (Create/bank/interest) | ✓ TICK | Only the system (OBYC) may post here — no manual FB50 typos. Keeps stock value = G/L value, always |
| Open Item Management on 191100 | ✓ KEEP from template | GR/IR is a clearing account — every GR line must later be "cleared" by its IR line. Open Item Mgmt makes that matching possible |
Pre-extend checklist for a new CC (2 min each): 300000 Inventory RM · 191100 GR/IR · 160000 AP recon · PRD price-difference account (e.g., 231000) · bank/cash (113100/100000) for payments.
🚪 Gate 4 — FI document number ranges — FBN1
❌ NR751 — "Interval 45/Subobject PSPK To Year 2026 does not exist for object RF_BELEG"
Plain words: every FI document takes a numbered ticket from a ticket roll. Each document type pulls from a specific roll (our WE goods-receipt doc → roll 45). New CC = missing rolls = no ticket = no document. This error is actually GOOD news — it means everything else works and SAP reached the very last step: numbering your document.
- FBN1 → CC
PSPK→ Change Intervals → note what exists - Insert the missing rolls (pattern NN → NN00000000–NN99999999):
| No | Year | From – To | Feeds doc type |
|---|---|---|---|
45 | 9999 | 4500000000 – 4599999999 | WE — Goods Receipt (our blocker — standard systems often use 50!) |
36 | 9999 | 3600000000 – 3699999999 | RE — MIRO invoice in our IDES (error F5150 named it) |
50 | 9999 | 5000000000 – 5099999999 | WE/WA standard mapping |
51 | 9999 | 5100000000 – 5199999999 | RE — MIRO invoice (standard mapping) |
19 | 9999 | 1900000000 – 1999999999 | KR — vendor invoice |
15 | 9999 | 1500000000 – 1599999999 | KZ — vendor payment (F-53) |
20 | 9999 | 2000000000 – 2099999999 | ZP — payment program |
⚠️ Three FBN1 gotchas:
- Year 2026 vs 9999: year-specific intervals DIE on 1-Jan of next year (NR751 returns for everything!). Use
9999on test systems. Real companies maintain new-year intervals as a year-end task. - "Copy intervals from CC" only works into an EMPTY company code. If even one interval exists, copy refuses → insert the missing rows manually.
- Your system's doc-type→range mapping may be NON-STANDARD. Our IDES maps MIRO's RE doc to range
36(standard is 51!). Proactive check: OBA7 → double-click each doc type you'll use (WE, RE, KR, KZ, ZP, SA) → note its "Number range" → ensure each exists in FBN1.
📚 Verified: SAP Community — T169P fix · T169P per-CC requirement · Tolerance limits
🚨 Issues & fixes (from a live IDES)
A brand-new company code in S/4HANA must pass a gauntlet of checks before its first complete P2P posting succeeds. SAP shows them one at a time — fix one, the next appears. These were all hit live on the IDES. The table below is the 9-Gate Gauntlet in the exact order SAP raises them; fix all of them up front and your first GR posts clean. Each error links to the Troubleshooting Center.
| # | Error you'll see | Plain meaning | Fix (T-code) | Sub-step |
|---|---|---|---|---|
| 1 | Ledger 0L not set up for CC | The CC isn't registered in the S/4 accounting ledger | FINSC_LEDGER | 1H |
| 2 | "Company code not fully maintained" at MM01 | MM's own period clock never started for this CC | OMSY | 1K |
| 3 | ME062 "Account assignment mandatory" | Material has no value-tracking setup (Accounting view / OMS2) | MM01 Accounting 1 + OMS2 | Material step |
| 4 | M8 215 for PE at PO save | No "acceptable price difference" rule for POs | SPRO → PO → Price Variance | 1N |
| 5 | FML_CUST097 "ML not productive" | The plant's value diary was never opened | OMX3→OMX1→CKMSTART | 1O |
| 6 | M7001 "table 169P entry missing" (MIGO) + M8100 "T169V missing" (MIRO) | The TWIN invoice-verification rulebooks have no row for this CC | OMRG + OMR2 | 1P Gate 1 |
| 7 | M8 215 for VP at MIGO | No "acceptable price swing" rule for stock postings | OMC0 VP/B1/B2 | 1P Gate 2 |
| 8 | M7055 "G/L 300000 does not exist in CC" | Account in catalog but not on this CC's playlist | FS00 With Template ×2 | 1P Gate 3 |
| 9 | NR751 "Interval 45 does not exist" | No ticket roll to number the FI document | FBN1 insert intervals | 1P Gate 4 |
| 10 | F5150 interval 36 + M8100 T169V + F5506 G/L (MIRO) · F5100 T043G (F-53) | The same 4 gate types REPEAT for invoice + payment: another ticket roll, the T169V twin, the input-tax account, and vendor-side tolerances (OBA3 — sibling of 1G's OBA4: OBA4=USER tolerances T043T, OBA3=VENDOR tolerances T043G) | FBN1 · OMR2 · FS00 · OBA3 | 1P + 1G |
Other errors worth knowing (per sub-step)
| Error | Root cause | Fix | Sub-step |
|---|---|---|---|
| "Posting period MM YYYY is not open" | OB52 missing a row covering today's date | OB52 — add current period | 1C |
| "Document number not in range XX defined for CC PSPK" | FBN1 range missing / year-specific entry expired | FBN1 — create range with Year 9999 | 1F |
| "No field status variant assigned to CC PSPK" | OBY6 missing FSV field | OBY6 — fill Field Status Variant = PSPK | 1E |
| "There is no item category assigned to account XXXXXX/INT" | G/L not classified for Document Splitting | SPRO Classify G/L | 1I |
| "This combination of entries does not make sense" (OMSY) | Both ABp and DBp checked | OMSY — uncheck DBp, keep ABp | 1K |
| ML Act. checkbox greyed out in OMX1 | No ML Type assigned in OMX3 yet | OMX3 first, then OMX1 | 1O |
✅ Verification
The full 10-point functional check lives in sub-step 1L. The fastest confirmation that everything works together is the F-02 smoke test in Step 2. Quick database-level checks:
- Run SE16N → table
T001→ BUKRS =PSPK→ row showsKTOPL=INT,PERIV=K4,XPERV=PSPK,FSTVA=PSPK all populated - SE16N →
FINSC_LD_CMP→ BUKRS=PSPK → one row, RLDNR=0L, Accounting Principle filled (proves 1H) - SE16N →
SKB1→ BUKRS=PSPK → at least 100000 + 113100 + 191100 extended (proves 1J / 1P Gate 3) - MMRV → CC PSPK → current Year + Period shown (proves 1K)
- FBN1 → CC PSPK → Change Intervals → ranges with Year 9999 visible (proves 1F / 1P Gate 4)
- Final proof: run F-02 and post 1000 PKR — if a document number is issued, all FI sub-steps work together. A first MIGO posting "Material document posted" proves the MM-side gates (1K, 1N, 1O, 1P) too.