ABAP

RAP 번호 직접 입력 vs 자동 생성 #shorts #SAP #ABAP

▶ YouTube에서 보기

RAP에서 엔티티 번호를 어떻게 부여할 것인가

SAP RAP에서 엔티티 키(Primary Key)를 생성하는 방법은 두 가지입니다. 사용자가 직접 입력하는 External Numbering과, 시스템이 자동으로 생성하는 Internal Numbering입니다. 어떤 방식을 선택하느냐가 UX, 보안, 데이터 무결성에 영향을 줍니다.

External Numbering: 사용자가 직접 입력

-- Behavior Definition: External Numbering
managed implementation in class zbp_project unique;

define behavior for ZC_Project alias Project {
  -- external numbering: 키 필드를 사용자가 입력
  -- create 시 project_id를 반드시 입력해야 함
  create;
  update;
  delete;

  field ( mandatory ) project_id;  -- 필수 입력
  field ( readonly : update ) project_id;  -- 생성 후 수정 불가
}
-- 사용자가 입력한 키 값 검증 (Validation)
CLASS zbp_project IMPLEMENTATION.
  METHOD validateprojectid.
    LOOP AT keys ASSIGNING FIELD-SYMBOL().
      READ ENTITIES OF ZC_Project IN LOCAL MODE
        ENTITY Project FIELDS ( project_id ) WITH CORRESPONDING #( keys )
        RESULT DATA(lt_projects).

      LOOP AT lt_projects ASSIGNING FIELD-SYMBOL().
        " 프로젝트 ID 형식 검증 (PRJ- 로 시작해야 함)
        IF NOT -project_id CP 'PRJ-*'.
          APPEND VALUE #(
            %tky = -%tky
            %msg = new_message_with_text(
              severity = if_abap_behv_message=>severity-error
              text     = 'Project ID는 PRJ- 로 시작해야 합니다'
            )
          ) TO reported-project.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

Internal Numbering: 시스템이 자동 생성

-- Behavior Definition: Internal Numbering
managed with additional save
  implementation in class zbp_sales_order unique;

define behavior for ZR_SalesOrder alias SalesOrder {
  -- internal numbering: 시스템이 자동으로 키 생성
  -- create 시 order_id를 입력하지 않아도 됨
  create;
  update;
  delete;

  field ( numbering : managed, readonly ) order_id;
  -- numbering : managed = 시스템이 번호 부여

  -- 번호 채번 Determination
  determination setOrderId on save { create; }
}
-- Internal Numbering 구현 (번호 채번 로직)
CLASS zbp_sales_order IMPLEMENTATION.
  METHOD setorderid.
    LOOP AT keys ASSIGNING FIELD-SYMBOL().
      READ ENTITIES OF ZR_SalesOrder IN LOCAL MODE
        ENTITY SalesOrder FIELDS ( order_id ) WITH CORRESPONDING #( keys )
        RESULT DATA(lt_orders).

      LOOP AT lt_orders ASSIGNING FIELD-SYMBOL().
        IF -order_id IS INITIAL.
          " 번호 채번 (Number Range 활용)
          DATA lv_number TYPE string.
          CALL FUNCTION 'NUMBER_GET_NEXT'
            EXPORTING
              nr_range_nr = '01'
              object      = 'Z_SO_NR'
            IMPORTING
              number      = lv_number.

          DATA(lv_new_id) = 'SO-' && lv_number.

          MODIFY ENTITIES OF ZR_SalesOrder IN LOCAL MODE
            ENTITY SalesOrder
              UPDATE FIELDS ( order_id )
              WITH VALUE #( ( %tky     = -%tky
                              order_id = lv_new_id ) ).
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

UUID를 키로 사용하는 방법

-- UUID 기반 Internal Numbering (가장 단순)
-- CDS 정의
define root view entity ZR_Task
  as select from zbtp_task
{
  key task_uuid : sysuuid_x16;  -- UUID 타입 키
      ...
}

-- Behavior Definition
managed implementation in class zbp_task unique;

define behavior for ZR_Task alias Task {
  create;
  update;
  delete;

  -- UUID: 시스템이 자동 생성, 추가 구현 불필요
  field ( numbering : managed, readonly ) task_uuid;
}
-- UUID는 별도 Number Range 불필요
-- cl_system_uuid=>create_uuid_x16_static()으로 자동 생성
-- GUID 방식 — 글로벌 유일성 보장
-- 단, URL에 노출 시 긴 GUID가 불편할 수 있음

선택 기준

  • External: 의미 있는 코드가 필요한 경우 (마스터 데이터, 프로젝트 코드)
  • Internal (Number Range): 순번이 의미 있는 경우 (주문번호 SO-00001)
  • UUID: 단순성이 중요하고 순번이 불필요한 경우 (내부 트랜잭션)
  • External은 중복 방지 검증 로직이 반드시 필요

공식 문서

RAP Numbering 가이드는 SAP RAP Numbering 공식 문서에서 확인하세요.

댓글 0

아직 댓글이 없습니다.