번호 범위(Number Range) 다루기

SAP 번호 범위 Number Range 배너

번호 범위(Number Range) 는 SAP가 문서·마스터·커스텀 객체에 번호를 부여하는 규칙입니다. 구매오더 번호가 4500000001부터 순차로 매겨지는 것도, 우리가 만든 CBO 테이블의 순번도 모두 번호 범위로 관리됩니다. 이 글은 개념부터 MM(구매) IMG 설정, CBO 채번, 표준 함수, 주의사항까지 정리합니다.

1. 번호 범위란?

번호 범위는 번호 범위 객체(Number Range Object) 단위로 관리되며, 객체 안에 여러 개의 간격(Interval) 을 둡니다. 각 간격은 시작/종료 번호와 현재 번호(Current Number) 를 가집니다.

  • 관리 트랜잭션 : SNRO (객체·간격 유지보수)
  • 주요 테이블 : TNRO(객체 정의), NRIV(간격)

채번 방식은 두 가지입니다.

⚙️내부 채번 (Internal)

Ext 미설정

…0002 → …0003 → …0004

시스템이 다음 번호를 자동으로 부여

• 시스템이 자동·순차로 부여
• 별도 검증 불필요
• 예: PO 자동 번호

✍️외부 채번 (External)

Ext 설정

입력 …0500 → [0001~9999] 간격 내? → ✅

사용자가 입력, 시스템은 범위만 검사

사용자/프로그램이 직접 입력
• 입력값이 간격 내인지 검사
• 예: 레거시 번호 수기 이관

구성 흐름은 다음과 같습니다 — 객체를 정의하고, 그 안에 간격을 만들고, 문서유형 등에 간격 키를 할당합니다.

STEP 1번호범위 객체SNRO · 예: BANF
STEP 2간격 편집No.·연도·From·To·현재번호
STEP 3간격 키 할당문서유형 등에 연결

간격(Interval) 편집 — 하위객체·연도별 채번

SNRO에서 객체를 열고 번호 범위 → 간격 편집으로 들어가면 간격을 관리합니다. (SAP 화면에서는 "구간"이 아니라 간격 편집으로 표기됩니다.) 각 간격은 아래 항목으로 구성됩니다.

항목설명
간격 번호(No.)간격 식별 키 (예: 01) — 문서유형 등에 이 키를 할당
연도연도 종속 객체일 때 연도 지정 (연도 비종속이면 9999)
From / To 번호간격의 시작·종료 번호
현재 번호마지막으로 채번된 번호
Ext외부 채번 여부
  • 하위객체(Subobject)별 간격 — 객체에 하위객체가 정의되어 있으면(예: 플랜트) 하위객체 값마다 간격을 따로 둘 수 있습니다. 즉 플랜트별로 서로 다른 번호 대역을 부여할 수 있습니다.
  • 연도별 채번 — 객체가 연도 종속이면 간격에 01 같은 번호와 함께 연도를 지정해, 연도마다 별도로 채번합니다(연도가 바뀌면 그 해 간격의 현재 번호를 따름). 회계 전표처럼 매년 번호를 새로 시작하는 경우에 사용됩니다.

2. IMG로 관리되는 번호 범위 — MM(구매) 예시

표준 문서·마스터의 번호 범위는 대부분 IMG에서 관리합니다. MM(구매) 기준 대표 객체는 다음과 같습니다.

문서 / 마스터번호범위 객체IMG 경로(요약)
구매요청(PR)BANFMM → 구매 → 구매요청 → 번호 범위
구매문서(PO·RFQ·계약·일정협약)EINKBELEGMM → 구매 → 구매오더 등 → 번호 범위
자재 문서(입·출고 전표)MATBELEGMM → 재고관리 → 번호 지정
자재 마스터MATERIALNR로지스틱스 일반 → 자재 마스터 → 번호 범위
  • 구매문서(PO/RFQ/계약/일정협약)는 하나의 객체(EINKBELEG) 를 공유하고, 문서유형별로 간격 키를 할당해 구분합니다. (예: PO 표준유형 NB → 특정 내부 간격 키)
  • IMG 경로 외에 SNRO에 객체명을 직접 입력해도 같은 간격 유지보수 화면으로 진입합니다.

T-Code·IMG 경로 명칭은 SAP 버전·메뉴 구성에 따라 일부 다를 수 있으니, 실제 시스템에서 객체명으로 확인하는 것을 권장합니다.

3. CBO 번호 범위 — 직접 만든 객체와 호출

