ABAP入門(7/10):SQL文

2009年12月 8日 Posted in ABAP Posted in SAP 技術トピック

今回は、前回作成したテーブルのデータに、プログラムからアクセスしたいと思います。

 

今回は、新たにテーブルアクセス用のレポートプログラムを一つ作成しましょう。

以下のソースコードで、レポートプログラムを作成してください。

************************************************************************

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 藤川


このエントリーをはてなブックマークに追加
トラックバックURL:

コメントする

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