在VALUE的左侧和右侧使用相同的itab会生成空表为什么?

问题描述

这是给你的……

此代码如何导致空表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_test2FOR循环时为空。

在您的情况下,可以使用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 ).

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...