SAP/ABAP ALV

(ABAP ALV) F4_ALV

haramang 2022. 2. 8. 05:55
*&---------------------------------------------------------------------*
*& Form ONF4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_FIELDNAME
*&      --> E_FIELDVALUE
*&      --> ES_ROW_NO
*&      --> ER_EVENT_DATA
*&      --> ET_BAD_CELLS
*&      --> E_DISPLAY
*&---------------------------------------------------------------------*
FORM onf4 USING pe_fieldname TYPE lvc_fname
                    pe_fieldvalue   TYPE  lvc_value
                    ps_row_no       TYPE  lvc_s_roid
                    pr_event_data   TYPE REF TO cl_alv_event_data
                    pt_bad_cells    TYPE  lvc_t_modi
                    pe_display      TYPE  char01.

  " 코스트센터 체크 테이블
  DATA: BEGIN OF ls_kostl,
          kostl TYPE kostl,
          ktext TYPE ktext,
        END OF ls_kostl,
        lt_kostl LIKE TABLE OF ls_kostl.

  " 원가요소 체크 테이블
  DATA: BEGIN OF ls_kstar,
          kstar TYPE kostl,
          ktext TYPE ktext,
        END OF ls_kstar,
        lt_kstar LIKE TABLE OF ls_kstar.

  DATA: lt_return TYPE TABLE OF ddshretval WITH HEADER LINE. " 리턴 테이블

  DATA: ls_modi TYPE lvc_s_modi.               " 변경된 데이터 구조체
  FIELD-SYMBOLS: <fs_tab> TYPE lvc_t_modi.     " 필드심볼

  CLEAR: ls_kostl, lt_kostl[], ls_kstar, lt_kstar[].
  CLEAR: lt_return[], ls_modi, gs_t_plan.

  " 비용처리계획 테이블에서 현재 선택된 라인 가져옴
  READ TABLE gt_t_plan INTO gs_t_plan INDEX ps_row_no-row_id.

  " DATA CHANEGED 로 이동 세팅 / Standard f4 억제
  pr_event_data->m_event_handled = 'X'.

  " 필드이름이 코스트센터일 경우,
  IF pe_fieldname = 'KOSTL'.

    " 코스트센터 데이터 가져옴
    SELECT a~kostl, b~ktext
      FROM csks AS a
      LEFT OUTER JOIN cskt AS b
      ON a~kostl = b~kostl
      AND b~spras = 'E'
      INTO CORRESPONDING FIELDS OF TABLE @lt_kostl
      ORDER BY a~kostl.

    " 중복데이터 제거
    DELETE ADJACENT DUPLICATES FROM lt_kostl COMPARING kostl.

    " Search Help 생성
    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'KOSTL'
        value_org       = 'S'
        dynpprog        = sy-cprog
        dynpnr          = sy-dynnr
      TABLES
        value_tab       = lt_kostl
        return_tab      = lt_return
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.

    " 필드이름이 워낙요소일경우
  ELSEIF pe_fieldname = 'KSTAR'.

    " 원가요소 데이터 가져옴
    SELECT kstar, ktext
      FROM csku
      INTO CORRESPONDING FIELDS OF TABLE @lt_kstar
      WHERE spras = 3 OR spras = 'E'
      ORDER BY kstar.

    " 중복데이터 제거
    DELETE ADJACENT DUPLICATES FROM lt_kstar COMPARING kstar.


    " Search Help 생성
    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'KSTAR'
        value_org       = 'S'
        dynpprog        = sy-cprog
        dynpnr          = sy-dynnr
      TABLES
        value_tab       = lt_kstar
        return_tab      = lt_return
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.

  ENDIF.

  " 성고
  IF sy-subrc = 0.

    " DB에 저장되있는 데이터일 경우는 조회만 가능하도록 함
    " DB필드에 X 체크되있는 경우는 EXIT
    CHECK gs_t_plan-db NE 'X'.

    " 리턴 받은 값의 첫번째 라인을 읽음 / 결과값
    READ TABLE lt_return INDEX 1.

    " 성공했을 경우,
    IF sy-subrc = 0.

      " 필드이름이 코스트센터일경우,
      IF pe_fieldname = 'KOSTL'.
        ls_modi-fieldname = 'KOSTL'.
        gs_t_plan-kostl = lt_return-fieldval.

        " 빈값 0 채워 줌
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gs_t_plan-kostl
          IMPORTING
            output = gs_t_plan-kostl.

        MODIFY gt_t_plan FROM gs_t_plan INDEX ps_row_no-row_id.

        " 필드이름이 원가요소일경우,
      ELSEIF pe_fieldname = 'KSTAR'.
        ls_modi-fieldname = 'KSTAR'.
        gs_t_plan-kstar = lt_return-fieldval.

        " 빈값 0 채워줌
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = gs_t_plan-kstar
          IMPORTING
            output = gs_t_plan-kstar.

        MODIFY gt_t_plan FROM gs_t_plan INDEX ps_row_no-row_id.
      ENDIF.

      " cl_alv_event_data
      " pr_event_data 의 m_data를 필드심볼에 지정
      ASSIGN pr_event_data->m_data->* TO <fs_tab>.


      " 변경된 셀 라인과 값을 지정해서 필드심볼에 저장
      " data_chagend 이벤트에 해당 값이 적용됨
      ls_modi-row_id    = ps_row_no-row_id.
      ls_modi-value     = lt_return-fieldval.
      APPEND ls_modi TO <fs_tab>.
      UNASSIGN <fs_tab>.
      CLEAR: ls_modi.

    ENDIF.

  ELSE.
    MESSAGE s000 WITH '데이터 조회에 실패하였습니다.'.

  ENDIF.

ENDFORM.

'SAP > ABAP ALV' 카테고리의 다른 글

(ABAP ALV) SORT TABLE  (0) 2022.02.09
(ABAP ALV) Sort Table  (0) 2022.02.08
(ABAP ALV) TABSTRIP  (0) 2021.10.21
(ABAP ALV) ALV SIMPLE TREE - TBU  (0) 2021.10.21
(ABAP ALV) 필드카탈로그 및 SORT  (0) 2021.08.23