오랜만에 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 |