제조원가

유휴·가동 손실 원가 점검 — 제조원가, 작업장이 서 있던 시간을 원가로 바꿔 허용 기준과 견주는 월마감 화면

작업장별 손실시간 · 유휴 손실원가 · 허용 손실률 · 정지 이벤트와 원인 · 월별 추이 · 아홉 가지 대사식 — 소개 영상과 실제 화면 6종, 그리고 CDS 코드까지

소개 영상1분 18초8개 장면음성 안내 · 자막소개 → 처음 연 화면 → 작업장별 점검 → 손실 이벤트 → 원인별 집계 → 월별 추이 → 대사 결과 → 정리

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

제조 원가를 월마감에서 점검하는 사람은 매달 같은 질문을 받습니다. 설비가 서 있던 시간이 얼마나 되나, 그 시간이 원가로는 얼마인가, 허용할 만한 수준을 넘었나. 지금은 이 세 답이 작업장 마스터 · 오더 확정 실적 · 코스트센터 보고서 · 현장의 정지 기록으로 나뉘어 있어, 숫자가 어긋나면 어디서 갈렸는지부터 찾아야 합니다.

이 화면은 작업장의 가용시간을 가동시간과 손실시간으로 나누고, 손실시간에 활동단가를 곱해 유휴 손실원가를 만든 뒤 작업장별 허용 손실률과 견줍니다. 손실시간은 다시 준비·교체, 설비 고장, 자재·인력 대기, 원인 미분류로 나눠, 손실이 어디에 몰렸는지까지 한 화면에서 봅니다. 월마감 전에 점검하는 자리이며, 관련 기준서가 따로 정해진 영역이 아니므로 대상 영역은 제조원가(유휴·가동 손실 원가)로 적습니다.

한 줄 요약 — 원가를 집계하고 전기하는 일은 SAP 표준이 맡고, 이 화면은 그 숫자를 시간에서 다시 계산해 맞춰 보고 이상한 작업장과 달만 골라 보여 줍니다. 가용시간 = 가동시간 + 손실시간인지, 활동 원가풀 = 제품 배부 원가 + 유휴 손실원가인지 같은 대사식 아홉 개를 매번 전수로 검산합니다.

서 있던 시간은 원가로 바꿔야 크기가 보인다

정지 시간은 시간 단위로 보면 작아 보여도 활동단가가 곱해지면 얘기가 달라집니다. 이 자료의 6개월 합계는 손실시간 743시간(가용시간 11,712시간의 6.34%)이고, 이를 활동단가로 바꾼 유휴 손실원가는 4,147만 원입니다. 같은 시간이라도 단가가 높은 프레스 라인이나 도장 설비의 정지가 CNC 선반의 정지보다 훨씬 비쌉니다. 시간만 보는 가동률 보고서로는 이 차이가 보이지 않습니다.

허용 기준은 작업장마다 다르다

준비·교체가 많은 설비와 연속으로 도는 설비를 같은 기준으로 재면 안 됩니다. 이 화면은 작업장별 허용 손실률(이 자료에서는 5~9%)을 기준 값으로 두고, 손실률이 허용 기준보다 3%p 넘게 크면 점검 필요(L1)로 올립니다. 6개월 합계의 허용 손실원가는 4,623만 원이어서 허용 초과 원가는 -476만 원, 곧 전체로는 허용 범위 안입니다. 그런데도 작업장·월 단위로 내려가면 9건이 기준에 걸립니다. 합계로는 보이지 않던 것이 행 단위에서 드러나는 것이 이 화면의 쓸모입니다.

활동단가가 비어 있으면 손실이 0원으로 보인다

손실시간이 있는데 활동단가가 0이면 유휴 손실원가도 0으로 집계됩니다. 정지가 없었던 것처럼 보이지만 실제로는 단가 설정이 빠진 것입니다. 이 화면은 손실시간이 있는데 활동단가가 없는 작업장(L2)을 따로 올립니다. 이 자료에서는 3월 조립 라인이 여기에 걸립니다.

고장과 미분류가 몰리면 원인 분석부터 막힌다

설비 고장이 손실시간의 절반을 넘는 작업장(L3)은 정비 계획을, 원인 미분류가 30%를 넘는 작업장(L4)은 정지 사유 입력 상태를 먼저 봐야 합니다. 월 단위로도 원인 미분류 원가 비중 12% 초과(C1), 설비 고장 원가 비중 40% 초과(C2)를 올립니다. 어느 쪽이든 원인을 단정하지 않고 확인할 일만 적어 줍니다.

사용 방법

  1. 조회조건을 입력합니다. 회계연도는 필수이고, 전기 월 범위 · 작업장 · 손실 원인 · 점검 결과는 선택입니다. ‘전체’를 고르면 그 조건은 걸리지 않습니다.
  2. 조회 버튼(조회조건 오른쪽 끝) 또는 회계연도 입력 칸에서 Enter 키를 누릅니다. 처음 열면 자동으로 한 번 조회합니다.
  3. 요약 지표에서 유휴 손실원가 · 허용 손실원가 · 허용 초과 원가 · 손실률과 점검 필요 작업장 · 원인 건수, 대사 차이 건수를 먼저 봅니다.
  4. 탭을 작업장별 점검 → 손실 이벤트 → 원인별 집계 → 월별 추이 → 대사 결과 순서로 옮겨 가며 확인합니다.
  5. 행을 누르면 상세 창이 열려 시간 구성 · 원가 · 점검 내용 · 정지 이벤트 명세가 나옵니다.
  6. CSV 내려받기 버튼으로 현재 탭의 조회 결과를 UTF-8 CSV로 받아 엑셀로 이어 갑니다.

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

