ABAP Docking container

Updated:

1. Grid ALV

Grid ALV란?

ABAP List Viewer의 약자로 ERP 업무를 보는 현업 담당자들이 데이터를 볼 때 excel sheet와 유사한 형태로 보여지는 화면이다.

Grid setting

  • Docking Container -> Splitter Container -> CL_DD_Document (Top of Page 구성)
  • Docking Container -> Splitter Container -> CL_GUI_ALV_GRID (Grid ALV 구성)



2. Docking container ALV 생성

1) 레포트 생성 및 INCLUDE 생성

image

2) INCLUDE - TOP

image


3) SCREEN 생성

image

image

image

image

MODULE USER_COMMAND_0100 AT EXIT-COMMAND에는 버튼 클릭에 따른 뒤로가기 설정을 해주며 코드는 아래 소스코드를 참조한다.


4) INCLUDE - SELECTION

image


5) ALV 설정

PBO 부분 중 DISPLAY_ALV_0100에 대해 PERFORM으로 부분별로 나누어 작성해본다.

image

image

SET_CONTAINER

ALV를 위, 아래로 나눠 출력하면 다음과 같은 화면이 보여진다.

image

image

image

SET_DISPLAY

image

SET_LAYOUT

출력하는 ALV의 LAYOUT을 아래와 같이 설정한 후 실행하면 다음과 같이 출력된다.

image

image


6) INCLUDE - CLASS

상단 GRID에 텍스트를 보여주고자 한다. 이에 대한 클래스를 생성하고 이벤트를 추가해 본다.

image

SET_GRID_EVENT

상단 GRID에 대해 텍스트를 보여주는 이벤트를 추가해본다.

image

image

날짜로 값을 만든 GT_TITLE을 출력하려고 보니 TABLE TYPE ERROR가 발생했다. 출력되는지 확인하기 위해 직접 입력한 한 줄 텍스트로 테스트 해보았지만 여전히 텍스트가 나타나지 않는다. 어떤 부분을 수정할 지에 대한 업데이트가 필요한 상황이다.

image



3. 코드

REPORT

*&---------------------------------------------------------------------*
*& Report Z0001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z0001.

INCLUDE Z0001_TOP.  "전역변수, ITAB 선언
INCLUDE Z0001_CLS.  "로컬 클래스
INCLUDE Z0001_SEL.  "조회화면
INCLUDE Z0001_F01.  "함수
INCLUDE Z0001_O01.  "PBO
INCLUDE Z0001_I01.  "PAI


INCLUDE - TOP

*&---------------------------------------------------------------------*
*& Include          Z0001_TOP
*&---------------------------------------------------------------------*

*1. INTERNAL TABLE 선언
DATA: GT_DETAIL TYPE TABLE OF SFLIGHT,
      GS_DETAIL TYPE          SFLIGHT,
      SCARR     TYPE          SCARR.

*ALV 상단 첫번째 CONTAINER 출력할 ITAB: TOP-OF-PAGE 위한 선언
DATA: BEGIN OF GS_TITLE,
        TYP(001)   TYPE C,
        INFO(030)  TYPE C,
        KEY(200)   TYPE C,
      END OF GS_TITLE,
      GT_TITLE LIKE TABLE OF GS_TITLE.

*OK_CODE
DATA: OK_CODE TYPE SY-SUBRC.

*2. DOCKING CONTAINER 선언
DATA: GO_DOCK TYPE REF TO CL_GUI_DOCKING_CONTAINER.

*3. ALV GRID 선언
DATA: GO_GRID TYPE REF TO CL_GUI_ALV_GRID.

*4. 로컬클래스 선언이 아래에 있음을 선언
"CLASS LO_CLASS DEFINITION DEFERRED.

*5. LAYOUT 선언: ALV에 출력될 ITAB 전체 레이아웃 설정
DATA: GS_LAYO TYPE LVC_S_LAYO.

*6. SPLITTER CONTAINER: ALV 화면분할을 위한 클래스 선언
DATA: GO_SPLIT TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
      GO_TOP   TYPE REF TO CL_GUI_CONTAINER,  "
      GO_BOT   TYPE REF TO CL_GUI_CONTAINER,  "아래
      GO_DOC   TYPE REF TO CL_DD_DOCUMENT.    "TOP-OF-PAGE


