오늘의 글은... 이쪽 일을 하는 분들께만 참고가 될 수 있는 사항입니다~
무엇보다... 해놓고도 잊어버리는 저를 위해서 다시 메모하는 글이니 이웃분들께서는 과감히 닫아주시면 됩니다^^
물론 실력이 좋은 분들께는 아무런 문제도 되지 않는 내용이지만~ 정리합니다.
아시다시피 DATA_CHANGED 경우 두가지의 방법으로 적용이 가능합니다.
CALL METHOD
G_GRID1 ->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
상기 경우는 엔터를 눌렀을 때 적용되도록 하는 방법입니다.
그런데, ALV 상에서 데이터가 변경이 될 때~ 엔터키를 누르는 분이 있는가 하면, 탭(TAB) 키를 누르는 분도 있습니다.
CALL METHOD G_GRID1->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
이 경우는 셀을 벗어날 때 적용이 됩니다.
때문에 보통은 아래의 경우를 많이 사용합니다.
문제(?)는 FOCUS 입니다.
셀을 벗어난 뒤 데이터 값이 바뀌고, FOCUS를 주지 않거나 엉뚱하게 주면 다른 곳으로 날아가버리는데~
이 때 사용하기 좋은 방법이 GET_CURRENT_CELL 입니다.
예문으로 보여드리겠습니다.
*&---------------------------------------------------------------------*
*& Form DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM DATA_CHANGED USING P_ER_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL
P_UCOMM.
DATA : LS_MOD_CELLS TYPE LVC_S_MODI.
DATA : L_FNAME TYPE LVC_S_MODI-FIELDNAME,
L_VALUE(255).
DATA : S_ROW TYPE LVC_S_ROW,
S_COL TYPE LVC_S_COL,
L_INDEX TYPE SY-INDEX.
DATA : L_RESULT(1),
L_MSG(255).
DATA : L_ROW TYPE I,
L_VALUEC TYPE C,
L_COL TYPE I,
LS_ROW TYPE LVC_S_ROW,
LS_COL TYPE LVC_S_COL,
LS_ROID TYPE LVC_S_ROID.
*-- 이곳이 포인트1 입니다 (데이터가 변경 되기 전, -셀이 어디로 움직였는지- 셀의 현 위치를 확인 합니다)
CALL METHOD G_GRID1->GET_CURRENT_CELL
IMPORTING
E_ROW = L_ROW
E_VALUE = L_VALUEC
E_COL = L_COL
ES_ROW_ID = LS_ROW
ES_COL_ID = LS_COL
ES_ROW_NO = LS_ROID.
LOOP AT P_ER_DATA_CHANGED->MT_GOOD_CELLS INTO LS_MOD_CELLS.
READ TABLE GT_ITAB INDEX LS_MOD_CELLS-ROW_ID.
L_INDEX = LS_MOD_CELLS-ROW_ID."SY-TABIX.
CALL METHOD P_ER_DATA_CHANGED->GET_CELL_VALUE
EXPORTING
I_ROW_ID = LS_MOD_CELLS-ROW_ID
I_FIELDNAME = LS_MOD_CELLS-FIELDNAME
IMPORTING
E_VALUE = L_VALUE.
CLEAR : L_RESULT, L_MSG.
CASE LS_MOD_CELLS-FIELDNAME.
WHEN '필드명1'. "조건에 따른 내용1
WHEN '필드명2'. "조건에 따른 내용2
WHEN '필드명3'. "조건에 따른 내용3
WHEN OTHERS.
ENDCASE.
MODIFY GT_ITAB INDEX LS_MOD_CELLS-ROW_ID .
PERFORM BUILD_DATA. "<--- 이곳은 무시하시면 됩니다 CELLTAB의 적용을 위한 부분입니다
CALL METHOD G_GRID1->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = GS_STABLE
I_SOFT_REFRESH = ''.
*-- 아래에서 포커싱을 하고(하지 않아도 상관없습니다)
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = G_GRID1.
*-- 이곳이 포인트2 입니다 (미리 파악해놓은 셀의 위치로 찾아갑니다)
CALL METHOD G_GRID1->SET_CURRENT_CELL_VIA_ID
EXPORTING
IS_ROW_ID = LS_ROW
IS_COLUMN_ID = LS_COL.
CLEAR : GT_ITAB.
ENDLOOP.
ENDFORM. "DATA_CHANGED
상기 예문처럼 적용한다면 셀의 이동은 이동대로, 변경 된 데이터는 데이터 대로 적용이 됩니다
글의 처음에 말씀드렸듯, 제가 이런 걸 만들 때 마다 생각해내는게 늦다보니 정리를 하는 것입니다^^;;
뭘 이런걸 글로 다 올려? 하는 분께서는 패스 하시면 되는 내용입니다~ㅋ
GET_SELECTED_CELLS - 현재 선택된 복수의 셀 정보를 LVC_T_CELL 타입의 테이블로 반환합니다.
(현재 선택된 셀들의 필드명, 인덱스 등의 정보를 가져옴)
GET_SELECTED_COLUMNS - 선택된 컬럼들의 정보를 LVC_T_COL 타입의 테이블로 반환합니다
GET_SELECTED_ROW - 선택된 멀티 라인의 정보를 LVC_T_ROW 타입의 테이블로 반환합니다
SET_FRONTEND_LAYOUT - ALV GRID LAYOUT을 변경.
이 메소드 호출한 후에 REFRESH_TABLE_DISPLAY 메소드를 호출하면 변경된 레이아웃이 적용됩니다.
일을 하며 시간에 쫒기다보니, 퇴근해서 들어가는 시간이 11시는 되어야 하는군요^^;;;
포스팅을 하고자 마음만 먹는다면 새벽에라도 하면 될 텐데... 게으름만 피우고 있습니다~
날씨가 이제 정말 봄이 다가오는 듯 합니다. 내일은 비 소식과 함께 서늘할 거란 일기예보가 있던데... 감기조심하세요~
행복으로 가득한 하루하루가 되시길 소망합니다^^
'개발자愛 > SAP' 카테고리의 다른 글
SAP Financials (FI/CO) Transaction Codes (0) | 2016.12.13 |
---|---|
SORTED TABLE (0) | 2012.08.13 |
[SAP] 개발서버 / QA / 운영 의 DB속도가 심하게 차이날 때 or 액세스 속도가 너무 오래 걸릴 때 (8) | 2012.02.22 |
SAP/ABAP - BAdI 예제 (구매처 생성/변경/조회 시 기능확장) (19) | 2011.11.02 |
SAP ERP / ABAP => CTS 이전 버전으로 돌리기 (프로그램 버전별 관리) (14) | 2011.09.06 |