一个敌人在我的常识星球里发问:
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 之后,必须保障整张表依然有序。