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