본문 바로가기
ABAP

ALV 3 (Hotspot)

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

초기화면

1. 초기화면 생성

TABLES: vbap.

SELECT-OPTIONS p_vbeln FOR vbak-vbeln.

VBELN는 판매문서 번호


ALV 출력화면

2. 데이터 SELECT

데이터를 담아줄 구조와 인터널테이블을 먼저 만들어준다.

DATA:  gs_tab TYPE vbak,
       gt_tab LIKE TABLE OF gs_tab.

실행했을때 ALV를 뿌려주고 그 ALV에 데이터가 담겨있어야하기 때문에 프로그램의 START-OF SELECTION 에서 데이터를 가져온다.

  SELECT * FROM vbak
    INTO CORRESPONDING FIELDS OF TABLE gt_tab
    WHERE vbeln IN p_vbeln.

3. ALV 출력할 화면 100 생성

ALV를 뿌려줄 화면을 하나 생성한다. 레이아웃에는 ALV가 들어갈 컨테이너를 그려준다. HD_CON

데이터를 가져온뒤 ALV를 뿌려줄거기 때문에 SELECT문 뒤에서 화면 100을 불러온다.

CALL SCREEN 100.

4. ALV 관련 데이터 선언

DATA:     g_alv TYPE REF TO cl_gui_alv_grid,
          g_custom_con TYPE REF TO cl_gui_custom_container,

DATA:     gs_fieldcat TYPE lvc_s_fcat,
          gt_fieldcat TYPE lvc_t_fcat,        "필드 카탈로그
          gs_layo TYPE lvc_s_layo,          "레이아웃 옵션
          gs_sort TYPE lvc_s_sort,           "정렬
          gt_sort TYPE lvc_t_sort,

5. 오브젝트 생성

  CHECK g_custom_con IS INITIAL.

  "화면 100에 생성한 컨테이너 참조해 오브젝트 생성
  CREATE OBJECT g_custom_con
    EXPORTING
       container_name = 'HD_CON'.

  "ALV_CON위에서 ALV 오브젝트 생성
  CREATE OBJECT g_alv
    EXPORTING
      i_parent = g_custom_con.

6. 필드 카탈로그 구성

핫스팟 이벤트를 일으킬판매문서 필드에 핫스팟을 사용한다는 구문을 넣어준다.

  gs_fieldcat-fieldname = 'VBELN'.
  gs_fieldcat-coltext = '판매문서'. "필드헤더 텍스트
  gs_fieldcat-just = 'C'. "가운데정렬, L는 왼쪽정렬, R는 오른쪽정렬
  gs_fieldcat-key = 'X'. "키값 고정
  gs_fieldcat-hotspot = 'X'. "핫스팟
  APPEND gs_fieldcat TO gt_fieldcat.  CLEAR: gs_fieldcat.

  gs_fieldcat-fieldname = 'NETWR'.
  gs_fieldcat-coltext = '정가'.
  gs_fieldcat-just = 'C'.
*  gs_fieldcat-currency = 'KRW'. "통화필드 하드코딩
  gs_fieldcat-cfieldname = 'WAERK'. "참조한 통화단위에 대한 필드이름, 통화필드 참조해서 출력
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'WAERK'.
  gs_fieldcat-coltext = '통화'.
  gs_fieldcat-just = 'L'.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

7. 판매문서 필드 정렬

  gs_sort-spos = 1. "정렬할 열 순서
  gs_sort-fieldname = 'VBELN'.
  gs_sort-down = 'X'.     "내림차순
  APPEND gs_sort TO gt_sort. 
  CLEAR gs_sort.

8. 레이아웃

  gs_layo-zebra = 'X'.
  gs_layo-smalltitle = 'X'.
  gs_layo-cwidth_opt = 'X'. "너비 최적화
  gs_layo-no_merging = 'X'. "셀병합 불가능

9. ALV 출력

필드 카탈로그 구성, 정렬, 레이아웃 로직은 가독성을 위해 FORM문으로 빼주었는데 ALV를 출력하기 전에 PERFORM해주어야 한다.

  PERFORM make_fieldcat.  "필드카탈로그 구성
  PERFORM sort. "정렬
  PERFORM layo. "레이아웃
         CALL METHOD g_alv->set_table_for_first_display "인스턴스명
           EXPORTING
             is_layout                     = gs_layo
           CHANGING
             it_outtab                     = gt_tab 
             it_fieldcatalog               = gt_fieldcat 
             it_sort                       = gt_sort 

ALV 팝업 (Hotspot)

