본문 바로가기
ABAP

[ALV] ALV + Hotspot Event

by clode 2023. 3. 2.
728x90
반응형

ALV 출력하기 위해서는 2가지의 작업을 해야한다.

  1. 인터널테이블 선언
  2. 데이터의 구조(필드 카탈로그)
    *필드 카탈로그 : ALV GRID

ALV의 구성
SCREEN > CONTAINER > ALV GRID
ALV 인스턴스를 화면에 보이게 하기 위해선 컨테이너 컨트롤이 필요하다.

데이터 선언

TABLES: ZVBAK10.

DATA : OK_CODE(10).

DATA : GT_HD LIKE ZVBAK10 OCCURS 0 WITH HEADER LINE,
       GT_IT LIKE ZVBAP10 OCCURS 0 WITH HEADER LINE.

DATA : G_ALV  TYPE REF TO CL_GUI_ALV_GRID,
       G_CUSTOM_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

초기화면 구성

SELECT-OPTIONS : S_VBELN FOR ZVBAK10-VBELN.
  • 실행하면 Sales order값을 From ~ to 범위로 입력 할수 있는 선택 창 실행

parameters 가 1개의 값만 지정 할수 있는 반면,
Select-options는 범위 값을 다양하게 입력 할 수 있다.

  • 선언 방법 : For + table이름 -field 이름
  • 이때 Table이름은 tables로 선언되어 있어야 한다.

ALV를 사용하기 위한 data class

DATA : G_HD_ALV  TYPE REF TO CL_GUI_ALV_GRID,
       G_HD_CUSTOM_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

* 오더 항목을 위한 데이터 선언
* Header line을 더블 클릭하면 해당 오더의 항목이 조회 되도록 한다.

DATA : G_IT_ALV        TYPE REF TO CL_GUI_ALV_GRID,
       G_IT_CUSTOM_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

* alv에서 event를 처리 하기 위해 선언하는 local class
CLASS LCL_ALV_EVENT_RECEIVER DEFINITION.
    PUBLIC SECTION.
         METHODS:
              EVT_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
                IMPORTING E_ROW "행
                           E_COLUMN "열
                           ES_ROW_NO. "넘버의 값 가져온다
ENDCLASS.                 
  • 더블클릭하면 아래 서브루틴이 실행된다. 더블클릭 이벤트
  • E_ROW : 더블클릭된 열 번호
  • E_COLUMN : 더블클릭된 컬럼 이름
CLASS  LCL_ALV_EVENT_RECEIVER IMPLEMENTATION.
     METHOD EVT_DOUBLE_CLICK. "더블클릭이벤트 감지를 하면
            PERFORM SHOW_ITEM_DISPLAY  USING E_ROW  "더블클릭된 열 번호              
                                 E_COLUMN "더블클릭된 컬럼 이름 
                                             ES_ROW_NO.. "펑션 실행
      ENDMETHOD.                    
ENDCLASS.                
  • local class로 선언된 내용을 처리하기 위해 object를 선언한다.
DATA : G_APPLICATION TYPE REF TO LCL_ALV_EVENT_RECEIVER.

실행 화면 로직

START-OF-SELECTION.

 SELECT * INTO TABLE GT_HD 
 FROM ZVBAK10 WHERE VBELN IN S_VBELN. 
     IF SY-SUBRC = 0.
        CALL SCREEN 100.   "alv를 출력할 화면 실행
        ELSE.
          WRITE : /  'No data'.
     ENDIF.
  • 만약 데이터가 없다면 No data를 화면에 뿌려준다.

메뉴버튼과 타이틀 바 지정

        MODULE STATUS_0100 OUTPUT.
              SET PF-STATUS 'S100'.
              SET TITLEBAR '100'.
        ENDMODULE.                    "STATUS_0100 OUTPUT

