REPORT ZSALES_ORDER03.
데이터 선언
TABLES : ZVBAK03.
DATA : OK_CODE(10).
DATA : GT_HD LIKE ZVBAK03 OCCURS 0 WITH HEADER LINE,
GT_IT LIKE ZVBAP03 OCCURS 0 WITH HEADER LINE .
DATA : G_ALV TYPE REF TO CL_GUI_ALV_GRID, " ALV 사용을 위해 cl_gui_alv_grid 를 사용해야함.
G_CUSTOM_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
SELECT-OPTIONS : S_VBELN FOR ZVBAK03-VBELN. " 범위값으로 지정
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.
DATA : G_IT_ALV TYPE REF TO CL_GUI_ALV_GRID, " 더블클릭 시 상세 항목을 조회하기위해 iTEM 테이블의 인터널 테이블 선언
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_row : 더블클릭된 열 번호
E_COLUMN " e_colmn : 더블클릭된 컬럼 이름
ES_ROW_NO.
PRIVATE SECTION.
ENDCLASS. "LCL_ALV_EVENT_RECEIVER DEFINITION
CLASS lcl_alv_event_reciever IMPLEMENTATION
CLASS LCL_ALV_EVENT_RECEIVER IMPLEMENTATION.
METHOD EVT_DOUBLE_CLICK.
" 더블클릭하면 아래 서브루틴이 실행된다.
PERFORM SHOW_ITEM_DISPLAY USING E_ROW E_COLUMN ES_ROW_NO.
ENDMETHOD. "evt_double_click
ENDCLASS. "lcl_alv_event_reciever IMPLEMENTATION
DATA : G_APPLICATION TYPE REF TO LCL_ALV_EVENT_RECEIVER.
start-of-selection
START-OF-SELECTION.
SELECT *
INTO TABLE GT_HD " 인터널 테이블 gt_hd 에 데이터를 담아줌.
FROM ZVBAK03
WHERE VBELN IN S_VBELN.
IF SY-SUBRC EQ 0.
CALL SCREEN 100. " alv를 출력할 화면 실행.
ELSE.
WRITE : / ' No data'.
ENDIF.
*&---------------------------------------------------------------------*
Module STATUS_0100 OUTPUT
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'S100'.
SET TITLEBAR 'T100'.
ENDMODULE. " STATUS_0100 OUTPUT
Module SET_ALV OUTPUT
MODULE SET_ALV OUTPUT.
" G_HD_CUSTOM_CON 컨테이너는 한번만 생성되어야 한다.
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 " 위에서 생성한 오브젝트를 다시 G_HD_ALV 에 넣어서 다시 오브젝트를 생성.
EXPORTING
I_PARENT = G_HD_CUSTOM_CON.
" double click 이벤트 생성
CREATE OBJECT G_APPLICATION.
SET HANDLER G_APPLICATION->EVT_DOUBLE_CLICK FOR G_HD_ALV.
" alv 출력
CALL METHOD G_HD_ALV->SET_TABLE_FOR_FIRST_DISPLAY " 반드시 한번은 생성되어야 한다는 의미
EXPORTING
I_STRUCTURE_NAME = 'ZVBAK03' " 구조 선언
CHANGING
IT_OUTTAB = GT_HD[]. " 인터널 테이블 GT_HD 의 몸통에 넣어서 출력.
ENDMODULE. " SET_ALV OUTPUT
Module USER_COMMAND_0100 INPUT
MODULE USER_COMMAND_0100 INPUT.
CASE OK_CODE.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
Form SHOW_ITEM_DISPLAY
FORM SHOW_ITEM_DISPLAY USING P_ROW
P_COLUMN
P_ROW_NO.
" 더블클릭 이벤트 발생한 위치의 row (행) 의 값을 가져와
" 해당 행의 위치한 데이터를 가져온다.
READ TABLE GT_HD INDEX P_ROW.
" 데이터가 존재하면 0 , 없다면 그외의 값
" check 는 0이 아니라면 해당 프로그램을 종료
CHECK SY-SUBRC EQ 0.
SELECT *
INTO TABLE GT_IT
FROM ZVBAP03
WHERE VBELN = GT_HD-VBELN.
CHECK SY-SUBRC EQ 0 .
SORT GT_IT BY POSNR. " select 에서도 sort 는 가능. 하지만 사용 x / 이유는 database 에 과부화가 걸림.
" 인터널 테이블에 가져와서 sort 하는게 렉이 덜하다.
CALL SCREEN 200 STARTING AT 1 1
ENDING AT 100 15.
ENDFORM. "SHOW_ITEM_DISPLAY
Module STATUS_0200 OUTPUT
MODULE STATUS_0200 OUTPUT.
SET PF-STATUS 'S200'.
SET TITLEBAR 'T200'.
ENDMODULE. " STATUS_0200 OUTPUT
Module SET_IT_ALV OUTPUT
MODULE SET_IT_ALV OUTPUT.
" Header 부분을 만든 내용과 달리 check 문을 만들지 않고
" IF 문으로 ALV object 만 생성 하는 부분을 한번만 실행되게 했다.
" G_IT_ALV->SET_TABLE_FOR_FIRST_DISPLAY 는 더블클릭하여 선택된
" iTEM내용이 변경되며 출력되기 때문에 더블클릭할때 마다 실행되어야 한다.
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 = 'ZVBAP03'
CHANGING
IT_OUTTAB = GT_IT[].
ENDMODULE. " SET_IT_ALV OUTPUT
Module USER_COMMAND_0200 INPUT
MODULE USER_COMMAND_0200 INPUT.
CASE OK_CODE.
WHEN 'OK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
굿이예요 아주 굿!