SAP ABAPサンプルプログラム（コピーペースト利用可）

典型的なSAP ERP ABAPサンプルレポートプログラムを共有しようと思います。通常簡略化される入門の「Hello World」ではなくて、本物ののプロジェクトで利用可能なサンプルコードです。コメント（概要説明、改修履歴）、タイプ宣言、固定値宣言、グロバール変数宣言、選択画面定義、初期化処理、主処理（入力チェック、データ取得、データ更新、結果出力）、サブルーチンを含めます。
#サンプルソースコード#
<code>
*&---------------------------------------------------------------------*
*& PID ：Y_SD_SAMPLE
*& 機能：ABAP入門講座典型的なサンプルプログラム
*&---------------------------------------------------------------------*
*&バージョン　日付　変更者　概要
*&---------------------------------------------------------------------*
*&1.0.0   2020/09/30  三思　新規作成
*&1.0.1   2020/10/01  三思　検索条件追加
*&---------------------------------------------------------------------*

REPORT  Y_SD_SAMPLE.

*&---------------------------------------------------------------------*
*&タイプ宣言
*&---------------------------------------------------------------------*
TYPE-POOLS abap.

TYPES:
  gtr_vbeln     TYPE RANGE OF vbeln,      "レンジテーブル：販売伝票番号
* 受注情報
  BEGIN OF gts_vbap,
    vbeln       TYPE vbeln,             "販売管理伝票番号
    posnr       TYPE posnr,             "明細番号
    matnr       TYPE matnr,             "品目コード
    kwmeng      TYPE kwmeng,            "累積受注数量 (販売単位)
  END OF gts_vbap,
  gtt_vbap  TYPE STANDARD TABLE OF gts_vbap.

*&---------------------------------------------------------------------*
*&コンスタント
*&---------------------------------------------------------------------*
CONSTANTS:
* エラーメッセージのタイプ
  BEGIN OF gc_s_msg_type,
    error     TYPE symsgty VALUE 'E',     "エラー
    normal    TYPE symsgty VALUE 'S',     "正常
  END OF gc_s_msg_type.

*&---------------------------------------------------------------------*
*&データ宣言
*&---------------------------------------------------------------------*
DATA:
  gv_vbeln      TYPE vbeln,               "販売管理伝票番号
  gt_vbap       TYPE gtt_vbap.            "受注情報


*&---------------------------------------------------------------------*
*&選択画面
*&---------------------------------------------------------------------*
PARAMETERS p_bukrs TYPE bukrs OBLIGATORY.
SELECT-OPTIONS s_vbeln FOR gv_vbeln.

*&---------------------------------------------------------------------*
*&初期処理
*&---------------------------------------------------------------------*
INITIALIZATION.
  PERFORM f_init.

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


*&---------------------------------------------------------------------*
*& サブルーチン
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& 初期化処理
*&---------------------------------------------------------------------*
*
*&---------------------------------------------------------------------*
FORM f_init.

  CLEAR:
    gv_vbeln,
    gt_vbap.

ENDFORM.                    "f_init

*&---------------------------------------------------------------------*
*& データを取得し、出力する
*&---------------------------------------------------------------------*
*
*&---------------------------------------------------------------------*
FORM f_main.
  DATA:
    lv_chk_flg    TYPE flag.      "チェックフラグ

  CLEAR:
    gt_vbap.

*入力チェックを行う
  PERFORM f_check
    USING
      p_bukrs
      s_vbeln[]
    CHANGING
      lv_chk_flg.
  IF lv_chk_flg IS NOT INITIAL.
    LEAVE LIST-PROCESSING.
  ENDIF.

* 販売伝票情報を取得する
  PERFORM f_get_data
    USING
      p_bukrs
      s_vbeln[]
    CHANGING
      lv_chk_flg
      gt_vbap.
  IF lv_chk_flg IS NOT INITIAL.
    LEAVE LIST-PROCESSING.
  ENDIF.

* データの更新処理を行う
  PERFORM f_update_data
    USING
      gt_vbap
    CHANGING
      lv_chk_flg.

