使用“用键读取表”查找最后一个匹配结果

时间:2019-01-11 10:34:31

标签: sap abap

我需要在与v_key = x匹配的内部表中找到最后一个条目的sy-tabix。我正在尝试这样做:

read table i_tab with key v_key = x

但是,由于表中有多个与v_key = x匹配的条目,如何确保我得到了最后一个匹配条目的sy-tabix?很遗憾,我无法通过其他键进行搜索。

5 个答案:

答案 0 :(得分:6)

READ TABLE用于读取单行,更多行则必须使用LOOP

LOOP AT itab
     ASSIGNING ...
     WHERE vkey EQ x.
ENDLOOP.

LOOP sy-tabix之后,将包含条件为true的最后一行。

正如所指出的(请参见下面的讨论),为了获得最佳性能,必须为此字段存在一个NON-UNIQUE SORTED键(主键或辅助键)

答案 1 :(得分:2)

另一种可能性,如果您有许多行具有相同的v_key值,则很有用。

首先,确保X存在一行。如果找不到,则无需继续。

计算搜索值(变量X)的下一个可能值(变量x_next_value)。例子:

  • 如果X是整数,只需搜索X +1。例如:对于值5,x_next_value将为6。
  • 如果X是字符(C或字符串),则获取最后一个字符(cl_abap_conv_**out**_ce=>uccpi)的编号,加1,然后更新最后一个字符(cl_abap_conv_**in**_ce=>uccpi)。
  • 其他类型的X具有相同的逻辑。

确保您的表已排序(优先于声明为sorted table of ... with non-unique key v_key的表)

然后READ TABLE itab WITH KEY v_key = x_next_value

重要:即使未找到任何行,也将SY-TABIX设置为所有具有v_key = x(参见ABAP documentation of READ TABLE - Possible values for SY-SUBRC and SY-TABIX)的行之后的下一行的号码/ p>

伪代码:

READ TABLE ... WITH KEY v_key = x_next_value.
" eventually BINARY SEARCH if itab is STANDARD instead of SORTED

CASE sy-subrc.
  WHEN 0.
    last_tabix_of_x = sy-tabix.
  WHEN 4.
    last_tabix_of_x = sy-tabix - 1.
  WHEN 8.
    last_tabix_of_x = lines( itab ).
ENDCASE.

注意:只需要两个READ TABLE 即可找到最后一个匹配结果。

答案 2 :(得分:1)

我认为最快的方法是

Sort itab by key.
read table itab with key key = v_key
                binary search.
loop at itab assign <fs> from sy-tabix.
   if <fs>-key ne v_key.
      exit.
   endif.
endloop.

答案 3 :(得分:0)

我正在写另一种可能对您有帮助的解决方案。

在表i_tab中添加一列keyno。

当您在表i_tab中插入记录,并且在表i_tab中有多个记录要添加到同一键时,您可以为同一键具有多个记录的每个记录添加键号。

例如:

插入表i_tab中的记录

i_tab_line-key = 'X'.
i_tab_line-keyno = 1.
APPEND i_tab_line to i_tab.
i_tab_line-key = 'X'.
i_tab_line-keyno = 2.
APPEND i_tab_line to i_tab.
i_tab_line-key = 'X'.
i_tab_line-keyno = 3.
APPEND i_tab_line to i_tab.

表i_tab按键编号降序排列

   SORT i_tab by key keyno Desc.

现在,“读取表”将从表i_tab中找到密钥的最后一个匹配条目。

   read table i_tab with key = X

致谢

乌马尔·阿卜杜拉

答案 4 :(得分:-1)

sort i_tab by v_key .
read table i_tab with key v_key = x binary search.

while i_tab-key = x
  lv_tabix = sy-tabix + 1 .
  read table i_tab index = lv_tabix .
endwhile.

result = lv_tabix -1 .