5

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

read table i_tab with key v_key = x

但是由于表中有多个匹配 v_key = x 的条目,我如何确保获得最后一个匹配条目的 sy-tabix?不幸的是,我无法用另一个键搜索。

4

5 回答 5

7

READ TABLE用于阅读单行,对于更多行,您必须使用LOOP

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

LOOPsy-tabix 之后将包含最后一行,其中条件为真。

正如它所指出的(见下面的讨论),为了获得最佳性能,该字段必须存在一个NON-UNIQUE SORTED密钥(主要或次要)

于 2019-01-11T10:49:45.110 回答
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(参见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才能找到最后一个匹配结果。

于 2019-01-11T12:51:34.317 回答
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.
于 2019-01-11T12:31:25.953 回答
0

我正在写一个不同的解决方案,这可能对你有帮助。

在表 i_tab 中添加一列 keyno。

当您在表 i_tab 中插入记录时,并且在表 i_tab 中为相同的键附加多条记录时,您可以为同一键有多条记录的每条记录添加 keyno。

例如:

在表 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 按 Keyno 降序排序

   SORT i_tab by key keyno Desc.

现在 Read Table 将从表 i_tab 中找到最后一个匹配项作为键。

   read table i_tab with key = X

问候,

奥马尔·阿卜杜拉

于 2019-01-11T21:10:41.207 回答
-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 .
于 2019-01-11T23:06:54.047 回答