ABAP의 Basic Syntax

kailyn·2024년 8월 4일

SAP

목록 보기
6/12

기본 문법

Hello, World!

REPORT zhello_world.
WRITE: 'Hello, World!'.

프로그램 헤더

모든 ABAP 프로그램은 프로그램 헤더로 시작한다.

REPORT zexample_program.  " 프로그램 이름 zexample_program 정의

ABAP 프로그램 구조

REPORT zexample_program.  " 프로그램 이름을 정의

DATA: lv_variable TYPE i.  " 변수 선언

START-OF-SELECTION.        " 메인 프로그램 실행 구간 시작
  WRITE: / 'Hello, World!'. " 화면에 출력
END-OF-SELECTION.          " 프로그램 실행 구간 끝
  • REPORT: 프로그램의 이름을 정의
  • DATA: 변수를 선언
  • START-OF-SELECTION: 프로그램의 메인 실행 부분
  • WRITE: 데이터를 화면에 출력

데이터 선언

  1. 변수 선언
    DATA: lv_counter TYPE i,        " 정수형 변수 lv_counter 선언
          lv_name    TYPE string.   " 문자열 변수 lv_name 선언
  2. 내부 테이블 선언
    DATA: lt_table TYPE TABLE OF string,  " 문자열을 요소로 가지는 내부 테이블 lt_table 선언
          ls_row   TYPE string.           " 문자열 변수 ls_row 선언
  3. 상수 선언
    CONSTANTS: lc_max_value TYPE i VALUE 100.  " 정수형 상수 lc_max_value 선언 및 초기값 100 할당

구조체 선언

TYPES: BEGIN OF ty_person,  " 구조체 ty_person 정의 시작
         name TYPE string,  " 문자열 필드 name 선언
         age  TYPE i,       " 정수형 필드 age 선언
       END OF ty_person.    " 구조체 ty_person 정의 끝

DATA: ls_person TYPE ty_person.  " ty_person 타입의 구조체 변수 ls_person 선언

기본 연산자

lv_counter = lv_counter + 1.  " lv_counter 변수의 값을 1 증가
lv_name = 'John Doe'.         " lv_name 변수에 'John Doe' 문자열 할당

제어 구조

  1. IF문

    IF lv_counter > 10.                    " lv_counter가 10보다 크면
      WRITE: / 'Counter is greater than 10'.  " 'Counter is greater than 10' 출력
    ELSEIF lv_counter = 10.                " lv_counter가 10과 같으면
      WRITE: / 'Counter is equal to 10'.   " 'Counter is equal to 10' 출력
    ELSE.                                  " 그 외의 경우
      WRITE: / 'Counter is less than 10'.  " 'Counter is less than 10' 출력
    ENDIF.
  2. CASE문

    CASE lv_counter.
     WHEN 1.
       WRITE: / 'Counter is 1'.  " lv_counter가 1인 경우 'Counter is 1' 출력
     WHEN 2.
       WRITE: / 'Counter is 2'.  " lv_counter가 2인 경우 'Counter is 2' 출력
     WHEN OTHERS.
       WRITE: / 'Counter is neither 1 nor 2'.  " 그 외의 경우 'Counter is neither 1 nor 2' 출력
    ENDCASE.
  3. DO문 (고정 반복)

    DO 10 TIMES.                     " 10회 반복
     WRITE: / 'Hello, World!'.      " 'Hello, World!' 출력
    ENDDO.
  4. WHILE문 (조건 반복)

    WHILE lv_counter < 10.           " lv_counter가 10보다 작은 동안 반복
      lv_counter = lv_counter + 1.   " lv_counter 값을 1 증가
      WRITE: / lv_counter.           " 증가된 lv_counter 값 출력
    ENDWHILE.
  5. LOOP AT문 (내부 테이블 반복)

    LOOP AT lt_table INTO ls_row.    " lt_table 내부 테이블의 각 행을 ls_row 변수에 할당하며 반복
      WRITE: / ls_row.               " ls_row 값 출력
    ENDLOOP.

서브루틴

FORM calculate_sum USING value1 TYPE i  " 서브루틴 calculate_sum 정의, 입력 파라미터 value1
                         value2 TYPE i  " 입력 파라미터 value2
                   CHANGING result TYPE i.  " 변경 파라미터 result
  result = value1 + value2.  " result에 value1과 value2의 합 할당
ENDFORM.

함수 모듈

FUNCTION zexample_function.
  IMPORTING
    value1 TYPE i  " 입력 파라미터 value1
    value2 TYPE i  " 입력 파라미터 value2
  EXPORTING
    result TYPE i.  " 출력 파라미터 result
  result = value1 + value2.  " result에 value1과 value2의 합 할당
ENDFUNCTION.

클래스와 메서드

CLASS lcl_example DEFINITION.
  PUBLIC SECTION.
    METHODS: calculate_sum IMPORTING iv_value1 TYPE i  " 메서드 calculate_sum 정의, 입력 파라미터 iv_value1
                                        iv_value2 TYPE i  " 입력 파라미터 iv_value2
                            RETURNING VALUE(rv_result) TYPE i.  " 반환 파라미터 rv_result
ENDCLASS.

