본문으로 바로가기




TAW10_1 Exercise 13: Basic ABAP Statements

아밥 기본 구문


Execrise Objectives

이번 예제를 통해 배울 수 있는 것

·Elementary 데이터 오브젝트 생성

·오브젝트에 값 할당

·조건 분기 선언

·계산 수행


Business Example

해당 값과 연산자를 입력 받아서 사칙연산(+-*/)을 할 수 있는 아밥 프로그램을 만듭니다.


Task 1:

프로그램 생성

1.'TOP include'에 체크를 풀고 프로그램 'ZBC400_01_COMPUTE'을 생성하자.


Task 2:

입력 파라메터를 선언하자(선택 화면에 대한 묵시적인 선언이다)

1.두개의 정수형 값을 넘겨줄 수 있는 입력 파라메터를 생성하자(추천 이름은 'pa_int1', 'pa_int2' 이다) 그리고 산술 연산자도 선언해 주자(추천 이름은 'pa_op').


Task 3:

계산을 하고 결과를 LIST화면에 출력하도록 만들자.

1.추가로 결과 값에 대한 데이터 오브젝트를 선언하자. 타입은 두자리의 소수점자리를 가지는 Packed number로 하자.(추천 이름은 'result' 이다).


2.지정된 산술 연산자로 계산을 수행하자. CASE문을 사용하면 된다.


3.결과를 화면에 출력하자.


Tesk 4:

잘못된 입력 확인 하기.

1.사용자가 잘못된 연산자(+-*/ 말고 다른 것)를 입력한 경우 리스트 화면에 에러 메세지를 출력하자. IF문을 사용해서 확인 하면 된다.


2.사용자가 0으로 나누려고 할 경우 에러메세지를 출력하자.

Hint:다음 장에서 조금 더 세련된 방법으로 에러를 잡는 법을 배울 것이니 걱정말자.



이번 연습문제에서 해볼 것은 위와 같다. 하나씩 해보도록 하자.

Task 1:

프로그램 생성

1.'TOP include'에 체크를 풀고 프로그램 'ZBC400_01_COMPUTE'을 생성하자.


Task 2:

입력 파라메터를 선언하자(선택 화면에 대한 묵시적인 선언이다)

1.두개의 정수형 값을 넘겨줄 수 있는 입력 파라메터를 생성하자(추천 이름은 'pa_int1', 'pa_int2' 이다) 그리고 산술 연산자도 선언해 주자(추천 이름은 'pa_op').

이거부터 해보자.

일단 그냥 변수가 아니고 'parameter'이므로 일반 변수 선언 명령어인 'DATA'대신에 'PARAMETERS'를 사용하자.

PARAMETER 3개를 선언하는 코드는 아래와 같다.