점검 도구에서 가장 비싼 질문은 “이 숫자 맞아?”입니다. 그래서 화면을 만들기 전에 대사식 아홉 개를 먼저 세우고 자료 전수에 돌렸습니다.

대사대사식검사 건수차이 건수최대 차이
R01가용시간 = 가동시간 + 손실시간3600
R02손실시간 = 준비 + 고장 + 대기 + 기타3600
R03활동 원가풀 = 제품 배부 원가 + 유휴 손실원가3600
R04유휴 손실원가 = 손실시간 × 활동단가3600
R05작업장 손실시간 = 이벤트 시간 합계3600
R06월 손실원가 = 원인별 손실원가 합계600
R07월 손실원가 합계 = 작업장 손실원가 합계100
R08원인별 비중 합계 = 100%600
R09허용 초과 원가 = 손실원가 − 허용 손실원가3600

아홉 대사식 모두 차이 건수 0건입니다(검사 229건). 이와 별도로 판정 기준에 걸리는 건을 일부러 넣었습니다. 점검 필요 작업장 9건(손실률 초과 3건 · 활동단가 없음 1건 · 설비 고장 편중 3건 · 원인 미분류 편중 2건)과 점검 필요 원인 2건(미분류 비중 · 고장 비중)이며, 이 건들은 대사 차이가 아니라 점검 대상이라 차이 건수에 넣지 않았습니다.

무엇으로 만들었나

자리무엇왜 그렇게 두었나
화면OpenUI5 표준 컨트롤 — 조회조건 · 요약 지표 · 탭 다섯 개 · 상세 창사내 Fiori 화면과 같은 결로 보이고, 외부 차트 라이브러리를 들이지 않아도 됩니다.
데이터 연동OData V2 서비스를 화면 선언 파일에 상대 경로로 걸고, 이름 없는 기본 모델로 읽습니다운영 전환 때 서비스 주소만 바꾸면 되도록 화면 코드에는 주소를 적지 않았습니다.
조회조건입력값을 필터 객체로 만들어 $filter 로 보냅니다. ‘전체’는 필터를 만들지 않습니다전체를 뜻하는 코드값을 서버에 보내지 않아야 실제 서비스에서도 같은 동작이 나옵니다.
집계 · 판정손실시간 · 원가 · 손실률 · 점검 판정은 서비스 쪽에서 계산하고 화면은 받은 값을 보여 줍니다판정 로직이 화면에 있으면 CSV와 화면의 숫자가 갈라지기 쉽습니다. 계산 자리를 한 곳으로 두었습니다.
오류 처리서비스에 닿지 못하거나 요청이 실패하면 ‘서비스 연결 안내’ 창을 띄웁니다빈 표를 “데이터 없음”으로 오해하지 않게 합니다.
테마sap_horizon현행 Fiori 3 후속 테마와 같은 색 · 글꼴입니다.
앱 정보내용
업무 영역관리회계(CO) — 제조원가 · 유휴·가동 손실 원가
관련 기준서- (대상 영역: 제조원가)
SAP 표준 T-codeCR03 · CO03 · KSB1 · S_ALR_87013611
화면 성격조회 · 점검 (데이터를 바꾸는 기능 없음)
데이터 연동OData V2
SAP 표준 기능을 그대로 이어받은 부분 — 작업장과 코스트센터의 연결은 표준 작업장 마스터(CR03에서 보는 값)를 따르고, 가동시간은 표준 생산오더 확정 실적을 따릅니다. 원가 집계와 전기는 표준이 맡고, 이 화면은 같은 구조의 데이터를 읽어 결과를 점검하는 관점을 더해 확장합니다.

실행 화면

아래 화면은 가상의 작업장 6곳(CNC 선반 2 · 머시닝센터 · 프레스 · 조립 · 도장)과 가상의 단가로 만든 검증용 샘플 데이터(2026년 1~6월)를 실제로 조회한 모습입니다. 작업장·월 36행, 정지 이벤트 282건이며, 실제 고객사 값이 아닙니다.

처음 열었을 때

열면 자동으로 한 번 조회해, 조회조건 아래에 요약 지표 일곱 개와 작업장별 점검 표가 한꺼번에 나옵니다.

처음 열었을 때
처음 열었을 때 — 조회조건 · 요약 지표 · 작업장별 점검 표가 한 화면에 보입니다.

맨 위 조회조건은 회계연도 · 전기 월 시작/종료 · 작업장 · 손실 원인 · 점검 결과 여섯 칸이고 기본값은 2026년 전체입니다. 요약 지표는 유휴 손실원가 합계 41.5 · 허용 손실원가 46.2 · 허용 초과 원가 -4.8(이상 백만 원) · 손실률 6.34% · 점검 필요 작업장 9 · 점검 필요 원인 2 · 정합성 대사 차이 건수 0 순서입니다. 허용 초과 원가가 음수라는 것은 6개월 합계로는 허용 범위 안이라는 뜻입니다. 표는 작업장 · 월마다 가용시간 · 가동시간 · 준비·교체 · 설비 고장 · 자재·인력 대기 · 원인 미분류 · 손실시간 · 손실률 · 허용 손실률을 한 줄에 보여 줍니다. 탭 이름 위의 숫자는 조회된 건수입니다.

손실 이벤트

두 번째 탭은 작업장이 선 기록을 한 건씩 보여 줍니다. 손실시간이 어떤 정지들로 이뤄졌는지 확인하는 자리입니다.

손실 이벤트
손실 이벤트 — 정지 날짜 · 원인 · 시간과 유휴 손실원가를 이벤트 한 건씩 봅니다.

