3

制御レベル処理のAT FIRSTステートメントは、実行する必要があるコマンドや、ループ自体の実行を開始する前に初期化する必要がある変数に最適のようです。コマンドが作業領域の列をクリアする方法を考えるとAT、これは私がまだ見ている数少ない用途の 1 つです。

これを行うのではなく、説明するために:

CLEAR lv_loopcounter.
LOOP AT lt_itab INTO ls_wa.
    ADD 1 TO lv_loopcounter.
    ...
ENDLOOP.

これを行うことができます:

LOOP AT lt_itab INTO ls_wa.
    AT FIRST.
        CLEAR lv_loopcounter.
    ENDAT.
    ADD 1 TO lv_loopcounter.
    ...
ENDLOOP.

ここで、ループが意図したとおりに機能するには、変数を初期化する必要があることがすぐにわかります。また、ループの前に実行する必要があるステートメントが多数ある場合に、コードの見栄えがよくなります。私が見る唯一の欠点は、LOOP論理的にそうすべきではないときに、ステートメント内でコードを移動することです。

ここにベストプラクティスはありますか? 注意すべき隠れた警告はありますか?

4

2 に答える 2

5

どちらのバリアントも可能ですが、意味的には異なります。最初のバージョンでは、コマンドは無条件で実行され、最初のバージョンでは、少なくとも 1 行が含まれているCLEAR場合にのみ実行されます。lt_itab実際のループの実装では違いは関係ありませんが、空のテーブルの場合、問題の変数の値はENDLOOPステートメントに到達した後に異なります。空のテーブルを賢明に処理する限り、これは問題ではありません... :-)

2 番目のバージョンの他の唯一の注意点は、AT FIRSTすべての非文字フィールドをクリアし、ls_waすべての文字フィールドls_waを '*' に設定することです。

于 2014-05-09T12:01:39.910 に答える