SAP PP · QM — BOM · 생산 오더 · 실적 · 품질
BOM 전개, 생산 오더와 상태, 작업 실적과 불량, 검사 로트와 품질 통지까지 생산·품질 데이터를 쿼리로 다룹니다.
1. BOM — MAST · STKO · STPO
BOM 은 MAST(자재 × 플랜트별 BOM 사용처), STKO(BOM 헤더), STPO(구성품 품목)로 나뉩니다. 구성품 번호는 STPO.IDNRK, 소요량은 MENGE 입니다.
SELECT H.STLNR, I.IDNRK, I.MENGE
FROM STKO H
JOIN STPO I ON I.STLNR = H.STLNR AND I.STLAL = H.STLAL
WHERE H.STLNR = '00000001';
- BOM 헤더 키는 STLNR + STLAL(대체 BOM)이고, 품목은 여기에 항목 번호가 붙습니다.
- 1단계 전개는 완제품 → 직접 구성품, 2단계 전개는 반제품을 한 번 더 펼칩니다. 재귀적 전개는 HANA 의
WITH RECURSIVE로 씁니다. - 사용처(where-used)는 STPO.IDNRK 에서 상위 자재를 역으로 찾습니다.
- 같은 자재가 여러 BOM 에 쓰이면 완제품 수를 셀 때 DISTINCT 를 써야 합니다.
문제
2. 생산 오더와 상태 — AUFK · AFKO · AFPO · JEST
생산 오더는 AUFK(오더 공통: AUFNR, 범주 AUTYP 10), AFKO(생산 헤더: 기본 시작일 GSTRP, 기본 종료일 GLTRP, 총 수량 GAMNG), AFPO(품목: 생산 자재, 오더 수량 PSMNG, 입고 수량 WEMNG)로 나뉩니다. 현재 상태는 JEST 와 상태 텍스트 TJ02T 에 있습니다.
SELECT K.AUFNR, K.GSTRP, K.GLTRP, P.MATNR, P.PSMNG, P.WEMNG
FROM AFKO K
JOIN AFPO P ON P.AUFNR = K.AUFNR
WHERE P.WEMNG < P.PSMNG;
- 시스템 상태는 JEST 에 여러 행으로 쌓입니다.
INACT = ''인 활성 상태만 읽고, 상태 코드는 TJ02T 로 이름을 붙입니다. - 일정 편차는 실제 시작·종료일과 기본 시작·종료일의 차이입니다. 어떤 날짜를 "실제"로 볼지 먼저 정하세요.
- 기술적 완료(TECO)와 삭제 표시는 다릅니다. 완료된 오더도 지연 집계에 넣을지 결정해야 합니다.
- 화면으로는 CO03(생산 오더 조회), COOIS(오더 목록)입니다.
문제
3. 실적과 불량 — AFRU · MATDOC
작업 실적은 AFRU 에 쌓입니다. 오더(AUFNR), 작업(VORNR), 양품 수량(LMNGA), 불량 수량(XMNGA), 실제 작업 시간, 확정일(BUDAT)을 담습니다. 작업장 이름은 CRHD·CRTX, 부품 투입은 MATDOC(이동 유형 261)로 확인합니다.
SELECT AUFNR, VORNR, SUM(LMNGA) AS GOOD_QTY, SUM(XMNGA) AS SCRAP_QTY,
ROUND(SUM(XMNGA) * 100 / NULLIF(SUM(LMNGA) + SUM(XMNGA), 0), 2) AS SCRAP_PCT
FROM AFRU
GROUP BY AUFNR, VORNR;
- 불량률 = 불량 / (양품 + 불량). 분모가 0 이 될 수 있으니
NULLIF로 처리합니다. - 작업 시간은 실적 건별 값과 합계를 구분하세요. "확정 1건당 평균"은 건수로 나눕니다.
- 부품 투입 금액은 수량 × 가격입니다. 가격 단위(PEINH)를 확인하세요.
- 한 오더에 실적이 여러 번이면 오더 단위로 먼저 합산한 뒤 비율을 계산합니다.
문제
4. 품질 검사와 통지 — QALS · QAVE · QMEL
QALS 는 검사 로트입니다. 검사 유형 ART(01 구매 입고, 04 생산 입고), 자재 MATNR, 공급업체 LIFNR, 로트 수량 LOSMENGE 를 담고, 플랜트 필드 이름이 WERK 인 점에 주의하세요. 사용 결정은 QAVE, 클레임·불량 통지는 QMEL(유형 QMART)과 결함 항목 QMFE 에 있습니다.
SELECT L.LIFNR, COUNT(*) AS LOTS,
SUM(CASE WHEN A.VCODE <> '' THEN 1 ELSE 0 END) AS DECIDED
FROM QALS L
LEFT JOIN QAVE A ON A.PRUEFLOS = L.PRUEFLOS
GROUP BY L.LIFNR;
- 검사 로트와 사용 결정은 PRUEFLOS 로 잇습니다. 결정이 아직 없으면 QAVE 행이 없을 수 있으니 LEFT JOIN 을 씁니다.
- 불합격률은 로트 수 기준과 수량 기준이 다릅니다. 문제가 어느 쪽을 요구하는지 확인하세요.
- 품질 통지는 검사 로트와 직접 연결되지 않을 수 있습니다. 자재·공급업체·기간으로 연결하세요.
- "다음 로트 결과"처럼 행 순서가 필요한 비교는 윈도우 함수 LEAD 로 처리합니다.