我需要找到内部表中匹配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.
紧接在LOOP
sy 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 .