CBO(Customer Built Object)에서 Z 테이블이나 인터페이스에 고유 순번을 매겨야 할 때, 직접 번호 범위 객체를 만들어 사용합니다.

  1. SNRO에서 Z 객체 생성 (예: ZMM_SEQ) — 도메인(번호 길이), 버퍼링 여부 등 설정
  2. 간격 정의 — 간격 번호(01), From/To, 외부 여부
  3. ABAP에서 채번NUMBER_GET_NEXT 호출
1DATA lv_number TYPE numc10.
2DATA lv_returncode TYPE inri-returncode.
3
4CALL FUNCTION 'NUMBER_GET_NEXT'
5  EXPORTING
6    nr_range_nr             = '01'         " 간격 번호
7    object                  = 'ZMM_SEQ'    " 번호범위 객체
8*   subobject               = '1000'       " 하위객체(예: 플랜트)별 채번 시
9*   toyear                  = sy-datum(4)  " 연도 종속 객체일 때 연도 지정
10  IMPORTING
11    number                  = lv_number    " 채번 결과
12    returncode              = lv_returncode " '1' 소진 임박 경고, '2' 마지막 번호
13  EXCEPTIONS
14    interval_not_found      = 1
15    number_range_not_intern = 2
16    object_not_found        = 3
17    quantity_is_0           = 4
18    interval_overflow       = 6
19    OTHERS                  = 8.
20
21IF sy-subrc <> 0.
22  " 채번 실패 처리 (간격 미존재, 소진 등)
23ENDIF.

returncode소진 임박(1)·마지막 번호(2) 를 감지해 사전에 경고 처리하면 운영 중 채번 실패를 예방할 수 있습니다.

4. 참고할 만한 표준 함수

함수용도
NUMBER_GET_NEXT다음 번호 채번
NUMBER_GET_INFO간격의 현재 번호·상태 조회
NUMBER_RANGE_INTERVAL_LIST객체의 간격 목록 조회
NUMBER_RANGE_INTERVAL_MAINTAIN간격 생성·수정 (현재 번호 초기화 포함)
NUMBER_RANGE_ENQUEUE / NUMBER_RANGE_DEQUEUE객체 잠금 / 해제

채번 초기화(현재 번호를 0 또는 특정 값으로 되돌리기)는 보통 SNRO 변경 모드에서 간격의 현재 번호를 직접 수정하거나, 프로그램에서 NUMBER_RANGE_INTERVAL_MAINTAIN으로 처리합니다. 단, 초기화는 아래 주의사항을 반드시 확인해야 합니다.

5. 개발 / 운영 시 주의사항

항목내용
간격은 이관되지 않음번호범위 간격(NRIV) 은 전송요청(CR)으로 이관되지 않습니다. 개발/품질/운영 시스템별로 직접 등록해야 합니다. (객체 정의는 이관됨)
채번은 비가역NUMBER_GET_NEXT로 소비된 번호는 ROLLBACK 해도 되돌아오지 않습니다. → 번호 건너뜀(gap)은 정상입니다.
버퍼링버퍼링은 성능을 높이지만 gap·비순차·트랜잭션 비정합을 유발합니다. 순차성이 꼭 필요하면 버퍼링을 끄되 성능 비용을 감안하세요.
초기화 위험현재 번호를 초기화하면 기존 데이터와 번호 중복 위험이 있습니다. 반드시 기존 최대 번호를 확인 후 진행하세요.
소진 모니터링간격 끝에 도달하면 채번이 실패합니다. 잔여량·returncode 경고를 모니터링하세요.
내/외부 혼용같은 문서에 내부·외부 간격을 혼용하면 번호 충돌이 날 수 있어 주의합니다.

⚠️ 가장 흔한 함정 — 개발계에서 간격을 만들고 운영계에 안 만들어 두면, 이관 후 운영에서 "번호 범위 간격을 찾을 수 없음" 오류가 납니다. 간격은 코드와 달리 시스템마다 수동 등록이 필요하다는 점을 꼭 기억하세요.

6. 정리

  • 번호 범위는 객체 → 간격 → 할당 구조로, SNRO에서 관리하고 NRIV에 저장된다.
  • 표준 문서는 IMG에서 객체별로 관리한다 (MM: BANF·EINKBELEG·MATBELEG·MATERIALNR).
  • CBO는 SNRO로 Z 객체를 만들고 NUMBER_GET_NEXT 로 채번한다.
  • 채번은 비가역(gap 정상), 간격은 이관 안 됨(시스템별 등록), 버퍼링·초기화는 신중히 다룬다.

Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.