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

Conversion exception while working with constructor expressions

我正在编写一个例程,将字符串 table(在本例中为 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.

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

否则,我想生成一个整数 table(这样循环 运行 的频率与 table 的值无关)。这里 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 ).

但是当我 运行 报告 i_field_customizing 这样的时候:

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

我在尝试构造 li_temp:

的那一行遇到了这个异常

CX_SY_CONVERSION_NO_NUMBER (KUNNR cannot be interpreted as a number)


我目前的猜测是 COND 是静态获取其类型的。有人知道我该如何解决这个问题吗?

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

请看我的问题。将采用的类型始终是直接位于 THEN 之后的变量类型。您可以通过在 THENELSE 之后否定条件和切换变量的位置来决定在编译时选择什么类型,但它总是或者或者根据我的理解你想要成为能够动态地执行此操作,因此您的 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 ) )->* ).

或者,您可以强制转换为 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( ).