1. Background Processing
ABAP 프로그램에는 주기적으로 실행되어야 하는 프로그램이 존재합니다. 주기적으로 실행되어야 하는 프로그램은 종료가 되면 안되기에 Background Processing을 사용합니다.
Background Processing: 주기적으로 실행되어야 하는 프로그램을 스케줄링(예약)
2. ALV Object Model (SALV)
ALV Object Model은 스크린 생성 없이 전체 스크린 모드로 ALV를 호출하거나 컨테이너를 이용하여 스크린 내의 컨트롤에서 ALV를 조회할 수도 있습니다. SALV라고도 합니다.
기존에 작성했던 ALV는 전부 스크린을 별도로 생성하고 함수를 호출하여 ALV를 생성해서 데이터를 확인해야 했지만 SALV는 그럴 필요가 없습니다. 하지만 SALV는 EDIT 모드를 지원하지 않습니다. 데이터를 수정할 수 없다는 거죠.
SALV를 화면에 출력하기 위해선 2개의 메소드를 사용합니다. 2개밖에 없으니 외우기 편합니다.
FACTORY: 화면에 출력할 데이터 정의
DISPLAY: 스크린에 ALV 조회
메소드는 드래그 앤 드롭으로도 호출이 가능합니다.
스크린 생성 없이 전체 스크린 모드로 ALV를 호출하는 방법뿐만 아니라 컨테이너를 이용하여 ALV를 조회할 수도 있습니다.
컨테이너는 5개가 있으며, 종류는 다음과 같습니다.
Area 필요: Custom Container (하나의 스크린에 ALV가 2개 있어야 할 경우에도 사용합니다.)
Area 불필요, 스크린 필요: Dialog Box Container (팝업 창으로 스크린을 띄우고 싶을 때에도 사용합니다.), Docking Container
다른 컨테이너 필요 (주로 Docking Container를 사용합니다.): Spliter Container (화면을 16x16으로 나눠서 사용 가능합니다.), Easy Spliter Container(화면을 가로x세로 2개로만 나눠서 사용 가능합니다.)
메소드 호출 구문은 아래 코드를 참조해주시기 바랍니다.
*Docking Container & ALV 그리드 참조 변수
DATA: GO_DOCK TYPE REF TO CL_GUI_DOCKING_CONTAINER,
GO_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID.
MODULE INIT_ALV OUTPUT.
IF GO_DOCK IS INITIAL.
CREATE OBJECT GO_DOCK
EXPORTING
REPID = SY-REPID
DYNNR = SY-DYNGR
SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_TOP
EXTENSION = 100
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
OTHERS = 6.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CREATE OBJECT GO_ALV_GRID
EXPORTING
I_PARENT = GO_DOCK
EXCEPTIONS
ERROR_CNTL_CREATE = 1
ERROR_CNTL_INIT = 2
ERROR_CNTL_LINK = 3
ERROR_DP_CREATE = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CALL METHOD GO_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_STRUCTURE_NAME = 'ZSCUST_BOOK_C24'
IS_LAYOUT = GS_LAYOUT
CHANGING
IT_OUTTAB = GT_DATA
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDMODULE.
3. Open SQL
ABAP 프로그램은 2개의 SQL을 사용합니다.
SQL의 종류는 Open SQL과 Native SQL로 나뉘며, Open SQL에서 데이터베이스 인터페이스를 이용하여 Native SQL로 전환할 수 있습니다.
Open SQL: ABAP 프로그램 내에서만 사용할 수 있는 SQL입니다.
Native SQL: ABAP 프로그램 뿐만 아니라 외부 프로그램에서도 사용할 수 있는 SQL입니다. 잘 쓰이진 않습니다.
이전 시간에 배운 LDB로는 CRUD를 진행할 수 없습니다. LDB또한 뷰를 통해 데이터를 확인하는 것이기 때문이죠
뷰는 가상 테이블로 데이터를 조회만 할 뿐 데이터를 수정, 삭제, 생성을 할 수 없습니다.
하지만 Open SQL은 CRUD를 이용하여 데이터를 생성, 수정, 삭제할 수 있습니다.
Open SQL에선 4가지 구문을 사용하여 CRUD를 진행할 수 있습니다.
1. Select: 데이터를 조회하는 구문입니다. 예시 코드는 다음과 같습니다.
SELECT <컬럼 이름 혹은 *(전체 컬럼)>
INTO <데이터를 넣을 스트럭처, 인터널 테이블>
FROM <테이블 이름>.
" 선택사항
[WHERE <조건>.]
[GROUP BY <그룹화할 컬럼>.]
[HAVING <그룹 조건>.]
[ORDER BY <정렬할 컬럼>.]
2. Insert: 데이터를 조회하는 구문입니다. 예시 코드는 다음과 같습니다.
* Work Area.
DATA: GS_CARRIER TYPE ZTSCARR_C24.
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF GS_CARRIER
FROM SCARR
WHERE CARRID = 'DL'.
INSERT ZTSCARR_C24 FROM GS_CARRIER.
IF SY-SUBRC = 0.
MESSAGE 'Success, Data Save' TYPE 'S'.
ELSE.
MESSAGE 'Error, Data save' TYPE 'E'.
ENDIF.
3. Update: 데이터를 조회하는 구문입니다. 예시 코드는 다음과 같습니다.
*work area.
DATA: GS_FLIGHT TYPE ZTSFLIGHT_C24.
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF GS_FLIGHT
FROM SFLIGHT
WHERE CARRID = 'AA'
AND CONNID = '0017'
AND FLDATE = '20230817'.
UPDATE ZTSFLIGHT_C24 SET PRICE = '559.50'
CURRENCY = 'EUR'
PLANETYPE = '747-200F'
SEATSMAX = GS_FLIGHT-SEATSMAX "385
SEATSOCC = GS_FLIGHT-SEATSOCC "375
WHERE CARRID = 'AA'
AND CONNID = '0017'
AND FLDATE = '20230817'.
IF SY-SUBRC = 0.
MESSAGE 'Success, Data Save' TYPE 'S'.
ELSE.
MESSAGE 'Error, Data save' TYPE 'E'.
ENDIF.
4. Delete: 데이터를 조회하는 구문입니다. 예시 코드는 다음과 같습니다.
REPORT ZABAP_C24_44.
DATA: GT_FLIGHT TYPE TABLE OF ZTSFLIGHT_C24,
GS_FLIGHT LIKE LINE OF GT_FLIGHT.
GS_FLIGHT-CARRID = 'AA'.
GS_FLIGHT-CONNID = '0017'.
GS_FLIGHT-FLDATE = '20230817'.
DELETE FROM ZTSFLIGHT_C24
WHERE PLANETYPE = '767-200'.
DELETE ZTSFLIGHT_C24 FROM TABLE GT_FLIGHT.
IF SY-SUBRC = 0.
MESSAGE 'Success, Data Save' TYPE 'S'.
ELSE.
MESSAGE 'Error, Data save' TYPE 'E'.
ENDIF.