練習問題(繰り返し処理)
20.3 練習問題(繰り返し処理)
3. 練習問題(繰り返し処理)
本章で習った内容を元にプログラムを作成してみましょう。
この練習問題プログラムでは、繰り返し処理 について理解できているか確認します。
なお、練習問題プログラムは、以下の条件で作成しましょう。
プログラムID :ZRYYMMnnn_LOOP_PRACTICE
※YYMMは研修年月、 nnnは受講生番号
概要
選択画面で指定した「品目コード(範囲指定)」を条件に、
仕入テーブル(ZT200400102)を基準として売上テーブル(ZT200400101)を 外部結合(LEFT OUTER JOIN) で取得します。
外部結合を使うことで、売上データが存在しない品目でも、仕入テーブル側のデータは取得できます。
取得結果が 0 件の場合はエラーメッセージを表示して処理を終了し、
取得できた場合は対象データを 繰り返し処理(LOOP)で 1 行ずつ出力します。
● 選択画面から指定された「品目コード」(範囲指定)を抽出条件として、
売上テーブル:ZT200400101と仕入テーブル:ZT200400102を結合し、
仕入テーブルのみもしくは両方のテーブルに存在するデータを取得する。
● 対象データが存在しない場合は、エラーメッセージを出力し、選択画面に戻る。
● 対象データが存在する場合は、対象データ全件を画面に出力する。
● 処理が完了したら、終了メッセージを出力する。
● 対象データ全件が出力できるように繰り返し処理を作成
処理フロー
実行結果例
使用プログラム
*&---------------------------------------------------------------------*
*& プログラムID:プログラムIDを記入
*& プログラム名:練習問題(繰り返し)
*& 概要 :選択画面に指定された品目コードと一致する売上テーブル、
*& 仕入テーブルを外部結合で取得し、全件画面に出力する。
*& 作成日付 :YYYY/MM/DD
*& 作成者 :作成者名(受講生No xxxxxx )
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE20PRACTICE_LOOP.
"------------------------------------------------------------
" 型定義:取得結果(仕入を基準に、売上を結合)
"------------------------------------------------------------
TYPES:
BEGIN OF TY_ITEM_ROW,
MATNR TYPE ZT200400102-MATNR, "品目コード
ZTEXT TYPE ZT200400102-ZTEXT, "商品名(テキスト)
ZAMT_SAL TYPE ZT200400101-ZAMT_SAL, "売上金額(売上なしなら初期値)
ZAMT_PUR TYPE ZT200400102-ZAMT_PUR, "仕入金額
END OF TY_ITEM_ROW.
TYPES TY_ITEM_TAB TYPE STANDARD TABLE OF TY_ITEM_ROW WITH EMPTY KEY.
"------------------------------------------------------------
" 選択条件
"------------------------------------------------------------
DATA GV_MATNR TYPE MATNR.
SELECT-OPTIONS S_MATNR FOR GV_MATNR.
"------------------------------------------------------------
" 主処理
"------------------------------------------------------------
START-OF-SELECTION.
DATA LT_ITEM TYPE TY_ITEM_TAB.
" 仕入テーブルを基準に外部結合(仕入のみ/両方のデータを取得)
SELECT
P~MATNR,
P~ZTEXT,
S~ZAMT_SAL AS ZAMT_SAL,
P~ZAMT_PUR AS ZAMT_PUR
FROM ZT200400102 AS P
LEFT OUTER JOIN ZT200400101 AS S
ON P~MATNR = S~MATNR
WHERE P~MATNR IN @S_MATNR
INTO TABLE @LT_ITEM.
" 対象データが存在しない場合:エラー表示して終了
IF LT_ITEM IS INITIAL.
MESSAGE S005(ZTEST2021) WITH 'ZT200400102' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" 見出し
WRITE: / '品目コード',
020 '商品名',
050 '売上金額',
070 '仕入金額'.
ここに繰り返し処理によって 対象データ全件を出力する処理 を作成
*結果画面メッセージ出力
MESSAGE S001(ZTEST2021).
END-OF-SELECTION.
使用プログラム(答え)
*&---------------------------------------------------------------------*
*& プログラムID:ZR2004001_LOOP_PRACTICE
*& プログラム名:練習問題(繰り返し)
*& 概要 :選択画面に指定された品目コードと一致する売上テーブル、
*& 仕入テーブルを外部結合で取得し、全件画面に出力する。
*& 作成日付 :YYYY/MM/DD
*& 作成者 :作成者名(受講生No xxxxxx )
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE20PRACTICE_LOOP.
"------------------------------------------------------------
" 型定義:取得結果(仕入を基準に、売上を結合)
"------------------------------------------------------------
TYPES:
BEGIN OF TY_ITEM_ROW,
MATNR TYPE ZT200400102-MATNR, "品目コード
ZTEXT TYPE ZT200400102-ZTEXT, "商品名(テキスト)
ZAMT_SAL TYPE ZT200400101-ZAMT_SAL, "売上金額(売上なしなら初期値)
ZAMT_PUR TYPE ZT200400102-ZAMT_PUR, "仕入金額
END OF TY_ITEM_ROW.
TYPES TY_ITEM_TAB TYPE STANDARD TABLE OF TY_ITEM_ROW WITH EMPTY KEY.
"------------------------------------------------------------
" 選択条件
"------------------------------------------------------------
DATA GV_MATNR TYPE MATNR.
SELECT-OPTIONS S_MATNR FOR GV_MATNR.
"------------------------------------------------------------
" 主処理
"------------------------------------------------------------
START-OF-SELECTION.
DATA LT_ITEM TYPE TY_ITEM_TAB.
" 仕入テーブルを基準に外部結合(仕入のみ/両方のデータを取得)
SELECT
P~MATNR,
P~ZTEXT,
S~ZAMT_SAL AS ZAMT_SAL,
P~ZAMT_PUR AS ZAMT_PUR
FROM ZT200400102 AS P
LEFT OUTER JOIN ZT200400101 AS S
ON P~MATNR = S~MATNR
WHERE P~MATNR IN @S_MATNR
INTO TABLE @LT_ITEM.
" 対象データが存在しない場合:エラー表示して終了
IF LT_ITEM IS INITIAL.
MESSAGE S005(ZTEST2021) WITH 'ZT200400102' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" 見出し
WRITE: / '品目コード',
020 '商品名',
050 '売上金額',
070 '仕入金額'.
" 全件出力
LOOP AT LT_ITEM INTO DATA(LS_ITEM).
WRITE: / LS_ITEM-MATNR,
020(24) LS_ITEM-ZTEXT,
050 LS_ITEM-ZAMT_SAL CURRENCY 'JPY',
070 LS_ITEM-ZAMT_PUR CURRENCY 'JPY'.
ENDLOOP.
*結果画面メッセージ出力
MESSAGE S001(ZTEST2021).
使用プログラム内のテーブル情報やデータの中身
■DBテーブル「ZT200400101」
【情報】
【データ】
■DBテーブル「ZT200400102」
【情報】
【データ】