SAP ABAP ALV 행삭제 DELETE 로직






ALV에서 툴바를 직접 만들어서 삭제할때
행 삭제와 함께 DB테이블에서 데이터 삭제까지 하는 로직

여기서 GT_DATA는 인터널테이블,
LT_DELETE는 삭제를 위한 Z테이블과 같은 타입의 테이블이다.



DATA:  GT_ROW   TYPE LVC_T_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.


* 선택한 줄의 인덱스 가져오기
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.
        " 삭제할 데이터 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.

 CALL METHOD GR_GRID->REFRESH_TABLE_DISPLAY.

  " 마지막에 ALV 리프레시 해줘야 변경된 데이터로 ALV에 출력된다.
다음 이전