ABAP

ON SAVE vs ON MODIFY — 트리거 차이 #shorts #SAP #ABAP

▶ YouTube에서 보기

RAP에서 Determination의 두 가지 트리거

SAP RAP(RESTful Application Programming Model)에서 Determination은 데이터가 변경될 때 자동으로 실행되는 로직입니다. 예를 들어 주문 금액이 바뀌면 총합을 재계산하거나, 항목이 추가되면 번호를 부여하는 동작을 Determination으로 구현합니다. Determination에는 두 가지 트리거가 있습니다: ON SAVEON MODIFY.

ON MODIFY: 변경 즉시 실행

-- BDef에서 ON MODIFY 선언
define behavior for ZC_SalesOrder alias SalesOrder {
  -- 항목 금액 변경 시 즉시 합계 재계산
  determination calcOrderTotal
    on modify { field item_amount; }

  -- 수량 변경 시 즉시 할인율 계산
  determination calcDiscountRate
    on modify { field quantity; }
}
-- ON MODIFY 구현
CLASS zbp_sales_order DEFINITION.
  PUBLIC SECTION.
    METHODS calcordertotal FOR DETERMINE ON MODIFY
      IMPORTING keys FOR SalesOrder~calcOrderTotal.
ENDCLASS.

CLASS zbp_sales_order IMPLEMENTATION.
  METHOD calcordertotal.
    " 변경된 주문의 아이템 합계 조회
    READ ENTITIES OF ZC_SalesOrder IN LOCAL MODE
      ENTITY SalesOrderItem
        FIELDS ( item_amount )
        WITH CORRESPONDING #( keys )
        RESULT DATA(lt_items).

    " 주문별 합계 계산
    DATA lt_totals TYPE TABLE OF zs_order_total.
    LOOP AT lt_items ASSIGNING FIELD-SYMBOL().
      COLLECT VALUE zs_order_total(
        order_id    = -order_id
        total_amount = -item_amount
      ) INTO lt_totals.
    ENDLOOP.

    " 주문 헤더 합계 업데이트
    MODIFY ENTITIES OF ZC_SalesOrder IN LOCAL MODE
      ENTITY SalesOrder
        UPDATE FIELDS ( total_net_amount )
        WITH VALUE #( FOR total IN lt_totals
                      ( order_id        = total-order_id
                        total_net_amount = total-total_amount ) ).
  ENDMETHOD.
ENDCLASS.

ON MODIFY는 사용자가 필드를 변경하는 순간마다 실행됩니다. Fiori의 실시간 합계 표시, 동적 검증에 적합합니다.

ON SAVE: 저장 시점에만 실행

-- BDef에서 ON SAVE 선언
define behavior for ZC_SalesOrder alias SalesOrder {
  -- 저장 시점에 주문 번호 채번
  determination setOrderNumber
    on save { create; }

  -- 저장 시점에 마지막 수정 정보 기록
  determination setLastModifiedInfo
    on save { field any; }

  -- 저장 시점에 외부 시스템 동기화 플래그 설정
  determination markForSync
    on save { field status; }
}
-- ON SAVE 구현
CLASS zbp_sales_order DEFINITION.
  PUBLIC SECTION.
    METHODS setordernumber FOR DETERMINE ON SAVE
      IMPORTING keys FOR SalesOrder~setOrderNumber.
ENDCLASS.

CLASS zbp_sales_order IMPLEMENTATION.
  METHOD setordernumber.
    " 번호가 없는 신규 주문만 처리
    READ ENTITIES OF ZC_SalesOrder IN LOCAL MODE
      ENTITY SalesOrder
        FIELDS ( order_id created_at )
        WITH CORRESPONDING #( keys )
        RESULT DATA(lt_orders).

    DATA lt_update TYPE TABLE FOR UPDATE ZC_SalesOrder\SalesOrder.

    LOOP AT lt_orders ASSIGNING FIELD-SYMBOL().
      IF -order_id IS INITIAL.
        " 번호 채번 로직
        DATA(lv_new_id) = zcl_order_numbering=>get_next_number( 'SO' ).

        APPEND VALUE #(
          %tky     = -%tky
          order_id = lv_new_id
          %control = VALUE #( order_id = if_abap_behv=>mk-on )
        ) TO lt_update.
      ENDIF.
    ENDLOOP.

    MODIFY ENTITIES OF ZC_SalesOrder IN LOCAL MODE
      ENTITY SalesOrder UPDATE FROM lt_update.
  ENDMETHOD.
ENDCLASS.

ON SAVE는 사용자가 저장 버튼을 누를 때만 실행됩니다. 번호 채번, 외부 시스템 연동, 감사 정보 기록처럼 저장 시점에만 해야 하는 작업에 적합합니다.

트리거 선택 기준

  • ON MODIFY: 사용자에게 즉각적인 피드백이 필요한 경우 (합계, 유효성 표시)
  • ON SAVE: 저장 시에만 의미 있는 작업 (번호 채번, 감사 로그, 외부 동기화)
  • ON MODIFY는 성능에 영향을 줄 수 있음 — 복잡한 로직은 ON SAVE 권장
  • Draft 시나리오에서 ON MODIFY는 Draft 저장마다 실행, ON SAVE는 Activate 시 실행

공식 문서

RAP Determination 전체 가이드는 SAP RAP Determinations 공식 문서에서 확인하세요.

댓글 0

아직 댓글이 없습니다.