Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Why can't we pass data ref variable of type string to perform with USING import par TYPE REF TO data

rajivsap
Explorer
0 Kudos
1,703

Why can't we pass data ref variable of static_type string to perform w/h USING import_par TYPE REF TO data?

REPORT ZABAP_OBJECTS_STRING_VAR_REF.

DATA: lr_string TYPE REF TO string.

CREATE DATA lr_string.
lr_string->* = 'String'.

PERFORM pass_string_as_im USING lr_string.

FORM pass_string_as_im USING
*** im_string TYPE REF TO data. " Syntax_Error-1
im_string TYPE REF TO string. "Working
BREAK-POINT.
ENDFORM .

"Syntax_Error-1-In PERFORM or CALL FUNCTION "PASS_STRING_AS_IM", the actual parameter "LR_STRING" is incompatible with the formal parameter "IM_STRING".

1 ACCEPTED SOLUTION

touzik_itc
Active Participant
1,277

In this form it work for subroutines too:

DATA: lr_string TYPE REF TO data.
lr_string = REF #( 'String' ).

PERFORM pass_string_as_im USING lr_string.

FORM pass_string_as_im USING
im_string TYPE REF TO data. " no syntax error
BREAK-POINT.
ENDFORM .
5 REPLIES 5

matt
Active Contributor
1,277

Don't use FORM and PERFORM. They're obsolete. Use classes and methods instead. It works fine there.

CLASS lcl_main DEFINITION.
  PUBLIC SECTION.
    METHODS set
      IMPORTING i_thing TYPE REF TO data.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD set.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  DATA main TYPE REF TO lcl_main.
  CREATE OBJECT main.
  DATA string TYPE REF TO string.
  main->set( string ).

It is a bit odd that FORM doesn't allow it.

Sandra_Rossi
Active Contributor
1,277

I guess the issue is more about USING which works like CHANGING. Even in methods, CHANGING doesn't allow a upcast/downcast in type. Here it's about a data reference, but I guess it's the same bizarre thing as with object references: https://blogs.sap.com/2011/10/05/abap-trapdoors-type-lock-in/

0 Kudos
1,277

If you must use subroutines, then you can convert LR_STRING to TYPE REF TO DATA, and pass that to the subroutine

DATA: lr_string  TYPE REF TO string,
      lr_string1 TYPE REF TO data.
FIELD-SYMBOLS: <fs_temp> TYPE any.
CREATE DATA lr_string.
lr_string->* = 'String'.


CREATE DATA lr_string1 TYPE string.
ASSIGN lr_string1->* TO <fs_temp>.
<fs_temp> = lr_string->*. "basically putting LR_STRING (STRING) in LR_STRING1 (DATA)


PERFORM pass_string_as_im USING lr_string1.

FORM pass_string_as_im USING im_string TYPE REF TO data. " Syntax_Error-1
*im_string TYPE REF TO string. "Working
  FIELD-SYMBOLS: <fs_temp> TYPE any.
  ASSIGN im_string->* TO <fs_temp>.
  WRITE:/ <fs_Temp>.
ENDFORM .
<br>

matt
Active Contributor
0 Kudos
1,277

sandra.rossi
I'm reminded of this. Everything is Broken

touzik_itc
Active Participant
1,278

In this form it work for subroutines too:

DATA: lr_string TYPE REF TO data.
lr_string = REF #( 'String' ).

PERFORM pass_string_as_im USING lr_string.

FORM pass_string_as_im USING
im_string TYPE REF TO data. " no syntax error
BREAK-POINT.
ENDFORM .