이벤트는 6개월 동안 282건입니다. 건마다 정지 날짜 · 작업장 · 원인 · 정지 시간 · 손실원가가 있고, 손실원가는 정지 시간에 그 작업장의 활동단가를 곱한 값입니다. 작업장별 점검 표의 손실시간은 이 이벤트 시간의 합과 같아야 하며, 이는 대사식 R05로 검산됩니다. 손실 원인과 작업장 조건을 걸면 “3월 프레스 라인의 고장 정지만”처럼 좁혀 볼 수 있습니다.

원인별 집계

세 번째 탭은 월마다 손실을 원인별로 나눕니다. 어느 달에 어떤 원인이 몰렸는지 한눈에 보입니다.

원인별 집계
원인별 집계 — 준비·교체 · 설비 고장 · 자재·인력 대기 · 원인 미분류의 월별 비중을 봅니다.

원인은 준비·교체 · 설비 고장 · 자재·인력 대기 · 원인 미분류 네 가지이고, 월 4행씩 24행입니다. 6개월 합계로는 설비 고장이 249시간, 준비·교체가 248시간, 자재·인력 대기가 175시간, 원인 미분류가 71시간이어서 합계 743시간입니다. 이 가운데 3월의 원인 미분류 원가 비중은 14.49%로 12%를 넘어 C1 점검 필요이고, 5월의 설비 고장 원가 비중은 42.62%로 40%를 넘어 C2 점검 필요입니다. 비중 합계는 매월 100%여야 하며 R08로 검산됩니다.

월별 추이

네 번째 탭은 6개월을 한 줄씩 놓고 손실이 어느 달에 커졌는지 봅니다.

월별 추이
월별 추이 — 월 단위 손실률 · 손실원가 · 허용 초과 원가를 봅니다.

월 손실률은 1월 7.03%, 2월 5.82%, 3월 6.05%, 4월 6.51%, 5월 5.89%, 6월 6.70%입니다. 6개월 중 허용 초과 원가가 양수인 달은 4월 하나이고(+10.4만 원), 나머지 달은 허용 기준보다 손실원가가 작아 음수입니다. 달이 정상이어도 안에는 점검 필요 작업장이 있을 수 있어, 월 행의 점검 필요 건수를 함께 봅니다. 월 행을 누르면 그 달의 이벤트 명세가 열립니다.

대사 결과

마지막 탭은 숫자를 믿어도 되는지 확인하는 자리입니다.

대사 결과
대사 결과 — 아홉 가지 정합성 식의 검사 건수 · 차이 건수 · 최대 차이를 봅니다.

아홉 대사식마다 검사 건수 · 좌변 · 우변 · 차이 건수 · 최대 차이가 나옵니다. 검사는 모두 229건이고 차이는 0건입니다. 차이 건수 칸은 0이면 정상색, 0이 아니면 경고색으로 바뀌어 그 숫자는 원천을 확인하라는 신호가 됩니다.

행 클릭 상세

표의 행을 누르면 그 작업장·월의 시간 구성과 원가, 점검 내용, 정지 이벤트 명세가 한 창에 열립니다.

행 클릭 상세
행 클릭 상세 — 작업장 · 월 행을 누르면 시간 구성과 이벤트 명세가 한 창에 열립니다.

상세 창은 위에서부터 가용시간 → 가동시간 → 손실시간(원인별), 활동단가, 유휴 손실원가와 허용 손실원가, 손실률과 허용 손실률, 점검 내용, 그리고 그 달의 정지 이벤트 명세 순서입니다. 점검 필요 행은 어떤 조건(L1~L4)에 걸렸는지와 확인할 일이 함께 적힙니다. 원인 행이나 이벤트 행을 눌러도 같은 모양의 창이 열립니다.

화면 뒤에서 일어나는 일

조회 버튼을 누르면 화면은 조회조건을 필터로 바꿔 서비스에 요청하고, 받은 결과를 탭마다 다른 표에 바인딩합니다. 작업장 탭 · 이벤트 탭 · 원인 탭 · 월 탭 · 대사 탭이 각자 자기 데이터 묶음을 읽고, 행을 누르면 상세 창이 그 작업장·월의 이벤트 묶음을 따로 불러옵니다. 계산은 모두 서비스가 하고 화면은 값을 읽어 보여 주기만 합니다.

처리 단계하는 일산출식 또는 기준
① 시간 나누기가용시간을 가동시간과 손실시간으로 나눕니다가용시간 = 가동시간 + 손실시간
② 원인 나누기손실시간을 원인 네 가지로 나눕니다손실시간 = 준비 + 고장 + 대기 + 기타(미분류)
③ 원가 만들기시간에 활동단가를 곱합니다유휴 손실원가 = 손실시간 × 활동단가, 활동 원가풀 = 가용시간 × 활동단가
④ 허용 기준과 견주기허용 손실률로 허용 손실원가를 만들어 초과분을 봅니다허용 초과 원가 = 손실원가 − 허용 손실원가, 손실률 = 손실시간 ÷ 가용시간 × 100
⑤ 집계 검산이벤트 · 원인 · 월 · 작업장 합계가 서로 맞는지 봅니다R05 ~ R08
⑥ 판정아래 표의 조건으로 점검 필요를 가립니다작업장 L1~L4, 원인 C1 · C2
대상판정 조건결과 상태사용자 조치
작업장손실률 > 허용 손실률 + 3%p점검 필요 (L1)작업장 손실 이벤트 명세를 열어 정지 시간이 집중된 날짜·원인을 확인
작업장손실시간 > 0 이고 활동단가 = 0점검 필요 (L2)활동유형 단가 설정과 유효기간 확인 — 단가가 없으면 손실원가가 0 으로 집계됨
작업장설비 고장 시간 ÷ 손실시간 > 50%점검 필요 (L3)정비 계획·고장 이력 확인
작업장원인 미분류 시간 ÷ 손실시간 > 30%점검 필요 (L4)정지 사유 입력 누락 여부 확인
원인월 원인 미분류 원가 비중 > 12%점검 필요 (C1)원인 분류 입력 상태 확인
원인월 설비 고장 원가 비중 > 40%점검 필요 (C2)정비 계획과 설비 상태 확인
작업장 · 원인위 조건에 해당 없음정상—

