Basic ALV + double click 소스

Jinsu Park (James)·2019년 12월 10일
0

ABAP

목록 보기
3/3

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.

profile
JS ABAP collection

1개의 댓글

comment-user-thumbnail
2019년 12월 10일

굿이예요 아주 굿!

답글 달기