練習問題(繰り返し処理)

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」

【情報】

【データ】


NEXT>> 20.4 練習問題(システム項目「SY」)

研修の詳細はこちら