Irondol's Life

SAP ABAP ALV Toolbar 버튼 제거 / ABAP ALV Toolbar 버튼 추가 / ABAP ALV Toolbar 버튼 변경 / ABAP ALV Toolbar Function Code / ABAP ALV Grid Function Code 본문

SAP/ABAP

SAP ABAP ALV Toolbar 버튼 제거 / ABAP ALV Toolbar 버튼 추가 / ABAP ALV Toolbar 버튼 변경 / ABAP ALV Toolbar Function Code / ABAP ALV Grid Function Code

irondol 2019. 12. 11. 12:47

 

SAP에서 ALV로 화면 구현을 할 때,

버튼을 구현하고자 하면 어디에 버튼을 달지 정해야 된다.

 

사실 위치는 현업이나 요청자의 기분에 따라 버튼의 위치가 바뀐다.

기존에 버튼이 줄줄이 달렸던 부분에 추가로 달리거나,

기존에 있던 버튼의 기능 대신 다른 기능을 넣어달라고도 한다.

 

특히 ALV Toolbar중 standard 버튼들의 기능 대신 다르게 넣어달라는 참신한 경우도 있다.

그냥 버튼을 새로 만들면 되는데...

꼭 기존 standard 버튼으로 해달라는 경우에도!!!

당황하지 않고 아래 부분을 잘 참조하여 적용하면 된다.

 

툴바 격파하러 꼬!

 

 

 

아래 캡쳐 기준

노란색 부분 툴바와 녹색 부분의 툴바는 로직 구현 방법이 다르다.

 

 

 

노란색 부분 툴바는 GUI Status에서 설정하는 부분이다.

노란색 부분은 일반적인 ALV Grid 화면에서 사용하는 GUI Status 중 Normal Screen에서 Application Toolbar에 해당한다.

노란색 부분에 버튼을 추가하고자 하면 GUI Status를 생성하여 버튼을 추가하고, 해당 화면 PBO에 생성한 GUI Status를 연결하고, PAI에 추가한 버튼의 Function Code(FCODE) 로직을 넣는다. PAI의 Function Code(FCODE)는 화면 Element list에 OK코드로 지정한 변수 ex)OK_CODE 를 통해서 전달된다.

 

 

 

녹색 부분 툴바 제외는 로직으로 구현하면 된다.

~TOP.

DATA : gt_exclude   TYPE ui_functions.  "ALV에서 제외할 Function Code

 

~F01. "제외 로직을 넣을 perform

DATA : ls_exclude TYPE ui_func.

ls_exclude = cl_gui_alv_grid=>mc_fc_refresh.  "refresh 제외

APPEND ls_exclude TO gt_exclude.

 

~C01. "ALV Grid 출력 로직

    CALL METHOD grid->set_table_for_first_display
      EXPORTING
        is_layout            gs_layout
        it_toolbar_excluding = gt_exclude
      CHANGING
        it_fieldcatalog      fieldcat[]
        it_outtab            it_display[]
        it_sort              gt_sort[].

 

 

 

SAP ALV Toolbar 버튼 Function Code / ALV Grid Function Code 내역은 다음과 같다.

위 로직 중 ls_exclude에 아래 정리된 툴바의 Function Code(Fcode)를 추가하면 화면에 보이지 않는다.

녹석 부분 툴바는 기본적으로 모든 툴바 버튼이 다 보이고, 제외하는 형식이다. 

모두 다 안보이게 하고자 할때는 mc_fc_excl_all을 적용하면 된다. 

 

출처 : https://www.volker-wegert.de/en/alv-function-codes

 

 

 

* 만약 녹색 부분 툴바에 기존에 없는 버튼을 추가하거나 변경하고자 하면 다음과 같다.

 

* Event Handler Class
CLASS lcl_evt_handler DEFINITION.  "DEFINITION
  PUBLIC SECTION.                       "PUBLIC
* Event Handler Method

* toolbar
    CLASS-METHODS : on_toolbar FOR EVENT toolbar
                                              OF cl_gui_alv_grid
                                  IMPORTING e_object.
* user_command
    CLASS-METHODS : on_before_user_command FOR EVENT before_user_command
                                                                  OF cl_gui_alv_grid
                                                      IMPORTING e_ucomm.

* user_command 
    CLASS-METHODS : on_user_command FOR EVENT user_command 
                                                        OF cl_gui_alv_grid 
                                            IMPORTING e_ucomm. 

ENDCLASS.                    "LCL_EVT_HANDLER DEFINITION

 

 

CLASS lcl_evt_handler IMPLEMENTATION.  "IMPLEMENTATION
* toolbar
  METHOD on_toolbar.  "녹색 부분 툴바에 버튼 추가
    DATA : lw_button TYPE stb_button.
    CLEAR lw_button.
    lw_button-function  = 'BCANC'.
    lw_button-icon      = icon_incomplete. 
    lw_button-butn_type = 0.
    lw_button-text      = 'Cancel'.
    APPEND lw_button TO e_object->mt_toolbar.           "APPEND로 하면 ALV 툴바 맨 뒤에 생김.

*    INSERT lw_button TO e_object->mt_toolbar index 1. "INSERT로 하면 ALV 툴바 index 자리로 생김. 1로 하면 맨 앞.
  ENDMETHOD.                    "on_toolbar


* before_user_command
  METHOD on_before_user_command.  "녹색 부분 툴바 버튼이 다른로직 타게 변경
    CASE e_ucomm.
      WHEN cl_gui_alv_grid=>mc_fc_detail.
        gr_alv->set_user_command('DETAIL_N').
    ENDCASE.
  ENDMETHOD.                    "on_before_user_command

 

* user_command
  METHOD on_user_command. 
    DATA : lt_selected TYPE lvc_t_roid, 
           lw_selected LIKE LINE OF lt_selected, 
           ls_s_col    TYPE lvc_s_col. 
    CASE e_ucomm. 
      WHEN 'BCANC'. "버튼 추가

        MESSAGE 'Cancel Clicked!' TYPE 'I'. 

      WHEN 'DETAIL_N'. "버튼 변경
        MESSAGE 'Hooked!!!' TYPE 'I'. 
    ENDCASE. 
  ENDMETHOD.                    "on_user_command 

ENDCLASS.                    "LCL_EVT_HANDLER IMPLEMENTATION

 

 

* ALV 출력 전 Event Handler 활성화.

  IF gr_container IS INITIAL.

    CREATE OBJECT gr_container

      EXPORTING

        container_name = 'MY_CONTAINER'.

 

    CREATE OBJECT gr_alv

      EXPORTING

        i_parent = gr_container.

 

* ALV = gr_alv에서 발생한 이벤트를 각각 받아서 처리하겠다라고 활성화

* toolbar

  SET HANDLER lcl_evt_handler=>on_toolbar FOR gr_alv.

before_user_command

  SET HANDLER lcl_evt_handler=>on_before_user_command FOR gr_alv.

* user_command

  SET HANDLER lcl_evt_handler=>on_user_command FOR gr_alv.

 

    CALL METHOD gr_alv->set_table_for_first_display

      EXPORTING

         is_layout = ~~~

      CHANGING

        it_fieldcatalog = ~~~

        it_outtab = ~~~

        it_sort = ~~~.

  ELSE.

    gs_stable-row = 'X'. "가로 스크롤 고정

    gs_stable-col = 'X'. "세로 스크롤 고정

    CALL METHOD gr_alv->refresh_table_display

      EXPORTING

        is_stable = gs_stable

        i_soft_refresh = 'X'.

  ENDIF.

 

 

 

끝! 참 쉽죠?

Comments