대체자재 사용 원가 영향 점검 — 제조원가 분석, 주자재 대신 투입한 대체자재가 원가에 준 영향을 다시 계산해 장부와 맞춰 보는 월마감 화면
환산계수로 대체 환산량 재계산 · 대체율 · 대체 영향액과 영향률 · 장부 소비금액 대조 · 점검 필요만 골라 보기 — 소개 영상과 실제 화면 7종, 그리고 CDS 코드까지
소개 영상1분 24초9개 장면음성 안내·자막표지에서 점검 필요 조회, 행 상세, 자재별·사유별·월별 탭, 대사 결과를 거쳐 정리까지
개발 배경 — 이 앱을 사용해야 하는 이유
제조 현장에서는 주자재가 모자라거나 납기가 급하면 자재명세서에 정의해 둔 대체자재를 대신 투입합니다. 월마감에는 늘 같은 질문이 따라붙습니다. 대체한 자재가 주자재 몇 단위에 해당하나, 대체로 원가가 얼마나 늘거나 줄었나, 그 대체가 허용한 범위 안이었나. 지금은 이 답이 자재명세서 화면, 생산오더, 자재 문서 목록, 엑셀 환산표에 흩어져 있어서 마감 때마다 사람이 맞춰야 합니다.
이 앱은 대체자재 투입량을 환산계수로 주자재 기준 수량으로 바꾸고, 대체율과 대체 영향액·영향률을 다시 계산해 자재명세서의 대체 정의·허용 대체율·장부 소비금액과 견줍니다. 그리고 확인이 필요한 투입 라인만 골라 줍니다. 표준 실행과 전표는 그대로 두고 조회·검증 관점만 더하는 화면입니다.
대체 투입 내역만 봐서는 원가 영향을 알 수 없다
자재 문서에는 어떤 자재가 얼마나 나갔는지만 남습니다. 그래서 “이번 달 합금강으로 바꿔 넣은 것이 원가에 얼마나 영향을 줬나” 같은 질문이 나오면 엑셀에 환산계수와 단가를 붙여 다시 계산해야 합니다. 이 앱은 라인마다 대체 투입 금액 − 대체 환산량 × 주자재 표준단가를 미리 계산해 두므로, 같은 자재를 한 줄에서 주자재 기준으로 환산해 비교할 수 있습니다.
대체율이 허용 범위를 넘었는지는 합계로는 보이지 않는다
라인 하나는 허용 범위 안이어도 한 달 합계로는 넘을 수 있고, 반대도 있습니다. 이 앱은 라인·자재·월 세 단위로 대체율을 다시 구하고 허용 대체율과 허용 영향률을 넘은 곳만 점검 필요로 바꿉니다. 검증용 샘플에서 허용 대체율은 자재마다 20~40% 범위, 허용 영향률은 3~8% 범위로 두었습니다. 실제 값은 회사가 정합니다.
장부 소비금액이 재계산과 다르면 어디서 갈렸는지 찾기 어렵다
단가가 바뀐 시점이나 환산계수 적용이 한 줄만 달라도 장부와 재계산은 어긋납니다. 합계만 보면 묻히는 차이입니다. 이 앱은 장부 소비금액과 재계산 소비금액의 차이를 라인 한 줄 단위로 대조하고, 차이가 있으면 점검 코드 BOOK 으로 표시합니다.
사용 방법
- 조회조건 입력 — 회계연도(필수, 4자리)를 확인합니다. 주자재·대체 사유·마감 월·전기일·점검 결과는 선택이며 비워 두면 전체입니다. 화면을 처음 열면 기본 조건으로 자동 조회됩니다.
- 조회 버튼 또는 Enter — 조회조건 영역 가장 오른쪽의 조회 버튼을 누르거나, 입력 칸에서 Enter 키를 누릅니다. 초기화 버튼은 같은 줄에 있습니다.
- 요약 확인 — 위쪽 일곱 개 타일(표준 자재비 · 대체 영향액 · 대체 영향률 · 최대 대체율 · 장부와 재계산 차이 합계 · 점검 필요 라인 · 대사 차이 건수)을 봅니다. 금액은 백만원 단위입니다.
- 탭 이동 — 라인 명세 · 자재별 · 사유별 · 월별 추이 · 대사 결과 탭으로 근거에서 넓은 곳까지 오가며 봅니다.
- 행 클릭 상세 — 라인 명세의 행을 누르면 환산 과정과 같은 자재·같은 월의 투입 라인이 열립니다.
- 내보내기 — 현재 탭의 조회 결과를 UTF-8 CSV 로 내려받습니다. 파일명은 기능명과 탭 이름입니다.
숫자를 믿을 수 있는가 — 검증 결과
대체 영향 화면에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 그래서 계산을 만드는 쪽에서 먼저 대사식을 세워 두고 전수로 돌렸습니다. 아래는 이 검증용 샘플 데이터의 결과입니다. 샘플은 가상의 주자재 6종과 완제품 5종, 대체 사유 4가지(재고 부족·납기 대응·품질 불량·공급 중단), 2026년 1~9월 마감 투입 라인 144건으로 만들었으며 실제 고객사의 자재 체계와 금액은 쓰지 않았습니다.
| 번호 | 대사식 | 검사 건수 | 차이 |
|---|---|---|---|
| R01 | 재계산 소비금액 — 주자재 투입금액 + 대체자재 투입금액 | 144 | 0 |
| R02 | 표준 자재비 + 수량 차이 + 대체 영향액 = 재계산 소비금액 | 144 | 0 |
| R03 | 대체 환산수량 — 대체자재 투입 × 환산계수 | 144 | 0 |
| R04 | 라인 합계 = 월별 합계 (대체 영향액) | 9 | 0 |
| R05 | 자재별 합계 = 월별 합계 (대체 영향액) | 9 | 0 |
| R06 | 사유별 합계 = 월별 합계 (대체 영향액) | 9 | 0 |
| R07 | 장부 차이 — 장부 소비금액 − 재계산 소비금액 | 144 | 0 |
정합성 대사 7건은 모두 차이가 없습니다. 이와 별도로 의도적 예외 네 가지를 일부러 심어 두고 대사 차이와 분리해 따로 집계했습니다.
| 구분 | 무엇을 심었나 | 검사 건수 | 걸린 건수 |
|---|---|---|---|
| E01 | 자재명세서에 대체 정의가 없는데 대체자재를 투입한 라인 | 144 | 3 |
| E02 | 대체율이 허용 대체율을 넘는 라인 | 144 | 4 |
| E03 | 대체 영향률의 절댓값이 허용 영향률을 넘는 라인 | 144 | 5 |
| E04 | 장부 소비금액이 재계산과 다른 라인 | 144 | 4 |
한 라인이 여러 조건에 걸릴 수 있어 점검 필요 라인은 13건입니다. 의도적 예외를 일부러 남긴 이유는 점검 화면이 정말 이상한 자리를 잡아내는지를 같은 검증에서 함께 보기 위해서입니다. 화면 쪽은 이와 별도로 브라우저 자동화로 확인했습니다 — 점검 필요만 조회하면 13건이 남고, 행을 누르면 상세 창이 열리며, 콘솔 오류는 없습니다. 서비스 쪽은 날짜 조건(전기일 3월 16건)과 함수 두 개(최대 대체율 33.89 · 최소 대체율 3.78)까지 직접 호출해 확인했습니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 | OpenUI5 1.120 · sap_horizon 테마 · sap.ui.table.Table 다섯 개를 탭으로 | 행이 수백 줄이어도 가로·세로 스크롤이 자연스럽고, 열 머리글이 고정되어 월마감 화면에 맞습니다. |
| 데이터 연결 | OData V2 서비스 한 개 · 앱은 모델 경로에만 바인딩 | 조회조건은 필터로, 정렬·건수는 모델 기능으로 처리합니다. 서비스 주소를 코드에 박지 않아 운영 서비스로 바꾸는 일이 설정 교체로 끝납니다. |
| 서비스 구성 | 다섯 개 결과집합(라인 명세 · 자재별 · 사유별 · 월별 추이 · 대사 결과)과 파생 지표 계산 두 개 | 화면의 탭마다 결과집합을 따로 두어 키가 겹치지 않고, 대체율의 최댓값·최솟값 같은 파생 지표는 함수로 계산합니다. |
| 계산·판정 로직 | 환산량 · 대체율 · 대체 영향액 · 재계산 소비금액 · 대사식 | 정확한 소수 계산으로 금액이 원 단위까지 맞아 합계 대사가 정확히 0 이 됩니다. |
| 오류 처리 | 서비스가 연결되지 않으면 안내 창 | 빈 화면이나 콘솔 오류로 두지 않고, 무엇이 안 됐는지 사용자 말로 알립니다. |
| 테마 | sap_horizon (SAP Horizon) | SAP 표준 Fiori 화면과 같은 색·글꼴·간격을 써서 표준 화면 옆에 놓아도 이질감이 없습니다. |
앱 정보표
| 항목 | 내용 |
|---|---|
| 업무 영역 | 관리회계(CO) · 제조원가 분석 |
| 관련 기준서·대상 영역 | 관련 기준서 없음(-) · 대상 영역: 제조원가 분석(대체자재 사용 원가 영향) |
| SAP 표준 T-code | CS03 · CO03 · COOIS · MB51 · CK13N · KKBC_ORD |
| 화면 성격 | 월마감 제조원가 점검 조회 화면 |
| 데이터 연동 | OData V2 서비스(상대 경로, manifest 선언) |
| 테마 | sap_horizon |
실행 화면
실제로 돌아가는 화면 7종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 보는 자리인지 아래에 적었습니다. 숫자는 모두 같은 검증용 샘플 데이터에서 나온 것이라 화면끼리 서로 맞춰 보셔도 됩니다.
처음 열었을 때
조회조건과 요약, 표가 한 화면에 세로로 쌓입니다. 가장 먼저 눈에 들어와야 하는 것은 “오늘 확인할 곳이 몇 건인가” 입니다.

