关于 ABAP 的运行时错误 ITAB_ILLEGAL_ORDER

举报
汪子熙 发表于 2023/02/06 09:22:08 2023/02/06
【摘要】 一个朋友在我的知识星球里提问:Jerry 您好!请教一个问题,在生成物料凭证的时候,有个比较奇怪的问题,在函数MARD_MD_ARRAY_READ,第154行的时候会提示运行时错误:ITAB_ILLEGAL_ORDER,内表中的排序不正确;跟着查看是在132行的时候读取v_mard_md的数据未排序,然后后面按照取出来的数据插入到内表MARD_TAB_MD之后,也是未排序的,然后在154行的...

一个朋友在我的知识星球里提问:

Jerry 您好!请教一个问题,在生成物料凭证的时候,有个比较奇怪的问题,在函数MARD_MD_ARRAY_READ,第154行的时候会提示运行时错误:ITAB_ILLEGAL_ORDER,内表中的排序不正确;
跟着查看是在132行的时候读取v_mard_md的数据未排序,然后后面按照取出来的数据插入到内表MARD_TAB_MD之后,也是未排序的,然后在154行的时候就提示报错了。但是同样的数据有时候就能过,请问一下这种问题我应该怎么去入手进行解决.

以下是ST22的部分内容:

短文本

Incorrect sorting of the rows in an internal table.

发生了什么?

Error in the ABAP application program.

The current ABAP program "SAPLMG26" had to be terminated because it found a
statement that could not be executed.

错误分析

In the ABAP Debugger, the switch for monitoring the sorting of internal
tables before statements with the form "READ ... BINARY SEARCH" was
activated.

In this case, rows 5 and 6 in table "\FUNCTION=MARD_MD_ARRAY_READ\DATA=???"
 are not sorted
according to the key specified for the READ statement.

The "READ ... BINARY SEARCH" statement works on the assumption that the
table is correctly sorted. An incorrect entry will normally be
localized.

我们逐一分析。

In the ABAP Debugger, the switch for monitoring the sorting of internal
tables before statements with the form “READ … BINARY SEARCH” was
activated.

在 ABAP 调试器里,有个菜单 Change Debugger Profile/ Settings:

在 Specific Settings 选项区域,有个 Check Sorting Before BINARY SEARCH:

如果勾上这个选项,在 ABAP 调试器里单步调试到 READ TABLE BINARY SEARCH 关键字时,如果 READ TABLE 操作的 内表,没有提前进行排序,比如不是一个 sorted table,就会出现运行时异常 ITAB_ILLEGAL_ORDER.

但是同样的数据有时候就能过,请问一下这种问题我应该怎么去入手进行解决.

代码第 154 行的语义是:从有序表 MARD_TAB_MD 里采用二分查找的方式,检查 TMARD 指定的 key 对应的数据是否存在。如果不存在,将这个 key 对应的记录,通过 APPEND,添加到 MARD_TAB_MD 的尾部。注意第 154 行是在 DO 循环里执行的。如果当前 APPEND 操作执行后,破坏了 MARD_TAB_MD 里的有序状态,则 DO 下一次循环时,READ TABLE BINARY SEARCH 就会出错。

SAP ABAP 帮助文档里,对于使用 APPEND 添加记录到 sorted table 里的行为是这样描述的:

Lines are appended to sorted tables only if they match the sort order and do not create duplicate entries if the primary table key is unique.

仅当行与排序顺序匹配时,它们才会附加到已排序的表中,并且如果表的主键是唯一的话,则不会创建重复的条目。

也就是说,APPEND 后面指定的待插入的 TMARD 内容,插入到 MARD_TAB_MD 之后,必须保证整张表仍然有序。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。