この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
広告
posted by fanblog
2020年02月10日
【ABAP】LOOP—ループ処理のツボ
本ページでは、内部テーブルに対する処理の中で最も使用頻度が高いループ処理について解説します。
一口に「ループ処理」といっても、ABAPには4種類(LOOP〜ENDLOOP・SELECT〜ENDSELECT・DO〜ENDDO・WHILE〜ENDWHILE)存在するのですが、実際にABAPerが口にする「ループ処理」はタイトルにある「LOOP〜ENDLOOP」の構文を指していることがほとんどです。
以上を踏まえて、ABAPのループ処理、今回は最も基本となる「LOOP〜ENDLOOP」について説明していきます。
目次
1 LOOP処理とは?
2 構文ルール:LOOP〜ENDLOOP
2.1 LOOP〜ENDLOOP
2.2 LOOP AT(内部テーブル)INTO(構造)
3 WHEREオプション
4 FROM / TO オプション
5 ループ処理の注意点
6 フィールドシンボルとの組み合わせ
1 LOOP処理とは?
2 構文ルール:LOOP〜ENDLOOP
2.1 LOOP〜ENDLOOP
2.2 LOOP AT(内部テーブル)INTO(構造)
3 WHEREオプション
4 FROM / TO オプション
5 ループ処理の注意点
6 フィールドシンボルとの組み合わせ
1 LOOP処理とは?
"LOOP" から始まる構文は、「同じ処理の繰り返し」を行います。
また、 "LOOP" は内部テーブルから「 特定のデータを抽出して処理を行う場合」に利用されます 。
2 構文ルール:LOOP〜ENDLOOP
LOOP AT (内部テーブル) INTO (構造).
・・・・
ENDLOOP.
基本となる構文は上記の通りです。ポイントは、 ?@LOOP処理を行う内部テーブルを指定することと、?ALOOP処理で対象となるレコードを格納する構造を指定すること です。
2.1 LOOP〜ENDLOOP
ループ処理は、LOOPとENDLOOPで囲んだ間に具体的な処理内容を記述します。
LOOPとENDLOOPの間に記述した処理は、特段の指定が無い場合内部テーブルのデータのレコード数分繰り返します。
データが100行あれば、100回処理を繰り返します。
50行であれば、50回の処理が行われます。
そのためLOOP命令では、DO/WHILE文で注意すべき「無限ループ」に陥ることはありません。
2.2 LOOP AT(内部テーブル)INTO(構造)
LOOPでは、内部テーブルを1行1行処理をしていきます。
このとき留意する必要があるのが、LOOP ATでは 指定した内部テーブルを直接処理するのではなく、一時的に別の構造に対象の行を格納して処理を進める 、という点です。
したがって、LOOP〜ENDLOOPには、 ?@対象の内部テーブルと ?A作業エリア(構造)の指定が必要となるのです。
3 WHEREオプション
LOOP AT (内部テーブル)INTO (構造)
WHERE (条件式).
・・・・
ENDLOOP.
LOOP命令では、 WHEREオプションを用いて処理の対象としたいレコードを特定することが可能 です。
4 FROM / TO オプション
LOOP AT (内部テーブル)INTO (構造)
FROM (数字) TO (数字).
・・・・
ENDLOOP.
FROM TOオプションを用いることで、LOOPするレコード数を制限することができます。
LOOP AT (内部テーブル)INTO (構造)
FROM 10 TO 20 .
・・・・
ENDLOOP.
とした場合は、10行目から20行目までのレコードが処理の対象となります。
WHEREオプションで制限するよりも、FROM TOオプションで制限したほうがパフォーマンスは良くなります 。
WHEREオプションは、全てのレコードが条件に合致するかどうか読み込みに行ってしまうためです。
5 ループ処理の注意点
LOOP〜ENDLOOPの処理を簡単にまとめます。
・内部テーブルを1行1行別の構造に格納し、当該構造に対し処理をすること
・データ数分繰り返しされる処理であること
・WHEREオプション/FROM TOオプションで処理対象を特定できる
以上を理解しておけばOKです。
1つの注意点としては、 LOOP処理の中に、また別のLOOP処理を記載するのができるだけ避けなければならないという点 です。
これは、パフォーマンスを非常に悪化させてしまう原因となるためです。
ABAPerの禁忌の一つですので、必ず他の手段を考えましょう。
6 フィールドシンボルとの組み合わせ
ここで紹介したLOOP処理は、 かなり初歩的(古い記述方式)なものです 。
実際には、フィールドシンボルと組み合わせて利用するシーンがほとんどですので、フィールドシンボルとセットで理解することがおすすめです。
タグ: ABAP
【ABAP】APPEND命令—内部テーブルへの行追加
本ページでは、APPEND命令について解説しています。
APPEND命令は、 ワークエリア(構造)に格納されている値を内部テーブルの最後の行に付与(追加)する処理 を行います。
具体的にどのタイミングで利用するのかという点と注意点を中心に解説します。
目次
1 APPEND命令
1.1 処理の内容:APPEND命令
1.2 構文ルール:APPEND命令
2 挿入先の内部テーブルの種類に注意
1 APPEND命令
1.1 処理の内容:APPEND命令
1.2 構文ルール:APPEND命令
2 挿入先の内部テーブルの種類に注意
1 APPEND命令
APPENDとは日本語に訳すと「付与する」「くっつける」みたいな意味になります。
その言葉の意味通り、APPEND命令では内部テーブルへデータをくっつける処理を行います。
1.1 処理の内容:APPEND命令
APPEND命令は、内部テーブルの最後の行に作業エリアの内容を挿入する命令です。
ポイントは、追加されるのはテーブルの一番最後の行であるという点です。
ここだけは、初めに押さえておきましょう。
似たような処理にINSERT命令がありますね。
こちらも日本語に直すと「挿入」という意味になり、APPEND命令と混乱しがちな部分なのですが、両者には明確な違いが存在します。
APPEND命令では挿入されるのが最後の行であるのに対して、INSERT命令では任意の行に挿入できるということです。
・APPEND・・・テーブルの1番最後に挿入される
・INSERT ・・・テーブルの任意の行に挿入できる
INSERT命令よりもAPPEND命令の方がパフォーマンスの観点で優れています。
そのため、どちらの利用でも良い場合(APPENDでもINSERTでも要件を満たせる場合)は、可能な限りAPPEND命令を利用するようにしましょう。
1.2 構文ルール:APPEND命令
APPEND (構造名) TO (内部テーブル名).
この命令を利用すれば、構造に格納されたデータ内容を、内部テーブルの 最後の行に挿入することができます。
2 挿入先の内部テーブルの種類に注意
APPEND命令で挿入することができる内部テーブルは、 「標準テーブル」と「ソートテーブル」のみ です。
これは、INSERT命令でも同様です。
ハッシュテーブルにはAPPEND命令を利用できないという点に注意が必要です。
APPEND命令の利用については、ここで解説した内容とLOOP処理 / 構造・内部テーブルの基本知識とセットで覚えておきましょう。
タグ: ABAP
【ABAP】SORT命令—内部テーブルのソート
内部テーブルを昇順・降順での並び替えを行うSORT命令について解説します 。
SORT命令は単純な並び替えを行うだけのように理解してしまいがちですが、実は結構奥が深い(ソートの優先順や、昇順・降順の混合など)命令です。
目次
1 SORT命令:構文ルール
1.1 SORT命令の処理内容
1.2 ASCENDING / DESCENDINGオプション
1.3 BYオプション
1.4 昇順と降順の組み合わせ
1 SORT命令:構文ルール
1.1 SORT命令の処理内容
1.2 ASCENDING / DESCENDINGオプション
1.3 BYオプション
1.4 昇順と降順の組み合わせ
1 SORT命令:構文ルール
SORT (内部テーブル) .
構文は非常に簡単です。
オペランド部に並び替えを行いたい内部テーブルを指定するだけです。
(ただし、オプションなしのこのままの形で利用することはあまりありません。)
指定する内部テーブルは、標準テーブルかハッシュテーブルでなければなりません。
つまりソートテーブルをソートすることはできません。
ソートテーブルを指定してしまう場合、プログラム実行時にショートダンプが発生する場合があります。
1.1 SORT命令の処理内容
SORT命令の処理は、テーブルキーによって内部テーブルのレコードをソートします。
SORT命令は、キー項目であるNUMBER項目を優先してソートします。
キーは、内部テーブルの宣言時に指定しているものや、標準テーブルのキー項目を参照している項目が該当します。
また、次に解説するASCENDING / DESCENDINGオプションを利用しない場合は、デフォルトで昇順に並び替えされます。
1.2 ASCENDING / DESCENDINGオプション
ASCENDING / DESCENDINGオプションで並び替えの方法を昇順 or 降順で指定することができます。
・ASCENDING ⇒ 昇順(デフォルト)
・DESCENDING ⇒ 降順
SORT ITBA1 DESCENDING .
ASCENDINGオプションはデフォルトなので、指定する必要性はありませんが、ソースコードの可読性向上を目的として明示する場合があります。
(「SORT命令はデフォルトで昇順にする」と知っている人ばかりではありません。)
1.3 BYオプション
BYオプションで内部テーブルの項目を指定すると、テーブルキーではなく指定した項目に基づいて並び替えされます。
SORT ITBA1 BY PLACE ASCENDING.
一般的に、SORT命令を用いる場合、必ずBYオプションで項目を指定してあげるのが普通です。
どの項目をキーにソートしているのか、BYオプションを使えば一目でわかるためです。
あえて、項目を指定しない意味がないため、基本的には必ずソートする基準の項目を明示しておきましょう。
補足ですが、BYオプションでは項目を複数指定することができます。
SORT ITBA1 BY PLACE CAPITAL NUMBER ASCENDING.
1.4 昇順と降順の組み合わせ
実際にはあまり用いる場面はありませんが、昇順と降順を組み合わせることも可能です。
例えば、次の例では内部テーブルを「基本的には昇順で、CAPITALだけは降順で」並び替えを行います。
SORT ITBA1 ASCENDING BY CAPITAL DESCENDING .
タグ: ABAP
【ABAP】DESCRIBE TABLE命令
本ページでは、ABAPにおける内部テーブルの属性を読み込む命令—。
「DESCRIBE TABLE」について解説します。
DESCRIBE TABLEをあまり見かけない方もいらっしゃるかもしれませんが、実は1つのプログラムで1回ぐらいはよく使われている命令です。
目次
1 DESCRIBE TABLE命令とは?
1.1 【LINES】DESCRIBE TABLE
1.2 【OCCURS】DESCRIBE TABLE
1.3 【KIND】DESCRIBE TABLE
1 DESCRIBE TABLE命令とは?
1.1 【LINES】DESCRIBE TABLE
1.2 【OCCURS】DESCRIBE TABLE
1.3 【KIND】DESCRIBE TABLE
1 DESCRIBE TABLE命令とは?
DESCRIBE TABLE命令は、指定した内部テーブルの属性を読み取る命令です 。
(この命令では、内部テーブルの操作を行ったりレコードの追加・変更等は行いません。)
読み取りたい内部テーブルの属性に応じて3つのオプションがあり、オプションなしではDESCRIBE TABLE命令を利用することはできません。
必ず、以下いずれかのオプションを指定する必要があります。
DESCRIBE TABLE命令の3つのオプション
・LINESオプション
・OCCURSオプション
・KINDオプション
それでは、DESCRIBE TABLE命令の構文ルールとオプションの利用方法を合わせて解説します。
1.1 【LINES】DESCRIBE TABLE
DESCRIBE TABLE (内部テーブル) LINES (変数).
DESCRIBE TABLE (内部テーブル) LINES (変数).
LINESオプションを利用すると、内部テーブルの行数を判別することができます 。
判別した行数については、LINESオプションの後に指定した変数に格納されます。
LINESオプションの後に指定する変数には、整数しか入りませんのでデータ型は「i(整数)」でなければなりません。
LINESオプションが最も利用頻度が高いです。
MESSAGE命令 を用いて、処理成功件数を画面表示したい場合などに用いる場合が多いです。
1.2 【OCCURS】DESCRIBE TABLE
DESCRIBE TABLE (内部テーブル) OCCURS (変数).
OCCURSオプションでは、内部テーブルの初期メモリ所要量(INITIAL SIZE)を判別することができます。
初期メモリ所要量とは、内部テーブルを宣言したタイミングで自動的に与えられるメモリサイズのことです。
通常のプログラムであれば、この初期メモリ所要量を気にしなければいけないタイミングが(ほぼ)ないため、 OCCURSオプションを用いたDESCRIBE TABLE命令を見かけることはまずありません。
OCCURSオプションの後に指定する変数は、LINESオプションと同様データ型「i(整数)」でなければなりません。
1.3 【KIND】DESCRIBE TABLE
DESCRIBE TABLE (内部テーブル) KIND (変数).
KINDオプションは、指定した内部テーブルのテーブルタイプを判別することができます 。
KINDオプションの後に指定した変数には、テーブルタイプに応じて以下のいずれかの文字が格納されます。
・標準テーブルの場合「 T 」
・ハッシュテーブルの場合「 H 」
・ソートテーブルの場合「 S 」
そのため、KINDオプションの後に指定した変数のデータ型は「c(文字)」でなければなりません。
タグ: ABAP
【ABAP】READ TABLE—内部テーブルの読み込み
本ページでは、READ TABLE命令による内部テーブルの読み込み処理について解説します。
ABAPでは、この内部テーブルの処理が鍵となりますので、丁寧に理解しておく必要があります。
そのため本ページでは、構文ルールに加えて、各種オプションの指定方法、その他コーディング時の注意点も合わせて深堀して解説しています。
目次
1 READ TABLEとは
1.1 構文ルール:READ TABLE
2 READ TABLEの処理内容
2.1 ASSIGNING:フィールドシンボルを利用する場合
2.2 TRANSPORTING NO FIELDS:レコードを格納しない
1 READ TABLEとは
1.1 構文ルール:READ TABLE
2 READ TABLEの処理内容
2.1 ASSIGNING:フィールドシンボルを利用する場合
2.2 TRANSPORTING NO FIELDS:レコードを格納しない
1 READ TABLEとは
READ TABLEは、内部テーブルの単一行を読み込む命令です。
標準テーブル・アドオンテーブルから項目を選択する場合はSELECT命令ですが、内部テーブルの場合はREAD TABLEです。
意外と、初心者に人ほどこの罠に陥ることが多いのでしっかり区別しておきましょう。
・READ ⇒ 内部テーブル の読み込み
・SELECT ⇒ 標準・アドオンテーブル の選択
※READ TABLEは、あくまでも 単一行の読み込みです。
SELECT-SINGLE命令と同じような処理になります。
1.1 構文ルール:READ TABLE
READ TABLE (内部テーブル) INTO (構造)
WITH KEY A = A'
B = B' .
利用シーンに応じて様々オプションはありますが、最もよく使う基本形です。
この形で覚えておくと良いでしょう。
2 READ TABLEの処理内容
READ TABLEは指定した内部テーブルから単一行を読み込みます。
では、どの行を読み込むか?
それを、WITH KEYの後に指定してします。
「 WITH KEY VBELN = '100000000'」 とすれば、受注伝票 100000000のレコード(行)が対象となります。
仮に、読み込む行が一意にならない場合は、 最初に一致するレコードが読み込み対象 となります。
ここらへんもSELECT-SINGLEの処理と同じですね。
読み込んだレコードを INTOの後に指定した構造に格納し、後続の処理に進むことになります。
2.1 ASSIGNING:フィールドシンボルを利用する場合
読み込んだレコードは必ずしも、 INTO の後に指定した構造に格納するわけではありません。
1つ目の方法が、フィールドシンボルを利用するパターンです。
フィールドシンボルを利用する場合の構文は以下のよう「ASSIGNING」を利用します。
READ TABLE (内部テーブル)
ASSIGNING < フィールドシンボル >
WITH KEY A = A'
B = B' .
2.2 TRANSPORTING NO FIELDS:レコードを格納しない
使用頻度は低いですが、読み込んだ内部テーブルのレコードをどこにも格納しないという指定も可能です。
「 TRANSPORTING NO FIELDS 」オプションは、レコードを格納せずにシステム項目だけを設定するオプションです。
READ TABLE (内部テーブル) TRANSPORTING NO FIELDS
WITH KEY A = A'
B = B' .
この処理は「レコードが存在するかどうかだけ知りたい場合」に用います。
タグ: ABAP
【ABAP】内部テーブルのテーブルデータ型とは?
内部テーブルと一口に言っても、ABAPを書いていくうちに「ソートテーブル」や「ハッシュテーブル」という言葉に出会うはずです。
なんとなく手探りで理解するのもいいのですが、人に説明する時のために体系だって覚えておきたいものです。
本ページでは、「これだけは押さえておきたい」3種類の内部テーブルについて解説します。
目次
1 内部テーブルにはいくつか種類がある
2 標準テーブル(STANDARD TABLE
2.1 構文ルール: ~STANDARD TABLE OF~
2.2 標準テーブルとは?
3 ソートテーブル(SORTED TABLE)
3.1 構文ルール: ~SORTED TABLE OF~
3.2 ソートテーブルとは?
4 ハッシュテーブル(HASHED TABLE)
4.1 構文ルール: ~HASHED TABLE OF~
4.2 特徴
1 内部テーブルにはいくつか種類がある
2 標準テーブル(STANDARD TABLE
2.1 構文ルール: ~STANDARD TABLE OF~
2.2 標準テーブルとは?
3 ソートテーブル(SORTED TABLE)
3.1 構文ルール: ~SORTED TABLE OF~
3.2 ソートテーブルとは?
4 ハッシュテーブル(HASHED TABLE)
4.1 構文ルール: ~HASHED TABLE OF~
4.2 特徴
1 内部テーブルにはいくつか種類がある
内部テーブルと一口に言っても、使い方や目的によっていくつかの種類を使い分ける必要があります。
また、それに応じて テーブル定義の構文が異なってきたり、使用できる命令も微妙に異なります。
以下では「これさえ覚えておけば何とかなる」3つの内部テーブルについて解説します。
2 標準テーブル(STANDARD TABLE)
2.1 構文ルール: ~STANDARD TABLE OF~
(内部テーブル名) TYPE STANDARD TABLE OF (参照構造).
基本となる「TYPE TABLE OF」に「STANDARD」の文言を入れて、標準テーブルであることを明示します。
2.2 標準テーブルとは?
このテーブルは最も標準的なテーブルです。
これが標準テーブルのイメージです。
標準テーブルで覚えておくべきなのは、 行数が多くなれば多くなるほど、検索にかかる時間も多くなるということです。
この「検索にかかる時間」がこの後解説する他のテーブルとの比較点として重要になるので意識してみてください。
このテーブルを基本に種類の異なる別の内部テーブルを理解していくとよいでしょう。
3 ソートテーブル(SORTED TABLE)
3.1 構文ルール: ~SORTED TABLE OF~
(内部テーブル名) TYPE SORTED TABLE OF (参照構造).
3.2 ソートテーブルとは?
ソートテーブルとは、つまることころ並び替えされたテーブルです。
ソートテーブルでは、テーブルで定義されたキー項目に応じて並び替えされた状態で保存されます。
並び替えされているため、標準テーブルよりも検索速度が速くなります。
ソートテーブルの注意点
ただ並び替えするだけで、検索速度が速くなるのであれば常にソートテーブルだけ利用していればいいのでは?
こう考えるかもしれませんが、ソートテーブルの欠点は「 挿入時に時間がかかる」ことにあります。
標準テーブルでは並び順なんかまったく関係ないので、データを追加する場合は「最後の行に追加」(APPEND命令)で一瞬で処理可能なのですが、ソートテーブルの場合「 どこにデータを挿入するか」を予め導きだしてからデータを「挿入」(INSERT命令)となるので、時間がかかります。
時と場合に応じて、標準テーブルとソートテーブルを使い分ける必要があります。
4 ハッシュテーブル(HASHED TABLE)
4.1 構文ルール: ~HASHED TABLE OF~
(内部テーブル名) TYPE HASHED TABLE OF (参照構造).
4.2 特徴
ハッシュ処理が施されているテーブルです。
ハッシュ処理とは、元のデータをある一定の計算手法(2乗した数を基の数で割り....)によって元のデータを置換することをいいます。
この際、置換された値が重複してしまうと元のデータが分からなくなるため、置換される結果は必ず違う値でなければいけないというルールがあります。
ハッシュテーブルでは、指定したキー項目をハッシュ処理で置換しテーブルで保存します。
ハッシュテーブルの検索スピードは「データ量に関わらず一定」です。
これが、ハッシュテーブルの最大の特徴です。
データ量に関わらず一定、という性質のため、データ量が大きいテーブルを処理する際にハッシュテーブルが採用されます。
小さいテーブルであれば、ソートテーブルのほうが有利ですが、例えばデータが100万件のような「ほぼデータベースそのまま」のような処理を行う際にハッシュテーブルを採用するとよいでしょう。
ハッシュテーブルの注意点?@ キー指定
先ほど、ハッシュ処理では「置換された値は必ず一意になる」と説明しました。
したがって、置換する前の値(ハッシュテーブルのキー項目)も一意でなければなりません。
重複していた場合、プログラムの実行中に「ショートダンプ」を起こし、処理が中止されます。
ハッシュテーブルのキー項目は必ず一意の値でなければなりません。
ハッシュテーブルの注意点?A 検索時の指定
ハッシュテーブルを検索する際は、キー項目を全て指定する必要があります。
キー項目によってハッシュ化されているためです。
したがって、ハッシュテーブルから「 同時にデータを複数個検索することはできません」。
上記3つの内部テーブルのイメージと、検索時のスピードについて解説してきました。
これを機会に意識して内部テーブルの処理ができるようになれば幸いです。
タグ: ABAP
【ABAP】内部テーブルの宣言—理解しておきたい3つのポイント
ABAPプログラミングの一番の特徴をあげるとすれば、「内部テーブル」です。
他の言語では内部テーブルという概念がないのでとっつきにくく感じるかもしれませんが、ABAPのコーディングは これを知らないと何も始まりません!
とはいえ、理解してしまえば難しくない概念ですしコーディングも簡単です。
このページでは、内部テーブルの宣言方法と押さえておきたい基本知識について解説していきます。
目次
1 内部テーブルの宣言方法
1.1 内部テーブルの宣言(構造の定義)
1.2 内部テーブルの宣言(テーブルの定義)
1 内部テーブルの宣言方法
内部テーブルの宣言方法は1つではありません。
が、どの方法をとるにせよ最も基本的な宣言方法を理解しておく必要があります。
以下では、1番基本となる構文ルールと考え方を解説していきます。
1.1 内部テーブルの宣言(構造の定義)
内部テーブルを定義するには、まず ?@「構造」の定義 を行い、 ?A定義した構造を用いて内部テーブルを定義 する流れです。
構造の定義は、 TYPES命令 で行います。
簡単な2列の構造を定義する例を以下に示します。
TYPES:
BEGIN OF WORK001,
NO TYPE I,
NAME TYPE C,
END OF WORK001.
これで、最初のステップ ?@「構造の定義」 が完了です。
1.2 内部テーブルの宣言(テーブルの定義)
定義した構造を基に、本題である内部テーブルの宣言を行います。
構文ルール
DATA TABLE001 TYPE TABLE OF WORK001.
内部テーブルの定義は DATA命令 を用います。
ただし、内部テーブルの宣言を行う場合は、オプションに「 TABLE OF 」と指定します。
この点が、通常のDATA命令と異なります。
厳密に言うとこれだけでは内部テーブルを利用できる状態になったとは言えないのです。
内部テーブルを利用する際には、必ず作業エリア(1行だけのテーブル、つまり構造)が必要になるからです。
したがって、より実践的な書き方はこちらになります。
構文ルール(実践バージョン)
DATA : WorkSpace001 TYPE WORK001,
TABLE001 TYPE TABLE OF WORK001.
内部テーブルを定義すると同時に、作業エリアも同時に定義する のです。
実際の現場では、この書き方が中心です。
同時に宣言することで、なんのための作業エリアであるのかを判別しやすくするのです。
内部テーブルの宣言方法はこれだけです。
他にもいろいろな記述方式がありますが、ここで解説した内容はマスターしていることが前提となります。
タグ: ABAP
2020年02月07日
【ABAP】イベントブロック
"INITIALIZATION" "AT-SELECTION-SCREEN"に代表される イベントブロックについて解説します。
イベントブロックを理解すれば、 ABAPがどのように実行されていくのか?ABAPはどういう言語なのか?を深く知ることができます。
このページで学べる内容
・【前提】イベントドリブン言語とは?
・イベントブロックとは何か?
・イベントブロックの実行順序
・イベントブロックの書き方・使い方
・【前提】イベントドリブン言語とは?
・イベントブロックとは何か?
・イベントブロックの実行順序
・イベントブロックの書き方・使い方
普段何気なくイベントブロックを使っているが結局どういう意味があるの?という疑問をお持ちの方にも役に立つ内容です。
目次
1 前提:イベントドリブン言語とは?
2 イベントブロックとは?
3 イベントブロックの実行順序
3.1 LOAD-OF-PROGRAM
3.2 INITIALIZATION
3.3 AT SELECTION-SCREEN
3.4 START-OF-SELECTION
3.5 TOP-OF-PAGE
3.6 END-OF-PAGE
3.7 END-OF-SELECTION
1 前提:イベントドリブン言語とは?
ABAPは イベントドリブン言語です。
イベントドリブン言語を一言で説明すると「 イベントの発生をトリガーにプログラムが実行される言語」と説明できます。
イベントとは?
ユーザによるキーボードの操作、マウスのクリックなどによって、システムに何らかの変更が加えられシステムの状態が変化する出来事のことです。
例えば・・・
「 ”Enter” ボタンを押す」
「 "戻るボタン" をマウスでクリックする」
「 "選択画面" が表示される」
ユーザによるキーボードの操作、マウスのクリックなどによって、システムに何らかの変更が加えられシステムの状態が変化する出来事のことです。
例えば・・・
「 ”Enter” ボタンを押す」
「 "戻るボタン" をマウスでクリックする」
「 "選択画面" が表示される」
つまり、「ENTERが押される」「実行ボタンが押される」「選択画面が表示される」という 「イベントをトリガーに特定の処理が行われる」のがイベントドリブン言語です。
ABAPも、上記で説明した内容と同じように「 実行ボタンを押す」「 選択画面が表示される」などのイベントに応じてプログラムを実行できるように設計されています。
したがって、ABAPをコーディングしていく上で、そのソースコードがいつ実行されるのか?を知っていないと適切なコーディングができません。
ABAPのイベントブロックを正確に理解することは非常に重要です。
2 イベントブロックとは?
イベントブロックとは、その名の通りイベントの区切りです。
ABAPでは、イベン卜ブロックは後述する イベントキーワードで始まり、 次のイベントキーワードまでが1つのイベントブロックとなります 。
3 イベントブロックの実行順序
ABAPでは、このイベントは基本的に 事前に決められた順序で呼び出されるようになっています。
イベントブロックの実行順序
1.LOAD-OF-PROGRAM
2. INITIALIZATION
3. AT-SELECTION-SCREEN
4. START-OF-SELECTION
5.GET
6.TOP-OF-PAGE
7.END-OF-PAGE
8. END-OF-SELECTION
9.AT LINE-SELECTION
1.LOAD-OF-PROGRAM
2. INITIALIZATION
3. AT-SELECTION-SCREEN
4. START-OF-SELECTION
5.GET
6.TOP-OF-PAGE
7.END-OF-PAGE
8. END-OF-SELECTION
9.AT LINE-SELECTION
それぞれのイベントブロックの意味について以下で詳しく解説していきます。
3.1 LOAD-OF-PROGRAM
プログラム開始時を示すイベントブロックです。
プログラムが実行される際、1番最初に1度だけ実行されるイベントブロックです。
ただし、このイベントブロックはあまり利用されません。
次に解説するINITIALIZATIONも似たようなイベントブロックであるため、そちらを利用する方が圧倒的多数です。
3.2 INITIALIZATION
このイベントはLOAD-OF-PROGRAMの直後、「プログラムが実行されて選択画面が表示される前」を示します。
このイベントは、選択画面を持つ機能などで、事前に選択項目に初期値を入れておきたい場合などに利用されます。
INITIALIZATIONの注意点
このイベントが発生するのは、プログラム実行後1度だけです。
他のイベントはボタンを押すたびに発生するなど、複数回発生する場合もありますが、INITIALIZATIONが複数回実行されることはないという点に注意してください。
3.3 AT SELECTION-SCREEN
「AT-SELECTION-SCREEN」は選択画面イベントと呼ばれます。
「 選択画面で”Enter”を押した時」を表します。
例えば、ユーザが入力した値をチェックしたい場合に「氏名は全角カタカナで書いていることをチェックしろ!」という命令を書こうと思った場合に利用します。
チェックした結果はMESSAGE命令を通して画面に表示されます。
「 AT SELECTION-SCREEN」イベントでエラーメッセージが出力された場合は、再入力が可能になります。
(処理が再度「 AT SELECTION-SCREEN」イベントに戻ります。)
後述する「 START-OF-SELECTION」イベントでは、エラーメッセージが吐き出されても元の画面に戻りません。すなわち、実行前の画面からやり直しになります。
3.4 START-OF-SELECTION
「 START-OF-SELECTION」は、標準処理ブロックと呼ばれます。
具体的に分かりやすく説明すると「 実行ボタンが押された後」に実行されるイベントブロックです。
標準処理ブロックと名の付く通り、ほとんどの処理はこのブロック内で実行されるため、 START-OF-SELECTIONは「 デフォルトイベント」と呼ばれます。
特にイベントを宣言しないで処理を記述した場合”START-OF-SELECTION”に割り当てられます。
3.5 TOP-OF-PAGE
一覧の作成時、新しいページが始まるタイミングに直後に実行されるイベントブロックです。
その名の通り、ページのヘッダ情報を付与するのが主な役割です。
もっと具体的に言えば、一覧ページが複数ページとなる場合には、その都度「 TOP-OF-PAGE」イベントが実行されます。
3.6 END-OF-PAGE
「TOP-OF-PAGE」の対でページのヘッダを作成するためのイベントブロックです。
このイベントブロックが実行されるのは、一覧の作成時に次のページに達したときです。
つまり、一覧画面が複数ページとならない場合には、このイベントブロックは実行されません。
3.7 END-OF-SELECTION
プログラムのメイン処理が終了するタイミングで実行されるイベントブロックです。
基本的には、 最後に動くイベントブロックであると理解してOKです。
※このイベントブロックが終わると、プログラムの実行が完了します。
このイベントブロックでは、例外処理を記述したり、処理結果の登録(ログの出力)を行ったりすることが多いです。
タグ: ABAP
【ABAP】CHECK命令—ループパスの条件付き終了
ABAPのCHECK命令について整理します。
CHECK命令は、一般的にはある条件を満たさない場合にループ処理を抜ける命令です。
ループの外でCHECK命令を行った場合には、現在の処理ブロックを終了します。
(例えば、サブルーチンであれば、そのサブルーチンの処理を終了し、次のブロックに移ります。)
CHECK命令については、どういった場面で利用するのか?
実際のコーディングはどのように行うのか?
この2点について、解説します。
このページでは、ループ処理についての知識が前提になります。
目次
1 構文ルール:CHECK命令
2 CHECK命令の処理
3 サンプルコード:CHECK命令
4 ループ処理の「強制終了」
1 構文ルール:CHECK命令
2 CHECK命令の処理
3 サンプルコード:CHECK命令
4 ループ処理の「強制終了」
CHECK (論理式).
(論理式)の部分は「SY-SUBRC = 0」のように比較演算子を用います。
構文ルールは簡単です。CHECKの後に、論理式を指定するだけです。
CHECK (論理式) AND (論理式).
のように、条件を複数指定することもできます。
構文自体は簡単ですので、CHECK命令の処理の内容をしっかり押さえましょう。
2 CHECK命令の処理
ループ処理の中に記載したCHECK命令では、
CHECK (論理式).
の中の(論理式)が「偽」の場合にループ処理を抜ける処理を行います。
つまり、CHECK命令は「〜であること」をチェックし、「〜でない」場合に処理をやめたい場合に用います。
3 サンプルコード:CHECK命令
サンプルコード:CHECK命令
以下のコードは、システム項目「SY-SUBRC」が0以外の場合にループ処理を終了します。
DO 100 TlMES.
A = A + 1.
CHECK SY-SUBRC = 0.
WRTE / SY-INDEX.
ENDOO.
CHECK命令が、ループ処理の中に書かれています。
したがって、SY-SUBRCが0以外となった場合には、ループ処理を抜けることになります。
注意点としては、CHECK命令は「〜であること」をチェックする命令ですので
「CHECK SY-SUBRC <> 0.」ではなく「CHECK SY-SUBRC = 0.」と記述します。
4 ループ処理の「強制終了」
CHECK命令の他にも、ループ処理を終了する処理を行う命令があります。
タグ: ABAP
【ABAP】EXIT/CONTINUE命令—ループパスの強制終了
本ページでは、ループ処理の強制終了に関するEXIT命令とCONTINUE命令について解説しています。
EXIT命令は、その名の通り「抜ける」という意味でループ処理の強制終了をイメージしやすい分使用頻度が高いです。
ただし、CONTINUE命令もEXIT命令とほぼ同様の動きをする命令でなので合わせて知っておくと可読性の高いコーディングの一助となるでしょう。
両者の使い分けと、実際の構文ルールを中心にサンプルコードを用いながら解説していきます。
目次
1 構文ルール:EXIT命令
1.1 EXIT命令の処理内容
2 構文ルール:CONTINUE命令
2.1 CONTINUE命令の処理内容
3 EXIT命令とCONTINUE命令の違い
4 ループ処理の「条件付き」終了
1 構文ルール:EXIT命令
1.1 EXIT命令の処理内容
2 構文ルール:CONTINUE命令
2.1 CONTINUE命令の処理内容
3 EXIT命令とCONTINUE命令の違い
4 ループ処理の「条件付き」終了
1 構文ルール:EXIT命令
EXIT.
構文は難しくありません。
EXIT.と記述するだけです。
EXITを日本語に直すと "出る" "退出する" 等の意味になります。
1.1 EXIT命令の処理内容
EXIT命令の処理内容
EXIT命令を記述すると、無条件にループ処理を抜けます。
実際のサンプルコードを見てみましょう。システム項目「SY-INDEX」が10を超えた場合に「DO~ENDDO」のループ処理を抜けます。
※SY-INDEX は、ループ処理の回数を保持します。
DO.
IF SY-INDEX > 10.
EXIT.
ENDIF.
A =A+1.
ENDDO.
EXIT命令は、基本的にはIF文とセットで用います。
2 構文ルール:CONTINUE命令
CONTINUE.
構文ルールは、EXIT命令と同様簡素な形をとります。
CONTINUEは日本語で、"続ける" "続く" 等の意味を持つため誤解しやすいですが、基本的にはEXIT命令と同じ処理になります。
2.1 CONTINUE命令の処理内容
CONTINUE命令を記述すると、ループ処理を無条件に終了します。
EXIT命令と同様、サンプルコードを見てみましょう。
先ほどのコードとの差異は、EXIT命令がCONTINUE命令に入れ替わっているだけです。
DO.
IF SY-INDEX > 10.
CONTINUE.
ENDIF.
A =A+1.
ENDDO.
処理内容や用い方は、EXIT命令と全く同様なのです。
3 EXIT命令とCONTINUE命令の違い
EXIT命令とCONTINUE命令の違いは1点だけ。
それは、 ループ処理の外でも使えるかどうか?です。
EXIT命令は、ループの処理の外に記述することが可能です。
ループの処理の外に記載した場合は、処理ブロック(汎用モジュール・サブルーチン・イベント)を終了する処理を行います。
CONTINUE命令は、ループの処理の外に置くことはできません。
したがって、CONTINUE命令を用いている場合は、必ずループ処理であることを明示できることになります。
ルール処理がネストされている場合など、複雑なコードの中にあっては、CONTINUE命令を利用したほうが可読性が上がるでしょう。
4 ループ処理の「条件付き」終了
EXIT命令とCONTINUE命令は、ループ処理の「強制」終了を行う命令です。
その上で、IF文などを伴わずに「条件付き」終了の処理を行うCHECK命令についても理解しておくと良いでしょう。
ループを抜ける処理を行いたい場合は、EXIT命令、CONTINUE命令、そしてCHECK命令のいずれかを適切に選択して利用することが大切です。
タグ: ABAP