2016-03-07 86 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轉儲與更多的描述性錯誤消息:由

試圖改變,刪除或內部表「[內部表]」添加行。 但是,此表沒有有效的光標。

其實,這是我遇到的這第二次,但它是我不記得解決這樣的混亂的消息。當我發佈這個消息時,我不打算自己回答,但是當我收到垃圾時,我意識到自己的錯誤。我猜主要問題是依賴於語法錯誤告訴我,當我使用不正確的語法:語法檢查顯然不認爲這是一個徹底的錯誤,即使它可能應該。