2016-03-07 90 views
1

我正在向循环内的有序内部表添加新条目。由于我所在的循环的排序顺序与有序表格不同,因此我必须使用INSERT INTO而不是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%的确定性,我将插入新记录的内部表格上不会激活任何循环。然而我不能隐藏这个警告。除了在开发过程中导致无用的警告,在某些环境中,我将无法使用语法检查警告来传输代码!

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

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

回答

2

该消息不能被抑制,因为它已经被声明为in your previous question。 但是,我们可以摆脱问题的最初原因,这是在这里做的唯一正确的方法。 该错误报告,在内部表中的一些操作进行了使用隐式索引规范的,因为它在详细信息描述:

在程序流,电流回路行被使用,这意味着INDEX SY-TABIX是用过的。如果此时没有LOOP在表上处于活动状态,则会发生运行时错误TABLE_ILLEGAL_STATEMENT。

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

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

  1. 使用INSERT wa INTO TABLE代替INSERT缩写形式。
  2. 使用明确的指标,你INSERT声明

    INSERT wa INTO itab INDEX loopIdx. 
    

ABAP documentationINSERT wa INTO itab语法变异证实了这个语法要求LOOP:

这种变异是唯一可能在同样的循环中表,并且如果在LOOP中未指定添加USING KEY。每个要插入的行都可以插入到LOOP中的当前行之前。

P.S.可以使用DOCU_CALL FM传递消息代码TRMSG_MESSAGE_GJK获取此消息的全文。所有消息代码都存储在DOKIL表中。

2

获取此警告的最可能原因实际上是语法错误!它会发生,只要您有一个像声明如下:

INSERT [work area] INTO [internal table]. 

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

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

警告的描述似乎并不匹配这里实际发生了什么。据推测,这是考虑表格可能有一个标题区域(情况并非如此)。如果你运行这段代码,你会得到一个TABLE_ILLEGAL_STATEMENT转储与更多的描述性错误消息:由

试图改变,删除或内部表“[内部表]”添加行。 但是,此表没有有效的光标。

其实,这是我遇到的这第二次,但它是我不记得解决这样的混乱的消息。当我发布这个消息时,我不打算自己回答,但是当我收到垃圾时,我意识到自己的错误。我猜主要问题是依赖于语法错误告诉我,当我使用不正确的语法:语法检查显然不认为这是一个彻底的错误,即使它可能应该。