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

标签 dynamic 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.

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

否则我想生成一个整数表(这样无论表的值如何,循环都以同样的频率运行)。这里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 的变量的内联定义的类型是不可能的。是在编译时决定的,而不是在运行时决定的。

请看我的问题 here .将采用的类型始终是紧跟在 THEN 之后的变量的类型。 .您可以通过在 THEN 之后摆弄否定条件和切换变量位置来决定在编译时选择哪种类型。在 ELSE但它总是要么 要么 并且据我所知,您希望能够动态地做到这一点,因此您的 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( ).

关于dynamic - 使用构造函数表达式时的转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568115/

相关文章:

c# - 在 C#/.NEt 中,动态类型占用的空间是否比对象少?

ios - dylib 或可执行导出列表

java - 向动态数组的左侧和右侧添加问题

abap - 仅向 CDS 中的数字字段添加前导零?

abap - 在消息类型 e 之后,程序不会返回到选择屏幕 ABAP

c - 如何在 C 中使用动态多维数组?

abap - 不使用 TABLES 关键字修改输入字段上的文本

abap - 从数据库表中获取单个字段到 itab

abap - 为什么在内置功能模块中允许这种结构声明,而在新功能模块中却不允许?

c# - 在 C# 中构建动态 linq 查询的最佳方法?