제조원가 분석

대체자재 사용 원가 영향 점검 — 제조원가 분석, 주자재 대신 투입한 대체자재가 원가에 준 영향을 다시 계산해 장부와 맞춰 보는 월마감 화면

환산계수로 대체 환산량 재계산 · 대체율 · 대체 영향액과 영향률 · 장부 소비금액 대조 · 점검 필요만 골라 보기 — 소개 영상과 실제 화면 7종, 그리고 CDS 코드까지

소개 영상1분 24초9개 장면음성 안내·자막표지에서 점검 필요 조회, 행 상세, 자재별·사유별·월별 탭, 대사 결과를 거쳐 정리까지

개발 배경 — 이 앱을 사용해야 하는 이유

제조 현장에서는 주자재가 모자라거나 납기가 급하면 자재명세서에 정의해 둔 대체자재를 대신 투입합니다. 월마감에는 늘 같은 질문이 따라붙습니다. 대체한 자재가 주자재 몇 단위에 해당하나, 대체로 원가가 얼마나 늘거나 줄었나, 그 대체가 허용한 범위 안이었나. 지금은 이 답이 자재명세서 화면, 생산오더, 자재 문서 목록, 엑셀 환산표에 흩어져 있어서 마감 때마다 사람이 맞춰야 합니다.

이 앱은 대체자재 투입량을 환산계수로 주자재 기준 수량으로 바꾸고, 대체율과 대체 영향액·영향률을 다시 계산해 자재명세서의 대체 정의·허용 대체율·장부 소비금액과 견줍니다. 그리고 확인이 필요한 투입 라인만 골라 줍니다. 표준 실행과 전표는 그대로 두고 조회·검증 관점만 더하는 화면입니다.

한 줄 요약 — 대체 투입 내역을 보여 주는 화면은 많습니다. 이 앱의 값은 그 다음에 있습니다: 환산한 대체율을 허용치에 견주고, 대체가 원가에 준 영향을 표준 자재비·수량 차이와 나눠 보고, 장부 소비금액이 재계산과 어긋난 자리를 라인 단위로 찾아 줍니다. 그 판단과 책임은 여전히 회사와 감사인에게 있습니다.

대체 투입 내역만 봐서는 원가 영향을 알 수 없다

자재 문서에는 어떤 자재가 얼마나 나갔는지만 남습니다. 그래서 “이번 달 합금강으로 바꿔 넣은 것이 원가에 얼마나 영향을 줬나” 같은 질문이 나오면 엑셀에 환산계수와 단가를 붙여 다시 계산해야 합니다. 이 앱은 라인마다 대체 투입 금액 − 대체 환산량 × 주자재 표준단가를 미리 계산해 두므로, 같은 자재를 한 줄에서 주자재 기준으로 환산해 비교할 수 있습니다.

대체율이 허용 범위를 넘었는지는 합계로는 보이지 않는다

라인 하나는 허용 범위 안이어도 한 달 합계로는 넘을 수 있고, 반대도 있습니다. 이 앱은 라인·자재·월 세 단위로 대체율을 다시 구하고 허용 대체율과 허용 영향률을 넘은 곳만 점검 필요로 바꿉니다. 검증용 샘플에서 허용 대체율은 자재마다 20~40% 범위, 허용 영향률은 3~8% 범위로 두었습니다. 실제 값은 회사가 정합니다.

장부 소비금액이 재계산과 다르면 어디서 갈렸는지 찾기 어렵다

단가가 바뀐 시점이나 환산계수 적용이 한 줄만 달라도 장부와 재계산은 어긋납니다. 합계만 보면 묻히는 차이입니다. 이 앱은 장부 소비금액과 재계산 소비금액의 차이를 라인 한 줄 단위로 대조하고, 차이가 있으면 점검 코드 BOOK 으로 표시합니다.

사용 방법

  1. 조회조건 입력 — 회계연도(필수, 4자리)를 확인합니다. 주자재·대체 사유·마감 월·전기일·점검 결과는 선택이며 비워 두면 전체입니다. 화면을 처음 열면 기본 조건으로 자동 조회됩니다.
  2. 조회 버튼 또는 Enter — 조회조건 영역 가장 오른쪽의 조회 버튼을 누르거나, 입력 칸에서 Enter 키를 누릅니다. 초기화 버튼은 같은 줄에 있습니다.
  3. 요약 확인 — 위쪽 일곱 개 타일(표준 자재비 · 대체 영향액 · 대체 영향률 · 최대 대체율 · 장부와 재계산 차이 합계 · 점검 필요 라인 · 대사 차이 건수)을 봅니다. 금액은 백만원 단위입니다.
  4. 탭 이동 — 라인 명세 · 자재별 · 사유별 · 월별 추이 · 대사 결과 탭으로 근거에서 넓은 곳까지 오가며 봅니다.
  5. 행 클릭 상세 — 라인 명세의 행을 누르면 환산 과정과 같은 자재·같은 월의 투입 라인이 열립니다.
  6. 내보내기 — 현재 탭의 조회 결과를 UTF-8 CSV 로 내려받습니다. 파일명은 기능명과 탭 이름입니다.

