A. Sales Order Table ALV 로 조회
1. 프로그램 ZSALES_ORDERXX(XX는 본인의 번호)생성한다.
2. 프로그램 소스를 다음과 같이 입력하고 Active(Ctrl+F3)
*&---------------------------------------------------------------------*
*& Report ZSALES_ORDER99
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZSALES_ORDERXX. "XX에 본인의 번호를 입력하세요
TABLES: ZVBAK99.
DATA : GT_HD LIKE ZVBAK99 OCCURS 0 WITH HEADER LINE,
GT_IT LIKE ZVBAP99 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,
* 실행하면 Saels order값을 From ~ to 범위로 입력 할수 있는 선택 창 실행
* parameters 가 1개의 값만 지정 할수 있는 반변,
* Select-options는 법위 값을 다양하게 입력 할 수 있다.
* 선언 방법 : For + ttable이름 -field 이름
* 이때 Table이름은 tables로 선언되어야 한다.
SELECT-OPTIONS : S_VBELN FOR ZVBAK99-VBELN.
3. 이동 -> 텍스트기호를 선택 한 후 Select-Option의 제목을 지정한다.
4. 여기까지 진행하고 Active(Ctrl+F3) 한 후 실행(F8)하면 다음과 같이 실행 된다.
5. 프로그램로직을 다음과 같이 입력한다.
* 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.
START-OF-SELECTION.
SELECT * INTO TABLE GT_HD FROM ZVBAK99 WHERE VBELN IN S_VBELN.
IF SY-SUBRC = 0.
CALL SCREEN 100. "alv를 출력할 화면 실행
ELSE.
WRITE : / 'No data'.
ENDIF.
6. 화면 번호 100을 더블 클릭하면 화면 생성기가 실행된다. 다음과 같이 PBO, PAI를 구성한다.
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
MODULE SET_ALV.
PROCESS AFTER INPUT.
FIELD OK_CODE MODULE USER_COMMAND_0100 ON INPUT.
여기까지 진행하고 Active(Ctrl+F3)
7. 각 Module을 다음과 같이 입력한다. Report프로그램으로 생성하여 별도의 include프로그램을 만들지 않았으므로 PBO, PAI Module을 생성한 프로그램 아래에 입력 한다.
MODULE SET_ALV OUTPUT.
* PBO Module이 실행될때 마다 실행되면 안되므로
* Check 로직으로 한버만 실행되도록 제어한다.
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.
* ALV 출력
CALL METHOD G_HD_ALV->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_STRUCTURE_NAME = 'ZVBAK99'
CHANGING
IT_OUTTAB = GT_HD[].
ENDMODULE.
- GT_HD[] :
+ Internal table의 Record를 지칭, Header가 있는 Internal table은 GT_HD라고 지칭하면 Header를 의미하므로 ALV Object에 출력할 데이터를 넘길때는 헤더가 아닌 Record를 넘겨야 한다.
- I_STRUCTURE_NAME = ‘ZVBAK99’
+ ALV구조가 ZVBAK99의 구조로 실행된다.
MODULE user_command_0100 INPUT.
CASE OK_CODE.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'BACK'.
LEAVE TO SCREEN 0..
ENDCASE.
ENDMODULE.
여기까지 진행하고 Active(Ctrl+F3) 후 실행(F8)
입력값 없이 실행하면 아래와 같이 화면이 출력됩니다.
- Table에 있는 모든 Record가 출력된다.
- Table의 컬럼은 ZVBAK99구조로 실행된다.
(1 ~ 5)값을 입력 후 실행하면 아래와 같이 화면이 출력됩니다.
B. Sales Order Item ALV로 조회
- Header line을
더블 클릭
하면 해당 오더의 항목이 조회 되도록 한다.
- 데이터 선언 부분을 다음과 같이 수정한다.
- Item alv를 위한 데이터 선언
- 더블 클릭을 위한 alv local class 선언
* 오더 항목을 위한 데이터 선언
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.
CLASS lcl_alv_event_receiver IMPLEMENTATION.
METHOD evt_double_click.
* 더블클릭하면 아래 서브루틴이 실행된다.
* E_ROW : 더블클릭된 열 번호
* E_COLUMN : 더블클릭된 컬럼 이름
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.
FORM SHOW_ITEM_DISPLAY USING P_ROW P_COLUMN P_ROW_NO.
READ TABLE GT_HD INDEX P_ROW.
CHECK SY-SUBRC = 0.
SELECT * INTO TABLE GT_IT FROM ZVBAP99
WHERE VBELN = GT_HD-VBELN.
CHECK SY-SUBRC = 0.
SORT GT_IT BY POSNR..
CALL SCREEN 200 STARTING AT 1 1
ENDING AT 100 15.
ENDFORM.
여기까지 진행하고 Active(Ctrl+F3)
- Class ‘CL_GUI_ALV_GRID’ 의 event를 상속받아 사용한다.
* 더블클릭 이벤트 생성
CREATE OBJECT g_application.
SET HANDLER g_application->evt_double_click FOR g_hd_alv.
PROCESS BEFORE OUTPUT.
MODULE STATUS_0200.
MODULE SET_IT_ALV.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0200 .
여기까지 진행하고 Active(Ctrl+F3)
4. 추가된 모듈의 내용을 다음과 같이 입력한다
MODULE STATUS_0200 OUTPUT.
SET PF-STATUS 'S00'.
SET TITLEBAR '200'.
ENDMODULE.
여기까지 진행하고 저장(Ctrl+S) Active(Ctrl+F3)
5. ALV생성을 위해 Custom-Conainer를 생성한 후 이름을 ‘IT_CON’으로 입력한다.
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 = 'ZVBAP99'
CHANGING
IT_OUTTAB = GT_IT[].
ENDMODULE.
MODULE USER_COMMAND_0200 INPUT.
CASE OK_CODE.
WHEN 'OK'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
- 표준화면에서 ‘LEAVE TO SCREEN 0’를 사용하면 프로그램이 종료된다. 그러나 위의 경우처럼 POPUP SCREEN에서 사용하면 프로그램이 종료되지 않고 POPUP SCREEN만 종료되어 다시 MAIN 화면으로 돌아온다.
저장(Ctrl+S) -> Active(Ctrl+F3) -> 실행(F8)