화면의 요약 지표 손실률은 가용시간 가중(손실시간 합계 ÷ 가용시간 합계)이고, 월별 손실률의 단순 평균은 별도 조회용 함수가 돌려줍니다. 두 값은 용도가 다르므로 화면에서는 가중 값만 지표로 씁니다.

SAP 표준 기능 확장 포인트

원가를 집계하고 전기하는 일은 SAP 표준 T-code가 담당하고, 이 화면은 그 결과를 조회 · 검증하는 관점을 더해 확장합니다. 표준 화면을 없애는 것이 아니라, 표준 화면 사이를 오가며 하던 대조를 한 화면으로 모읍니다.

표준으로 되는 것과 안 되는 것

하고 싶은 일표준 화면으로 되는 범위이 앱이 더하는 관점
작업장의 용량과 코스트센터 · 활동유형 연결 확인CR03에서 작업장 마스터를 열어 봅니다. 마스터 조회가 본업입니다연결된 값으로 활동단가가 비어 있는 작업장을 찾아 점검 필요로 올립니다
정지가 걸린 오더의 공정 확인CO03에서 생산오더의 공정과 확정 내역을 봅니다정지 이벤트 명세에서 오더로 내려갈 단서를 둡니다. 오더를 바꾸지 않습니다
활동 원가풀을 이루는 전표 확인KSB1에서 코스트센터 개별 항목을 봅니다작업장 · 월 단위로 모은 원가풀과 손실원가를 한 줄에 둡니다
코스트센터 실적 · 계획 · 차이 보고S_ALR_87013611에서 코스트센터 단위로 봅니다보고서 총액과 화면 합계가 맞는지 대사식으로 확인합니다
작업장 시간을 원가로 바꿔 허용 기준과 견주기없음 — 시간 구성과 원가와 허용 기준을 한 표에 두는 표준 보고서가 없어 보통 엑셀로 만듭니다손실시간 · 유휴 손실원가 · 손실률 · 허용 초과 원가를 나란히 둡니다
정지 원인별 비중 파악없음 — 정지 사유를 월마다 원가 비중으로 보여 주는 전용 화면이 없습니다원인별 시간 · 원가 · 비중과 편중 여부를 월별로 보여 줍니다

T-code 별 연계 지점

T-code이름연계
CR03작업장 표시이어받는 것 작업장의 용량 · 코스트센터 · 활동유형 할당. 대사 지점 화면의 작업장과 코스트센터가 마스터와 같은지. 오가는 법 L2(활동단가 없음)가 걸린 작업장은 CR03에서 활동유형 할당과 유효기간을 확인합니다. 표준에 남길 일 작업장 마스터 유지.
CO03생산오더 표시이어받는 것 오더의 공정 · 확정 내역. 대사 지점 가동시간으로 쓴 확정 시간 합계. 오가는 법 정지가 몰린 날의 이벤트에서 오더로 내려가 어느 공정이 멈췄는지 봅니다. 표준에 남길 일 오더 변경과 확정 정정.
KSB1코스트센터 개별 항목이어받는 것 활동 원가풀을 이루는 전표 라인. 대사 지점 작업장 원가풀 합계와 연결된 코스트센터 개별 항목 합계. 오가는 법 월 원가풀이 전월보다 크게 변한 작업장은 KSB1에서 해당 코스트센터의 전표를 열어 증가 항목을 찾습니다. 표준에 남길 일 전표 상세 조회와 증빙 확인.
S_ALR_87013611코스트센터: 실적/계획/차이이어받는 것 코스트센터별 실적 비용. 대사 지점 작업장에 속한 코스트센터의 실적과 원가풀. 오가는 법 비용이 계획과 얼마나 벌어졌는지는 이 보고서에서 보고, 그 비용 가운데 서 있던 시간의 몫은 이 화면에서 봅니다. 표준에 남길 일 계획 대비 차이 보고와 감사 대응.
기존 보고서를 없애야 하나요? 아닙니다. 표준 보고서는 그대로 두고, 월마감 전에 이 화면으로 손실 상태를 점검한 뒤 문제가 있는 작업장만 표준 화면으로 내려가 원인을 찾는 순서를 권합니다. 점검 화면은 표준 화면의 숫자를 바꾸지 않습니다.

S/4HANA 분석 스택과의 자리

S/4HANA에서는 CDS 뷰 위에 분석 쿼리를 만들고, Fiori 분석 앱이나 Analysis for Office로 읽는 구성이 일반적입니다. 이 앱은 그 구성과 경쟁하지 않고 같은 CDS 뷰를 OData 서비스로 노출하는 자리에 놓입니다. 분석 쿼리는 임의로 축을 바꿔 보는 데 좋고, 이 화면은 정해진 판정 기준으로 이상한 작업장 · 원인만 골라 보여 주는 데 맞춰 둔 것입니다. 같은 시간 · 원가 뷰를 공유하므로 두 화면의 숫자는 갈라지지 않습니다.

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

