SAP ABAP SAVE 로직

SAP ABAP 
SAVE 버튼 눌렀을때 타는 이벤트 로직을 구현한다.


다음 로직을 참고, 복사하여 사용하면 된다.


순서는
1. DATA CHANGED ALV이벤트에서 데이터 변경시 로직
2. SAVE 버튼 로진 (DB테이블에 데이터 저장)



DATA CHANGED 이벤트 로직 

FORM DATA_CHANGED  USING   PR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.

  DATA LS_CELLTAB TYPE LVC_S_STYL.
  DATA:  LT_MOD_CELLS TYPE LVC_T_MODI" 변경된 셀 , 테이블 타입
           LS_MOD_CELLS TYPE LVC_S_MODI" 스트럭쳐 타입
           LT_ROWS     LIKE TABLE OF GT_DATA" GT_DATA는 ALV에 뿌려줄 인터널테이블
           LS_ROW      LIKE LINE OF GT_DATA,
           LV_VALUE      TYPE STRING.

  CLEAR LS_MOD_CELLS.


  " 변경된 셀 목록 가져오기
  LT_MOD_CELLS PR_DATA_CHANGED->MT_GOOD_CELLS " LT_MOD_CELLS에 변경된 데이터가 담김.

  SORT LT_MOD_CELLS BY ROW_ID " ALV 행의 순서대로 정렬

  LOOP AT LT_MOD_CELLS INTO LS_MOD_CELLS.
    " 변경된 행을 GT_DATA에서 찾기
    READ TABLE GT_DATA INTO GS_DATA INDEX LS_MOD_CELLS-ROW_ID.
    IF SY-SUBRC 0.
      CASE GS_DATA-ROW_STATUS.
        WHEN ''.
          " 초기 상태의 데이터라면 'M'으로 설정 (수정된 데이터로 간주)
          GS_DATA-ROW_STATUS 'M'.
        WHEN 'A'.
          " 신규 추가된 데이터는 'A' 상태 유지
          CONTINUE.
          "이미 저장된 값인지 확인
          CASE LS_MOD_CELLS-FIELDNAME.
            WHEN '필드이름'.
               "여기서 변경된 데이터의 유효성 검사,
                EX, 존재하는 회사토드인지 등.등 
         
          ENDCASE.


      ENDCASE.

      " 변경된 데이터 다시 GT_DATA에 반영
      MODIFY GT_DATA FROM GS_DATA INDEX LS_MOD_CELLS-ROW_ID.
    ENDIF.
  ENDLOOP.

ENDFORM.                   








SAVE 버튼 클릭시 이벤트 로직 
*DB 저장시에는 DB테이블과 같은 타입의 인터널에이블에 담아 저장해준다.

FORM SAVE .

  DATALT_ADD TYPE TABLE OF Z테이블,    " 신규 추가된 데이터
          LS_ADD TYPE  Z테이블,    " 신규 추가된 데이터
          LT_UPDATE TYPE TABLE OF Z테이블" 수정된 데이터
          LS_UPDATE TYPE Z테이블" 수정된 데이터


CALL METHOD GR_GRID->GET_SELECTED_ROWS(
 IMPORTING
 ET_INDEX_ROWS = GT_ROW  )  .


*** 선택된 행을 GT_DATA에서 추출하여 lt_selected_rows에 담기
**DATA CHANGED에서 유효성 검사를 수행했기 때문에 저장만 한다.
  LOOP AT GT_ROW INTO GS_ROW.

    READ TABLE GT_DATA INTO  GS_DATA INDEX GS_ROW-INDEX.
    IF SY-SUBRC 0.

      CASE GS_DATA-ROW_STATUS .
        WHEN 'A'.
          MOVE-CORRESPONDING GS_DATA TO LS_ADD.
          APPEND LS_ADD TO LT_ADD.
        WHEN 'M'.
          MOVE-CORRESPONDING GS_DATA TO LS_UPDATE.
          APPEND LS_UPDATE TO LT_UPDATE.
      ENDCASE.

    ENDIF.
  ENDLOOP.


  " DB 테이블 ZFIT246에 추가된 행 삽입
  IF LT_ADD IS NOT INITIAL.
    INSERT Z테이블 FROM TABLE LT_ADD.
    IF SY-SUBRC <> 0.
      MESSAGE '저장에 실패하였습니다.' TYPE 'E'.
    ELSE.
      MESSAGE '저장에 성공하였습니다.' TYPE 'S'.
    ENDIF.
  ENDIF.


* 수정된 행 업데이트
  IF LT_UPDATE IS NOT INITIAL.
    MODIFY Z테이블 FROM TABLE LT_UPDATE.
    IF SY-SUBRC <> 0.
      MESSAGE '저장에 실패하였습니다.' TYPE 'E'.
    ELSE.
      MESSAGE '저장에 성공하였습니다.' TYPE 'S'.
    ENDIF.
  ENDIF.

ENDFORM.  
다음 이전