TCURV table — Exchange rate type definitions
TCURV stores the definition of each exchange rate type used in the system, such as M for standard, B for bank buying, G for bank selling, or a custom EURX type. One row per exchange rate type holds its base currency, whether rate inversion is permitted, and whether the rate must be fixed rather than overridden manually. It does not hold the actual daily rates; TCURR does.
TCURV is the configuration table behind every exchange rate type used across FI, CO, and treasury postings. This page covers what a row represents, which fields actually exist and are safe to rely on, and the recurring mistake of confusing this definition table with TCURR, the table that holds the daily rates themselves.
Published 15 Sept 2026· 933 words
What it stores
One row in TCURV represents one exchange rate type as defined in the system, for example M (standard translation rate), B (bank buying rate), G (bank selling rate), or a company-specific type created for a particular scenario such as budget planning or hedge accounting. The row carries the behavioural settings for that type: which currency is treated as the base currency for rates stored under it, whether the rate can be inverted (used in the reverse direction) when a matching direct rate is missing, and whether the rate for that type is meant to be fixed and not changed at document entry. It is a small, client-dependent configuration table maintained once and referenced constantly by postings, valuations, and translations across every module that touches currency.
Key fields
- MANDT - client
- KURST - exchange rate type, the key value referenced everywhere else (M, B, G, or custom types)
- XINVR - indicator that inversion is allowed for this rate type when no direct rate is maintained for a currency pair
- XFIXD - indicator that the rate for this type is fixed and should not be manually overridden at posting time
- BWAER - base currency assigned to the exchange rate type, against which rates under this type are expressed
How it joins the data model
- TCURR-KURST = TCURV-KURST, the actual daily rates stored per type join back to its definition here
- BKPF-KURST = TCURV-KURST, every posted document header carries the exchange rate type used to translate the document currency
- TCURV-KURST joins to the exchange rate type text table for the description shown in dropdowns and reports
How to read it safely
TCURV is tiny, typically a handful of rows per client since most installations use only the SAP-delivered types plus one or two custom ones. There is no selectivity problem: filter on client and, if needed, on KURST directly. The risk with this table is not performance, it is misreading the flags. XINVR and XFIXD are booleans that change behaviour elsewhere, not values to be extrapolated into a business rule without checking how the rate type is actually consumed in the posting or valuation program that uses it.
How to prove it in the data
Symptom: a translated amount looks like it used the wrong side of a currency pair, for example EUR to USD applied where USD to EUR was expected. Select TCURV where KURST equals the rate type in question and check XINVR. If XINVR is blank, the system will not invert a missing direct rate and will instead raise a rate-not-found error rather than silently flipping direction, so the real fault lies in TCURR maintenance, not in TCURV.
ECC vs S/4HANA
TCURV is unchanged on S/4HANA. It remains a standard configuration table maintained through the same currency configuration transaction and is not superseded by a compatibility view, since it is master configuration rather than transactional or aggregated data. Programs and CDS views that need exchange rate behaviour still read TCURV alongside TCURR exactly as they did in ECC.
Common pitfalls
- Treating XFIXD as if it hardcodes a rate value. It only prevents manual override at document entry; the actual value still comes from TCURR and can still be wrong or missing there.
- Confusing TCURV with TCURR. TCURV defines the type once; TCURR holds the date-dependent rates. A 'no exchange rate found' error is almost always a TCURR gap, not a TCURV configuration problem, and chasing it in TCURV wastes time.
- Assuming a custom Z exchange rate type behaves like M by default. If BWAER or the inversion flag was set differently during creation, translations under that type can diverge from standard rates without anyone noticing until a variance shows up in reporting.
- Editing entries directly in the table maintenance view instead of through the standard configuration transaction. Skipping the transaction bypasses consistency checks tied to other currency tables and can leave a rate type half-configured.
- Believing that changing or deleting a rate type retroactively affects historical postings. Documents already posted in BKPF and BSEG carry their own stored rate and currency fields; TCURV changes only affect future rate determination.
Whose problem this is
Currency and exchange rate type setup belongs to the FI general ledger or treasury configuration lead, not to Basis or an ABAP developer. Any question about why a particular translation used inversion, or why a fixed-rate flag behaves a certain way, should go to whoever owns the currency configuration chapter of the FI build, since it is a deliberate design decision, not an accident of data.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/tcurvERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.