Conversion exception while working with constructor expressions

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-12 10:54:24

问题


I'm working on a routine which moves the lines of a string table (in this case fui_elements) into a structure of unknown type (fcwa_struct).

DATA(li_temp) = ... "fill assignment table here

LOOP AT fui_elements ASSIGNING FIELD-SYMBOL(<lfs_element>).

    ASSIGN COMPONENT li_temp[ sy-tabix ] OF STRUCTURE fcwa_struct 
        TO FIELD-SYMBOL(<lfs_field>).

    IF sy-subrc <> 0.
        "somethings wrong with the fui_elements data
    ENDIF.
    <lfs_field> = <lfs_element>.
ENDLOOP.

If the table i_field_customizing (STANDARD TABLE OF string) is not initial, I want to use its values.

Otherwise I want to generate an integer table (so that the loop runs equally often regardless of the table's values). Here lw_max is the amount of fields the imported structure has:

DATA(li_temp) = COND #( WHEN i_field_customizing[] IS INITIAL
                        THEN VALUE t_integer_tt( FOR X = 1 
                                                 THEN X + 1 
                                                 WHILE X <= lw_max 
                                                 ( X ) )
                        ELSE i_field_customizing ).

But when I run the report with i_field_customizing like that:

DATA(i_field_customizing) = VALUE t_string_tt( ( `KUNNR` ) ( `NAME1` ) ).

I get this exception on the line where I try to construct li_temp:

CX_SY_CONVERSION_NO_NUMBER (KUNNR cannot be interpreted as a number)


My current guess is that COND gets its type statically. Does anybody know how I can get around this?


回答1:


What you are trying to achieve will not be possible because the type of an inline definition of a variable using COND is decided at compilation time and not at runtime.

Please see my question here. The type that will be taken is always the type of the variable that stands directly after THEN. You can decide what type will be chosen at compilation time by fiddling with negating the condition and switching places of variables after THEN at ELSE but it will be always either or and from what I understand you want to be able to do it dynamically so your ASSIGN COMPONENT statement works as expected with integers.

Even by specifically casting the variable after ELSE one gets the same short dump as you do.

DATA(li_temp) = COND #( WHEN i_field_customizing IS INITIAL
                        THEN VALUE t_integer_tt( ( 1 ) ( 2 ) )
                        ELSE CAST t_string_tt( REF #( i_field_customizing ) )->* ).

Alternatively you could cast to REF TO DATA but then you have to dereference it to a field symbol of type STANDARD TABLE.

REPORT zzy.

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
    TYPES:
      t_integer_tt TYPE STANDARD TABLE OF i WITH EMPTY KEY,
      t_string_tt TYPE STANDARD TABLE OF string WITH EMPTY KEY.
    FIELD-SYMBOLS:
      <fs_table> TYPE STANDARD TABLE.
    DATA: BEGIN OF l_str,
      kunnr TYPE kunnr,
      name1 TYPE name1,
      END OF l_str.

*      DATA(i_field_customizing) = VALUE t_string_tt( ( `KUNNR` ) ( `NAME1` ) ).
      DATA(i_field_customizing) = VALUE t_string_tt( ).

      DATA(li_temp) = COND #( WHEN i_field_customizing IS INITIAL
                              THEN CAST data( NEW t_integer_tt( ( 1 ) ( 2 ) ) )
                              ELSE CAST data( REF #( i_field_customizing ) ) ).

      ASSIGN li_temp->* TO <fs_table>.

      LOOP AT <fs_table> ASSIGNING FIELD-SYMBOL(<fs_temp>).
        ASSIGN COMPONENT <fs_temp> OF STRUCTURE l_str TO FIELD-SYMBOL(<fs_field>).
      ENDLOOP.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  lcl_main=>main( ).


来源:https://stackoverflow.com/questions/37568115/conversion-exception-while-working-with-constructor-expressions

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!