Protected Method 사용이 가능하다.
주홍글씨.. 두번코딩했네..
*-- local Class 선언 및 Protected method -> public method 로 끌어내기
CLASS: lcl_grid DEFINITION DEFERRED.
DATA: g_grid TYPE REF TO lcl_grid.
CLASS lcl_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
PUBLIC SECTION.
METHODS: set_err_cells IMPORTING it_err TYPE lvc_t_err.
ENDCLASS.
CLASS lcl_grid IMPLEMENTATION.
METHOD: set_err_cells.
CALL METHOD me->set_error_cells
EXPORTING
cell_table = cell_table
EXCEPTIONS
error = 1
OTHERS = 2.
ENDMETHOD. "set_err_cells
ENDCLASS.
*-- 에러 처리
DATA: lt_err TYPE lvc_t_err,
ls_err TYPE lvc_s_err.
*-- gt_outtab 의 유효성 점검
IF lv_error = 'X'.
ls_err-row_id = l_tabix.
READ TABLE gt_fieldcat INTO ls_fcat WITH KEY fieldname = ls_good_cells-fieldname.
IF sy-subrc = 0.
ls_err-col_id = ls_fcat-col_pos.
APPEND ls_err TO lt_err.
ENDIF.
ENDIF.
*-- 메서드 콜.
CALL METHOD g_grid->set_err_cells
EXPORTING
it_err = lt_err.
Editable alv 의 SAVE 시 에러처리를 명확하게 해줄 수 있다.
DATA: lcl_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*-- 이유는 모르겠지만, Free 처리 해주지 않으면 두번째는 메세지 출력 안됨.
FREE: lcl_data_changed.
IF lcl_data_changed IS INITIAL.
CREATE OBJECT lcl_data_changed
EXPORTING
i_calling_alv = g_grid.
ENDIF.
*-- Create object 시 fieldcat 을 가져오지 않아서 넣어줘야 함.
lcl_data_changed->mt_fieldcatalog = gt_fieldcat.
*-- 기존에 발생된 메세지 초기화
lcl_data_changed->refresh_protocol( ).
IF lv_error = 'X'.
CALL METHOD lcl_data_changed->add_protocol_entry
EXPORTING
i_msgid = '0K'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = l_text
i_msgv2 = ls_good_cells-value
i_msgv3 = '을(를) 입력하세요'
i_fieldname = ls_good_cells-fieldname
i_row_id = l_tabix.
ls_err-row_id = l_tabix.
READ TABLE gt_fieldcat INTO ls_fcat WITH KEY fieldname = ls_good_cells-fieldname.
IF sy-subrc = 0.
ls_err-col_id = ls_fcat-col_pos.
APPEND ls_err TO lt_err.
ENDIF.
ENDIF.
* ... 처리로직 종료후 주홍글씨 넣기
CALL METHOD g_grid->set_err_cells
EXPORTING
it_err = lt_err.
*-- 모아둔 Protocol 출력.
CALL METHOD lcl_data_changed->display_protocol.