Skip to content

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

Comments