使用 "read table with key" 查找最后一个匹配结果
Find last matching result using "read table with key"
我需要在内部 table 中找到匹配 v_key = x 的最后一个条目的 sy-tabix。我正在尝试这样做:
read table i_tab with key v_key = x
但是由于 table 中有多个匹配 v_key = x 的条目,我怎样才能确保获得最后一个匹配条目的 sy-tabix?不幸的是,我无法通过其他键进行搜索。
READ TABLE
用于读取单行,对于更多行,您必须使用 LOOP
:
LOOP AT itab
ASSIGNING ...
WHERE vkey EQ x.
ENDLOOP.
在 LOOP
之后,sy-tabix 将包含最后一行,其中条件为真。
正如所指出的(见下面的讨论),为了获得最佳性能,必须为该字段存在一个 NON-UNIQUE SORTED
键(主要或次要)
我认为最快的方法是
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.
另一种可能性,如果您有许多行具有相同的 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 的逻辑相同。
确保您的 table 已排序(优先于 table 声明的 sorted table of ... with non-unique key v_key
)
然后READ TABLE itab WITH KEY v_key = x_next_value
.
重要:即使没有找到任何行,SY-TABIX 也会被设置为所有具有 v_key = x
的行之后的下一行的编号(cf ABAP documentation of READ TABLE - Possible values for SY-SUBRC and 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
才能找到最后的匹配结果。
我正在编写一个不同的解决方案,可能对您有所帮助。
在tablei_tab中添加一列keyno。
当你在tablei_tab中插入记录时,tablei_tab中有多个记录要追加相同的key,你可以为每个添加keyno同一个键有多个记录的记录。
例如:
在 Table 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.
Table i_tab 按键降序排列.
SORT i_tab by key keyno Desc.
现在阅读 Table 将从 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 .
我需要在内部 table 中找到匹配 v_key = x 的最后一个条目的 sy-tabix。我正在尝试这样做:
read table i_tab with key v_key = x
但是由于 table 中有多个匹配 v_key = x 的条目,我怎样才能确保获得最后一个匹配条目的 sy-tabix?不幸的是,我无法通过其他键进行搜索。
READ TABLE
用于读取单行,对于更多行,您必须使用 LOOP
:
LOOP AT itab
ASSIGNING ...
WHERE vkey EQ x.
ENDLOOP.
在 LOOP
之后,sy-tabix 将包含最后一行,其中条件为真。
正如所指出的(见下面的讨论),为了获得最佳性能,必须为该字段存在一个 NON-UNIQUE SORTED
键(主要或次要)
我认为最快的方法是
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.
另一种可能性,如果您有许多行具有相同的 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 的逻辑相同。
确保您的 table 已排序(优先于 table 声明的 sorted table of ... with non-unique key v_key
)
然后READ TABLE itab WITH KEY v_key = x_next_value
.
重要:即使没有找到任何行,SY-TABIX 也会被设置为所有具有 v_key = x
的行之后的下一行的编号(cf ABAP documentation of READ TABLE - Possible values for SY-SUBRC and 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
才能找到最后的匹配结果。
我正在编写一个不同的解决方案,可能对您有所帮助。
在tablei_tab中添加一列keyno。
当你在tablei_tab中插入记录时,tablei_tab中有多个记录要追加相同的key,你可以为每个添加keyno同一个键有多个记录的记录。
例如:
在 Table 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.
Table i_tab 按键降序排列.
SORT i_tab by key keyno Desc.
现在阅读 Table 将从 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 .