读表与键,小学或中学?

2020-08-19 19:28发布

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

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


大家好,

我一直在阅读ABAP 740读取表语句。

问题:

我有一个zfield,其中field1到field10仅以field1作为主键。

1)我正在通过程序中的一个itab读取"带有键field2 =变量(从wa循环)将表读入wa"

此field2未指定为key,所以我将获得第一个找到的行,对吧? 如果是,我的推导结果可能正确或错误。

2)还是应该将其声明为"具有非唯一排序键field2_field3 COMPONENTS field2 field3。

3)因为我将不得不在代码中多次读取具有field2或field3的itab。

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

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


大家好,

我一直在阅读ABAP 740读取表语句。

问题:

我有一个zfield,其中field1到field10仅以field1作为主键。

1)我正在通过程序中的一个itab读取"带有键field2 =变量(从wa循环)将表读入wa"

此field2未指定为key,所以我将获得第一个找到的行,对吧? 如果是,我的推导结果可能正确或错误。

2)还是应该将其声明为"具有非唯一排序键field2_field3 COMPONENTS field2 field3。

3)因为我将不得不在代码中多次读取具有field2或field3的itab。

付费偷看设置
发送
4条回答
浮生未央
1楼 · 2020-08-19 20:11.采纳回答
"" 1)我正在通过程序中的Itab进行读取,其中"使用键field2 =变量(从循环wa)将表读入wa"
 "此field2未指定为key,所以我将获得找到的第一行,对吗?如果是,我的派生结果可能正确也可能不正确。

 " READ语句仅基于基于非显式密钥的记录进行匹配
 READ TABLE表INTO WA WITH KEY field2 =变量。
 如果sy-subrc = 0。
   " ...
 ENDIF。

由于field2不是主键的一部分,并且不存在辅助键,因此您当前唯一的选择是使用" WITH KEY field2",这将导致顺序搜索循环遍历该记录的所有记录。 直到找到第一个匹配记录为止。 因此,如果没有匹配项或完全匹配项,则您的结果将绝对正确。 如果有多个匹配项,则取决于您的要求是一个匹配项是正确的匹配项,还是是否需要对另一个匹配项都进行评估。 在最坏的情况下,如果没有匹配项,则必须对表中的所有记录执行搜索,导致最坏情况下的性能为O(n),而n是记录数。

< pre>" 2)还是我应该声明为"使用非唯一已排序的密钥field2_field3组件field2 field3。 "如何使用主键和辅助键定义两个字段的表类型的示例 带有唯一键字段的表类型的数据表类型排序表 使用非唯一的已排序键field2_field3组件field2 field3。 " READ语句仅基于部分辅助键匹配记录 使用键将表读入表field2_field3 COMPONENTS field2 =变量。 如果sy-subrc = 0。 " ... ENDIF。

它的结果几乎与上面的READ语句具有"相同"的结果,但没有辅助键,但是在有大量记录的情况下,性能会更好(与之相关的数千条记录甚至更多) 用于计算的"等待时间",并且在找到第一个匹配记录时也将停止搜索,但是如果存在多个匹配项,则可能与上述语句找到的记录不同,因为该搜索 逻辑。

区别在于,在这种情况下,对表记录执行二进制搜索,始终将搜索分为两等份,从中间开始,具体取决于当前记录字段 小于或大于搜索词,它将在上部或下部继续搜索。因此,在这种情况下,最差情况的性能仅是O(log n)的对数。

(请注意, 在这种情况下,即使仅使用部分键,也可以访问READ语句中的键组件

" 3)因为我将不得不多次读取其具有field2或field3的itab,因此必须按照从所有组件的第一到最后或部分组件的从头到尾的顺序分配它们。 码。

 "如何使用主键和辅助键定义两个字段的表类型的示例
 带有唯一键字段的表类型的数据表类型排序表
            使用非唯一的已排序键field2_field3组件field2 field3。

 " LOOP语句以基于辅助键匹配多个记录
 在表中使用键LOOP AT INTO wa field2_field3 WHERE field2 =变量。
   " ...
 ENDLOOP。

您还没有完整地描述您的需求,但是从我得到的结果来看,为了根据变量评估field2的所有可能匹配,通过记录的LOOP可能会更好。

(请注意,在这种情况下,即使仅使用部分键,LOOP语句中的键组件也将按从所有组件的第一到最后或部分的第一到最后的分配顺序进行访问

并且如果您必须分别基于field2或field3进行阅读,并且想要使用辅助键,则必须创建用于分隔field2和field3的键,以便可以访问它们

"也是如此:如何使用主键和两个辅助键定义表类型的示例
 数据:具有唯一键的表类型的表类型排序表
             带非唯一的已排序键field2 COMPONENTS field2
             使用非唯一的已排序键field3 COMPONENTS field3。

 " READ语句仅基于基于辅助的记录进行匹配

 READ TABLE表读入到带有键的field2组件field2 =变量1。
 如果sy-subrc = 0。
   " ...
 万一。

 READ TABLE表和KEY一起读入field3 COMPONENTS field3 = variable2。
 如果sy-subrc = 0。
   " ...
 万一。

 " LOOP语句以基于辅助键匹配多个记录

 使用键field2将LOOP AT表插入其中WHERE field2 = variable1。
   " ...
 结局。

 使用键field3将LOOP AT表插入其中,其中field3 = variable2。
   " ...
 结局。
 
Climb_Ma
2楼-- · 2020-08-19 20:30

Sandra Rossi 我肯定会,谢谢。。

Michael Piesche :感谢您的解释,我现在完全明白了。

骆驼绵羊
3楼-- · 2020-08-19 20:15

另一个问题。

我尝试了下面的新表表达式(用引号引起来)而不是读取。 我想念什么吗?

将itab循环到wa。
将表itab2读入wa2,键为knuma = wa-knuma。
如果sy-subrc eq 0
tab1-ZZPRDGRP = wa2-ZZPRDGRP。
" tab1 -ZZPRDGRP = itab2 [knuma = wa-knuma] -zzprdgrp。" 表exp
endif。
endloop。
空代码
4楼-- · 2020-08-19 20:18

如果tab1不仅是表,而且标题行为" WITH HEADER",则只能设置tab1-zzprdgrp 声明时为" LINE"。 但是该概念不再使用,因为您仍然必须从标题行结构更新到您所引用表中的实际记录。

相反,字段符号要好得多, 因为在这种情况下,对表的实际记录的"引用"以及对字段符号的任何更改也对表的记录进行了更改。

因此,我选择写 您的代码是这样的:

",它使用Field-Symbols作为记录,而不是复制到其中的新DATA变量
 循环到itab分配。

   "旧的READ TABLE语句
   使用键knuma =  -knuma读取表itab2分配。
   如果sy-subrc EQ 0。
      -ZZPRDGRP =  -ZZPRDGRP。
   万一。

    "新的读取表表达式,可能的错误需要被捕获
    尝试。
         -ZZPRDGRP = itab2 [knuma =  -knuma] -ZZPRDGRP。
      捕获cx_sy_itab_line_not_found。
    ENDTRY。
 结局。
 

一周热门 更多>