我想知道有什么解决办法。
TYPES: BEGIN OF ty_table1,
field1 TYPE string,
END OF ty_table1,
tt_table1 type STANDARD TABLE OF ty_table1 with EMPTY KEY,
BEGIN OF ty_table2,
field1 TYPE string,
END OF ty_table2,
tt_table2 type STANDARD TABLE OF ty_table2 with EMPTY KEY.
DATA: lt_table TYPE table OF ty_table1,
lt_final TYPE table OF ty_table2.
DATA(lt_table1) = VALUE tt_table1( FOR <fs_struct> IN lt_table WHERE ( field1 EQ 'TEST' )
( CORRESPONDING #( <fs_struct> ) ) ).
DATA(lt_table2) = VALUE tt_table2( FOR <fs_struct> IN lt_final WHERE ( field1 EQ 'TEST1' )
( CORRESPONDING #( <fs_struct> ) ) ).
在这里,我们将在第二个构造函数表达式中得到一个语法错误:
"& lt; FS_STRUCT>"已经用类型"TY_TABLE1"不能与类型"TY_TABLE2"这里。
是否有办法"取消分配"?第一个表述之后的<FS_STRUCT>
?因此,它可以在接下来的FOR语句中用于不同的表。
普通的UNASSIGN
语句不能用来取消对<fs_struct>
的赋值,因为它在FOR循环之外没有作用域。
FOR
语句的目标字段与LET
表达式具有相同的语义:
因此,实际上在代码中有两种不同的声明(理论上可以包含不同的类型)。然而,ABAP语言强制类型匹配,可能是为了避免混淆的情况,即具有相同名称的变量突然拥有不同的类型(这也可能需要防止运行时的冲突)。在LET表达式中指定的helper字段在指定LET表达式的上下文中有效。这可以是一个完整的表达式,也可以只是表达式的一部分。一个完整表达式的所有辅助字段都在同一个命名空间中。先前指定的helper字段不能在同一表达式的其他LET表达式中指定。此外,helper字段与当前过程或程序的数据对象或字段符号位于相同的名称空间中。如果表达式的过程或程序中已经存在同名的数据对象或字段符号,则不能在LET表达式中定义Helper字段。相反,不能在使用LET表达式的表达式之后声明名称赋给helper字段的数据对象或字段符号。当在不同的表达式中重用helper字段时,适用以下规则:
- 如果helper字段是在当前过程或程序中第一次定义的,它被声明为内联的。
- 如果当前过程或程序中的helper字段在不同表达式的LET表达式中再次定义,并且派生的数据类型匹配,则helper字段绑定到该表达式并可以在那里使用。
- 如果当前过程或程序中的helper字段在不同表达式的LET表达式中再次定义,并且派生的数据类型不匹配,则无法在那里使用helper字段并发生语法错误。
也没有办法影响用LET
²声明的a局部变量的类型推断。
由此我想说答案显然是否定的,你真的应该对不同的类型使用不同的名字。此外,在通用字段符号上使用CORRESPONDING
对我来说听起来很危险,我会避免这样做。
²除非您更改了派生类型的值,例如:通过CONV
将一个表插入到另一个表(尽管这可能不适用于您的情况):
DATA(second_result) = VALUE second_table_type(
FOR <entry> IN CONV first_table_type( second_source )
WHERE ( field1 EQ 'TEST1' )
( CORRESPONDING #( <entry> ) )
).