"データオブジェクトやテーブルなどの宣言
TYPES:
BEGIN OF zty_test_select_fae,
bukrs type bkpf-bukrs,
belnr type bkpf-belnr,
gjahr type gjahr,
shkzg type shkzg,
dmbtr type dmbtr,
END OF zty_test_loop.
DATA: zd_test_loop type zty_test_loop,
zt_test_loop type standard table of zty_test_loop.
zt_test_loop_result type standard table of zty_test_loop,
"画面入力項目(PARAMETERS)宣言
PARAMETERS: p_bukrs type bukrs,
p_gjahr type gjahr.
"初期化
CLEAR: zd_test_loop,
zt_test_loop.
"DBテーブルからデータ取得
SELECT bukrs
belnr
gjahr
shkzg
dmbtr
FROM bseg
INTO TABLE zt_test_loop
WHERE bukrs = p_bukrs
AND gjahr = p_gjahr.
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
" 貸方の場合、マイナスにする
IF zd_test_loop-shkzg = 'H'.
zd_test_loop-dmbtr = zd_test_loop-dmbtr * -1.
ENDIF.
" 結果格納用テーブルに追加
APPEND zd_test_loop at zt_test_loop_result.
ENDLOOP.
"------------------------------
"条件を付けてLOOP
"初期化
CLEAR zd_test_loop.
"貸方の明細のみ読み込むことが可能
LOOP AT zt_test_loop INTO zd_test_loop WHERE shkzg = 'H'.
zd_test_loop-dmbtr = zd_test_loop-dmbtr * -1.
" 結果格納用テーブルに追加
APPEND zd_test_loop at zt_test_loop_result.
ENDLOOP.
"------------------------------
"フィールドシンボルを使用
"フィールドシンボルの宣言
FIELD-SYMBOLS <zfs_test_loop> LIKE LINE OF zt_test_loop.
"フィールドシンボルを変更した段階で元テーブルの値も変わるためAPPENDは不要
LOOP AT zt_test_loop ASSIGNING <zfs_test_loop>.
IF zd_test_loop-shkzg = 'H'.
zd_test_loop-dmbtr = zd_test_loop-dmbtr * -1.
ENDIF.
ENDLOOP.
"------------------------------
"Break Statement
"------------------------------
"AT FIRST
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
"LOOP1件目のみ格納する
AT FIRST.
APPEND zd_test_loop at zt_test_loop_result.
ENDAT.
ENDLOOP.
"------------------------------
"AT LAST
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
"LOOP最後のデータのみ格納する
AT LAST.
APPEND zd_test_loop at zt_test_loop_result.
ENDAT.
ENDLOOP.
"------------------------------
"AT NEW
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
"指定した項目が変わった場合のみ格納する
AT NEW belnr.
APPEND zd_test_loop at zt_test_loop_result.
ENDAT.
ENDLOOP.
"------------------------------
"AT END OF
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
"指定した項目が変わる前に格納する
AT END OF belnr.
APPEND zd_test_loop at zt_test_loop_result.
ENDAT.
ENDLOOP.
"------------------------------
"LOOP中の集計
"------------------------------
"COLLECT
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
" 貸方の場合、マイナスにする
IF zd_test_loop-shkzg = 'H'.
zd_test_loop-dmbtr = zd_test_loop-dmbtr * -1.
ENDIF.
" 結果格納用テーブルに追加 キーが被ったデータは数値データ型は合算される
COLLECT zd_test_loop INTO zt_test_loop_result.
ENDLOOP.
"------------------------------
"SUM
"初期化
CLEAR zd_test_loop.
LOOP AT zt_test_loop INTO zd_test_loop.
"指定した項目が変わった場合のみ
AT NEW belnr.
SUM.
ENDAT.
ENDLOOP.
"------------------------------
"DO LOOP
DATA zd_count type i.
"5回繰り返す 繰り返した回数をカウントする
DO 5 times.
zd_count = zd_count + 1.
ENDDO.
コメント