在标准内部表上没有"BY"的SORT语句的行为是什么?安全吗?

Lil*_*hal 3 sap abap

SORT在标准内部表上运行时,没有键规范的语句到底有什么作用?根据文件:

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

主表键定义为:

每个内部表都有一个主表键,它是自定义键或标准键.对于散列表,主键是散列键,对于排序表,主键是排序键.这两种表类型都是关键表,对其密钥访问进行了优化,因此主键具有自己的管理.访问各行时,这些表的关键字段将被写保护.标准表也有一个主键,但没有优化相应的访问权限,没有单独的密钥管理,并且密钥字段没有写保护.

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

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

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

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

San*_*ssi 6

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

10小时后的附录:不是您的问题,但您也可以使用主键和辅助键定义内部表,这样您就不需要显式排序 - DELETE ADJACENT DUPLICATES可以与任何这些键一起使用.

  • 另一个想法是:只包含一列的表可以安全地忽略BY子句.在这种情况下,没有解释的空间.像这样的表经常出现在BOPF中,您经常使用GUID的"列表"来标识业务对象中的节点. (2认同)