ALV 툴바 버튼 Add & Exclude

11398 단어 buttonabapEventALVALV

조회일때는 행추가, 행삭제 버튼이 안보이게 한다.

행추가, 행삭제 버튼을 따로 만들어줬으므로 변경 모드시 보여지는 Standard 행추가, 행삭제 버튼은 보이지 않게 한다.


1. 변수 선언

exclude할 버튼을 담을 변수를 선언한다.

DATA:   gt_functions TYPE ui_functions.

2. 이벤트 생성

CLASS lcl_event DEFINITION. "정의부
  PUBLIC SECTION.
    METHODS : handler_toolbar
                  FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.

    METHODS : handler_user_command
                  FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm.
ENDCLASS.                   


CLASS lcl_event IMPLEMENTATION. "구현부
  METHOD handler_toolbar.
    PERFORM toolbar_set USING e_object e_interactive.
  ENDMETHOD.                    "handler_toolbar

  METHOD handler_user_command.
    PERFORM user_command_grid USING e_ucomm.
  ENDMETHOD.                    "handler_user_command
ENDCLASS.                    "LCL_EVENT IMPLEMENTATION

DATA : g_application TYPE REF TO lcl_event.

툴바 버튼은 GUI Status나 일반 버튼과 달리 alv 이벤트에 해당한다. 그래서 method로 이벤트 등록을 해주어야 한다.

handler_toolbar ALV 툴바에 넣을 버튼을 정의한다.
handler_user_command 정의한 버튼 클릭시 어떤 이벤트가 일어날건지 구현한다.

핸들러를 생성하기 위해 클래스를 참조하는 변수 G_APPLICATION을 선언해준다. 핸들러를 등록할때 사용한다.


3. 핸들러 등록

아무리 로직을 짜도 핸들러 등록 안하면 이벤트 안탄다. 깜박하기 쉬워서 나는 이벤트 구현할때 같이 등록해놓는다.

  CREATE OBJECT g_application.
  SET HANDLER g_application->handler_toolbar FOR g_alv.
  SET HANDLER g_application->handler_user_command FOR g_alv.

4. 툴바 버튼 생성

FORM toolbar_set USING r_object  TYPE REF TO cl_alv_event_toolbar_set
                       r_interactive.

  DATA : ls_toolbar  TYPE stb_button.

  IF r_u = 'X'.
    CLEAR ls_toolbar.
    MOVE 3                 TO ls_toolbar-butn_type.
    APPEND ls_toolbar      TO r_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 'ADD'            TO ls_toolbar-function. "INT에 APPEND
    MOVE icon_insert_row TO ls_toolbar-icon.
    MOVE '행추가'          TO ls_toolbar-quickinfo.
    MOVE '행추가'          TO ls_toolbar-text.
    MOVE ' '               TO ls_toolbar-disabled.
    APPEND ls_toolbar TO r_object->mt_toolbar.

    MOVE 'DEL'            TO ls_toolbar-function. "INT에 APPEND
    MOVE icon_delete_row TO ls_toolbar-icon.
    MOVE '행삭제'          TO ls_toolbar-quickinfo.
    MOVE '행삭제'          TO ls_toolbar-text.
    MOVE ' '               TO ls_toolbar-disabled.
    APPEND ls_toolbar TO r_object->mt_toolbar.
  ENDIF.
ENDFORM.

변경일 경우에만 툴바 버튼을 추가해준다.

맨앞에 툴바 추가할경우엔,
INSERT ls_toolbar INTO r_object->mt_toolbar INDEX 1.


5. 툴바 버튼 클릭시 이벤트

FORM user_command_grid  USING   r_ucomm.
  DATA : lt_rows TYPE lvc_t_row,
         ls_rows LIKE LINE OF lt_rows.
  DATA: l_scroll TYPE lvc_s_stbl.


  CASE r_ucomm.
    WHEN 'ADD'.
      APPEND gs_tab TO gt_tab.

    WHEN 'DEL'.
      CALL METHOD g_alv->get_selected_rows
        IMPORTING
          et_index_rows = lt_rows. "alv에서 선택된 라인이 it_rows에 들어간다.

      DESCRIBE TABLE lt_rows LINES sy-tfill.

      IF sy-tfill = 0.
        MESSAGE i000 WITH '항목을 선택하세요'.
        EXIT.
      ELSE.
        LOOP AT lt_rows INTO ls_rows.
          READ TABLE gt_tab INTO gs_tab INDEX ls_rows-index.
          gs_tab-del_flag = 'X'.
          MODIFY gt_tab FROM gs_tab INDEX ls_rows-index TRANSPORTING del_flag.
          MOVE-CORRESPONDING gs_tab TO gs_del.
          APPEND gs_del TO gt_del.
        ENDLOOP.
        DELETE gt_tab WHERE del_flag = 'X'.
      ENDIF.
  ENDCASE.

  l_scroll-row = 'X'.
  l_scroll-col = 'X'.
  CALL METHOD g_alv->refresh_table_display
    EXPORTING
      i_soft_refresh = ''
      is_stable      = l_scroll.
