2

我正在向循环内的排序内部表添加一个新条目。由于我所在的循环的排序顺序与已排序表的排序顺序不同,因此我必须使用INSERT INTO语句而不是 an APPEND TO,因为后者有违反排序顺序导致转储的风险。

但是,当我添加该代码时,我收到带有内部消息代码“ MESSAGE GJK”的语法检查警告,在 EPC 中它说:

Program: ZCL_CLASS Method METHOD_NAME Row: 301
Syntax check warning.

In the table "LT_TABLE_NAME" a row was to be changed, 
deleted or inserted. It is not possible
to determine statically if a LOOP is active over "LT_TABLE_NAME"

Internal message code: MESSAGE GJK
Cannot be hidden using a pragma.

但是“不能使用编译指示隐藏”对我不起作用。我理解警告的原因,但我知道在构建时 100% 确定在我插入新记录的内部表上没有循环将处于活动状态。然而我无法隐藏这个警告。除了在开发时引起无用的警告外,在某些环境中,我无法传输带有语法检查警告的代码!

有什么办法可以抑制这种不可抑制的警告吗?

如果做不到,有什么办法可以避免吗?我可能可以通过使用临时未排序表作为中间表然后将行追加到已排序表中来做到这一点,但我不愿意创建一个无用的(百万行)内部表只是为了绕过似乎是一个明显的疏忽。

4

2 回答 2

2

该消息不能被抑制,因为它已经在您之前的问题中说明过。但是,我们可以摆脱问题的最初原因,这是唯一正确的做法。此错误报告对内部表的某些操作是使用隐式索引规范执行的,如详细消息中所述:

在程序流程中,使用当前的 LOOP 行,这意味着使用 INDEX sy-tabix。如果此时表上没有活动的 LOOP,则会发生运行时错误 TABLE_ILLEGAL_STATEMENT。

对于这种隐式操作的当前情况,不能静态找到表的包含 LOOP 语句(使用语法检查)。

由于某种原因,编译器看不到您的循环,因此找不到循环索引。在这种情况下可以做什么:

  1. 使用INSERT wa INTO TABLE而不是INSERT.

  2. INSERT为您声明使用显式索引

    INSERT wa INTO itab INDEX loopIdx.
    

语法变体的ABAP 文档INSERT wa INTO itab确认此语法需要 LOOP:

此变体仅在跨同一个表的 LOOP 内是可能的,并且如果在 LOOP 中未指定附加的 USING KEY。要插入的每一行都可以插入到 LOOP 中的当前行之前。

PS 可以使用DOCU_CALLFM 传递消息代码TRMSG_MESSAGE_GJK获取此消息的全文。所有消息代码都存储在DOKIL表中。

于 2016-04-04T13:23:57.833 回答
2

收到此警告的最可能原因实际上是语法错误!只要您有如下声明,就会发生这种情况:

INSERT [work area] INTO [internal table].

插入到 itab 的实际语法需要INTO TABLE

INSERT [work area] INTO TABLE [internal table].

警告的描述似乎与此处实际发生的情况不符。大概是考虑到表格可能有一个标题区域(事实并非如此)。如果你运行这段代码,你会得到一个TABLE_ILLEGAL_STATEMENT带有更具描述性的错误消息的转储:

试图更改、删除或添加内部表“[内部表]”中的行。但是,该表没有有效的游标。

这实际上是我第二次遇到这个问题,但这是一个令人困惑的消息,我不记得解决方案了。当我发布这个时,我不打算自我回答,但是当我得到转储时我意识到我的错误。我猜主要问题是依靠语法错误来告诉我何时使用不正确的语法:语法检查显然不认为这是一个彻底的错误,即使它可能应该。

于 2016-03-07T09:13:36.850 回答