본문 바로가기

개발자愛/SAP

SAP ALV : GET_CURRENT_CELL & Layout Other Method

오늘의 글은... 이쪽 일을 하는 분들께만 참고가 될 수 있는 사항입니다~

무엇보다... 해놓고도 잊어버리는 저를 위해서 다시 메모하는 글이니 이웃분들께서는 과감히 닫아주시면 됩니다^^


보통 ALV 상에서 DATA_CHANGED를 하고 나면 셀의 이동이 고민 됩니다 - 고민할 필요도 없는 사항인가요? ^^;;
 

물론 실력이 좋은 분들께는 아무런 문제도 되지 않는 내용이지만~ 정리합니다. 



아시다시피  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 입니다.


 
GET_CURRENT_CELL에 대해 먼저 정리해보겠습니다.

GET_CURRENT_CELL는 ALV GRID 컨트롤에 커서가 놓인 위치의 값과 속성을 반환합니다.
 




예문으로 보여드리겠습니다.



*&---------------------------------------------------------------------*
*&      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_RESULTL_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_FRONTEND_LAYOUT - 현재 설정되어 있는 ALV GRID의 레이아웃 정보를 가져옵니다.

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시는 되어야 하는군요^^;;;

포스팅을 하고자 마음만 먹는다면 새벽에라도 하면 될 텐데... 게으름만 피우고 있습니다~

날씨가 이제 정말 봄이 다가오는 듯 합니다. 내일은 비 소식과 함께 서늘할 거란 일기예보가 있던데... 감기조심하세요~

행복으로 가득한 하루하루가 되시길 소망합니다^^