典型的なSAP ERP ABAPサンプルレポートプログラムを共有しようと思います。通常簡略化される入門の「Hello World」ではなくて、本物ののプロジェクトで利用可能なサンプルコードです。コメント(概要説明、改修履歴)、タイプ宣言、固定値宣言、グロバール変数宣言、選択画面定義、初期化処理、主処理(入力チェック、データ取得、データ更新、結果出力)、サブルーチンを含めます。
#サンプルソースコード#
&---------------------------------------------------------------------
*& 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
#補足
1、チェックが発生した場合、画面遷移しない。「LEAVE LIST-PROCESSING.」によって制御します。
2、テーブルからデータを取得できなかった場合、画面遷移しない。「LEAVE LIST-PROCESSING.」によって制御します。データがなくても結果画面へ遷移する仕様であれば、上記コマンドを削除してください。