使用构造函数表达式时发生转换异常
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
之后的变量类型。您可以通过在 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( ).
我正在编写一个例程,将字符串 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
之后的变量类型。您可以通过在 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( ).