ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SAP OOP] Interface // 잔고 관리
    SAP 2022. 5. 10. 22:33

    안녕하세요. 건양대학교 기업소프트웨어학부에 재학 중인 학생입니다! 이번에 작성할 내용은 Interface와 잔고관리 프로그램입니다. 이 Interface에 관한 내용은 김성준 선배님의 Easy ABAP 2.0 본문을 참고하여 작성하겠습니다.

    인터페이스는 상속과 무관하게, 전혀 다른 클래스에서 같은 클래스에 접근할 수 있도록 구현한 것입니다. 클래스, 클래스의 객체 그리고 참조 변수를 이용한 객체에 대한 접근은 ABAP Object의 기본 개념을 이루고 있습니다.

    클래스와 같이 인터페이스도 ABAP 프로그램에서 Global 또는 Local로 정의할 수 있습니다. 정의 구문에는 속성, 메서드, 이벤트의 모든 항목을 포함할 수 있습니다.

    인터페이스의 컴포넌트들은 접근 제한 영역에 할당될 필요가 없습니다. 클래스에서 인터페이스를 추가하면 항상 PUBLIC SECTION에 정의하여야 하기 때문입니다.

    이제 작성한 코드와 함께 살펴보도록 하겠습니다.

    먼저 이번 프로그램에서 사용한 테이블들 입니다.

    ZTSAVE_03일 경우 BID에 해당하는 사용자의 BALACE // 잔고 두개의 필드로 구성하였습니다. 해당 잔고는 유저를 기준으로 계속 변하기 때문에 키필드는 BID에만 부여하였습니다.

    다음으로는 ZTBLOG_03입니다. 해당 테이블은 다음과 같이 이루어져 있습니다.

    BLOG 거래 NUMBER
    BID 사용자
    BDATE 거래 날짜
    BTIME 거래 시간
    BGET 입금 금액
    BOUT 출금 금액
    BALANCE 현재 잔고

    해당 키필드는 DATE와 TIME까지 잡았는데, 만약 거래 내역을 유지한채 1번부터 다시하고 싶은 사람 (통장을 바꾸는 것처럼) 의 경우를 생각하고 작성하였습니다. 하지만 지금와서 보니 굳이 날짜와 시간까지 키로 잡을 필요는 없는 것 같군요!

    코드 설명으로 넘어가겠습니다.

    해당 프로그램에서 사용할 Table들과 Parameters, Radio Button입니다.

    pa_bid일 경우 거래를 할 유저이고 pa_bala는 거래할 금액을 말합니다. 조건문으로 공란일 경우를 잡을까 했지만 그냥 필수값으로 넣어버렸습니다.

    Block 안에는 입금과 출금 두 라디오 버튼을 구성하였습니다.

    ZTSAVE_03과 ZTBLOG_03을 참조하는 전역변수를 선언해주었습니다.

    Interface accout에서 method clac에 갑을 받을 iv_bal을 선언해주었습니다. type은 parameter pa_bala와 같습니다.

    lv_val는 프로그램 설계를 위한 여러 시도의 부산물입니다.. 지웠어야 했는데..

     

    클래스 lcl_c1을 정의해줍니다. 해당 클래스는 앞서 선언한 Interface accout의 method를 사용합니다.

    클래스 lcl_c1의 시행부분입니다. Interface account의 calc를 사용합니다.

    먼저 SQL문을 통해 gs_list에 bid가 pa_bid인 정보를 gs_list로 가져옵니다. 해당 테이블은 키필드가 bid 하나이기 때문에 단 하나의 정보를 가져와서 구조체에 담아서 가져와야겠다고 생각했습니다.

    Class lcl_c1은 출금에 대한 클래스입니다. 만약 gs_list-balance(기존 잔고) 혹은 기존 잔고보다 초과한 금액을 인출했을 경우 메세지 출력과 함께 사용자 ID와 현재 잔고에 대한 정보만 보여줍니다.

    그게 아닐 시 사용자 ID, 기존 잔고, 출금할 금액, 출금 이후 현재 잔고에 대한 정보를 출력하고 ZTSAVE_03의 잔고내역을 Modify 시켜줍니다.

    BLOG // 거래 Number에 해당하는 내용은 Inline으로 처리하려다가 결국.. Number Range를 사용하여 작성하였습니다. 이 뒤에 Inline, Code로 어떻게 작성하였는지도 보여드리도록 하겠습니다. Number Range에 대한 정보는 검색할 시 자세히 나옵니다.

    Importing으로 Number Range를 통해 부여받은 번호를 gs_blog-blog로 입력해줍니다.

    만약 sy-subrc가 0이 아닐 시 오류메세지를 출력합니다.

    처음에 Number Range를 사용하지 않고 코드로 작성한 부분입니다. ZTBLOG_03에서 bid = pa_bid 인 데이터를 내림차순으로 조회합니다. 그리고 Read Table을 통해 Index 1에 데이터에 따라 조건문을 작성해주었습니다.

    만약 데이터가 없을 시 첫번째 blog이므로 gs_blog-blog에 '1'을 선언해줍니다. 이는 첫 번째 거래내역을 뜻합니다.

    그게 아닐 시 gs_blog-blog는 기존 blog의 값에서 1을 더해준 값으로 바꿔줍니다.

    지금까지의 과정을 통해 얻은 데이터들을 gs_blog에 입력해줍니다. lcl_c1은 출금이기 대문에 bget의 값은 0입니다. 데이터가 담긴 gs_blog를 통해 ztblog_03을 Modify 시켜줍니다.

    이제 새롭게 바뀐 데이터를 가진 ZTBLOG_03을 다시 조회해줍니다.

    이를 cl_demo_output=>display_data( gt_blog ).를 통해 출력해줍니다.

    lcl_c2일 경우 lcl_c1과정이 입금과정으로 바뀐 것입니다. 해당 구문에서 -값을 +로 바꿔주면 됩니다. 클래스 lcl_c2에 대한 코드 전문 아래에 첨부하도록 하겠습니다.

    CLASS lcl_c2 IMPLEMENTATION.

      METHOD account~calc.

        SELECT *
          FROM ztsave_03
          INTO CORRESPONDING FIELDS OF gs_list
          WHERE bid = pa_bid.
        ENDSELECT.

        WRITE:/ '사용자 ID : ', gs_list-bid.
        WRITE:/ '기존 잔고 : ', gs_list-balance.
        WRITE:/ '입금      : ', iv_bal.

        gs_list-balance = gs_list-balance + iv_bal.

        WRITE:/ '현재 잔고 : ', gs_list-balance.

        MODIFY ztsave_03 FROM gs_list.

    "Number Range 사용

    PERFORM number_Get.

    "데이터 조회 후 Inline.

    *    SELECT *
    *      FROM ztblog_03
    *      INTO CORRESPONDING FIELDS OF TABLE gt_blog
    *      WHERE bid = pa_bid
    *      ORDER BY blog DESCENDING.
    *
    *    READ TABLE gt_blog INTO gs_blog INDEX 1.
    *
    *    IF gs_blog-blog IS INITIAL.
    *
    *      gs_blog-blog = '1'.
    *
    *    ELSE.
    *
    *      gs_blog-blog = gs_blog-blog + 1.
    *
    *    ENDIF.

        gs_blog-bid = gs_list-bid.
        gs_blog-bdate = sy-datum.
        gs_blog-btime = sy-uzeit.
        gs_blog-bget = iv_bal.
        gs_blog-bout = 0.
        gs_blog-balance = gs_list-balance.

        MODIFY ztblog_03 FROM gs_blog.

        SELECT *
      FROM ztblog_03
      INTO CORRESPONDING FIELDS OF TABLE gt_blog
      WHERE bid = pa_bid
      ORDER BY blog ASCENDING.

        cl_demo_output=>display_data( gt_blog ).

      ENDMETHOD.

    ENDCLASS.

    참조변수 및 라디오 버튼에 따른 메소드 출력입니다. iv_bal에는 pa_bala를 입력해주었습니다.

    마지막으로 실행화면을 첨부하고 이번 글을 마치도록 하겠습니다.

    감사합니다.

    김성준, 「Easy ABAP 2.0」, 프리렉(2012)

    책정보, http://www.yes24.com/Product/Goods/7334929.

    SAP Joy, http://sapjoy.co.kr/

    'SAP' 카테고리의 다른 글

    [SAP OOP] Interface // Event // 송금 관리  (0) 2022.05.19
    [SAP Report] For All Entries  (0) 2022.05.18
    [SAP Report] ALV Event (1)  (0) 2022.05.10
    [SAP OOP] TRY 구문 // Catch  (0) 2022.05.05
    [SAP Report] ALV Layout  (0) 2022.05.04
Designed by Tistory.