2021 Mar 30 12:58 AM
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".
2021 Mar 30 9:30 AM
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 .
2021 Mar 30 7:39 AM
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.
2021 Mar 30 8:00 AM
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/
2021 Mar 30 3:19 PM
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>
2021 Mar 30 5:30 PM
2021 Mar 30 9:30 AM
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 .