头图

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

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 之后,必须保证整张表仍然有序。


注销
1k 声望1.6k 粉丝

invalid