根据查询计算abap内部表中的条目

Jas*_*per 4 sap abap

我从一个有100行的FUBA调用中得到一个内部表.大约40%的行与我无关,因为我只需要PAR1"XYZ"的条目.在SQL表(透明表)上,我可以使用

select count(*) from tab where PAR1 = "XYZ" 
Run Code Online (Sandbox Code Playgroud)

获取有效条目的数量.

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

对我的要求有更好的方法吗?

小智 8

从740开始,您可以使用:

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

用于计算gt_itab会议编号f1 ='xyz'中的行数。


Jag*_*ger 6

如果内部表中的条目无关紧要,您可以执行类似的操作.

DELETE lt_table WHERE par1 <> 'XYZ'.
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用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.
Run Code Online (Sandbox Code Playgroud)


vwe*_*ert 5

做任何对你感觉合适的事.大约100行,几乎没有什么能在运行时产生巨大的差异.对我来说,在这种情况下,稳定性比速度更重要.

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

LOOP AT lt_my_table TRANSPORTING NO FIELDS WHERE par1 = 'XYZ'.
  ADD 1 TO l_my_counter.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)