SAP ABAP: Call Perform đệ quy trong Chương trình

Ngày 13 tháng 9 năm 2017 | 405 views

Call Perform đệ quy trong ABAP program.

Giải sử chúng ta có một yêu cầu lấy ra danh sách 6 or n kỳ trước từ kỳ hiện tại bảng TFKPERIOD trong SAP S/r3 và hiển thị trên màn hình.

Thông tin bảng TFKPERIOD:

  • TFKPERIOD-PERSL: Mã kỳ
  • TFKPERIOD- ABRZU: Ngày bắt đầu kỳ
  • TFKPERIOD- ABRZO: Ngày kết thúc của kỳ
  • TFKPERIOD- PREDC: Mã kỳ trước

Ở ví dụ này chúng ta viết một ABAP Report đơn giản để thực hiện:

  • Tham số đầu vào: Số kỳ cần lấy ra “”; Kỳ bắt đầu: Có thể kỳ tháng, quý năm…vv
  • Hiển thị danh sách kỳ ra màn hình output
  • Sử dụng hai event: Start-of-selection: lấy dữ liệu; End-of-selection: write dữ liệu ra màn hình

Khai báo chương trình

REPORT ZPG_0001_03.

Định nghĩa data để lưu trữ dữ liệu

DATA:
  GT_PERIOD TYPE TABLE OF TFKPERIOD,
  GS_PERIOD TYPE TFKPERIOD,
  GW_COUNT  TYPE INT1.

Định nghĩa tham số của màn hình selection:

PARAMETERS:
  P_INT   TYPE INT1,
  P_PERST TYPE TFKPERIOD-PERSL.

Trong đó : P_INT: số lần đệ quy để lấy kỳ trước ví dụ P_int = 2 thì ta lấy được danh sách 2 kỳ từ kỳ bắt đầu P_PERST.

Event: Start-of-selection

START-OF-SELECTION.
  GW_COUNT = 1.
  " Get Period recursive
  PERFORM GET_PERIOD
    USING P_PERST
    CHANGING GW_COUNT.

Biến gw_count: để dùng kiểm tra nếu gw_count > p_int thì sẽ dừng đệ quy

Perform get_period: gồm 2 tham số: kỳ bắt đầu và lần đệ quy hiện tại: gw_count, ở đây ta sử dụng changing để thay lưu giá trị của gw_count sau mỗi lần gọi perform get_period

Chi tiết perform get_period:

FORM GET_PERIOD
  USING LPW_PERIOD TYPE PERSL_KK
  CHANGING LPW_INT TYPE INT1.
  DATA:
        LS_PERIOD TYPE TFKPERIOD.

  " Get Period
  SELECT SINGLE * FROM TFKPERIOD
    INTO LS_PERIOD
    WHERE PERSL = LPW_PERIOD.

  IF SY-SUBRC IS NOT INITIAL.
    RETURN.
  ELSE.
    APPEND LS_PERIOD TO GT_PERIOD.
    LPW_INT = LPW_INT + 1.
  ENDIF.

  " Get Preview Period
  IF LPW_INT > P_INT AND P_INT IS NOT INITIAL.
    RETURN.
  ENDIF.

  "Call Perform recursive: get period previous
  PERFORM GET_PERIOD
    USING LS_PERIOD-PREDC
    CHANGING LPW_INT.

ENDFORM.                    " GET_PERIOD

 

Sau khi thực hiện đệ quy để lấy ra danh sách kỳ xong ta hiển thị dữ liệu ra màn hình:

 

END-OF-SELECTION.
  WRITE:  /(10) 'Period',
           (10) 'Date From',
           (20) 'Date To',
           (20) 'Period Previous'.
  LOOP AT GT_PERIOD INTO GS_PERIOD.
    WRITE: /(10) GS_PERIOD-PERSL,
            (10) GS_PERIOD-ABRZU,
            (20) GS_PERIOD-ABRZO,
            (20) GS_PERIOD-PREDC.
    NEW-LINE.
  ENDLOOP.

 

Kết quả thực hiện:

Select-Option From To

Ngày 07 tháng 11 năm 2018

07-11-2018
55
Search Help(F4 Help)

Ngày 02 tháng 10 năm 2017

02-10-2017
217
Create Database View in ABAP DDIC

Ngày 22 tháng 9 năm 2017

22-09-2017
235