计算满足某些条件的itab行?

问题描述 投票:0回答:5

我从函数模块调用中获取了一个内部表,该表返回约 100 行。大约 40% 的行与我无关,因为我只需要带有

PAR1 = "XYZ"
的条目。 在 SQL 表(透明表)上,我可以使用 a

select count(*) from tab where PAR1 = "XYZ" 

获取有效条目的数量。

查看文档,我所能找到的只是用于迭代表的 READ Table 语法。我当前的方法是基本上有一个循环,如果该行包含我想要的值则增加。但这似乎效率很低。

有更好的方法满足我的要求吗?

abap internal-tables
5个回答
13
投票

从 740 SP05 开始您可以使用:

DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN gt_itab
                    WHERE( F1 = 'XYZ' ) NEXT x = x + 1 ).

用于计算 gt_itab 中满足条件 f1 = 'xyz' 的行数。


9
投票

做任何你觉得正确的事情。对于大约 100 行,几乎没有什么会对运行时产生巨大的影响。对我来说,在这种情况下,稳定性比速度更重要。

话虽这么说,你可以尝试这个:

LOOP AT lt_my_table TRANSPORTING NO FIELDS WHERE par1 = 'XYZ'.
  ADD 1 TO l_my_counter.
ENDLOOP.

6
投票

如果内表中的条目不相关,你可以这样做。

DELETE lt_table WHERE par1 <> 'XYZ'.

然后您可以使用

lines( lt_table )
DESCRIBE TABLE lt_table LINES l_number_of_lines.

来统计剩余的相关记录

这是一个例子。

TYPES: BEGIN OF tt_test,
  par1 TYPE c LENGTH 3,
  END OF tt_test.

DATA: lt_table TYPE TABLE OF tt_test.
DATA: l_number_of_lines TYPE i.
FIELD-SYMBOLS: <fs_par1> LIKE LINE OF lt_table.

APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>.
<fs_par1>-par1 = 'XYZ'.
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>.
<fs_par1>-par1 = 'ABC'.
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>.
<fs_par1>-par1 = 'XYY'.
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>.
<fs_par1>-par1 = 'XYZ'.
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_par1>.
<fs_par1>-par1 = 'XYZ'.

l_number_of_lines = LINES( lt_table ).
WRITE / l_number_of_lines.
DESCRIBE TABLE lt_table LINES l_number_of_lines.
WRITE / l_number_of_lines.
DELETE lt_table WHERE par1 <> 'XYZ'.
l_number_of_lines = LINES( lt_table ).
WRITE / l_number_of_lines.

2
投票

FOR 的变体也应该可以工作,但是它需要该表的声明表类型:

TYPES: tt_mara TYPE TABLE OF mara WITH EMPTY KEY.
DATA(count) = lines( VALUE tt_mara( FOR line IN lt_mara WHERE ( matnr = 'XXX' ) ( line ) ) ).

0
投票

当我使用此代码行时 数据(计数)=行(VALUE tt_mara(FOR行IN lt_mara WHERE(matnr ='XXX')(行)))。 我收到错误“不存在名为“FOR”的组件。“FOR”。”

© www.soinside.com 2019 - 2024. All rights reserved.