ATC检查:需要明确的SORT声明

2020-08-14 23:31发布

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

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


嗨,

我注意到,当我们使用FOR ALL ENTRIES在第一个表(例如ITAB1)的基础上从第二个表(例如ITAB2)中选择数据时,没有在第一个表上明确指定SORT语句(例如:通过键字段对SORT itab1进行指定) ,ATC检查会产生错误,即两个表可以联接,而不是单独选择。 如果我在ITAB1上写一个明确的SORT语句,该错误就会消失。

如果我们将ITAB1定义为SORTED TABLE OF或在获取数据时基于主键应用ORDER BY子句,则会发生这种情况。

这是否意味着ATC在寻找明确的SORT语句,并且不认为该表使用其他技术进行了排序?

此致

Manish

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

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


嗨,

我注意到,当我们使用FOR ALL ENTRIES在第一个表(例如ITAB1)的基础上从第二个表(例如ITAB2)中选择数据时,没有在第一个表上明确指定SORT语句(例如:通过键字段对SORT itab1进行指定) ,ATC检查会产生错误,即两个表可以联接,而不是单独选择。 如果我在ITAB1上写一个明确的SORT语句,该错误就会消失。

如果我们将ITAB1定义为SORTED TABLE OF或在获取数据时基于主键应用ORDER BY子句,则会发生这种情况。

这是否意味着ATC在寻找明确的SORT语句,并且不认为该表使用其他技术进行了排序?

此致

Manish

付费偷看设置
发送
4条回答
吹牛啤
1楼-- · 2020-08-15 00:29

桑德拉,你好

以下是各种情况的代码:

1。 任何地方都没有SORT语句:
如果我在lt_A501上不使用SORT语句,则在ATC检查中说我应该将这两个表(A501和KONP)连接起来。 由于A501是缓冲表,因此即使我这样做,我也不会将其与KONP合并,但当前的ATC错误消失了,但是又出现了一个提示" JOIN中的缓冲表"。

SELECT matnr,knumh

来自a501
        其中kappl ='V'
         AND kschl ='ZMGC'
          AND zzbuy ='G0050'
          AND matnr IN @lt_product_range
           AND datab LE @ sy-datum
           AND datbi GE @ sy-datum
         插入表@DATA(lt_a501)。

       如果lt_a501不是初始的。
         "仅获取活动状态记录
         SELECT knumh,kbetr
          来自konp
          对于@ lt_a501中的所有条目
          什么地方knumh = @ lt_a501-knumh
           AND loevm_ko =''
          插入表@DATA(lt_konp)。

2。 添加了显式SORT语句:
如果我在基于KNUMH的lt_A501上添加显式SORT语句,则ATC错误将消失。

 SELECT matnr,knumh
         从a501
        其中kappl ='V'
         AND kschl ='ZMGC'
          AND zzbuy ='G0050'
          AND matnr IN @lt_product_range
           AND datab LE @ sy-datum
           AND datbi GE @ sy-datum
         插入表@DATA(lt_a501)。

       如果lt_a501不是初始的。
         以knumh排序lt_a501。
         "仅获取活动状态记录
         SELECT knumh,kbetr
          来自konp
          对于@ lt_a501中的所有条目
          什么地方knumh = @ lt_a501-knumh
           AND loevm_ko =''
          插入表@DATA(lt_konp)。

3。 使用ORDER BY进行排序:
如果我在第一个查询本身中通过KNUMH指定ORDER,ATC错误就会再次出现

"从条件表中获取政府价格购买grp的数据
       SELECT matnr,knumh
         从a501
        其中kappl ='V'
         AND kschl ='ZMGC'
          AND zzbuy ='G0050'
          AND matnr IN @lt_product_range
           AND datab LE @ sy-datum
           AND datbi GE @ sy-datum
         订单编号
         插入表@DATA(lt_a501)。

       如果lt_a501不是初始的。
         "仅获取活动状态记录
         SELECT knumh,kbetr
          来自konp
          对于@ lt_a501中的所有条目
          什么地方knumh = @ lt_a501-knumh
           AND loevm_ko =''
          INTO TABLE @DATA(lt_konp)。
SKY徐
2楼-- · 2020-08-15 00:08

它是主键上的排序表吗? 您是否将FORDER BY与FOR ALL ENTRIES一起使用? (请参阅SAP注释,直到最近才有很多问题)

这可能与您所说的不完全相同,或者ATC在检查主索引之前优先考虑将两个数据库表连接在一起的建议,或者是

但是没有相关的确切代码,也没有确切的消息,这很难说。

N-Moskvin
3楼-- · 2020-08-15 00:27

Hello Manish,

ATC是静态代码分析工具。 它仅在源代码上起作用,而不在运行时上起作用,并且着重于代码中最常见的弱点。 因此,它扩展代码复杂性的能力有限。 也不会有大量错误的阳性结果。

我认为显式SORT对ATC意味着如下:太复杂的场景,不值得进一步研究,开发人员必须知道她或他在做什么...

4楼-- · 2020-08-15 00:24

(使用"答案"来提出解决方案,并使用注释来添加信息或对提案做出反应)

您是否尝试在"内部联接"中添加BYPASSING BUFFER选项?

一周热门 更多>