SAP의 계량단위(UoM)는 화면에 보이는 코드와 시스템이 실제로 저장하는 코드가 다를 수 있습니다. 평소 MM01로 자재를 만들 땐 신경 쓸 일이 없지만, BAPI로 자재를 채번하거나 테이블·딕셔너리로 단위 값을 직접 다룰 때 함정이 생깁니다. 이 글은 CAN / KAN을 예시로 그 차이와 처리 방법을 정리합니다.
하나의 단위는 시스템 내부 키와 화면 표시 코드를 따로 가집니다.
| 구분 | 필드(T006) | 예시 | 설명 |
|---|---|---|---|
| 내부단위 | MSEHI | KAN | 시스템이 실제로 저장하는 키 |
| 상업단위 | MSEH3 | CAN | 화면·출력에 표시되는 코드 |
| ISO 코드 | — | CA | 대외(EDI/인터페이스) 표준 코드 |
즉 우리가 화면에서
CAN이라고 보는 단위는, 시스템 내부적으로는KAN이라는 키로 저장되어 있습니다. 둘은 같은 단위의 다른 표현입니다.
CUNI는 계량단위를 정의·조회하는 트랜잭션으로, 내부단위 기준으로 단위를 관리합니다. 내부단위 KAN을 조회하면 상업단위 CAN, ISO 코드 CA 등이 연결되어 있는 것을 볼 수 있습니다.
▲ CUNI 단위 조회 — 내부단위 KAN ↔ 상업단위 CAN (익명 데이터로 재현한 예시 화면)
반대로 상업단위인 CAN을 내부단위로 조회하면, 그런 내부 키는 없으므로 "유지보수하고 있지 않다"는 메시지가 나옵니다. CAN은 어디까지나 표시용 코드일 뿐 내부 키가 아니기 때문입니다.
▲ 내부단위로 CAN 조회 시 — 내부 키가 아니므로 미존재 (익명 데이터로 재현한 예시 화면)
여기서 실무 함정이 발생합니다.
기본단위에 상업단위 CAN 입력
화면이 자동으로 내부단위 변환
✅ CAN → KAN 으로 저장
BAPI_MATERIAL_SAVEDATA 기본단위 필드에 CAN 전달
내부 형식을 기대 (자동 변환 없음)
❌ "유효하지 않은 단위" 에러
BAPI는 화면처럼 자동 변환을 해 주지 않습니다. 기본단위 필드에는 내부단위(KAN) 를 넣어야 하므로, 상업단위 CAN을 그대로 전달하면 채번이 실패합니다.
표준 변환 펑션 CONVERSION_EXIT_CUNIT_INPUT 으로 상업단위(CAN)를 내부단위(KAN)로 변환한 뒤 BAPI에 전달합니다.
TIP —
BAPI_MATERIAL_SAVEDATA에는 ISO 단위 필드(BASE_UOM_ISO)도 있습니다. 내부단위 대신 ISO 코드(CA)를 채워 넣으면 시스템이 알아서 내부단위로 변환하므로, 이 방식을 쓰면 별도 변환 호출을 생략할 수도 있습니다.
SE16 / SE16N으로 MEINS 같은 단위 필드를 가진 테이블을 조회할 때, 초기 설정의 변환종료점검(Conversion Exit) 옵션에 따라 표시 값이 달라집니다.
▲ SE16 조회 설정 — '포맷' 영역의 변환종료점검 옵션 (익명 데이터로 재현한 예시 화면)
변환종료점검을 체크하지 않으면 저장된 내부 값이 그대로 보입니다. 정상적으로 KAN이 저장된 행은 KAN으로, BAPI 등으로 CAN이 잘못 저장된 행은 CAN으로 표시됩니다.
▲ 변환종료점검 미체크 — 저장된 원본값 그대로 (익명 데이터로 재현한 예시 화면)
변환종료점검을 체크하면 변환 종료(Conversion Exit)가 적용됩니다. 내부 KAN은 상업 CAN으로 보이고, 내부 키가 아닌 CAN이 저장된 행은 변환에 실패하여 ****** 로 표시됩니다.
▲ 변환종료점검 체크 — KAN은 CAN으로, 잘못 저장된 CAN은 ******로 (익명 데이터로 재현한 예시 화면)
정리하면 다음과 같습니다.
| 저장된 내부 값 | 변환종료점검 미체크 | 변환종료점검 체크 |
|---|---|---|
KAN (정상 내부 키) | KAN | CAN |
CAN (비정상 — 상업코드가 그대로 저장됨) | CAN | ****** |
테이블에서 단위가
******로 보인다면, 내부 키가 아닌 값이 잘못 저장되었다는 신호입니다. BAPI·인터페이스로 들어온 데이터를 의심하고 정합성을 점검해야 합니다.
CAN의 내부 키는 KAN이다.MM01 화면은 자동 변환되지만, BAPI·인터페이스는 내부단위를 직접 넣어야 한다.CONVERSION_EXIT_CUNIT_INPUT 을 사용한다. (또는 BAPI의 ISO 단위 필드 활용)****** 는 잘못 저장된 값을 의미한다.CUNI 에서 내부단위 기준으로 관리한다.Disclaimer — 이 포스트는 AI(Claude)를 활용하여 작성된 초안을 바탕으로 검수 및 보완하여 작성되었습니다. 내용 중 오류나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.