공급망 관리 데이터 템플릿
공급망 관리 데이터 템플릿
- 수집 권장 속성
- 추적할 주요 활동
- 데이터 추출 안내
공급망 관리 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 물류 오더 LogisticsOrder | 최초 수요부터 최종 납품 확인까지, 공급망 프로세스 전체를 식별하는 고유 ID입니다. | ||
| 설명 물류 오더는 기본 케이스 식별자로, 공급망에서 특정 수요 또는 이행 요청과 관련된 모든 활동을 연결합니다. 이를 통해 계획과 조달부터 생산과 유통까지 제품의 전체 흐름을 추적하고 프로세스 전반을 파악할 수 있습니다. process mining에서 물류 오더를 기준으로 분석하면 수요를 충족하기까지의 전체 경로를 확인할 수 있습니다. 조달이나 영업처럼 분리된 프로세스를 따로 보는 대신, 공급망 전체에서 자주 나타나는 변형, 병목, 편차를 찾을 수 있습니다. 중요한 이유 관련 이벤트를 하나의 프로세스 인스턴스로 연결하는 데 필요한 식별자입니다. 이를 통해 공급망을 처음부터 끝까지 분석할 수 있습니다. 확보 방법 개념상 식별자이므로 판매 오더 번호와 후속 구매 오더 및 납품 번호를 연결해 구성해야 할 수 있습니다. SAP S/4HANA Supply Chain 문서를 참고하거나 해당 분야 전문가에게 문의하세요. 예시 LO-4500078192LO-4500078193LO-4500078194 | |||
| 이벤트 시간 EventTime | 활동이 발생한 날짜와 시간을 나타내는 타임스탬프입니다. | ||
| 설명 이 속성은 프로세스의 각 활동이 발생한 정확한 날짜와 시간을 제공합니다. 실제 발생 순서에 따라 프로세스 단계를 정렬하는 이벤트 로그의 시간 기준이 됩니다. 이벤트 시간은 시간 기반 분석에 필수입니다. 활동 간 처리 시간을 계산하고, 프로세스의 전체 리드 타임을 측정하며, 시간에 따른 성과 추이를 파악하고, 병목이 발생하기 쉬운 시점을 찾는 데 사용됩니다. 중요한 이유 모든 소요 시간과 성과 지표를 계산하는 데 필요한 타임스탬프입니다. 이를 통해 프로세스의 병목과 리드 타임을 분석할 수 있습니다. 확보 방법 CDHDR/CDPOS 변경 문서 테이블의 타임스탬프 필드나 헤더 테이블의 ERDAT/ERZET 같은 날짜·시간 필드 등, 핵심 SAP 테이블에서 문서 생성 또는 상태 변경과 관련된 값을 추출합니다. 예시 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| 활동 이름 ActivityName | 공급망 프로세스의 특정 시점에 발생한 업무 활동 또는 이벤트의 이름입니다. | ||
| 설명 이 속성은 물류 오더의 생애주기에서 '구매 오더 발행'이나 '출고 전기 완료'와 같은 특정 단계 또는 주요 시점을 나타냅니다. 이러한 활동이 모여 프로세스의 이벤트 순서를 이룹니다. 활동 순서 분석은 process mining의 기본입니다. 실제 프로세스 흐름을 발견하고 표준 운영 절차와 비교하며, 지연이나 재작업을 유발하는 단계를 찾을 수 있습니다. 중요한 이유 프로세스 단계를 정의하는 속성으로, 프로세스 맵을 발견하고 변형을 분석하며 활동 간 처리 시간을 측정하는 데 필요합니다. 확보 방법 데이터 변환 과정에서 여러 SAP 테이블(예: EKKO, LIKP, VBUK)의 트랜잭션 코드나 상태 변경을 사용자가 이해하기 쉬운 활동 이름에 매핑해 생성합니다. 예시 구매 주문 발행구매 주문 입고 전기출고 배송 생성인도 증명 확인 | |||
| 소스 시스템 SourceSystem | 데이터가 생성된 시스템입니다. | ||
| 설명 이벤트 데이터가 생성된 특정 소스 시스템 인스턴스를 식별합니다. 복잡한 시스템 환경에서는 지역이나 사업부별로 여러 SAP S/4HANA 인스턴스를 운영할 수 있습니다. 이 속성은 데이터 거버넌스와 분석 범위 구분에 중요합니다. 분석가는 시스템별 프로세스 성과를 비교하거나 신뢰할 수 있는 단일 소스의 데이터만 분리해 볼 수 있습니다. 중요한 이유 데이터 출처를 파악하는 데 필요한 맥락을 제공하므로, 데이터 검증과 서로 다른 시스템 환경 간 프로세스 비교에 유용합니다. 확보 방법 일반적으로 데이터 추출 과정에서 출처를 식별하기 위해 추가하는 고정값입니다. 예를 들어 SAP 시스템 ID(SAPSID)를 사용할 수 있습니다. 예시 S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| 최종 데이터 업데이트 LastDataUpdate | 소스 시스템에서 데이터를 마지막으로 새로 고치거나 추출한 시각입니다. | ||
| 설명 이 속성은 이벤트 로그 데이터가 마지막으로 업데이트된 시점을 나타냅니다. 분석 대상 데이터의 최신성을 보여 주므로 사용자가 데이터의 시의성을 파악할 수 있습니다. 분석 결과를 바탕으로 판단하려면 데이터가 얼마나 최신인지 알아야 합니다. 이 타임스탬프를 통해 데이터의 신뢰성과 대시보드 및 KPI가 다루는 기간을 확인할 수 있습니다. 중요한 이유 데이터 최신성을 투명하게 보여 주어 사용자가 프로세스 분석이 어느 시점까지의 데이터를 반영하는지 알 수 있습니다. 확보 방법 일반적으로 데이터 추출 도구나 ETL 도구가 데이터 새로 고침을 성공적으로 마친 뒤 생성하고 채우는 메타데이터 필드입니다. 예시 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| 고객 이름 CustomerName | 주문 이행 대상 고객의 이름입니다. | ||
| 설명 이 속성은 판매 오더 및 후속 이행 활동과 관련된 최종 고객을 식별합니다. 공급망 프로세스에서 수요 측면을 파악하는 데 필요한 맥락을 제공합니다. process mining에서 고객별 분석을 수행하면 주요 고객 계정별 이행 방식이나 성과 수준의 차이를 찾을 수 있습니다. 인도 증명 지연 분석 같은 대시보드에서 특정 고객의 확인이 반복적으로 늦어지는지 살펴볼 때 사용합니다. 중요한 이유 고객별로 분석 범위를 나누어 고객별 행동, 병목, 서비스 수준 계약 성과를 파악할 수 있습니다. 확보 방법 고객 번호(KUNNR)는 판매 문서(예: VBAK 테이블)에 저장됩니다. 이름은 중앙 고객 마스터 테이블 KNA1에서 가져옵니다. 예시 Retail CorpInnovate SolutionsManufacturing Partners | |||
| 공급업체 이름 SupplierName | 조달 활동과 관련된 공급업체의 이름입니다. | ||
| 설명 이 속성은 상품이나 서비스를 조달하는 공급업체를 식별합니다. 일반적으로 '구매 요청 생성'이나 '구매 오더 발행' 같은 활동과 연결됩니다. 공급업체 이름은 공급업체 납품 성과 대시보드에 필요한 속성입니다. 이를 기준으로 데이터를 필터링하고 구분해 공급업체별 정시 납품률, 리드 타임, 품질 수준을 비교할 수 있습니다. 이는 전략적 소싱과 공급업체 관계 관리에 중요합니다. 중요한 이유 공급업체별 성과를 분석해 조달 프로세스를 개선하고 공급업체의 신뢰성을 평가할 수 있습니다. 확보 방법 공급업체 번호(LIFNR)는 구매 문서(예: EKKN, EBAN 테이블)에 저장됩니다. 이름은 중앙 공급업체 마스터 테이블 LFA1에서 가져옵니다. 예시 Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| 실행 사용자 ExecutingUser | 활동을 실행한 사람의 사용자 ID입니다. | ||
| 설명 이 속성은 구매 오더 생성이나 입고 전기 같은 활동을 수행한 직원의 SAP 사용자 이름 또는 ID를 기록합니다. 프로세스 단계와 해당 업무를 수행한 인력을 연결합니다. 사용자별 분석을 통해 업무량 분포를 파악하고 교육이 필요한 부분을 찾으며 개인이나 팀 간 성과 차이를 확인할 수 있습니다. 중요한 프로세스 단계를 누가 수행했는지 확인하는 규정 준수 분석에도 유용합니다. 중요한 이유 활동을 특정 사용자와 연결해 업무량 분석, 성과 비교, 규정에 어긋난 작업 조사에 활용할 수 있습니다. 확보 방법 EKKO(구매 오더 헤더)의 ERNAM, LIKP(납품 헤더), VBRK(청구서 헤더) 등 여러 SAP 테이블의 '생성자' 또는 '변경자' 필드에서 확인할 수 있습니다. 예시 CBROWNJSMITHASINGH | |||
| 요청 납품일 RequestedDeliveryDate | 공급업체에 상품 납품을 요청한 날짜입니다. | ||
| 설명 구매 오더에 지정된 납품일로, 공급업체가 맞춰야 할 목표 날짜입니다. 실제 납품 성과를 측정할 때 기준으로 사용합니다. 이 날짜는 공급업체 정시 납품률 KPI 계산에 필요합니다. 실제 입고일과 요청 납품일을 비교하면 공급업체가 약속을 지켰는지 객관적으로 측정할 수 있습니다. 중요한 이유 공급업체 정시 납품률 KPI를 계산하는 기준 날짜로, 공급업체 성과 관리에 중요합니다. 확보 방법 구매 오더 품목 테이블 EKPO의 EINDT 필드(납품일)에서 확인할 수 있습니다. 예시 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| 자재 번호 MaterialNumber | 처리 중인 제품 또는 자재를 식별하는 고유 번호입니다. | ||
| 설명 SKU라고도 하는 자재 번호는 SAP에서 특정 제품을 식별하는 고유 코드입니다. 프로세스 활동을 제조, 조달 또는 출하되는 실물·디지털 상품과 연결합니다. 이 속성은 제품 중심 분석에 중요합니다. 특정 제품에서 품질 문제, 생산 지연, 재고 부족이 더 자주 발생하는지 파악할 수 있습니다. 대시보드에서 자재별로 필터링해 특정 제품군의 성과를 조사할 수 있습니다. 중요한 이유 제품별 분석을 통해 지연이나 품질 문제 같은 프로세스 이슈가 특정 자재에 집중되는지 파악할 수 있습니다. 확보 방법 판매 오더의 VBAP, 구매 오더의 EKPO, 납품의 LIPS 등 대부분의 문서 품목 테이블에서 확인할 수 있습니다. 필드 이름은 일반적으로 MATNR입니다. 예시 FG-100-ARM-2034-BSA-5500 | |||
| 품질 검사 결과 QualityInspectionResult | '합격' 또는 '불합격'과 같은 품질 검사 결과입니다. | ||
| 설명 이 속성은 생산하거나 입고한 상품의 품질 검사 결과를 기록합니다. 결과에 따라 상품을 다음 단계로 진행할지, 재작업·반품·폐기할지 결정합니다. 품질 관리 불합격률 대시보드와 KPI에 필요한 속성입니다. 불합격 빈도와 원인을 분석하면 특정 제품, 공급업체 또는 생산 라인에서 반복되는 품질 문제를 찾을 수 있습니다. 중요한 이유 품질 관련 KPI를 직접 계산하고 공급망에서 품질 저하가 발생하는 원인을 찾는 데 도움이 됩니다. 확보 방법 일반적으로 품질 관리(QM) 모듈에 저장됩니다. QALS 같은 검사 로트 테이블과 QAVE의 사용 결정 코드에서 데이터를 가져올 수 있습니다. 예시 합격불합격재작업 필요편차 승인 후 합격 | |||
| 플랜트 Plant | 활동이 수행된 제조 또는 유통 시설입니다. | ||
| 설명 플랜트는 상품을 생산, 보관 또는 유통하는 위치를 나타내는 SAP 조직 단위입니다. 프로세스 활동의 지리적·기능적 맥락을 제공합니다. 플랜트별 프로세스 성과 분석은 일반적인 요구 사항입니다. 운영 현장별 효율성, 처리량, 규정 준수를 비교하고 기준이 될 만한 우수 사례나 개선이 필요한 위치를 찾을 수 있습니다. 중요한 이유 분석에 지리적 또는 조직적 기준을 제공해 시설별 성과를 비교할 수 있습니다. 확보 방법 판매 VBAP, 구매 EKPO, 납품 LIPS 등 여러 문서 품목 테이블에서 확인할 수 있습니다. 필드 이름은 일반적으로 WERKS입니다. 예시 100021003500 | |||
| 구매 오더 번호 PurchaseOrderNumber | 구매 오더(PO) 문서를 식별하는 고유 번호입니다. | ||
| 설명 구매 오더 번호는 공급업체에 자재를 주문할 때 사용하는 공식 문서 번호입니다. 공급망의 조달 단계에서 주요 식별자로 사용됩니다. 이 속성을 사용하면 조달 프로세스를 자세히 분석할 수 있습니다. 조달 전체 주기 시간 대시보드와 공급업체 정시 납품률 KPI 계산에 활용되며, 구매 요청, 주문, 입고, 결제 활동을 연결합니다. 중요한 이유 조달 하위 프로세스를 자세히 살펴보고 관련 조달 이벤트를 연결하는 주요 식별자입니다. 확보 방법 구매 오더 헤더 테이블 EKKO와 품목 테이블 EKPO에서 확인할 수 있습니다. 필드 이름은 EBELN입니다. 예시 450007819245000781934500078194 | |||
| 납품 지연 여부 IsLateDelivery | 공급업체가 요청 납품일 이후에 상품을 납품했는지 나타내는 불리언 값입니다. | ||
| 설명 이 계산 필드는 납품이 정시에 이루어졌는지 참 또는 거짓으로 표시합니다. '구매 오더 입고 전기 완료' 활동의 타임스탬프를 '요청 납품일' 속성과 비교해 계산합니다. 이 속성을 사용하면 공급업체 성과 관련 대시보드와 KPI를 쉽게 만들 수 있습니다. 데이터를 빠르게 필터링하고 집계해 공급업체 정시 납품률을 계산하고, 지연이 잦은 공급업체·자재·지역을 찾을 수 있습니다. 중요한 이유 납품별 결과를 명확한 두 가지 값으로 표시해 공급업체 성과 분석을 간소화합니다. 정시 납품 KPI 계산에 필요한 속성입니다. 확보 방법 계산 필드입니다. 로직: IF ('구매 오더 입고 전기 완료'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. 예시 truefalse | |||
| 운송업체 이름 CarrierName | 운송을 담당하는 운송 회사 또는 화물 운송 주선업체의 이름입니다. | ||
| 설명 운송업체 이름은 창고에서 고객까지 상품을 운송하는 물류 서비스 제공업체를 식별합니다. 이 속성은 운송 주기 시간 분석 대시보드에 필요합니다. 운송업체별 운송 시간, 비용, 신뢰성을 비교해 물류 계획과 운송업체 선정에 활용할 수 있습니다. 중요한 이유 운송 서비스 제공업체별 성과를 분석해 물류 비용과 배송 시간을 개선할 수 있습니다. 확보 방법 운송업체 ID(운송 주선업체)는 운송 헤더 테이블 VTTK 같은 운송 문서에 저장됩니다. 이름은 LFA1 같은 마스터 데이터 테이블에서 가져옵니다. 예시 DHLFedExMaersk Logistics | |||
| 재작업 여부 IsRework | 활동 또는 활동 순서가 재작업에 해당하는지 나타내는 플래그입니다. | ||
| 설명 이 불리언 속성은 프로세스에서 앞서 수행한 단계를 반복하는 활동을 표시하며, 재작업이나 수정이 있었음을 나타냅니다. 예를 들어 '품질 검사' 다음에 '생산 오더 생성'이 수행되고 다시 '품질 검사'가 이어지면, 두 번째 검사를 재작업으로 표시할 수 있습니다. 재작업을 파악하면 프로세스 비효율과 숨은 비용을 이해할 수 있습니다. 이 플래그로 재작업 루프의 빈도와 영향을 정량화해 주문 처리 오류율 KPI를 계산하고 프로세스 개선이 필요한 영역을 찾을 수 있습니다. 중요한 이유 재작업 루프에 포함된 활동을 명시적으로 식별하고 집계해 프로세스 비효율을 정량화할 수 있습니다. 확보 방법 일반적으로 process mining 도구에서 동일 케이스 내 반복되는 활동 순서를 찾아 계산합니다. 예시 truefalse | |||
| 종료 시간 EndTime | 활동이 완료된 시점을 나타내는 타임스탬프입니다. 처리 시간 계산에 사용됩니다. | ||
| 설명 종료 시간은 특정 활동이 완료된 시점을 나타냅니다. 시작 시간(EventTime)이 활동의 시작 시점을 나타낸다면, 종료 시간은 특히 즉시 끝나지 않는 활동의 실행 시간을 파악하는 데 필요합니다. 시작 시간과 종료 시간이 모두 있으면 처리 시간과 대기 시간을 정확히 구분할 수 있습니다. 이를 통해 작업에 실제로 투입한 시간과 다음 단계를 기다린 시간을 나누어 보고, 효율을 높일 기회를 찾을 수 있습니다. 중요한 이유 활동별 처리 시간을 정확히 계산해 부가가치가 있는 작업 시간과 대기 시간을 구분할 수 있습니다. 확보 방법 SAP의 상태 변경에서 도출할 수 있습니다. 예를 들어 JEST/JCDS 같은 테이블에서 '진행 중' 상태 업데이트를 시작으로, '완료' 상태 업데이트를 종료로 볼 수 있습니다. 즉시 끝나는 이벤트는 EndTime과 StartTime이 같을 수 있습니다. 예시 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| 주문 수량 OrderQuantity | 주문 품목에 포함된 자재의 수량입니다. | ||
| 설명 이 속성은 판매 오더 또는 구매 오더 품목에서 요청한 자재 수량을 나타냅니다. 거래별 물량을 파악할 수 있습니다. 수량별 분석을 통해 업무 영향이 클 수 있는 대량 주문을 우선적으로 살펴볼 수 있습니다. 단위당 비용처럼 다른 지표를 정규화하거나 주문 규모가 처리 시간에 미치는 영향을 파악하는 데도 사용할 수 있습니다. 중요한 이유 거래별 물량 정보를 제공해 영향도를 분석하고 규모별로 케이스를 구분할 수 있습니다. 확보 방법 구매 오더의 EKPO에 있는 MENGE, 판매 오더의 VBAP에 있는 KWMENG 등 품목 테이블에서 확인할 수 있습니다. 예시 100500025 | |||
| 판매 오더 번호 SalesOrderNumber | 판매 오더(SO) 문서를 식별하는 고유 번호입니다. | ||
| 설명 판매 오더 번호는 고객과의 판매를 확정하는 공식 문서 번호입니다. 공급망의 주문부터 대금 회수까지 이어지는 단계에서 주요 식별자로 사용됩니다. 이 속성은 특정 고객 주문의 이행을 추적하는 데 중요합니다. 최초 고객 요청을 납품과 청구 등 후속 활동에 연결해 주문 이행 리드 타임 분석을 지원합니다. 중요한 이유 주문 이행 하위 프로세스의 주요 식별자로, 고객 수요를 물류 및 재무 정산과 연결합니다. 확보 방법 판매 오더 헤더 테이블 VBAK와 품목 테이블 VBAP에서 확인할 수 있습니다. 필드 이름은 VBELN입니다. 예시 100023451000234610002347 | |||
공급망 관리 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 구매 주문 발행 | 필요한 자재를 외부 공급업체에서 구매하기 위해 구매 주문을 공식적으로 생성하고 발행하는 단계입니다. 구매 요청이 공급업체와의 법적 구속력이 있는 약정으로 전환됩니다. | ||
| 중요한 이유 주요 이정표인 이 활동은 공급업체 리드 타임과 조달 주기를 측정하는 데 중요합니다. 공급업체의 정시 납품 성과를 평가할 기준이 됩니다. 확보 방법 구매 주문이 생성될 때 명시적인 이벤트로 기록됩니다. 생성 타임스탬프는 구매 주문 헤더 테이블(EKKO)의 필드 AEDAT에 저장됩니다. 기록 구매 주문의 문서 생성일(EKKO-AEDAT)을 사용합니다. 이벤트 유형 explicit | |||
| 구매 주문 입고 전기 | 구매 주문에 따라 공급업체에서 원자재나 물품을 실제로 인수하는 단계입니다. 창고나 공장에서 물품을 인수할 때 이벤트가 기록됩니다. | ||
| 중요한 이유 이 활동으로 조달 주기 중 공급업체 납품 단계가 완료됩니다. 공급업체의 정시 납품률을 계산하고 입고 물류 성과를 파악하는 데 중요합니다. 확보 방법 자재 문서 전기를 통해 명시적인 이벤트로 기록됩니다. 이벤트 타임스탬프는 자재 문서 헤더 테이블(MKPF)의 필드 BUDAT에 있습니다. 구매 주문과의 연결 정보는 품목 테이블(MSEG)에 있습니다. 기록 구매 주문과 연결된 자재 문서의 전기일(MKPF-BUDAT)을 사용합니다. 이벤트 유형 explicit | |||
| 인도 증명 확인 | 상품을 명세대로 수령했다는 고객 또는 운송업체의 공식 확인을 나타냅니다. 보통 인도 증명(POD) 정보를 출고 납품 문서에 업데이트해 기록합니다. | ||
| 중요한 이유 이 활동은 주문 이행 프로세스의 최종 단계입니다. 정확한 청구, 분쟁 해결, 배송 주기의 마지막 구간 측정에 중요합니다. 확보 방법 명시적으로 기록되는 이벤트입니다. 인도 증명일은 납품 헤더 테이블(LIKP)의 PODAT 필드 또는 관련 POD 테이블(VLPOD)에 기록됩니다. 기록 납품 문서의 인도 증명일(LIKP-PODAT)을 사용합니다. 이벤트 유형 explicit | |||
| 제품 생산 완료 | 제품 제조가 완료되었음을 확인하는 활동입니다. 일반적으로 생산 주문에 대한 입고로 기록되며, 완제품이 재고에 반영됩니다. | ||
| 중요한 이유 생산 주기가 끝나는 시점입니다. 생산 주문 생성부터 이 이벤트까지 걸리는 시간이 제조 리드 타임이며, 생산 효율을 나타내는 주요 지표입니다. 확보 방법 자재 문서 전기(생산 주문에 대한 입고)로 명시적으로 기록하거나, 생산 주문의 최종 확인(AFRU 테이블) 또는 상태가 '납품 완료'로 변경된 시점을 바탕으로 추정할 수 있습니다. 기록 생산 주문의 최종 입고 자재 문서 전기일이나 상태 변경을 바탕으로 추정합니다. 이벤트 유형 inferred | |||
| 출고 전기 완료 | 이 활동은 창고에서 상품이 법적·물리적으로 반출되는 것을 나타냅니다. 재고를 차감하고 매출원가를 전기하며, 주문이 공식적으로 출하되었음을 표시합니다. | ||
| 중요한 이유 이 주요 시점부터 운송 중 기간이 시작됩니다. 상품이 배송을 위해 회사의 관리 범위를 벗어난 시점을 명확히 나타냅니다. 확보 방법 이 이벤트가 발생하면 자재 문서가 생성됩니다. 타임스탬프는 자재 문서 헤더(MKPF)의 전기일(BUDAT 필드)에 기록되며, 납품 문서(LIKP)의 상품 이동 상태(WBSTK 필드)가 업데이트됩니다. 기록 출고 납품과 연결된 자재 문서에서 전기일(MKPF-BUDAT)을 사용합니다. 이벤트 유형 explicit | |||
| 판매 주문 생성 | 이 활동은 고객의 물품 요청을 공식적으로 기록하는 새 판매 주문이 생성된 시점을 나타냅니다. 사용자가 시스템에서 새 판매 주문 문서를 저장할 때 명시적인 이벤트로 기록됩니다. | ||
| 중요한 이유 주문부터 대금 회수까지 이어지는 프로세스의 주요 시작점입니다. 이 이벤트부터 다른 이벤트까지 걸리는 시간을 분석하면 전체 주문 이행 리드 타임을 파악하고 초기 처리 지연을 찾을 수 있습니다. 확보 방법 이 이벤트는 명시적으로 기록됩니다. 판매 주문 테이블의 변경 문서(CDHDR/CDPOS)에서 확인하거나 판매 주문 헤더 테이블(VBAK)의 생성 타임스탬프(필드 ERDAT)를 사용할 수 있습니다. 기록 판매 주문 문서의 생성일(VBAK-ERDAT)과 생성 시간(VBAK-ERZET)을 사용합니다. 이벤트 유형 explicit | |||
| 고객 청구서 생성 | 배송한 상품이나 서비스에 대한 고객 청구 문서가 생성되는 활동입니다. 프로세스의 최종 재무 정산 단계가 시작됩니다. | ||
| 중요한 이유 청구 주기 시간을 분석하는 데 중요한 활동입니다. 납품 확인과 청구 사이의 지연은 현금 흐름에 부정적인 영향을 줄 수 있습니다. 확보 방법 명시적으로 기록되는 이벤트입니다. 생성 타임스탬프는 청구 문서 헤더 테이블(VBRK)의 ERDAT 필드에 기록됩니다. 기록 청구 문서 헤더의 생성일(VBRK-ERDAT)을 사용합니다. 이벤트 유형 explicit | |||
| 구매 요청 생성 | 필요한 물품이나 원자재를 조달하기 위한 내부 요청이 생성된 시점을 나타냅니다. 판매 주문을 이행할 재고가 부족하거나 재주문 기준 이하로 떨어졌을 때 생성되는 경우가 많습니다. | ||
| 중요한 이유 조달 주기의 첫 단계입니다. 생성 시점을 추적하면 조달 착수 지연을 파악하고 구매 프로세스 전체를 분석할 수 있습니다. 확보 방법 명시적인 이벤트입니다. 구매 요청 헤더 테이블(EBAN)의 생성일이 필드 BADAT에 기록됩니다. 기록 구매 요청 문서의 생성일(EBAN-BADAT)을 사용합니다. 이벤트 유형 explicit | |||
| 목적지에서 상품 하역 | 이 활동은 고객 위치에서 상품을 실제로 하역하는 것을 의미합니다. SAP에 명시적으로 기록되지 않을 수 있으며, 운송업체 데이터나 후속 이벤트를 바탕으로 추론해야 하는 경우가 많습니다. | ||
| 중요한 이유 이 시점에 운송 구간이 끝납니다. 출고 전기부터 이 시점까지 걸린 시간이 운송 시간이며, 물류 최적화에 중요한 지표입니다. 확보 방법 핵심 ERP에 명시적으로 기록되는 경우는 드뭅니다. 운송업체 EDI 메시지, Transportation Management(TM) 모듈의 데이터 또는 사용 가능한 경우 인도 증명 문서의 타임스탬프를 바탕으로 추론할 수 있습니다. 기록 운송업체 상태 업데이트(예: EDI 214)에서 추론하거나, 인도 증명 타임스탬프를 근사값으로 사용합니다. 이벤트 유형 inferred | |||
| 생산 주문 생성 | 판매 주문에 필요한 완제품을 생산하기 위해 생산 주문이 생성된 시점을 나타냅니다. 사내 제조 프로세스가 공식적으로 시작되는 단계입니다. | ||
| 중요한 이유 생산 주문 생성은 제조 리드 타임의 시작을 나타냅니다. 이 시점을 분석하면 수요 신호가 발생한 때부터 생산이 시작될 때까지의 지연을 파악할 수 있습니다. 확보 방법 명시적인 이벤트입니다. 생산 주문 헤더 테이블(AUFK)의 필드 ERDAT에 생성일이 기록됩니다. 기록 주문 헤더 테이블의 생성일(AUFK-ERDAT)을 사용합니다. 이벤트 유형 explicit | |||
| 운송 문서 생성 | 운송 계획을 위해 하나 이상의 납품을 묶는 운송 문서가 생성된 것을 나타냅니다. 이 문서에는 운송업체, 경로, 운송 수단 정보가 포함됩니다. | ||
| 중요한 이유 이 활동은 공식적인 운송 계획의 시작입니다. 출고 전기부터 운송 완료까지 걸린 시간을 분석하면 운송 프로세스의 효율성을 파악할 수 있습니다. 확보 방법 운송 헤더 테이블(VTTK)의 생성일(ERDAT 필드)에 명시적으로 기록되는 이벤트입니다. LE-TRA 모듈의 데이터이며, 모든 조직에서 이 모듈을 사용하는 것은 아닙니다. 기록 운송 문서 헤더의 생성일(VTTK-ERDAT)을 사용합니다. 이벤트 유형 explicit | |||
| 재고 가용성 확인 | 판매 주문을 이행할 재고가 있는지 시스템 또는 담당자가 확인하는 단계입니다. 판매 주문 생성 중 자동으로 처리되는 경우가 많지만, 별도의 이벤트로 기록되지 않을 수 있습니다. | ||
| 중요한 이유 주문부터 재고 확인까지 걸리는 시간과 확인 결과를 파악하면 재고 수준이 주문 이행 시간에 미치는 영향을 분석할 수 있습니다. 이 단계가 지연되면 조달이나 생산이 필요한 경우가 많습니다. 확보 방법 일반적으로 명시적인 이벤트로 기록되지 않습니다. 판매 주문 품목 테이블(VBEP)에 첫 번째 확정 일정 라인이 생성된 시점이나 주문 품목의 상태 변경을 바탕으로 추정할 수 있습니다. 기록 판매 주문 일정 라인(VBEP 테이블)의 확정 상태 업데이트를 바탕으로 추정합니다. 이벤트 유형 inferred | |||
| 출고 배송 생성 | 고객에게 물품을 피킹하고 배송할 수 있도록 배송 문서가 생성된 시점을 나타냅니다. 이 활동을 기점으로 주문 관리에서 물류 실행 단계로 넘어갑니다. | ||
| 중요한 이유 실제 주문 이행을 시작하는 주요 단계입니다. 주문 생성부터 배송 생성까지 지연되면 계획이나 재고 가용성에 문제가 있을 수 있습니다. 확보 방법 명시적인 이벤트입니다. 배송 헤더 테이블(LIKP)의 필드 ERDAT에 생성 타임스탬프가 기록됩니다. 기록 배송 문서 헤더의 생성일(LIKP-ERDAT)과 생성 시간(LIKP-ERZET)을 사용합니다. 이벤트 유형 explicit | |||
| 품질 검사 수행 | 생산된 제품의 품질 검사가 완료된 시점을 나타냅니다. 검사 결과인 합격 또는 불합격은 사용 결정에 기록됩니다. | ||
| 중요한 이유 제품 품질을 모니터링하고 생산 문제를 파악하는 데 중요한 활동입니다. 불합격률이 높거나 검사 시간이 길면 심각한 병목이 될 수 있습니다. 확보 방법 품질 검사 로트에 대한 사용 결정이 내려질 때 명시적인 이벤트로 기록됩니다. 결정일은 QALS 테이블의 필드 PASTRTERM 또는 QAVE 테이블에 있습니다. 기록 검사 로트의 사용 결정이 기록된 타임스탬프(QALS/QAVE 테이블)를 사용합니다. 이벤트 유형 explicit | |||
| 피킹 완료 | 출고 배송을 위해 창고에서 물품을 모으는 작업이 완료된 시점을 나타냅니다. 많은 시스템에서는 배송 문서의 피킹 상태가 업데이트될 때 완료로 확인됩니다. | ||
| 중요한 이유 효율적인 피킹은 창고 처리량에 중요합니다. 이 활동을 추적하면 창고 운영의 병목을 찾고 피킹 성과를 측정할 수 있습니다. 확보 방법 이는 대개 하나의 명확한 이벤트로 기록되지 않으며, 상태 변경을 통해 추론할 수 있습니다. 납품 품목 테이블(LIPS)의 피킹 상태(KOSTA 필드)가 'C'(완전히 처리됨)로 설정되면 기록된 것으로 봅니다. 기록 변경 문서에서 피킹 상태(LIPS-KOSTA)가 완전 피킹으로 업데이트된 시점을 추론합니다. 이벤트 유형 inferred | |||
데이터 추출 가이드
단계
- 사전 준비: 필요한 SAP S/4HANA Core Data Services (CDS) view에 액세스할 수 있는 충분한 권한을 가진 사용자를 준비합니다. 일반적으로 SAP 보안팀이 특정 역할을 할당해야 합니다. SAP HANA 데이터베이스에 연결할 수 있는 DBeaver 또는 SAP HANA Studio 같은 SQL 클라이언트도 필요합니다.
- 데이터베이스 연결 설정: SQL 클라이언트에서 SAP S/4HANA 데이터베이스 연결을 구성합니다. 데이터베이스 서버 호스트, 포트(예: 3xx15, 여기서 xx는 인스턴스 번호), 데이터베이스 사용자 이름과 비밀번호가 필요합니다.
- SQL 쿼리 준비: 이 문서의 쿼리 섹션에 있는 전체 SQL 쿼리를 복사해 SQL 클라이언트 편집기에 붙여 넣습니다. 이 쿼리는 여러 물류 및 영업 모듈에서 지정된 모든 활동을 추출하도록 작성되었습니다.
- 추출 매개변수 설정: 쿼리를 실행하기 전에 각 하위 쿼리의
WHERE절에서 조건 자리표시자를 찾습니다.'YourCompanyCode'를 분석 대상 회사 코드로 바꾸고,'YYYY-MM-DD'와 같은 날짜 범위 자리표시자를 수정해 원하는 추출 기간을 지정합니다. - 쿼리 실행: 전체 SQL 스크립트를 실행합니다. 실행 시간은 선택한 날짜 범위와 시스템 데이터 양에 따라 달라집니다. 시스템 부하를 줄이려면 사용량이 적은 시간에 실행하는 것이 좋습니다.
- 초기 결과 확인: 쿼리가 완료되면 SQL 클라이언트에서 결과를 간단히 확인합니다. 행 수가 적절한지, LogisticsOrder, ActivityName, EventTime 열에 값이 있는지, 다양한 활동 이름이 표시되는지 확인합니다.
- 데이터를 CSV로 내보내기: SQL 클라이언트에서 전체 결과를 CSV 파일로 내보냅니다. 특수 문자가 올바르게 표시되도록 UTF-8 인코딩을 선택합니다.
- 업로드용 형식 확인: 최종 CSV 파일의 열 머리글이 수집에 필요한 속성 이름(예:
LogisticsOrder,ActivityName,EventTime)과 정확히 일치하는지 확인합니다. 제공된 SQL 쿼리를 그대로 사용했다면 추가 데이터 변환은 필요하지 않습니다.
구성
- 사전 준비: SAP HANA 데이터베이스에 액세스할 수 있어야 합니다. 데이터베이스 사용자에게는 쿼리에서 참조하는 모든 CDS view에 대한
SELECT권한이 필요합니다. 여기에는 I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment, I_BillingDocumentItem 등이 포함되며, 이에 한정되지 않습니다. - 날짜 범위 필터링: 제공된 쿼리에는 일반적으로 생성일 필드(
CreationDate또는DocumentDate)를 기준으로 날짜 범위를 지정하는 자리표시자가 있습니다. 초기 분석에는 시스템 부하를 과도하게 높이지 않으면서 대표성 있는 데이터를 확보할 수 있도록 3~6개월을 권장합니다. - 주요 업무 필터: 분석에 적합한 데이터를 얻으려면 특정 조직 단위로 필터링해야 합니다. 쿼리에는
CompanyCode자리표시자가 미리 설정되어 있습니다. 분석 범위에 따라SalesOrganization,DistributionChannel또는Plant필터도 추가할 수 있습니다. - 성능 고려 사항: 이 쿼리는 여러 대용량 CDS view를 조인하므로 실행 시 시스템 리소스를 많이 사용할 수 있습니다. 업무 시간 외에 추출을 예약하세요. 데이터가 매우 많은 경우 월별로 나누어 순차적으로 실행하는 방안을 고려하세요.
샘플 쿼리 sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; 단계
- 관련 물류, 영업, 조달, 재고, 생산, 품질, 납품, 선적, 납품 증명 및 청구 데이터가 있는 SAP HANA 스키마에 직접 읽기 권한이 있는지 확인합니다. SAP Basis 또는 데이터 플랫폼팀에서 스키마 이름, 연결 정보, 권한을 받습니다. 소스 시스템에는 데이터를 쓰지 마세요.
- 대상 시스템의 정확한 S/4HANA 데이터 모델을 확인합니다. 구매 오더에는 EKKO와 EKPO, 출고 납품에는 LIKP와 LIPS를 사용합니다. 영업 오더, 구매 요청, 자재 문서, 생산 오더, 품질 검사 결과, 선적, 납품 증명, 청구에는 추가 객체를 구성해야 합니다. 쿼리의 대괄호로 표시된 각 객체 또는 열 자리표시자를 시스템 데이터 사전에서 확인한 객체로 바꿉니다.
- LogisticsOrder 상관관계 규칙을 정의합니다. 영업 오더에서 후속 납품, 자재 문서, 생산 또는 조달 문서, 청구 문서로 이어지는 문서 흐름 관계를 확인한 뒤 사용하는 것이 좋습니다. 직접 관계를 사용할 수 없다면 문서화된 상관관계 테이블이나 업무별 매핑을 구성합니다. 자재 번호나 날짜만으로 케이스를 연결하지 마세요.
- [Start date parameter]와 [End date parameter]를 사용해 추출 기간을 설정합니다. 이벤트 타임스탬프에 기간을 일관되게 적용하되, 기간 내 이벤트를 설명하는 데 필요한 경우 기간 시작 전에 생성된 문서도 포함합니다.
- 표시된 필터 섹션에서 회사 코드, 영업 조직, 플랜트, 구매 조직, 문서 유형 및 기타 업무 필터를 설정합니다. 대상 시스템에서 값을 확인한 뒤 필터를 적용하세요.
- 각 활동 분기의 대괄호로 표시된 테이블 및 열 참조를 확인된 이름으로 바꿉니다. 모든 분기에서 동일한 열과 호환되는 데이터 유형을 반환해야 합니다. ProcessMind는 누락된 이벤트를 추론하지 않으므로 쿼리는 필요한 15개 활동 각각에 대해 한 행을 명시적으로 생성합니다.
- SAP HANA Database Explorer, SAP HANA cockpit SQL Console 또는 승인된 SQL 클라이언트에서 쿼리를 실행합니다. 전체 UNION ALL 쿼리를 실행하기 전에 각 활동 분기를 따로 테스트합니다. 실행 계획을 검토하고 초기 테스트에는 짧은 날짜 범위를 사용합니다.
- 문서 관계, 타임스탬프, 사용자 식별자, 공급업체 및 고객 값, 자재 및 플랜트 값, 품질 결과를 검증합니다. 품목 수준 조인으로 중복 행이 생기는지 확인하고, 문서당 이벤트 1개 또는 문서 품목당 이벤트 1개와 같은 이벤트 단위 규칙을 적용합니다.
- 결과를 UTF-8 CSV 또는 ProcessMind가 지원하는 다른 표 형식으로 내보냅니다. LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate, QualityInspectionResult 열 이름을 정확히 유지합니다. EventTime은 타임스탬프 형식이어야 하며 LastDataUpdate는 일관된 기준으로 입력해야 합니다.
- 파일을 ProcessMind에 업로드하고 LogisticsOrder를 케이스 식별자, ActivityName을 활동, EventTime을 이벤트 타임스탬프로 매핑합니다. 15개 활동 레이블이 모두 명시적 이벤트로 처리되는지 확인하고, 증분 추출 동작을 검증한 뒤 관리된 방식으로 새로 고침을 예약합니다.
구성
- 날짜 범위: 우선 3~6개월의 데이터를 사용합니다. 초기 테스트에는 더 짧은 기간을 적용하고, 성능과 문서 관계를 검증한 뒤에만 범위를 넓힙니다.
- 소스 스키마: [SAP HANA schema name]에는 확인된 S/4HANA 테이블 또는 view가 있는 스키마를 지정합니다. 모든 S/4HANA 배포 환경에서 기존 ERP 테이블을 같은 이름으로 사용할 수 있다고 가정하지 마세요.
- 문서 범위: 프로세스 범위에 맞춰 [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter], [Document Type filter]를 설정합니다.
- 상관관계: 모든 이벤트가 하나의 LogisticsOrder에 연결되도록 [Your document flow or correlation object]를 구성합니다. 연결 관계가 없거나 모호한 경우 임의로 할당하지 말고 보고해야 합니다.
- 이벤트 단위: 문서당, 문서 품목당 또는 업무상 의미 있는 상태 변경당 이벤트 1개를 선택합니다. 모든 분기에 동일한 규칙을 적용하고 기술적으로 중복된 행만 제거합니다.
- 타임스탬프 우선순위: 각 활동에 대해 확인된 전기, 생성, 확인, 상태 변경, 검사, 납품, 하역, POD 또는 청구 타임스탬프를 사용합니다. 업무 이벤트 시간 대신 추출 시간을 사용하지 마세요.
- 소스 레이블: [Source system label]에는 승인된 SAP S/4HANA 시스템 식별자처럼 변경되지 않는 값을 지정합니다.
- 새로 고침 타임스탬프: [Last data update expression]에는 승인된 추출 타임스탬프 또는 소스 새로 고침 타임스탬프를 지정합니다.
- 성능: 날짜 및 조직 필터를 초기에 적용하고, 필요한 열만 선택하며, 제한 없는 품목 수준 조인을 피합니다. 실행 계획을 확인하고 반복 적재에는 영구 추출 view 또는 스테이징 테이블을 고려합니다.
- 권한: 관련 SAP HANA 스키마 객체에 대한 읽기 권한과 SQL 실행 권한이 필요합니다. 업무 검증을 위해 해당 영업, 조달, 재고, 생산, 품질, 물류 실행, 운송 및 청구 데이터에 액세스할 수 있어야 합니다.
- 기능 범위: 배포된 시스템에 요청된 활동에 해당하는 업무 프로세스가 포함되어 있는지 확인합니다. 선적, 하역, POD, 품질, 생산 및 청구 데이터는 별도의 애플리케이션이나 확장 기능에 저장될 수 있습니다.
- 보안: 고객, 공급업체, 자재, 재무 및 사용자 데이터에 대한 조직의 규칙을 적용합니다. 필요한 경우 민감한 필드를 마스킹하거나 액세스를 제한합니다.
샘플 쿼리 sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; 단계
- 사전 준비: SAP S/4HANA 시스템에서 ABAP 프로그램을 생성하고 실행할 개발자 키와 권한이 있는지 확인합니다(SE38 트랜잭션 액세스 포함). VBAK, LIKP, EKKO, MKPF와 같은 공급망 테이블을 읽을 권한도 필요합니다.
- 프로그램 생성: 트랜잭션 코드
SE38을 사용해 ABAP Editor를 엽니다. 새 프로그램 이름(예:Z_PM_SCM_EXTRACTION)을 입력하고 'Create'를 선택합니다. 설명이 포함된 제목을 입력하고 프로그램 유형을 'Executable Program'으로 설정합니다. - 코드 입력: 아래 'query' 섹션의 ABAP 코드를 모두 복사해 새 프로그램의 ABAP Editor에 붙여 넣습니다.
- 텍스트 요소 정의: Go To > Text Elements > Selection Texts로 이동합니다. 제안된 선택 화면 레이블을 모두 활성화해 사용자 인터페이스를 명확하고 사용하기 쉽게 구성합니다.
- 프로그램 활성화: CTRL+S를 누른 뒤 CTRL+F3을 누르거나 도구 모음의 활성화 아이콘을 사용해 프로그램을 저장하고 활성화합니다. 시스템별 설정으로 발생할 수 있는 구문 오류를 해결합니다.
- 프로그램 실행: F8을 누르거나 'Direct Processing' 버튼을 사용해 프로그램을 실행합니다. 추출할 데이터를 필터링할 수 있는 선택 화면이 표시됩니다.
- 추출 매개변수 설정: 선택 화면에서 영업 오더 생성일의 날짜 범위를 지정합니다. 데이터 양을 관리하려면 특정 회사 코드나 영업 조직으로 필터링하는 것이 좋습니다. SAP 애플리케이션 서버에서 출력 파일을 저장할 전체 경로를 입력합니다.
- 백그라운드 실행: 여러 달에 걸친 대용량 데이터를 처리할 때는 트랜잭션 시간 초과를 방지하기 위해 프로그램을 백그라운드에서 실행해야 합니다. 메뉴에서 Program > Execute in Background를 선택하고 작업을 예약합니다.
- 데이터 파일 가져오기: 프로그램 실행이 끝나면 트랜잭션 코드
AL11을 사용해 지정한 애플리케이션 서버 디렉터리로 이동합니다. 생성된 파일을 찾아 트랜잭션CG3Y로 로컬 컴퓨터에 다운로드합니다. - 업로드 준비: 다운로드한 파일이 쉼표 또는 세미콜론으로 구분된 CSV와 같은 일반 텍스트 형식이고 UTF-8 인코딩을 사용하는지 확인합니다. 이제 파일을 process mining 도구에 업로드할 수 있습니다.
구성
- 선택 날짜 범위(S_ERDAT): 가장 중요한 필터입니다. 생성일(
VBAK-ERDAT)을 기준으로 영업 오더를 처음 선택할 기간을 지정합니다. 데이터 양을 관리할 수 있도록 최근 3~6개월과 같이 범위를 좁혀 시작합니다. - 영업 조직(S_VKORG): 특정 영업 조직만 추출하는 선택 필터입니다. 특정 사업부나 지역을 중심으로 분석할 때 유용합니다.
- 회사 코드(S_BUKRS): 특정 회사 코드로 데이터를 제한하는 선택 필터입니다. 데이터 범위를 줄이고 성능을 높이려면 이 필터를 사용하는 것이 좋습니다.
- 출력 파일 경로(P_FILE): 최종 이벤트 로그 파일을 저장할 SAP 애플리케이션 서버의 전체 경로입니다. 프로그램 실행 사용자에게 해당 디렉터리에 쓸 권한이 있어야 합니다. 예:
/usr/sap/trans/tmp/scm_event_log.csv. - 실행 모드: 소량의 테스트 데이터는 프로그램을 포그라운드에서 실행할 수 있습니다. 데이터가 많으면 시간 초과를 방지하고 업무 시간대 시스템 부하를 줄이기 위해 백그라운드 처리를 사용해야 합니다.
- 시스템 권한: 보고서 실행 사용자에게는 VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1, LFA1 등을 포함한 기반 테이블에 대한 읽기 권한이 필요합니다.
샘플 쿼리 abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF. 시작할 준비가 되셨나요?
이 템플릿으로 데이터를 준비하고 지금 공급망 성과 개선을 시작하세요. 진행 과정마다 필요한 도움을 드립니다.
지금 공급망 관리를 개선하세요
전체 프로세스를 파악하고 며칠 만에 예측 정확도를 90%까지 높이세요.
14일 무료 체험을 이용하세요. 신용카드가 필요하지 않습니다.