INCLUDE - SELECTION

*&---------------------------------------------------------------------*
*& Include          Z0001_SEL
*&---------------------------------------------------------------------*

*1. 조회용 화면 구성
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: S_CARRID FOR SCARR-CARRID.  "조회용 ITAB
SELECTION-SCREEN END OF BLOCK B1.

*2. 사용자가 F8 클릭시 실행될 로직을 구현
START-OF-SELECTION.
  "DB TABLE에서 ITAB으로 WHERE 조건에 맞게 데이터 추출
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE GT_DETAIL
    FROM SFLIGHT
    WHERE CARRID IN S_CARRID.

*3. ITAB 데이터를 출력할 화면구성
END-OF-SELECTION.   "출력부
  CALL SCREEN 100.  "SCREEN 100 호출


INCLUDE - CLASS

*&---------------------------------------------------------------------*
*& Include          Z0001_CLS
*&---------------------------------------------------------------------*

*원리
*ALV 클래스 CL_GUI_ALV_GRID INSTANCE EVENT 기능으로 LOCAL INSTANCE METHOD 선언

*LOCAL CLASS 정의
CLASS LO_CLASS DEFINITION.
  PUBLIC SECTION.
  METHODS: HANDLE_TOP_OF_PAGE FOR EVENT TOP_OF_PAGE OF CL_GUI_ALV_GRID
                              IMPORTING
                                E_DYNDOC_ID.
ENDCLASS.

*LOCAL CLASS 구현
CLASS LO_CLASS IMPLEMENTATION.
  METHOD HANDLE_TOP_OF_PAGE.
    PERFORM TOP_OF_PAGE USING E_DYNDOC_ID.
  ENDMETHOD.
ENDCLASS.

DATA: GO_EVENT TYPE REF TO LO_CLASS.


INCLUDE - PBO

*&---------------------------------------------------------------------*
*& Include          Z0001_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS '100'.
  SET TITLEBAR '100'.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Module DISPLAY_ALV_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE DISPLAY_ALV_0100 OUTPUT.
  IF GO_GRID IS INITIAL.        "GRID 인스턴스 최초 실행시
    PERFORM SET_CONTAINER.      "1.CONTAINER 생성
    PERFORM SET_LAYOUT.         "2.ALV LAYOUT 설정
    PERFORM SET_GRID_EVENT.     "3.ALV EVENT 등록
    PERFORM DISPLAY_ALV.        "4.ALV GRID 출력
  ENDIF.
ENDMODULE.


INCLUDE - PAI

*&---------------------------------------------------------------------*
*& Include          Z0001_I01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  LEAVE TO SCREEN 0.
ENDMODULE.


INCLUDE - PERFORM

*&---------------------------------------------------------------------*
*& Include          Z0001_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SET_CONTAINER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SET_CONTAINER .
*OBJECT 생성
  CREATE OBJECT GO_DOCK
    EXPORTING
      DYNNR      = SY-DYNNR  "현재 화면 번호
      REPID      = SY-CPROG  "현재 프로그램
      "SIDE       = 1         "SPLIT SCROLL BAR 조정-가로
      SIDE       = 2         "SPLIT SCROLL BAR 조정-세로
      EXTENSION = 2000.      "너비 길이

  CREATE OBJECT GO_SPLIT
    EXPORTING
      ROWS      = 2          "행 갯수
      COLUMNS   = 1          " 갯수
      PARENT    = GO_DOCK.   "컨테이너 설정

*CONTAINER 설정
  CALL METHOD GO_SPLIT->GET_CONTAINER
    EXPORTING
      ROW       = 1
      COLUMN    = 1
    RECEIVING
      CONTAINER = GO_TOP.

  CALL METHOD GO_SPLIT->GET_CONTAINER
    EXPORTING
      ROW       = 2
      COLUMN    = 1
    RECEIVING
      CONTAINER = GO_BOT
    EXCEPTIONS
      OTHERS    = 1.

