使用构造函数表达式时的转换异常

5 abap

我正在研究一个例程,它将字符串表的行(在本例中fui_elements)移动到未知类型的结构(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.
Run Code Online (Sandbox Code Playgroud)

如果table i_field_customizing(STANDARD TABLE OF string)不是initial,我想使用它的值.

否则我想生成一个整数表(这样无论表的值如何,循环都会经常运行).以下lw_max是导入结构具有的字段数量:

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 ).
Run Code Online (Sandbox Code Playgroud)

但当我用i_field_customizing这样的方式运行报告时:

DATA(i_field_customizing) = VALUE t_string_tt( ( `KUNNR` ) ( `NAME1` ) ).
Run Code Online (Sandbox Code Playgroud)

我在我尝试构建的行上得到了这个异常li_temp:

CX_SY_CONVERSION_NO_NUMBER(KUNNR不能解释为数字)


我目前的猜测是COND静态得到它的类型.有谁知道我怎么能解决这个问题?

Jag*_*ger 4

您试图实现的目标是不可能的,因为使用的变量的内联定义的类型COND是在编译时而不是在运行时决定的。

请在这里查看我的问题。将采用的类型始终是直接位于 后面的变量的类型THEN。THEN您可以通过摆弄否定条件并在at之后切换变量位置来决定在编译时选择什么类型,ELSE但它始终是 or ,并且根据我的理解,您希望能够动态地执行此操作,以便您的ASSIGN COMPONENT语句可以作为预期为整数。

ELSE即使在获得与您相同的短转储后专门转换变量。

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 ) )->* ).
Run Code Online (Sandbox Code Playgroud)

或者,您可以强制转换为REF TO DATA,但随后必须将其取消引用为类型的字段符号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( ).
Run Code Online (Sandbox Code Playgroud)