화면을 열면 기본 조건으로 바로 조회됩니다. 맨 위 파란 안내에는 대체 환산량·대체율·대체 영향액을 어떻게 구하는지 한 번 적어 두었고, 그 아래가 조회조건과 요약 타일입니다. 표의 “대체율”은 대체 환산량을 주자재 투입량과 대체 환산량의 합으로 나눈 값이며, 허용 대체율을 넘는 행만 “점검 필요”로 바뀝니다. 탭 이름 위의 작은 숫자(144 · 54 · 36 · 9 · 11)는 탭마다 몇 건이 조회됐는지입니다.

마감 때 가장 먼저 쓰는 모습입니다. 144건을 훑지 않고 13건으로 줄여 시작합니다. 점검 코드 기준으로 대체 정의 없음 3건, 허용 대체율 초과 4건, 허용 영향률 초과 2건, 장부 소비금액 차이 4건입니다. 한 라인이 여러 조건에 걸릴 수 있어 조건별로 세면 3 · 4 · 5 · 4건이 되며, 이 숫자는 대사 결과 탭의 의도적 예외와 같습니다.
한 줄에서 근거까지 내려가기
점검 필요 한 줄을 눌러 환산 과정부터 같은 자재의 다른 투입까지 이어서 봅니다.

숫자를 의심할 때 다른 화면을 열지 않도록 만든 자리입니다. 위쪽은 “주자재 투입 × 표준단가 + 대체자재 투입 × 대체 단가”로 재계산한 소비금액이 어떻게 나왔는지를, 아래쪽은 같은 자재가 같은 달에 어떤 오더에서 얼마나 대체됐는지를 보여 줍니다.
자재·사유·월로 모아 보기
같은 라인을 세 가지 시선으로 묶어 봅니다. 세 탭의 대체 영향액 합계는 월별 합계와 같습니다.