*높이 설정
  CALL METHOD GO_SPLIT->SET_ROW_HEIGHT
    EXPORTING
      ID          = 1  "1 CONTAINER
      HEIGHT      = 20 "높이를 20으로 설정
    EXCEPTIONS
      CNTL_ERROR  = 1.

* GRID 설정: ALV GRID는 GO_BOT라는 컨테이너로 연결
  CREATE OBJECT GO_GRID
    EXPORTING
      I_PARENT    = GO_BOT.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SET_LAYOUT .
*LAYOUT 설정
  GS_LAYO-CWIDTH_OPT = ABAP_TRUE.   "컬럼길이 최적화
  GS_LAYO-GRID_TITLE = '첫번째 ALV'.
  GS_LAYO-EDIT       = 'X'.         "전체필드 수정 가능
  GS_LAYO-SEL_MODE   = 'A'.         ", 선택 가능
  GS_LAYO-ZEBRA      = 'X'.         "얼룩무늬
  GS_LAYO-TOTALS_BEF = 'X'.         "총계를 최상단에 출력
  GS_LAYO-NO_ROWINS  = 'X'.         "Excel 데이터 alv로 복사 방지
ENDFORM.

*&---------------------------------------------------------------------*
*& Form SET_GRID_EVENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SET_GRID_EVENT .
*EVENT CLASS 등록
  CREATE OBJECT GO_EVENT.

*EVENT METHOD 등록: GO_GRID 인스턴스에 EVENT METHOD를 등록
  SET HANDLER GO_EVENT->HANDLE_TOP_OF_PAGE FOR GO_GRID.

*TOP-OF-PAGE 이벤트를 실행시키는 메서드
  CALL METHOD GO_GRID->LIST_PROCESSING_EVENTS
    EXPORTING
      I_EVENT_NAME  = 'TOP_OF_PAGE'
      I_DYNDOC_ID   = GO_DOC.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM DISPLAY_ALV .
*ALV GRID 출력
  CALL METHOD GO_GRID->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_LAYOUT           =   GS_LAYO
      I_STRUCTURE_NAME    =   'SFLIGHT'   "SFLIGGHT DB TABLE 동일한 구조
    CHANGING
      IT_OUTTAB           =   GT_DETAIL.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_E_DYNDOC_ID  text
*&---------------------------------------------------------------------*
FORM TOP_OF_PAGE  USING E_DYNDOC_ID TYPE REF TO CL_DD_DOCUMENT.

  CLEAR: GS_TITLE, GT_TITLE.
  DATA: S_BUDAT TYPE SY-DATUM.

  S_BUDAT       = SY-DATUM.
  GS_TITLE-TYP  = 'S'.
  GS_TITLE-KEY  = 'KEY1'.

*날짜 설정
  CONCATENATE S_BUDAT+0(4) ' ' S_BUDAT+4(2) ' ' S_BUDAT+6(2) ' ' ` ~ `
              S_BUDAT+0(4) ' ' S_BUDAT+4(2) ' ' S_BUDAT+6(2) ' '
              INTO GS_TITLE-INFO.
  APPEND GS_TITLE TO GT_TITLE.

*화면에 출력
  PERFORM DISPLAY_DOCUMENT USING E_DYNDOC_ID.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form DISPLAY_DOCUMENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_E_DYNDOC_ID  text
*&---------------------------------------------------------------------*
FORM DISPLAY_DOCUMENT  USING E_DYNDOC_ID TYPE REF TO CL_DD_DOCUMENT.
*TEXT    출력하고 싶을 
  CALL METHOD E_DYNDOC_ID->ADD_TEXT
    EXPORTING
      TEXT        = 'ADD_TEXT 메서드 출력'.    "255자리까지 입력가능.
      "TEXT_TABLE  = GT_TITLE.

*METHOD DOCUMENT 출력
*  CALL METHOD E_DYNDOC_ID->DISPLAY_DOCUMENT
*    EXPORTING
*      REUSE_CONTROL   = 'X'
*      PARENT          = GO_TOP.
ENDFORM.