자재 단위 유지보수 — 내부단위와 상업단위

자재 단위 내부단위와 상업단위 배너

SAP의 계량단위(UoM)는 화면에 보이는 코드와 시스템이 실제로 저장하는 코드가 다를 수 있습니다. 평소 MM01로 자재를 만들 땐 신경 쓸 일이 없지만, BAPI로 자재를 채번하거나 테이블·딕셔너리로 단위 값을 직접 다룰 때 함정이 생깁니다. 이 글은 CAN / KAN을 예시로 그 차이와 처리 방법을 정리합니다.

1. 내부단위 vs 상업단위

하나의 단위는 시스템 내부 키화면 표시 코드를 따로 가집니다.

구분필드(T006)예시설명
내부단위MSEHIKAN시스템이 실제로 저장하는 키
상업단위MSEH3CAN화면·출력에 표시되는 코드
ISO 코드CA대외(EDI/인터페이스) 표준 코드

즉 우리가 화면에서 CAN이라고 보는 단위는, 시스템 내부적으로는 KAN이라는 키로 저장되어 있습니다. 둘은 같은 단위의 다른 표현입니다.

2. CUNI로 단위 조회하기

CUNI는 계량단위를 정의·조회하는 트랜잭션으로, 내부단위 기준으로 단위를 관리합니다. 내부단위 KAN을 조회하면 상업단위 CAN, ISO 코드 CA 등이 연결되어 있는 것을 볼 수 있습니다.

CUNI 단위 조회 세부사항 - 내부단위 KAN

▲ CUNI 단위 조회 — 내부단위 KAN ↔ 상업단위 CAN (익명 데이터로 재현한 예시 화면)

반대로 상업단위인 CAN을 내부단위로 조회하면, 그런 내부 키는 없으므로 "유지보수하고 있지 않다"는 메시지가 나옵니다. CAN은 어디까지나 표시용 코드일 뿐 내부 키가 아니기 때문입니다.

내부단위 CAN은 유지보수되지 않음 메시지

▲ 내부단위로 CAN 조회 시 — 내부 키가 아니므로 미존재 (익명 데이터로 재현한 예시 화면)

3. MM01 vs BAPI — 자재 채번 시 단위 함정

여기서 실무 함정이 발생합니다.

MM01 (화면 채번)정상

기본단위에 상업단위 CAN 입력

화면이 자동으로 내부단위 변환
CAN → KAN 으로 저장

BAPI 채번에러

BAPI_MATERIAL_SAVEDATA 기본단위 필드에 CAN 전달

내부 형식을 기대 (자동 변환 없음)
❌ "유효하지 않은 단위" 에러

BAPI는 화면처럼 자동 변환을 해 주지 않습니다. 기본단위 필드에는 내부단위(KAN) 를 넣어야 하므로, 상업단위 CAN을 그대로 전달하면 채번이 실패합니다.

해결 — 상업단위를 내부단위로 변환

표준 변환 펑션 CONVERSION_EXIT_CUNIT_INPUT 으로 상업단위(CAN)를 내부단위(KAN)로 변환한 뒤 BAPI에 전달합니다.

1" 상업단위(CAN) → 내부단위(KAN) 변환
2DATA lv_meins TYPE meins.
3
4CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
5  EXPORTING
6    input          = 'CAN'        " 화면/상업 단위
7    language       = sy-langu
8  IMPORTING
9    output         = lv_meins      " 내부 단위 → 'KAN'
10  EXCEPTIONS
11    unit_not_found = 1
12    OTHERS         = 2.
13
14" 변환된 내부단위(lv_meins = KAN)를
15" BAPI_MATERIAL_SAVEDATA 의 기본단위 필드에 전달

TIPBAPI_MATERIAL_SAVEDATA에는 ISO 단위 필드(BASE_UOM_ISO)도 있습니다. 내부단위 대신 ISO 코드(CA)를 채워 넣으면 시스템이 알아서 내부단위로 변환하므로, 이 방식을 쓰면 별도 변환 호출을 생략할 수도 있습니다.

4. 테이블·딕셔너리 조회 — 변환종료점검(Conversion Exit)

SE16 / SE16N으로 MEINS 같은 단위 필드를 가진 테이블을 조회할 때, 초기 설정의 변환종료점검(Conversion Exit) 옵션에 따라 표시 값이 달라집니다.

SE16 Data Browser 설정 - 변환종료점검

▲ SE16 조회 설정 — '포맷' 영역의 변환종료점검 옵션 (익명 데이터로 재현한 예시 화면)

변환종료점검을 체크하지 않으면 저장된 내부 값이 그대로 보입니다. 정상적으로 KAN이 저장된 행은 KAN으로, BAPI 등으로 CAN이 잘못 저장된 행은 CAN으로 표시됩니다.

테이블 조회 - 변환종료점검 미체크 (원본값)

▲ 변환종료점검 미체크 — 저장된 원본값 그대로 (익명 데이터로 재현한 예시 화면)

변환종료점검을 체크하면 변환 종료(Conversion Exit)가 적용됩니다. 내부 KAN은 상업 CAN으로 보이고, 내부 키가 아닌 CAN이 저장된 행은 변환에 실패하여 ****** 로 표시됩니다.

테이블 조회 - 변환종료점검 체크 (변환 적용)

▲ 변환종료점검 체크 — KAN은 CAN으로, 잘못 저장된 CAN은 ******로 (익명 데이터로 재현한 예시 화면)

정리하면 다음과 같습니다.

저장된 내부 값변환종료점검 미체크변환종료점검 체크
KAN (정상 내부 키)KANCAN
CAN (비정상 — 상업코드가 그대로 저장됨)CAN******

테이블에서 단위가 ****** 로 보인다면, 내부 키가 아닌 값이 잘못 저장되었다는 신호입니다. BAPI·인터페이스로 들어온 데이터를 의심하고 정합성을 점검해야 합니다.

5. 정리 및 주의사항

  • 단위에는 내부단위(저장)상업단위(표시) 가 따로 있다 — 우리가 보는 CAN의 내부 키는 KAN이다.
  • MM01 화면은 자동 변환되지만, BAPI·인터페이스는 내부단위를 직접 넣어야 한다.
  • 상업단위 → 내부단위 변환은 CONVERSION_EXIT_CUNIT_INPUT 을 사용한다. (또는 BAPI의 ISO 단위 필드 활용)
  • 테이블/딕셔너리 조회 시 변환종료점검 여부에 따라 표시가 다르며, ****** 는 잘못 저장된 값을 의미한다.
  • 신규 단위 추가·변경은 CUNI 에서 내부단위 기준으로 관리한다.

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