유휴·가동 손실 원가 점검 — 제조원가, 작업장이 서 있던 시간을 원가로 바꿔 허용 기준과 견주는 월마감 화면
작업장별 손실시간 · 유휴 손실원가 · 허용 손실률 · 정지 이벤트와 원인 · 월별 추이 · 아홉 가지 대사식 — 소개 영상과 실제 화면 6종, 그리고 CDS 코드까지
소개 영상1분 18초8개 장면음성 안내 · 자막소개 → 처음 연 화면 → 작업장별 점검 → 손실 이벤트 → 원인별 집계 → 월별 추이 → 대사 결과 → 정리
개발 배경 — 이 앱을 사용해야 하는 이유
제조 원가를 월마감에서 점검하는 사람은 매달 같은 질문을 받습니다. 설비가 서 있던 시간이 얼마나 되나, 그 시간이 원가로는 얼마인가, 허용할 만한 수준을 넘었나. 지금은 이 세 답이 작업장 마스터 · 오더 확정 실적 · 코스트센터 보고서 · 현장의 정지 기록으로 나뉘어 있어, 숫자가 어긋나면 어디서 갈렸는지부터 찾아야 합니다.
이 화면은 작업장의 가용시간을 가동시간과 손실시간으로 나누고, 손실시간에 활동단가를 곱해 유휴 손실원가를 만든 뒤 작업장별 허용 손실률과 견줍니다. 손실시간은 다시 준비·교체, 설비 고장, 자재·인력 대기, 원인 미분류로 나눠, 손실이 어디에 몰렸는지까지 한 화면에서 봅니다. 월마감 전에 점검하는 자리이며, 관련 기준서가 따로 정해진 영역이 아니므로 대상 영역은 제조원가(유휴·가동 손실 원가)로 적습니다.
서 있던 시간은 원가로 바꿔야 크기가 보인다
정지 시간은 시간 단위로 보면 작아 보여도 활동단가가 곱해지면 얘기가 달라집니다. 이 자료의 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)를 올립니다. 어느 쪽이든 원인을 단정하지 않고 확인할 일만 적어 줍니다.
사용 방법
- 조회조건을 입력합니다. 회계연도는 필수이고, 전기 월 범위 · 작업장 · 손실 원인 · 점검 결과는 선택입니다. ‘전체’를 고르면 그 조건은 걸리지 않습니다.
- 조회 버튼(조회조건 오른쪽 끝) 또는 회계연도 입력 칸에서 Enter 키를 누릅니다. 처음 열면 자동으로 한 번 조회합니다.
- 요약 지표에서 유휴 손실원가 · 허용 손실원가 · 허용 초과 원가 · 손실률과 점검 필요 작업장 · 원인 건수, 대사 차이 건수를 먼저 봅니다.
- 탭을 작업장별 점검 → 손실 이벤트 → 원인별 집계 → 월별 추이 → 대사 결과 순서로 옮겨 가며 확인합니다.
- 행을 누르면 상세 창이 열려 시간 구성 · 원가 · 점검 내용 · 정지 이벤트 명세가 나옵니다.
- CSV 내려받기 버튼으로 현재 탭의 조회 결과를 UTF-8 CSV로 받아 엑셀로 이어 갑니다.
숫자를 믿을 수 있는가 — 검증 결과
점검 도구에서 가장 비싼 질문은 “이 숫자 맞아?”입니다. 그래서 화면을 만들기 전에 대사식 아홉 개를 먼저 세우고 자료 전수에 돌렸습니다.
| 대사 | 대사식 | 검사 건수 | 차이 건수 | 최대 차이 |
|---|---|---|---|---|
| R01 | 가용시간 = 가동시간 + 손실시간 | 36 | 0 | 0 |
| R02 | 손실시간 = 준비 + 고장 + 대기 + 기타 | 36 | 0 | 0 |
| R03 | 활동 원가풀 = 제품 배부 원가 + 유휴 손실원가 | 36 | 0 | 0 |
| R04 | 유휴 손실원가 = 손실시간 × 활동단가 | 36 | 0 | 0 |
| R05 | 작업장 손실시간 = 이벤트 시간 합계 | 36 | 0 | 0 |
| R06 | 월 손실원가 = 원인별 손실원가 합계 | 6 | 0 | 0 |
| R07 | 월 손실원가 합계 = 작업장 손실원가 합계 | 1 | 0 | 0 |
| R08 | 원인별 비중 합계 = 100% | 6 | 0 | 0 |
| R09 | 허용 초과 원가 = 손실원가 − 허용 손실원가 | 36 | 0 | 0 |
아홉 대사식 모두 차이 건수 0건입니다(검사 229건). 이와 별도로 판정 기준에 걸리는 건을 일부러 넣었습니다. 점검 필요 작업장 9건(손실률 초과 3건 · 활동단가 없음 1건 · 설비 고장 편중 3건 · 원인 미분류 편중 2건)과 점검 필요 원인 2건(미분류 비중 · 고장 비중)이며, 이 건들은 대사 차이가 아니라 점검 대상이라 차이 건수에 넣지 않았습니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 | OpenUI5 표준 컨트롤 — 조회조건 · 요약 지표 · 탭 다섯 개 · 상세 창 | 사내 Fiori 화면과 같은 결로 보이고, 외부 차트 라이브러리를 들이지 않아도 됩니다. |
| 데이터 연동 | OData V2 서비스를 화면 선언 파일에 상대 경로로 걸고, 이름 없는 기본 모델로 읽습니다 | 운영 전환 때 서비스 주소만 바꾸면 되도록 화면 코드에는 주소를 적지 않았습니다. |
| 조회조건 | 입력값을 필터 객체로 만들어 $filter 로 보냅니다. ‘전체’는 필터를 만들지 않습니다 | 전체를 뜻하는 코드값을 서버에 보내지 않아야 실제 서비스에서도 같은 동작이 나옵니다. |
| 집계 · 판정 | 손실시간 · 원가 · 손실률 · 점검 판정은 서비스 쪽에서 계산하고 화면은 받은 값을 보여 줍니다 | 판정 로직이 화면에 있으면 CSV와 화면의 숫자가 갈라지기 쉽습니다. 계산 자리를 한 곳으로 두었습니다. |
| 오류 처리 | 서비스에 닿지 못하거나 요청이 실패하면 ‘서비스 연결 안내’ 창을 띄웁니다 | 빈 표를 “데이터 없음”으로 오해하지 않게 합니다. |
| 테마 | sap_horizon | 현행 Fiori 3 후속 테마와 같은 색 · 글꼴입니다. |
| 앱 정보 | 내용 |
|---|---|
| 업무 영역 | 관리회계(CO) — 제조원가 · 유휴·가동 손실 원가 |
| 관련 기준서 | - (대상 영역: 제조원가) |
| SAP 표준 T-code | CR03 · CO03 · KSB1 · S_ALR_87013611 |
| 화면 성격 | 조회 · 점검 (데이터를 바꾸는 기능 없음) |
| 데이터 연동 | OData V2 |
실행 화면
아래 화면은 가상의 작업장 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 에 선언된 서비스 주소만 운영 서비스로 바꾸면 화면 코드는 그대로 쓸 수 있습니다. 소요 기간은 정지 기록 원천이 얼마나 정리되어 있는지에 크게 좌우되며, 일반화해서 말하기는 어렵습니다(확인 필요).
정지 기록이 아직 정리되어 있지 않으면 쓸 수 없나요?
정지 시간을 확정하는 일이 선행되어야 합니다. 정지 기록이 없다면 이 화면은 손실시간을 만들어 낼 수 없으므로, 먼저 정지 사유를 입력하는 절차부터 정해야 합니다. 미분류 비중이 높게 나오는 것이 그 출발점이 될 수 있습니다.
권한은 어떻게 나누나요?
플랜트 단위로 조회 권한을 나누는 것을 기본으로 합니다. 활동단가와 가동 현황이 함께 드러나므로 필요한 사람에게만 열어 두는 것이 좋습니다. 권한 오브젝트와 값은 회사 권한 설계에 맞춰 정합니다.
대용량 데이터에서도 빠른가요?
운영 데이터에서는 이벤트 수가 월 수만 건이 될 수 있어, 화면이 전체를 받아 계산하지 않고 조회 조건을 서비스에 보내 필요한 만큼만 받도록 만들었습니다. 회계연도와 기간을 필수에 가깝게 쓰고, 큐브 뷰에서 집계하도록 두는 것이 좋습니다.
계정이나 작업장 체계가 바뀌면 어떻게 하나요?
작업장과 활동단가는 기준 테이블과 차원 뷰에서 읽으므로 코드를 고치지 않고 기준만 바꾸면 됩니다. 이름이 바뀐 작업장은 차원 뷰에서 한 번에 반영됩니다.
이 화면의 결과를 감사 자료로 써도 되나요?
이 화면은 점검 도구이며 최종 판단은 회사와 감사인이 합니다. 화면의 점검 필요는 확인할 후보를 알려 주는 것이지 손익 처리를 정해 주는 것이 아닙니다. 감사 대응은 표준 보고서와 원장을 근거로 하시기 바랍니다.
적용 시기나 대상 범위에 정해진 것이 있나요?
이 화면은 특정 기준서 요구사항을 점검하는 것이 아니라 제조원가 영역의 내부 관리 점검 도구이므로 정해진 적용 시기는 없습니다. 도입 범위는 회사가 정합니다.
여러 플랜트를 한 번에 볼 수 있나요?
샘플은 한 플랜트를 가정했습니다. 운영에서는 플랜트를 조회 조건으로 추가하고 큐브 뷰의 키에 플랜트가 이미 들어 있으므로 서비스 쪽 변경은 크지 않습니다(확인 필요).