자재 담당자가 “우리 자재가 한 달 동안 얼마나 다른 자재로 바뀌었나”를 보는 자리입니다. 라인에서는 작아 보이던 대체가 월 합계로는 허용치를 넘는 경우를 여기서 찾습니다.

대체가 왜 생겼는지로 묶어 보면 대응이 달라집니다. 재고 부족이 원인이면 구매·계획 쪽 과제이고, 품질 불량이 원인이면 품질 쪽 과제입니다. 점유 비율도 같이 나옵니다.

월 단위 흐름과 마감 점검을 한 번에 보는 자리입니다. 월별 대체 영향액을 모두 더한 값은 자재별 탭·사유별 탭의 합계와 같아야 하고, 이것이 대사 R04~R06 입니다.
검산으로 닫기

화면이 스스로 검산하는 자리입니다. 정합성 대사 R01~R07 은 차이가 모두 0건이어야 하고, 예외 E01~E04 는 일부러 심은 이상 라인을 얼마나 잡았는지를 보여 줍니다.
화면 뒤에서 일어나는 일
화면은 조회조건을 필터로 만들어 서비스에 보내고, 서비스가 돌려준 결과를 탭마다 표에 바인딩합니다. 전체 선택이면 해당 필터를 만들지 않습니다. 날짜 조건은 서비스가 직접 비교하고, 최댓값·최솟값 같은 파생 지표는 함수로 계산합니다. 서비스가 연결되지 않으면 안내 창이 열려 어떤 요청이 실패했는지 알려 줍니다.
판정 규칙 — 어떤 때 점검 필요가 되나
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 대체자재를 투입했는데 자재명세서에 대체 정의가 없음 | 점검 필요 · 정의 없음 | 자재명세서의 대체 항목 정의와 투입 사유를 확인합니다. |
| 대체율이 허용 대체율을 넘음 | 점검 필요 · 대체율 초과 | 대체 투입 승인 기준과 해당 생산오더의 투입 내역을 확인합니다. |
| 영향률의 절댓값이 허용 영향률을 넘음 | 점검 필요 · 영향률 초과 | 대체자재 단가와 환산계수를 확인하고 표준 자재비 대비 영향을 검토합니다. |
| 장부 소비금액 − 재계산 소비금액이 0 이 아님 | 점검 필요 · 장부 차이 | 자재 문서의 수량·단가와 평가를 원천과 대조합니다. |
| 위 조건에 모두 해당하지 않음 | 정상 | 조치 없음 |
| 자재·사유·월 집계에서 점검 필요 라인이 1건 이상 | 점검 필요(집계 행) | 해당 집계의 라인 명세를 열어 확인합니다. |
점검 필요는 “잘못 투입했다”는 뜻이 아닙니다. 자재 문서와 생산오더처럼 원천에서 확인해야 할 자리가 있다는 표시이며, 원인을 단정하지 않습니다. 한 라인이 여러 조건에 걸리면 위 순서의 첫 조건을 점검 코드로 보입니다.
조회조건
| 조회조건 | 필수 | 대상 칸 | 조회 방식 |
|---|---|---|---|
| 회계연도 | 필수 | 회계연도 | 4자리, 기본 2026 · Gjahr eq |
| 주자재 | 선택 | 라인 명세·자재별 | 전체면 조건 없음 · PrimItem eq |
| 대체 사유 | 선택 | 라인 명세·사유별 | 전체면 조건 없음 · Reason eq |
| 마감 월 시작·종료 | 선택 | 마감 월 | 둘 다 있으면 범위 · Period ge … and Period le … |
| 전기일 시작·종료 | 선택 | 라인 명세 | 날짜 범위 — 서비스가 날짜 비교를 직접 처리 |
| 점검 결과 | 선택 | 전 탭 | 전체면 조건 없음 · CheckStatus eq |
결과 컬럼
| 탭 | 주요 컬럼 |
|---|---|
| 라인 명세 | 마감 월 · 생산오더 · 주자재 · 대체자재 · 대체 사유 · 점검 결과 · 대체자재 투입량 · 환산계수 · 대체 환산량 · 대체율 · 허용 대체율 · 주자재 표준단가 · 대체 단가 · 표준 자재비 · 수량 차이 · 대체 영향액 · 영향률 · 재계산·장부 소비금액 · 장부 차이 |
| 자재별 | 마감 월 · 주자재 · 대체자재 · 점검 결과 · 라인 수 · 점검 필요 수 · 대체율 · 대체 영향액 · 영향률 |
| 사유별 | 마감 월 · 대체 사유 · 점검 결과 · 라인 수 · 점유 비율 · 대체 영향액 · 영향률 · 최대 대체율 |
| 월별 추이 | 마감 월 · 점검 결과 · 라인 수 · 오더 수 · 표준 자재비 · 수량 차이 · 대체 영향액 · 재계산 · 장부 소비금액 · 장부 차이 |
| 대사 결과 | 번호 · 구분 · 대사 항목 · 좌변 · 우변 · 검사 건수 · 차이 건수 · 최대 차이 |
좁은 화면에서 달라지는 것
조회조건과 요약 타일이 줄을 바꿔 쌓이고, 표는 가로 스크롤로 봅니다. 열 머리글은 고정되어 있습니다.
파일 구성
| 구분 | 내용 |
|---|---|
| 앱 본체 | index.html · manifest.json · Component.js · controller · view · model · css · i18n |
| 데이터 서비스 | OData 서비스 정의와 결과집합별 샘플 자료, 그리고 조회·단건·생성·수정·삭제·함수 계산을 구현한 서비스 모듈 |
| 설명서·영상 | 설명서 한 장과 소개 영상(1분 24초) · 영상 대표 이미지 |
| 검증 전용 | 검증용 샘플 화면 · 샘플 서버 스크립트 · 샘플 데이터 — 앱 본체는 이 영역을 읽지 않습니다 |
SAP 표준 기능 확장 포인트
이 앱은 SAP 표준을 대신하지 않습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 어디까지가 표준이고 어디서부터 이 앱인지를 먼저 적습니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준으로 되는 부분 | 표준에서 걸리는 자리 | 이 앱이 더하는 관점 |
|---|---|---|---|
| 대체 항목 정의 확인 | CS03 으로 자재명세서의 대체 항목 조회 | 자재 하나씩 열어야 하고 투입 실적과 나란히 놓이지 않습니다 | 투입한 대체자재가 정의돼 있는지 라인마다 가립니다 |
| 생산오더의 구성품 확인 | CO03 · COOIS 로 오더·구성품 조회 | 계획 구성품과 실제 투입이 환산 없이 따로 보입니다 | 환산계수로 같은 기준 수량으로 바꿔 대체율을 구합니다 |
| 투입 문서 확인 | MB51 로 자재 문서 목록 | 문서 단위라 오더·월 단위 흐름이 안 보입니다 | 오더·구성품·월로 모아 점검 필요만 걸러냅니다 |
| 표준단가 확인 | CK13N 으로 원가 산정 결과 조회 | 자재별로 열어야 하고 영향액 계산은 담지 않습니다 | 표준단가를 이어받아 대체 영향액에 씁니다 |
| 오더 차이 분석 | KKBC_ORD 로 오더별 대상원가 분석 | 차이는 보이나 대체 때문인지 수량 때문인지는 가르지 않습니다 | 수량 차이와 대체 영향액을 나눠 봅니다 |
T-code 별 연계 지점
| 표준 T-code | 이름 | 이 앱과의 연계 |
|---|---|---|
CS03 | 자재명세서 조회 | 점검 코드 정의 없음이 나온 라인의 자재를 열어 대체 항목 정의와 우선순위를 확인합니다. |
CO03 | 생산오더 조회 | 라인의 생산오더를 열어 계획 구성품과 실제 투입을 대조합니다. |
COOIS | 오더 정보 시스템 | 월별 오더 수와 구성품 투입 내역을 목록으로 확인합니다. |
MB51 | 자재 문서 목록 | 장부 소비금액과 투입 수량의 원천 문서를 확인합니다. 장부 차이가 있는 라인은 여기서 문서 단가를 봅니다. |
CK13N | 원가 산정 결과 조회 | 주자재 표준단가의 원천을 확인합니다. 단가 변경 시점이 장부 차이의 원인인지 봅니다. |
KKBC_ORD | 오더별 대상원가 분석 | 오더 차이 분석과 이 앱의 수량 차이·대체 영향액을 견줘 봅니다. |
운영 전환 시 “기존 리포트를 없애야 하나” 에 대한 답은 아니오입니다. 법정 결산과 감사 대응에 쓰는 전표와 표준 화면은 그대로 남기고, 이 앱은 그 위에서 대체 영향 점검 용도로 함께 씁니다. 두 화면의 숫자가 다르면 장부 소비금액 차이 칸이 그 자리를 가려 줍니다.
S/4HANA 분석 스택과의 자리
S/4HANA 에서는 CDS 뷰로 만든 분석 쿼리를 표준 Fiori 앱이 그대로 띄워 줍니다. 이 앱을 올리기 전에 표준 스택으로 먼저 되는지를 확인하는 편이 유지보수가 쌉니다.
| 표준 자리 | 무엇을 하나 | 이 앱과의 관계 |
|---|---|---|
Query Browser (F1068) | 분석 쿼리 뷰를 목록에서 찾아 바로 실행 | 아래 CDS 구성의 쿼리 뷰를 만들어 두면 투입 수량과 금액은 이 앱 없이도 볼 수 있습니다. 환산과 영향액 계산이 필요 없다면 여기서 끝내도 됩니다. |
View Browser (F2170) | CDS 뷰의 구조와 의존 관계 탐색 | 자재 문서·평가의 표준 원천 뷰를 고를 때 씁니다. |
| Analysis for Microsoft Office | 같은 쿼리를 엑셀 피벗으로 | 엑셀로 내려 다시 가공하는 업무가 많다면 함께 열어 둡니다. |
| KPI Modeler / 카드 | 요약 지표를 런치패드 타일로 | 이 앱의 요약 지표(대체 영향액 · 최대 대체율 · 점검 필요 건수 등)를 같은 숫자로 타일에 띄울 수 있습니다. |
확장 포인트 — 운영에서 실제로 손대는 자리
- 대체 투입의 식별 기준을 정한다. 자재 문서의 이동 유형·구성품 연결에서 대체 투입을 가려내는 조합은 확인 필요이며, 이 기준이 정해져야 대체율이 나옵니다.
- 환산계수의 원천을 정한다. 자재명세서의 대체 항목 정의에서 읽을지 별도 매핑 테이블을 둘지 정합니다. 새 대체 관계가 생길 때마다 개발자를 부르지 않게 매핑 한 곳에서 읽습니다.
- 허용 대체율을 회사 정책으로 확정한다. 샘플은 자재마다 20~40% 입니다. 자재의 중요도와 규격 차이에 맞춰 정합니다. 너무 낮으면 점검 필요가 쏟아지고 너무 높으면 봐야 할 대체를 놓칩니다.
- 허용 영향률을 정한다. 샘플은 3~8% 범위입니다. 표준 자재비에서 차지하는 비중과 마감 담당자가 볼 수 있는 건수에 맞춥니다.
- 권한을 표준 객체로 건다. 플랜트·회사코드 권한을 집계를 읽는 자리에 겁니다. 자재 원가는 플랜트 간 비교가 가능한 정보라서 보는 사람을 정해야 합니다.
- 월마감 조회 시점을 정한다. 자재 문서와 평가가 확정된 뒤 조회하도록 마감 일정 안에 한 칸을 넣어 두면 장부 대조가 의미를 가집니다.
분석 지표 정의
| 지표 | 산식·판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 대체 환산량 | 대체자재 투입량 × 환산계수 | 라인 명세 · 자재별 | STPO · RESB · MSEG | 환산계수 원천 필드는 확인 필요 |
| 대체율 | 대체 환산량 ÷ (주자재 투입량 + 대체 환산량) × 100 | 라인 명세 · 자재별 | 위 지표 | 허용 대체율은 회사 정책 확인 필요 |
| 표준 자재비 | 계획 수량 × 주자재 표준단가 | 월별 추이 | MBEW | 표준단가 원천은 확인 필요 |
| 대체 영향액 | 대체자재 투입 금액 − 대체 환산량 × 주자재 표준단가 | 전 탭 | MSEG · MBEW | 음수면 대체로 원가가 줄어든 경우 |
| 대체 영향률 | 대체 영향액 ÷ 표준 자재비 × 100 | 자재별 · 사유별 · 월별 | 위 지표 | 허용 영향률 자재별 3~8%(샘플 기준) |
| 장부−재계산 차이 | 장부 소비금액 − 재계산 소비금액 | 라인 명세 · 월별 추이 | MSEG | 허용오차 0원 |
CDS 구성
이 사례의 화면은 서비스가 계산한 결과를 보여 줍니다. 운영 데이터로 올릴 때는 투입 수량·금액·단가를 읽는 일은 CDS 가, 환산과 영향액 재계산은 ABAP 클래스가 맡습니다. 아래는 그때 만드는 객체들을 레이어 순서대로 적은 것입니다.
코드는 스케치입니다. 필드 이름과 표준 뷰 이름은 릴리스·환경에 따라 다르므로 그대로 붙여 넣기 전에 View Browser(F2170) 로 실제 이름을 확인해야 합니다. 확인이 필요한 자리는 주석에 적어 두었습니다.
뷰 레이어 구성
| 레이어 | 객체 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | ZALT_MAP | 주자재·대체자재 짝 · 환산계수 · 허용 대체율 · 허용 영향률 | 허용치는 정책이라 코드에 박으면 바꿀 때마다 개발을 부르게 됩니다. |
| 차원 | ZI_AltMatDef | 대체 정의 한 행 + 환산계수 + 허용치 | 큐브의 join 을 한 곳으로 모읍니다. |
| 큐브(투입) | ZI_AltMatIssue | 월·오더·구성품 투입 수량과 금액(자재 문서 위) | 장부 소비금액을 한 곳에서만 읽습니다. |
| 큐브(단가) | ZI_AltMatPrice | 평가 기간별 표준단가 | 월마다 맞는 단가를 읽습니다. |
| 쿼리 | ZC_AltMatQuery | 축 기본 배치와 필터 | 표준 Fiori 와 Analysis for Office 가 그대로 띄웁니다. |
| 권한 | ZI_ALTMATISSUE(DCL) | 플랜트 권한 | 집계를 읽는 자리에 걸어야 뺄셈으로 새지 않습니다. |
| 서비스 | ZCL_ALTMAT_IMPACT | 환산·대체율·영향액·점검 코드 계산 | 환산과 허용치 비교는 SQL 보다 클래스가 읽기 쉽습니다. |
① 대체 구성품 매핑 테이블
어느 자재가 어느 자재로 바뀔 수 있고, 환산계수와 허용치가 얼마인지를 정하는 자리라 운영 전환에서 가장 먼저 합의해야 하는 항목입니다. 유효기간을 키에 둔 이유는 중간에 허용치가 바뀌어도 과거 달의 점검 결과가 흔들리지 않게 하려는 것입니다.
" ────────────────────────────────────────────────────────────────
" ZALT_MAP — 대체 구성품 매핑
" 역할 : 주자재와 대체자재의 짝, 환산계수, 허용 대체율, 허용 영향률을 담는다
" 이렇게 나눈 이유 : 허용치는 회사 정책이라 코드에 박으면 바꿀 때마다 개발을 부르게 된다
" ────────────────────────────────────────────────────────────────
@EndUserText.label : '대체 구성품 매핑'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zalt_map {
key client : abap.clnt not null;
key plant : werks_d not null;
key prim_matnr : matnr not null; " 주자재
key alt_matnr : matnr not null; " 대체자재
key valid_to : datum not null; " 유효 종료일 — 이력을 남기려고 키에 둔다
valid_from : datum;
conv_factor : abap.dec(9,4); " 대체 1단위가 주자재 몇 단위인가 (원천 필드는 확인 필요)
alt_limit_pct : abap.dec(7,2); " 허용 대체율(%)
impact_limit_pct : abap.dec(7,2); " 허용 영향률(±%)
}
② 대체 정의 차원 — ZI_AltMatDef
매핑 테이블과 자재명세서의 대체 항목 정의를 한 뷰로 모아 큐브가 같은 join 을 반복하지 않게 합니다. 정의가 없는 대체 투입(NDEF)을 가리는 기준이 여기서 나옵니다.
" ────────────────────────────────────────────────────────────────
" ZI_AltMatDef — 대체 정의 차원
" 역할 : 주자재·대체자재 한 쌍과 정의 여부를 한 행으로 낸다
" 이렇게 나눈 이유 : 매핑과 자재명세서 정의를 한 곳에서 합쳐 두면 큐브가 join 을 반복하지 않는다
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '대체 정의'
@ObjectModel.usageType: { serviceQuality: #A, sizeCategory: #M, dataClass: #CUSTOMIZING }
define view entity ZI_AltMatDef
as select from zalt_map as m
{
key m.plant as Plant,
key m.prim_matnr as PrimaryMaterial,
key m.alt_matnr as AlternativeMaterial,
key m.valid_to as ValidTo,
m.valid_from as ValidFrom,
m.conv_factor as ConversionFactor,
m.alt_limit_pct as AltRatioLimit,
m.impact_limit_pct as ImpactLimit
// 자재명세서(STPO)의 대체 항목 그룹·우선순위와 맞춰 보는 열은 확인 필요
}
③ 투입 큐브 — ZI_AltMatIssue
자재 문서에서 월·오더·구성품 단위의 투입 수량과 금액을 읽습니다. 장부 소비금액은 이 큐브 한 곳에서만 읽어 재계산과 대조합니다. 대체 투입을 가려내는 이동 유형 조합은 확인 필요로 주석에 남겼습니다.
" ────────────────────────────────────────────────────────────────
" ZI_AltMatIssue — 투입 큐브
" 역할 : 생산오더 구성품의 자재 문서(MSEG) 투입량과 금액을 월·오더·구성품 단위로 낸다
" 이렇게 나눈 이유 : 장부 소비금액은 이 큐브 한 곳에서만 읽어 재계산과 대조한다
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '대체자재 투입 큐브'
@Analytics.dataCategory: #CUBE
@ObjectModel.usageType: { serviceQuality: #X, sizeCategory: #L, dataClass: #TRANSACTIONAL }
define view entity ZI_AltMatIssue
as select from mseg as g
association [0..1] to ZI_AltMatDef as _Def
on _Def.Plant = $projection.Plant
and _Def.AlternativeMaterial = $projection.Material
{
key g.mblnr as MaterialDocument,
key g.mjahr as MaterialDocumentYear,
key g.zeile as MaterialDocumentItem,
g.werks as Plant,
g.matnr as Material,
g.aufnr as ProductionOrder,
g.bwart as MovementType, " 대체 투입을 가리는 이동 유형 조합은 확인 필요
g.meins as BaseUnit,
@Semantics.quantity.unitOfMeasure: 'BaseUnit'
@DefaultAggregation: #SUM
g.menge as Quantity,
@Semantics.amount.currencyCode: 'Currency'
@DefaultAggregation: #SUM
g.dmbtr as Amount,
g.waers as Currency,
_Def
}
④ 단가 큐브 — ZI_AltMatPrice
주자재 표준단가와 대체자재 단가를 평가 기간 단위로 읽습니다. 기간마다 단가가 달라 같은 라인이라도 월에 따라 영향액이 달라지므로 기간을 키에 둡니다.
" ────────────────────────────────────────────────────────────────
" ZI_AltMatPrice — 표준단가 큐브
" 역할 : 자재 평가(MBEW) 기준의 주자재 표준단가와 대체자재 단가를 낸다
" 이렇게 나눈 이유 : 단가는 기간마다 바뀌므로 평가 기간까지 키에 두어 월마다 맞는 단가를 읽는다
" ────────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '자재 단가'
@ObjectModel.usageType: { serviceQuality: #A, sizeCategory: #L, dataClass: #MASTER }
define view entity ZI_AltMatPrice
as select from mbew as v
{
key v.matnr as Material,
key v.bwkey as ValuationArea,
key v.lfgja as FiscalYear,
key v.lfmon as FiscalPeriod,
v.stprs as StandardPrice, " 표준단가 — 가격단위(PEINH) 반영은 확인 필요
v.verpr as MovingAveragePrice,
v.peinh as PriceUnit
}
⑤ 분석 쿼리 — ZC_AltMatQuery
표준 Fiori 와 Analysis for Microsoft Office 가 그대로 띄우는 쿼리입니다. 투입 수량과 금액만 필요하다면 이 쿼리에서 끝내도 됩니다.
" ────────────────────────────────────────────────────────────────
" ZC_AltMatQuery — 분석 쿼리
" 역할 : 월·주자재·대체 사유 축과 필터를 기본 배치로 둔다
" 이렇게 나눈 이유 : 표준 Fiori 와 Analysis for Office 가 같은 쿼리를 그대로 띄운다
" ────────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '대체자재 투입 쿼리'
@Analytics.query: true
define view entity ZC_AltMatQuery
as select from ZI_AltMatIssue
{
@AnalyticsDetails.query.axis: #ROWS
key ProductionOrder,
@AnalyticsDetails.query.axis: #ROWS
key Material,
@AnalyticsDetails.query.axis: #COLUMNS
@Aggregation.default: #SUM
Quantity,
@AnalyticsDetails.query.axis: #COLUMNS
@Aggregation.default: #SUM
Amount
}
⑥ 권한 — ZI_ALTMATISSUE (DCL)
플랜트 권한을 집계를 읽는 큐브에 겁니다. 권한 오브젝트와 필드는 회사의 권한 설계에 따라 달라 확인이 필요합니다.
" ────────────────────────────────────────────────────────────────
" ZI_ALTMATISSUE (DCL) — 플랜트 권한
" 역할 : 플랜트 권한이 있는 사용자만 투입 큐브의 행을 읽는다
" 이렇게 나눈 이유 : 큐브에서 막아야 합계로 다른 플랜트 숫자를 알아내는 길이 막힌다
" ────────────────────────────────────────────────────────────────
@EndUserText.label: '대체자재 투입 권한'
@MappingRole: true
define role ZI_ALTMATISSUE {
grant select on ZI_AltMatIssue
where ( Plant ) = aspect pfcg_auth( M_MSEG_WWA, WERKS, ACTVT = '03' );
" 권한 오브젝트와 필드는 회사 권한 설계에 맞춰 확인 필요
}
⑦ 영향액 계산 — 조회 클래스
환산·대체율·영향액·점검 코드는 SQL 이 아니라 ABAP 클래스가 맡습니다. 같은 입력이면 항상 같은 결과가 나오므로 단위 테스트로 대사식(R01~R07)을 그대로 옮겨 확인할 수 있습니다.
CLASS zcl_altmat_impact DEFINITION PUBLIC FINAL CREATE PUBLIC.
" 역할 : 라인마다 대체 환산량·대체율·영향액을 다시 계산하고 점검 코드를 붙인다
" 이렇게 나눈 이유 : 환산·반올림·허용치 비교는 SQL 로 쓰면 읽기 어렵고 단위 테스트도 어렵다
PUBLIC SECTION.
TYPES: BEGIN OF ty_line,
prim_qty TYPE p LENGTH 13 DECIMALS 3,
alt_qty TYPE p LENGTH 13 DECIMALS 3,
conv TYPE p LENGTH 9 DECIMALS 4,
prim_price TYPE p LENGTH 13 DECIMALS 2,
alt_price TYPE p LENGTH 13 DECIMALS 2,
plan_amt TYPE p LENGTH 15 DECIMALS 0,
book_amt TYPE p LENGTH 15 DECIMALS 0,
alt_limit TYPE p LENGTH 7 DECIMALS 2,
imp_limit TYPE p LENGTH 7 DECIMALS 2,
defined TYPE abap_bool,
END OF ty_line.
TYPES: BEGIN OF ty_result,
eqv_qty TYPE p LENGTH 13 DECIMALS 3,
ratio TYPE p LENGTH 7 DECIMALS 2,
effect TYPE p LENGTH 15 DECIMALS 0,
recalc_amt TYPE p LENGTH 15 DECIMALS 0,
book_diff TYPE p LENGTH 15 DECIMALS 0,
check_code TYPE c LENGTH 4,
END OF ty_result.
CLASS-METHODS calc IMPORTING is_line TYPE ty_line RETURNING VALUE(rs) TYPE ty_result.
ENDCLASS.
CLASS zcl_altmat_impact IMPLEMENTATION.
METHOD calc.
rs-eqv_qty = is_line-alt_qty * is_line-conv.
IF is_line-prim_qty + rs-eqv_qty <> 0.
rs-ratio = rs-eqv_qty * 100 / ( is_line-prim_qty + rs-eqv_qty ).
ENDIF.
rs-effect = is_line-alt_qty * is_line-alt_price - rs-eqv_qty * is_line-prim_price.
rs-recalc_amt = is_line-prim_qty * is_line-prim_price + is_line-alt_qty * is_line-alt_price.
rs-book_diff = is_line-book_amt - rs-recalc_amt.
rs-check_code = 'OK'.
IF is_line-alt_qty > 0 AND is_line-defined = abap_false.
rs-check_code = 'NDEF'.
ELSEIF rs-ratio > is_line-alt_limit.
rs-check_code = 'RLIM'.
ELSEIF is_line-plan_amt <> 0 AND abs( rs-effect * 100 / is_line-plan_amt ) > is_line-imp_limit.
rs-check_code = 'IMPT'.
ELSEIF rs-book_diff <> 0.
rs-check_code = 'BOOK'.
ENDIF.
ENDMETHOD.
ENDCLASS.
운영 시점에 해야 할 일
| 할 일 | 안 하면 생기는 일 | 맡을 곳 |
|---|---|---|
| 대체 투입 식별 기준 확정 | 대체가 아닌 투입이 섞이거나 대체 투입이 빠집니다 | 원가회계팀 · 현업 |
| 환산계수의 원천과 매핑 | 대체율이 틀려 점검 건수가 의미를 잃습니다 | 원가회계팀 · 생산기술 |
| 허용 대체율·허용 영향률 | 점검 건수가 너무 많거나 너무 적어집니다 | 원가회계팀장 |
| 권한 기준 | 합계에서 다른 플랜트의 숫자를 알 수 있습니다 | 보안 · 권한 |
| 대사 체계와 주기 | 두 화면 숫자가 다를 때 판단 기준이 없습니다 | 원가회계팀 · IT |
운영 데이터로 갈 때
위 다섯 가지는 코딩이 아니라 합의입니다. 합의가 끝나면 기술 작업은 CDS 뷰(큐브 · 쿼리 · 권한)와 조회 클래스를 만들고, 이 화면의 서비스 주소만 운영 서비스로 바꿔 올리는 일입니다.
자주 묻는 질문
도입을 검토하실 때 가장 자주 나오는 질문을 네 묶음으로 정리했습니다.
숫자와 산식
대체 환산량과 대체율은 어떻게 계산합니까?
대체 환산량은 대체자재 투입량 × 환산계수입니다. 대체율은 대체 환산량을 주자재 투입량과 대체 환산량의 합으로 나눠 백분율로 씁니다. 같은 단위로 바꾼 뒤 비교하므로 대체자재가 주자재와 다른 규격이어도 한 기준에서 볼 수 있습니다.
대체 영향액은 무엇을 뜻합니까?
대체자재 투입 금액에서 같은 환산량을 주자재로 썼을 때의 표준 금액을 뺀 값입니다. 대체자재 투입량 × 대체자재 단가 − 대체 환산량 × 주자재 표준단가로 구하며, 음수면 대체로 원가가 줄어든 경우입니다.
표준 자재비와 수량 차이, 대체 영향액은 어떤 관계입니까?
재계산 소비금액은 표준 자재비에 수량 차이와 대체 영향액을 더한 값과 같아야 합니다. 이 관계를 라인마다 확인하는 것이 대사 R02 이며, 144건 모두 차이가 없습니다.
영향률은 어떻게 판정합니까?
대체 영향액을 표준 자재비로 나눈 백분율의 절댓값이 허용 영향률을 넘으면 점검 필요입니다. 검증용 샘플에서는 자재마다 3~8% 범위로 두었고, 실제 값은 회사가 정합니다.
점검 필요로 표시되면 잘못 투입했다는 뜻입니까?
아닙니다. 자재명세서의 대체 정의가 없거나 허용 대체율·영향률을 넘었거나 장부 소비금액이 재계산과 다르다는 표시일 뿐이며, 원인은 생산오더와 자재 문서에서 확인해야 합니다. 이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다.
의도적 예외는 왜 따로 둡니까?
점검 화면이 실제로 이상한 자리를 잡아내는지 같은 검증에서 함께 보기 위해서입니다. 대체 정의 없는 투입 3건, 허용 대체율 초과 4건, 허용 영향률 초과 5건, 장부 소비금액 차이 4건을 일부러 두었고 대사 차이 건수와 섞이지 않게 따로 집계합니다.
화면과 조작
조회는 어떻게 합니까?
회계연도(필수, 4자리)를 확인하고 조회 버튼을 누르거나 입력 칸에서 Enter 키를 누릅니다. 화면을 처음 열면 기본 조건으로 자동 조회되고, 초기화 버튼은 조회 버튼 옆에 있습니다.
점검 필요인 라인만 볼 수 있습니까?
점검 결과를 “점검 필요”로 고르고 조회합니다. 이 샘플에서는 라인 명세 13건이 남습니다. 월마감 때 가장 먼저 쓰는 방법입니다.
행을 누르면 무엇이 나옵니까?
라인 명세의 행을 누르면 상세 창이 열려 환산계수·대체 환산량·대체율·표준 자재비·수량 차이·대체 영향액·장부 소비금액이 한곳에 모이고, 아래에 같은 자재·같은 월의 투입 라인이 이어집니다.
마감 월과 전기일은 어떻게 다릅니까?
마감 월은 월 단위 범위(시작·종료)로, 전기일은 날짜 단위 범위로 거릅니다. 전기일 조건은 라인 명세 탭에 적용되며 서비스가 날짜 비교를 직접 처리합니다.
엑셀로 내려받을 수 있습니까?
현재 탭의 조회 결과를 UTF-8 CSV 로 내려받을 수 있습니다. 파일명은 기능명과 탭 이름이며, 한글이 깨지지 않도록 UTF-8 로 저장합니다.
좁은 화면에서도 쓸 수 있습니까?
조회조건과 요약 타일이 줄을 바꿔 쌓이고 표는 가로 스크롤로 봅니다. 열 머리글은 고정되어 있어 행이 많아도 어느 칸인지 놓치지 않습니다.
표준과 도입
SAP 표준 화면으로는 왜 부족합니까?
자재명세서 조회(CS03)와 생산오더 조회(CO03), 자재 문서 목록(MB51)은 각각 한 가지 사실만 보여 줍니다. 대체 정의·투입량·단가·장부 금액을 한 줄에 놓고 허용치와 견주는 화면은 표준에 없어 보통 엑셀로 맞춥니다. 이 앱은 그 맞춤을 대신합니다.
표준 T-code 를 대체합니까?
아닙니다. 표준 실행과 전표는 그대로 두고, 이 화면은 조회·검증 관점만 더합니다. 이상한 라인이 나오면 CS03·CO03·COOIS·MB51·CK13N 으로 내려가 원천을 확인합니다.
환산계수는 어디서 가져옵니까?
샘플에서는 구성품마다 정해 둔 값을 썼습니다. 실제 적용 때 환산 기준은 자재명세서의 대체 항목 정의와 회사 기준을 따르며, 원천 필드는 확인 필요입니다. 이 값이 정해져야 대체율이 나옵니다.
허용 대체율은 누가 정합니까?
회사의 원가·구매 정책으로 정합니다. 화면은 자재별로 받은 허용 대체율과 비교만 하며, 너무 낮게 두면 점검 필요가 쏟아지고 너무 높게 두면 봐야 할 대체를 놓칩니다.
대체 투입을 식별하는 기준은 무엇입니까?
주자재 구성품 대신 대체 항목이 투입된 자재 문서를 가려내는 기준입니다. S/4HANA 에서의 이동 유형·필드 조합은 확인 필요이며, 운영 전환에서 가장 먼저 합의할 항목입니다.
기존 리포트를 없애야 합니까?
아니요. 법정 결산과 감사 대응에 쓰는 전표와 표준 화면은 그대로 두고, 이 앱은 그 위에서 대체 영향 점검 용도로 함께 씁니다. 두 화면의 숫자가 다르면 장부 소비금액 차이 칸이 가려 줍니다.
운영과 보안
데이터는 어디서 읽습니까?
운영에서는 자재명세서 항목(STPO)·예약(RESB)·자재 문서(MSEG)·자재 평가(MBEW)를 CDS 뷰로 읽고, 재계산은 ABAP 클래스가 맡습니다. 필드와 뷰 이름은 릴리스마다 달라 View Browser 로 확인해야 합니다.
권한은 어떻게 겁니까?
플랜트·회사코드 권한을 집계를 읽는 큐브에 겁니다. 드릴스루에만 걸면 합계에서 다른 플랜트의 숫자가 새어 나가므로 큐브 단계에서 막아야 합니다.
데이터가 매우 많아지면 어떻습니까?
수량·금액 집계는 CDS 에서 하고, 서버 쪽 계산은 필요한 회계연도와 플랜트만 읽도록 필터를 필수로 둡니다. 라인 명세는 페이징으로 나누어 받고 총건수는 별도로 받습니다.
대체 항목 정의가 바뀌면 어떻게 합니까?
자재명세서의 대체 정의는 유효기간이 있어 과거 월은 그때의 정의로 계산합니다. 매핑 테이블에도 유효 시작·종료일을 두어 중간에 바뀌어도 과거 숫자가 흔들리지 않게 합니다.
장부 소비금액이 재계산과 다를 때 어디부터 봅니까?
먼저 자재 문서의 수량·단가가 평가 시점의 표준단가와 같은지 확인합니다. 단가 변경 전후 문서가 섞이거나 환산계수가 달리 적용되면 한 줄씩 어긋납니다. 라인 상세에서 환산 과정을 열어 차이가 어느 단계인지 봅니다.
이 화면의 판정을 감사 대응에 그대로 써도 됩니까?
점검 도구이므로 판단 근거를 정리하는 용도입니다. 점검 필요는 확인이 필요하다는 표시일 뿐 오류의 확정이 아니며, 최종 판단은 회사와 감사인이 합니다.