자리고객사가 정하는 것손대는 방법
활동단가 기준작업장별 활동유형과 단가, 유효기간기준 테이블 한 곳에 행을 추가합니다. 화면 코드는 바꾸지 않습니다
허용 손실률준비가 많은 설비 · 연속 설비 등 특성별 허용 손실률기준 테이블 값을 바꿉니다. 코드에 박지 않았습니다
정지 기록 원천정지 시간과 사유를 어느 시스템에서 받을지이벤트 뷰의 원천만 바꿉니다. 위쪽 뷰는 원천을 모릅니다 (원천 후보는 아래 표, 확인 필요)
원인 분류 체계준비 · 고장 · 대기 · 미분류 외에 회사가 쓰는 원인 코드원인 매핑 한 곳에서 네 묶음으로 접습니다
가용시간 정의교대 · 휴일 · 계획 정비를 가용시간에서 뺄지가용시간 산출 뷰의 한 자리에서 정합니다
판정 기준 값손실률 초과 3%p, 고장 50%, 미분류 30%, 월 미분류 12%, 월 고장 40%기준표 값을 바꿉니다
권한누가 어느 플랜트 · 작업장을 볼 수 있는지CDS 접근 제어(DCL)에서 표준 권한 객체로 겁니다
데이터원천 테이블 (예시, 확인 필요)비고
작업장 헤더 · 이름 · 코스트센터 할당CRHD · CRTX · CRCO
작업장 가용 용량KAKO · KAPA가용시간 산정 방식은 고객사 확인
가동시간(오더 확정)AFRU · AUFK확정 방식에 따라 다름
활동유형 마스터CSLA활동단가 테이블은 확인 필요
정지 시간 · 사유회사 정지 기록원천 확인 필요

분석 지표 정의표

이 화면은 회계 기준서의 요구사항을 점검하는 도구가 아니라 제조원가 지표를 점검하는 도구이므로, 요구사항 매핑표 대신 지표 정의표를 둡니다.

기준서 · 대상 영역지표대응 기능원천 데이터비고
- · 제조원가손실률작업장별 점검 탭손실시간 ÷ 가용시간 × 100허용 손실률보다 3%p 초과 시 점검 필요
- · 제조원가유휴 손실원가작업장별 점검 탭손실시간 × 활동단가단가가 없으면 0 → L2
- · 제조원가허용 초과 원가작업장별 점검 · 월별 추이 탭손실원가 − 허용 손실원가음수는 허용 범위 안
- · 제조원가가동률작업장별 점검 탭가동시간 ÷ 가용시간 × 100
- · 제조원가원인별 비중원인별 집계 탭원인 손실원가 ÷ 월 손실원가 × 100월 합계 100%

CDS 구성

아래는 이 화면이 읽는 값을 S/4HANA의 CDS 뷰로 세울 때의 구성 예시입니다. 객체 이름과 필드는 이 글에서 새로 지은 것이고, 표준 테이블(CRHD · CRCO · AFRU)과 표준 필드 이름만 실재하는 것을 썼습니다. 정지 기록의 원천은 회사마다 달라 확인 필요입니다.

뷰 레이어 구성

레이어뷰하는 일왜 나누나
기준활동단가 기준 테이블작업장별 활동단가 · 유효시작일 · 허용 손실률을 들고 있습니다단가와 허용 기준을 코드가 아니라 데이터로 고칩니다
기초작업장 차원 뷰 · 정지 이벤트 뷰작업장 마스터를 한 번만 조인하고, 정지 기록을 한 줄 단위로 모읍니다원천이 달라도 한 모양으로 맞춰 위쪽 뷰가 원천을 모르게 합니다
큐브작업장 · 월 큐브가용 · 가동 · 손실시간과 원가, 허용 손실원가를 계산합니다계산을 한 곳에 두어 화면 · CSV · 분석 쿼리가 같은 숫자를 씁니다
소비손실 점검 쿼리판정 코드와 UI 주석을 붙여 서비스로 내보냅니다화면 전용 필드를 큐브에서 떼어 둡니다
권한접근 제어(DCL)플랜트 · 작업장 권한을 겁니다집계 단계에서 걸어야 합계로 새지 않습니다
서비스서비스 정의 · 바인딩OData V2로 게시합니다화면이 부르는 주소가 서비스 한 곳으로 모입니다

① 활동단가 기준 테이블 — 작업장별 활동단가와 허용 손실률

활동단가와 허용 손실률은 작업장마다, 기간마다 다르므로 코드가 아니라 기준 테이블에 둡니다. 이 테이블이 비어 있으면 손실원가가 0 으로 집계되므로 점검 코드 L2 가 가장 먼저 걸리는 자리입니다.

" ───────────────────────────────────────────────
" 활동단가 기준 — 작업장 · 유효시작일 단위
" 단가를 코드에 두지 않고 기간별로 관리하기 위해 나눈다
" ───────────────────────────────────────────────
@EndUserText.label : '유휴 손실 활동단가 기준'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zidle_rate {
  key client     : abap.clnt not null;
  key werks      : werks_d not null;
  key arbpl      : arbpl not null;
  key valid_from : datum not null;
  act_rate       : abap.curr(11,0);
  waers          : waers;
  allow_pct      : abap.dec(5,2);   " 허용 손실률(%)
}

② 차원 뷰 — 작업장

작업장 이름과 코스트센터 연결은 작업장 마스터에서 읽습니다. 집계 뷰가 마스터를 직접 조인하지 않도록 차원 뷰로 분리하면 작업장 이름이나 코스트센터가 바뀌어도 한 곳만 고치면 됩니다.

" ───────────────────────────────────────────────
" ZI_IdleWorkCenter — 작업장 차원
" 작업장 마스터(CRHD)와 코스트센터 할당(CRCO)을 한 번만 조인한다
" ───────────────────────────────────────────────
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '유휴 손실 — 작업장 차원'
@ObjectModel.representativeKey : 'WorkCenter'
define view entity ZI_IdleWorkCenter
  as select from crhd as wc
  inner join crco as co on co.objty = wc.objty and co.objid = wc.objid
{
  key wc.werks as Plant,
  key wc.arbpl as WorkCenter,
      wc.verwe as Category,
      co.kostl as CostCenter,
      co.lstar as ActivityType
}

