번호 범위(Number Range) 는 SAP가 문서·마스터·커스텀 객체에 번호를 부여하는 규칙입니다. 구매오더 번호가 4500000001부터 순차로 매겨지는 것도, 우리가 만든 CBO 테이블의 순번도 모두 번호 범위로 관리됩니다. 이 글은 개념부터 MM(구매) IMG 설정, CBO 채번, 표준 함수, 주의사항까지 정리합니다.
번호 범위는 번호 범위 객체(Number Range Object) 단위로 관리되며, 객체 안에 여러 개의 간격(Interval) 을 둡니다. 각 간격은 시작/종료 번호와 현재 번호(Current Number) 를 가집니다.
SNRO (객체·간격 유지보수)TNRO(객체 정의), NRIV(간격)채번 방식은 두 가지입니다.
Ext 미설정
…0002 → …0003 → …0004
• 시스템이 자동·순차로 부여
• 별도 검증 불필요
• 예: PO 자동 번호
✓ Ext 설정
입력 …0500 → [0001~9999] 간격 내? → ✅
• 사용자/프로그램이 직접 입력
• 입력값이 간격 내인지 검사
• 예: 레거시 번호 수기 이관
구성 흐름은 다음과 같습니다 — 객체를 정의하고, 그 안에 간격을 만들고, 문서유형 등에 간격 키를 할당합니다.
SNRO에서 객체를 열고 번호 범위 → 간격 편집으로 들어가면 간격을 관리합니다. (SAP 화면에서는 "구간"이 아니라 간격 편집으로 표기됩니다.) 각 간격은 아래 항목으로 구성됩니다.
| 항목 | 설명 |
|---|---|
| 간격 번호(No.) | 간격 식별 키 (예: 01) — 문서유형 등에 이 키를 할당 |
| 연도 | 연도 종속 객체일 때 연도 지정 (연도 비종속이면 9999) |
| From / To 번호 | 간격의 시작·종료 번호 |
| 현재 번호 | 마지막으로 채번된 번호 |
| Ext | 외부 채번 여부 |
01 같은 번호와 함께 연도를 지정해, 연도마다 별도로 채번합니다(연도가 바뀌면 그 해 간격의 현재 번호를 따름). 회계 전표처럼 매년 번호를 새로 시작하는 경우에 사용됩니다.표준 문서·마스터의 번호 범위는 대부분 IMG에서 관리합니다. MM(구매) 기준 대표 객체는 다음과 같습니다.
| 문서 / 마스터 | 번호범위 객체 | IMG 경로(요약) |
|---|---|---|
| 구매요청(PR) | BANF | MM → 구매 → 구매요청 → 번호 범위 |
| 구매문서(PO·RFQ·계약·일정협약) | EINKBELEG | MM → 구매 → 구매오더 등 → 번호 범위 |
| 자재 문서(입·출고 전표) | MATBELEG | MM → 재고관리 → 번호 지정 |
| 자재 마스터 | MATERIALNR | 로지스틱스 일반 → 자재 마스터 → 번호 범위 |
EINKBELEG) 를 공유하고, 문서유형별로 간격 키를 할당해 구분합니다. (예: PO 표준유형 NB → 특정 내부 간격 키)SNRO에 객체명을 직접 입력해도 같은 간격 유지보수 화면으로 진입합니다.T-Code·IMG 경로 명칭은 SAP 버전·메뉴 구성에 따라 일부 다를 수 있으니, 실제 시스템에서 객체명으로 확인하는 것을 권장합니다.
CBO(Customer Built Object)에서 Z 테이블이나 인터페이스에 고유 순번을 매겨야 할 때, 직접 번호 범위 객체를 만들어 사용합니다.
SNRO에서 Z 객체 생성 (예: ZMM_SEQ) — 도메인(번호 길이), 버퍼링 여부 등 설정01), From/To, 외부 여부NUMBER_GET_NEXT 호출
returncode로 소진 임박(1)·마지막 번호(2) 를 감지해 사전에 경고 처리하면 운영 중 채번 실패를 예방할 수 있습니다.
| 함수 | 용도 |
|---|---|
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으로 처리합니다. 단, 초기화는 아래 주의사항을 반드시 확인해야 합니다.
| 항목 | 내용 |
|---|---|
| 간격은 이관되지 않음 | 번호범위 간격(NRIV) 은 전송요청(CR)으로 이관되지 않습니다. 개발/품질/운영 시스템별로 직접 등록해야 합니다. (객체 정의는 이관됨) |
| 채번은 비가역 | NUMBER_GET_NEXT로 소비된 번호는 ROLLBACK 해도 되돌아오지 않습니다. → 번호 건너뜀(gap)은 정상입니다. |
| 버퍼링 | 버퍼링은 성능을 높이지만 gap·비순차·트랜잭션 비정합을 유발합니다. 순차성이 꼭 필요하면 버퍼링을 끄되 성능 비용을 감안하세요. |
| 초기화 위험 | 현재 번호를 초기화하면 기존 데이터와 번호 중복 위험이 있습니다. 반드시 기존 최대 번호를 확인 후 진행하세요. |
| 소진 모니터링 | 간격 끝에 도달하면 채번이 실패합니다. 잔여량·returncode 경고를 모니터링하세요. |
| 내/외부 혼용 | 같은 문서에 내부·외부 간격을 혼용하면 번호 충돌이 날 수 있어 주의합니다. |
⚠️ 가장 흔한 함정 — 개발계에서 간격을 만들고 운영계에 안 만들어 두면, 이관 후 운영에서 "번호 범위 간격을 찾을 수 없음" 오류가 납니다. 간격은 코드와 달리 시스템마다 수동 등록이 필요하다는 점을 꼭 기억하세요.
SNRO에서 관리하고 NRIV에 저장된다.BANF·EINKBELEG·MATBELEG·MATERIALNR).SNRO로 Z 객체를 만들고 NUMBER_GET_NEXT 로 채번한다.Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.