*&---------------------------------------------------------------------*
*& Form ONF4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_FIELDNAME
*& --> E_FIELDVALUE
*& --> ES_ROW_NO
*& --> ER_EVENT_DATA
*& --> ET_BAD_CELLS
*& --> E_DISPLAY
*&---------------------------------------------------------------------*
*& 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.
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 |