ALV

  • PBO Module이 실행될때 마다 실행되면 안되므로 Check 로직으로 한번만 실행되도록 제어한다.
  • 초기화는 한번만 진행, CHECK를 해서 초기값이면 실행 초기값이 아니면 실행하지말아라
  • MODULE SET_ALV OUTPUT. CHECK G_HD_CUSTOM_CON IS INITIAL.
  • 화면 100에 생성한 HD_CON을 참조하여 오브젝트 생성
  • CREATE OBJECT G_HD_CUSTOM_CON EXPORTING CONTAINER_NAME = 'HD_CON'. "레이아웃에서 그렸던 컨테이너 이름
  • ALV_CON위에 ALV 오브젝트를 생성한다.
  • CREATE OBJECT G_HD_ALV EXPORTING I_PARENT = G_HD_CUSTOM_CON.
  • 더블클릭 이벤트 생성
  • CREATE OBJECT G_APPLICATION. SET HANDLER G_APPLICATION->EVT_DOUBLE_CLICK FOR G_HD_ALV.
  • ALV 출력
    ```
  • 반드시 ALV한번은 실행되게 하는로직, 한번실행되면 또 실행 X
    
    
  • CALL METHOD G_HD_ALV->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING I_STRUCTURE_NAME = 'ZVBAK10' "ALV구조가 ZVBAK10 구조로 실행된다 CHANGING IT_OUTTAB = GT_HD[]. "ALV OBJECT에 출력할 데이터를 넘길때는 헤더가 아닌 RECORD를 넘겨야한다 ENDMODULE. "SET_ALV OUTPUT

더블클릭 이벤트

  • 더블클릭 이벤트 발생한 위치의 ROW 행의 값을 가져와 해당 행에 위치한 데이터 불러온다.
FORM SHOW_ITEM_DISPLAY  USING    P_E_ROW  P_E_COLUMN  P_ES_ROW_NO.

      READ TABLE GT_HD INDEX P_E_ROW.
        * 데이터가 존재하면 0, 체크가 0이아니라면 해당 프로그램 종료
          CHECK SY-SUBRC = 0.

          SELECT * INTO TABLE GT_IT FROM ZVBAP10
              WHERE VBELN = GT_HD-VBELN.

          CHECK SY-SUBRC = 0.
          SORT GT_IT BY POSNR.."SELECT에서도 가능
          CALL SCREEN 200 STARTING AT 1 1 ENDING AT 100 15.

ENDFORM.                    " SHOW_ITEM_DISPLAY

더블클릭 화면 200 ALV

  • Header 부분을 만든 내용과 달리 check 문을 만들지 않고
    IF문으로 ALV object만 생성 하는 부분을 한번만 실행되게 헸다
  • G_IT_ALV->SET_TABLE_FOR_FIRST_DISPLAY 는 더블 클릭하여 선택된 Item내용이 변경되며 출력되기 때문에 더블클릭할때마다 실행되어야 한다
        MODULE SET_IT_ALV OUTPUT.
          IF G_IT_CUSTOM_CON IS INITIAL.
  • 화면 200에 생성한 IT_CON을 참조하여 오브젝트 생성
  • CREATE OBJECT G_IT_CUSTOM_CON EXPORTING CONTAINER_NAME = 'IT_CON'.
  • ALV_CON위에 ALV 오브젝트를 생성한다.
  • CREATE OBJECT G_IT_ALV EXPORTING I_PARENT = G_IT_CUSTOM_CON. ENDIF.
  • ALV 출력
  • CALL METHOD G_IT_ALV->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING I_STRUCTURE_NAME = 'ZVBAP10' CHANGING IT_OUTTAB = GT_IT[].

ENDMODULE. " SET_IT_ALV OUTPUT


### POPUP 창 종료

* 표준화면에서 ‘LEAVE TO SCREEN 0’를 사용하면 프로그램이 종료된다.
* 그러나 위의 경우처럼 POPUP SCREEN에서 사용하면 프로그램이 종료되지 않고 POPUP SCREEN만 종료되어 다시 MAIN 화면으로 돌아온다.

MODULE USER_COMMAND_0200 INPUT.
CASE OK_CODE.
WHEN 'OK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " USER_COMMAND_0200 INPUT
```

728x90
반응형

'ABAP' 카테고리의 다른 글

[Smartform] Preview, PDF 기능  (0) 2023.03.02
Text editor object  (0) 2023.03.02
[SD] Sales Order Update/Delete BAPI  (0) 2023.03.01
Pop-up Message (POPUP_TO_CONFIRM)  (0) 2023.03.01
[Smartform]  (0) 2023.03.01

댓글