LOOP系

"データオブジェクトやテーブルなどの宣言
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.

コメント

タイトルとURLをコピーしました