---------------------------------------
PARAMETERS pa_int1 TYPE i.
PARAMETERS pa_int2 TYPE i.
PARAMETERS pa_op(1TYPE c.
---------------------------------------

아래 화면과 같이 입력 해주면 된다.


Task 3:

계산을 하고 결과를 LIST화면에 출력하도록 만들자.

1.추가로 결과 값에 대한 데이터 오브젝트를 선언하자. 타입은 두자리의 소수점자리를 가지는 Packed number로 하자.(추천 이름은 'result' 이다).

아래 소스코드 한줄 추가해주면 된다.

DATA  result type DECIMALS 2.





2.지정된 산술 연산자로 계산을 수행하자. CASE문을 사용하면 된다.

----------------------------

CASE pa_op(1).
  when '+'.
    result pa_int1 + pa_int2.
  when '-'.
    result pa_int1 pa_int2.
  when '*'.  
    result pa_int1 * pa_int2.
  when '/'.
    result pa_int1 / pa_int2.
ENDCASE.

----------------------------



3.결과를 화면에 출력하자.

맨 밑에 

WRITE result.

한줄 추가해 준다.


실행 해보자.

단축키'F8'로 실행 할 수 있다.

'F8'을 눌러보자.


이런 화면이 나온다.

10+20 을 해보자.


좌측 상단 '실행'버튼을 누르거나 단축키 'F8'을 누르면 실행 된다.

결과값 '30'이 나온다.


Tesk 4:

잘못된 입력 확인 하기.

1.사용자가 잘못된 연산자(+-*/ 말고 다른 것)를 입력한 경우 리스트 화면에 에러 메세지를 출력하자. IF문을 사용해서 확인 하면 된다.


입력을 받은 다음에 입력 받은 값을 가지고 에러메세지를 띄울지 다음으로 넘어갈지 판단하는 로직을 넣어보자.


IF NOT ( pa_op(1) = '+' OR
         pa_op(1) = '-' OR
         pa_op(1) = '*' OR
         pa_op(1) = '/' ).

  WRITE: 'Invalid Operator'.

ELSE.
  CASE pa_op(1).
    WHEN '+'.
      result = pa_int1 + pa_int2.
    WHEN '-'.
      result = pa_int1 - pa_int2.
    WHEN '*'.
      result = pa_int1 * pa_int2.
    WHEN '/'.
      result = pa_int1 / pa_int2.
  ENDCASE.

  WRITE result.
ENDIF.


IF문으로 감싸주면 가볍게 끝난다. 코드가 점점 길어지니 소스코드 캡춰 화면은 생략하고 결과 화면만 보자.

10^20승 만큼 통장잔고가 있으면 좋겠으므로 10^20 을 해보자.


아까 입력 했던 잘못된 연산자라는 메세지가 나온다.




2.사용자가 0으로 나누려고 할 경우 에러메세지를 출력하자.

Hint:다음 장에서 조금 더 세련된 방법으로 에러를 잡는 법을 배울 것이니 걱정말자.


0으로 나누는 연산을 하면 에러가 난다. 진짜 나나 안나나 한번 확인해보자.

10 / 0.


결과는..

0으로 나누었다는 에러메세지.


이런 에러메세지가 나오기 전에 사용자에게 경고를 함으로써 0으로 나누지 못하도록 해보자.

IF조건절에 ELSE IF로 조건을 하나 더 주면 된다.

-------

ELSEIF pa_int2 0.
  WRITE'You cannot divide into 0'.

------


PARAMETERS pa_int1 TYPE i.
PARAMETERS pa_int2 TYPE i.
PARAMETERS pa_op(1) TYPE c.

DATA  result TYPE p DECIMALS 2.

IF NOT ( pa_op(1) = '+' OR
         pa_op(1) = '-' OR
         pa_op(1) = '*' OR
         pa_op(1) = '/' ).

  WRITE: 'Invalid Operator'.

ELSEIF pa_int2 = 0.
  WRITE: 'You cannot divide into 0'.

ELSE.
  CASE pa_op(1).
    WHEN '+'.
      result = pa_int1 + pa_int2.
    WHEN '-'.
      result = pa_int1 - pa_int2.
    WHEN '*'.
      result = pa_int1 * pa_int2.
    WHEN '/'.
      result = pa_int1 / pa_int2.
  ENDCASE.

  WRITE result.
ENDIF.

위와 같이 넣어주면 된다.


그러면 한번 실행 해보자.

다시 0으로 나누려는 사용자.


하지만 이번엔 에러가 나는 대신 경고 메세지다.




END.








댓글을 달아 주세요

  1. gy 2016.08.08 12:22 신고

    SAP ABAP에 대해서 공부를 시작하는 사람인데, 도움을 많이 받고 있습니다. 감사합니다.

    그런데 오래 전 포스팅한 자료이긴 하지만, 위에서 의문이 생겨서 글을 남깁니다.

    예제 마지막부분에 0으로 나누는 것을 오류 처리하기 위해서

    ELSEIF pa_int2 = 0.
    WRITE: 'You cannot divide into 0'.

    이렇게 처리하셨는데, 이렇게 되면 10+0을 계산할 때도 오류로 처리될 것 같습니다.

    따라서 ELSEIF ( pa_int2 = 0 AND pa_op(1) = '/' ).
    이런 식으로 수정해야 되는 것이 맞는지 알고 싶습니다.