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

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

本章で習った内容を元にプログラムを作成してみましょう。
この練習問題プログラムでは、システム項目「SY」 について理解できているか確認します。
なお、練習問題プログラムは、以下の条件で作成しましょう。

プログラムID :ZRYYMMnnn_SY_PRACTICE
※YYMMは研修年月、 nnnは受講生番号

概要

この練習では、繰り返し処理で全件を出力するだけでなく、出力時に 行数(SY-TABIX) も表示します。
さらに、プログラムID(SY-CPROG)、実行ユーザー(SY-UNAME)、サーバー日付(SY-DATUM)、 サーバー時刻(SY-UZEIT)を出力し、システム項目の確認方法を身につけます。

● 選択画面から指定された「品目コード」(範囲指定)を抽出条件として、
売上テーブル:ZT200400101と仕入テーブル:ZT200400102を結合し、
仕入テーブルのみもしくは両方のテーブルに存在するデータを取得する。
● 対象データが存在しない場合は、エラーメッセージを出力し、選択画面に戻る。
● 対象データが存在する場合は、対象データ全件と行数を画面に出力する。
● プログラムID、実行ユーザー、サーバー日付、サーバ時刻を出力する ● 処理が完了したら、終了メッセージを出力する。
● 対象データ全件および行数が出力できるようにループを作成、かつシステム項目を出力する処理を作成

処理フロー

実行結果例

使用プログラム

*&---------------------------------------------------------------------*
*& プログラムID:プログラムIDを記入
*& プログラム名:練習問題(システム項目)
*& 概要          :選択画面に指定された品目コードと一致する売上テーブル、
*&                  仕入テーブルを外部結合で取得し、全件画面に出力する。
*& 作成日付  :YYYY/MM/DD
*& 作成者   :作成者名(受講生No xxxxxx )
*&---------------------------------------------------------------------*

REPORT Z_SAMPLE20PRACTICE_SY.
"------------------------------------------------------------
" 型定義:取得結果(仕入を基準に、売上を結合)
"------------------------------------------------------------

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命令)を作成
ここに繰り返し処理によって 対象データ全件と行数を出力する処理 を作成

SKIP.

ここに指定されたシステム項目を出力する処理を作成

*結果画面メッセージ出力
  MESSAGE S001(ZTEST2021).

使用プログラム(答え)

*&---------------------------------------------------------------------*
*& プログラムID:Z_SAMPLE20PRACTICE_SY 
*& プログラム名:練習問題(システム項数)
*& 概要          :選択画面に指定された品目コードと一致する売上テーブル、
*&                  仕入テーブルを外部結合で取得し、全件画面に出力する。
*& 作成日付  :YYYY/MM/DD
*& 作成者   :作成者名(受講生No xxxxxx )
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE20PRACTICE_SY.
"------------------------------------------------------------
" 型定義:取得結果(仕入を基準に、売上を結合)
"------------------------------------------------------------

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命令)を作成
  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.
SKIP.

“  システム項目の出力(まずは素直にそのまま表示)
  WRITE:  / 'プログラムID :', SY-CPROG,
         / '実行ユーザー :', SY-UNAME,
         / 'サーバー日付 :', SY-DATUM,
         / 'サーバー時刻 :', SY-UZEIT.
*結果画面メッセージ出力
  MESSAGE S001(ZTEST2021).

結果

使用プログラム内のテーブル情報やデータの中身

■DBテーブル「ZT200400101」

■DBテーブル「ZT200400102」


NEXT>> 第21章 DB操作

研修の詳細はこちら