練習問題(計算式)

19.4 練習問題(計算式)

4. 練習問題(計算式)

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

プログラムID :ZRYYMMnnn_CALC_PRACTICE
※YYは年度、MMは月、nnnは受講生番号

概要

IF練習と同様に結合して取得し、該当なしはメッセージ+RETURN で終了します。
該当ありの場合は、「損益(売上 − 仕入)」を計算し、結果が正なら「利益」、それ以外なら「損失」を表示します。

● 選択画面から指定された「品目コード」(単一)を抽出条件として、
売上テーブル:ZT200400101と仕入テーブル:ZT200400102を結合し、
両方のテーブルに存在するデータを取得後、その取得結果を出力します。
● ただし、取得結果が0件場合(該当の品目コードが存在しない場合)エラーメッセージを出力し 選択画面へ戻ります。
● 結果が1件以上の場合、取得したデータから損益(売上金額 – 仕入金額)を求め、結果を出力します。

処理フロー

実行結果例

使用プログラム

*&---------------------------------------------------------------------*
*& プログラムID:プログラムIDを記入
*& プログラム名:練習問題(計算式)
*& 概要          :内部結合で取得した仕入テーブル、売上テーブルのデータを元に
*&                  品目テキスト(MAKT)のデータを取得し、1件を画面に出力する。
*& 作成日付  :yyyy/mm/dd
*& 作成者   :作成者名(受講生No xxxxxx)
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE19PRACTICE_CALC.
*&---------------------------------------------------------------------*
* 型定義
*&---------------------------------------------------------------------*
TYPES:
* 売上テーブル、仕入テーブル格納用
TYPES: BEGIN OF TY_ITEM_RESULT,
         MATNR    TYPE  ZT200400101-MATNR,        " 品目コード
         ZTEXT    TYPE  ZT200400101-ZTEXT,        " 商品名(仕様の型に合わせる)
         ZAMT_SAL TYPE  ZT200400101-ZAMT_SAL,     " 売上金額
         ZAMT_PUR TYPE  ZT200400102-ZAMT_PUR,     " 仕入金額
       END OF TY_ITEM_RESULT.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA: LS_RESULT TYPE TY_ITEM_RESULT,
      LV_PROFIT TYPE ZAMT_SAL,  " 損益(型は金額系に寄せる:仕様の型に合わせる)
      LV_LABEL  TYPE C LENGTH 6.    " 利益/損失


*&---------------------------------------------------------------------*
* パラメータ定義
*&---------------------------------------------------------------------*
PARAMETERS P_MATNR TYPE MATNR OBLIGATORY.  "品目コード

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*内部結合を利用しDBテーブルを読み込み
 " 売上(ZT200400101)と仕入(ZT200400102)を品目コードで結合して1件取得
  SELECT SINGLE
         A~MATNR,
         A~ZTEXT,
         A~ZAMT_SAL,
         B~ZAMT_PUR
    FROM ZT200400101 AS A
    INNER JOIN ZT200400102 AS B
      ON B~MATNR = A~MATNR
    WHERE A~MATNR = @P_MATNR
    INTO CORRESPONDING FIELDS OF @LS_RESULT.

*品目コードが存在しない場合エラーメッセージを出力し選択画面へ
    ここに条件処理

*損益計算
    ここに計算処理 "売上金額-仕入金額

*計算結果が正なら「利益」、負なら「損失」を変数へ格納
    ここに条件処理

*結果画面
  WRITE: 
/ |品目コード:{ LS_RESULT-MATNR }|,
         / |商品名  :{ LS_RESULT-ZTEXT }|,
         / |売上金額 :{ LS_RESULT-ZAMT_SAL NUMBER = USER }|,
         / |仕入金額 :{ LS_RESULT-ZAMT_PUR NUMBER = USER }|,
/ |損益   :{ LV_PROFIT NUMBER = USER }({ LV_LABEL })|.

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

使用プログラム(答え)

