使用 "read table with key" 查找上次匹配的结果



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

read table i_tab with key v_key = x

但是,由于表中有多个条目与v_key=x匹配,我如何确保获得最后一个匹配条目的sy tabix?不幸的是,我无法通过其他关键字进行搜索。

READ TABLE用于读取单行,对于更多的行,必须使用LOOP:

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

紧接在LOOPsy tabix之后,将包含条件为true的最后一行。

如前所述(见下文讨论),为了获得最佳性能,必须为该字段提供NON-UNIQUE SORTED密钥(主要或次要)

另一种可能性,如果有多行具有相同的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的行之后的下一行的编号(参见READ TABLE的ABAP文档-SY-SUBRC和SY-TABIX的可能值)

伪代码:

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就可以找到最后的匹配结果。

我认为最快的方法是

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.

我正在编写一个可能对您有所帮助的不同解决方案。

在表i_tab中添加一列注释记号。

当在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.

现在,Read Table将从表i_tab中找到该键的最后一个匹配条目。

read table i_tab with key = X

问候,

奥马尔·阿卜杜拉

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 .

相关内容

  • 没有找到相关文章

最新更新