ABAP/AT
LOOP命令の中で使用する、キーブレイク時に動作させる命令。
使いどころを押さえれば便利な命令だが、思わぬ動作をすることもあるビギナーは要注意の命令。
概要 †
用法 †
LOOP ATの最初に一回だけ実行したい、あるいは最後に一回だけ実行したい、あるいはキーがブレイクした場合にのみ実行したいというシーンで利用する。
使いこなすことができればコーディングの幅が広がることは間違いないのだが、いくつかのお作法があり、これを破ると「コンパイルは通るのに、意図した動作にならない」「仕様変更時に思わぬデグレが起きる」といったことを招きやすいのも事実で、さらにAT~ENDATの間では値がアスタリスクになるという現象も起きるので注意。
以下、お作法および制約というか仕様。
- LOOP ATの中で内部テーブルをMODIFY?しない
- LOOP ATの中で内部テーブルをDELETEしない
- WHERE句つきのLOOP ATの中では使わない
- LOOPでINTOした作業領域(構造)の値を変更しない
- AT~ENDATの間で、値がアスタリスクに化ける(AT~ENDATを抜ければ元通りになる)
サンプル †
AT FIRST †
AT FIRST. CLEAR : xxx. ENDAT.
LOOP ATの一発目だけ実行したいときに。
これだけなら、システム変数(SY-LOOPCだっけ?)の判定でよい気がする。
AT NEW †
AT NEW WERKS. WRITE : WA_MARC-MATNR, WA_MARC-WERKS. ENDAT.
キーブレイクしたときに何かしたい場合。
例えば、キーブレイクしたときにだけコードやテキストを書き出す等。
最も利用価値がありながら、油断すると意図しない動きになるので注意すべき命令。
なお、AT NEWを使う際は、指定した項目とそこから左側の項目が判定されるため事前にSORT?する等のケアを忘れずに。
END OF xxx †
AT END OF CHARG. WRITE : 'Total', L_AMOUNT. ENDAT.
連続したキーの終わりにだけ何かしたい場合に使用し、AT NEWと同じくらい利用価値が高い。
メリットや注意点はAT NEWと同じだが、最後に処理するだけあって画面やテーブルなんかに結果を書き出すことが多いため、意図しない結果になっていても気づきやすいことが多い。とはいえ、注意。
AT LAST †
AT LAST. ULINE. ENDAT.
LOOP ATの最後の処理だったらLOOP ATを抜けた直後でもよい気がするが、仕変を入れる際に「ロジックの追加はココより上に入れるんやで」と明示できたりするのがメリットだろうか?あるいはSUMする?
その他 †
同じATでも、AT LINE-SELECTION、AT SELECTION-SCREEN、AT USER-COMMAND、LOOP ATなどについては各ページを参照のこと。
コメントはありません。 Comments/ABAP/AT?