问题描述
这是给你的……
此代码如何导致空表gt_test2
…
gt_test2 = VALUE #(
FOR gs_test1 IN gt_test1 WHERE ( v3 = gs_test3-v3 AND v4 = gs_test3-v4 )
FOR gs_test2 IN gt_test2 WHERE ( v1 = gs_test1-v1 AND v2 = gs_test1-v2 )
( gs_test2 )
).
WRITE / lines( gt_test2 ).
这会产生正确的结果吗?
DATA: gt_test2_2 LIKE gt_test2.
gt_test2_2 = VALUE #(
FOR gs_test1 IN gt_test1 WHERE ( v3 = gs_test3-v3 AND v4 = gs_test3-v4 )
FOR gs_test2 IN gt_test2 WHERE ( v1 = gs_test1-v1 AND v2 = gs_test1-v2 )
( gs_test2 )
).
WRITE / lines( gt_test2_2 ).
这是ABAP中的错误!?我一直认为,首先要评估表达式的右侧,然后再将其分配给左侧。然而,在这种ABAP构造中,似乎在计算右侧的时候会在内部使用左侧,这会导致错误的结果。
最小的工作示例。
REPORT ZZZ.
TYPES: BEGIN OF ty_test1,v1 TYPE char40,v2 TYPE char6,v3 TYPE char6,v4 TYPE char32,END OF ty_test1,BEGIN OF ty_test2,v5 TYPE numc3,END OF ty_test2,BEGIN OF ty_test3,END OF ty_test3.
TYPES: tty_test1 TYPE STANDARD TABLE OF ty_test1 WITH EMPTY KEY,tty_test2 TYPE STANDARD TABLE OF ty_test2 WITH EMPTY KEY.
INITIALIZATION.
DATA(gt_test1) = VALUE tty_test1(
( v1 = '1' v2 = '007001' v3 = '0012345678' v4 = '001061' )
( v1 = '2' v2 = '007001' v3 = '0999999953' v4 = '001061' )
).
DATA(gt_test2) = VALUE tty_test2(
( v1 = '1' v2 = '007001' v5 = '10' )
( v1 = '2' v2 = '007001' v5 = '15' )
).
DATA(gs_test3) = VALUE ty_test3( v3 = '0999999953' v4 = '001061' ).
START-OF-SELECTION.
* DATA: gt_test2_2 LIKE gt_test2.
* gt_test2_2 =
gt_test2 =
VALUE #(
FOR gs_test1 IN gt_test1 WHERE ( v3 = gs_test3-v3 AND v4 = gs_test3-v4 )
FOR gs_test2 IN gt_test2 WHERE ( v1 = gs_test1-v1 AND v2 = gs_test1-v2 )
( gs_test2 )
).
WRITE / lines( gt_test2 ).
* WRITE / lines( gt_test2_2 ).
解决方法
使用构造函数表达式首先清除目标数据对象,因此会遇到以下结果:内部表gt_test2
在FOR
循环时为空。
在您的情况下,可以使用LET(将其清除目标数据对象之前调用)将内部表转换为辅助内部表。
ABAP Documentation - "VALUE,Internal Tables":
,如果将VALUE运算符用作内部表的赋值源,则在对可能的LET表达式求值后首先对其进行初始化,或者将其分配给itab的内容。然后,评估line_spec数据并将其直接插入目标表中。
在将构造函数表达式分配给内部表时,其现有行不能直接用作line_spec中的参数。这是因为该表在itab的内容被评估或覆盖line_spec之前被删除。但是,如果需要左侧的整个内部表或行,则可以使用LET表达式将它们保存在本地帮助程序变量中,因为该表达式首先被求值。
Sandra是正确的,但是您可以使用FILTER
op来克服此限制,该操作缺少令人失望的阻止程序。
如果您想避免创建新表,则可以这样重新考虑示例:
...
TYPES: tty_test1 TYPE SORTED TABLE OF ty_test1 WITH NON-UNIQUE KEY primary_key COMPONENTS v1 v2
WITH NON-UNIQUE SORTED KEY filt COMPONENTS v3 v4,tty_test2 TYPE SORTED TABLE OF ty_test2 WITH NON-UNIQUE KEY primary_key COMPONENTS v1 v2.
...
gt_test1 = FILTER #( gt_test1 USING KEY filt WHERE v3 = gs_test3-v3 AND v4 = gs_test3-v4 ).
gt_test2 = FILTER #( gt_test2 IN gt_test1 WHERE v1 = v1 AND v2 = v2 ).