ALV에서 툴바를 직접 만들어서 삭제할때
행 삭제와 함께 DB테이블에서 데이터 삭제까지 하는 로직
여기서 GT_DATA는 인터널테이블,
LT_DELETE는 삭제를 위한 Z테이블과 같은 타입의 테이블이다.
DATA: GT_ROW TYPE LVC_T_ROW,
GS_ROW TYPE LVC_S_ROW.
GS_ROW TYPE LVC_S_ROW.
FORM USER_COMMAND USING P_UCOMM TYPE SY-UCOMM
P_SENDER TYPE REF TO CL_GUI_ALV_GRID.
P_SENDER TYPE REF TO CL_GUI_ALV_GRID.
* 선택한 줄의 인덱스 가져오기
GR_GRID->GET_SELECTED_ROWS(
IMPORTING
ET_INDEX_ROWS = GT_ROW ).
IF P_SENDER EQ GR_GRID .
CASE P_UCOMM.
WHEN 'DELETE'.
IF GT_ROW IS INITIAL.
MESSAGE '행을 선택하세요' TYPE 'E'.
RETURN.
ENDIF.
SORT GT_ROW BY INDEX DESCENDING. " 선택된 행 인덱스를 내림차순 정렬하여 삭제
LOOP AT GT_ROW INTO GS_ROW.
READ TABLE GT_DATA INTO GS_DATA INDEX GS_ROW-INDEX.
IF SY-SUBRC = 0.
IMPORTING
ET_INDEX_ROWS = GT_ROW ).
IF P_SENDER EQ GR_GRID .
CASE P_UCOMM.
WHEN 'DELETE'.
IF GT_ROW IS INITIAL.
MESSAGE '행을 선택하세요' TYPE 'E'.
RETURN.
ENDIF.
SORT GT_ROW BY INDEX DESCENDING. " 선택된 행 인덱스를 내림차순 정렬하여 삭제
LOOP AT GT_ROW INTO GS_ROW.
READ TABLE GT_DATA INTO GS_DATA INDEX GS_ROW-INDEX.
IF SY-SUBRC = 0.
" 삭제할 데이터 LT_DELETE에 추가 (ALV 띄운 인터널테이블과 DB테이블의 타입이 다른경우)
MOVE-CORRESPONDING GS_DATA TO LS_DELETE.
APPEND LS_DELETE TO LT_DELETE.
" GT_DATA에서 삭제 (ALV에서 삭제)
DELETE GT_DATA INDEX GS_ROW-INDEX.
ENDIF.
ENDLOOP.
" 삭제 데이터를 담은 LT_DELETE를 이용해 DB 테이블에서 삭제
DELETE ZTABLE FROM TABLE LT_DELETE.
IF SY-SUBRC = 0.
MESSAGE '삭제에 성공하였습니다. ' TYPE 'S' .
ELSE.
MESSAGE '삭제에 실패하였습니다 ' TYPE 'E'.
ENDIF.
ENDCASE.
ENDIF.
MOVE-CORRESPONDING GS_DATA TO LS_DELETE.
APPEND LS_DELETE TO LT_DELETE.
" GT_DATA에서 삭제 (ALV에서 삭제)
DELETE GT_DATA INDEX GS_ROW-INDEX.
ENDIF.
ENDLOOP.
" 삭제 데이터를 담은 LT_DELETE를 이용해 DB 테이블에서 삭제
DELETE ZTABLE FROM TABLE LT_DELETE.
IF SY-SUBRC = 0.
MESSAGE '삭제에 성공하였습니다. ' TYPE 'S' .
ELSE.
MESSAGE '삭제에 실패하였습니다 ' TYPE 'E'.
ENDIF.
ENDCASE.
ENDIF.
CALL METHOD GR_GRID->REFRESH_TABLE_DISPLAY.
" 마지막에 ALV 리프레시 해줘야 변경된 데이터로 ALV에 출력된다.
Tags:
SAP ABAP