2

ループ内のソートされた内部テーブルに新しいエントリを追加しています。私がいるループには、ソートされたテーブルのソート順とは異なるソート順があるため、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% 確実に知っています。それでも、この警告を隠すことはできません。開発中に役に立たない警告が表示されることは別として、一部の環境では、構文チェックの警告が含まれるコードを転送することができません。

この抑制できない警告を抑制する方法はありますか?

それができない場合、それを回避する方法はありますか?おそらく、ソートされていない一時テーブルを中間テーブルとして使用し、ソートされたテーブルに行を追加することでこれを行うことができますが、明らかな見落としと思われるものを回避するためだけに、役に立たない (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_CALLメッセージ コードTRMSG_MESSAGE_GJKを渡す FM を使用して取得できます。すべてのメッセージ コードはDOKILテーブルに格納されます。

于 2016-04-04T13:23:57.833 に答える