숫자를 믿을 수 있는가 — 검증 결과

대체 영향 화면에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 그래서 계산을 만드는 쪽에서 먼저 대사식을 세워 두고 전수로 돌렸습니다. 아래는 이 검증용 샘플 데이터의 결과입니다. 샘플은 가상의 주자재 6종과 완제품 5종, 대체 사유 4가지(재고 부족·납기 대응·품질 불량·공급 중단), 2026년 1~9월 마감 투입 라인 144건으로 만들었으며 실제 고객사의 자재 체계와 금액은 쓰지 않았습니다.

번호대사식검사 건수차이
R01재계산 소비금액 — 주자재 투입금액 + 대체자재 투입금액1440
R02표준 자재비 + 수량 차이 + 대체 영향액 = 재계산 소비금액1440
R03대체 환산수량 — 대체자재 투입 × 환산계수1440
R04라인 합계 = 월별 합계 (대체 영향액)90
R05자재별 합계 = 월별 합계 (대체 영향액)90
R06사유별 합계 = 월별 합계 (대체 영향액)90
R07장부 차이 — 장부 소비금액 − 재계산 소비금액1440

정합성 대사 7건은 모두 차이가 없습니다. 이와 별도로 의도적 예외 네 가지를 일부러 심어 두고 대사 차이와 분리해 따로 집계했습니다.

구분무엇을 심었나검사 건수걸린 건수
E01자재명세서에 대체 정의가 없는데 대체자재를 투입한 라인1443
E02대체율이 허용 대체율을 넘는 라인1444
E03대체 영향률의 절댓값이 허용 영향률을 넘는 라인1445
E04장부 소비금액이 재계산과 다른 라인1444

한 라인이 여러 조건에 걸릴 수 있어 점검 필요 라인은 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-codeCS03 · CO03 · COOIS · MB51 · CK13N · KKBC_ORD
화면 성격월마감 제조원가 점검 조회 화면
데이터 연동OData V2 서비스(상대 경로, manifest 선언)
테마sap_horizon
SAP 표준 기능을 그대로 이어받은 부분 — 구성품 소요와 대체 정의는 표준 자재명세서·생산오더를, 투입 수량과 금액은 표준 자재 문서를, 단가는 표준 자재 평가를 그대로 이어받습니다. 이 앱이 하는 일은 같은 데이터를 환산해 다시 계산하고 허용치·장부와 맞춰 보는 것이고, 대체 투입의 실행과 전표는 표준에 남겨 둡니다.

실행 화면

실제로 돌아가는 화면 7종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 보는 자리인지 아래에 적었습니다. 숫자는 모두 같은 검증용 샘플 데이터에서 나온 것이라 화면끼리 서로 맞춰 보셔도 됩니다.

처음 열었을 때

조회조건과 요약, 표가 한 화면에 세로로 쌓입니다. 가장 먼저 눈에 들어와야 하는 것은 “오늘 확인할 곳이 몇 건인가” 입니다.

처음 연 화면 — 투입 라인 144건과 일곱 개 요약 타일
처음 연 화면 — 투입 라인 144건과 일곱 개 요약 타일 — 회계연도 2026 으로 투입 라인 144건(1~9월)을 조회한 첫 화면입니다. 위쪽 타일에 표준 자재비 678.8백만원, 대체 영향액 -1.2백만원, 대체 영향률 -0.18%, 최대 대체율 48.84%, 장부와 재계산 차이 0.3백만원, 점검 필요 13건이 나옵니다.

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

점검 필요만 조회 — 확인할 투입 라인 13건
점검 필요만 조회 — 확인할 투입 라인 13건 — 점검 결과를 “점검 필요”로 고르고 조회하면 자재명세서에 대체 정의가 없거나 허용 대체율·허용 영향률을 넘었거나 장부 소비금액이 재계산과 다른 라인 13건만 남습니다.

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

한 줄에서 근거까지 내려가기

점검 필요 한 줄을 눌러 환산 과정부터 같은 자재의 다른 투입까지 이어서 봅니다.

행 클릭 상세 — 환산 과정과 영향액을 한 화면에, 아래에는 같은 자재·같은 월의 라인
행 클릭 상세 — 환산 과정과 영향액을 한 화면에, 아래에는 같은 자재·같은 월의 라인 — 행을 누르면 환산계수와 대체 환산량, 대체율, 표준 자재비, 수량 차이, 대체 영향액, 장부 소비금액이 한 화면에 모이고 아래에 같은 자재·같은 월의 투입 라인이 이어집니다.

숫자를 의심할 때 다른 화면을 열지 않도록 만든 자리입니다. 위쪽은 “주자재 투입 × 표준단가 + 대체자재 투입 × 대체 단가”로 재계산한 소비금액이 어떻게 나왔는지를, 아래쪽은 같은 자재가 같은 달에 어떤 오더에서 얼마나 대체됐는지를 보여 줍니다.

자재·사유·월로 모아 보기

