ABAP入門(7/10):SQL文
今回は、前回作成したテーブルのデータに、プログラムからアクセスしたいと思います。
今回は、新たにテーブルアクセス用のレポートプログラムを一つ作成しましょう。
以下のソースコードで、レポートプログラムを作成してください。
************************************************************************
REPORT ZTEST_SELECT.
DATA: ZTESTTABLE_WA LIKE ZTESTTABLE,
ZTESTTABLE_ITAB LIKE TABLE OF ZTESTTABLE.
SELECT *
INTO TABLE ZTESTTABLE_ITAB
FROM ZTESTTABLE.
LOOP AT ZTESTTABLE_ITAB INTO ZTESTTABLE_WA.
WRITE:/ ZTESTTABLE_WA-TESTTEXT, ZTESTTABLE_WA-TESTNUMBER.
ENDLOOP.
************************************************************************
で、実行してみましょう。

こうなります。
では順番にご説明していきたいと思います。
まず、
DATA: ZTESTTABLE_WA LIKE ZTESTTABLE,
ZTESTTABLE_ITAB LIKE TABLE OF ZTESTTABLE.
ですが、ここでは作業領域ZTESTTABLE_WAと内部テーブルZTESTTABLE_ITABを宣言しています。
内部テーブルとは、テーブルから読み込んだエントリを、メモリ上に保持しておくためのテーブルデータ型の変数です。ここでは、テーブルZTESTTABLEを参照して宣言していますので、同じ構造をしています。
作業領域とは、内部テーブルのエントリを参照する際に、一エントリずつコピーして順番に処理するための内部テーブルと同じ構造を持つ変数です。
次に、
SELECT *
INTO TABLE ZTESTTABLE_ITAB
FROM ZTESTTABLE.
ここで、テーブルZTESTTABLEから、全項目を全件取得し、内部テーブルZTESTTABLE_ITABに格納します。
そして、
LOOP AT ZTESTTABLE_ITAB INTO ZTESTTABLE_WA.
WRITE:/ ZTESTTABLE_WA-TESTTEXT, ZTESTTABLE_WA-TESTNUMBER.
ENDLOOP.
このように、内部テーブルZTESTTABLE_ITABを一件ずつ読込み、それを作業領域ZTESTTABLE_WAにコピーし、LOOP、ENDLOOPの間でその作業領域の値を使用して処理を行います。
LOOP、ENDLOOPは文字通り、ループ処理のためのABAP命令で、この場合、内部テーブルのエントリ全件に対してループしてくれ、エントリが無くなると終了します。
ここでの各エントリの処理は、構造内の各項目の値を画面に出力しています。<構造名>-<項目>の書式で構造内の各項目の値を参照できます。ちなみに/は改行になりますので、上記の図の通り一エントリ一行で出力されています。
これが一番シンプルなテーブルデータの読込方法になります。
では次に、テーブルにエントリを挿入してみましょう。
以下のソースコードで、レポートプログラムを作成してください。
************************************************************************
REPORT ZTEST_INSERT.
DATA: ZTESTTABLE_WA LIKE ZTESTTABLE.
PARAMETERS: P_TEXT LIKE ZTESTTABLE-TESTTEXT,
P_NUM LIKE ZTESTTABLE-TESTNUMBER.
ZTESTTABLE_WA-TESTTEXT = P_TEXT.
ZTESTTABLE_WA-TESTNUMBER = P_NUM.
INSERT INTO ZTESTTABLE VALUES ZTESTTABLE_WA.
IF SY-SUBRC = 0.
MESSAGE ID 'SABAPDOCU' TYPE 'S' NUMBER 888
WITH 'エントリが追加されました'.
ELSE.
MESSAGE ID 'SABAPDOCU' TYPE 'E' NUMBER 888
WITH 'エントリの追加に失敗しました'.
ENDIF.
************************************************************************
実行してみます。

選択画面で、値を入力し、実行します。

正常終了のメッセージが出力されます。
t-cd SE16で確認すると、

エントリが挿入されています。
次に、同じ値のまま、もう一度実行します。

エラーメッセージが出力され、異常終了しました。
では、順に内容をご説明したいと思います。
DATA: ZTESTTABLE_WA LIKE ZTESTTABLE.
INSERTするデータを格納するための作業領域を宣言します。
PARAMETERS: P_TEXT LIKE ZTESTTABLE-TESTTEXT,
P_NUM LIKE ZTESTTABLE-TESTNUMBER.
選択画面の入力項目を定義します。このように、テーブル項目を参照して変数を定義することができます。
ZTESTTABLE_WA-TESTTEXT = P_TEXT.
ZTESTTABLE_WA-TESTNUMBER = P_NUM.
作業領域ZTESTTABLE_WAの各項目に、選択画面で入力された値を渡します。
INSERT INTO ZTESTTABLE VALUES ZTESTTABLE_WA.
INSERT文により、テーブルZTESTTABLEに、作業領域ZTESTTABLE_WAの内容で行を挿入します。
IF SY-SUBRC = 0.
MESSAGE ID 'SABAPDOCU' TYPE 'S' NUMBER 888
WITH 'エントリが追加されました'.
ELSE.
MESSAGE ID 'SABAPDOCU' TYPE 'E' NUMBER 888
WITH 'エントリの追加に失敗しました'.
ENDIF.
直前のINSERT文が正常終了した場合、SY-SUBRC = 0になり、エラーになった場合、SY-SUBRC <> 0となります。そのため、先ほどの実行例では、既に登録したエントリとキー項目が同じエントリを挿入しようとしてエラーとなっています。
以上が、テーブルへのデータの挿入方法になります。
このようにABAPでは、SQL文によりデータベースアクセスが可能です。もちろん、UPDATEや、DELETEも可能です。それらの詳細はこちらをご覧ください。
REALTECH 藤川
トラックバック (0)
- トラックバックURL:



コメントする
(コメントを表示する際、コメントの承認が必要になることがあります。承認されるまではコメントは表示されません。その時はしばらくお待ちください。)