* 処理結果を出力する
  PERFORM f_output
    USING
      gt_vbap.

ENDFORM.                    "f_main

*&---------------------------------------------------------------------*
*& 入力チェックを行う
*&---------------------------------------------------------------------*
* --> u_bukrs       会社コード
* --> u_r_vbeln     販売管理伝票番号
* <-- ch_chk_flg    エラーフラグ
*&---------------------------------------------------------------------*
FORM f_check
  USING
    u_bukrs     TYPE bukrs
    u_r_vbeln   TYPE gtr_vbeln
  CHANGING
    ch_chk_flg  TYPE flag.

  CLEAR:
    ch_chk_flg.

  IF u_r_vbeln IS INITIAL.
*   有効な値を入力してください
    MESSAGE s002(00) DISPLAY LIKE gc_s_msg_type-error.
    ch_chk_flg = abap_on.
  ENDIF.
  CHECK ch_chk_flg IS INITIAL.

ENDFORM.                    "f_check

*&---------------------------------------------------------------------*
*& 販売伝票情報を取得する
*&---------------------------------------------------------------------*
* --> u_bukrs       会社コード
* --> u_r_vbeln     販売管理伝票番号
* <-- ch_chk_flg    エラーフラグ
* <-- ch_t_vbap     販売明細情報
*&---------------------------------------------------------------------*
FORM f_get_data
  USING
    u_bukrs    TYPE bukrs
    u_r_vbeln  TYPE gtr_vbeln
  CHANGING
    ch_chk_flg TYPE flag
    ch_t_vbap  TYPE gtt_vbap.

  CHECK ch_chk_flg IS INITIAL.

  SELECT
    p~vbeln                       "販売管理伝票番号
    p~posnr                       "明細番号
    p~matnr                       "品目コード
    p~kwmeng                      "累積受注数量 (販売単位)
  FROM vbak AS k
  INNER JOIN  vbap AS p
    ON k~vbeln   = p~vbeln
  INTO TABLE ch_t_vbap
  WHERE k~bukrs_vf = u_bukrs     "会社コード
    AND k~vbeln IN u_r_vbeln.    "販売管理伝票番号

  IF sy-subrc <> 0.
    ch_chk_flg = abap_on.
*   データを取得できませんでした
    MESSAGE s001(y01) DISPLAY LIKE gc_s_msg_type-error.
  ENDIF.
  CHECK ch_chk_flg IS INITIAL.

ENDFORM.                    "f_get_data

*&---------------------------------------------------------------------*
*& データの更新処理を行う
*&---------------------------------------------------------------------*
* --> u_t_vbap      販売明細情報
* <-- ch_chk_flg    エラーフラグ
*&---------------------------------------------------------------------*
FORM f_update_data
  USING
    u_t_vbap   TYPE gtt_vbap
  CHANGING
    ch_chk_flg TYPE flag.

  CHECK ch_chk_flg IS INITIAL.

* ここで更新処理を追加する

ENDFORM.                    "f_update_data

*&---------------------------------------------------------------------*
*& 処理結果を出力する
*&---------------------------------------------------------------------*
* --> u_t_vbap      販売明細情報
*&---------------------------------------------------------------------*
FORM f_output
  USING
    u_t_vbap   TYPE gtt_vbap.

  DATA:
    ls_vbap    TYPE gts_vbap.

  LOOP AT u_t_vbap INTO ls_vbap.
    WRITE:
      /5(10)  ls_vbap-vbeln,
       17(6)  ls_vbap-posnr,
       25(40) ls_vbap-matnr,
       67(15) ls_vbap-kwmeng.
  ENDLOOP.

ENDFORM.                    "f_output
</code>
#補足
１、チェックが発生した場合、画面遷移しない。「LEAVE LIST-PROCESSING.」によって制御します。
２、テーブルからデータを取得できなかった場合、画面遷移しない。「LEAVE LIST-PROCESSING.」によって制御します。データがなくても結果画面へ遷移する仕様であれば、上記コマンドを削除してください。