생산 계획 데이터 템플릿
생산 계획 데이터 템플릿
- 수집 권장 속성
- 추적할 주요 활동
- 실무 데이터 추출 안내
생산 계획 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 생산 오더 ProductionOrder | 생산 오더의 고유 식별자입니다. 생산 계획 및 실행 프로세스에서 기본 케이스 식별자로 사용됩니다. | ||
| 설명 생산 오더 번호는 SAP ECC PP에서 각 제조 오더에 부여하는 고유한 영숫자 키입니다. 오더 생성과 계획부터 실행 및 최종 정산까지 관련 활동을 연결하는 중심 객체입니다. process mining에서는 이 속성을 기준으로 단일 생산 실행에 속하는 모든 이벤트를 그룹화합니다. 이를 통해 생산 오더의 전체 수명 주기를 처음부터 끝까지 분석하고, 진행 상황과 주기 시간을 측정하며, 표준 프로세스에서 벗어난 부분을 파악할 수 있습니다. 생산 오더별 분석을 통해 개별 제조 요청이 어떻게 처리되는지 명확하게 확인할 수 있습니다. 중요한 이유 관련된 모든 프로세스 이벤트를 연결하는 기본 식별자입니다. 이를 통해 각 생산 과정의 시작부터 끝까지 재구성하고 분석할 수 있습니다. 확보 방법 SAP 테이블 AUFK의 AUFNR 필드에서 확인할 수 있습니다. 예시 1000345100034610003471000348 | |||
| 이벤트 시간 EventTime | 활동이 발생한 시점을 나타내는 정확한 타임스탬프입니다. | ||
| 설명 이벤트 시간은 특정 활동이 실행되거나 시스템에 상태가 기록된 날짜와 시간을 나타냅니다. 주기 시간, 대기 시간, 전체 프로세스 기간을 계산하는 등 시간 기반 프로세스 분석의 기본이 됩니다. 이벤트 순서를 정확하게 정하고 성과를 분석하려면 타임스탬프가 정확해야 합니다. 이를 통해 활동 간 소요 시간을 측정하고, 지연을 파악하며, 일정이나 서비스 수준 협약에 따른 성과를 평가할 수 있습니다. 생산 계획에서는 계획과 실행의 각 단계에 걸리는 시간을 파악하는 데 도움이 됩니다. 중요한 이유 이 속성은 이벤트의 시간 순서를 제공하며, 기간 계산과 성과 분석, 병목 파악에 필요합니다. 확보 방법 자재 문서의 BUDAT(전기일)이나 CDHDR의 변경 타임스탬프 등 트랜잭션 및 상태 변경과 관련된 여러 날짜 및 시간 필드에서 가져옵니다. 예시 2023-04-15T10:05:30Z2023-04-15T14:22:00Z2023-04-18T08:59:11Z2023-04-20T16:45:00Z | |||
| 활동 이름 ActivityName | 특정 시점에 생산 오더에서 발생한 업무 또는 시스템 이벤트의 이름입니다. | ||
| 설명 활동 이름은 생산 계획 프로세스의 특정 단계나 상태 변경을 나타냅니다. SAP ECC PP의 변경 로그, 상태 업데이트, 트랜잭션 레코드에서 추출하며, '생산 오더 생성', '자재 가용성 확인', '제품 입고 전기'와 같은 주요 이정표를 표시합니다. 이 속성은 프로세스 맵의 기반이 됩니다. 분석가는 이를 통해 이벤트 순서를 시각화하고, 프로세스 변형을 발견하며, 병목이나 재작업 흐름을 파악할 수 있습니다. 운영 현실을 정확하게 반영하는 프로세스 모델을 만들려면 활동 이름을 명확하고 적절한 수준으로 세분화해야 합니다. 중요한 이유 프로세스 맵의 단계를 정의해 생산 워크플로를 시각화하고 분석하며 이해할 수 있게 합니다. 확보 방법 JEST/JSTO 테이블의 상태 변경, 트랜잭션 로그, CDHDR/CDPOS의 변경 문서 등 다양한 출처에서 생성됩니다. 예시 생산 오더 릴리스자재 출고 전기최종 실적 확인 기록오더 기술적 완료 | |||
| 소스 시스템 SourceSystem | 데이터를 추출한 시스템을 식별합니다. | ||
| 설명 이 속성은 특정 SAP ECC 인스턴스의 이름이나 ID와 같이 레코드가 생성된 시스템을 나타냅니다. 여러 ERP 시스템이나 레거시 및 최신 플랫폼을 함께 사용하는 조직에서는 데이터 계보와 맥락을 파악하는 데 중요합니다. 분석할 때는 원본 시스템을 기준으로 프로세스를 필터링할 수 있습니다. 시스템별 프로세스 성과를 비교하거나 여러 시스템의 데이터를 통합하는 프로젝트에서 특정 시스템의 데이터를 분리할 때 유용합니다. 중요한 이유 여러 SAP 인스턴스나 통합 시스템을 사용하는 환경에서 데이터 출처를 파악하는 데 필요한 맥락을 제공합니다. 확보 방법 일반적으로 데이터 추출 과정에서 추가하며, SAP 시스템 ID(SY-SYSID)에서 가져오는 경우가 많습니다. 예시 ECC_PROD_100S4H_FIN_200ECC_DE | |||
| 최근 데이터 업데이트 LastDataUpdate | 이벤트 데이터가 마지막으로 새로 고침되거나 추출된 시점을 나타내는 타임스탬프입니다. | ||
| 설명 이 속성은 소스 시스템에서 process mining 도구로 데이터를 가져온 날짜와 시간을 기록합니다. 업무 이벤트가 아니라 데이터 관리를 위한 기술적 타임스탬프입니다. 주된 용도는 데이터 최신성을 확인하고 관리자와 분석가가 분석 중인 데이터의 시점을 파악하도록 돕는 것입니다. 특히 진행 중인 운영을 모니터링할 때 최신 정보를 바탕으로 프로세스를 분석하고 있는지 검증하는 데 중요합니다. 중요한 이유 데이터가 최신 상태인지 확인해 현재 이용할 수 있는 최신 정보를 바탕으로 분석할 수 있습니다. 확보 방법 일반적으로 데이터 수집 과정에서 ETL 도구나 스크립트가 이 값을 생성하고 기록합니다. 예시 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| 계획 수량 PlannedQuantity | 오더에서 생산하도록 계획한 제품의 총수량입니다. | ||
| 설명 계획 수량은 계획 단계에서 정한 생산 오더의 목표 생산량입니다. 실제 생산량을 측정할 때 기준으로 사용합니다. 이 속성은 '계획 수량 대비 실제 수량 편차'와 같은 생산 성과 및 일정 준수율 KPI의 기본이 됩니다. 생산 계획의 정확도를 평가하고 과잉 생산이나 생산 부족과 관련된 반복적인 문제를 파악하는 데 도움이 됩니다. 이 값을 분석하면 실제 생산이 초기 계획에 얼마나 부합하는지 확인할 수 있습니다. 중요한 이유 생산량 편차를 측정하고 계획 정확도를 평가하는 기준입니다. 확보 방법 SAP 테이블 AFKO의 GAMNG 필드(오더 총수량)에서 확인할 수 있습니다. 예시 1005000751250 | |||
| 생산 공장 ProductionPlant | 생산 오더를 실행하는 제조 시설 또는 장소입니다. | ||
| 설명 생산 공장은 제조 시설을 나타내는 SAP의 주요 조직 단위입니다. 각 생산 오더에 할당되며 실제 생산 활동이 이루어지는 장소를 지정합니다. 생산 공장별로 프로세스를 분석하면 사업장 간 성과를 비교할 수 있습니다. 이를 통해 효율이 높은 공장과 지연 또는 자재 부족을 겪는 공장을 파악하고 우수 사례를 공유할 수 있습니다. 처리량과 리소스 활용률 관련 대시보드에서 근본 원인을 분석할 때 사용하는 기본 차원입니다. 중요한 이유 제조 사업장별 성과를 비교해 특정 사업장의 문제나 우수 사례를 파악할 수 있습니다. 확보 방법 SAP 테이블 AUFK의 WERKS 필드에 저장됩니다. 예시 100017102000DE01 | |||
| 실제 시작일 ActualStartDate | 기록된 첫 생산 활동의 타임스탬프로, 실제 실행 시작 시점을 나타냅니다. | ||
| 설명 실제 시작일은 실제 생산 작업의 시작을 나타내는 첫 이벤트의 타임스탬프입니다. 일반적으로 최초 생산 실적 확인 이벤트나 오더에 대한 첫 원자재 출고를 기준으로 산출합니다. 이 파생 속성은 일정 준수율 분석에 중요합니다. 실제 시작 시점을 기준으로 '계획 시작일'과 비교해 시작 지연을 정확하게 계산할 수 있습니다. 계획 시작일과 실제 시작일의 차이를 파악하면 자재 준비, 기계 설정 또는 리소스 가용성과 관련된 생산 전 지연의 원인을 찾을 수 있습니다. 중요한 이유 실제 생산 실행의 시작점을 제공해 시작 지연과 전체 생산 리드 타임을 정확하게 계산할 수 있습니다. 확보 방법 이벤트 로그에서 각 생산 오더의 '최초 실적 확인 기록' 또는 '자재 출고 전기'와 같은 실행 활동 중 가장 이른 타임스탬프를 찾아 산출합니다. 예시 2023-05-11T08:30:00Z2023-06-22T14:00:00Z2023-07-02T09:15:00Z | |||
| 실제 종료일 ActualEndDate | 마지막 생산 활동의 타임스탬프로, 오더의 실제 완료 시점을 나타냅니다. | ||
| 설명 실제 종료일은 오더의 모든 생산 활동이 완료되었음을 나타내는 이벤트의 타임스탬프입니다. 일반적으로 '최종 실적 확인 기록' 또는 마지막 '제품 입고 전기' 이벤트의 타임스탬프를 기준으로 산출합니다. 이 속성은 전체 생산 주기 시간을 측정하고 일정 준수율을 분석하는 데 필요합니다. '실제 종료일'과 '계획 종료일'을 비교하면 오더가 제때 완료되었는지 확인할 수 있습니다. '실제 시작일'부터 '실제 종료일'까지의 기간을 분석하면 실제 생산 처리 시간을 알 수 있습니다. 중요한 이유 생산 완료 시점을 나타내므로 정시 납품 성과와 전체 실행 시간을 정확하게 측정할 수 있습니다. 확보 방법 이벤트 로그에서 '최종 확인 기록' 또는 '입고 전기'와 같은 주요 완료 활동의 타임스탬프 중 가장 늦은 값을 찾아 산출합니다. 예시 2023-05-14T16:00:00Z2023-06-29T11:30:00Z2023-07-05T17:00:00Z | |||
| 입고 수량 DeliveredQuantity | 생산되어 재고로 입고된 제품의 실제 수량입니다. | ||
| 설명 입고 수량은 제품 입고 수량이라고도 하며, 특정 생산 오더에서 생산 완료로 확인된 완제품의 총수량입니다. '제품 입고 전기' 이벤트가 발생하면 이 값이 업데이트됩니다. 이 속성은 '계획 수량'과 비교되는 값으로, '계획 수량 대비 실제 수량 편차' KPI를 계산하는 데 필요합니다. 생산량을 확정적으로 측정해 폐기, 수율 손실 또는 기타 생산 문제로 인한 차이를 파악할 수 있습니다. 공장, 제품 또는 기간별 입고 수량을 비교하면 효율 문제가 있는 영역을 찾을 수 있습니다. 중요한 이유 실제 생산량을 측정해 계획 목표와 직접 비교하고 성과를 평가할 수 있습니다. 확보 방법 SAP 테이블 AFPO의 WEMNG 필드(입고 수량)에서 확인할 수 있습니다. 예시 984950751255 | |||
| 제품 코드 ProductCode | 제조할 자재 또는 제품을 식별하는 고유 코드입니다. | ||
| 설명 제품 코드 또는 자재 번호는 생산 오더에서 제조할 품목을 식별합니다. 생산 계획과 재고 관리, 영업, 원가 계산을 연결하는 주요 마스터 데이터입니다. process mining에서는 제품별 제조 프로세스를 파악하기 위해 제품 코드를 기준으로 필터링하거나 데이터를 구분합니다. 이를 통해 '주기 시간이 가장 긴 제품은 무엇인가?', '특정 제품에서 품질 문제나 자재 지연이 더 자주 발생하는가?'와 같은 질문에 답할 수 있습니다. 제품 포트폴리오를 관리하고 자재 유형별 프로세스 표준화 또는 최적화 기회를 찾는 데 중요한 분석입니다. 중요한 이유 제품별 프로세스를 분석해 어떤 자재에서 비효율, 지연 또는 높은 비용이 발생하는지 파악할 수 있습니다. 확보 방법 SAP 테이블 AFPO의 MATNR 필드에서 확인할 수 있습니다. 예시 완제품-123원자재-45A반제품-7890화학제품-22 | |||
| 계획 담당 그룹 PlannerGroup | 오더를 담당하는 MRP 컨트롤러 또는 생산 계획 담당자 그룹입니다. | ||
| 설명 계획 담당 그룹은 특정 자재 또는 생산 오더를 계획하고 관리하는 담당자 그룹을 나타내는 조직 단위입니다. 오더를 계획 담당 그룹에 배정하면 업무량을 분산하고 담당 주체를 명확히 할 수 있습니다. process mining에서는 이 속성을 활용해 담당 계획 팀별 성과를 분석할 수 있습니다. 예를 들어 '일정 편차가 가장 큰 계획 담당 그룹은 어디인가요?' 또는 '그룹별 관리 오더의 처리 주기에 차이가 있나요?'와 같은 질문에 답할 수 있습니다. 이를 통해 업무량을 균형 있게 배분하고 교육이 필요한 영역을 파악할 수 있습니다. 중요한 이유 담당 팀별로 성과를 나누어 분석할 수 있어 계획의 효과와 업무량 차이를 파악하는 데 도움이 됩니다. 확보 방법 SAP 테이블 AFKO의 DISPO 필드에 있는 MRP 컨트롤러입니다. 예시 001002P01P02 | |||
| 계획 시작일 PlannedStartDate | 오더의 생산을 시작하도록 계획된 날짜입니다. | ||
| 설명 계획 시작일은 생산 계획 및 일정 수립 단계에서 정하는 주요 일정 매개변수입니다. 오더의 생산 활동을 시작할 목표 날짜를 나타냅니다. 이 속성은 일정 준수율을 측정하는 데 중요합니다. '계획 시작일'과 실제 생산 시작 시점(예: '최초 실적 확인 기록' 활동의 타임스탬프)을 비교하면 생산 시작 지연을 파악할 수 있습니다. 이러한 지연의 원인을 분석하는 것은 이 영역에서 process mining을 활용하는 주요 사례입니다. 중요한 이유 일정 준수율을 측정하고 생산 실행 시작 단계의 지연을 파악하는 기준입니다. 확보 방법 SAP 테이블 AFKO의 GSTRP 필드에서 확인할 수 있는 기본 시작일입니다. 예시 2023-05-102023-06-222023-07-01 | |||
| 계획 종료일 PlannedEndDate | 오더의 생산을 완료하도록 계획된 날짜입니다. | ||
| 설명 계획 종료일은 일정 수립 과정에서 정하는 생산 오더의 목표 완료일입니다. 최종 실적 확인과 제품 입고를 포함한 모든 생산 활동을 완료할 예정 시점을 나타냅니다. 이 날짜는 '일정 준수율' KPI를 계산하는 데 필요합니다. '계획 종료일'과 실제 완료 시점(예: '제품 입고 전기' 또는 '최종 실적 확인 기록' 활동의 타임스탬프)을 비교하면 오더가 제때 완료되었는지 확인할 수 있습니다. 이를 분석하면 생산 일정의 신뢰도를 평가하고 납기 지연의 근본 원인을 파악할 수 있습니다. 중요한 이유 생산 오더의 정시 완료 여부를 판단하는 기준으로, 고객 만족도와 계획의 신뢰도에 직접 영향을 줍니다. 확보 방법 SAP 테이블 AFKO의 GLTRP 필드에서 확인할 수 있는 기본 종료일입니다. 예시 2023-05-152023-06-282023-07-05 | |||
| 담당 사용자 ResponsibleUser | 생산 오더를 생성하거나 마지막으로 변경한 사람의 사용자 ID입니다. | ||
| 설명 담당 사용자는 생산 오더 수명 주기의 생성이나 릴리스와 같은 주요 이벤트에 연결된 SAP 사용자 계정을 나타냅니다. 이를 통해 시스템에서 수행한 작업의 책임 소재와 추적 가능성을 확보할 수 있습니다. process mining에서는 이 속성을 사용해 사용자별 작업 방식에 따른 프로세스 차이를 분석합니다. 추가 교육이 필요한 사용자나 표준 절차를 따르지 않는 사용자를 파악할 수 있습니다. 또한 사용자별 업무 분포를 확인해 리소스를 분석하는 데도 활용할 수 있습니다. 중요한 이유 프로세스 활동을 담당자와 연결해 사용자별 성과를 분석하고 책임 소재를 명확히 할 수 있습니다. 확보 방법 오더 생성자는 AUFK-ERNAM에, 마지막 변경자는 AUFK-AENAM에 기록됩니다. 변경 문서(CDHDR-USERNAME)를 통해 특정 변경을 수행한 사용자 이력을 확인할 수 있습니다. 예시 JSMITHPROD_PLANNER1BATCH_USERAMILLER | |||
| 생산 오더 상태 ProductionOrderStatus | 생산 오더의 현재 처리 상태입니다. 예: 생성, 릴리스, 기술적 완료. | ||
| 설명 생산 오더 상태는 오더 수명 주기에서 현재 단계를 나타냅니다. SAP는 상태 코드를 사용해 오더 진행 상황을 관리합니다. 예를 들어 CRTD(생성), REL(릴리스), CNF(확인), DLV(납품), TECO(기술적 완료)가 있습니다. 상태별 소요 시간을 분석하는 것은 생산 process mining의 주요 작업입니다. 오더가 생성된 뒤 릴리스될 때까지 얼마나 대기하는지, 일부만 납품된 상태로 얼마나 오래 남아 있는지 파악할 수 있습니다. 상태 변경을 활동으로 추적하면 프로세스 흐름을 전체적으로 살펴볼 수 있습니다. 중요한 이유 오더 진행 상황을 한눈에 보여 주며, 오더가 장시간 정체되는 병목을 파악하는 데 도움이 됩니다. 확보 방법 상태 정보는 오더의 객체 번호(AUFK-OBJNR)와 연결된 JEST 및 JSTO 테이블에 저장됩니다. 상태 텍스트는 TJ02T에 있습니다. 상태 조회에는 STATUS_TEXT_EDIT와 같은 함수 모듈을 사용하는 경우가 많습니다. 예시 CRTD (생성)REL (릴리스)DLV (납품)TECO (기술적 완료) | |||
| 생산 우선순위 ProductionPriority | 생산 오더의 긴급도 또는 우선순위를 나타내는 분류입니다. | ||
| 설명 생산 우선순위는 생산 오더의 상대적 중요도를 나타내는 필드입니다. 생산 일정 담당자와 현장 작업자는 이를 기준으로 업무 우선순위를 정해 긴급 오더가 프로세스에서 먼저 처리되도록 할 수 있습니다. 이 속성을 분석하면 우선순위 체계가 효과적으로 운영되는지 평가할 수 있습니다. 우선순위가 높은 오더와 낮은 오더의 처리 주기를 비교하면 긴급 오더가 실제로 더 빠르게 처리되는지 확인할 수 있습니다. 그렇지 않다면 의사소통, 리소스 배분 또는 전반적인 실행 프로세스에 문제가 있을 수 있습니다. 중요한 이유 우선순위 관리 체계의 효과를 평가하고, 긴급 오더가 일반 오더보다 빠르게 완료되는지 확인할 수 있습니다. 확보 방법 생산 오더 헤더의 표준 필드가 아닌 경우가 많습니다. 사용자 정의 필드이거나 판매 오더 우선순위에서 파생되거나 분류 체계의 일부일 수 있습니다. SAP ECC PP 문서 또는 시스템 구성을 확인하세요. 예시 높음보통낮음긴급 | |||
| 수량 편차 QuantityVariance | 계획 생산량과 실제 납품량의 차이입니다. | ||
| 설명 수량 편차는 생산 실적이 최초 계획에서 얼마나 벗어났는지 측정하는 계산 지표입니다. '납품 수량'에서 '계획 수량'을 빼서 계산합니다. 양수는 초과 생산, 음수는 생산 부족 또는 수율 손실을 나타냅니다. 이 속성은 '계획 대비 실제 생산량' 대시보드와 관련 KPI에 필수적입니다. 편차를 분석하면 생산 수율, 폐기율 또는 데이터 입력 오류와 관련된 문제를 파악할 수 있습니다. 생산 프로세스가 생산 목표를 얼마나 안정적으로 달성하는지 직접 측정할 수 있습니다. 중요한 이유 계획 대비 생산량의 정확도를 수치화해 수율, 폐기 또는 프로세스 관리상의 잠재적 문제를 파악할 수 있습니다. 확보 방법 계산 필드: 'DeliveredQuantity' - 'PlannedQuantity'. 예시 -2-5005 | |||
| 일정 준수 상태 ScheduleAdherenceStatus | 생산 오더가 계획 종료일까지 완료되었는지 나타내는 플래그입니다. | ||
| 설명 일정 준수 상태는 정시 완료 여부를 간단히 확인할 수 있도록 계산되는 불리언 또는 범주형 속성입니다. '실제 종료일'과 '계획 종료일'을 비교해 산출합니다. 실제 종료일이 계획 종료일과 같거나 빠르면 '정시', 늦으면 '지연'으로 표시합니다. 이 속성을 사용하면 대시보드에서 분석하고 시각화하기가 쉬워집니다. 간편하게 필터링하고 집계해 '일정 준수율' KPI를 계산하고, 특정 제품이나 공장, 자재 부족 등 오더 지연의 주요 원인을 파악할 수 있습니다. 중요한 이유 오더를 '정시' 또는 '지연'으로 분류해 성과를 쉽게 분석하고 일정 신뢰도를 측정·보고할 수 있습니다. 확보 방법 계산 필드: IF('ActualEndDate' <= 'PlannedEndDate', '정시', '지연'). 예시 정시지연 | |||
| 자재 가용성 MaterialAvailabilityStatus | 생산 오더에 필요한 모든 구성품을 사용할 수 있는지 나타냅니다. | ||
| 설명 자재 가용성 상태는 생산 준비 여부를 판단하는 중요한 지표입니다. 시스템이 오더에 필요한 모든 구성 자재의 가용성을 확인해 결정합니다. '사용 가능' 상태라면 자재 문제로 인한 지연 없이 생산을 진행할 수 있으며, '부족' 상태는 문제가 있음을 나타냅니다. 이 속성은 '자재 부족 영향 분석' 대시보드에 필수적입니다. 자재 부족으로 오더가 대기하는 시간을 분석하면 공급망 문제가 생산 일정에 미치는 영향을 수치화할 수 있습니다. 이를 통해 공급이 불안정한 업체나 지연을 자주 일으키는 문제 자재를 파악할 수 있습니다. 중요한 이유 자재 부족으로 발생한 지연을 직접 보여 줍니다. 자재 부족은 생산 일정 편차를 일으키는 흔하고 중요한 원인입니다. 확보 방법 단일 저장 필드가 아니라 가용성 확인(ATP 확인) 결과입니다. 결과는 CO02 트랜잭션이나 전체 가용성 확인인 COHV에서 확인할 수 있는 경우가 많습니다. MACM(자재 확약)과 같은 상태가 기록될 수도 있습니다. SAP ECC PP 문서를 확인하세요. 예시 사용 가능부족일부 사용 가능확인 안 됨 | |||
생산 계획 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 생산 오더 릴리스 | 이 활동은 생산 오더를 공식 승인하고 실행 단계로 릴리스했음을 나타냅니다. 릴리스되면 자재 예약이 활성화되고 자재 출고와 실적 확인 등 생산 활동을 시작할 수 있습니다. | ||
| 중요한 이유 계획에서 실행으로 넘어가는 중요한 이정표입니다. 오더 생성부터 릴리스까지 걸리는 시간은 계획 효율성을 보여주는 주요 지표입니다. 확보 방법 시스템 상태 'REL'(I0002)이 생산 오더에 할당되면 명시적으로 기록됩니다. 변경 타임스탬프는 오더 객체 번호(AUFK-OBJNR)와 연결된 JCDS 테이블에 기록됩니다. 기록 오더의 'REL' 상태가 활성화된 시점을 확인합니다. 이벤트 유형 explicit | |||
| 생산 오더 생성 | 이 이벤트는 새 생산 오더가 생성된 시점을 나타냅니다. 일반적으로 계획 실행이나 수동 입력으로 오더가 생성됩니다. 시스템에 새 오더 레코드를 저장하고 'CRTD'(생성됨) 상태가 부여되면 명시적으로 기록됩니다. | ||
| 중요한 이유 모든 생산 오더 케이스는 이 이벤트에서 시작합니다. 이 이벤트부터 오더 릴리스까지 걸리는 시간을 분석하면 생산 전 계획 및 행정 설정 단계의 지연을 파악할 수 있습니다. 확보 방법 생산 오더의 생성일(AUFK-ERDAT)과 생성 시간(AUFK-ERZET)을 기준으로 이 이벤트를 기록합니다. 시스템 상태 'CRTD'(I0001)는 오더 객체 번호(AUFK-OBJNR)와 연결된 JEST 및 JCDS 테이블에 할당되고 기록됩니다. 기록 'CRTD' 상태가 할당된 시점과 생성 타임스탬프를 추적합니다. 이벤트 유형 explicit | |||
| 오더 기술적 완료 | 물류 관점에서 생산 오더를 최종 마감하는 행정 단계입니다. 이후 자재 이동이나 실적 확인을 막고 재무 정산을 진행할 수 있게 합니다. | ||
| 중요한 이유 물류 관점에서 오더 수명 주기가 끝나는 시점입니다. 이 이벤트를 분석하면 생산 후 행정 업무를 포함한 전체 프로세스 기간을 파악할 수 있습니다. 확보 방법 시스템 상태 'TECO'(I0045, 기술적 완료)가 오더에 할당되면 명시적으로 기록됩니다. 변경 타임스탬프는 JCDS 테이블에 기록됩니다. 기록 JCDS에서 오더의 'TECO' 상태가 활성화된 시점을 확인합니다. 이벤트 유형 explicit | |||
| 제품 입고 전기 | 이 이벤트는 생산 오더에서 완제품을 재고로 입고한 내역을 기록합니다. 제조된 제품을 출하하거나 추가 가공에 사용할 수 있게 되었음을 나타냅니다. | ||
| 중요한 이유 생산 프로세스의 최종 산출물을 나타내는 주요 완료 이정표입니다. 오더 릴리스부터 제품 입고까지 걸린 시간이 전체 생산 리드 타임입니다. 확보 방법 일반적으로 '101'인 이동 유형과 생산 오더를 참조하는 자재 문서로 MKPF/MSEG 테이블에 기록됩니다. 오더에는 시스템 상태 'DLV'(I0012, 납품됨)도 설정됩니다. 기록 '101' 이동 유형 자재 문서의 전기일 또는 'DLV' 상태 변경 타임스탬프를 기록합니다. 이벤트 유형 explicit | |||
| 최종 실적 확인 기록 | 이 활동은 생산 현장 관점에서 생산 오더의 모든 작업이 완료되었음을 나타냅니다. 마지막 작업의 최종 실적 확인 항목으로 표시됩니다. | ||
| 중요한 이유 이 이정표는 실제 생산 활동이 끝난 시점을 나타냅니다. 최초 실적 확인부터 최종 실적 확인까지 걸린 시간이 실제 생산 실행 시간입니다. 확보 방법 시스템 상태 'CNF'(I0009, 확인됨)가 설정되면 기록됩니다. 일반적으로 AFRU 테이블에 최종 실적 확인 항목(AFRU-AUERU = 'X')이 입력될 때 설정됩니다. 상태 변경은 JCDS에 기록됩니다. 기록 'CNF' 상태가 설정된 타임스탬프를 확인하거나 AFRU에서 마지막 실적 확인 레코드를 찾습니다. 이벤트 유형 explicit | |||
| 최초 실적 확인 기록 | 이 이벤트는 오더에 대한 실제 생산 작업이 시작된 시점을 나타냅니다. 생산 오더의 작업에 대한 첫 번째 실적 확인이 시스템에 입력되면 기록됩니다. | ||
| 중요한 이유 이 활동을 통해 실제 생산 시작 시점을 확인할 수 있습니다. 일정 준수율을 측정하고 리소스 배정부터 작업 시작까지의 지연을 파악하는 데 필요합니다. 확보 방법 AFRU 테이블에 기록된 오더의 모든 실적 확인 중 가장 이른 전기일(AFRU-BUDAT)을 찾아 추정합니다. 첫 번째 항목이 실제 생산 시작을 나타냅니다. 기록 AFRU 테이블의 전기일을 기준으로 오더의 첫 번째 실적 확인 레코드를 찾습니다. 이벤트 유형 inferred | |||
| 오더 데이터 변경 | 이 이벤트는 생산 오더 생성 후 계획 수량, 날짜, BOM 등이 변경된 중요한 내역을 기록합니다. 시스템은 감사 목적으로 이러한 변경 사항을 기록합니다. | ||
| 중요한 이유 변경 사항을 추적하면 프로세스 불안정성과 잦은 재계획을 파악할 수 있습니다. 변경이 자주 발생하면 초기 계획의 미흡, 수요 변동성 또는 데이터 부정확성을 나타낼 수 있습니다. 확보 방법 AFKO(오더 헤더) 및 AFPO(오더 품목)와 같은 테이블의 주요 필드 변경은 변경 문서 테이블 CDHDR(헤더) 및 CDPOS(품목)에 기록됩니다. 관련 변경 사항은 각각 활동으로 추출할 수 있습니다. 기록 생산 오더 객체 클래스에 해당하는 CDHDR 및 CDPOS 테이블에서 변경 로그 항목을 추출합니다. 이벤트 유형 explicit | |||
| 오더 정산 실행 | 생산 오더에서 발생한 비용을 적절한 원가 객체에 배부하는 재무 정산을 나타냅니다. 관리회계 관점에서 오더 수명 주기의 마지막 단계입니다. | ||
| 중요한 이유 재무 활동이지만 정산이 지연되면 원가 보고나 오더 데이터 정확도에 문제가 있을 수 있습니다. 이 이벤트는 생산 프로세스의 재무 마감 시점을 나타냅니다. 확보 방법 오더 잔액이 0이 되거나 시스템 상태 'SETC'(I0076, 정산 규칙 생성됨) 이후 정산 실행 로그가 기록되면 정산을 추정할 수 있습니다. 실제 정산은 COSP 및 COSS와 같은 관리회계 테이블에 기록됩니다. 기록 CO 테이블에서 오더와 연결된 정산 문서를 확인하거나 'SETC' 상태가 활성화된 시점을 기준으로 추정합니다. 이벤트 유형 inferred | |||
| 오더 취소 설정 | 이 이벤트는 생산 오더가 완료 전에 취소되었음을 나타냅니다. 일반적으로 특정 상태나 삭제 플래그를 설정해 이후 처리를 막습니다. | ||
| 중요한 이유 추적이 필요한 부정적 결과입니다. 취소된 오더를 분석하면 수요 예측, 계획 정확도 또는 마스터 데이터 관리의 문제를 파악할 수 있습니다. 확보 방법 'DLFL'(I0076, 삭제 플래그) 상태가 할당되거나 설정된 경우 특정 'Canceled' 상태를 기준으로 취소를 추정할 수 있습니다. 변경 타임스탬프는 JCDS 테이블에 기록됩니다. 기록 오더에 삭제 플래그('DLFL') 또는 취소 상태가 설정된 시점을 확인합니다. 이벤트 유형 inferred | |||
| 자재 가용성 확인 | 생산 오더에 필요한 모든 구성품을 사용할 수 있는지 확인하는 작업을 나타냅니다. 오더 생성 또는 릴리스 시 자동으로 확인하거나 사용자가 직접 실행할 수 있습니다. | ||
| 중요한 이유 자재 부족으로 인한 지연을 파악하는 데 중요한 활동입니다. 확인이 자주 발생하거나 자재를 사용할 수 있을 때까지 시간이 오래 걸리면 공급망 또는 재고 관리에 문제가 있을 수 있습니다. 확보 방법 시스템은 'MACM'(자재 할당 완료) 또는 'MSPT'(자재 부족)와 같은 상태를 설정합니다. JEST/JCDS 테이블의 상태 변경 타임스탬프를 통해 실행 시점을 추정할 수 있습니다. 결과는 오더 헤더에서 확인할 수 있습니다. 기록 'MACM' 또는 'MSPT'와 같이 자재 가용성과 관련된 상태 변경 타임스탬프를 기준으로 추정합니다. 이벤트 유형 inferred | |||
| 자재 출고 전기 | 이 활동은 생산 오더에 사용할 구성품 자재를 재고에서 출고하는 작업을 나타냅니다. 필요한 원자재나 반제품을 생산에 투입할 준비가 되었음을 확인합니다. | ||
| 중요한 이유 이 이벤트는 자재 소비가 시작되는 시점을 나타냅니다. 오더 릴리스부터 자재 출고까지 지연이 발생하면 창고 물류, 자재 준비 또는 재고 정확도에 문제가 있을 수 있습니다. 확보 방법 일반적으로 '261'인 이동 유형과 생산 오더 번호(MSEG-AUFNR)를 포함해 MKPF(헤더) 및 MSEG(품목) 테이블의 자재 문서로 기록됩니다. 기록 오더와 연결된 이동 유형 '261' 자재 문서의 전기일(MKPF-BUDAT)을 기록합니다. 이벤트 유형 explicit | |||
| 중간 실적 확인 기록 | 작업을 부분 실적 확인해 생산 오더의 진행 상황을 업데이트하는 활동입니다. 최종 완료 전에 진행 상황을 추적해야 하는 장기 오더에서 흔히 발생합니다. | ||
| 중요한 이유 중간 실적 확인을 분석하면 생산 주기가 긴 오더의 진행 상황을 모니터링하고, 시작이나 종료 시점뿐 아니라 생산 프로세스 중간의 병목도 파악할 수 있습니다. 확보 방법 최종 실적으로 표시되지 않은 AFRU 테이블의 실적 확인 레코드에서 기록합니다. 각 항목에는 전기일(AFRU-BUDAT)과 시간이 포함됩니다. 기록 작업의 최종 실적으로 표시되지 않은 AFRU 실적 확인 레코드를 모두 추출합니다. 이벤트 유형 explicit | |||
데이터 추출 가이드
단계
- SAP Query에서 InfoSet 만들기: 트랜잭션 코드
SQ02를 사용합니다. 새 InfoSet을 만들고 예를 들어ZPP_EVENTLOG라는 이름을 지정합니다. 데이터 원본으로 '기준 테이블을 사용한 테이블 조인'을 선택합니다. 초기 기준 테이블로AUFK(오더 마스터 데이터)를 사용합니다. - 필요한 테이블 조인하기: 다음 테이블을 InfoSet 조인에 추가합니다. 시스템에서 조인을 제안할 수 있지만, 올바른지 확인하세요.
AUFK와AFKO(PP 오더 헤더 데이터):AUFK-AUFNR = AFKO-AUFNRAUFK와JEST(개별 객체 상태):AUFK-OBJNR = JEST-OBJNRJEST와JCDS(시스템/사용자 상태 변경 문서):JEST-OBJNR = JCDS-OBJNRANDJEST-STAT = JCDS-STAT. 참고: 이 조인은 상태 변경 이력을 조회할 때 사용합니다.AUFK와AFRU(오더 완료 확인):AUFK-AUFNR = AFRU-AUFNRAUFK와MSEG(자재 문서 세그먼트):AUFK-AUFNR = MSEG-AUFNRMSEG와MKPF(자재 문서 헤더):MSEG-MBLNR = MKPF-MBLNRANDMSEG-MJAHR = MKPF-MJAHR
- 필드 그룹 정의하기: 원본 테이블에서 필요한 필드를 필드 그룹으로 끌어옵니다. 최종 쿼리에 필요한
AUFK-AUFNR,AUFK-WERKS,AFKO-GAMNG,AFKO-GASMG,JCDS-UDATE,MKPF-BUDAT등의 필드를 모두 포함해야 합니다. - 사용자 정의 필드와 코드 추가하기: InfoSet에서 'Extras' 탭으로 이동합니다.
ActivityName,EventTime,SourceSystem,LastDataUpdate의 사용자 정의 필드를 만들고 쿼리 섹션에 정의된 로직에 따라 값을 채우는 ABAP 코드를 작성해야 합니다. 상태 변경, 확인, 자재 문서를 순회하며 각 업무 이벤트에 대한 개별 레코드를 생성하는 로직이 필요합니다. 표 형식 데이터를 InfoSet 코드 섹션에서 이벤트 로그 형식으로 변환하는 가장 복잡한 단계입니다. - InfoSet 생성 및 저장하기: 조인, 필드, 사용자 정의 코드를 모두 설정한 뒤 InfoSet을 저장하고 생성합니다.
- SAP Query 만들기: 트랜잭션 코드
SQ01을 사용합니다. 앞 단계에서 만든 InfoSet을 기반으로 새 쿼리를 만듭니다. 예를 들어ZPP_EVENTS라는 이름을 지정합니다. - 쿼리 레이아웃 설계하기: 쿼리 디자이너에서 선택 화면 필드를 정의합니다. 생산 오더
AUFNR, 공장WERKS, 오더 유형AUART, 오더 생성일AUFK-ERDAT의 날짜 범위 등을 선택할 수 있습니다. - 출력 목록 정의하기: 보고서에 표시할 필드를 선택합니다.
ActivityName및EventTime과 같은 사용자 정의 필드를 포함해 이벤트 로그에 필요한 열과 정확히 일치해야 합니다. - 쿼리 실행하기: 원하는 선택 조건으로 쿼리를 실행합니다. 예를 들어 최근 3~6개월의 생산 오더를 조회합니다.
- 데이터 내보내기: 쿼리 결과가 표시되면 목록을 내보냅니다. 일반적으로 '스프레드시트' 또는 탭으로 구분된 형식이나 CSV 형식의 '로컬 파일'을 사용하는 것이 가장 안정적입니다.
- ProcessMind에 맞게 형식 지정하기: 내보낸 파일을 스프레드시트 프로그램에서 엽니다. 열 이름이 필수 속성(
ProductionOrder,ActivityName,EventTime등)과 일치하는지 확인하고,EventTime의 날짜 및 시간 형식이 일관되고 요구되는 표준(예: YYYY-MM-DD HH:MI:SS)에 맞는지 확인합니다. 업로드할 CSV 파일로 저장합니다.
구성
- InfoSet 조인: 이 방법은 헤더, 상태, 확인, 자재 이동 테이블을 복잡하게 조인하는 InfoSet을 기반으로 합니다. 주요 조인은
AUFK->AFKO,AUFK->JEST->JCDS,AUFK->AFRU,AUFK->MSEG->MKPF입니다. 조인이 잘못되거나 비효율적이면 성능이 저하되거나 데이터가 부정확해질 수 있습니다. - 선택 조건: 시스템 성능 문제를 방지하려면 관리 가능한 범위로 선택 조건을 설정해야 합니다. 쿼리 시작 화면에 다음 주요 선택 필드를 포함하세요.
- 생산 공장 (
AUFK-WERKS) - 생산 오더 유형 (
AUFK-AUART) - 오더 생성일 (
AUFK-ERDAT): 데이터 규모를 관리할 수 있도록 최근 3~6개월의 데이터를 추출하는 것이 좋습니다.
- 생산 공장 (
- 시스템 상태: '생성', '릴리스', '기술적 완료', '취소'와 같은 이벤트를 식별하는 로직은 특정 시스템 상태 코드(예: I0001, I0002, I0045, I0047)에 따라 달라집니다. 일반적으로 SAP 시스템 간에 표준화되어 있지만, 실제 값을 확인해야 합니다.
- 이동 유형: '자재 출고' 및 '입고'와 같은 이벤트는 특정 이동 유형(
MSEG-BWART)으로 식별합니다. 일반적으로 각각 '261'과 '101'을 사용합니다. 조직의 구성에 맞는 값인지 확인하세요. - 권한: 쿼리 실행 사용자에게
SQ01,SQ02,SQ03트랜잭션을 사용할 권한과 기반 테이블(AUFK, AFKO, JEST, JCDS, AFRU, MSEG, MKPF)을 조회할 권한이 필요합니다.
샘플 쿼리 abap
/*
The following ABAP-style SQL script represents the complete logic required to build the event log.
This logic must be implemented within the code sections of the SQ02 InfoSet, as a direct SQL query of this nature is not run.
Each SELECT block corresponds to a specific business activity.
*/
-- 1. Production Order Created
SELECT
AUFK.AUFNR AS ProductionOrder,
'Production Order Created' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0001' AND JCDS.INACT = ''
UNION ALL
-- 2. Material Availability Checked (using 'Material shortage' status as an indicator)
SELECT
AUFK.AUFNR AS ProductionOrder,
'Material Availability Checked' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0033' AND JCDS.INACT = '' -- I0033 is MSPT (Material Shortage)
UNION ALL
-- 3. Production Order Released
SELECT
AUFK.AUFNR AS ProductionOrder,
'Production Order Released' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0002' AND JCDS.INACT = ''
UNION ALL
-- 4. Order Data Changed (using last change date as a proxy)
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Data Changed' AS ActivityName,
CAST(AUFK.AEDAT AS VARCHAR(8)) || ' 000000' AS EventTime, -- Time is not available in AUFK
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
WHERE AUFK.AEDAT IS NOT NULL AND AUFK.AEDAT > AUFK.ERDAT
UNION ALL
-- 5. Goods Issue Posted
SELECT
AUFK.AUFNR AS ProductionOrder,
'Goods Issue Posted' AS ActivityName,
CAST(MKPF.BUDAT AS VARCHAR(8)) || ' ' || CAST(MKPF.CPUTM AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN MSEG ON AUFK.AUFNR = MSEG.AUFNR
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART = '261'
UNION ALL
-- 6. First Confirmation Recorded
SELECT
CONF.ProductionOrder,
'First Confirmation Recorded' AS ActivityName,
CONF.EventTime,
CONF.ProductionPlant,
CONF.ProductCode,
CONF.PlannedQuantity,
CONF.DeliveredQuantity,
CONF.ActualStartDate,
CONF.ActualEndDate,
CONF.SourceSystem,
CONF.LastDataUpdate
FROM (
SELECT
AUFK.AUFNR AS ProductionOrder,
CAST(AFRU.BUDAT AS VARCHAR(8)) || ' ' || CAST(AFRU.ERFZEIT AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
ROW_NUMBER() OVER(PARTITION BY AUFK.AUFNR ORDER BY AFRU.BUDAT, AFRU.ERFZEIT) as rn
FROM AUFK
JOIN AFRU ON AUFK.AUFNR = AFRU.AUFNR
) AS CONF
WHERE CONF.rn = 1
UNION ALL
-- 7. Intermediate Confirmation Recorded
SELECT
AUFK.AUFNR AS ProductionOrder,
'Intermediate Confirmation Recorded' AS ActivityName,
CAST(AFRU.BUDAT AS VARCHAR(8)) || ' ' || CAST(AFRU.ERFZEIT AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN AFRU ON AUFK.AUFNR = AFRU.AUFNR
WHERE AFRU.AUERU = 'T' -- T = Partial Confirmation
UNION ALL
-- 8. Final Confirmation Recorded
SELECT
AUFK.AUFNR AS ProductionOrder,
'Final Confirmation Recorded' AS ActivityName,
CAST(AFRU.BUDAT AS VARCHAR(8)) || ' ' || CAST(AFRU.ERFZEIT AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN AFRU ON AUFK.AUFNR = AFRU.AUFNR
WHERE AFRU.AUERU = 'E' -- E = Final Confirmation
UNION ALL
-- 9. Goods Receipt Posted
SELECT
AUFK.AUFNR AS ProductionOrder,
'Goods Receipt Posted' AS ActivityName,
CAST(MKPF.BUDAT AS VARCHAR(8)) || ' ' || CAST(MKPF.CPUTM AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN MSEG ON AUFK.AUFNR = MSEG.AUFNR
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART = '101'
UNION ALL
-- 10. Order Technically Completed
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Technically Completed' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0045' AND JCDS.INACT = ''
UNION ALL
-- 11. Order Settlement Ran (using 'Closed' status as proxy)
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Settlement Ran' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0046' AND JCDS.INACT = '' -- I0046 is CLSD (Closed)
UNION ALL
-- 12. Order Cancellation Set
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Cancellation Set' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0047' AND JCDS.INACT = '' -- I0047 is CNF (Confirmed), use I0076 for Canceled. Recorrecting. Use Deletion Flag instead.
-- Corrected Logic for Cancellation:
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Cancellation Set' AS ActivityName,
CAST(AUFK.AEDAT AS VARCHAR(8)) || ' 000000' AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
WHERE AUFK.LOEKZ = 'X'; 단계
- 데이터베이스 액세스 설정: SAP ECC 데이터베이스에 대한 읽기 전용 자격 증명을 받습니다. 서버 주소, 포트, 데이터베이스 이름, 사용자 이름, 비밀번호가 필요합니다. 이 액세스는 필수이며 SAP Basis 및 데이터베이스 관리 팀과 협의해야 합니다.
- SAP 스키마 확인: SAP 테이블이 저장된 데이터베이스 스키마를 확인합니다. 보통
SAPSR3또는 시스템별로 지정된 유사한 이름을 사용합니다. 쿼리의[Your SAP Schema]자리표시자를 이 값으로 바꿔야 합니다. - SQL 쿼리 준비:
query섹션에 제공된 전체 SQL 쿼리를 복사합니다. 지정된 모든 활동을 단일 이벤트 로그 형식으로 추출하도록 설계된 쿼리입니다. - 쿼리 매개변수 설정: 실행 전에 쿼리의 자리표시자를 수정합니다. 추출 기간을 지정하도록
[Start Date]와[End Date]를 설정합니다. 데이터량을 제한하려면 생산 공장(WERKS) 또는 오더 유형(AUART)으로 필터링하는 것이 좋습니다. - 연결 및 실행: DBeaver, SAP HANA Studio와 같은 표준 SQL 클라이언트나 사용자 정의 스크립트(Python, Java)를 사용해 1단계에서 받은 자격 증명으로 SAP 데이터베이스에 연결합니다.
- 쿼리 실행: 설정한 SQL 쿼리를 클라이언트에 붙여 넣고 실행합니다. 날짜 범위와 시스템 규모에 따라 완료까지 몇 분 정도 걸릴 수 있습니다.
- 결과 미리 확인: 쿼리가 완료되면 처음 몇백 개 행을 살펴
ProductionOrder,ActivityName,EventTime등의 열에 올바르고 타당한 값이 입력되었는지 확인합니다. - CSV로 내보내기: SQL 클라이언트에서 전체 결과를 CSV 파일로 내보냅니다. 문자 깨짐을 방지하려면 UTF-8 인코딩을 사용하세요.
- 업로드용 CSV 마무리: CSV 파일을 열어 열 이름이 필수 속성(
ProductionOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate등)과 일치하는지 확인합니다.EventTime열의 형식이YYYY-MM-DD HH:MI:SS와 같이 일관적인지도 확인합니다. - ProcessMind에 업로드: 준비한 CSV 파일을 ProcessMind 플랫폼에 업로드해 분석할 수 있습니다.
구성
- 데이터베이스 스키마: 생산 계획 테이블이 있는 SAP 스키마를 지정해야 합니다. 쿼리의
[Your SAP Schema]자리표시자를 해당 환경의 올바른 이름으로 바꿉니다. 예:SAPSR3. - 날짜 범위: 성능을 위해 특정 날짜 범위로 필터링해야 합니다. 쿼리는 오더 생성일(
AUFK.ERDAT)을 기준으로 필터링합니다. 데이터량을 관리할 수 있도록 최근 3~6개월부터 시작하는 것이 좋습니다. - 생산 오더 유형: 분석 범위를 좁히려면 생산 오더 유형 필드(
AUFK.AUART)로 쿼리를 필터링합니다. 이를 통해 표준 생산 오더, 프로세스 오더, 재작업 오더 등 특정 유형을 포함하거나 제외할 수 있습니다. - 생산 공장: 하나 이상의 생산 공장(
AFKO.WERKS)으로 필터링하는 것이 좋습니다. 모든 공장의 데이터를 한 번에 추출하면 리소스가 많이 소모될 수 있습니다. - 데이터베이스 액세스: 이 방법을 사용하려면 최소한 다음 테이블에 대한 읽기 권한이 있는 데이터베이스 사용자가 필요합니다:
AUFK,AFKO,JCDS,JEST,AFRU,MSEG,MKPF. 모든 SAP 사용자에게 데이터베이스 직접 액세스 권한이 기본으로 제공되는 것은 아니며 별도 권한이 필요합니다.
샘플 쿼리 sql
WITH Orders AS (
SELECT
aufk.AUFNR AS ProductionOrder,
afko.WERKS AS ProductionPlant,
afko.PLNBEZ AS ProductCode,
afko.GAMNG AS PlannedQuantity,
afko.GMEIN AS PlannedUnit,
afko.GEMNG AS DeliveredQuantity,
CASE
WHEN afko.GSTRI = '00000000' THEN NULL
ELSE TO_TIMESTAMP(afko.GSTRI || afko.GSUZI, 'YYYYMMDDHH24MISS')
END AS ActualStartDate,
CASE
WHEN afko.GETRI = '00000000' THEN NULL
ELSE TO_TIMESTAMP(afko.GETRI || afko.GEUZI, 'YYYYMMDDHH24MISS')
END AS ActualEndDate,
aufk.OBJNR,
aufk.ERDAT AS CreationDate,
aufk.ERFAS AS CreationTime
FROM
"[Your SAP Schema]".AUFK aufk
JOIN
"[Your SAP Schema]".AFKO afko ON aufk.AUFNR = afko.AUFNR
WHERE
aufk.AUTYP = '10' -- Filter for Production Orders
AND aufk.ERDAT BETWEEN '[Start Date]' AND '[End Date]'
-- AND afko.WERKS IN ('[Your Plant]', '[Another Plant]') -- Optional: Filter by Plant
-- AND aufk.AUART IN ('[Your Order Type]') -- Optional: Filter by Order Type
),
Confirmations AS (
SELECT
o.ProductionOrder,
a.RUECK AS ConfirmationNumber,
a.RMZHL AS ConfirmationCounter,
TO_TIMESTAMP(a.BUDAT || a.UZEIT, 'YYYYMMDDHH24MISS') AS EventTime,
a.AUERU AS IsFinalConfirmation,
ROW_NUMBER() OVER(PARTITION BY o.ProductionOrder ORDER BY TO_TIMESTAMP(a.BUDAT || a.UZEIT, 'YYYYMMDDHH24MISS') ASC) as rn_asc,
ROW_NUMBER() OVER(PARTITION BY o.ProductionOrder ORDER BY TO_TIMESTAMP(a.BUDAT || a.UZEIT, 'YYYYMMDDHH24MISS') DESC) as rn_desc
FROM
Orders o
JOIN
"[Your SAP Schema]".AFRU a ON o.ProductionOrder = a.AUFNR
)
-- 1. Production Order Created
SELECT
o.ProductionOrder,
'Production Order Created' AS ActivityName,
TO_TIMESTAMP(o.CreationDate || o.CreationTime, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
UNION ALL
-- 2. Material Availability Checked (using 'Material Committed' status as proxy)
SELECT
o.ProductionOrder,
'Material Availability Checked' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0006' AND jcds.INACT != 'X'
UNION ALL
-- 3. Production Order Released
SELECT
o.ProductionOrder,
'Production Order Released' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0002' AND jcds.INACT != 'X'
UNION ALL
-- 4. Order Data Changed
SELECT
o.ProductionOrder,
'Order Data Changed' AS ActivityName,
TO_TIMESTAMP(aufk.AEDAT || aufk.AEZEIT, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".AUFK aufk ON o.ProductionOrder = aufk.AUFNR
WHERE aufk.AEDAT > o.CreationDate
UNION ALL
-- 5. Goods Issue Posted
SELECT
o.ProductionOrder,
'Goods Issue Posted' AS ActivityName,
TO_TIMESTAMP(mkpf.CPUDT || mkpf.CPUTM, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".MSEG mseg ON o.ProductionOrder = mseg.AUFNR
JOIN "[Your SAP Schema]".MKPF mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
WHERE mseg.BWART = '261'
UNION ALL
-- 6. First Confirmation Recorded
SELECT
c.ProductionOrder,
'First Confirmation Recorded' AS ActivityName,
c.EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Confirmations c
JOIN Orders o ON c.ProductionOrder = o.ProductionOrder
WHERE c.rn_asc = 1
UNION ALL
-- 7. Intermediate Confirmation Recorded
SELECT
c.ProductionOrder,
'Intermediate Confirmation Recorded' AS ActivityName,
c.EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Confirmations c
JOIN Orders o ON c.ProductionOrder = o.ProductionOrder
WHERE c.rn_asc > 1 AND c.IsFinalConfirmation IS NULL
UNION ALL
-- 8. Final Confirmation Recorded
SELECT
c.ProductionOrder,
'Final Confirmation Recorded' AS ActivityName,
c.EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Confirmations c
JOIN Orders o ON c.ProductionOrder = o.ProductionOrder
WHERE c.IsFinalConfirmation = 'X'
UNION ALL
-- 9. Goods Receipt Posted
SELECT
o.ProductionOrder,
'Goods Receipt Posted' AS ActivityName,
TO_TIMESTAMP(mkpf.CPUDT || mkpf.CPUTM, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".MSEG mseg ON o.ProductionOrder = mseg.AUFNR
JOIN "[Your SAP Schema]".MKPF mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
WHERE mseg.BWART = '101'
UNION ALL
-- 10. Order Technically Completed
SELECT
o.ProductionOrder,
'Order Technically Completed' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0045' AND jcds.INACT != 'X'
UNION ALL
-- 11. Order Settlement Ran
SELECT
o.ProductionOrder,
'Order Settlement Ran' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0046' AND jcds.INACT != 'X'
UNION ALL
-- 12. Order Cancellation Set
SELECT
o.ProductionOrder,
'Order Cancellation Set' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTime, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0076' AND jcds.INACT != 'X'; 단계
- SAP ECC PP의 생산 오더 처리, 확정, 재고 관리 및 관리회계 데이터가 제공되는지 확인합니다. 추출 사용자에게 필요한 애플리케이션 테이블을 읽고 사용자 지정 ABAP 보고서를 실행할 권한이 있는지도 확인합니다.
- ABAP Workbench에서 SE38 또는 SE80 트랜잭션을 사용해 [사용자 지정 보고서 이름]과 같은 전용 실행 보고서를 만듭니다. [시작일]과 [종료일]처럼 필수 날짜 매개변수를 입력하는 선택 화면을 구성하고, [회사 코드], [생산 플랜트], [오더 유형], [자재], [생산 오더]는 선택 필터로 추가합니다.
- AUFK와 SAP ECC 시스템에 구성된 생산 오더 테이블에서 생산 오더 헤더 및 마스터 데이터를 읽습니다. JCDS와 해당 상태 설정을 사용해 CRTD, 릴리스, 기술적 완료, 취소 관련 상태를 포함한 명시적 상태 변경을 식별합니다. 상태 이력에 타임스탬프가 있는 변경 기록이 없다면 상태 코드만으로 이벤트를 추정하지 않습니다.
- 시스템에 구성된 생산 오더 가용성 점검 데이터에서 자재 가용성 점검 결과를 읽습니다. 오더 및 타임스탬프와 안정적으로 연결할 수 있는 테이블에 점검 결과가 저장되지 않는 경우, SAP 팀이 승인한 설정된 SAP 확장 기능, 애플리케이션 로그 또는 감사 데이터 소스를 구현합니다. 오더 생성이나 릴리스만으로 점검을 추정하지 않습니다.
- 설정된 생산 오더 변경 문서 객체와 관련 변경 문서 테이블에서 오더 변경 이력을 읽습니다. 계획 수량, 날짜, BOM, 라우팅 등 프로세스 책임자가 승인한 주요 변경 사항만 추출합니다. 변경 문서 타임스탬프를 EventTime으로 사용합니다.
- 시스템에 구성된 재고 자재 문서 데이터에서 자재 출고 및 입고 전기를 읽습니다. 자재 문서 데이터에 있는 오더 참조를 사용해 전기 내역을 생산 오더와 연결합니다. 구성품 출고는 Goods Issue Posted, 완제품 입고는 Goods Receipt Posted로 분류합니다. 가능한 경우 전기 날짜와 시간을 사용합니다.
- 시스템에 구성된 생산 확정 데이터 소스에서 확정 내역을 읽습니다. 생산 오더와 확정 타임스탬프를 기준으로 정렬합니다. 첫 번째 확정은 First Confirmation Recorded, 최종이 아닌 조건에 해당하는 확정은 Intermediate Confirmation Recorded로 기록합니다. 최종 확정으로 명시되었거나 설정된 확정 완료 로직으로 식별된 확정은 Final Confirmation Recorded로 기록합니다. 임의 쿼리 결과의 마지막 행이라는 이유만으로 최종 확정으로 판단하지 않습니다.
- 시스템에 구성된 관리회계 정산 데이터 소스에서 정산 실행 데이터를 읽습니다. 생산 오더와 연결된 정산 실행 기록, 정산 문서 또는 승인된 정산 상태 이력에 명시적 타임스탬프가 있는 경우에만 Order Settlement Ran을 기록합니다.
- 추출한 각 활동에 대해 내부 이벤트 행을 하나씩 만듭니다. ProductionOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ProductionPlant, ProductCode, PlannedQuantity, DeliveredQuantity, ActualStartDate, ActualEndDate를 입력합니다. 타임스탬프는 일관된 방식으로 변환하고 원본 시스템의 시간대를 유지합니다. 해당 이벤트가 있으면 첫 번째 확정 타임스탬프를 ActualStartDate로, 최종 확정 타임스탬프를 ActualEndDate로 설정합니다.
- 이벤트 행을 ProductionOrder와 EventTime 순으로 정렬하고, 타임스탬프가 같으면 결정적인 보조 정렬 기준을 적용합니다. 원본 레코드가 완전히 중복된 경우에만 제거하고, 정상적으로 반복된 이벤트는 유지합니다. 필수 활동 이름 12개가 모두 출력 스키마에 포함되는지, 각 행에 케이스 식별자, 활동 이름, 이벤트 타임스탬프가 있는지 확인합니다.
- 승인된 ABAP 파일 인터페이스와 설정된 논리 파일 경로를 사용해 애플리케이션 서버 파일로 결과를 기록합니다. ProcessMind 수집 설정에 맞는 구분자와 텍스트 인코딩을 사용하고, 헤더 행을 포함하며, 구분자가 들어간 값은 따옴표로 묶습니다. 타임스탬프 형식은 YYYY-MM-DDThh:mm:ss처럼 일관되게 지정합니다.
- 승인된 SAP 파일 전송 절차에 따라 파일을 다운로드하고 별도로 검토한 다음, ProductionOrder를 케이스 식별자, ActivityName을 활동, EventTime을 이벤트 타임스탬프로 지정해 ProcessMind에 이벤트 로그로 업로드합니다. ProcessMind가 행을 그대로 읽도록 설정되어 있고 누락된 활동을 추정하지 않는지 확인합니다.
구성
- 날짜 범위: 초기 분석에는 최근 3~6개월을 이동 추출 기간으로 사용합니다. 성능과 데이터량을 확인한 뒤에만 기간을 늘립니다. 선택한 시작일 이전에 생성되었지만 분석 기간 중 활성 상태인 오더를 포함하도록 조회 기간을 앞당깁니다.
- 선택 필터: [회사 코드], [생산 플랜트], [오더 유형], [자재], [생산 오더], 오더 상태, 생성일 또는 변경일 필터를 지원합니다. 생산 오더 필드의 제공 여부는 릴리스와 사용자 지정 설정에 따라 다를 수 있으므로 SAP ECC 구현에 맞춰 정확한 필드를 구성합니다.
- 이벤트 범위: 필수 활동 12개를 모두 명시적 이벤트 행으로 추출합니다. Production Order Created, Material Availability Checked, Production Order Released, Order Data Changed, Goods Issue Posted, First Confirmation Recorded, Intermediate Confirmation Recorded, Final Confirmation Recorded, Goods Receipt Posted, Order Technically Completed, Order Settlement Ran, Order Cancellation Set.
- 타임스탬프 정책: 원본 이벤트 날짜와 시간을 우선 사용합니다. 날짜만 있는 경우 정밀도가 낮다는 점을 문서화하고, 임의로 정확한 시간을 만들어 넣는 대신 일관되게 설정된 시간을 사용합니다. 모든 타임스탬프를 ProcessMind에서 사용하는 시간대로 변환합니다.
- 상태 처리: 상태 활동에는 타임스탬프가 있는 상태 이력을 사용합니다. 내부 상태 값과 업무 활동 간 매핑은 시스템 상태 설정을 기준으로 구성하고 프로세스 책임자의 승인을 받습니다.
- 가용성 점검: 가용성 점검 실행에 사용할 승인된 데이터 소스를 설정합니다. 업무상 승인된 데이터 소스에 점검 기록이 명시적으로 남아 있지 않다면 오더 생성, 릴리스, 예약 또는 정상적인 자재 출고만으로 Material Availability Checked 행을 만들지 않습니다.
- 확정 처리: 첫 번째, 중간, 최종 확정을 구분하는 규칙을 설정합니다. 원본에서 최종으로 명시하거나 설정된 SAP 확정 로직으로 완료가 확인된 경우에만 최종 확정으로 처리합니다.
- 수량: 가능한 경우 원본 측정 단위를 유지합니다. 수량을 집계한다면 오더, 자재, 이동, 확정 또는 이벤트 중 어떤 기준으로 집계했는지 문서화합니다. 프로세스 책임자가 달리 승인하지 않는 한 DeliveredQuantity는 확정 수율이 아니라 전기된 완제품 입고 수량을 나타내야 합니다.
- LastDataUpdate: 추출 실행 시각 또는 원본 데이터 갱신 시각을 입력하고, 한 번의 실행에서 모든 행에 동일한 기준을 적용합니다.
- 성능: 선택 범위를 제한하고 필요한 필드만 선택하며, 데이터를 패키지 단위로 처리하고 데이터베이스 측 필터링을 사용합니다. 대규모 반복문 안에서 중첩 데이터베이스 읽기를 피하고, 인덱스는 SAP 데이터베이스 관리 절차에 따라 승인된 경우에만 생성하거나 사용합니다. 메모리 사용량이 우려되면 결과를 나누어 기록합니다.
- 파일 출력: ProcessMind 업로드 사양에 맞춰 애플리케이션 서버 디렉터리, 논리 파일 이름, 구분자, 인코딩, 소수점 형식, 타임스탬프 형식, 헤더 설정을 구성합니다. 보고서나 출력 파일에 인증 정보를 노출하지 않습니다.
- 사전 요건: 해당되는 SAP ECC PP, 재고 관리, 확정, 생산 오더 상태 관리, 관리회계 정산 데이터가 활성화되어 있는지 확인합니다. 실행 전에 필요한 권한, 사용자 지정 개발 관리, 전송 승인, 애플리케이션 서버 파일 접근 권한, ProcessMind 수집 접근 권한을 부여해야 합니다.
- 시스템별 설정: 테이블 이름, 필드, 상태 코드, 변경 문서 객체, 확정 데이터 소스, 가용성 점검 데이터 소스, 정산 데이터 소스를 대상 SAP ECC 시스템에서 확인해야 합니다. 구현 환경에 표준적이고 신뢰할 수 있는 데이터 소스가 없다면 [시스템에 맞게 구성]을 사용합니다.
샘플 쿼리 abap
REPORT [Your custom report name].
* This executable ABAP report is a complete extraction framework for the twelve required activities.
* Replace only the marked system-specific source sections, selection parameters, and file configuration.
* Confirm every table and field against the target SAP ECC system before activation.
PARAMETERS p_from TYPE sydatum OBLIGATORY.
PARAMETERS p_to TYPE sydatum OBLIGATORY.
PARAMETERS p_file TYPE string OBLIGATORY DEFAULT '[Application server file path]'.
PARAMETERS p_src TYPE string OBLIGATORY DEFAULT '[SAP ECC system identifier]'.
SELECT-OPTIONS s_werks FOR [Production plant field].
SELECT-OPTIONS s_aufnr FOR [Production order field].
SELECT-OPTIONS s_auart FOR [Production order type field].
SELECT-OPTIONS s_bukrs FOR [Company code field].
TYPES: BEGIN OF ty_event,
productionorder TYPE string,
activityname TYPE string,
eventtime TYPE string,
sourcesystem TYPE string,
lastdataupdate TYPE string,
productionplant TYPE string,
productcode TYPE string,
plannedquantity TYPE string,
deliveredquantity TYPE string,
actualstartdate TYPE string,
actualenddate TYPE string,
END OF ty_event.
DATA gt_events TYPE STANDARD TABLE OF ty_event WITH EMPTY KEY.
DATA gs_event TYPE ty_event.
DATA gv_update_timestamp TYPE string.
DATA gv_line TYPE string.
GET TIME STAMP FIELD DATA(gv_update_ts).
gv_update_timestamp = |{ gv_update_ts TIMESTAMP = ISO }|.
* Production Order Created
SELECT [Production order field], [Production plant field], [Product field], [Planned quantity field], [Creation date field], [Creation time field]
FROM [Production order header table]
INTO TABLE @DATA(lt_created)
WHERE [Creation date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks
AND [Production order type field] IN @s_auart
AND [Company code field] IN @s_bukrs.
LOOP AT lt_created ASSIGNING FIELD-SYMBOL(<created>).
CLEAR gs_event.
gs_event-productionorder = |{ <created>-[Production order field] }|.
gs_event-activityname = 'Production Order Created'.
gs_event-eventtime = |{ <created>-[Creation date field] } { <created>-[Creation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <created>-[Production plant field] }|.
gs_event-productcode = |{ <created>-[Product field] }|.
gs_event-plannedquantity = |{ <created>-[Planned quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Material Availability Checked
SELECT [Production order field], [Production plant field], [Product field], [Availability check date field], [Availability check time field]
FROM [Availability check source table]
INTO TABLE @DATA(lt_availability)
WHERE [Availability check date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
LOOP AT lt_availability ASSIGNING FIELD-SYMBOL(<availability>).
CLEAR gs_event.
gs_event-productionorder = |{ <availability>-[Production order field] }|.
gs_event-activityname = 'Material Availability Checked'.
gs_event-eventtime = |{ <availability>-[Availability check date field] } { <availability>-[Availability check time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <availability>-[Production plant field] }|.
gs_event-productcode = |{ <availability>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Production Order Released
SELECT [Production order field], [Status change date field], [Status change time field], [Production plant field], [Product field], [Planned quantity field]
FROM [Order status history source table]
INTO TABLE @DATA(lt_released)
WHERE [Status field] = '[Released status code]'
AND [Status change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_released ASSIGNING FIELD-SYMBOL(<released>).
CLEAR gs_event.
gs_event-productionorder = |{ <released>-[Production order field] }|.
gs_event-activityname = 'Production Order Released'.
gs_event-eventtime = |{ <released>-[Status change date field] } { <released>-[Status change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <released>-[Production plant field] }|.
gs_event-productcode = |{ <released>-[Product field] }|.
gs_event-plannedquantity = |{ <released>-[Planned quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Data Changed
SELECT [Production order field], [Change date field], [Change time field], [Production plant field], [Product field], [Changed field name]
FROM [Production order change document source table]
INTO TABLE @DATA(lt_changed)
WHERE [Change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Changed field name] IN ('[Planned quantity field]', '[Basic start date field]', '[Basic finish date field]', '[BOM field]', '[Routing field]').
LOOP AT lt_changed ASSIGNING FIELD-SYMBOL(<changed>).
CLEAR gs_event.
gs_event-productionorder = |{ <changed>-[Production order field] }|.
gs_event-activityname = 'Order Data Changed'.
gs_event-eventtime = |{ <changed>-[Change date field] } { <changed>-[Change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <changed>-[Production plant field] }|.
gs_event-productcode = |{ <changed>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Goods Issue Posted
SELECT [Production order field], [Posting date field], [Posting time field], [Production plant field], [Product field], [Quantity field]
FROM [Material document item source table]
INTO TABLE @DATA(lt_gi)
WHERE [Movement type field] IN ('[Goods issue movement type 1]', '[Goods issue movement type 2]')
AND [Posting date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
LOOP AT lt_gi ASSIGNING FIELD-SYMBOL(<gi>).
CLEAR gs_event.
gs_event-productionorder = |{ <gi>-[Production order field] }|.
gs_event-activityname = 'Goods Issue Posted'.
gs_event-eventtime = |{ <gi>-[Posting date field] } { <gi>-[Posting time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <gi>-[Production plant field] }|.
gs_event-productcode = |{ <gi>-[Product field] }|.
gs_event-deliveredquantity = |{ <gi>-[Quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* First Confirmation Recorded
SELECT [Production order field], [Confirmation date field], [Confirmation time field], [Production plant field], [Product field], [Confirmed quantity field]
FROM [Production confirmation source table]
INTO TABLE @DATA(lt_confirmations)
WHERE [Confirmation date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
SORT lt_confirmations BY [Production order field] [Confirmation date field] [Confirmation time field].
LOOP AT lt_confirmations ASSIGNING FIELD-SYMBOL(<confirmation>) GROUP BY <confirmation>-[Production order field] ASSIGNING FIELD-SYMBOL(<confirmation_group>).
LOOP AT GROUP <confirmation_group> ASSIGNING FIELD-SYMBOL(<first_confirmation>).
CLEAR gs_event.
gs_event-productionorder = |{ <first_confirmation>-[Production order field] }|.
gs_event-activityname = 'First Confirmation Recorded'.
gs_event-eventtime = |{ <first_confirmation>-[Confirmation date field] } { <first_confirmation>-[Confirmation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <first_confirmation>-[Production plant field] }|.
gs_event-productcode = |{ <first_confirmation>-[Product field] }|.
gs_event-actualstartdate = gs_event-eventtime.
APPEND gs_event TO gt_events.
EXIT.
ENDLOOP.
ENDLOOP.
* Intermediate Confirmation Recorded
LOOP AT lt_confirmations ASSIGNING FIELD-SYMBOL(<intermediate>) GROUP BY <intermediate>-[Production order field] ASSIGNING FIELD-SYMBOL(<intermediate_group>).
DATA(lv_intermediate_index) = 0.
DATA(lv_intermediate_count) = GROUP SIZE.
LOOP AT GROUP <intermediate_group> ASSIGNING FIELD-SYMBOL(<intermediate_row>).
lv_intermediate_index = lv_intermediate_index + 1.
IF lv_intermediate_index < lv_intermediate_count AND <intermediate_row>-[Final confirmation indicator field] <> '[Final confirmation value]'.
CLEAR gs_event.
gs_event-productionorder = |{ <intermediate_row>-[Production order field] }|.
gs_event-activityname = 'Intermediate Confirmation Recorded'.
gs_event-eventtime = |{ <intermediate_row>-[Confirmation date field] } { <intermediate_row>-[Confirmation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <intermediate_row>-[Production plant field] }|.
gs_event-productcode = |{ <intermediate_row>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDIF.
ENDLOOP.
ENDLOOP.
* Final Confirmation Recorded
LOOP AT lt_confirmations ASSIGNING FIELD-SYMBOL(<final>) WHERE [Final confirmation indicator field] = '[Final confirmation value]'.
CLEAR gs_event.
gs_event-productionorder = |{ <final>-[Production order field] }|.
gs_event-activityname = 'Final Confirmation Recorded'.
gs_event-eventtime = |{ <final>-[Confirmation date field] } { <final>-[Confirmation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <final>-[Production plant field] }|.
gs_event-productcode = |{ <final>-[Product field] }|.
gs_event-actualenddate = gs_event-eventtime.
APPEND gs_event TO gt_events.
ENDLOOP.
* Goods Receipt Posted
SELECT [Production order field], [Posting date field], [Posting time field], [Production plant field], [Product field], [Quantity field]
FROM [Material document item source table]
INTO TABLE @DATA(lt_gr)
WHERE [Movement type field] IN ('[Goods receipt movement type 1]', '[Goods receipt movement type 2]')
AND [Posting date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<gr>).
CLEAR gs_event.
gs_event-productionorder = |{ <gr>-[Production order field] }|.
gs_event-activityname = 'Goods Receipt Posted'.
gs_event-eventtime = |{ <gr>-[Posting date field] } { <gr>-[Posting time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <gr>-[Production plant field] }|.
gs_event-productcode = |{ <gr>-[Product field] }|.
gs_event-deliveredquantity = |{ <gr>-[Quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Technically Completed
SELECT [Production order field], [Status change date field], [Status change time field], [Production plant field], [Product field]
FROM [Order status history source table]
INTO TABLE @DATA(lt_teco)
WHERE [Status field] = '[Technically completed status code]'
AND [Status change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_teco ASSIGNING FIELD-SYMBOL(<teco>).
CLEAR gs_event.
gs_event-productionorder = |{ <teco>-[Production order field] }|.
gs_event-activityname = 'Order Technically Completed'.
gs_event-eventtime = |{ <teco>-[Status change date field] } { <teco>-[Status change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <teco>-[Production plant field] }|.
gs_event-productcode = |{ <teco>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Settlement Ran
SELECT [Production order field], [Settlement date field], [Settlement time field], [Production plant field], [Product field]
FROM [Order settlement source table]
INTO TABLE @DATA(lt_settlement)
WHERE [Settlement date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_settlement ASSIGNING FIELD-SYMBOL(<settlement>).
CLEAR gs_event.
gs_event-productionorder = |{ <settlement>-[Production order field] }|.
gs_event-activityname = 'Order Settlement Ran'.
gs_event-eventtime = |{ <settlement>-[Settlement date field] } { <settlement>-[Settlement time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <settlement>-[Production plant field] }|.
gs_event-productcode = |{ <settlement>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Cancellation Set
SELECT [Production order field], [Status change date field], [Status change time field], [Production plant field], [Product field]
FROM [Order status history source table]
INTO TABLE @DATA(lt_cancelled)
WHERE [Status field] IN ('[Cancellation status code]', '[Deletion status code]')
AND [Status change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_cancelled ASSIGNING FIELD-SYMBOL(<cancelled>).
CLEAR gs_event.
gs_event-productionorder = |{ <cancelled>-[Production order field] }|.
gs_event-activityname = 'Order Cancellation Set'.
gs_event-eventtime = |{ <cancelled>-[Status change date field] } { <cancelled>-[Status change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <cancelled>-[Production plant field] }|.
gs_event-productcode = |{ <cancelled>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
SORT gt_events BY productionorder eventtime activityname.
DELETE ADJACENT DUPLICATES FROM gt_events COMPARING productionorder activityname eventtime productionplant productcode.
OPEN DATASET p_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'The application server output file could not be opened' TYPE 'E'.
ENDIF.
TRANSFER 'ProductionOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ProductionPlant,ProductCode,PlannedQuantity,DeliveredQuantity,ActualStartDate,ActualEndDate' TO p_file.
LOOP AT gt_events INTO gs_event.
gv_line = |{ gs_event-productionorder },{ gs_event-activityname },{ gs_event-eventtime },{ gs_event-sourcesystem },{ gs_event-lastdataupdate },{ gs_event-productionplant },{ gs_event-productcode },{ gs_event-plannedquantity },{ gs_event-deliveredquantity },{ gs_event-actualstartdate },{ gs_event-actualenddate }|.
TRANSFER gv_line TO p_file.
ENDLOOP.
CLOSE DATASET p_file.
MESSAGE |Event log written to { p_file }| TYPE 'S'. 시작할 준비가 되셨나요?
이 템플릿으로 데이터를 준비하고 생산 계획 프로세스 개선을 시작하세요. 인사이트를 확인하고 운영을 효율화할 수 있습니다.
생산 계획을 최적화해 효율을 높이세요
비효율을 찾아 처리 주기를 30% 단축하고 목표를 달성하세요.
신용카드가 필요하지 않습니다. 지금 시작해 최적화를 진행하세요.