練習問題(計算式)

19.4 練習問題(計算式)

4. 練習問題(計算式)

本章で習った内容を元にプログラムを作成してみましょう。
この練習問題プログラムでは、計算式 について理解できているか確認します。
なお、練習問題プログラムは、以下の条件で作成しましょう。
プログラムID :ZRYYMMnnn_xxx_(任意)
※YYは年度 MMは月 nnnは氏名(ローマ字) xxxは任意の数値

概要

選択画面から指定された「品目コード」(単一)を抽出条件として、
売上テーブル:ZT200400101と仕入テーブル:ZT200400102を結合し、
両方のテーブルに存在するデータを取得後
その取得結果を出力する

ただし、取得結果が0件場合(該当の品目コードが存在しない場合)エラーメッセージを出力し
選択画面へ戻る

取得結果が1件以上の場合、
取得したデータから損益(売上金額 – 仕入金額)を求め、結果を出力する。

上記、取得結果を条件とする条件分岐を作成
かつ
損益(売上金額 – 仕入金額)を求める計算処理
かつ
損益結果を出力する処理を追加する

処理フロー

実行結果例

使用プログラム

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

*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
  WK_ANS  TYPE ZT200400101-ZAMT_SAL, "計算結果格納用
  WK_CHAR TYPE CHAR4.                "文字列格納用

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


*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*内部結合を利用しDBテーブルを読み込み
  SELECT SINGLE
         ZT200400101~MATNR     "品目コード
         ZT200400101~ZTEXT     "テキスト
         ZT200400101~ZAMT_SAL  "売上金額
         ZT200400102~ZAMT_PUR  "仕入金額
    FROM ZT200400101
    INNER JOIN ZT200400102
    ON ZT200400101~MATNR = ZT200400102~MATNR
    INTO ST_GET_TABLE
    WHERE ZT200400101~MATNR = P_MATNR.

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

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

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

*結果画面
    WRITE:    '品目コード',
                  020 ST_GET_TABLE-MATNR,
               / '商品名',
                  020(24) ST_GET_TABLE-TEXT,
               / '売上金額',
                  020 ST_GET_TABLE-AMT_SAL CURRENCY  'JPY' LEFT-JUSTIFIED,
               / '仕入金額',
                  020 ST_GET_TABLE-AMT_PUR CURRENCY  'JPY' LEFT-JUSTIFIED,
               / '損益',
                  020 WK_ANS CURRENCY  'JPY' LEFT-JUSTIFIED,
                  040 WK_CHAR.

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

END-OF-SELECTION.

使用プログラム(答え)

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

*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
  WK_ANS  TYPE ZT200400101-ZAMT_SAL, "計算結果格納用
  WK_CHAR TYPE CHAR4.                "文字列格納用

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


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

*内部結合を利用しDBテーブルを読み込み
  SELECT SINGLE
         ZT200400101~MATNR     "品目コード
         ZT200400101~ZTEXT     "テキスト
         ZT200400101~ZAMT_SAL  "売上金額
         ZT200400102~ZAMT_PUR  "仕入金額
    FROM ZT200400101
    INNER JOIN ZT200400102
    ON ZT200400101~MATNR = ZT200400102~MATNR
    INTO ST_GET_TABLE
    WHERE ZT200400101~MATNR = P_MATNR.

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

*損益計算
    WK_ANS = ST_GET_TABLE-AMT_SAL - ST_GET_TABLE-AMT_PUR. "売上金額-仕入金額

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








*結果画面
    WRITE:    '品目コード',
                  020 ST_GET_TABLE-MATNR,
               / '商品名',
                  020(24) ST_GET_TABLE-TEXT,
               / '売上金額',
                  020 ST_GET_TABLE-AMT_SAL CURRENCY  'JPY' LEFT-JUSTIFIED,
               / '仕入金額',
                  020 ST_GET_TABLE-AMT_PUR CURRENCY  'JPY' LEFT-JUSTIFIED,
               / '損益',
                  020 WK_ANS CURRENCY  'JPY' LEFT-JUSTIFIED,
                  040 WK_CHAR.

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

END-OF-SELECTION.

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

■DBテーブル「ZT200400101」

【情報】

【データ】

■DBテーブル「ZT200400102」

【情報】

【データ】

補足(CHAR4について)

SE11から確認できますが、SAP標準のデータエレメントで、CHAR<数字>というものがたくさん用意されています。
いずれも文字型で、<数字>の部分によって桁数が変わるデータエレメントとなります。
例:CHAR4→4桁の文字列のデータエレメント CHAR100→100桁の文字列のデータエレメント
うまく利用すれば変数宣言時に長さを指定する手間を省けます。
またデータ型の確認としてはご認識のとおりSE11:ABAPディクショナリの画面からドメイン照会を行う方法だけとなります。
標準テーブルから確認したい場合は、ドメインであればDD01L、データエレメントであればDD04Lから一覧として参照可能です。


NEXT>> 第20章 基本的な命令文②