오랜만에 ABAP 개발 관련 포스팅을 작성한다. 요즘 개발 할 일이 없었다기 보다는 개발을 해도 이전에 사용하던 내용을 복붙 신공으로 개발을 해서 인지 새로운 내용을 조사할 일이 별로 없었는데 이번에 ALV 에서 On_F4 이벤트 이후 Data Changed 이벤트를 태워야 하는 경우가 생겨서 구글에서 찾아본 내용을 작성하고자 한다.
( 실제로 구글에서 찾았다기 보다 SAP 데모 ALV 프로그램에 힌트가 있었다. )
오늘의 목표는 Class ALV 에서 특정 셀에서 ON F4 Event 수행 이후에 Data Changed Event 수행을 시키고, Data Changed Event 에서 변경된 셀의 정보를 가지고 체크 로직을 태우는 부분이다. ON_F4 이벤트가 수행하기 전에 Data Changed Event 를 태울 수는 있는 것 같다. 그런데 ON_F4 를 수행하고 난 이후에는 Data Changed Event 가 타지 않아서 체크로직을 별도로 On_F4 아래 넣던가 다른 방식을 찾아야만 했다. 그러나 아래와 같은 코드를 이용하면 ON_F4 이벤트 이후 Data Changed Event 도 태울 수 있고, 변경된 셀의 정보를 가지고 Data Changed Finish 이벤트까지 사용 할 수 있다.
*&---------------------------------------------------------------------* *& Form ON_F4 *&---------------------------------------------------------------------* form on_f4 using p_fieldname type lvc_fname p_row_id type lvc_s_roid pr_event_data type ref to cl_alv_event_data pt_bad_cells type lvc_t_modi p_e_display type char01. field-symbols:type lvc_t_modi. data : it_return type standard table of ddshretval with header line. perform f4_module tables it_return using ''. check it_return[] is not initial. read table it_return index 1. read table gt_data index p_row_id-row_id. if sy-subrc eq 0. gt_data-zz_event = it_return-fieldval. modify gt_data index p_row_id-row_id. endif. " ONF4 이후에 DATA CHANGED EVENT 를 탈 경우 " 수정된 정보가 없기 때문에 강제로 수정된 필드와 값을 만들어 준다. " 이것 때문에 아주 고생이다. assign pr_event_data->m_data->* to . data : mt_roid type lvc_t_roid, ls_roid type lvc_s_roid, ls_modi type lvc_s_modi. clear : mt_roid, ls_roid, ls_modi. ls_modi-row_id = p_row_id-row_id. ls_modi-fieldname = 'ZZ_EVENT'. ls_modi-value = it_return-fieldval. append ls_modi to . " 여기에 변경된 데이터를 추가하면 Data Changed Event 에서 사용가능하다. pr_event_data->m_event_handled = 'X'. " Data Changed Event 를 수행한다. when others. endform. " ON_F4 *&---------------------------------------------------------------------* *& Form F4_MODULE *&---------------------------------------------------------------------* form f4_module tables pt_return structure ddshretval using value(p_module). data : begin of lt_value occurs 0, zz_event(10), end of lt_value. clear : pt_return[], lt_value, lt_value[]. lt_value-zz_event = 'AAA'. append lt_value. lt_value-zz_event = 'BBB'. append lt_value. lt_value-zz_event = 'CCC'. append lt_value. call function 'F4IF_INT_TABLE_VALUE_REQUEST' exporting retfield = 'ZZ_EVENT' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = p_module value_org = 'S' tables value_tab = lt_value return_tab = pt_return exceptions parameter_error = 1 no_values_found = 2 others = 3. endform. " F4_MODULE *&---------------------------------------------------------------------* *& Form DATA_CHANGED *&---------------------------------------------------------------------* form data_changed using p_data_changed type ref to cl_alv_changed_data_protocol p_ucomm. data: ls_modi type lvc_s_modi, lt_modi type lvc_t_modi, ls_data like gt_data, lv_value(30), lv_error. field-symbols type any. " 변경된 CELL 정보를 가져온다. lt_modi[] = p_data_changed->mt_mod_cells[]. loop at lt_modi into ls_modi. " 체크로직 추가 case ls_modi-fieldname. when 'ZZ_EVENT'. " 기존 데이터가 존재하면 오류 처리 perform is_exist_equnr using ls_modi changing lv_error. if lv_error is not initial. message s000 display like 'E' with '오류가 발생하였습니다.'. call method p_data_changed->modify_cell exporting i_row_id = ls_modi-row_id i_fieldname = 'ZZ_EVENT' i_value = ''. exit. endif. when others. endcase. endloop. endform. " DATA_CHANGED
반응형
'SAP > ABAP' 카테고리의 다른 글
SAP R/3 에서 차트, 그래프 그리기 : GRAPHICS GUI CE DEMO (0) | 2015.10.01 |
---|---|
Functional ALV 에서 선택한 컬럼 가져오는 함수 : REUSE_ALV_GRID_LAYOUT_INFO_GET (0) | 2015.10.01 |
ABAP 스마트폼 언어별 텍스트가 다르게 나오는 경우 해결방법 (0) | 2015.05.22 |
ABAP 개발을 위한 Eclipse 및 플러그인 설치하기 (0) | 2015.04.06 |
ABAP 개발자의 시작 (0) | 2015.04.06 |
ABAP 메모리상의 프로그램 로컬 변수 Local Variable 접근하기 (0) | 2015.02.25 |
ABAP 간단한 결과 내용을 ALV 팝업으로 출력하기 (0) | 2015.02.06 |
ABAP BDC 동일한 Work Order 수행시 오류 발생(IW32) (0) | 2015.02.05 |
ABAP Call Screen 100 실행 후 Write 구문 출력하기 (0) | 2015.01.26 |
ABAP 텍스트 박스 ( Input Box ) Dropdown List 만들기 (0) | 2015.01.20 |