SAP/ABAP

ABAP Class ALV On F4 이벤트 이후 Data Changed Event 사용하기

그녀는애교쟁이 2015. 11. 5. 12:00
반응형

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