*&---------------------------------------------------------------------*
*& プログラムID:プログラムIDを記入
*& プログラム名:練習問題(計算式)
*& 概要          :内部結合で取得した仕入テーブル、売上テーブルのデータを元に
*&                  品目テキスト(MAKT)のデータを取得し、1件を画面に出力する。
*& 作成日付  :yyyy/mm/dd
*& 作成者   :作成者名(受講生No xxxxxx)
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE19PRACTICE_CALC.
*&---------------------------------------------------------------------*
* 型定義
*&---------------------------------------------------------------------*
TYPES:
* 売上テーブル、仕入テーブル格納用
TYPES: BEGIN OF TY_ITEM_RESULT,
         MATNR    TYPE  ZT200400101-MATNR,        " 品目コード
         ZTEXT    TYPE  ZT200400101-ZTEXT,        " 商品名(仕様の型に合わせる)
         ZAMT_SAL TYPE  ZT200400101-ZAMT_SAL,     " 売上金額
         ZAMT_PUR TYPE  ZT200400102-ZAMT_PUR,     " 仕入金額
       END OF TY_ITEM_RESULT.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA: LS_RESULT TYPE TY_ITEM_RESULT,
      LV_PROFIT TYPE ZAMT_SAL,  " 損益(型は金額系に寄せる:仕様の型に合わせる)
      LV_LABEL  TYPE C LENGTH 6.    " 利益/損失


*&---------------------------------------------------------------------*
* パラメータ定義
*&---------------------------------------------------------------------*
PARAMETERS P_MATNR TYPE MATNR OBLIGATORY.  "品目コード

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*内部結合を利用しDBテーブルを読み込み
 " 売上(ZT200400101)と仕入(ZT200400102)を品目コードで結合して1件取得
  SELECT SINGLE
         A~MATNR,
         A~ZTEXT,
         A~ZAMT_SAL,
         B~ZAMT_PUR
    FROM ZT200400101 AS A
    INNER JOIN ZT200400102 AS B
      ON B~MATNR = A~MATNR
    WHERE A~MATNR = @P_MATNR
    INTO CORRESPONDING FIELDS OF @LS_RESULT.

*品目コードが存在しない場合エラーメッセージを出力し選択画面へ
  IF SY-SUBRC <> 0.
    MESSAGE S002(ZTEST2021) WITH P_MATNR '品目コード' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

*損益計算
  LV_PROFIT = LS_RESULT-ZAMT_SAL - LS_RESULT-ZAMT_PUR. "売上金額-仕入金額

*計算結果が正なら「利益」、負なら「損失」を変数へ格納
  IF LV_PROFIT > 0.
    LV_LABEL = '利益'.
  ELSE.
    LV_LABEL = '損失'.
  ENDIF.

*結果画面
  WRITE: 
/ |品目コード:{ LS_RESULT-MATNR }|,
         / |商品名  :{ LS_RESULT-ZTEXT }|,
         / |売上金額 :{ LS_RESULT-ZAMT_SAL NUMBER = USER }|,
         / |仕入金額 :{ LS_RESULT-ZAMT_PUR NUMBER = USER }|,
/ |損益   :{ LV_PROFIT NUMBER = USER }({ LV_LABEL })|.

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

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

■DBテーブル「ZT200400101」

【情報】
【データ】

■DBテーブル「ZT200400102」

【情報】
【データ】

補足(CHAR4について)

CHAR4は、SAP標準で用意されているデータ要素の1つで、長さ4の文字列を表します。
同様に、CHAR10やCHAR100のように、桁数違いのデータ要素も多数用意されています。
こうしたデータ要素を利用すると、変数宣言で長さを毎回指定する手間を減らせます。
SE11から確認できますが、SAP標準のデータエレメントで、CHAR<数字>というものがたくさん用意されています。


NEXT>> 第20章 20章 繰り返し処理とシステム項目

研修の詳細はこちら