首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用构造函数表达式时转换异常

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

Stack Overflow用户
提问于 2016-06-01 12:03:25
回答 1查看 266关注 0票数 5

我正在处理一个例程,它将字符串表的行(在本例中为fui_elements)移动到未知类型的结构(fcwa_struct)中。

代码语言:javascript
复制
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是导入结构所包含的字段数量:

代码语言:javascript
复制
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运行报告时:

代码语言:javascript
复制
DATA(i_field_customizing) = VALUE t_string_tt( ( `KUNNR` ) ( `NAME1` ) ).

我在试图构造li_temp的行中得到了这个异常

CX_SY_CONVERSION_NO_NUMBER (KUNNR不能解释为数字)

我目前的猜测是,COND是静态地获得其类型的。有谁知道我怎么才能绕过这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-01 12:56:29

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

请看我的问题here。将采取的类型始终是直接位于THEN之后的变量的类型。您可以通过在THEN at ELSE上更改条件和切换变量位置来决定在编译时选择哪种类型,但根据我的理解,它始终是或者是从我所理解的情况来看,您希望能够动态地这样做,这样您的ASSIGN COMPONENT语句就能像预期的那样与整数一起工作。

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

代码语言:javascript
复制
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类型字段符号的引用。

代码语言:javascript
复制
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( ).
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37568115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档