CX_SY_DYN_CALL_ILLEGAL_TYPE¶
Raised during dynamic method or function module calls when a passed parameter type does not match the declared signature.
Purpose¶
CX_SY_DYN_CALL_ILLEGAL_TYPE fires when ABAP resolves a dynamic call at runtime and finds that one or more parameters are incompatible with the method or FM's signature — a type check that would have been a compile-time error in a static call.
Inheritance chain:
CX_SY_DYN_CALL_ILLEGAL_TYPE → CX_SY_DYN_CALL_ERROR → CX_DYNAMIC_CHECK → CX_ROOT
How to catch¶
This example uses a dynamic call to a standard SAP function module so you can run it directly in SE38:
REPORT z_dyn_call_type_demo.
START-OF-SELECTION.
" We will call 'CONVERSION_EXIT_ALPHA_INPUT' dynamically
" It expects IV_INPUT TYPE CHAR — we will first pass the correct type,
" then demonstrate what happens with a wrong type via PARAMETER-TABLE
DATA lv_method_name TYPE string VALUE 'CONVERSION_EXIT_ALPHA_INPUT'.
DATA lv_input TYPE char10 VALUE '123'.
DATA lv_output TYPE char10.
" Correct approach: dynamic FM call using CALL FUNCTION variable
CALL FUNCTION lv_method_name
EXPORTING
input = lv_input
IMPORTING
output = lv_output
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
WRITE: / 'Result:', lv_output. " 0000000123
ENDIF.
Dynamic method call with PARAMETER-TABLE (where the type error typically occurs):
REPORT z_dyn_call_type_catch.
START-OF-SELECTION.
" Dynamic method call via PARAMETER-TABLE
DATA lo_salv TYPE REF TO cl_salv_table.
DATA lt_data TYPE STANDARD TABLE OF sflight.
SELECT * FROM sflight INTO TABLE @lt_data UP TO 3 ROWS.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_salv
CHANGING t_table = lt_data ).
" Call a method dynamically by name
DATA lv_method TYPE string VALUE 'GET_COLUMNS'.
DATA lt_params TYPE abap_parmbind_tab.
DATA lo_columns TYPE REF TO cl_salv_columns_table.
" Add RETURNING parameter binding
INSERT VALUE #(
name = 'RR_COLUMNS'
kind = cl_abap_objectdescr=>returning
value = REF #( lo_columns )
) INTO TABLE lt_params.
TRY.
CALL METHOD lo_salv->(lv_method)
PARAMETER-TABLE lt_params.
IF lo_columns IS BOUND.
lo_columns->set_optimize( abap_true ).
WRITE: / 'Dynamic call succeeded — columns optimized'.
ENDIF.
CATCH cx_sy_dyn_call_illegal_type INTO DATA(lx).
WRITE: / 'Type mismatch in dynamic call:', lx->get_text( ).
CATCH cx_sy_dyn_call_error INTO DATA(lx_call).
WRITE: / 'Dynamic call error:', lx_call->get_text( ).
ENDTRY.
Validate signature before calling¶
Use RTTI to inspect the method's expected parameter types before calling dynamically:
REPORT z_dyn_call_rtti_check.
START-OF-SELECTION.
DATA lo_salv TYPE REF TO cl_salv_table.
DATA lt_data TYPE STANDARD TABLE OF sflight.
DATA lv_method_name TYPE string VALUE 'GET_COLUMNS'.
SELECT * FROM sflight INTO TABLE @lt_data UP TO 1 ROWS.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_salv
CHANGING t_table = lt_data ).
" Get class descriptor and check method exists
DATA(lo_class) = CAST cl_abap_classdescr(
cl_abap_typedescr=>describe_by_object_ref( lo_salv ) ).
TRY.
DATA(ls_method) = lo_class->methods[
name = to_upper( lv_method_name ) ].
WRITE: / 'Method found:', ls_method-name.
" List its parameters
LOOP AT ls_method-parameters INTO DATA(ls_param).
WRITE: / ' Param:', ls_param-name, 'Kind:', ls_param-parm_kind.
ENDLOOP.
CATCH cx_sy_itab_line_not_found.
WRITE: / 'Method', lv_method_name, 'not found on class'.
ENDTRY.
Common causes¶
| Cause | Fix |
|---|---|
Passing TYPE STRING where TYPE CHAR10 expected |
Align variable type to method signature |
Wrong kind in parameter binding table |
Use cl_abap_objectdescr=>returning for RETURNING params |
| Method name in wrong case | Use TO_UPPER( lv_method ) — method names are upper case internally |
| Passing a table where a structure is expected | Use RTTI to inspect expected parameter type first |
Confusing EXPORTING/IMPORTING direction
In ABAP_PARMBIND_TAB, the kind field uses the caller's perspective: parameters you supply to the method use cl_abap_objectdescr=>exporting; parameters you receive back use cl_abap_objectdescr=>importing; returning parameters use cl_abap_objectdescr=>returning.
See also¶
CL_ABAP_TYPEDESCR— inspect method signatures with RTTICX_SY_MOVE_CAST_ERROR— related type mismatch exception- Transaction ST22 — ABAP runtime error analysis