같은 라인을 세 가지 시선으로 묶어 봅니다. 세 탭의 대체 영향액 합계는 월별 합계와 같습니다.

자재별 탭 — 주자재마다 월별 대체율과 영향액
자재별 탭 — 주자재마다 월별 대체율과 영향액 — 주자재마다 월별 대체 환산량과 대체율, 대체 영향액과 영향률을 보여 줍니다. 허용 대체율을 넘은 자재·월은 점검 필요로 표시됩니다.

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

사유별 탭 — 대체 사유마다 영향액과 영향률
사유별 탭 — 대체 사유마다 영향액과 영향률 — 재고 부족·납기 대응·품질 불량·공급 중단 같은 대체 사유마다 라인 수와 대체 영향액, 영향률을 모아 봅니다.

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

월별 추이 탭 — 표준 자재비에서 장부 소비금액까지
월별 추이 탭 — 표준 자재비에서 장부 소비금액까지 — 월마다 표준 자재비, 수량 차이, 대체 영향액, 재계산 소비금액, 장부 소비금액과 장부 차이를 이어서 봅니다. 앞의 세 항목을 더하면 재계산 소비금액이 됩니다.

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

검산으로 닫기

대사 결과 탭 — 정합성 대사 7건과 의도적 예외 4건
대사 결과 탭 — 정합성 대사 7건과 의도적 예외 4건 — 정합성 대사 7건과 의도적 예외 4건의 검사 건수와 차이 건수입니다. 의도적 예외는 대사 차이 건수와 분리해 따로 집계합니다.

화면이 스스로 검산하는 자리입니다. 정합성 대사 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 / 카드요약 지표를 런치패드 타일로이 앱의 요약 지표(대체 영향액 · 최대 대체율 · 점검 필요 건수 등)를 같은 숫자로 타일에 띄울 수 있습니다.

확장 포인트 — 운영에서 실제로 손대는 자리

  1. 대체 투입의 식별 기준을 정한다. 자재 문서의 이동 유형·구성품 연결에서 대체 투입을 가려내는 조합은 확인 필요이며, 이 기준이 정해져야 대체율이 나옵니다.
  2. 환산계수의 원천을 정한다. 자재명세서의 대체 항목 정의에서 읽을지 별도 매핑 테이블을 둘지 정합니다. 새 대체 관계가 생길 때마다 개발자를 부르지 않게 매핑 한 곳에서 읽습니다.
  3. 허용 대체율을 회사 정책으로 확정한다. 샘플은 자재마다 20~40% 입니다. 자재의 중요도와 규격 차이에 맞춰 정합니다. 너무 낮으면 점검 필요가 쏟아지고 너무 높으면 봐야 할 대체를 놓칩니다.
  4. 허용 영향률을 정한다. 샘플은 3~8% 범위입니다. 표준 자재비에서 차지하는 비중과 마감 담당자가 볼 수 있는 건수에 맞춥니다.
  5. 권한을 표준 객체로 건다. 플랜트·회사코드 권한을 집계를 읽는 자리에 겁니다. 자재 원가는 플랜트 간 비교가 가능한 정보라서 보는 사람을 정해야 합니다.
  6. 월마감 조회 시점을 정한다. 자재 문서와 평가가 확정된 뒤 조회하도록 마감 일정 안에 한 칸을 넣어 두면 장부 대조가 의미를 가집니다.
단가 변경 시점에서 흔히 놓치는 자리. 표준단가가 월 중간에 바뀌면 같은 대체 투입이라도 문서마다 다른 단가가 적용되어 장부와 재계산이 한 줄씩 어긋납니다. 장부 소비금액이 재계산과 다를 때 가장 먼저 의심할 곳이 단가의 적용 시점인 이유입니다.

분석 지표 정의

지표산식·판정 기준대응 기능원천 데이터비고
대체 환산량대체자재 투입량 × 환산계수라인 명세 · 자재별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 에서 하고, 서버 쪽 계산은 필요한 회계연도와 플랜트만 읽도록 필터를 필수로 둡니다. 라인 명세는 페이징으로 나누어 받고 총건수는 별도로 받습니다.

대체 항목 정의가 바뀌면 어떻게 합니까?

자재명세서의 대체 정의는 유효기간이 있어 과거 월은 그때의 정의로 계산합니다. 매핑 테이블에도 유효 시작·종료일을 두어 중간에 바뀌어도 과거 숫자가 흔들리지 않게 합니다.

장부 소비금액이 재계산과 다를 때 어디부터 봅니까?

먼저 자재 문서의 수량·단가가 평가 시점의 표준단가와 같은지 확인합니다. 단가 변경 전후 문서가 섞이거나 환산계수가 달리 적용되면 한 줄씩 어긋납니다. 라인 상세에서 환산 과정을 열어 차이가 어느 단계인지 봅니다.

이 화면의 판정을 감사 대응에 그대로 써도 됩니까?

점검 도구이므로 판단 근거를 정리하는 용도입니다. 점검 필요는 확인이 필요하다는 표시일 뿐 오류의 확정이 아니며, 최종 판단은 회사와 감사인이 합니다.