CLASS lcl_example IMPLEMENTATION.
  METHOD calculate_sum.
    rv_result = iv_value1 + iv_value2.  " rv_result에 iv_value1과 iv_value2의 합 할당
  ENDMETHOD.
ENDCLASS.

예외 처리

  1. TRY...CATCH 블록
    TRY.
        " 예외가 발생할 수 있는 코드
      CATCH cx_sy_arithmetic_error INTO DATA(lx_arith_error).  " 산술 오류 예외 처리
        WRITE: / 'Arithmetic error occurred'.  " 'Arithmetic error occurred' 출력
      CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).  " 내부 테이블 라인 미발견 예외 처리
        WRITE: / 'Line not found in internal table'.  " 'Line not found in internal table' 출력
    ENDTRY.

데이터베이스 조회

REPORT zselect_example.

DATA: lt_flight TYPE TABLE OF sflight,
      ls_flight TYPE sflight.

SELECT * INTO TABLE lt_flight FROM sflight WHERE carrid = 'LH'.

LOOP AT lt_flight INTO ls_flight.
  WRITE: / ls_flight-carrid, ls_flight-connid, ls_flight-fldate.
ENDLOOP.

데이터베이스 접근

  1. SELECT 문
    SELECT * INTO TABLE lt_table  " 테이블 sflight의 모든 데이터를 lt_table 내부 테이블에 선택하여 저장
    FROM sflight
    WHERE carrid = 'LH'.          " 조건: 항공사 코드가 'LH'인 경우
  2. INSERT 문
    INSERT INTO sflight VALUES ('LH', '400', '20230729', 'FRA', 'JFK', '747', 200, 150, 50).  " 테이블 sflight에 새 레코드 삽입
  3. UPDATE 문
    UPDATE sflight SET seatsmax = 300  " 테이블 sflight에서 조건에 맞는 레코드의 seatsmax 필드를 300으로 업데이트
    WHERE carrid = 'LH' AND connid = '400'.  " 조건: 항공사 코드가 'LH'이고 연결 ID가 '400'인 경우
  4. DELETE 문
    DELETE FROM sflight  " 테이블 sflight에서 조건에 맞는 레코드 삭제
    WHERE carrid = 'LH' AND connid = '400'.  " 조건: 항공사 코드가 'LH'이고 연결 ID가 '400'인 경우

메시지 처리

MESSAGE 'This is an information message' TYPE 'I'.  " 정보 메시지 출력

데이터 형 변환

  1. 명시적 형 변환
    lv_int = CONV i( lv_string ).  " lv_string을 정수형으로 변환하여 lv_int에 할당

필드 심볼

FIELD-SYMBOLS: <fs_value> TYPE any.  " 모든 타입을 참조할 수 있는 필드 심볼 <fs_value> 선언

ASSIGN lv_counter TO <fs_value>.  " lv_counter 변수를 <fs_value> 필드 심볼에 할당
IF sy-subrc = 0.  " 할당 성공 시
  WRITE: / <fs_value>.  " <fs_value> 값을 출력 (lv_counter의 값)
ENDIF.

동적 호출

DATA(lv_method_name) = 'calculate_sum'.  " 호출할 메서드 이름을 lv_method_name에 할당
CALL METHOD lcl_example=>lv_method_name  " 동적 메서드 호출
  EXPORTING
    iv_value1 = 10
    iv_value2 = 20
  RECEIVING
    rv_result = lv_result.

이벤트 처리

  1. 이벤트 선언

    CLASS lcl_event_example DEFINITION.
      PUBLIC SECTION.
        EVENTS: event_example.  " 이벤트 event_example 선언
        METHODS: trigger_event.  " 메서드 trigger_event 선언
    ENDCLASS.
    
    CLASS lcl_event_example IMPLEMENTATION.
      METHOD trigger_event.
        RAISE EVENT event_example.  " event_example 이벤트 발생
      ENDMETHOD.
    ENDCLASS.
  2. 이벤트 핸들러

    CLASS lcl_handler DEFINITION.
      PUBLIC SECTION.
        METHODS: on_event_example FOR EVENT event_example OF lcl_event_example.  " 이벤트 핸들러 메서드 on_event_example 선언
    ENDCLASS.
    
    CLASS lcl_handler IMPLEMENTATION.
      METHOD on_event_example.
        WRITE: / 'Event triggered'.  " 'Event triggered' 메시지 출력
      ENDMETHOD.
    ENDCLASS.
  3. 이벤트 연결

    DATA: lo_example TYPE REF TO lcl_event_example,  " lcl_event_example 클래스의 인스턴스 참조 변수 lo_example 선언
          lo_handler TYPE REF TO lcl_handler.        " lcl_handler 클래스의 인스턴스 참조 변수 lo_handler 선언
    
    CREATE OBJECT lo_example.  " lcl_event_example 클래스의 인스턴스 생성
    CREATE OBJECT lo_handler.  " lcl_handler 클래스의 인스턴스 생성
    
    SET HANDLER lo_handler->on_event_example FOR lo_example.  " lo_example 객체의 event_example 이벤트에 lo_handler->on_event_example 핸들러 연결
    
    CALL METHOD lo_example->trigger_event.  " lo_example 객체의 trigger_event 메서드 호출
profile
나는 할 수 있다...!

0개의 댓글