③ 정지 이벤트 뷰 — 정지 기록을 한 줄 단위로

정지 시간과 사유는 표준 테이블 하나로 모이지 않습니다. 설비 가동 시스템이나 정비 통보에서 오는 정지 기록을 이 뷰 한 곳에서 받도록 하고, 원천 이름은 회사가 정합니다(확인 필요). 이후 뷰는 이 뷰의 칸 이름만 바라봅니다.

" ───────────────────────────────────────────────
" ZI_IdleStopEvent — 정지 이벤트
" 원천: 회사의 정지 기록(원천 테이블 이름 확인 필요)
" ───────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '유휴 손실 — 정지 이벤트'
define view entity ZI_IdleStopEvent
  as select from zidle_stoplog          " 회사 정지 기록 (확인 필요)
{
  key event_no                          as EventNo,
      werks                             as Plant,
      arbpl                             as WorkCenter,
      event_date                        as EventDate,
      reason_code                       as ReasonCode,      " R1 준비·교체 / R2 고장 / R3 대기 / R4 미분류
      aufnr                             as OrderNo,
      @Semantics.quantity.unitOfMeasure : 'HourUnit'
      stop_hours                        as StopHours,
      cast('H' as meins)                as HourUnit
}

④ 큐브 뷰 — 작업장 · 월 단위 시간 구성과 원가

시간 구성과 원가는 이 큐브에서 한 번 계산합니다. 손실원가는 손실시간에 활동단가를 곱하고, 활동 원가풀은 가용시간에 단가를 곱해 제품 배부 원가와 손실원가의 합과 맞춥니다. 대사식 R03·R04 가 이 큐브의 식을 그대로 검사합니다.

" ───────────────────────────────────────────────
" ZI_IdleLossCube — 작업장 · 월 큐브
" 이 뷰에서만 시간 → 원가 계산을 한다 (식을 한 곳에 모으기 위해)
" ───────────────────────────────────────────────
@Analytics.dataCategory : #CUBE
@EndUserText.label : '유휴 손실 큐브'
define view entity ZI_IdleLossCube
  as select from ZI_IdleStopEvent as ev
  association [1] to ZI_IdleWorkCenter as _WorkCenter
    on _WorkCenter.Plant = ev.Plant and _WorkCenter.WorkCenter = ev.WorkCenter
  association [0..1] to zidle_rate as _Rate
    on _Rate.werks = ev.Plant and _Rate.arbpl = ev.WorkCenter
{
  key ev.Plant, key ev.WorkCenter,
  key substring(ev.EventDate, 1, 6)                                       as PostingMonth,
      @Aggregation.default : #SUM
      sum(ev.StopHours)                                                   as LossHours,
      @Aggregation.default : #SUM
      sum(case when ev.ReasonCode = 'R2' then ev.StopHours else 0 end)    as BreakHours,
      @Semantics.amount.currencyCode : 'Currency'
      cast(sum(ev.StopHours * _Rate.act_rate) as abap.curr(15,0))         as LossCost,
      _Rate.waers                                                         as Currency,
      _WorkCenter
} group by ev.Plant, ev.WorkCenter, substring(ev.EventDate, 1, 6), _Rate.waers

⑤ 쿼리 뷰 — 화면이 바라보는 점검 쿼리

화면의 조회조건과 점검 판정은 이 쿼리에서 정합니다. 손실률이 허용 기준을 넘는지의 판정을 여기서 계산해 두면 서비스와 화면이 같은 기준을 읽습니다.

