ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ABAP] ALV CUSTOM CONTAINER
    ABAP 2024. 1. 25. 23:52

    ALV란?

    ABAP LIST VIEWER의 약자로 리스트 화면에 데이터를 조회하거나,

    조회된 데이터를 수정/변경하는 목적으로 실무에서 사용되는 프로그램이다.

     

    기존에는 WRITE 문을 이용해서 출력했다면

    [ex]

     

    ALV를 사용하면 좀 더 체계적으로 한 눈에 볼 수 있다! 

     

    하지만 이 ALV 화면을 띄워주기 위해서는 해야 할 것이 많다!

    ALV 구조는 이렇게 생겼다 본론부터 말하면

     

    1. 스크린을 만들고

    2. 스크린 내부에 CUSTOM CONTROL을 만들고

    3. CUSTOM CONTROL과 연결된 CONTAINER를 만들고

    4. 그 연결된 CONTAINER에 또 ALV GRID를 연결해서 결과를 출력!

     

    쉽게 비유하자면 영화보는거랑 똑같다!

     

    1. 영화관을 고르고

    2. 그 영화관에 해당하는 상영관을 고르고!

    3. 그 상영관에 있는 스크린이 내려오고!

    4. 그 스크린으로 영화를 본다고 생각하면 더 쉽게 이해할 수 있지 않을까..

     

    그럼 ALV 프로그램을 생성해보자.

     

    오늘 목표는 기존 REPORT 프로그램에서 ENTER를 누르면 

    빈 ALV화면을 띄워주기가 목표이다!

     

    프로그램 생성은 REPORT 프로그램을 그냥 만들면 된다.

     

    소스코드를 개별 저장소 개체로 분할하기 위해서 INCLUDE를 사용해서 나눠주자.

    그럼 프로그램이 모듈화 되고 가독성이 좋아진다!

     

    기본 레포트 프로그램에서는 간단한 파라미터만 선언해주었다.

     

    이제 이 화면에서 엔터를 누르면 그냥 빈 화면 ALV 화면을 호출하면 된다.

     

    제일먼저

    1. SCREEN 생성

    ALV를 띄워줄 SCREEN을 생성해주자

     

    그냥 CALL SCREEN <원하는 스크린번호> 를 입력하고

    저 100을 더블 클릭하면 된다. 아주 쉽다. 

    이제 저 스크린 내부의 CUSTON CONTROL을 생성해주자!

    우린 이제 영화관을 골랐고 상영관을 고르면 되는것이다.

     

    2. CUSTOM CONTROL 생성

    여기도 아주 쉽다 ㅎ 

    대충 만든 스크린의 description을 적어주고 layout 클릭

     

    저기가 custom control이다!

    저거 클릭해서 원하는 만큼 그려주고

    이름도 지정해주고

    화면 크기도 설정해준다.

    layout에서 나와서 element list로 와서 

    여기다가 OK_CODE도 할당해준다. 

    프로그램에서도 사용해야되니까 

     

    TOP으로 가서

    여기다가도 꼭! 선언을 해줘야 한다.

     

     

    STATUS와 TITLEBAR 설정은 생략하겠습니다.

     

    이제 영화관도 정하고 상영관도 다 정하고 좌석에 앉은상태입니다.

    그럼 이제 영화를 보려면 스크린을 내려야겠죠

     

    3. CUSTOM CONTAINER 생성

    컨테이너를 생성해주기 위해서는 일단 객체를 생성해줘야 한다!!! 

    객체를 생성해서 오브젝트를 만들고 그 다음에 클래스를 불러와주면 된다.

    DATA: <객체명> TYPE REF TO CL_GUI_CUSTOM_CONTAINER

     

    이렇게 선언해주면 된다. 선언이니까 당연히 TOP으로가서 

     

    멋지게 선언해주고

    우리가 영화를 보기전에 스크린을 내려야겠지?! 초기 세팅이 필요하단 말이야.

    그런 초기세팅은 당연히 스크린 DISPLAY전 실행되는 PBO 에다가  설정해야한다.

    PBO로 가서 MODULE을 하나 추가해주자.

    원하는 위치 클릭하고 PATTERN 눌러서

    아까 선언한 객체를 INSTANCE에 입력하고

    CLASS를 불러온다.

     

    EXPORTING 부분에 아까 SCREEN에다가 만들었던

    CUSTOM CONTROL의 이름 을 적어줘야한다. 

    아까 AREA로 선언했으니까 여기다가 적어준다.

    그리고 화면을 디스플레이 할때 초기시에만! 객체를 만들어야 하기 때문에

    IF문으로 조건을 하나 걸어준다.

     

    정리하자면 IF문을 안걸어주면 ALV를 호출할때마다 컨테이너에 대한 오브젝트가 계속 생겨나기 때문에

    불필요한 오브젝트를 생성하지 않기 위한것이라고 생각하면된다. 

     

    이렇게 하면 CONTAINER를 불러온것이다! 

    4.  ALV GRID 생성

     이제 마지막으로 grid를 만들어서 붙이면 된다.

    alv도 똑같이 객체 생성을 하고 클래스를 불러오면 된다.

     

    객체를 생성하고

    아까 컨테이너를 생성 부분 밑에다가 

    클래스를 가져온다. 만든 그리드는 아까 만든 컨테이너랑 연결시켜줘야 한다.

     

    EXPORTING 부분에 아까 만들었던

    CONTAINER(객체)의 이름 을 적어줘야한다. 

    아까 GO_CONT 로 선언했으니까 여기다가 적어준다.

    사실 당연하다. 만든 컨테이너 위에! 그리드를 붙여야지 잘 작동할것이다.

     

     

    이 화면에서 F8을 누르면

     

    이렇게 빈 alv 화면이 나오는걸 확인할 수 있다.

    다음에는 데이터를 가지고 오는 부분까지 구현해보자!

     

    < alv불러오는 모듈 코드 정리>

    MODULE INIT_ALV OUTPUT.
    
      IF GO_CONT IS INITIAL.
    
        CREATE OBJECT GO_CONT "container 먼저 생성하고
          EXPORTING
            CONTAINER_NAME              = 'AREA'
          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.
    
      ENDIF.
    
      CREATE OBJECT GO_ALV
        EXPORTING
          I_PARENT          = GO_CONT " 만든 컨테이너 위에 GRID 연결
        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.
    
    
    
    ENDMODULE.
Designed by Tistory.