조회일때는 행추가, 행삭제 버튼이 안보이게 한다.
행추가, 행삭제 버튼을 따로 만들어줬으므로 변경 모드시 보여지는 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 !
'ABAP' 카테고리의 다른 글
ALV 특정 Cell EDIT (0) | 2023.02.21 |
---|---|
ALV Data changed Event (0) | 2023.02.20 |
ALV 조회, 변경 mode (0) | 2023.02.20 |
유용한 날짜 function들 (0) | 2023.02.20 |
Selection-screen 버튼 그리기 (0) | 2023.02.20 |
댓글