基于where条件

时间:2017-06-15 09:10:08

标签: abap

到目前为止,我总是用它来从内部表中获取特定的行:

LOOP AT it_itab INTO ls_itab WHERE place = 'NEW YORK'.
    APPEND ls_itab TO it_anotherItab
    INSERT ls_itab INTO TABLE it_anotherItab
ENDLOOP.

然而,7.40似乎有REDUCE,FOR,LINES OF和FILTER。 FILTER需要一个有序或哈希的键,在我的例子中并非如此。所以我猜只有FOR才会受到质疑。

DATA(it_anotherItab) = VALUE t_itab( FOR wa IN it_itab WHERE ( place = 'LONDON' )

                         ( col1 = wa-col2 col2 = wa-col3 col3 = ....... ) ).

问题是:

  • 两者确实在做同样的事吗?第二个是APPEND或INSERT吗?
  • 在第二个版本中是否可以使用整个结构而不指定每个列?就像(wa)
  • 一样
  • 第二个例子更快吗?

1 个答案:

答案 0 :(得分:1)

根据您的评论,您还可以在标准表上定义已排序的辅助密钥。请看这个例子:

TYPES:
    BEGIN OF t_line_s,
        name1 TYPE name1,
        name2 TYPE name2,
        ort01 TYPE ort01,
    END OF t_line_s,

    t_tab_tt TYPE STANDARD TABLE OF t_line_s
        WITH NON-UNIQUE EMPTY KEY
        WITH NON-UNIQUE SORTED KEY place_key COMPONENTS ort01. "<<<

DATA(i_data) = VALUE t_tab_tt( ). " fill table with test data

DATA(i_london_only) = FILTER #( 
    i_data 
    USING KEY place_key  " we want to use the secondary key
    WHERE ort01 = CONV #( 'london' ) " stupid conversion rules...
).

" i_london_only contains the filtered entries now

<强>更新
在我的快速&amp;脏的性能测试,FILTER在第一次通话时速度很慢,但之后会击败LOOP-APPEND变种。

更新2:
今天找到了原因...

  

...在下次显式使用辅助表密钥(延迟更新)时,将更新非唯一辅助表密钥的管理。