ENDFORM.

행을 추가하는 건 단순하게 라인 하나씩 append 해주면 된다.

행을 삭제할 때는 항목을 선택하지 않고 삭제하면 항목을 선택하라는 에러메세지를 뜨게한다. 아니라면 선택된 row의 del_flag에 x 표시를 하고 x 표시가 된 항목은 alv에서 삭제한다. gt_del에는 del_flag가 표시된 항목들만 따로 담겨있다. 삭제한 뒤 alv를 refresh해준다. 이후 save할때 modify와 함께 delete 해주면 변경과 삭제가 모두 반영된다.


6. SAVE

화면에 그려진 ALV는 화면 100에 그려져 있기 때문에 100의 PAI에서 저장버튼 로직을 구현한다.

MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'SAVE'.
      DATA: lw_valid(1),
       lw_refresh(1) VALUE 'X'.

      "변경 확인 및 DATA_CHANGED 이벤트 발생
      CALL METHOD g_alv->check_changed_data
        IMPORTING
          e_valid   = lw_valid
        CHANGING
          c_refresh = lw_refresh.

      LOOP AT gt_tab INTO gs_tab.
        IF gs_tab-matnr IS INITIAL.
          CASE gs_tab-mtart.
            WHEN 'FERT'.
              CALL FUNCTION 'NUMBER_GET_NEXT'
                EXPORTING
                  nr_range_nr = '01'
                  object      = 'ZMP_TMAT' "SNUM에서 생성한 넘버레인지
                IMPORTING
                  number      = gs_tab-matnr. "체번할 필드
            WHEN 'ROH'.
              CALL FUNCTION 'NUMBER_GET_NEXT'
                EXPORTING
                  nr_range_nr = '02'
                  object      = 'ZMP_TMAT' "SNUM에서 생성한 넘버레인지
                IMPORTING
                  number      = gs_tab-matnr.
          ENDCASE.
          gs_tab-erdat = sy-datum.
          gs_tab-ernam = sy-uname.
          gs_tab-erzet = sy-uzeit.

          MODIFY gt_tab FROM gs_tab.

        ELSE.
          EXIT.
        ENDIF.
      ENDLOOP.

      MODIFY zmp_tmat FROM TABLE gt_tab.
      DELETE zmp_tmat FROM TABLE gt_del.

      IF sy-subrc = 0.
        MESSAGE s000 WITH '변경되었습니다.'.
      ELSE.
        MESSAGE e000 WITH '실패했습니다'.
      ENDIF.

  ENDCASE.
ENDMODULE.

7. STANDARD 툴바 Exclude

이 부분 역시 화면에 alv가 뿌려지기 전에 수행되야 하므로 set_table_for_first_display 이전에 perform한다.

FORM exclude_of_toolbar_button .
  REFRESH : gt_functions.
  CLEAR   : gt_functions.

  IF r_u = 'X'.
    PERFORM add_exclude_toolbar_button
           TABLES gt_functions
*        USING : cl_gui_alv_grid=>mc_fc_excl_all. " 툴바 모두제거 
           USING : cl_gui_alv_grid=>mc_fc_loc_undo, " 실행취소&LOCAL&UNDO
