新的READ TABLE语法是否支持二进制搜索?

2020-09-07 23:28发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)新的READ TABLE语法(w...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


新的READ TABLE语法(wa = itab [col1 =…col2 =…])是否支持二进制搜索?

如果否,有什么方法可以实现?

预先感谢

Avishek

4条回答
95年老男孩
2020-09-08 00:13

Hi'

请仔细看一下波纹管文档,它清楚地表明了什么是晦涩的,什么是替代的 。

https://help.sap.com/doc/abapdocu_740_index_htm/7.40/zh-CN/index.htm?url=abentable_exp_itab_line.htm#!ABAP_ALTERNATIVE_2@2@

过时的语法
 读取表itab {{}
                 |  {WITH KEY dobj}
                 |  {WITH KEY = dobj}} [BINARY SEARCH]结果。
 
 选择1
 ... {}


 影响
 如果未明确指定搜索键,则内部表itab必须是带有标题行的标准表。 读取内部表中找到的第一行,其标准键的列中的值与标题行的相应组件中的值相匹配。 标头行中仅包含空白字符的键字段将被视为与所有值匹配。 如果标题行中的所有关键字段仅包含空白字符,则将读取表中的第一项。 内部表的标准键不能包含任何类似字节的组件。
 笔记
 READ TABLE itab ...语句与表头行itab的显式声明不同,后者是READ TABLE itab FROM wa ...语句中的工作区wa。在后者中,表键而不是搜索键 标头字段的""用于搜索。

 可以使用搜索键,而不必考虑其他过时的简短格式(未指定明确的目标区域)。

 在过时的非Unicode程序中,标准密钥也可以包含类似字节的组件。
 例
 在下面的READ语句中(与READ TABLE的示例-table_key相反),通常不会找到任何条目,因为会比较整个标准键。 特别是,属于内部表的标准键的组件deptime和arrtime的类型为t,并且在标题行中包含值" 000000"而不是空白字符作为初始值。 仅读取完全包含这些值的表条目。
 数据:spfli的spfli_tab类型标准表
                 与非唯一键carrid connid
                 带标题行。

 FIELD-SYMBOLS  TYPE spfli。

 选择 *
        来自spfli
        哪里carrid ='LH'
        插入表@spfli_tab。

 spfli_tab-carrid ='LH'。
 spfli_tab-connid ='0400'。
 读取表spfli_tab ASSIGNING 。


 选择2
 ...使用KEY dobj


 影响
 如果在添加WITH KEY之后直接指定了单个数据对象,则内部表itab必须是标准表。 读取内部表中找到的第一行,该行的左对齐内容与数据对象dobj的内容匹配。 数据对象dobj只需要平面数据类型。 在搜索中,处理比数据对象dobj长的表行的开始,就好像它们具有相同的数据类型dobj(广播)一样。
 例
 要使用附加的WITH KEY dobj评估特定的键字段,必须创建与行类型的相关起始部分相对应的结构。 与READ TABLE-table_key的示例相反,在下面的程序部分中,表spfli_tab的客户端列mandt必须受搜索键的尊重。
 数据:spfli的spfli_tab类型标准表
                 与非唯一密钥carrid connid。

 数据:从key_struc开始,
         mandt TYPE spfli-mandt VALUE'000',
         香型TYPE spfli-香型VALUE'LH',
         connid TYPE spfli-connid VALUE'0400',
       key_struc的结尾。

 FIELD-SYMBOLS  TYPE spfli。

 选择 *
        来自spfli
        哪里carrid ='LH'
        插入表@spfli_tab。
 使用键key_struc ASSIGNING 读取表spfli_tab。


 选择3
 ... WITH KEY = dobj


 影响
 如果加号WITH KEY后跟"等号"之后的单个数据对象,则读取内部表itab中找到的第一行,该行的整个内容与数据对象dobj的内容相对应。 必须有可能将数据对象dobj转换为内部表的行类型。 如果dobj的数据类型与内部表的行类型不匹配,则根据转换规则执行转换以进行比较。
 注意
 该语句具有与将伪组件table_line指定为自由键相同的功能,并由该组件代替。
 使用键读取表itab table_line = dobj ...
 例
 确定(过时)内部表中是否存在具有基本行类型的行。 注释行显示了带有伪组件table_line的通常有效的语法。
 带空密钥的i的数据itab类型表。

 itab = VALUE#(FOR j = 1直到j> 10(j))。

 读表itab WITH KEY = 4
            无领域运输。
 * READ ITAB WITH KEY table_line = 4
 *运输没有领域。

 如果sy-subrc = 0。
   ...
 万一。


 加成
 ...二进制搜索

 影响
 加法BINARY SEARCH生成表的二进制搜索,不是线性的。 前提条件和限制与使用带有免费搜索键的添加项时相同。 在找到正确的行之前,必须按如下升序对内部表进行排序:
 如果未明确指定搜索键,则由标准键的组件指定。

 如果使用WITH KEY dobj指定了搜索键,则按其在数据对象长度中的左对齐内容进行指定。

 如果使用WITH dobj指定了搜索键,则由整个表行指定。
 注意
 在每个过时的变体中加法BINARY SEARCH都需要不同的排序这一事实可能会造成混淆,并产生意外的行为。 因此,在过时的变体和改用READ TABLE的非过时的变体中,不应使用添加。

 

此致

纳瓦

一周热门 更多>