PERFORM_CONFLICT_TYPE — PERFORM_CONFLICT_TYPE runtime error
PERFORM_CONFLICT_TYPE fires when an external PERFORM call passes a USING, CHANGING or TABLES parameter whose data type does not match the formal parameter declared in the target FORM routine. Because the caller and the routine live in separate compilation units, the type check cannot happen at syntax time and is deferred to execution, where the mismatch surfaces as an uncatchable dump.
Covers the PERFORM_CONFLICT_TYPE dump raised during external subroutine calls when the actual and formal parameter types disagree. Focuses on the transport and generic-type mismatches that cause it in practice, what to read in the ST22 detail screen, and why wrapping the PERFORM in exception handling does not work.
Published 16 Sept 2026· 1,345 words
What the dump means
PERFORM_CONFLICT_TYPE belongs to the family of runtime type-mismatch dumps triggered specifically by external PERFORM statements, meaning a PERFORM that targets a routine in a different program or is resolved dynamically via a program name in parentheses. Within a single program the ABAP compiler sees both the calling statement and the FORM definition together and rejects a type mismatch at activation. Across program boundaries, or when the target program is only known at runtime, that static check is impossible, so the kernel performs the comparison when the statement actually executes. If the actual parameter's technical type, structure, or table category does not match what the FORM declares for that position, the kernel abandons the call and raises this runtime error rather than silently truncating or reinterpreting the data. It is a defensive dump: the alternative would be memory corruption from misreading a structure with the wrong layout.
Root causes that actually produce it
- Stale caller after a signature change: the FORM's USING, CHANGING or TABLES interface was modified in one program (new structure, different table type) but a caller elsewhere still compiles against the old signature because it was not regenerated or retested, and the mismatch only surfaces when that specific code path executes.
- Incomplete transport: the calling program and the program containing the FORM were changed together in development but only one of the two objects reached the target system, so the active versions in that system no longer agree on the interface.
- Generic versus specific table type on a TABLES parameter: the FORM expects a specific line type or table category and the caller passes a differently structured internal table, standard versus sorted, or a table with a different key definition, which the compiler cannot flag because the check is deferred.
- Dynamic PERFORM with a program name resolved at runtime, common in generic batch-input or generic report frameworks, where the actual parameter's type depends on which program gets plugged in and cannot be verified until that specific combination runs.
- Field symbol or generic work area passed where the FORM expects a fixed structure: the field symbol was assigned to a different type at runtime than the one the routine's interface declares.
- Program buffer desynchronization across application servers: one instance still holds an old compiled version of the routine or the caller after a transport, so the dump appears intermittently depending on which server handles the request, and disappears after a buffer refresh without any code change.
- Reused legacy include with locally redefined structures: the same subroutine pool or include is called from multiple programs that each define a same-named structure with different fields, so the type that satisfies one caller conflicts with another.
What to inspect in ST22
- Category and short text at the top of ST22 confirm PERFORM_CONFLICT_TYPE and usually name the parameter position and the routine involved.
- The 'What happened' section states the calling program, the line of the PERFORM statement, and the name of the external routine and its program, which tells whether this is a static external PERFORM or a dynamic one resolved from a variable.
- Source code extract shows the exact PERFORM statement highlighted in the caller; note whether it uses a literal program name or a variable, since that changes the fix path.
- Active calls and events section shows the call stack, useful when the PERFORM sits inside a BDC session, a batch job, or an RFC-enabled function module rather than being called directly by a user.
- Follow up in SE38 or SE80 to display the FORM's declaration and compare the actual parameter's type in the caller against the formal parameter's declared type or table category.
- Check SE11 for the structures or table types involved if the mismatch is not obvious from the interface alone, particularly when both sides reference a type by name that has since been changed.
- If the dump is intermittent and tied to a specific application server, check SM51 and consider whether a program buffer refresh is masking a transport sequencing gap rather than resolving it.
Resolution path
If the cause is a signature change with a stale caller, correct the caller to match the current FORM interface and retest both together; this is a code change requiring a transport request. If the cause is an incomplete transport, the fix is transport management, not code: move the missing object into the target system so caller and callee are consistent again, or, if that is not immediately possible, revert the changed side back to match. If the cause is a TABLES parameter type conflict, decide which side is correct and adjust either the caller's internal table declaration or the FORM's parameter typing, favouring a generic table type in the FORM if the routine genuinely needs to serve multiple callers; this needs a change request and regression test of every caller. If the cause is a dynamic PERFORM, the durable fix is redesign: replace the dynamic external PERFORM with a function module or method call that has a strongly typed, compiler-checked interface, which is a larger effort but removes the whole class of risk. If the cause is program buffer desynchronization, a Basis-side buffer refresh or targeted server restart resolves the symptom immediately, but only after confirming the transport itself is complete on all servers.
The fix people try first (and why it fails)
The first reflex is usually to wrap the PERFORM in a TRY CATCH block expecting to trap the exception the way CALL FUNCTION or CALL METHOD failures are caught. The PERFORM statement does not support an EXCEPTIONS addition or participate in structured exception handling in the same way, so this change compiles, looks reassuring, and does nothing: the dump still terminates the program the next time the mismatched call executes. The second common reflex is restarting the application server or clearing the program buffer because the dump stopped appearing afterward. That only proves the buffer was stale; if the underlying transport gap or signature mismatch is still there, the dump returns as soon as the buffer repopulates from the inconsistent source.
Prevention
Treat external PERFORM as legacy syntax and avoid it in new development; function modules and class methods enforce interface types at activation time and cannot produce this dump. Where external PERFORM must be retained for existing code, always transport the calling program and the program containing the FORM in the same transport request so they never go out of sync in a target system. Run an extended program check or code inspector variant that flags external PERFORM usage and cross-checks parameter types where the tooling supports it, and treat any warning about generic table types on shared FORM interfaces as a signal to convert the routine to a proper method.
Whose problem this is
This is an ABAP development problem in the great majority of cases, since the fix is a code or transport correction rather than a configuration or infrastructure change. Basis involvement is limited to confirming or refreshing program buffers when the symptom is intermittent across application servers. The handover note should name the calling program and line, the target routine and its program, the exact parameter and expected versus actual type, and the transport request numbers for both sides of the call.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-abap-dumps/perform-conflict-typeERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.