10. 핫스팟ALV 화면200 생성

핫스팟ALV를 뿌려줄 화면을 생성한다. 레이아웃에는 ALV가 들어갈 컨테이너를 그려준다. HD_CON2


11. 핫스팟ALV 관련 데이터 선언

DATA:   gs_tab2 TYPE vbap,
        gt_tab2 TYPE TABLE OF vbap.

DATA:    g_alv2 TYPE REF TO cl_gui_alv_grid,
         g_custom_con2 TYPE REF TO cl_gui_custom_container.

DATA:    gs_fieldcat2 TYPE lvc_s_fcat,
         gt_fieldcat2 TYPE lvc_t_fcat.

12. 이벤트 생성

CLASS lcl_event DEFINITION.
  PUBLIC SECTION. "다른프로그램에서 접근가능
    METHODS : handler_hotspot_click
              FOR EVENT hotspot_click OF cl_gui_alv_grid
              IMPORTING e_row_id  e_column_id es_row_no.
ENDCLASS.  

CLASS lcl_event IMPLEMENTATION. 
  METHOD handler_hotspot_click.
   PERFORM hotspot_click USING e_row_id e_column_id.
  ENDMETHOD.                   
ENDCLASS.  

DATA : g_application TYPE REF TO lcl_event.

13. 핫스팟 구문

FORM hotspot_click  USING p_row_id  p_column_id.
  DATA: l_col(40).
  FIELD-SYMBOLS <fs>.

  READ TABLE gt_tab INTO gs_tab INDEX p_row_id.

  CHECK sy-subrc = 0.

  CONCATENATE 'GS_TAB-' p_column_id INTO l_col.
  ASSIGN      (l_col)       TO         <fs>.

  CHECK NOT <fs> IS INITIAL.
  CASE p_column_id.
    WHEN 'MATNR'.
      SET PARAMETER ID 'MAT' FIELD gs_tab-matnr. "다른프로그램으로 값 넘겨줄 필드, GET은 받을 프로그램의 필드
      CALL TRANSACTION 'ZMARA_11_2'AND SKIP FIRST SCREEN.

  ENDCASE.
  FREE MEMORY ID 'MAT'.
ENDFORM.

14. 오브젝트 생성

  IF  g_custom_con2 IS INITIAL.

  CREATE OBJECT g_custom_con2
    EXPORTING
       container_name = 'HD_CON2'.

  CREATE OBJECT g_alv2
    EXPORTING
      i_parent = g_custom_con2.

 ENDIF.

15. 핸들러 등록

화면100의 ALV에서 이 이벤트가 발생하기 때문에 화면100의 ALV를 출력하기 전에 핸들러를 등록하는 구문을 넣어준다.

 CREATE OBJECT g_application.
  SET HANDLER g_application->handler_hotspot_click FOR g_alv.

16. 이벤트 발생할 필드에 옵션 추가

화면100의 판매문서를 클릭했을때 이벤트가 발생하므로 필드카탈로그를 구성하는 판매문서 필드에 HOTSPOT 옵션 기능을 추가한다.

    gs_fieldcat-fieldname = 'VBELN'.
    gs_fieldcat-coltext = '판매문서'. 
  ✔ gs_fieldcat-hotspot = 'X'. 
    APPEND gs_fieldcat TO gt_fieldcat.  CLEAR: gs_fieldcat.

17. ALV 출력

오브젝트 생성하는 IF문 안에 ALV출력 구문을 넣어준다. 클릭했을때마다 해당하는 데이터를 가져와야하기 때문에 REFRESH구문을 넣어준다.

         CALL METHOD g_alv2->set_table_for_first_display "인스턴스명
           EXPORTING
             i_structure_name              = 'VBAP' 
           CHANGING
             it_outtab                     =  gt_tab2 
   ELSE.
     CALL METHOD g_alv2->refresh_table_display.
     CALL METHOD cl_gui_cfw=>flush.

[실행 화면]

판매문서를 더블클릭하면 판매문서에 대한 정보가 다른창으로 나온다.

아이콘이나 체크박스, 줄색깔, 열색깔은 이후 다룰 alv 레이아웃 제어에서 해볼거다.

728x90
반응형

'ABAP' 카테고리의 다른 글

ALV 5 (SPLIT)  (0) 2023.02.16
ALV 4 (Layout)  (0) 2023.02.16
ALV 2 (이벤트)  (0) 2023.02.16
ALV  (0) 2023.02.16
엑셀 업로드 + BDC  (0) 2023.02.16

댓글