" ───────────────────────────────────────────────
" ZC_IdleLossQuery — 점검 쿼리
" ───────────────────────────────────────────────
@Analytics.query : true
@EndUserText.label : '유휴·가동 손실 원가 점검'
@UI.headerInfo : { typeName : '작업장', typeNamePlural : '작업장' }
define view entity ZC_IdleLossQuery
  as select from ZI_IdleLossCube
{
  @Consumption.filter : { selectionType : #SINGLE, mandatory : true }
  key Plant,
  @UI.lineItem : [{ position : 10 }]
  key WorkCenter,
  @Consumption.filter : { selectionType : #INTERVAL }
  key PostingMonth,
  @UI.lineItem : [{ position : 20, criticality : 'CheckCrit' }]
  LossHours,
  @UI.lineItem : [{ position : 30 }]
  LossCost,
  @AnalyticsDetails.query.axis : #COLUMNS
  BreakHours
}

⑥ 권한 — 플랜트 단위 접근 제어

손실원가는 설비 가동 현황과 원가 단가가 함께 드러나므로 플랜트 단위로 접근을 나눕니다. 권한 오브젝트와 값은 회사의 권한 설계에 맞춰 정합니다.

" ───────────────────────────────────────────────
" 플랜트 단위 접근 제어
" ───────────────────────────────────────────────
@EndUserText.label : '유휴 손실 — 플랜트 권한'
@MappingRole : true
define role ZC_IDLELOSSQUERY {
  grant select on ZC_IdleLossQuery
    where ( Plant ) = aspect pfcg_auth( C_ANLA_WRK, WERKS, ACTVT = '03' );
}

⑦ 서비스 정의와 바인딩

화면은 서비스 정의에 올린 쿼리만 바라봅니다. 운영에서는 이 서비스를 게시하고 manifest 의 서비스 주소만 교체합니다. 서비스 활성화는 서비스 바인딩에서 게시합니다.

" ───────────────────────────────────────────────
" 서비스 정의 — 점검 쿼리와 정지 이벤트 노출
" ───────────────────────────────────────────────
@EndUserText.label : '유휴·가동 손실 원가 점검 서비스'
define service ZUI_IdleLoss {
  expose ZC_IdleLossQuery as LossSet;
  expose ZI_IdleStopEvent as EventSet;
  expose ZI_IdleWorkCenter as WorkCenterSet;
}

운영 시점에 해야 할 일

아래 아홉 가지는 코딩이 아니라 합의입니다. 합의가 끝나기 전에는 화면이 올라가도 숫자가 믿을 만해지지 않습니다.

할 일무엇을 정하나정하지 않으면누가
활동단가 기준작업장별 활동유형과 단가, 유효기간손실원가가 0 으로 집계되어 점검 코드 L2 가 대량으로 걸림원가회계 담당
허용 손실률작업장 특성별 허용 손실률(준비 많은 설비, 연속 설비 구분)모든 작업장이 같은 기준으로 판정되어 점검 필요 건수가 왜곡됨생산·원가 공동
정지 기록 원천정지 시간·사유를 어느 시스템에서 받을지, 기록 단위정지 시간이 확정되지 않아 손실률 자체가 흔들림IT·생산
원인 분류 체계준비·고장·대기·미분류 외에 회사가 쓰는 원인 코드 매핑미분류 비중이 높아져 원인 분석이 어려움생산관리
가용시간 정의교대·휴일·계획 정비를 가용시간에서 뺄지가동률과 손실률의 분모가 달라 월별 비교가 안 됨원가·생산 공동
권한 설계플랜트·작업장 단위 조회 권한타 플랜트 설비의 단가와 가동 현황이 보임보안 담당
대사 체계표준 코스트센터 보고서와 맞출 항목·주기월마감에서 두 화면 숫자가 다를 때 설명할 근거가 없음원가회계 담당
전송 순서기준 테이블 → 차원 → 이벤트 → 큐브 → 쿼리 → 권한 → 서비스의존 객체가 없어 활성화가 실패함IT
서비스 게시서비스 바인딩 게시와 manifest 서비스 주소 교체화면이 개발용 서비스를 계속 바라봄IT

자주 묻는 질문

도입 상담과 데모에서 자주 받는 질문을 네 묶음으로 정리했습니다.

숫자와 산식

이 화면은 무엇을 점검하나요?

작업장이 가동하지 못한 시간을 원가로 바꾸어, 허용 기준과 견줘 보는 화면입니다. 손실률이 허용 기준을 넘는 작업장, 손실시간은 있는데 활동단가가 없는 작업장, 고장이나 미분류에 몰린 작업장을 점검 필요로 표시합니다. 원인을 단정하지는 않습니다.

유휴 손실원가는 어떻게 계산하나요?

작업장의 손실시간에 활동단가를 곱합니다. 활동 원가풀은 가용시간에 활동단가를 곱한 값이고, 제품 배부 원가와 유휴 손실원가의 합과 같아야 합니다. 이 관계가 대사식 R03 이며 화면의 대사 결과 탭에서 확인합니다.

허용 손실률은 어디서 오나요?

작업장별 기준 값입니다. 화면은 이 값을 칸으로 보여 주고, 손실률이 이 값보다 3%p 넘게 크면 점검 필요로 표시합니다. 값 자체는 회사가 생산 특성에 맞춰 정해야 하며 이 화면이 대신 정해 주지 않습니다.

가용시간과 가동시간은 어떻게 다른가요?

가용시간은 작업장이 돌 수 있도록 잡아 둔 전체 시간이고, 가동시간은 실제로 일한 시간입니다. 가용시간에서 가동시간을 뺀 것이 손실시간이며, 손실시간은 준비·교체, 설비 고장, 자재·인력 대기, 원인 미분류로 나뉩니다.

허용 초과 원가가 마이너스로 나오면 문제인가요?

허용 손실원가보다 실제 손실원가가 작다는 뜻이므로 문제가 아닙니다. 양수일 때만 허용 범위를 넘은 만큼의 원가로 읽습니다. 합계는 작업장별 양수와 음수가 서로 상쇄되므로, 판단은 작업장별 행에서 하는 것이 좋습니다.

샘플 화면의 숫자는 실제 회사 값인가요?

아닙니다. 가상의 작업장과 가상의 단가로 만든 검증용 샘플 데이터이며 실제 고객사의 값이 아닙니다. 산식이 의도대로 맞는지 보여 주기 위한 용도입니다.

화면과 조작

조회 조건은 무엇이 있나요?

회계연도(필수), 전기 월 시작·종료, 작업장, 손실 원인, 점검 결과입니다. 선택 항목을 전체로 두면 해당 조건을 서비스에 보내지 않고 모든 값을 조회합니다. 조회 버튼은 조회 조건 오른쪽 끝에 있고, 입력 칸에서 Enter 키를 눌러도 조회됩니다.

행을 누르면 무엇이 열리나요?

작업장 행이나 이벤트 행을 누르면 그 작업장·월의 시간 구성, 원가, 점검 내용과 정지 이벤트 명세가 한 창에 열립니다. 원인 행을 누르면 그 월·원인의 이벤트가, 월 행을 누르면 그 월의 이벤트가 열립니다.

CSV 로 내려받을 수 있나요?

네. 현재 열려 있는 탭의 조회 결과를 UTF-8 CSV 로 내려받습니다. 엑셀에서 한글이 깨지지 않도록 처리되어 있고, 파일 이름은 기능명과 탭 이름으로 붙습니다.

서비스에 연결되지 않으면 어떻게 되나요?

빈 화면이나 콘솔 오류로 두지 않고, 서비스 정의를 불러오지 못했는지, 요청이 실패했는지를 구분해 안내 창을 띄웁니다. 조회는 성공했지만 결과가 없으면 조건에 맞는 작업장이 없다는 안내가 나옵니다.

좁은 화면에서도 쓸 수 있나요?

표는 가로로 스크롤되고, 조회 조건은 줄바꿈되어 배치됩니다. 데스크톱 화면을 기준으로 설계했으며 태블릿에서도 사용할 수 있습니다.

점검 기능

점검 필요는 어떤 기준으로 표시되나요?

작업장 행에는 네 가지 기준을 씁니다. 손실률이 허용 손실률보다 3%p를 넘는 경우, 손실시간이 있는데 활동단가가 없는 경우, 설비 고장이 손실시간의 50%를 넘는 경우, 원인 미분류가 손실시간의 30%를 넘는 경우입니다. 원인별 행에는 미분류 원가 비중 12% 초과, 고장 원가 비중 40% 초과를 씁니다.

점검 필요가 나오면 곧바로 문제가 있다는 뜻인가요?

아닙니다. 확인해 볼 만한 후보를 골라낸 것입니다. 정비 일정이나 신규 설비 도입처럼 정당한 사유가 있을 수 있고, 최종 판단은 회사가 합니다.

대사 결과 탭은 무엇을 보여 주나요?

아홉 가지 정합성 식의 검사 건수, 차이 건수, 최대 차이를 보여 줍니다. 차이 건수가 0 이어야 시간과 원가의 계산이 서로 맞는 것입니다. 이 값이 0 이 아니면 그 아래 행의 대사식을 보고 어느 단계에서 어긋나는지 따라가면 됩니다.

원인이 미분류인 시간은 왜 따로 보나요?

정지 사유가 입력되지 않으면 어떤 개선도 시작할 수 없기 때문입니다. 미분류 비중이 높은 작업장은 원인 분석 이전에 입력 상태부터 확인해야 하므로 별도로 점검 코드를 둡니다.

월별 추이는 어떻게 읽나요?

월마다 가용시간 대비 손실시간, 손실원가, 허용 초과 원가를 보여 줍니다. 특정 월에 손실률이 튀면 월 행을 눌러 그 달의 이벤트 명세를 열고, 어느 작업장·원인에서 늘었는지 따라갑니다.

도입과 운영

SAP 표준 화면과 무엇이 다른가요?

표준 화면은 작업장 마스터, 코스트센터 실적, 생산오더 확정을 각각 보여 줍니다. 이 화면은 같은 데이터를 작업장·월 한 줄로 모아 시간을 원가로 바꾸고 허용 기준과 대사 결과까지 함께 보여 주는 조회·점검 관점을 더합니다. 표준 실행은 SAP 표준 T-code 가 담당합니다.

기존 표준 보고서를 없애야 하나요?

아닙니다. 표준 보고서는 감사와 법정 대응의 근거로 남겨 두고, 이 화면은 월마감 전에 이상한 작업장을 먼저 골라내는 용도로 씁니다. 두 화면의 숫자를 맞춰 보는 대사 지점은 활동 원가풀과 코스트센터 전기 내역입니다.

운영 데이터로 연결하려면 무엇이 필요한가요?

활동단가 기준 테이블, 정지 기록 원천, 원인 분류 매핑, 권한 설계, 서비스 게시가 필요합니다. 화면의 manifest 에 선언된 서비스 주소만 운영 서비스로 바꾸면 화면 코드는 그대로 쓸 수 있습니다. 소요 기간은 정지 기록 원천이 얼마나 정리되어 있는지에 크게 좌우되며, 일반화해서 말하기는 어렵습니다(확인 필요).

정지 기록이 아직 정리되어 있지 않으면 쓸 수 없나요?

정지 시간을 확정하는 일이 선행되어야 합니다. 정지 기록이 없다면 이 화면은 손실시간을 만들어 낼 수 없으므로, 먼저 정지 사유를 입력하는 절차부터 정해야 합니다. 미분류 비중이 높게 나오는 것이 그 출발점이 될 수 있습니다.

권한은 어떻게 나누나요?

플랜트 단위로 조회 권한을 나누는 것을 기본으로 합니다. 활동단가와 가동 현황이 함께 드러나므로 필요한 사람에게만 열어 두는 것이 좋습니다. 권한 오브젝트와 값은 회사 권한 설계에 맞춰 정합니다.

대용량 데이터에서도 빠른가요?

운영 데이터에서는 이벤트 수가 월 수만 건이 될 수 있어, 화면이 전체를 받아 계산하지 않고 조회 조건을 서비스에 보내 필요한 만큼만 받도록 만들었습니다. 회계연도와 기간을 필수에 가깝게 쓰고, 큐브 뷰에서 집계하도록 두는 것이 좋습니다.

계정이나 작업장 체계가 바뀌면 어떻게 하나요?

작업장과 활동단가는 기준 테이블과 차원 뷰에서 읽으므로 코드를 고치지 않고 기준만 바꾸면 됩니다. 이름이 바뀐 작업장은 차원 뷰에서 한 번에 반영됩니다.

이 화면의 결과를 감사 자료로 써도 되나요?

이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다. 화면의 점검 필요는 확인할 후보를 알려 주는 것이지 손익 처리를 정해 주는 것이 아닙니다. 감사 대응은 표준 보고서와 원장을 근거로 하시기 바랍니다.

적용 시기나 대상 범위에 정해진 것이 있나요?

이 화면은 특정 기준서 요구사항을 점검하는 것이 아니라 제조원가 영역의 내부 관리 점검 도구이므로 정해진 적용 시기는 없습니다. 도입 범위는 회사가 정합니다.

여러 플랜트를 한 번에 볼 수 있나요?

샘플은 한 플랜트를 가정했습니다. 운영에서는 플랜트를 조회 조건으로 추가하고 큐브 뷰의 키에 플랜트가 이미 들어 있으므로 서비스 쪽 변경은 크지 않습니다(확인 필요).