Create & Configure Company Code β End-to-End
π― Why this step is 12 sub-steps (not one click) β including 3 S/4HANA-specific + MM period init
The Company Code (CC) is the legal entity β it owns the balance sheet, P&L, and files taxes. Every MM document (PO, GR, invoice) eventually posts to a CC's books via plant β CC linkage. If the CC is missing any one of these settings, FI postings will fail and MM stops cold.
SAP doesn't auto-create most of these for you. You build them one by one. 3 sub-steps (1H, 1I, 1J) are S/4HANA-specific β they did NOT exist in ECC but are mandatory in S/4HANA's Universal Journal architecture. Skip them and F-02 / MIGO / MIRO all fail.
β‘ S/4HANA vs ECC β what changed
If you're following an ECC-era tutorial, you'll hit walls after 1G. S/4HANA added these requirements not present in ECC:
- Universal Journal (ACDOCA) β single unified ledger replacing separate FI/CO/ML tables β requires 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 chart has G/Ls, they must be extended to YOUR CC before posting (1J)
π Quick roadmap of sub-steps (1Aβ1P)
| # | 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 (use Year 9999 for 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 this, 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 method for 2nd+ CC (PSAE etc.) β skip 1A-1K for additional CCs | 10 min | Universal |
| 1N β οΈ | OMR6/OMC0/SPRO | Tolerance Keys (PE/PP/VP/BDβ¦) β "how much variance is acceptable" rules; 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: we build dependencies BEFORE we reference them. 1B/1D create variants β 1E references them. 1H requires CC + ledger to exist. 1I classifies G/Ls before they're used. 1J extends G/Ls before F-02 needs them. For 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 (OX18), Purch Orgs (OX01), 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 V3 + 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(45), MIROβRE(51), F-53βKZ(15) |
| 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 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 (number ranges, variants, etc.) from the source CC. Sounds convenient β but in learning you don't know what got copied silently, so when something fails later, you can't 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
- You'll see two options β 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 (statutory requirement). 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:
| Error / popup | Cause / fix |
|---|---|
| "Company code already exists" | PSPK was created before. Either pick another code or delete the existing via OX02 β select β delete. |
| "Currency XXX not defined" | Currency missing from TCURC. Use OY03 to define. PKR/AED are usually pre-delivered in IDES. |
| "Country XX not maintained" | Country missing from T005. Rare in IDES; usually pre-delivered. |
| "Choose Transport Request" popup | Either give a TR (real projects) or click Local Object ($TMP) for learning. |
Verify 1A: Run SE16N β table T001 β BUKRS = PSPK β execute. One row should appear with BUTXT (name), LAND1 (country), WAERS (currency) populated. KTOPL/PERIV/FSTVA will still be 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 creating 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. E.g., if PSPK and PSAE both follow the same monthly close calendar, they can share one variant. 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 (covers all alphanumeric accounts). |
| 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, and you can tweak individual groups later if business demands.
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 (this 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; common in fresh customizing clients):
- 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 all into one view β easier to verify and 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:
| Error | Fix |
|---|---|
| "Chart of Accounts INT not defined" | Use OB13 to create β INT is delivered in IDES. |
| "Fiscal Year Variant K4 not defined" | Use OB29; K4 is SAP standard, should exist. |
| "Posting Period Variant PSPK not defined" | You skipped 1B. Go back and create it. |
| "Field Status Variant PSPK not defined" | You skipped 1D. Go back and copy from 0001. |
Verify 1E: Re-open OBY6 β PSPK β all fields above 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 β 7 ranges):
- Run FBN1
- Company Code:
PSPK - Click "Change Intervals" (NOT "Maintain Groups")
- For each of the 7 ranges below, click "Insert Interval" (Shift+F1) β enter values β Enter
- Save (truck icon) β dismiss "Transport Number Range Intervals" info popup with β
- Repeat all 7 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 ranges. To verify which range your SA actually uses: OBA7 β SA β check "Number range" field.
Field meanings in each FBN1 row:
| Column | What it means |
|---|---|
| No. | The range key (01, 15, 49...). Must match what doc type expects (mapped in OBA7). |
| Year | YEAR-SPECIFIC β use 9999 for evergreen "all years" coverage. Avoid year 2030 (only valid in 2030 then!) |
| From Number / To Number | The pool boundaries. Use 10-digit blocks (e.g., 1900000000β1999999999) β gives 100M docs per range. |
| Current Number | Auto-tracks next number SAP will assign. Leave at 0 β let SAP manage. |
| Ext (External Flag) | External numbering (user types number manually). Leave UNCHECKED for MM β SAP auto-assigns. |
β‘ 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 will fail with "number range XX missing for year 2026".
Best practice: use Year 9999 β SAP treats this as "valid for ALL fiscal years" (evergreen). One row covers every year forever. Real projects either:
- Year 9999 β evergreen, no maintenance needed (recommended for learning/test)
- Year-specific entries (2025, 2026, 2027...) β when finance wants strict per-year audit control
For your IDES learning: use Year 9999 in all ranges to avoid the trap of "FY year mismatch" errors when posting in any year.
Popups you'll see (and how to handle):
| Popup | What to do |
|---|---|
| "Define Selection Options" (in OBH1) | Click = (Single Value) to dismiss. Or skip OBH1 entirely β use FBN1. |
| "Variant Attributes" (in OBH1) | Wrong move β press F3 to back out. Don't save here. This is SAP's "save these input values as a reusable report variant" screen, irrelevant here. |
| "Transport Number Range Intervals" (info) | Dismiss with β. Number ranges are special β they DON'T transport via standard TRs to prevent overwriting production's current-number counter. SAP just informs you. |
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:
- Assigned to a Ledger (default Leading Ledger =
0L) - 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 on row OL (Leading Ledger) to highlight it
- In LEFT tree, double-click "Company Code Settings for the Ledger"
- You see CCs already assigned (0001, 1000, 2000, etc.). Check if
PSPKis already there. - If PSPK is NOT in list β New Entries, add row with values below
- If PSPK IS in list but Accounting Principle column is BLANK β click into the cell β type
60β Enter - Save (Ctrl+S) β Local Object / TR
- Repeat for PSAE (or use EC01 copy method β see 1L)
Required fields:
| 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" | Press F4 in cell β pick from your IDES's defined principles (may be 01, IFRS, LGAAP) |
| "Posting period variant empty" | 1B not done β go back to 1B/1C |
| "Consistency check warnings about other CCs" | Pre-existing IDES issues for other CCs β dismiss with β, doesn't affect your save |
| "Customizing is inconsistent: Postings of journal entries not possible" | Acctg Principle missing or wrong β verify dropdown F4 value |
Verify 1H: Run SE16N β table FINSC_LD_CMP β BUKRS = PSPK β execute. One row should show 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 chart. So you do this ONCE for the chart, not per CC. PSAE will benefit automatically.
Action sequence:
- Run SPRO β click SAP Reference IMG button
- Navigate (expand each βΆ):
- 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 lots of time):
Recommended classification ranges for INT chart:
| 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 category numbering. Pick by NAME ("Cash Account", "Vendor", "Material" etc).
Common errors at 1I:
| "View V_FAGL_SPLITGL not in directly" | Use SPRO IMG path (not SM30 direct) β view name varies by S/4 release |
| "Category 04000 not defined" | F4 in cell β pick valid category code from your system |
| Document Splitting node missing from SPRO | Expand "Business Transactions" first β node nested inside. If still missing, 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 are working.
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 F-02 smoke test (Step 2): just 2 (bank/cash)
- For 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 toolbar)
- Reference popup:
- G/L Account:
100000(same) - Company Code:
0001β or try1000,2000if 0001 doesn't have it
- G/L Account:
- Press Enter β all tabs auto-populate from source
- Quick review:
- Type/Description: name, account group (auto)
- 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) β Local Object / TR
- 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 (for 15+ G/Ls): FS15 (Send G/L Master via ALE) or copy all SKB1 entries from source CC. Saves hours.
Common errors at 1J:
| "Account XXXXXX does not exist in chart INT" | That G/L isn't in SKA1. Run SE16N β SKA1 β KTOPL=INT to see what's available. |
| "Account XXXXXX does not exist in source CC 0001" | Try different source CC (1000, 2000, or any CC that has the G/L). SE16N β SKB1 β SAKNR=XXXXXX shows which CCs have it. |
| "Field Status Group G005 not defined in variant PSPK" | Your FSV from 1D missing G005. Re-copy 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" for the CC β blocks ALL material activity (creation, GR, GI, valuation).
Action sequence:
- Run OMSY (or SPRO β MM β Logistics General β Material Master β Basic Settings β Maintain Company Codes for Materials Management)
- Find your CC in the list. PSPK is likely NOT initialized yet (no Year/Period set)
- Click on PSPK row β enter values directly OR click New Entries if PSPK not in list
- Fill these fields:
| 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:
| Error | Fix |
|---|---|
| "This combination of entries does not make sense" | BOTH ABp and DBp checked. Uncheck DBp, keep ABp. |
| "Period 6 not allowed" | Period must match current calendar month + valid year combo |
| "Entry already exists" | OMSY was run before. Check Display mode β may already be set up. |
| "Cannot save with no posting period variant" | OBY6 (1E) didn't assign PPV. Go back and fix. |
π‘ Monthly task going forward (FYI)
OMSY is initial setup. Each month, run MMPV (Close Period for Materials) to advance the MM period from 6 to 7, 7 to 8, etc. Real projects schedule MMPV as automatic month-end job. For learning, you can skip MMPV β just set OMSY with current period.
The relationship:
- OMSY β initial period setup per CC (do once)
- MMPV β advance period monthly (or backposting if ABp allows)
- MMRV β display current period status
Verify 1K: Run MMRV β enter CC PSPK β shows current period + previous period status. 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, 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 (deep dive Step 2) | Step 2 covers this in detail |
Quick database-level sanity check: Run SE16N β table T001 β BUKRS = PSPK. The row should show all these populated:
BUKRS= PSPK Β·BUTXT= PakSteel Industries Β·LAND1= PK Β·WAERS= PKRKTOPL= INT Β·PERIV= K4 Β·XPERV= PSPK Β·FSTVA= PSPK
If all 10 checks pass β CC is FULLY FUNCTIONAL for both FI AND MM. Move to Step 2 (F-02 smoke test if not done) or directly to Step 3 (Plants).
1M. π BONUS: Create 2nd+ CC via EC01 Copy β Skip 1A-1K for PSAE/additional CCs
Why use EC01: You just spent ~75-90 minutes configuring PSPK through 11 sub-steps. Doing it all again for PSAE is painful. EC01 is SAP's official "Copy Company Code" transaction that brings 80% of customizing in one click. You then change only the country-specific essentials (currency, country, address, tax IDs).
π― OX02 direct (1A) vs EC01 copy (1L) β when to use which
| Method | Use when | Time | Pros | Cons |
|---|---|---|---|---|
| OX02 direct (1A) | First CC, fresh system | ~90 min | Explicit control over every assignment | 11 sub-steps to do |
| EC01 copy (1L) | 2nd, 3rd, Nth CC after first works | ~10-15 min | Inherits all variants, ranges, tolerances, classifications | Must change country/currency/address after; FINSC_LEDGER still manual |
π What EC01 COPIES automatically (you don't redo)
| Object | Auto-copied? | Notes |
|---|---|---|
| CC master data (T001 row) | β Yes | Creates target CC with source's settings β you change identity fields after |
| Global parameters (OBY6 assignments) | β Yes | Chart of Accounts, FYV, Posting Period Variant, FSV β all linked |
| Address tab | β Yes (then edit) | Copies PSPK's Pakistan address β you must 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 |
| Customer / Vendor masters | β If checkbox selected | Skip first time β usually not yet created |
| Customizing tables (account assignments, etc.) | β 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 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) | You can keep sharing OR create new variant 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 (mandatory edits)
| 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 β overwrite with UAE TRN |
| 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 β enter:
- Source Company Code:
PSPK(your working CC) - Target Company Code:
PSAE
- Source Company Code:
- Press Enter β confirmation popup with copy options. Tick (β
):
- β Copy G/L master records (copies all SKB1 from PSPK to PSAE)
- β Copy number ranges
- β Copy tax codes
- β Copy account assignments
- β Copy customer master (skip β usually empty)
- β Copy vendor master (skip β 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:
- OX02 β select PSAE β click Edit Company Code Data
- Change Currency:
AEDΒ· Country:AEΒ· City:DubaiΒ· Name:PakSteel Trading FZ-LLC - Click Address button β update street, postal, region (Emirate), phone, tax numbers (TRN instead of NTN/STRN)
- Save
- β‘ Run FINSC_LEDGER for PSAE (this DOESN'T auto-copy):
- FINSC_LEDGER β Ledger 0L β Company Code Settings for the Ledger
- New Entries β CC =
PSAE, FYV =K4, PPV =PSAE(or PSPK if sharing), Acctg Principle =60, 1st FI Currency =10 - Save
- Decide on Posting Period Variant:
- Option A (simple): Keep PSAE using PSPK's posting period variant β no new variant needed
- Option B (independent): Create new PSAE variant via OBBP β OB52 to open periods β OBY6 reassign
- Verify Field Status Variant:
- Usually OK to share PSPK's FSV β most companies in same group use identical FSV
- Update tax numbers properly:
- UAE uses TRN (Tax Registration Number) for VAT β STCD1 = your UAE VAT registration if applicable
- STCD2 β blank or other UAE-specific code
β Verify PSAE after EC01 copy
| # | Check | Pass criteria |
|---|---|---|
| 1 | SE16N β T001 β BUKRS = PSAE | Row populated with WAERS=AED, LAND1=AE, all variants filled |
| 2 | OBY6 β PSAE | Chart INT, FYV K4, PPV set, FSV set, Acctg Principle visible |
| 3 | SE16N β SKB1 β BUKRS = PSAE | All G/L accounts that existed in PSPK now extended to PSAE |
| 4 | FBN1 β CC PSAE β Change Intervals | Number ranges visible (auto-copied from PSPK) |
| 5 | OBA4 β CC PSAE | Tolerance group row present (auto-copied) |
| 6 | FINSC_LEDGER β 0L β Company Code Settings β PSAE row | Acctg Princ = 60, FYV = K4 (you added this manually) |
| 7 | F-02 β CC PSAE β 1 AED debit/credit β Post | Doc number issued β |
π‘ Real-world EC01 patterns
- Multi-country rollout: Build one model CC carefully β EC01 to all subsidiaries (PSAE, PSUS, PSUK) β adjust per local fiscal regime
- Cluster sharing: Multiple CCs in same country can share Posting Period Variant, Field Status Variant, Tolerance Group β less long-term maintenance
- Time savings: 90 min for source CC + 15 min per copy. For 10 CCs: 4 hours total vs 15 hours redoing 1A-1J
- Best practice: EC01 BEFORE any postings exist in target. If target CC already has postings, some objects can't be re-copied.
β οΈ 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.
π« What breaks if you skip any sub-step
| Skip this | Error you'll hit later |
|---|---|
| 1A β OX02 CC shell | Nothing else can be done β CC must exist first |
| 1B β OBBP Posting Period Variant | 1E (OBY6) can't link a variant that doesn't exist β either rejects or silently creates a broken link |
| 1C β OB52 open periods | "Posting period MM YYYY is not open" at every posting |
| 1D β OBC4 Field Status Variant | "No field status variant assigned" β all FI postings rejected |
| 1E β OBY6 Global Parameters | "No chart of accounts assigned" / "FY variant missing" β FI rejected |
| 1F β FBN1 Number Ranges | "Document number not in range XX defined for CC PSPK" β first MIRO/MIGO fails |
| 1G β OBA4 Tolerance | Either users blocked from posting OR unlimited posting authority (audit risk) |
| 1H β‘ FINSC_LEDGER | "Correct the Customizing settings for ledgers for the universal journal" on F-02, MIRO, MIGO β Universal Journal rejects posts |
| 1I β‘ Doc Splitting Classification | "There is no item category assigned to account XXXXXX/INT" on every FI posting |
| 1J β FS00 G/L Extension | "G/L account XXXXXX has not been created for company code PSPK" β can't use the G/L in postings |
| 1K β‘ OMSY MM Period | "The company code PSPK does not exist or has not been fully maintained" on MM01 / MIGO β MM-side blocked until OMSY done. F-02 will still work (FI-only) so it's confusing. |
β οΈ Critical: do ALL 12 sub-steps for the FIRST CC (PSPK). For PSAE, use 1M (EC01 copy) β much faster.
Each CC is independent. PSAE doesn't inherit PSPK's CC-level customizing automatically. Two options:
- Direct path: Repeat 1A-1J for PSAE manually (~90 min) β same level of effort as PSPK
- Copy path (recommended): Use 1L (EC01) β inherits ~80% from PSPK, only change country/currency/address (~15 min)
Either way, the S/4HANA-specific FINSC_LEDGER (1H) needs manual setup for each new CC.
1N. β οΈ CRITICAL: Tolerance Keys Configuration for new CC β OMR6 + SPRO + OMRM
| π§© 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 Company Code 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 in MM transactions. When you create a NEW CC (like PSPK), default tolerance keys are NOT auto-copied. First PO/MIGO/MIRO transaction will fail with errors like:
| Error Code | Message | Triggered In |
|---|---|---|
M8 215 | "Maintain tolerance limits for tolerance key PE (CoCode PSPK)" | ME21N (PO save) |
M8 216 | "Maintain tolerance limits for tolerance key SE" | ME21N (PO save with planned costs) |
M8 462 | "Tolerance key PP not maintained" | MIRO (invoice posting) |
M8 463 | "Maintain tolerance limits for BD" | MIRO (small differences) |
This step PREVENTS those errors.
π All MM Tolerance Keys β what each controls
| Key | Name | Purpose | Used In | Recommended Value (Learning) |
|---|---|---|---|---|
PE | Price Variance Purchasing | Compares 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 | Compares invoice price vs PO price | MIRO | 10% / 10,000 PKR |
BD | Form Small Differences | Auto-clear tiny rounding diffs | MIRO | 1% / 100 PKR |
BR | Percentage OPUn variance (IR before GR) | Order price unit variance check before GR | MIRO | 5% |
BW | Percentage OPUn variance (GR before IR) | Order price unit variance check after GR | MIRO | 5% |
DQ | Quantity Variance | Invoice qty vs GR qty | MIRO | 10% / 100 PKR |
DW | Quantity 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 β Two 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) |
π Step-by-Step Configuration
Sub-step 1N.1 β Configure PE (Price Variance for PO) via SPRO
- /oSPRO β click 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 Code:
PSPK - Amounts in:
PKR(or auto-derived) - Lower Limit β Absolute β Check Limit β β Value
50000 - Lower Limit β Percentage β Check Limit β β %
20 - Upper Limit β Absolute β Check Limit β β Value
50000 - Upper Limit β Percentage β Check Limit β β %
20
- Tolerance Key:
- Save β Local Object
- Repeat for SE if needed (same values)
Sub-step 1N.2 β Configure PP, BD, DQ, VP (Invoice Verification) via OMR6
- /oOMR6
- For each key, click New Entries and add:
| 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 |
Sub-step 1N.3 β Configure GR Tolerances (B1, B2, VP) via OMC0
- /oOMC0
- New Entries β add B1, B2, VP for company code PSPK with relaxed limits
πͺ ALTERNATIVE β OMRM Workaround (Change Error to Warning)
If you can't configure tolerances properly (e.g., F4 dropdown issues, "Enter values for non-key fields" errors), use OMRM to change message severity from Error to Warning. PO/MIRO will save with warning instead of blocking.
- /oOMRM (Configure System Messages β MM)
- Change Area at top to relevant area (M8, 06, ME, etc.)
- New Entries β fill:
- MsgNo:
215(for PE tolerance) - User Name: blank (applies to all)
- Online:
W - BatchI:
W - Standard:
W
- MsgNo:
- Save β Local Object
| Message No | Area | Text | Default Severity |
|---|---|---|---|
M8 215 | M8 | Maintain tolerance limits for PE | E β change to W |
M8 462 | M8 | Maintain tolerance limits for PP | E β change to W |
M8 463 | M8 | Maintain tolerance limits for BD | E β change to W |
06 207 | 06 | Tolerance message variant | E β change to W |
π¨ Troubleshooting Common Errors
| Error | Cause | Fix |
|---|---|---|
| "Enter values in work area for non-key fields" | One of the 4 radio buttons still on "Do Not Check" while value field has data | Click "Check Limit" radio for ALL 4 sections, or remove values for "Do Not Check" sections |
| PE not in F4 dropdown of OMR6 | PE is NOT in OMR6's filtered list β it's in PO Price Variance config | Use SPRO IMG path "Set Tolerance Limits for Price Variance" (not OMR6) |
| "Amounts in" field locked/disabled | Currency auto-derived from CC | Just save β currency auto-fills as PKR |
| OMRM "Message 215 not allowed" | OMRM doesn't allow override for that specific message in current SAP version | Use PROPER config path (SPRO IMG) instead of OMRM workaround |
π΅π° 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 |
| Construction / EPC | 25% | 15% | Material price volatility |
| FMCG | 15% | 8% | Brand-managed prices |
| For Learning IDES | 20% | 10% | Generous + realistic |
π Interview-Ready Q&A
Q: Why are tolerance keys company-code-specific?
A: Each company code has its own statutory currency, tax regime, business rules. Tolerances reflect "what's acceptable variance" for that specific entity. A Pakistani steel mill (PSPK) accepts 20% commodity price variance; UAE retail (PSAE) might allow only 5%. Different limits per CC = different governance.
Q: Why is PE not in OMR6's F4 dropdown?
A: SAP design distinction. OMR6 manages tolerance keys for Invoice Verification context (the 14 keys you see: BD, DQ, PP, VP, etc.). PE is a Purchase Order context key β checked when saving PO. SAP has a separate SPRO IMG path: "Set Tolerance Limits for Price Variance" specifically for PE/SE. Both write to table T169G but use different views.
Q: When to use OMRM (Message Severity) vs proper tolerance config?
A: Two different purposes: (1) Tolerance config = define ACCEPTABLE variance limits (the actual %/value rules). (2) OMRM = change SEVERITY of the message when limits violated (Error blocks, Warning allows). Best practice: Configure proper tolerances FIRST. Use OMRM only when business explicitly wants warning-only (e.g., training environment, prototyping). For production, never bypass via OMRM.
Q: How do you decide tolerance values for a new client?
A: Multi-step analysis: (1) Industry benchmarks (commodity vs regulated). (2) Historical invoice variance analysis (run report on last 12 months). (3) Vendor reliability β strict for new vendors, relaxed for trusted. (4) Material category β strategic vs commodity. (5) Total spend β high-value materials get tighter % but higher absolute. Document the rationale in Functional Spec β auditors will ask why specific limits.
Q: What's the difference between Absolute and Percentage check?
A: Both checks can be active simultaneously: Absolute (Value) = fixed currency limit (e.g., 50,000 PKR). Useful for low-value items where 20% might be tiny absolute. Percentage = relative limit (e.g., 20%). Useful for high-value items where fixed amount would be too restrictive. Best practice: Set BOTH. Either limit triggers the message. Example: For 1000 PKR material, 20% = 200 PKR is small risk. For 5,000,000 PKR machine, 20% = 1M PKR is huge β absolute limit of 100K caps it.
π Source: Verified against saponlinetutorials.com β Tolerance Limits + SAP Community β PE Tolerance F4 Issue + 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's 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 β this confused us for 10 minutes!
- OMX3 (Assign Material Ledger Types to Valuation Area)
- Rows PK01 / PK02 / PK03 / AE01 β Mat. Ledger Type =
Y001(same 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 runs β 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 that's fine β it's mandatory anyway)
π¨ Gotchas we hit live (so you don't)
| 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 |
π Interview Q&A β Material Ledger
Q: Difference between "activated" and "productive"?
A: Activation (OMX1) is a customizing flag. Production startup (CKMSTART) physically converts valuation data and sets the productive indicator. Until CKMSTART completes, all goods movements are blocked with FML_CUST097.
Q: Price Determination 2 vs 3?
A: 2 = Transaction-Based (classic MAP/Standard behavior, ML records values β most clients). 3 = Single-/Multilevel Actual Costing (periodic actual price via CKMLCP month-end β manufacturing with strong costing needs).
Q: Why is ML mandatory in S/4HANA?
A: Universal Journal stores material values in up to 3 currencies/valuations; ML is the subsystem that calculates and feeds them. SAP hard-blocks movements without it.
π Verified: SAP Community β CKMSTART preparation steps Β· saponlinetutorials β Activate ML for Valuation Areas
1P. π First Goods Movement Readiness β the 4 gates every NEW company code 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 it: CC foundation (1A-1J) Β· OMSY (1K) Β· tolerances (1N) Β· ML productive (1O) Β· and 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 are matched per OBA7 doc-typeβrange mapping Β· MIRO later reuses Gate 1 rules + interval 51 Β· F-53 uses interval 15 |
πͺ Gate 1 β Invoice Verification parameters: 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 code =I0β Save. Bonus: MIRO now pre-fills the tax code for you
πͺ 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 doesn't mean 'anything goes', it means 'nothing goes'.
β οΈ Read the error's 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 like a song catalog β the song exists, but each company code must add it to its own playlist. OBYC points your GR to accounts 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(or1000if 0001 lacks it) β 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 differences) post to these accounts. 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 is what makes that matching possible |
Pre-extend checklist for a new CC (do all at once, 2 min each): 300000 Inventory RM Β· 191100 GR/IR Β· 160000 AP recon (done in BP step) Β· 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 appearing 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 (standard 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 closing 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" β make sure every one exists in FBN1. The error itself (NR751 / F5150) always names the missing interval β read it, insert it, move on.
π The complete 9-Gate Gauntlet β quick reference (what we survived live)
Plain words: a brand-new company code in S/4HANA must pass ALL of these before its first complete P2P posting. SAP shows them ONE AT A TIME β bookmark this table and fix all 9 up front instead.
| # | Error you'll see | Plain meaning | Fix | 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 | M8215 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 "table T169V entry missing" (MIRO) | The TWIN invoice-verification rulebooks have no row for this CC | OMRG + OMR2 | 1P Gate 1 |
| 7 | M8215 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 154000 (at MIRO) Β· F5100 T043G (at 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 β the sibling of 1G's OBA4: OBA4=USER tolerances T043T, OBA3=VENDOR tolerances T043G, blank group = default for all vendors) | FBN1 Β· OMR2 Β· FS00 Β· OBA3 | 1P + 1G |
β After gate 9: "Material document posted" (GR works) β and after gate 10's repeats, MIRO and F-53 post too = the complete P2P cycle. Dr 300000 Inventory / Cr 191100 GR/IR at GR β GR/IR cleared against vendor at invoice β vendor cleared against bank (β2% cash discount!) at payment. Every config piece fires automatically. That's MM-FI integration working end-to-end.
π Verified: SAP Community β T169P fix Β· T169P per-CC requirement Β· Tolerance limits