我从一个返回约 100 行的函数模块调用中得到一个内部表。大约 40% 的行与我无关,因为我只需要带有PAR1 = "XYZ"
. 在 SQL 表(透明表)上,我可以使用
select count(*) from tab where PAR1 = "XYZ"
获取有效条目的数量。
查看文档,我只能找到 READ Table 语法来遍历表。我目前的方法是基本上有一个循环并增加如果该行包含我想要的值。但这似乎非常低效。
有没有更好的方法来满足我的要求?
我从一个返回约 100 行的函数模块调用中得到一个内部表。大约 40% 的行与我无关,因为我只需要带有PAR1 = "XYZ"
. 在 SQL 表(透明表)上,我可以使用
select count(*) from tab where PAR1 = "XYZ"
获取有效条目的数量。
查看文档,我只能找到 READ Table 语法来遍历表。我目前的方法是基本上有一个循环并增加如果该行包含我想要的值。但这似乎非常低效。
有没有更好的方法来满足我的要求?
从 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' 中的行数。
做任何你觉得对的事。大约 100 行,几乎没有什么会在运行时产生巨大的差异。对我来说,在这种情况下,稳定性比速度更重要。
话虽这么说,你可以试试这个:
LOOP AT lt_my_table TRANSPORTING NO FIELDS WHERE par1 = 'XYZ'.
ADD 1 TO l_my_counter.
ENDLOOP.
如果内部表中的条目无关紧要,您可以这样做。
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.
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 ) ) ).