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 를 써야 합니다.

문제

  1. 활성 생산 BOM별 구성 부품 품목 수 (초급)
  2. 반제품을 직접 쓰는 제품의 BOM 구성 (중급)
  3. 여러 제품에 공통으로 쓰이는 원자재 찾기 (중급)
  4. 반제품을 거쳐 소요되는 원자재 2단계 전개 (중급)
  5. 원자재 사용처와 상위 자재 1단위당 소요량 (중급)
  6. 반제품을 거쳐 완제품에 쓰이는 원자재의 사용 완제품 수 (고급)

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(오더 목록)입니다.

문제

  1. MRP 관리자별 2025년 생산 시작 편차 (초급)
  2. 플랜트별 생산 오더 일정 지연 현황 (중급)
  3. 2025년 착수 예정 생산 오더의 현재 상태별 건수 (중급)
  4. 기술적 완료된 오더의 자재별 평균 종료 편차 (중급)
  5. 기술적으로 완료되지 않은 채 기본 종료일을 넘긴 생산 오더 (고급)
  6. MRP 관리자별 종료 지연 상위 오더와 현재 상태 (고급)

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)를 확인하세요.
  • 한 오더에 실적이 여러 번이면 오더 단위로 먼저 합산한 뒤 비율을 계산합니다.

문제

  1. 2025년 월별 생산 실적 건수와 양품·불량 수량 (초급)
  2. 작업장별 2025년 양품·불량 실적과 불량률 (중급)
  3. 2025년 부품 투입 금액이 큰 생산 오더 상위 10건 (중급)
  4. 화성 공장 작업장별 2025년 실제 작업 시간과 확정 1건당 평균 (중급)
  5. 부품별 2025년 투입 금액 상위 2순위 생산 오더 (고급)
  6. 화성 공장 생산 오더별 양품 1개당 부품 투입 금액 상위 10건 (고급)

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 로 처리합니다.

문제

  1. 조건부 합격으로 결정된 검사 로트 목록 (초급)
  2. 공급업체별 2025년 입고 검사 불합격률 (중급)
  3. 공급업체 클레임 통지의 처리 현황 (중급)
  4. 플랜트·로트 출처별 사용 결정 소요 일수와 예정일 초과 (중급)
  5. 자재별 불합격률 순위와 클레임 발생 건수 (고급)
  6. 불합격 로트의 클레임 통지 건수와 같은 자재의 다음 로트 결과 (고급)