首页 > 解决方案 > 标准内部表上没有 BY 的 SORT 行为?安全吗?

问题描述

SORT在标准内部表上运行时,没有密钥规范的语句究竟做了什么?根据文档

如果没有使用加法 BY 输入显式排序键,则内部表 itab 按主表键排序。排序的优先级基于在表定义中指定关键字段的顺序。在标准键中,按照表的行类型中键字段的顺序进行排序。如果标准表的主表键为空,则不进行排序。如果这是静态已知的,则语法检查会产生警告。

主表键定义为:

每个内部表都有一个主表键,它可以是自定义键或标准键。对于散列表,主键是散列键,对于排序表,主键是排序键。这两种表类型都是优化了键访问的键表,因此主键有自己的管理。当您访问单个行时,这些表的键字段受到写保护。标准表也有一个主键,但相应的访问没有优化,没有单独的键管理,键字段没有写保护。

为了更好地衡量,标准密钥定义为:

内部表的主表键,其在结构化行类型中的键字段均为类字符数据类型和类字节数据类型的表字段。如果行类型包含子结构,则将这些子结构分解为基本组件。如果行类型本身不是表类型,则非结构化行类型的标准键是整个表行。如果没有对应的表字段,或者行类型本身是表类型,则标准表的标准键为空或不包含键字段。

所有这些主要只是让我感到困惑,因为我不确定我是否真的可以依靠基本SORT陈述来提供可靠或安全的结果。我真的应该在所有情况下都避免它,还是如果使用得当,它是否有目的

通过扩展,如果我想运行 a DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS,在简单之后什么时候这样做是安全的SORT itab.?仅当我在所有字段上都添加了一个键?只有当我有一个带有clikexsequence列的内部表时才没有显式键?如果我想执行那个 DELETE 语句,在内部表上运行的最佳 SORT 语句是什么?

标签: abapinternal-tables

解决方案


在所有情况下都应避免使用不带 BY 的 SORT,因为它“使程序难以理解并且可能无法预测”(dixit ABAP 文档)。我认为,如果您不提及BY,代码检查器中的静态检查会发出警告。您应该使用SORT itab BY table_linewhere table_line 是一个特殊名称(“伪组件”),意思是“行的所有字段”。

不是您的问题,但您也可以使用主键和辅助键定义内部表,这样您就不需要显式排序 - DELETE ADJACENT DUPLICATES可以与这些键中的任何一个一起使用。


推荐阅读