생산 계획 데이터 템플릿
생산 계획 데이터 템플릿
- 생산 계획 분석에 권장되는 속성
- 추적해야 할 주요 생산 계획 활동
- SAP S/4HANA 데이터 추출 상세 안내
생산 계획 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 생산 오더 ProductionOrder | 생산 오더를 식별하는 고유 번호로, 생산 계획 프로세스의 기본 케이스 식별자입니다. | ||
| 설명 생산 오더 번호는 특정 수량의 제품 제조와 관련된 모든 활동을 관리하고 추적하기 위해 SAP S/4HANA에서 생성하는 고유 키입니다. 계획 및 릴리스부터 실행과 최종 정산까지 관련 이벤트를 하나로 연결합니다. process mining에서는 관련 이벤트를 하나의 엔드투엔드 프로세스 인스턴스로 묶는 데 이 속성이 필요합니다. 생산 오더별로 분석하면 사이클 타임, 일정 준수율 같은 KPI를 측정하고 특정 생산 건에 영향을 주는 병목을 찾을 수 있습니다. 중요한 이유 모든 프로세스 단계를 연결하는 기본 속성으로, 생산 라이프사이클 전체를 케이스 단위로 분석할 수 있게 합니다. 확보 방법 생산 오더 번호이며, 일반적으로 SAP 테이블 AFKO(필드 AUFNR)와 AFPO에서 확인할 수 있습니다. 예시 100056710008341001299 | |||
| 시작 시간 StartTime | 특정 활동이나 이벤트가 시작된 시점을 나타내는 타임스탬프입니다. | ||
| 설명 이 속성에는 생산 프로세스에서 기록된 각 이벤트의 날짜와 시간이 담깁니다. 시간 기반 프로세스 분석의 기준이 됩니다. 시작 시간은 활동 간 소요 시간과 생산 오더의 전체 사이클 타임을 계산하고 이벤트 발생 시점을 파악하는 데 중요합니다. 실제 타임스탬프를 계획 날짜와 비교하면 병목과 대기 시간을 분석하고 일정 준수 여부를 확인할 수 있습니다. 중요한 이유 모든 이벤트의 시간 순서를 제공하므로 프로세스 성과와 소요 시간, 병목을 분석할 수 있습니다. 확보 방법 상태 변경은 일반적으로 변경 문서 테이블(CDHDR/CDPOS), 실행 단계는 실적 확인 테이블(AFRU), 생성 날짜는 헤더 테이블(AFKO)에서 확인할 수 있습니다. 예시 2023-10-26T09:00:00Z2023-10-26T14:30:00Z2023-10-27T08:15:00Z | |||
| 활동 Activity | 생산 계획 프로세스에서 특정 시점에 발생한 이벤트 또는 작업의 이름입니다. | ||
| 설명 이 속성에는 생산 오더 라이프사이클의 개별 단계와 주요 시점이 기록됩니다. 예를 들면 '생산 오더 생성', '자재 가용성 확인', '생산 시작', '오더 재무 마감' 등이 있습니다. 각 활동은 시스템에 기록된 특정 작업이나 상태 변경을 나타냅니다. 활동의 순서와 빈도를 분석하는 것은 process mining의 기본입니다. 이를 통해 프로세스 흐름을 시각화하고 표준 절차에서 벗어난 부분을 찾을 수 있습니다. 또한 '생산 계획 조정'처럼 지연을 일으키거나 반복 작업이 잦은 활동을 파악할 수 있습니다. 중요한 이유 프로세스 단계를 정의하므로 실제 생산 워크플로와 그 변형을 찾아 시각화할 수 있습니다. 확보 방법 JEST 및 JCDS 같은 테이블의 상태 변경, 사용된 트랜잭션 코드(예: 생성 시 CO01), AFRU의 특정 실적 확인 기록에서 도출합니다. 예시 생산 오더 생성생산 오더 릴리스생산 시작최종 실적 입력제품 입고 전기 | |||
| 소스 시스템 SourceSystem | 생산 계획 데이터를 추출한 시스템입니다. | ||
| 설명 이 속성은 데이터의 출처를 식별하며, 여러 시스템이 연동된 환경에서 중요합니다. 이 프로세스의 경우 일반적으로 해당 SAP S/4HANA 인스턴스를 나타냅니다. 데이터 분석 시 소스 시스템을 알면 데이터 무결성을 확인하고 여러 출처의 데이터를 결합할 때 적절한 맥락을 유지할 수 있습니다. 데이터 거버넌스와 추적성을 위한 기본 메타데이터입니다. 중요한 이유 데이터 거버넌스에 필요한 메타데이터를 제공해 프로세스 데이터의 출처와 맥락을 명확히 합니다. 확보 방법 일반적으로 데이터 추출 과정에서 SAP S/4HANA 클라이언트와 시스템 ID(SID)를 식별하도록 고정값으로 추가합니다. 예시 S4P_100S4H_PRD_200S4Q_300 | |||
| 최근 데이터 업데이트 LastDataUpdate | 소스 시스템에서 데이터를 마지막으로 새로 고치거나 추출한 시점을 나타내는 타임스탬프입니다. | ||
| 설명 이 속성에는 데이터를 가장 최근에 가져온 날짜와 시간이 기록됩니다. 분석 중인 데이터의 최신성을 사용자에게 알려주는 중요한 메타데이터입니다. 마지막 업데이트 시점을 알면 분석 결과를 올바르게 해석할 수 있습니다. 실시간 정보인지 특정 시점의 스냅샷인지 파악할 수 있어, 데이터에 기반한 결과와 의사결정의 적절성을 판단하는 데 도움이 됩니다. 중요한 이유 데이터의 최신성을 확인할 수 있어 정확하고 적절한 비즈니스 의사결정에 도움이 됩니다. 확보 방법 이 타임스탬프는 데이터 추출, 변환, 적재(ETL) 과정에서 생성해 추가합니다. 예시 2024-05-21T02:00:00Z2024-05-22T02:00:00Z2024-05-23T02:00:00Z | |||
| 계획 종료일 PlannedEndDate | 초기 계획에 따라 생산 오더를 완료하기로 예정된 날짜입니다. | ||
| 설명 계획 종료일은 오더의 모든 생산 활동을 완료하기로 예정된 목표 날짜입니다. 생산 계획의 일정 수립 단계에서 정합니다. 이 속성은 일정 준수 여부를 측정하는 데 필요합니다. 계획 종료일과 실제 완료 타임스탬프를 비교하면 생산 일정 준수율 KPI를 계산하고 지연된 오더를 찾을 수 있습니다. 계획 정확도와 고객 만족도를 높이는 데 중요한 분석입니다. 중요한 이유 일정 준수 여부를 측정하는 기준으로, 계획의 정확도와 실행 효율성을 평가하는 데 도움이 됩니다. 확보 방법 생산 오더 헤더 테이블 AFKO(필드 GLTRP)에서 확인할 수 있습니다. 예시 2023-11-152023-12-012024-01-20 | |||
| 오더 상태 OrderStatus | 생성, 릴리스, 기술적 완료 등 생산 오더의 현재 처리 상태입니다. | ||
| 설명 오더 상태는 생산 오더 라이프사이클의 전반적인 단계를 나타냅니다. 오더에 적용된 여러 시스템 상태와 사용자 상태를 요약합니다. 일반적인 상태로는 CRTD(생성), REL(릴리스), CNF(확인), TECO(기술적 완료), CLSD(마감)가 있습니다. 현재 오더 상태를 분석하면 진행 중인 작업 현황을 파악할 수 있습니다. process mining에서는 시간에 따른 상태 전환을 추적해 활동 로그를 생성하고, 프로세스 흐름과 각 단계의 소요 시간을 자세히 확인합니다. 중요한 이유 오더 라이프사이클의 현재 단계를 한눈에 보여주며, process mining에 필요한 활동 순서를 도출하는 기본 정보입니다. 확보 방법 AFKO의 오브젝트 번호(필드 OBJNR)를 통해 연결된 테이블 JEST의 시스템 상태에서 도출합니다. 예시 CRTDRELTECOCLSD | |||
| 자재 번호 MaterialNumber | 생산 오더에서 제조하는 제품을 식별하는 고유 번호입니다. | ||
| 설명 자재 번호는 생산 오더에서 생산할 품목을 지정합니다. 자재 명세서(BOM)와 라우팅 정보를 비롯한 자재 마스터 데이터와 생산 프로세스를 연결합니다. 자재 번호별로 프로세스를 분석하면 특정 제품에서 지연, 재작업 또는 자재 부족이 더 자주 발생하는지 확인할 수 있습니다. 이를 바탕으로 계획 매개변수를 조정하거나 특정 부품의 공급망을 개선하는 등 제품별 프로세스 개선을 추진할 수 있습니다. 중요한 이유 생산 제품별로 필터링하고 분석해 제품별 비효율이나 병목을 찾을 수 있습니다. 확보 방법 생산 오더 품목 테이블 AFPO(필드 MATNR)에서 확인할 수 있습니다. 예시 RM-1001FG-2050SA-3100-B | |||
| 작업장 WorkCenter | 작업을 담당하는 특정 기계, 기계 그룹 또는 조립 구역입니다. | ||
| 설명 작업장은 플랜트 내에서 생산 단계가 수행되는 특정 운영 단위입니다. 단일 기계, 생산 라인 또는 작업자 그룹일 수 있습니다. 작업장별 프로세스 데이터를 분석하면 생산 능력의 병목을 찾고 리소스 배분을 최적화할 수 있습니다. 어떤 작업장이 과부하 또는 저활용 상태인지, 생산 실행 중 어디에서 지연이 자주 발생하는지 파악할 수 있습니다. 이는 생산 능력 병목 식별 대시보드에 필요한 정보입니다. 중요한 이유 병목이 되는 기계나 생산 라인을 찾아 생산 능력과 리소스 활용도를 개선할 수 있습니다. 확보 방법 생산 오더 작업 데이터의 테이블 AFVC(필드 ARBPL)에서 확인할 수 있습니다. 예시 WC-ASSEMBLY-01WC-MILLING-05WC-PACKING | |||
| 플랜트 Plant | 생산 오더를 실행하는 제조 시설 또는 위치입니다. | ||
| 설명 플랜트는 SAP에서 생산 현장이나 시설을 나타내는 조직 단위입니다. 각 생산 오더는 제조 작업이 진행될 특정 플랜트에 배정됩니다. 이 속성은 제조 사업장 간 비교 분석에 중요합니다. 플랜트별로 프로세스 데이터를 나누면 성과를 비교하고, 사업장별 문제나 모범 사례를 찾으며, 효율성, 생산 능력 또는 표준 준수의 지역별 차이를 파악할 수 있습니다. 중요한 이유 생산 사업장별 성과를 비교해 모범 사례를 공유하거나 특정 위치의 문제를 해결할 수 있습니다. 확보 방법 생산 오더 헤더 테이블 AFKO(필드 DWERK)에서 확인할 수 있습니다. 예시 100017102000 | |||
| 계획 시작일 PlannedStartDate | 초기 계획에 따라 생산 오더를 시작하기로 예정된 날짜입니다. | ||
| 설명 계획 시작일은 오더의 생산 활동을 시작하기로 예정된 목표 날짜입니다. 일정 수립 과정에서 정하는 주요 결과값입니다. 이 속성은 일정 준수 분석의 기준이 됩니다. 계획 시작일과 실제 시작 시간을 비교하면 자재 준비나 오더 릴리스 지연 등 생산 전 단계의 지연을 파악할 수 있습니다. 이러한 지연은 전체 생산 일정에 연쇄적으로 영향을 줄 수 있습니다. 중요한 이유 시작 일정 준수 여부를 측정하는 기준으로, 오더 릴리스와 자재 가용성 등 생산 전 단계의 지연을 찾는 데 중요합니다. 확보 방법 생산 오더 헤더 테이블 AFKO(필드 GSTRP)에서 확인할 수 있습니다. 예시 2023-11-102023-11-252024-01-15 | |||
| 사용자 User | 생산 오더 이벤트를 생성, 변경 또는 확인한 사용자의 시스템 ID입니다. | ||
| 설명 이 속성에는 오더 릴리스나 실적 확인 입력과 같은 특정 트랜잭션 또는 상태 변경과 연결된 SAP 사용자 ID가 기록됩니다. 시스템에서 수행한 작업을 추적할 수 있습니다. 사용자별 활동을 분석하면 업무량 분포를 파악하고 교육 필요성을 확인하며 절차 준수 여부를 점검할 수 있습니다. 예를 들어 특정 사용자가 계획 조정에 자주 관여하는지, 특정 팀과 지연이 연관되는지 확인할 수 있습니다. 중요한 이유 작업 책임을 추적하고 업무량, 사용자별 행동, 교육 필요성을 분석할 수 있습니다. 확보 방법 일반적으로 변경 문서 헤더(CDHDR, 필드 UNAME) 또는 실적 확인 기록(AFRU, 인사 번호 필드 PERNR)에서 확인할 수 있습니다. 예시 CB9980000021JSMITHPLANNER01 | |||
| 생산 우선순위 ProductionPriority | 생산 오더의 긴급성이나 중요도를 나타내도록 지정한 코드 또는 값입니다. | ||
| 설명 계획 담당자는 리소스가 제한된 상황에서 오더의 순서와 우선순위를 정할 때 생산 우선순위를 사용합니다. 우선순위가 높은 오더를 낮은 오더보다 먼저 처리하는 것이 원칙입니다. 이 속성을 분석하면 현장에서 지정된 우선순위를 따르는지 확인할 수 있습니다. 생산 우선순위 일관성 대시보드는 실제 처리 순서와 지정된 우선순위를 비교해 불일치를 찾습니다. 이를 통해 일정 관리 원칙을 강화하고 계획과 실행의 일치도를 높일 수 있습니다. 중요한 이유 생산 일정이 업무 우선순위에 따라 운영되는지 확인해 중요한 오더가 계획대로 우선 처리되도록 합니다. 확보 방법 사용자 정의 필드인 경우가 많으며, 다른 오더 매개변수를 기준으로 설정할 수도 있습니다. 구체적인 위치는 시스템 설정에 따라 다릅니다. 예시 높음보통낮음15 | |||
| 오더 유형 OrderType | 생산 오더의 목적을 구분하고 처리 방식을 제어하는 분류입니다. | ||
| 설명 오더 유형은 SAP PP의 주요 설정 항목으로, 시스템에서 생산 오더를 처리하는 방식을 결정합니다. 번호 범위, 마스터 데이터 선택, 원가 계산 매개변수, 정산 규칙을 제어합니다. 일반 생산 오더, 재작업 오더, 시제품 오더 등이 있습니다. 오더 유형별로 프로세스를 분석하면 생산 유형에 따른 성과와 흐름을 비교할 수 있습니다. 재작업 오더에 시간이 더 오래 걸리는지, 특정 오더 유형에서 계획 조정이 더 자주 발생하는지 확인해 개선 대상을 구체화할 수 있습니다. 중요한 이유 오더의 업무 목적에 따라 분석을 구분해 일반 생산, 재작업 및 기타 프로세스를 비교할 수 있습니다. 확보 방법 생산 오더 헤더 테이블 AFKO(필드 AUART)에서 확인할 수 있습니다. 예시 PP01PP03ZP01 | |||
| 자재 가용성 상태 MaterialAvailabilityStatus | 생산 오더에 필요한 자재가 모두 준비되었는지 나타냅니다. | ||
| 설명 이 상태는 생산 오더의 자재 가용성 확인 결과를 나타냅니다. 모든 자재가 준비되었거나 일부가 부족한 상태, 또는 확인을 수행하지 않은 상태일 수 있습니다. '부족' 상태는 지연 가능성을 알리는 주요 신호입니다. 이 속성은 자재 부족 영향 분석 대시보드에 필요합니다. 부족 상태와 오더 릴리스부터 생산 시작까지의 시간을 연계해 자재 미확보로 인한 지연을 측정할 수 있습니다. 이 지표를 개선하면 생산 흐름을 원활하게 하는 데 도움이 됩니다. 중요한 이유 오더 릴리스부터 생산 시작까지의 지연 원인을 설명하고, 공급망 문제가 제조에 미치는 영향을 측정할 수 있습니다. 확보 방법 자재 구성 요소의 전체 상태에서 도출하는 상태값입니다. 'MSPT'(자재 부족)와 같은 상태로 시스템 상태 테이블 JEST에서 확인할 수 있습니다. 예시 가용부족미확인 | |||
| 재작업 여부 IsRework | 생산 오더에 재작업이 있었거나 생산 시작 후 계획이 크게 조정되었는지 나타내는 플래그입니다. | ||
| 설명 이 불리언 속성은 생산이 시작된 후 시정 조치나 계획 변경이 발생한 생산 오더를 식별하도록 도출합니다. 명시적인 재작업 활동이나 '생산 시작' 이후의 '생산 계획 조정' 이벤트가 기준이 될 수 있습니다. 이 플래그는 생산 재작업률 KPI를 계산하고 생산 재작업 및 변경 대시보드를 분석하는 데 필요합니다. 문제가 있는 케이스를 쉽게 필터링하고 분석해 비용이 큰 재작업으로 이어지는 품질 문제나 프로세스 이탈의 원인을 찾을 수 있습니다. 중요한 이유 재작업이 발생한 케이스를 분리해 품질 문제, 프로세스 이탈 및 관련 비용을 줄이기 위한 분석을 수행할 수 있습니다. 확보 방법 계산 필드입니다. 동일한 케이스에서 '생산 시작' 활동 이후 '생산 계획 조정' 활동이 발생하거나 특정 재작업 오더 유형을 사용한 경우 true로 설정합니다. 예시 truefalse | |||
| 정시 완료 여부 IsOnTime | 생산 오더가 계획 종료일 당일 또는 그 전에 완료되었는지 나타내는 플래그입니다. | ||
| 설명 이 계산된 불리언 속성은 실제 완료 날짜와 계획 종료일을 비교해 일정 준수 여부를 직접 측정합니다. 각 생산 오더의 정시 완료 여부를 명확한 참 또는 거짓 값으로 나타냅니다. 이 속성은 생산 일정 준수율 KPI의 기준입니다. 정시 완료 오더와 지연 오더를 쉽게 구분해 지연과 관련된 공통 특성이나 프로세스 경로를 찾을 수 있습니다. 중요한 이유 오더별 일정 준수 여부를 명확하고 간단하게 측정해 지연 원인을 분석할 수 있습니다. 확보 방법 계산 필드입니다. '오더 기술적 완료' 활동의 타임스탬프가 '계획 종료일' 속성보다 빠르거나 같으면 true로 설정합니다. 예시 truefalse | |||
| 종료 시간 EndTime | 특정 활동이나 이벤트가 완료된 시점을 나타내는 타임스탬프입니다. | ||
| 설명 이 속성에는 기록된 각 이벤트의 완료 날짜와 시간이 담깁니다. 시작 시간과 함께 활동의 소요 시간을 나타냅니다. 종료 시간은 개별 활동의 실제 처리 시간을 계산하는 데 중요하며, 이는 용량과 리소스 활용도를 분석하는 데 사용됩니다. 실제 작업 시간과 유휴 또는 대기 시간을 구분해 병목을 더 정확하게 파악할 수 있습니다. 중요한 이유 활동별 소요 시간을 정확히 계산할 수 있어 리소스 효율성과 프로세스 병목을 분석하는 데 필요합니다. 확보 방법 실행 단계는 실적 확인 테이블(AFRU)에서 확인할 수 있습니다. 이벤트가 순간적으로 발생하는 경우 다른 이벤트의 종료 시간은 시작 시간과 같을 수 있습니다. 예시 2023-10-26T09:45:00Z2023-10-26T15:00:00Z2023-10-27T10:30:00Z | |||
| 확인 수량 TotalConfirmedQuantity | 오더의 생산 실적으로 확인된 자재의 총수량입니다. | ||
| 설명 이 속성은 생산 실적 확인을 통해 보고된 완제품 또는 반제품의 누적 수량을 나타냅니다. 오더가 목표 수량을 향해 얼마나 진행되었는지 추적합니다. 확인 수량과 계획 수량을 비교하면 생산 진행 상황을 점검하고 수율 문제나 차이를 찾을 수 있습니다. 생산량을 측정하는 기본 지표이며 폐기율과 효율성 등 여러 성과 계산에 사용됩니다. 중요한 이유 생산 오더의 실제 생산량을 추적하므로 진행 상황 점검, 수율 계산, 차이 파악에 필요합니다. 확보 방법 AFRU의 실적 확인 기록에서 집계합니다(수율 수량 필드 LMNGA). 예시 9801000501200 | |||
생산 계획 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 생산 계획 조정 | 생산 오더가 릴리스된 뒤 수량, 날짜, 자재 명세서 등이 크게 변경된 경우를 나타냅니다. 변경 문서를 분석해 이 활동을 파악합니다. | ||
| 중요한 이유 조정이 잦으면 계획이 불안정하거나 수요 변동이 크다는 신호일 수 있습니다. 이 활동은 생산 계획 변경률 KPI의 기준이 되며 프로세스 변동의 원인을 찾는 데 도움이 됩니다. 확보 방법 생산 오더 오브젝트(AUFK 또는 AFPO)에 대해 CDHDR (Change document header) 및 CDPOS (Change document items) 테이블에 기록된 변경 로그를 바탕으로 추정합니다. 릴리스 이후의 변경을 조정으로 간주합니다. 기록 릴리스 이후 CDHDR/CDPOS에서 수량, 날짜 등 주요 필드의 변경 사항을 찾습니다. 이벤트 유형 inferred | |||
| 생산 시작 | 오더에 따른 실제 생산 작업이 시작되었음을 나타냅니다. 일반적으로 현장의 첫 실적 확인 또는 오더에 대한 첫 구성품 출고를 바탕으로 추정합니다. | ||
| 중요한 이유 계획 단계에서 실행 단계로 전환되는 활동입니다. 실제 시작일과 계획 시작일을 비교해 일정 준수율을 추적하는 데 필요합니다. 확보 방법 추정 이벤트입니다. 일반적으로 오더와 연결된 최초의 자재 이동 전기(MSEG 테이블, 이동 유형 261) 또는 시간 실적 전기(AFRU 테이블)의 타임스탬프를 사용합니다. 기록 해당 오더의 AFRU (실적 확인) 또는 MSEG (자재 이동)에서 가장 이른 타임스탬프입니다. 이벤트 유형 inferred | |||
| 생산 오더 릴리스 | 생산 오더가 승인되어 현장에서 실행할 수 있게 되는 주요 단계입니다. 릴리스 후 자재 출고, 실적 확인 등 실행 단계의 작업을 시작할 수 있습니다. | ||
| 중요한 이유 실행 가능한 생산 프로세스가 공식적으로 시작되는 시점으로, 리드 타임 측정에 중요한 기준입니다. 생성부터 릴리스까지의 시간은 생산 전 단계의 효율을 보여주는 주요 KPI입니다. 확보 방법 사용자 또는 시스템 작업이 릴리스를 실행하면 상태가 REL로 변경됩니다. 이 상태 변경과 타임스탬프는 JCDS 테이블에 기록됩니다. 릴리스 날짜는 AFKO-FTRMI에 저장되는 경우도 많습니다. 기록 JCDS 테이블에서 상태가 'REL'로 변경된 시각입니다. 이벤트 유형 inferred | |||
| 생산 오더 생성 | 시스템에서 생산 오더를 처음 생성하는 단계입니다. 지정된 수량의 제품을 생산하라는 공식 요청으로, 사용자가 새 오더를 저장하면 이벤트가 명시적으로 기록되고 초기 상태는 CRTD (Created)로 설정됩니다. | ||
| 중요한 이유 생산 오더 수명 주기의 시작을 나타냅니다. 생성부터 릴리스까지 걸리는 시간을 분석하면 생산 일정이 공식적으로 확정되기 전에 발생하는 행정 또는 계획 지연을 찾을 수 있습니다. 확보 방법 이 이벤트는 생성일(ERDAT)과 함께 AUFK 테이블(Order Master Data)에 기록됩니다. 생성 상태(CRTD)는 오더의 오브젝트 번호(OBJNR)를 통해 연결된 JEST 및 JCDS 테이블에 기록됩니다. 기록 AUFK-ERDAT의 타임스탬프 또는 JCDS에서 상태가 'CRTD'로 변경된 시각입니다. 이벤트 유형 explicit | |||
| 오더 기술적 완료 | 자재 이동이나 실적 확인 등 오더에 대한 추가 물류 변경을 막는 행정 마감 단계입니다. 물류 관점에서 오더가 완료된 것으로 간주됩니다. | ||
| 중요한 이유 TECO는 생산 프로세스의 확정적인 종료 지점으로, 생산 오더의 전체 주기 시간을 계산하는 데 중요합니다. 모든 물류 활동이 끝나고 오더가 재무 정산을 진행할 준비가 되었음을 나타냅니다. 확보 방법 사용자가 상태를 TECO (Technically Completed)로 설정하면 실행됩니다. 해당 이벤트는 타임스탬프와 함께 JCDS 테이블의 상태 변경으로 기록됩니다. 기록 JCDS 테이블에서 상태가 'TECO'로 변경된 시각입니다. 이벤트 유형 inferred | |||
| 제품 입고 전기 | 생산 라인에서 완제품을 재고로 입고한 기록입니다. 생산된 자재의 재고 수량을 공식적으로 늘립니다. | ||
| 중요한 이유 생산 결과물이 완성되었음을 나타내는 주요 단계입니다. 정시 납품과 전체 리드 타임을 측정할 때 생산 주기의 종료 시점으로 간주하는 경우가 많습니다. 확보 방법 일반적으로 이동 유형 101로 처리되는 명시적인 재고 전기입니다. 자재 문서의 품목 수준을 기록하는 MSEG 테이블과 헤더 수준을 기록하는 MKPF 테이블에 저장되며, 해당 문서는 생산 오더와 연결됩니다. 기록 해당 오더와 연결되고 이동 유형이 101인 MSEG의 자재 문서를 찾습니다. 이벤트 유형 explicit | |||
| 최종 실적 입력 | 생산 오더 라우팅의 마지막 작업에 대한 실적을 확인하는 활동입니다. 현장에서 계획된 제조 단계가 모두 완료되었음을 나타냅니다. | ||
| 중요한 이유 최종 실적 확인은 실제 생산 작업이 끝났음을 보여주는 주요 단계입니다. 최종 입고 전 현장 생산 주기 시간을 더 정확하게 측정하는 기준으로 자주 사용됩니다. 확보 방법 AFRU 테이블의 실적 확인 데이터를 바탕으로 추정합니다. 최종 확인 표시(AFRUD-AUERU)가 설정된 마지막 작업 순서(AFVC-VPLNR)의 실적 기록을 식별합니다. 기록 최종 확인 플래그가 설정된 AFRU의 마지막 작업 실적 확인을 찾습니다. 이벤트 유형 inferred | |||
| 생산 능력 요구량 계획 | 생산 오더의 작업을 일정에 배치하고 필요한 작업장에서 생산 능력을 사용할 수 있는지 확인하는 활동입니다. 시스템은 작업장의 생산 능력 부하를 평가하고, 설정된 경우 부하를 평준화해 생산 일정을 결정합니다. | ||
| 중요한 이유 실행 가능한 생산 일정을 확보하는 데 중요한 단계입니다. 소요 시간과 결과를 분석하면 생산 능력 병목을 찾고 리소스 계획의 정확도를 높일 수 있습니다. 확보 방법 오더가 일정에 배치되었음을 나타내는 SETC (Scheduling carried out) 등의 시스템 상태를 바탕으로 일반적으로 추정합니다. 계획된 시작일과 종료일(AUFK-GSTRP, AUFK-GLTRP)이 입력된 경우에도 이 활동이 완료된 것으로 볼 수 있습니다. 기록 AUFK/AFKO에 계획 날짜가 입력되었거나 JEST에 일정 관련 상태가 기록된 것을 바탕으로 추정합니다. 이벤트 유형 inferred | |||
| 생산 실적 입력 | 생산 오더의 특정 작업에 대한 진행 상황을 기록하는 활동입니다. 생산 수량, 불량 수량, 작업장에서 소요된 시간을 입력합니다. | ||
| 중요한 이유 실적 확인을 통해 현장 진행 상황을 실시간으로 파악할 수 있으며, 생산 상태를 추적하는 데 중요합니다. 확인 빈도와 시점을 분석하면 작업 흐름을 모니터링하고 작업 간 지연을 찾을 수 있습니다. 확보 방법 각 실적 확인은 타임스탬프(BUDAT, UZEIT)와 작업 세부 정보가 포함된 AFRU (Order Completion Confirmations) 테이블의 항목으로 명시적으로 기록됩니다. 기록 AFRU 테이블의 문서로 기록됩니다. 이벤트 유형 explicit | |||
| 생산 오더 취소 | 생산이 완료되기 전에 생산 오더를 취소한 경우입니다. 프로세스가 성공적으로 완료되지 않은 대체 종료 상태입니다. | ||
| 중요한 이유 취소된 오더를 분석하면 수요 계획, 마스터 데이터, 영업 프로세스의 문제를 찾을 수 있습니다. 취소율이 높으면 해결이 필요한 시스템 차원의 문제가 있을 수 있습니다. 확보 방법 JCDS 테이블에서 시스템 상태 CACL (Cancellation)이 설정된 것을 바탕으로 추정합니다. 또는 삭제 플래그(AUFK-LOEKZ)가 설정된 경우에도 취소로 볼 수 있습니다. 기록 JCDS에서 상태가 'CACL'로 변경된 시각 또는 AUFK에서 삭제 플래그가 설정된 시각입니다. 이벤트 유형 inferred | |||
| 예기치 않은 중단 발생 | 생산 실행 단계에서 발생한 긴 유휴 시간을 나타내는 계산 이벤트입니다. 시스템에 명시적으로 기록되는 이벤트가 아니라, 연속된 생산 실적 확인 사이의 시간 간격이 긴 경우를 찾아 도출합니다. | ||
| 중요한 이유 기계 고장이나 품질 문제 등 예기치 않은 차질을 모니터링하는 데 도움이 됩니다. 중단이 자주 발생하거나 오래 지속되는 지점을 찾으면 현장 안정성과 생산량을 높일 수 있습니다. 확보 방법 AFRU 테이블에서 연속된 '생산 실적 입력' 활동의 타임스탬프를 분석해 계산합니다. 미리 정한 기준을 초과하는 간격은 예기치 않은 중단으로 표시합니다. 기록 연속된 실적 확인 타임스탬프(AFRU-BUDAT/UZEIT) 사이의 시간 차이를 계산합니다. 이벤트 유형 calculated | |||
| 오더 재무 마감 | 오더를 정산하고 추가 재무 전기를 할 수 없도록 마감하는 최종 단계입니다. 관리회계 및 재무회계 관점에서 오더의 수명 주기가 끝났음을 나타냅니다. | ||
| 중요한 이유 일반적인 생산 분석 범위에는 포함되지 않는 경우가 많지만, 이 활동을 포함하면 처음부터 끝까지 전체 과정을 확인할 수 있습니다. 물류 완료(TECO)부터 재무 마감까지 걸리는 시간을 분석하는 데 도움이 됩니다. 확보 방법 사용자가 상태를 CLSD (Closed)로 설정하면 실행됩니다. 해당 이벤트는 타임스탬프와 함께 JCDS 테이블의 상태 변경으로 기록됩니다. 기록 JCDS 테이블에서 상태가 'CLSD'로 변경된 시각입니다. 이벤트 유형 inferred | |||
| 자재 가용성 확인 | 생산 오더에 필요한 모든 구성품을 필요한 수량과 시점에 사용할 수 있는지 시스템이나 사용자가 확인하는 단계입니다. 일반적으로 오더 생성 또는 릴리스 시 자동으로 확인하거나 수동으로 확인하며, 확인 결과에 따라 오더 상태가 갱신됩니다. | ||
| 중요한 이유 자재 부족을 조기에 파악해야 선제적으로 계획을 세울 수 있습니다. 이 활동을 추적하면 자재 가용성이 오더 릴리스와 정시 생산 시작에 미치는 영향을 파악할 수 있습니다. 확보 방법 오더 상태를 바탕으로 추정합니다. MACM (Material committed)과 같은 상태나 자재 가용일(AFKO-MSERF)의 변경은 확인이 수행되었음을 나타냅니다. 자재 부족 상태(MSPT)가 없다는 점으로도 자재 가용성을 추정할 수 있습니다. 기록 자재 커밋과 관련된 상태 변경 또는 COMAC 트랜잭션 실행 기록을 바탕으로 추정합니다. 이벤트 유형 inferred | |||
| 자재 부족 발생 | 필요한 구성품이 하나 이상 없어 생산에 영향을 받거나 생산이 중단되었음을 나타냅니다. 이를 표시하기 위해 시스템은 오더에 특정 상태를 설정합니다. | ||
| 중요한 이유 자재 부족 영향 분석을 위해 자재 부족을 추적하는 일은 중요합니다. 공급망 문제로 인한 지연을 측정하고 자재 계획을 개선하는 데 도움이 됩니다. 확보 방법 생산 오더에 'MSPT' (Material shortage) 상태가 활성화된 것을 바탕으로 추정합니다. 상태 변경 시각은 JCDS 테이블에서 확인할 수 있습니다. 기록 JCDS 테이블에서 상태가 'MSPT'로 변경된 시각입니다. 이벤트 유형 inferred | |||
데이터 추출 가이드
단계
- 사전 요구 사항 확인: 필요한 Core Data Services(CDS) 뷰에 액세스할 수 있는 적절한 권한을 가진 SAP S/4HANA 사용자가 있는지 확인합니다. 필요한 뷰는
I_ProductionOrder,I_ProdOrdConfirmation,I_MaterialDocumentItem,I_ObjectStatus,I_ChangeDocument입니다. SAP HANA 데이터베이스에 연결된 SQL 실행 환경도 필요합니다. 예를 들어 SAP HANA Studio, DBeaver 또는 외부 ETL 도구를 사용할 수 있습니다. - 시스템 세부 정보 확인:
SourceSystem속성에 사용할 소스 시스템 식별자를 정합니다. 이는 데이터 출처를 식별하기 위해 지정하는 논리적 이름입니다. 예를 들어S4H_PROD를 사용할 수 있습니다. - 추출 매개변수 설정: 쿼리를 실행하기 전에 추출 기간의 시작일과 종료일, 데이터 범위를 제한할
Plant또는ProductionOrderType등의 필터를 지정합니다. - SQL 쿼리 준비:
query섹션에 제공된 전체 SQL 쿼리를 선택한 SQL 클라이언트나 데이터 추출 도구에 복사합니다. - 자리표시자 설정: 쿼리의 자리표시자 값을 실제 매개변수로 바꿉니다.
_StartDate,_EndDate와 소스 시스템 식별자를 입력합니다.계획되지 않은 중단 발생이벤트의 기준값(예:'24:00:00')도 업무 상황에 맞게 조정합니다. - 추출 쿼리 실행: 설정한 SQL 스크립트를 SAP S/4HANA 시스템의 데이터베이스에서 실행합니다. 장기간에 걸친 대규모 데이터는 성능 문제를 방지하기 위해 월별 등 작은 단위로 나누어 추출하는 것이 좋습니다.
- 초기 데이터 검토: 쿼리 실행이 끝나면 결과를 간단히 검토합니다. 행 수와 열이 모두 있는지 확인하고,
활동열에 예상한 여러 이벤트가 포함되어 있는지 살펴봅니다. - 데이터 검증:
validationSteps섹션의 단계에 따라 데이터를 자세히 검증합니다. SAP 시스템에서 트랜잭션CO03을 사용해 일부 생산 주문의 세부 정보와 추출된 이벤트 로그를 대조하고 정확성을 확인합니다. - CSV로 내보내기: 최종 결과를 CSV 파일로 내보냅니다. 문자 인코딩 문제를 방지하려면 파일 인코딩을 UTF-8로 설정합니다.
- 업로드 준비: CSV 열 머리글이 필수 속성 이름인
ProductionOrder,활동,StartTime,SourceSystem,LastDataUpdate와 일치하는지 확인합니다. 프로세스 마이닝 도구에 업로드하기 전에StartTime열이 ISO 8601(YYYY-MM-DDTHH:MM:SS)과 같은 표준 타임스탬프 형식인지 확인합니다.
구성
- 주요 CDS 뷰: 추출은 기본 SAP 테이블을 업무 관점에서 구조화해 보여주는 표준 CDS 뷰를 주로 사용합니다. 주요 뷰는 다음과 같습니다.
I_ProductionOrder: 헤더 수준 데이터와 생성 이벤트I_ProdOrdConfirmation: 모든 작업 확정I_MaterialDocumentItem: 출고와 입고 등의 자재 이동I_ObjectStatus: 생산 오더 상태 변경I_ChangeDocument및 관련 뷰: 주요 오더 필드의 변경 내역
- 기간 필터링: 데이터량을 관리하려면 날짜 범위 필터를 적용해야 합니다. 제공된 쿼리는 생산 오더의
CreationDate를 사용합니다. 초기 분석에는 보통 3~6개월의 데이터를 사용합니다. - 주요 업무 필터: 주요 조직 속성이나 마스터 데이터 속성을 기준으로 필터를 적용해 데이터 범위를 더 좁힐 수 있습니다. 일반적인 필터는 다음과 같습니다.
Plant: 특정 제조 사업장 분석ProductionOrderType: 일반 생산, 재작업 또는 기타 오더 유형별 분석CompanyCode: 특정 법인으로 데이터 제한
- 비계획 중단 기준 시간: 쿼리에는
Unplanned Halt Occurred이벤트를 도출하는 로직이 포함되어 있습니다. 작업 간 간격이 유의미한 중단에 해당하는지 판단할 기준 시간이 필요합니다. 일반적인 생산 주기와 업무 규칙에 맞춰 값을 설정하세요. - 권한 요건: 쿼리를 실행하는 SAP 사용자에게는 모든 CDS 뷰와 해당 뷰의 기본 테이블을 조회할 권한이 있어야 합니다. 권한이 없으면 결과가 비어 있거나 일부만 반환될 수 있습니다.
샘플 쿼리 sql
WITH BaseOrders AS (
SELECT
ProductionOrder,
Material AS MaterialNumber,
ProductionPlant AS Plant,
CreationDate,
CreationTime,
BasicEndDate AS PlannedEndDate,
TechnicalCompletionDate,
LastChangeDateTime
FROM I_ProductionOrder
-- P_CreationDateFrom and P_CreationDateTo are placeholders for your date range
WHERE CreationDate BETWEEN '[_StartDate]' AND '[_EndDate]'
-- Add other filters as needed, for example:
-- AND ProductionPlant IN ('[Your_Plant_1]', '[Your_Plant_2]')
-- AND ProductionOrderType = '[Your_Order_Type]'
)
SELECT
bo.ProductionOrder,
'Production Order Created' AS Activity,
TO_TIMESTAMP(bo.CreationDate || ' ' || LPAD(bo.CreationTime, 6, '0'), 'YYYYMMDD HH24MISS') AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
'CRTD' AS OrderStatus
FROM BaseOrders bo
UNION ALL
-- System status changes like Released, Technically Completed, Closed, Cancelled, Material Shortage
SELECT
os.ObjectInternalID AS ProductionOrder,
CASE os.SystemStatus
WHEN 'I0002' THEN 'Production Order Released'
WHEN 'I0043' THEN 'Material Availability Checked' -- Status: MACM (Material committed)
WHEN 'I0045' THEN 'Order Technically Completed'
WHEN 'I0046' THEN 'Order Financially Closed'
WHEN 'I0047' THEN 'Production Order Cancelled'
WHEN 'I0010' THEN 'Material Shortage Occurred' -- Status: MSPT (Material shortage)
END AS Activity,
os.StatusChangeDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
os.SystemStatus AS OrderStatus
FROM I_ObjectStatus AS os
JOIN BaseOrders AS bo ON os.ObjectInternalID = bo.ProductionOrder
WHERE os.SystemStatus IN ('I0002', 'I0043', 'I0045', 'I0046', 'I0047', 'I0010') AND os.StatusIsInactive = ''
UNION ALL
-- Production Started, inferred from the first goods issue or first confirmation
SELECT
s.ProductionOrder,
'Production Started' AS Activity,
s.StartEventTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
s.MaterialNumber,
s.Plant,
NULL AS WorkCenter,
s.PlannedEndDate,
NULL AS OrderStatus
FROM (
SELECT
bo.ProductionOrder,
bo.MaterialNumber,
bo.Plant,
bo.PlannedEndDate,
MIN(COALESCE(gm.PostingTime, cf.ConfirmationDateTime)) AS StartEventTime,
ROW_NUMBER() OVER(PARTITION BY bo.ProductionOrder ORDER BY MIN(COALESCE(gm.PostingTime, cf.ConfirmationDateTime))) as rn
FROM BaseOrders bo
LEFT JOIN I_MaterialDocumentItem gm ON bo.ProductionOrder = gm.ProductionOrder AND gm.GoodsMovementType IN ('261', '262') -- Goods Issue
LEFT JOIN I_ProdOrdConfirmation cf ON bo.ProductionOrder = cf.ProductionOrder
WHERE gm.ProductionOrder IS NOT NULL OR cf.ProductionOrder IS NOT NULL
GROUP BY bo.ProductionOrder, bo.MaterialNumber, bo.Plant, bo.PlannedEndDate
) s
WHERE s.rn = 1
UNION ALL
-- Production Confirmation Entered (for each confirmation)
SELECT
cf.ProductionOrder,
'Production Confirmation Entered' AS Activity,
cf.ConfirmationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
cf.WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
UNION ALL
-- Final Confirmation Entered
SELECT
cf.ProductionOrder,
'Final Confirmation Entered' AS Activity,
cf.ConfirmationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
cf.WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
WHERE cf.IsFinalConfirmation = 'X'
UNION ALL
-- Unplanned Halt Occurred (derived from gaps between confirmations)
SELECT
ProductionOrder,
'Unplanned Halt Occurred' AS Activity,
PreviousConfirmationTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
MaterialNumber,
Plant,
WorkCenter,
PlannedEndDate,
NULL AS OrderStatus
FROM (
SELECT
cf.ProductionOrder,
bo.MaterialNumber,
bo.Plant,
bo.PlannedEndDate,
cf.WorkCenter,
cf.ConfirmationDateTime,
LAG(cf.ConfirmationDateTime, 1) OVER (PARTITION BY cf.ProductionOrder ORDER BY cf.ConfirmationDateTime) AS PreviousConfirmationTime,
(SECONDS_BETWEEN(LAG(cf.ConfirmationDateTime, 1) OVER (PARTITION BY cf.ProductionOrder ORDER BY cf.ConfirmationDateTime), cf.ConfirmationDateTime) / 3600.0) as HoursDiff
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
) AS gaps
WHERE gaps.HoursDiff > 24 -- Configurable threshold in hours, e.g. 24 hours
UNION ALL
-- Goods Receipt Posted
SELECT
gm.ProductionOrder,
'Goods Receipt Posted' AS Activity,
gm.PostingTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_MaterialDocumentItem gm
JOIN BaseOrders bo ON gm.ProductionOrder = bo.ProductionOrder
WHERE gm.GoodsMovementType = '101'
UNION ALL
-- Capacity Requirements Planned (using Release event as a proxy)
SELECT
os.ObjectInternalID AS ProductionOrder,
'Capacity Requirements Planned' AS Activity,
os.StatusChangeDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
os.SystemStatus AS OrderStatus
FROM I_ObjectStatus AS os
JOIN BaseOrders AS bo ON os.ObjectInternalID = bo.ProductionOrder
WHERE os.SystemStatus = 'I0002' AND os.StatusIsInactive = '' -- Status 'REL' (Released)
UNION ALL
-- Production Plan Adjusted
SELECT
ch.ObjectValue AS ProductionOrder,
'Production Plan Adjusted' AS Activity,
ch.CreationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL as WorkCenter,
bo.PlannedEndDate,
NULL as OrderStatus
FROM I_ChangeDocument AS ch
JOIN BaseOrders bo ON ch.ObjectValue = bo.ProductionOrder
WHERE ch.ChangeDocumentObject = 'PRODORDER'
-- Monitoring changes in key fields like Total Quantity (GAMNG) or Basic Finish Date (GLTRP)
AND ch.FieldName IN ('GAMNG', 'GLTRP')
GROUP BY ch.ObjectValue, ch.CreationDateTime, bo.MaterialNumber, bo.Plant, bo.PlannedEndDate 단계
- 생산 오더 데이터가 포함된 SAP HANA 스키마에 직접 읽기 권한이 있는지 확인하고, 스키마 소유자, 클라이언트 처리 방식, 타임스탬프 규칙, 권한 부여 모델을 파악합니다. SAP HANA Database Explorer 또는 승인된 SQL 클라이언트를 사용합니다. 쿼리를 확정하기 전에 해당 SAP S/4HANA 릴리스와 활성화된 생산 계획 범위를 검증합니다.
- 연결 문자열, 인증 정보, 스키마 이름, 클라이언트 값, 추출 시작일과 종료일, 회사별 필터를 구성합니다. 아래 쿼리는 AUFK, AFPO, JEST, JCDS를 사용하며 AFKO, AFVC, AFRU, RESB, MSEG, CDHDR, CDPOS도 참조합니다. 확장, 호환성 뷰, 릴리스별 차이가 있을 수 있으므로 실행 전에 시스템에서 이러한 객체를 사용할 수 있는지와 필드 정의를 확인합니다.
- SAP HANA Database Explorer 또는 승인된 SQL 실행 도구에서 쿼리를 실행합니다. 쿼리는 명시적으로 추출한 각 활동에 대해 한 행을 만들고, UNION ALL을 사용해 활동 행을 결합합니다. ProcessMind가 이벤트를 추론하는 방식에 의존하지 않습니다.
- 원본 데이터를 검토하고 필요한 경우 표시된 시스템별 표현식을 조정합니다. 특히 자재 가용성, 생산 능력 계획, 기술적 완료, 재무 마감, 취소에 사용되는 상태 코드를 확인합니다. 생산 계획 조정을 식별하는 데 사용하는 변경 문서 객체와 필드 이름도 확인합니다.
- 타임스탬프 변환과 클라이언트 필터링을 검증합니다. SAP 시스템은 날짜와 시간을 별도 필드에 저장할 수 있으며, 설치 환경에 따라 UTC 또는 현지 공장 시간이나 시스템 시간을 사용할 수 있습니다. 결과의 StartTime 값이 일관된 시간대를 사용하고 유효하지 않거나 초기 상태인 SAP 날짜가 제외되는지 확인합니다.
- 결과를 ProcessMind에서 지원하는 평면 파일 형식, 가급적 CSV 또는 UTF-8 구분 텍스트로 내보냅니다. ProductionOrder, Activity, StartTime, SourceSystem, LastDataUpdate, MaterialNumber, Plant, WorkCenter, PlannedEndDate, OrderStatus의 출력 열 이름을 정확히 유지합니다.
- 내보낸 행을 ProductionOrder와 StartTime 기준으로 정렬합니다. 업로드 과정에서 지원하는 경우 타임스탬프가 같은 행의 순서를 결정할 보조 기준도 지정합니다. 별도의 원본 레코드를 나타내는 반복 확인 및 반복 상태 변경을 포함해 이벤트마다 한 행을 유지합니다.
- 파일을 ProcessMind에 업로드하고 ProductionOrder를 케이스 식별자, Activity를 활동, StartTime을 이벤트 타임스탬프로 매핑합니다. 나머지 열은 ProcessMind 가져오기 구성에 따라 이벤트 또는 케이스 속성으로 매핑합니다. 활동 레이블 14개가 쿼리 결과와 정확히 일치하는지 확인합니다.
구성
- 날짜 범위: 우선 최근 3~6개월의 이동 기간을 사용합니다. 초기 테스트에는 더 짧은 기간을 적용하고, 행 수와 쿼리 성능을 검증한 뒤에만 범위를 늘립니다.
- 추출 매개변수: [Your schema name], [Your client], [Extraction start date], [Extraction end date], [Your source system name]을 환경에 맞는 값으로 바꿉니다. 관련 조직 필드와 값을 확인한 뒤에만 회사별 필터를 적용합니다.
- 상태 구성: 시스템에서 CRTD, 릴리스, 자재 가용성, 생산 능력 계획, 기술적 완료, 재무 마감, 취소에 사용하는 정확한 SAP 상태 코드와 상태 객체 식별자를 확인합니다. 상태 프로파일과 사용자 지정 확장에 따라 사용할 수 있는 코드가 달라질 수 있습니다.
- 변경 문서: 생산 오더 변경 문서 객체, 테이블 이름, 필드 이름, 수량·날짜·BOM·라우팅 변경에 사용되는 값 형식을 확인합니다. 쿼리는 조건에 맞는 CDHDR 및 CDPOS 레코드를 계획 조정의 근거로 처리합니다.
- 타임스탬프 처리: 모든 원본 타임스탬프를 하나의 시간대로 표준화합니다. 날짜와 시간 필드가 분리되어 저장되는지, 타임스탬프가 현지 시간인지 UTC인지, 초기 날짜가 어떻게 표시되는지 확인합니다.
- 성능: 오더 생성일 또는 인덱스가 있는 다른 생산 오더 날짜로 추출 범위를 제한하고, 클라이언트 필터를 적용하며, 필요한 열만 선택하고, 적절한 보고 시간대에 실행합니다. 데이터가 많으면 월별 또는 생산 오더 범위별로 추출하고 결과를 증분 저장합니다.
- 데이터베이스 객체: 선택한 스키마에서 AUFK, AFPO, JEST, JCDS, AFKO, AFVC, AFRU, RESB, MSEG, CDHDR, CDPOS를 사용할 수 있고 읽을 수 있는지 확인합니다. 사용 중인 릴리스에서 뷰나 필드가 다르면 해당 릴리스에서 제공되거나 승인된 객체로 바꿉니다.
- 권한: 선택한 SAP HANA 스키마와 객체에 대한 읽기 권한 및 SQL 실행 권한이 필요합니다. 조직의 거버넌스 절차에 따라 SAP 애플리케이션 권한도 필요할 수 있습니다.
- 기능 범위: 선택한 기간의 생산 계획 및 실행 데이터, 재고 이동 데이터, 상태 이력, 변경 문서를 보존해야 합니다. 보관되었거나 삭제된 레코드는 반환되지 않습니다.
- ProcessMind 매핑: ProductionOrder를 케이스 식별자, Activity를 활동, StartTime을 이벤트 타임스탬프로 설정합니다. ProcessMind가 속성에서 누락된 활동을 도출할 것으로 기대하지 마세요.
샘플 쿼리 sql
WITH
params AS (
SELECT
'[Your client]' AS mandt,
TO_DATE('[Extraction start date]', 'YYYY-MM-DD') AS date_from,
TO_DATE('[Extraction end date]', 'YYYY-MM-DD') AS date_to,
'[Your source system name]' AS source_system,
CURRENT_UTCTIMESTAMP AS last_data_update
FROM DUMMY
),
orders AS (
SELECT
a.mandt,
LTRIM(a.aufnr, '0') AS production_order,
a.aufnr AS production_order_raw,
a.erdat AS order_created_date,
a.erfzeit AS order_created_time,
a.auart AS order_type,
a.werks AS plant,
a.objnr AS object_number,
a.ktext AS order_text,
p.matnr AS material_number,
p.psmng AS planned_quantity,
p.wemng AS delivered_quantity,
k.gstrp AS planned_start_date,
k.gltrp AS planned_end_date,
k.ftrmi AS release_date,
k.ftrmp AS release_time,
k.gamng AS total_order_quantity,
k.plnbez AS header_material_number,
k.plnty AS task_list_type,
k.plnnr AS task_list_group,
k.plnal AS task_list_group_counter
FROM [Your schema name].AUFK a
LEFT JOIN [Your schema name].AFPO p
ON p.mandt = a.mandt
AND p.aufnr = a.aufnr
LEFT JOIN [Your schema name].AFKO k
ON k.mandt = a.mandt
AND k.aufnr = a.aufnr
CROSS JOIN params x
WHERE a.mandt = x.mandt
AND a.erdat >= x.date_from
AND a.erdat < ADD_DAYS(x.date_to, 1)
),
status_history AS (
SELECT
o.*,
j.stat,
j.inact,
j.chgnr,
j.udate AS status_date,
j.utime AS status_time,
c.usnam AS status_user,
c.chind AS status_change_indicator
FROM orders o
INNER JOIN [Your schema name].JEST j
ON j.mandt = o.mandt
AND j.objnr = o.object_number
LEFT JOIN [Your schema name].JCDS c
ON c.mandt = j.mandt
AND c.objnr = j.objnr
AND c.stat = j.stat
AND c.chgnr = j.chgnr
WHERE COALESCE(j.inact, '') <> 'X'
),
operations AS (
SELECT
o.production_order,
o.mandt,
v.vornr,
v.arbid,
v.steus,
v.ltxa1,
v.aufpl,
v.aplzl,
cr.name1 AS work_center
FROM orders o
LEFT JOIN [Your schema name].AFVC v
ON v.mandt = o.mandt
AND v.aufpl = (SELECT MAX(k2.aufpl) FROM [Your schema name].AFKO k2 WHERE k2.mandt = o.mandt AND k2.aufnr = o.production_order_raw)
LEFT JOIN [Your schema name].CRHD cr
ON cr.mandt = v.mandt
AND cr.objty = 'A'
AND cr.objid = v.arbid
),
confirmations AS (
SELECT
o.production_order,
o.mandt,
r.rmzhl,
r.vornr,
r.budat AS confirmation_date,
r.ersda AS entry_date,
r.erzet AS entry_time,
r.ism01,
r.ism02,
r.ism03,
r.ism04,
r.ism05,
r.ism06,
r.xmnga,
r.stzhl,
r.stzhl AS reversal_counter,
r.lmnga AS confirmed_quantity,
r.xmnge AS scrap_quantity,
r.aufpl,
r.aplzl,
op.work_center
FROM orders o
INNER JOIN [Your schema name].AFRU r
ON r.mandt = o.mandt
AND r.aufnr = o.production_order_raw
LEFT JOIN operations op
ON op.production_order = o.production_order
AND op.mandt = r.mandt
AND op.vornr = r.vornr
),
first_confirmation AS (
SELECT production_order, MIN(TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS start_time
FROM confirmations
GROUP BY production_order
),
last_confirmation AS (
SELECT production_order, MAX(TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS final_time
FROM confirmations
GROUP BY production_order
),
first_goods_issue AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(m.budat_mkpf, 'YYYYMMDD') || LPAD(TO_VARCHAR(m.cputm_mkpf), 6, '0'), 'YYYYMMDDHH24MISS')) AS start_time
FROM orders o
INNER JOIN [Your schema name].MSEG m
ON m.mandt = o.mandt
AND m.aufnr = o.production_order_raw
AND m.bwart IN ('261', '262')
GROUP BY o.production_order
),
first_receipt AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(m.budat_mkpf, 'YYYYMMDD') || LPAD(TO_VARCHAR(m.cputm_mkpf), 6, '0'), 'YYYYMMDDHH24MISS')) AS receipt_time
FROM orders o
INNER JOIN [Your schema name].MSEG m
ON m.mandt = o.mandt
AND m.aufnr = o.production_order_raw
AND m.bwart IN ('101', '102')
GROUP BY o.production_order
),
plan_changes AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(h.udate, 'YYYYMMDD') || LPAD(TO_VARCHAR(h.utime), 6, '0'), 'YYYYMMDDHH24MISS')) AS adjustment_time
FROM orders o
INNER JOIN [Your schema name].CDHDR h
ON h.mandant = o.mandt
AND h.objectid = o.production_order_raw
INNER JOIN [Your schema name].CDPOS p
ON p.mandant = h.mandant
AND p.objectclas = h.objectclas
AND p.objectid = h.objectid
AND p.changenr = h.changenr
WHERE h.objectclas IN ('ORDER', 'PP_ORDER')
AND p.tabname IN ('AFKO', 'AFPO', 'AFVC', 'RESB')
AND p.fname IN ('GAMNG', 'PSMNG', 'GSTRP', 'GLTRP', 'MATNR', 'BDMNG', 'VORNR')
GROUP BY o.production_order
),
status_times AS (
SELECT
production_order,
MIN(CASE WHEN stat IN ('I0001', 'CRTD') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS created_status_time,
MIN(CASE WHEN stat IN ('I0002', 'REL') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS released_time,
MIN(CASE WHEN stat IN ('I0003', 'MATC', 'MANC') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS material_available_time,
MIN(CASE WHEN stat IN ('I0004', 'CAPC', 'CAPA') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS capacity_planned_time,
MIN(CASE WHEN stat IN ('I0045', 'TECO') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS technically_completed_time,
MIN(CASE WHEN stat IN ('I0046', 'CLSD') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS financially_closed_time,
MIN(CASE WHEN stat IN ('I0076', 'DLFL', 'CANC') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS cancelled_time
FROM status_history
GROUP BY production_order
),
material_shortages AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(j.status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(j.status_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS shortage_time
FROM status_history j
INNER JOIN orders o
ON o.production_order = j.production_order
WHERE j.stat IN ('I0042', 'MANC', 'MSHT')
GROUP BY o.production_order
),
capacity_times AS (
SELECT
production_order,
MIN(COALESCE(released_time, created_status_time)) AS capacity_time
FROM status_times
GROUP BY production_order
),
base_attributes AS (
SELECT
o.production_order,
o.material_number,
o.plant,
COALESCE(op.work_center, '') AS work_center,
o.planned_end_date,
COALESCE(st.stat, '') AS current_status
FROM orders o
LEFT JOIN status_history st
ON st.production_order = o.production_order
AND st.inact = ''
LEFT JOIN operations op
ON op.production_order = o.production_order
AND op.vornr = (SELECT MIN(op2.vornr) FROM operations op2 WHERE op2.production_order = o.production_order)
),
events AS (
SELECT o.production_order, 'Production Order Created' AS activity, COALESCE(st.created_status_time, TO_TIMESTAMP(TO_VARCHAR(o.order_created_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(o.order_created_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS start_time FROM orders o LEFT JOIN status_times st ON st.production_order = o.production_order
UNION ALL
SELECT production_order, 'Material Availability Checked', material_available_time FROM status_times WHERE material_available_time IS NOT NULL
UNION ALL
SELECT production_order, 'Capacity Requirements Planned', capacity_time FROM capacity_times WHERE capacity_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Order Released', released_time FROM status_times WHERE released_time IS NOT NULL
UNION ALL
SELECT o.production_order, 'Production Started', LEAST(COALESCE(fc.start_time, TO_TIMESTAMP('99991231235959', 'YYYYMMDDHH24MISS')), COALESCE(fg.start_time, TO_TIMESTAMP('99991231235959', 'YYYYMMDDHH24MISS'))) FROM orders o LEFT JOIN first_confirmation fc ON fc.production_order = o.production_order LEFT JOIN first_goods_issue fg ON fg.production_order = o.production_order WHERE fc.start_time IS NOT NULL OR fg.start_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Confirmation Entered', TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS') FROM confirmations
UNION ALL
SELECT production_order, 'Material Shortage Occurred', shortage_time FROM material_shortages WHERE shortage_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Plan Adjusted', adjustment_time FROM plan_changes WHERE adjustment_time IS NOT NULL
UNION ALL
SELECT c.production_order, 'Unplanned Halt Occurred', ADD_SECONDS(c.confirmation_time, 1) FROM (SELECT production_order, TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS') AS confirmation_time, LEAD(TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS')) OVER (PARTITION BY production_order ORDER BY entry_date, entry_time, rmzhl) AS next_confirmation_time FROM confirmations) c WHERE c.next_confirmation_time IS NOT NULL AND SECONDS_BETWEEN(c.confirmation_time, c.next_confirmation_time) >= 86400
UNION ALL
SELECT production_order, 'Final Confirmation Entered', final_time FROM last_confirmation WHERE final_time IS NOT NULL
UNION ALL
SELECT production_order, 'Goods Receipt Posted', receipt_time FROM first_receipt WHERE receipt_time IS NOT NULL
UNION ALL
SELECT production_order, 'Order Technically Completed', technically_completed_time FROM status_times WHERE technically_completed_time IS NOT NULL
UNION ALL
SELECT production_order, 'Order Financially Closed', financially_closed_time FROM status_times WHERE financially_closed_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Order Cancelled', cancelled_time FROM status_times WHERE cancelled_time IS NOT NULL
)
SELECT
e.production_order AS "ProductionOrder",
e.activity AS "Activity",
e.start_time AS "StartTime",
p.source_system AS "SourceSystem",
p.last_data_update AS "LastDataUpdate",
b.material_number AS "MaterialNumber",
b.plant AS "Plant",
NULLIF(b.work_center, '') AS "WorkCenter",
b.planned_end_date AS "PlannedEndDate",
b.current_status AS "OrderStatus"
FROM events e
INNER JOIN base_attributes b
ON b.production_order = e.production_order
CROSS JOIN params p
WHERE e.start_time IS NOT NULL
ORDER BY e.production_order, e.start_time, e.activity; 시작할 준비가 되셨나요?
생산 계획의 효율을 높이는 첫걸음을 시작하세요. 이 템플릿으로 데이터를 준비하고 최적화에 필요한 인사이트를 확인하세요.
오늘부터 생산 계획을 최적화하세요
병목을 찾아 해소하고 생산 주기를 30% 단축하세요.
신용카드가 필요하지 않습니다