*                 cl_gui_alv_grid=>mc_fc_auf,      " 소계확장 &AUF
*                 cl_gui_alv_grid=>mc_fc_average,  " &AVERAGE
*                 cl_gui_alv_grid=>mc_fc_back_classic,
*                 cl_gui_alv_grid=>mc_fc_call_abc, " &ABC
*                 cl_gui_alv_grid=>mc_fc_call_chain,
*                 cl_gui_alv_grid=>mc_fc_call_crbatch,
*                 cl_gui_alv_grid=>mc_fc_call_crweb,
*                 cl_gui_alv_grid=>mc_fc_call_lineitems,
*                 cl_gui_alv_grid=>mc_fc_call_master_data,
*                 cl_gui_alv_grid=>mc_fc_call_more,
*                 cl_gui_alv_grid=>mc_fc_call_report,
*                 cl_gui_alv_grid=>mc_fc_call_xint,
*                 cl_gui_alv_grid=>mc_fc_call_xxl,
**                 cl_gui_alv_grid=>mc_fc_col_invisible,
**                 cl_gui_alv_grid=>mc_fc_col_optimize,
*                 cl_gui_alv_grid=>mc_fc_current_variant,
*                 cl_gui_alv_grid=>mc_fc_data_save,
**                 cl_gui_alv_grid=>mc_fc_delete_filter,
**                 cl_gui_alv_grid=>mc_fc_deselect_all,
*                 cl_gui_alv_grid=>mc_fc_detail,
*                 cl_gui_alv_grid=>mc_fc_expcrdata,
*                 cl_gui_alv_grid=>mc_fc_expcrdesig,
*                 cl_gui_alv_grid=>mc_fc_expcrtempl,
*                 cl_gui_alv_grid=>mc_fc_html,
*                 cl_gui_alv_grid=>mc_fc_url_copy_to_clipboard,
*                 cl_gui_alv_grid=>mc_fc_expmdb,
*                 cl_gui_alv_grid=>mc_fc_extend,
*                 cl_gui_alv_grid=>mc_fc_f4,
**                 cl_gui_alv_grid=>mc_fc_filter,
**                 cl_gui_alv_grid=>mc_fc_find,
*                 cl_gui_alv_grid=>mc_fc_fix_columns,
*                 cl_gui_alv_grid=>mc_fc_graph,
*                 cl_gui_alv_grid=>mc_fc_help,
*                 cl_gui_alv_grid=>mc_fc_info,              " !: INFO
*                 cl_gui_alv_grid=>mc_fc_load_variant,
                   cl_gui_alv_grid=>mc_fc_loc_copy,          " 행 카피.
                   cl_gui_alv_grid=>mc_fc_html,
                   cl_gui_alv_grid=>mc_fc_loc_copy_row,      " 행 카피.
                   cl_gui_alv_grid=>mc_fc_loc_cut,           " 가위.
                   cl_gui_alv_grid=>mc_fc_loc_delete_row,    " 행삭제.
                   cl_gui_alv_grid=>mc_fc_loc_insert_row,    " 행삽입.
                   cl_gui_alv_grid=>mc_fc_loc_move_row,
                   cl_gui_alv_grid=>mc_fc_loc_append_row,    " 라인생성.
                   cl_gui_alv_grid=>mc_fc_loc_paste,         " 겹쳐쓰기.
                   cl_gui_alv_grid=>mc_fc_loc_paste_new_row, " 겹쳐쓰기.
*                 cl_gui_alv_grid=>mc_fc_maintain_variant,
*                 cl_gui_alv_grid=>mc_fc_maximum,
**                 CL_GUI_ALV_GRID=>MC_FC_MINIMUM,
**                 CL_GUI_ALV_GRID=>MC_FC_PC_FILE,
*                 cl_gui_alv_grid=>mc_fc_print,
*                 cl_gui_alv_grid=>mc_fc_print_back,
*                 cl_gui_alv_grid=>mc_fc_print_prev,
**                 cl_gui_alv_grid=>mc_fc_refresh,           " REFRESH
*                 cl_gui_alv_grid=>mc_fc_reprep,
*                 cl_gui_alv_grid=>mc_fc_save_variant,
*                 cl_gui_alv_grid=>mc_fc_select_all,
*                 cl_gui_alv_grid=>mc_fc_send,
*                 cl_gui_alv_grid=>mc_fc_separator,
*                 cl_gui_alv_grid=>mc_fc_sort,
**                 cl_gui_alv_grid=>mc_fc_sort_asc,
**                 cl_gui_alv_grid=>mc_fc_sort_dsc,
**                 CL_GUI_ALV_GRID=>MC_FC_SUM,
**                 CL_GUI_ALV_GRID=>MC_FC_SUBTOT,
**                 CL_GUI_ALV_GRID=>MC_MB_SUM,
**                 CL_GUI_ALV_GRID=>MC_FC_SUM,
**                 CL_GUI_ALV_GRID=>MC_MB_EXPORT,            "EXPORT
*                 cl_gui_alv_grid=>mc_fc_to_office,
*                 cl_gui_alv_grid=>mc_fc_to_rep_tree,
*                 cl_gui_alv_grid=>mc_fc_unfix_columns,
*                 cl_gui_alv_grid=>mc_fc_views,
*                 cl_gui_alv_grid=>mc_fc_view_crystal,
**                 CL_GUI_ALV_GRID=>MC_FC_VIEW_EXCEL,
*                 cl_gui_alv_grid=>mc_fc_view_grid,
                   cl_gui_alv_grid=>mc_fc_word_processor.
  ENDIF.
ENDFORM.

주석은 보여질 버튼이고 주석하지 않은 게 exclude할 버튼이다. 헷갈리지 말것!

FORM add_exclude_toolbar_button  TABLES  lt_table
                                 USING   l_value.

  DATA: l_exclude TYPE ui_func.

  l_exclude = l_value.
  APPEND l_exclude TO lt_table.

ENDFORM.

set_table_for_first_display의 exporting에 toolbar부분에 gt_functions를 입력해줘야 적용된다.


8. ALV Display

  CALL METHOD g_alv->set_table_for_first_display
    EXPORTING
      it_toolbar_excluding = gt_functions

제외할 버튼이 담긴 gt_functions !

좋은 웹페이지 즐겨찾기