운송 관리 데이터 템플릿
운송 관리 데이터 템플릿
- 수집 권장 속성
- 추적할 주요 활동
- SAP Transportation Management 데이터 추출 안내
운송 관리 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 운송 건 ShipmentId | 개별 화물 운송을 식별하는 고유 ID로, 분석의 기준 케이스로 사용됩니다. | ||
| 설명 Shipment ID는 관련된 모든 운송 활동과 이벤트를 묶는 기본 키입니다. 최초 요청부터 최종 인도 증명 및 대금 지급까지 이어지는 하나의 운송 프로세스를 나타냅니다. process mining에서는 케이스 뷰를 구성하는 데 필요한 속성으로, 분석가가 각 운송 건의 전체 과정을 추적할 수 있게 합니다. 개별 운송 건의 프로세스 변형, 처리 시간, 결과를 분석해 운송 성과를 종합적으로 파악할 수 있습니다. 중요한 이유 이 속성은 기본 케이스 식별자로, 모든 이벤트와 데이터 지점을 특정 운송 오더에 연결합니다. 전체 프로세스를 분석하는 데 필요합니다. 확보 방법 이 식별자는 SAP TM의 Freight Order 번호 또는 Freight Booking 번호입니다. /SCMTMS/D_TORROT 및 /SCMTMS/D_TRQROT과 같은 테이블에서 확인할 수 있습니다. 예시 610000432161000056786100009876 | |||
| 이벤트 시간 EventTime | 특정 활동이나 이벤트가 발생한 시점을 나타내는 타임스탬프입니다. | ||
| 설명 이벤트 시간은 운송 프로세스의 각 활동이 발생한 정확한 날짜와 시간을 나타냅니다. 이 시간 데이터는 처리 시간, 소요 시간, 프로세스 단계 간 대기 시간을 계산하는 데 필요합니다. 분석에서는 이벤트 순서를 정하고 시간순 로그를 구성하며 시간 기반 성과를 분석하는 데 사용합니다. 지연을 파악하고 프로세스 효율성을 측정하며 일정이나 서비스 수준 계약에 따른 성과를 평가하는 데 중요합니다. 중요한 이유 이벤트를 시간순으로 정렬하고 처리 시간 및 정시 배송과 같은 성과 지표를 계산하는 데 필요한 타임스탬프입니다. 확보 방법 보고된 이벤트의 타임스탬프를 저장하는 /SAPTRX/EH_EVMSG 등의 SAP TM 이벤트 핸들러 테이블에서 가져옵니다. 예시 2023-04-15T10:00:00Z2023-04-16T14:30:00Z2023-04-20T09:15:00Z | |||
| 활동명 ActivityName | 운송 프로세스에서 발생한 특정 비즈니스 이벤트 또는 단계의 이름입니다. | ||
| 설명 활동명은 'Shipment Planned', 'Goods Picked Up', 'Goods Delivered'와 같이 운송 수명 주기의 개별 작업이나 주요 단계를 나타냅니다. 이러한 활동은 검색된 프로세스 맵의 노드가 됩니다. 활동의 순서와 빈도를 분석하면 표준 프로세스 흐름, 이탈, 병목, 재작업 반복 구간을 파악할 수 있습니다. 운송 관리에서 프로세스를 발견하고 적합성을 확인하는 데 기본이 되는 정보입니다. 중요한 이유 이 속성은 운송 프로세스의 단계를 정의해 전체 운송 흐름을 시각화하고 분석할 수 있게 합니다. 확보 방법 일반적으로 SAP TM 실행 추적 이벤트 핸들러에 기록된 이벤트 코드 또는 상태 변경에서 가져옵니다. 비즈니스 객체의 상태 변경이나 특정 이벤트 메시지를 기록하는 테이블에서 추출할 수 있습니다. 예시 운송 계획 수립운송사 배정화물 픽업 완료화물 배송 완료인도 증명서 수신 | |||
| 요청 배송일 RequestedDeliveryDate | 고객이 요청했거나 판매 오더에 명시된 배송 날짜와 시간입니다. | ||
| 설명 요청 배송일은 '상품 배송 완료' 활동의 목표 기한입니다. 정시 배송 성과를 측정하는 주요 기준으로 사용됩니다. 이 날짜는 '정시 배송률' KPI를 계산하는 데 중요합니다. 실제 배송 시각을 요청 배송일과 비교하면 서비스 수준 계약을 준수했는지 확인할 수 있습니다. 차이를 분석하면 운송사 성과 문제, 계획 지연, 통관 보류 등 반복적인 지연 원인을 파악할 수 있습니다. 중요한 이유 정시 배송 성과를 측정하는 기준으로, 고객 만족도와 운영 성과를 평가하는 데 중요한 KPI입니다. 확보 방법 일반적으로 SAP ERP의 선행 판매 오더 또는 재고 운송 오더에서 전달됩니다. Freight Unit 또는 Freight Order의 날짜 및 시간 필드에 저장됩니다. 예시 2023-05-20T17:00:00Z2023-06-01T12:00:00Z2023-06-15T23:59:59Z | |||
| 운송 수단 ModeOfTransport | 화물 운송에 사용하는 도로, 철도, 항공, 해상 등의 운송 수단입니다. | ||
| 설명 이 속성은 운송 수단을 지정합니다. 운송 수단마다 비용 구조, 운송 시간, 프로세스 복잡성이 다릅니다. 예를 들어 국제 항공 화물에는 통관과 같은 활동이 포함되지만, 국내 트럭 운송에는 해당 활동이 필요하지 않을 수 있습니다. 운송 수단별 프로세스를 분석하면 각 상황에 맞는 개선 과제를 수립할 수 있습니다. 특히 긴급 항공 운송과 같은 고비용 운송과 일반 운송을 비교하는 비용 분석에 유용합니다. 이러한 구분은 운송비를 파악하고 관리하는 데 중요합니다. 중요한 이유 운송 수단별 비용, 소요 시간, 프로세스 차이를 분석해 비용을 최적화하고 고비용 운송의 사용 현황을 파악할 수 있습니다. 확보 방법 Freight Order 또는 Freight Booking의 주요 필드이며, Transportation Mode 또는 MOT로 표시되는 경우가 많습니다. 예시 01 (도로)02 (철도)04 (항공)05 (해상) | |||
| 운송사 이름 CarrierName | 화물 운송을 담당하는 운송사 또는 물류 서비스 제공업체의 이름입니다. | ||
| 설명 운송사 이름은 화물의 실제 운송을 담당하는 회사를 나타냅니다. 운송사마다 서비스 수준, 비용, 신뢰도가 다를 수 있으므로 성과 분석에 중요한 기준입니다. process mining에서는 이 속성을 기준으로 운송사별 성과를 구분하고 비교합니다. 운송사별 성과표를 만들고 정시 배송률과 비용을 비교하거나, 지연 또는 분쟁이 자주 발생하는 운송사를 파악할 수 있습니다. 이러한 분석 결과는 운송사 관리와 조달 전략을 수립하는 데 도움이 됩니다. 중요한 이유 운송사별 성과를 비교해 운송사 선정, 비용, 서비스 수준을 최적화하는 데 활용합니다. 확보 방법 이 정보는 Freight Order 또는 Freight Booking 문서에 저장되며, 운송사의 비즈니스 파트너 기능을 통해 연결됩니다. 예시 DHL ExpressFedEx FreightMaersk LineUnion Pacific Railroad | |||
| 정시 배송 여부 IsOnTimeDelivery | 요청 배송일까지 또는 그 전에 상품이 배송되었는지를 나타내는 참/거짓 값입니다. | ||
| 설명 '상품 배송 완료' 활동의 시각과 '요청 배송일'을 비교해 계산하는 속성입니다. 배송이 제시간에 완료되었거나 일찍 완료되면 true, 늦으면 false로 표시됩니다. 이 속성을 사용하면 배송 건별 결과를 명확한 두 가지 값으로 구분해 성과를 쉽게 분석할 수 있습니다. 정시 배송 성과 대시보드와 관련 KPI의 기준이 됩니다. 지연된 배송을 간편하게 필터링하고 성과 저하의 원인을 분석할 수 있습니다. 중요한 이유 배송 약속 준수 여부를 직접 측정해 정시 배송 KPI를 간편하게 계산하고 시각화할 수 있습니다. 확보 방법 이 속성은 SAP TM에 저장되지 않습니다. 데이터 변환 과정에서 실제 배송 이벤트 시각과 요청 배송일을 비교해 계산해야 합니다. 예시 truefalse | |||
| 종료 시간 EndTime | 특정 활동이 완료된 시점을 나타내는 타임스탬프입니다. | ||
| 설명 StartTime이 이벤트의 시작을 나타낸다면 EndTime은 종료 시점을 나타냅니다. 'Customs Clearance' 또는 'Goods Loading'처럼 소요 시간이 있는 활동을 분석할 때 특히 유용합니다. EndTime에서 StartTime을 빼면 해당 활동의 처리 시간을 계산할 수 있습니다. process mining에서 시작 시간과 종료 시간을 모두 사용하면 활동별 소요 시간을 세부적으로 분석해 처리 시간과 대기 시간을 구분할 수 있습니다. 이를 통해 작업 수행 중인지 작업 간 인계 과정인지에 관계없이 비효율이 발생하는 지점을 정확히 파악할 수 있습니다. 중요한 이유 활동별 처리 시간을 정확히 계산하고 실제 작업 시간과 이벤트 간 대기 시간을 구분할 수 있습니다. 확보 방법 StartTime과 마찬가지로 이벤트 핸들러 테이블에서 가져옵니다. 해당 활동의 별도 'completed' 이벤트에 해당할 수 있습니다. 예시 2023-04-15T11:30:00Z2023-04-16T15:00:00Z2023-04-20T09:45:00Z | |||
| 총 운송비 TotalFreightCost | 배송 건에 대해 계산되었거나 청구된 총비용입니다. | ||
| 설명 총 운송비는 배송 건의 재무 영향을 나타냅니다. 운송 관리 시스템에서 계산한 비용일 수도 있고, 정산 후 운송사 청구서에 기재된 최종 금액일 수도 있습니다. 이 속성을 사용하면 프로세스 분석에 재무 관점을 더할 수 있습니다. 분석가는 비용이 가장 높은 프로세스 변형을 찾고, 지연이나 경로 변경에 따른 비용을 계산하며, 운송사나 운송 수단별 비용 효율성을 비교할 수 있습니다. 운송비와 서비스 제공 비용을 분석하는 대시보드의 기본 데이터입니다. 중요한 이유 프로세스 분석에 재무 관점을 더해 운송비, 배송 건당 비용, 프로세스 비효율로 인한 재무 영향을 분석할 수 있습니다. 확보 방법 SAP TM에서 비용 계산을 마친 후 Freight Settlement Document에서 가져옵니다. /SCMTMS/D_SFIRHD와 같은 테이블에서 확인할 수 있습니다. 예시 250.751200.005430.50 | |||
| 도착 국가 DestinationCountry | 배송이 이루어지는 국가입니다. | ||
| 설명 이 속성은 마지막 배송 장소의 주소를 기준으로 배송의 최종 도착 국가를 나타냅니다. 출발 국가와 마찬가지로 도착 국가별 분석은 지역별 물류 문제를 파악하는 데 중요합니다. 배송 지연이 잦거나 최종 배송 비용이 높은 국가를 확인할 수 있습니다. 이 정보는 물류 네트워크 최적화, 현실적인 배송 일정 설정, 국제 무역 규정 준수 관리에 유용합니다. 중요한 이유 도착지별 프로세스 성과를 분석해 특정 배송 지역, 세관 당국 또는 최종 배송 운송사와 관련된 문제를 파악할 수 있습니다. 확보 방법 Freight Order의 마지막 경유지에 있는 도착지 주소 정보의 일부입니다. 예시 FRCAGBJP | |||
| 배송 상태 ShipmentStatus | 데이터 추출 시점의 배송 전체 상태입니다. | ||
| 설명 배송 상태는 '계획 중', '운송 실행 중', '배송 완료', '취소됨' 등 배송 프로세스의 현재 단계를 보여줍니다. 케이스에서 마지막으로 확인된 상태를 나타냅니다. 이 속성을 사용하면 결과에 따라 배송 건을 필터링하고 분석할 수 있습니다. 예를 들어 완료된 배송만 대상으로 전체 소요 시간을 측정하거나, 취소된 배송만 분석해 취소 원인을 파악할 수 있습니다. 프로세스 흐름을 해석하는 데 필요한 맥락도 제공합니다. 중요한 이유 배송 완료, 취소 또는 운송 중 여부를 기준으로 배송 건을 필터링하고 분석할 수 있도록 전체 결과를 보여줍니다. 확보 방법 SAP TM의 Freight Order 또는 Freight Booking 문서 헤더에 있는 전체 상태 필드입니다. 예시 계획 중운송 준비 완료운송 실행 중운송 완료취소됨 | |||
| 분쟁 사유 DisputeReason | 운송 청구서에 이의를 제기할 때 입력하는 사유입니다. | ||
| 설명 운송사 청구 금액이 SAP TM에서 계산한 예상 비용과 일치하지 않으면 분쟁이 생성됩니다. 이 속성에는 '요율 오류', '중복 청구서', '승인되지 않은 부대 비용' 등 차이의 사유가 기록됩니다. 분쟁 사유 분석은 운송비 청구 오류 및 분쟁률 대시보드에 중요합니다. 기준 데이터 문제, 운송사 오류, 운영상 문제 등 청구 금액이 부정확한 원인을 파악할 수 있습니다. 분석 결과에 따라 분쟁을 줄이기 위한 조치를 취하면 결제 주기를 단축하고 관리 업무를 줄일 수 있습니다. 중요한 이유 운송비 청구 오류의 원인을 파악해 청구서 분쟁을 줄이고 정산 프로세스를 개선하기 위한 조치를 수립할 수 있습니다. 확보 방법 Freight Settlement Document와 연결된 분쟁 관리 케이스에 이 정보가 기록됩니다. 예시 요율 불일치중량 오류승인되지 않은 체선료중복 청구서 | |||
| 분쟁 여부 IsDisputed | 배송 건의 운송 청구서에 분쟁이 발생했는지를 나타내는 참/거짓 값입니다. | ||
| 설명 이 계산된 값은 운송 정산 분쟁이 발생한 배송 건을 식별합니다. 분쟁이 생성되었으면 true, 그렇지 않으면 false입니다. '운송 분쟁 생성' 활동이 있거나 '분쟁 사유'가 비어 있지 않은 경우를 기준으로 계산할 수 있습니다. 이 속성을 사용하면 운송 정산 프로세스를 쉽게 분석할 수 있습니다. 운송비 청구 불일치율 KPI를 간편하게 계산하고 분쟁이 발생한 배송 건을 모두 필터링할 수 있습니다. 이후 운송사, 운송 경로, 비용 유형 등 공통 특성을 조사해 청구 오류의 원인을 찾을 수 있습니다. 중요한 이유 문제가 있는 운송 정산을 쉽게 식별해 분쟁률을 빠르게 계산하고 청구 오류의 원인을 분석할 수 있습니다. 확보 방법 이 속성은 SAP TM에 저장되지 않습니다. Freight Settlement Document에 연결된 분쟁 케이스가 있는지 확인해 계산해야 합니다. 예시 truefalse | |||
| 사용자 이름 UserName | 활동을 수행한 사람의 사용자 ID 또는 이름입니다. | ||
| 설명 이 속성은 'Shipment Planned' 또는 'Invoice Verified'와 같은 수동 활동을 수행한 직원이나 사용자를 식별합니다. 프로세스 단계를 수행한 개인 또는 팀과 연결합니다. 사용자별 활동을 분석하면 업무량 분배를 파악하고 교육 필요성을 확인하며 성과가 높은 직원을 찾을 수 있습니다. 또한 규정 준수와 감사에 필요한 기록으로, 누가 언제 어떤 작업을 수행했는지 명확히 보여줍니다. 사용자마다 같은 작업을 수행하는 방식이 어떻게 다른지도 확인할 수 있습니다. 중요한 이유 수동 프로세스 단계를 사용자별로 연결해 업무량, 개인 성과, 교육 기회를 분석할 수 있습니다. 확보 방법 운송 문서의 변경 로그나 문서 헤더 테이블에서 확인할 수 있습니다. 예를 들어 '생성자' 또는 '변경자' 필드(예: ERNAM, AENAM)가 해당합니다. 예시 CB998030SMITHJPLANNER_EU | |||
| 소스 시스템 SourceSystem | 이벤트 데이터가 생성된 시스템입니다. | ||
| 설명 이 속성은 SAP TM, SAP ERP 또는 외부 운송사 포털과 같이 데이터를 생성한 소스 시스템을 식별합니다. 데이터의 출처를 파악하고 시스템 간 데이터 연동 지점을 이해하는 데 도움이 됩니다. 복잡한 시스템 환경에서는 소스 시스템을 알아야 데이터를 검증하고 연동 문제를 해결하며 각 시스템이 전체 프로세스에 어떻게 기여하는지 이해할 수 있습니다. 예를 들어 내부 시스템에서 보고한 이벤트와 제3자 물류 제공업체가 보고한 이벤트를 구분할 수 있습니다. 중요한 이유 데이터의 출처를 식별합니다. 데이터 거버넌스, 문제 해결, 여러 시스템에 걸친 프로세스 조율을 이해하는 데 필요합니다. 확보 방법 이 정보는 시스템 로그에 저장되는 경우가 많으며, 데이터 입력을 생성한 인터페이스나 사용자를 기준으로 확인할 수도 있습니다. 예시 SAP_TM_P01SAP_ERP_E01CARRIER_PORTAL_XYZ | |||
| 예정 픽업일 ScheduledPickupDate | 운송사가 출하 지점에서 화물을 픽업하기로 계획된 날짜와 시간입니다. | ||
| 설명 예정 픽업일은 실제 운송을 시작하기로 합의한 시점입니다. 배송 실행 단계의 주요 마일스톤입니다. 여정의 첫 구간이 계획대로 진행되는지 확인하는 데 필요한 속성입니다. 예정 픽업 시각과 실제 '상품 픽업 완료' 이벤트 시각을 비교해 픽업 지연을 계산할 수 있습니다. 이를 통해 출하 장소와 운송사의 성과 및 신뢰도를 평가할 수 있습니다. 중요한 이유 픽업이 계획대로 진행됐는지 측정하는 기준으로, 화물의 실제 운송이 시작되는 시점의 지연을 파악하는 데 도움이 됩니다. 확보 방법 SAP TM의 Freight Order 경유지 순서에 저장되는 계획 날짜 및 시간입니다. 예시 2023-05-18T09:00:00Z2023-05-30T14:00:00Z2023-06-12T10:30:00Z | |||
| 지연 사유 DelayReason | 배송 지연 사유를 설명하는 코드 또는 텍스트입니다. | ||
| 설명 지연 사유 속성에는 '악천후', '통관 보류', '운송사 지연' 등 계획된 일정에서 벗어난 원인이 기록됩니다. 이 정보는 수동으로 입력하거나 운송사의 이벤트 메시지를 통해 전달되는 경우가 많습니다. 이 속성은 근본 원인 분석에 유용합니다. 배송이 늦었다는 사실을 넘어 지연 원인을 파악할 수 있습니다. 지연 사유를 분류하고 발생 빈도를 분석하면 반복되는 문제를 찾아낼 수 있습니다. 운송사와의 소통을 개선하거나 혼잡을 피하도록 경로를 최적화하는 등 영향이 큰 영역에 개선 노력을 집중할 수 있습니다. 중요한 이유 배송 지연의 원인을 파악해 예외 상황을 줄이고 정시 배송 성과를 개선할 수 있습니다. 확보 방법 SAP TM의 이벤트 관리 프레임워크에서 '도착/출발 지연' 이벤트가 보고될 때 이벤트 코드와 사유로 기록할 수 있습니다. 예시 기상 지연세관 검사항만 혼잡기계 고장 | |||
| 최근 데이터 업데이트 LastDataUpdate | process mining 데이터 세트를 가장 최근에 추출하거나 새로 고친 시점의 타임스탬프입니다. | ||
| 설명 이 속성은 분석 대상 데이터의 최신성을 나타냅니다. SAP TM과 같은 소스 시스템에서 process mining 도구로 데이터를 마지막으로 가져온 날짜와 시간을 보여줍니다. 대시보드나 분석 결과를 해석할 때 데이터가 얼마나 최신인지 알려주는 중요한 메타데이터입니다. 사용자는 실시간 정보인지 이전 기간의 스냅샷인지 확인할 수 있어 시의적절하고 정확한 의사결정을 내리는 데 도움이 됩니다. 중요한 이유 분석 데이터의 최신성을 파악하는 데 필요한 정보를 제공해 사용자가 데이터가 얼마나 최신인지 알 수 있게 합니다. 확보 방법 일반적으로 데이터 수집 과정에서 ETL(Extract, Transform, Load) 도구 또는 데이터 파이프라인이 생성해 저장합니다. 예시 2023-10-27T08:00:00Z2023-10-26T08:00:00Z | |||
| 출발 국가 OriginCountry | 배송이 시작되는 국가입니다. | ||
| 설명 이 속성은 운송이 시작되는 국가를 나타내며, 최초 픽업 장소의 주소에서 가져옵니다. 출발 국가별로 프로세스를 분석하면 지역에 따른 성과, 비용, 복잡성 차이를 파악할 수 있습니다. 통관 시간이 길거나 운송 비용이 높고 지연이 잦은 국가를 확인할 수 있습니다. 이러한 지역별 분석은 글로벌 공급망을 관리하고 지역별 물류 전략을 수립하는 데 필요합니다. 중요한 이유 지역별 배송 성과를 분석해 지역에 따른 병목, 비용 요인, 프로세스 차이를 파악할 수 있습니다. 확보 방법 Freight Order의 첫 번째 경유지에 있는 출발지 주소 정보의 일부입니다. 예시 DEUSCNMX | |||
운송 관리 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 대금 지급 완료 | 이 마지막 활동은 운송 서비스 대금이 운송사에 지급되었음을 확인합니다. 일반적으로 SAP TM에서 검증된 송장을 받은 후 연동 ERP 시스템에서 발생합니다. | ||
| 중요한 이유 이 단계는 운송 프로세스 전체의 실제 종료를 나타냅니다. 전체 프로세스 소요 시간과 정시 지급 KPI를 측정하는 데 필요합니다. 확보 방법 이 정보는 ERP 시스템(예: S/4HANA Finance)에 저장됩니다. 송장 번호를 통해 Freight Settlement Document와 연결할 수 있습니다. 상태 업데이트가 SAP TM으로 전송될 수도 있으며, 그렇지 않으면 BKPF 및 BSEG와 같은 ERP 테이블에서 데이터를 가져와야 합니다. 기록 ERP 시스템에서 지급 반제 날짜를 가져와 송장 참조 정보를 통해 운송 건과 연결합니다. 이벤트 유형 explicit | |||
| 운송 계획 수립 | 운송 요건을 구체적인 운송 계획으로 통합하면 이 활동이 기록됩니다. 도로·철도 운송의 Freight Order 또는 해상·항공 운송의 Freight Booking을 생성하고 저장할 때 기록되며, 여기에는 계획된 경로와 리소스가 포함됩니다. | ||
| 중요한 이유 이 단계가 완료되어야 물류 실행을 시작할 수 있습니다. 요청 접수부터 이 활동까지 걸리는 시간은 계획 효율성을 측정하는 주요 KPI입니다. 확보 방법 이 이벤트는 Freight Order 또는 Freight Booking 문서가 생성될 때 기록됩니다. 문서의 계획 상태가 'Planned'로 변경되는 등 상태 변경을 기준으로 추정할 수도 있습니다. 헤더 데이터는 보통 /SCMTMS/D_TORROT 테이블에서 확인합니다. 기록 Freight Order 또는 Freight Booking 문서의 생성 타임스탬프를 사용합니다. 이벤트 유형 explicit | |||
| 운송 요청 접수 | 이 활동은 운송 요건이 생성되면서 운송 프로세스가 시작됨을 나타냅니다. SAP TM에서는 일반적으로 Forwarding Order(FWO) 또는 Order-based Transportation Requirement(OTR)가 생성될 때 기록됩니다. | ||
| 중요한 이유 이 이벤트는 전체 운송 프로세스의 주요 시작점입니다. 계획 완료까지 걸리는 시간을 분석하면 계획 효율성을 측정할 수 있습니다. 확보 방법 Forwarding Order(문서 유형 FWO) 또는 기타 운송 요건 문서가 생성될 때 이 이벤트가 기록됩니다. /SCMTMS/D_TORROT과 같은 헤더 테이블의 생성 타임스탬프를 이벤트 시간으로 사용합니다. 기록 Forwarding Order 또는 Transportation Requirement 문서의 생성 날짜와 시간을 기록합니다. 이벤트 유형 explicit | |||
| 운송 취소 | 요청 또는 계획이 완료된 후 운송이 취소되면 이 활동이 기록됩니다. 실제 운송으로 이어지지 않는 프로세스의 종료 단계입니다. | ||
| 중요한 이유 취소를 추적하면 고객 수요 변경이나 계획 오류 등 프로세스가 중단된 원인을 파악할 수 있습니다. 취소율이 높으면 주문 관리나 계획에 근본적인 문제가 있을 수 있습니다. 확보 방법 Forwarding Order 또는 Freight Order의 수명 주기 상태가 'Cancelled'로 변경되면 이 이벤트를 추정할 수 있습니다. 상태가 변경된 시점이 이벤트 시간입니다. 기록 문서의 수명 주기 상태가 'Cancelled'로 설정된 시점의 타임스탬프를 기록합니다. 이벤트 유형 inferred | |||
| 운송사 배정 | 특정 운송 서비스 제공업체, 즉 운송사를 선택해 운송 건에 배정하면 이 활동이 기록됩니다. 수동 배정, 자동 계획 또는 입찰 절차를 통해 배정할 수 있습니다. | ||
| 중요한 이유 운송사를 배정해야 운송을 확정하고 실행할 수 있습니다. 이 활동을 추적하면 운송사 선정 절차를 분석하고 적시에 예약이 이루어지는지 확인할 수 있습니다. 확보 방법 Freight Order 또는 Freight Booking의 운송사 필드('Carrier' 역할의 파트너)가 입력될 때 기록됩니다. 입찰의 경우 Freight Request for Quotation이 낙찰될 때 기록됩니다. 기록 Freight Order에서 운송사 파트너 기능이 처음 입력되거나 확정된 시점을 확인합니다. 이벤트 유형 inferred | |||
| 운임 정산 문서 생성 | 운송사에 지급할 운송 비용을 계산하는 Freight Settlement Document(FSD)가 생성되면 이 활동이 기록됩니다. 이 문서는 비용 발생액 계산과 송장 검증에 주로 사용됩니다. | ||
| 중요한 이유 이 단계부터 운송 프로세스의 재무 정산이 시작됩니다. 배송 완료부터 정산 문서 생성까지 걸리는 시간을 분석하면 재무 처리 과정의 병목을 파악할 수 있습니다. 확보 방법 Freight Settlement Document가 생성될 때 명시적으로 기록되는 이벤트입니다. 문서의 생성 타임스탬프는 헤더 테이블 /SCMTMS/D_SFIRHD에서 확인할 수 있습니다. 기록 Freight Settlement Document의 생성 날짜와 시간을 사용합니다. 이벤트 유형 explicit | |||
| 인도 증명서 수신 | 운송사로부터 서명된 인도 증명서(Proof of Delivery, POD)를 받아 시스템에 기록하면 이 활동이 발생합니다. 수령인이 화물을 인수했음을 확인하는 단계입니다. | ||
| 중요한 이유 POD 수신은 고객 청구와 운송사 운임 정산에 필요한 단계입니다. 이 단계가 지연되면 현금 전환 주기에 직접 영향을 줍니다. 확보 방법 일반적으로 Freight Order의 POD 상태가 'Received'로 변경되는 등 상태 변경을 기준으로 추정합니다. 상태 필드가 변경된 시점이 활동의 타임스탬프가 됩니다. 기록 Freight Order의 Proof of Delivery 상태가 'Received'로 업데이트된 시점의 타임스탬프를 기록합니다. 이벤트 유형 inferred | |||
| 화물 배송 완료 | 운송 건이 최종 목적지에 도착해 실제 운송이 완료되면 이 활동이 기록됩니다. 운송사가 수하인 위치에서 화물을 하역했다고 보고할 때 기록됩니다. | ||
| 중요한 이유 정시 배송 성과와 고객 만족도를 측정하는 가장 중요한 단계입니다. 일반적으로 청구 및 정산 절차를 시작하는 기준이 되기도 합니다. 확보 방법 SAP TM에서 'Arrival at Destination' 또는 'Unloading End' 실행 이벤트로 기록되어 Freight Order의 실행 상태가 업데이트됩니다. 이 데이터는 운송사에서 받는 경우가 많습니다. 기록 Freight Order의 최종 경유지에서 보고된 'Arrival at Destination' 실행 이벤트의 타임스탬프를 사용합니다. 이벤트 유형 explicit | |||
| 화물 픽업 완료 | 운송사가 화물을 적재하고 화주 위치에서 출발했다고 보고하면 이 활동이 기록되며, 화물의 실제 운송이 시작되었음을 나타냅니다. | ||
| 중요한 이유 이 주요 실행 단계는 운송 중 단계의 시작을 나타냅니다. 정시 운송 성과를 추적하고 정확한 운송 현황을 제공하는 데 중요합니다. 확보 방법 이 이벤트는 일반적으로 SAP TM과 통합된 SAP Event Management에서 'Departure' 또는 'Loading End' 이벤트로 기록됩니다. 이 이벤트는 Freight Order의 실행 상태를 업데이트합니다. Freight Order에 직접 기록할 수도 있습니다. 기록 Freight Order의 출발지에서 보고된 'Departure' 실행 이벤트의 타임스탬프를 사용합니다. 이벤트 유형 explicit | |||
| 세관 신고서 제출 | 국제 운송의 경우, 이 활동은 세관 당국에 필요한 통관 서류를 제출하는 것을 의미합니다. 화물을 수출하거나 수입하기 위한 통관 승인을 받는 데 필요한 단계입니다. | ||
| 중요한 이유 세관 신고서를 제때 제출해야 국경에서의 지연을 방지할 수 있습니다. 이 활동을 통해 통관 대행 절차의 효율성을 모니터링할 수 있습니다. 확보 방법 통관 대행사가 보고한 특정 실행 이벤트 또는 SAP GTS와 같은 연동 통관 관리 시스템의 상태 변경으로 이 이벤트를 기록할 수 있습니다. 이에 따라 Freight Order가 업데이트됩니다. 기록 'Customs Declaration Filed' 실행 이벤트 또는 이에 해당하는 상태 변경의 타임스탬프를 기록합니다. 이벤트 유형 explicit | |||
| 송장 검증 완료 | 운송사 송장이 Freight Settlement Document와 성공적으로 대조되어 지급 승인을 받으면 이 활동이 기록됩니다. ERP 시스템에서 지급 절차를 시작하기 전 마지막 단계입니다. | ||
| 중요한 이유 이 활동으로 운임 비용의 감사 및 검증 절차가 완료됩니다. 이 단계가 지연되면 운송사 대금 지급이 늦어져 거래 관계에 악영향을 줄 수 있습니다. 확보 방법 Freight Settlement Document의 상태가 'Ready for Accrual' 또는 'Transferred for Posting'으로 변경되면 이 이벤트를 추정할 수 있습니다. 이는 지급을 위해 ERP 시스템으로 전송되었음을 나타냅니다. 기록 FSD의 수명 주기 상태가 지급 준비 완료 또는 전기 완료를 나타내도록 변경된 시점의 타임스탬프를 추적합니다. 이벤트 유형 inferred | |||
| 운송 경로 변경 | 운송이 확정된 후 경로나 일정이 계획에 없이 변경되면 이 활동이 기록됩니다. 운송 차질, 고객 요청 또는 물류 문제로 변경될 수 있습니다. | ||
| 중요한 이유 경로 변경은 비용 증가와 지연으로 이어지는 경우가 많습니다. 변경 빈도와 원인을 파악하면 계획 정확도와 운영 안정성을 높일 수 있습니다. 확보 방법 운송 실행이 시작된 후 Freight Order의 구간, 위치 또는 날짜가 크게 변경되었는지 확인해 이 이벤트를 추정합니다. 변경 문서인 CDHDR 및 CDPOS 테이블을 분석할 수 있습니다. 기록 'Shipment Confirmed by Carrier' 이벤트 이후 Freight Order 문서의 주요 경로 필드가 변경되었는지 확인합니다. 이벤트 유형 inferred | |||
| 운송사 운송 확정 | 운송사가 계획된 대로 운송을 수행하기로 동의하면 이 이벤트가 기록됩니다. 일반적으로 EDI 메시지, 운송사 포털 업데이트 또는 수동 입력으로 확정 정보가 전달되어 Freight Order의 상태가 변경됩니다. | ||
| 중요한 이유 운송사 확정은 운송 계획에 대한 이행 약속을 제공해 불확실성을 줄입니다. 확정이 늦어지면 전체 운송 일정이 위험해질 수 있습니다. 확보 방법 Freight Order 또는 Freight Booking의 확정 상태 필드가 변경되면 이 이벤트를 추정할 수 있습니다. 문서의 상태 관리에 'Confirmed'와 같은 상태 값이 설정됩니다. 기록 Freight Order 문서의 확정 상태 필드 변경을 추적합니다. 이벤트 유형 inferred | |||
| 운임 분쟁 생성 | 운송사 송장과 Freight Settlement Document에 계산된 비용 간의 불일치가 발견되면 이 이벤트가 발생합니다. 이후 분쟁 해결 워크플로가 시작됩니다. | ||
| 중요한 이유 분쟁이 발생하면 운송사 대금 지급이 지연되고 해결을 위한 행정 업무가 늘어납니다. 이 활동을 추적하면 잘못된 요율이나 부대 비용 등 청구 오류의 근본 원인을 파악할 수 있습니다. 확보 방법 Freight Settlement Document의 상태가 'Dispute'로 변경되면 이 이벤트를 추정할 수 있습니다. 별도의 분쟁 케이스 문서가 생성될 수도 있습니다. 기록 Freight Settlement Document의 상태가 분쟁으로 설정된 시점의 타임스탬프를 기록합니다. 이벤트 유형 inferred | |||
| 통관 완료 | 세관 당국이 운송 건을 승인해 다음 단계로 진행할 수 있음을 나타내는 활동입니다. 국제 물류에서 중요한 단계로, 큰 병목이 될 수 있는 요인을 해소합니다. | ||
| 중요한 이유 통관은 글로벌 공급망에서 큰 지연을 일으키는 경우가 많습니다. 이 활동의 소요 시간과 성공률을 추적하면 국제 운송 시간을 개선하는 데 도움이 됩니다. 확보 방법 일반적으로 통관 대행사 또는 외부 운송 현황 제공업체가 보고한 'Customs Clearance' 실행 이벤트로 기록되며, Freight Order의 실행 추적 정보에 반영됩니다. 기록 Freight Order와 연결된 'Customs Clearance' 실행 이벤트의 보고 타임스탬프를 사용합니다. 이벤트 유형 explicit | |||
데이터 추출 안내
단계
- CDS View API 확인 및 활성화: SAP S/4HANA 시스템에 로그인합니다. 트랜잭션
/IWFND/MAINT_SERVICE를 사용해 핵심 CDS View에 필요한 OData 서비스가 활성화되어 있는지 확인합니다. I_TransportationOrder, C_TranspOrdExecutionEvent, I_ForwardingOrder, I_FreightSettlementDocument 관련 서비스를 확인합니다. 활성화되어 있지 않으면 SAP 관리자와 협의해 백엔드 시스템에서 서비스를 추가하고 활성화합니다. - API 연결 설정: SAP 관리자에게 OData 서비스의 루트 URL을 요청합니다. requests 라이브러리를 사용하는 Python 스크립트, 상용 ETL 도구 또는 Postman과 같은 클라이언트 애플리케이션을 설정해 API에 연결합니다. 일반적으로 기본 인증(사용자 이름과 비밀번호) 또는 보안성이 더 높은 OAuth 2.0을 사용하도록 인증을 구성해야 합니다.
- 추출 범위 정의: 데이터 추출 범위를 정합니다. 예를 들어 최근 6개월을 지정합니다. 분석 대상 프로세스에 맞는 데이터를 확보할 수 있도록 회사 코드와 같은 조직 단위나 Freight Order Type과 같은 문서 유형을 선택합니다.
- 기본 배송 데이터 조회: I_TransportationOrder CDS View를 조회합니다. 이 View는 Freight Order 또는 Freight Booking이라고도 하는 배송의 중심 객체입니다. OData
$select매개변수로 필요한 열을 선택하고 CarrierName, ModeOfTransport, RequestedDeliveryDate와 같은 권장 속성을 포함합니다.$filter를 적용해 날짜와 기타 범위 조건에 맞는 데이터만 가져옵니다. - 실행 및 운송 이벤트 조회: C_TranspOrdExecutionEvent CDS View에서 주요 물류 이벤트를 추출합니다. 'Goods Picked Up'(DEPARTURE), 'Goods Delivered'(ARRIVAL_AT_DESTINATION)와 같은 활동에 해당하는
EventCode값을 기준으로 필터링합니다. TransportationOrder UUID를 사용해 이 데이터를 기본 배송 데이터와 결합합니다. - 관련 비즈니스 객체 조회: 전체 프로세스를 파악하려면 관련 CDS View도 조회해야 합니다. I_ForwardingOrder에서 'Transportation Request Received' 활동을, I_FreightSettlementDocument에서 'Freight Settlement Created', 'Freight Dispute Created', 'Invoice Verified'와 같은 재무 활동을 조회합니다.
- 상태 기반 활동 추출: 일부 활동은 개별 이벤트가 아니라 기본 문서의 상태 변경으로 기록됩니다. 'Carrier Assigned', 'Shipment Confirmed By Carrier', 'Shipment Cancelled'와 같은 활동은 I_TransportationOrder View를 조회하고, 관련 상태 필드의
LastChangeDateTime을 이벤트 시간으로 사용합니다. 상태 코드를 비즈니스 활동에 정확히 대응시켜야 합니다. - 데이터 통합 및 변환: 모든 원본에서 추출한 데이터를 하나의 이벤트 로그 구조로 통합합니다. 추출한 각 활동에 대해 ShipmentId, ActivityName, EventTime 열을 포함하는 행을 만듭니다. 기본 배송 데이터에서 권장하는 모든 속성이 해당 배송의 각 행에 포함되도록 합니다. 이 단계는 개념적으로 SQL의
UNION ALL연산과 같습니다. - 복합 이벤트 및 외부 이벤트 처리: 'Customs Cleared' 또는 'Payment Processed'와 같은 활동은 특정 필드나 외부 시스템에 기록될 수 있습니다. 제공된 조회 로직은 표준 필드를 대리 지표로 사용합니다. 통관 관련 CDS View를 결합하거나 Freight Settlement Document 번호를 기준으로 별도의 ERP 추출 데이터와 연결하도록 조회 로직을 조정해야 할 수 있습니다.
- ProcessMind에 맞게 형식 지정: 최종 통합 데이터 세트를 CSV 파일로 저장합니다. 업로드에 필요한 열 이름을 사용하고, 예를 들어 도구 설정에서
ShipmentId열을CaseId필드에 매핑합니다. 타임스탬프 형식이 일관적인지 확인합니다. UTC 형식(YYYY-MM-DDTHH:MM:SSZ)을 권장합니다.
구성
- 주요 CDS 뷰: 데이터 추출에는 주로 I_TransportationOrder(운송 주문), C_TranspOrdExecutionEvent(실행 이벤트), I_ForwardingOrder(운송 요청), I_FreightSettlementDocument(정산)가 사용됩니다.
- 날짜 범위 필터링: 데이터 양을 관리하려면 날짜 필터를 적용해야 합니다. I_TransportationOrder의
CreationDateTime또는 C_TranspOrdExecutionEvent의ActualBusinessDateTime을 사용합니다. 초기 분석에는 3~6개월 범위를 권장합니다. - 문서 유형 필터링: 분석 대상을 좁히려면
TransportationOrderType필드로 특정 문서 유형을 필터링합니다. 이를 통해 일반 출고와 재고 이동 등 서로 다른 물류 시나리오를 구분할 수 있습니다. - 조직 필터: 필요한 경우
PurchasingOrganization또는 다른 조직 수준 필드로 필터링해 특정 사업부나 지역의 데이터만 추출합니다. - API 페이지네이션: 대규모 데이터 세트는 OData 매개변수
$top및$skip을 사용해 여러 페이지로 나눠 가져옵니다. 이렇게 하면 API 시간 초과를 방지하고 클라이언트 측 메모리 사용량을 줄일 수 있습니다. 페이지당 1,000~5,000행이 적절한 경우가 많습니다. - 사전 요건: 추출을 수행하는 사용자 또는 서비스 계정에는 기반 OData 서비스(권한 객체 S_SERVICE)와 CDS 뷰의 비즈니스 데이터에 대한 권한이 필요합니다. 해당 서비스는 SAP Gateway(
/IWFND/MAINT_SERVICE)에서 활성화해야 합니다.
샘플 쿼리 sql
WITH Shipments AS (
SELECT
TransportationOrder AS ShipmentId,
CarrierName,
TranspOrdExecutionBlockRsnCode,
TransportationMode AS ModeOfTransport,
ShippingType AS ShipmentType,
CreationDateTime AS ShipmentCreationTime,
LastChangeDateTime,
LifeCycleStatus,
ConfirmationStatus,
OverallExecutionStatus,
DeliveryOverallStatus,
PlannedDepDateTimeReqByCust AS RequestedDeliveryDate,
TotalChargesAmountInTransacCrcy AS TotalFreightCost
FROM I_TransportationOrder
WHERE
CreationDateTime >= '[START_DATE]' AND CreationDateTime <= '[END_DATE]'
-- AND TransportationOrderType IN ('[Your_Type_1]', '[Your_Type_2]')
)
SELECT
fwo.PurchasingDocument AS ShipmentId,
'Transportation Request Received' AS ActivityName,
fwo.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM I_ForwardingOrder AS fwo
LEFT JOIN Shipments s ON fwo.PurchasingDocument = s.ShipmentId
WHERE fwo.CreationDateTime >= '[START_DATE]' AND fwo.CreationDateTime <= '[END_DATE]'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Planned' AS ActivityName,
s.ShipmentCreationTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
UNION ALL
SELECT
s.ShipmentId,
'Carrier Assigned' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CarrierName IS NOT NULL
UNION ALL
SELECT
s.ShipmentId,
'Shipment Confirmed By Carrier' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.ConfirmationStatus = 'C' -- 'Confirmed'
UNION ALL
SELECT
s.ShipmentId,
'Goods Picked Up' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'DEPARTURE'
UNION ALL
SELECT
s.ShipmentId,
'Customs Declaration Filed' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsRelevance IS NOT NULL -- This is a proxy, system config dependent
UNION ALL
SELECT
s.ShipmentId,
'Customs Cleared' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsOverallStatus = '4' -- 'Customs Cleared'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Rerouted' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.TranspOrdExecutionBlockRsnCode = '[Your Rerouting Reason Code]'
UNION ALL
SELECT
s.ShipmentId,
'Goods Delivered' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'ARRIVAL_AT_DESTINATION'
UNION ALL
SELECT
s.ShipmentId,
'Proof Of Delivery Received' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.DeliveryOverallStatus = 'C' -- 'POD Received'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Settlement Created' AS ActivityName,
fsd.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Dispute Created' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.DisputeStatus = '1' -- 'In Dispute'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Invoice Verified' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.OverallLifeCycleStatus = '06' -- 'Posted for Accruals'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Cancelled' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.LifeCycleStatus = 'X' -- 'Cancelled'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Payment Processed' AS ActivityName,
fsd.LastChangeDateTime AS EventTime, -- Approximation, actual payment is in ERP
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.InvoiceProcessingStatus = 'C' -- 'Completely Invoiced' 단계
- 승인된 SQL 클라이언트, 데이터베이스 뷰 또는 추출 서비스를 통해 SAP TM HANA 스키마에 직접 읽기 권한이 있는지 확인합니다. 관련 SAP TM 테이블을 읽는 데 필요한 연결 문자열, 자격 증명, 스키마 이름 및 권한을 확보합니다. 필요한 보안 및 변경 승인을 받지 않은 상태에서 운영 시스템을 직접 조회하지 마십시오.
- 시스템에서 실제 테이블 및 열 이름을 확인합니다. 아래 쿼리는 핵심 테이블로 /SCMTMS/D_TORROT 및 /SCMTMS/D_TOSTOP을 사용하지만, 상태, 파트너, 날짜, 비용, 통관, 문서 및 결제 데이터는 SAP TM 릴리스와 구현 방식에 따라 추가 테이블이나 확장에 저장될 수 있습니다. 시스템 카탈로그와 데이터 모델을 확인한 뒤 문서화된 자리표시자만 바꿉니다.
- [시작 타임스탬프]와 [종료 타임스탬프]를 사용해 추출 기간을 지정합니다. 초기 분석에는 일반적으로 최근 3~6개월이 적절합니다. 쿼리 성능과 이벤트 이력 보존 기간을 확인한 후에만 더 넓은 기간을 사용합니다.
- 운송 케이스의 식별 키를 확인합니다. 쿼리는 /SCMTMS/D_TORROT의 TOR_ID를 운송 식별자로 사용합니다. 구현 환경에서 다른 안정적인 식별자를 사용한다면 모든 활동 분기에서 케이스 키를 일관되게 바꾸고, 가능한 경우 원본 문서 식별자를 추가 감사 속성으로 유지합니다.
- 각 비즈니스 활동을 명시적인 소스 조건에 매핑합니다. ProcessMind는 이벤트 로그를 있는 그대로 읽으므로 쿼리는 추출된 활동마다 한 행을 생성합니다. 문서 순서, 누락된 타임스탬프 또는 상태 진행을 바탕으로 마일스톤을 추론하지 않습니다.
- 운송 계획 담당자 및 비즈니스 프로세스 담당자와 함께 상태 및 타임스탬프 매핑을 검증합니다. 특히 요청 생성, 계획 수립, 운송사 배정, 운송사 확인, 픽업, 통관 신고, 통관 완료, 경로 변경, 배송, POD 수신, 운임 정산, 분쟁, 송장 검증, 취소 및 결제에 해당하는 값을 확인합니다.
- 승인된 SQL 클라이언트에서 쿼리를 실행합니다. 이벤트마다 한 행이 생성되는지, ShipmentId와 ActivityName이 비어 있지 않은지, EventTime이 유효한지 확인합니다. 일대다 조인으로 중복 행이 생기는지 점검하고 필요한 경우 소스 매핑이나 집계 로직을 조정합니다.
- 해당 소스 필드를 사용할 수 있다면 권장 속성을 결과에 추가합니다. 시스템별 메타데이터를 확인하지 않고는 안전하게 이름을 지정할 수 없는 필드에는 쿼리에 일반 자리표시자가 포함되어 있습니다. 검증된 열 또는 승인된 뷰로 확인한 경우에만 자리표시자를 바꿉니다.
- 최종 데이터 품질 규칙을 적용합니다. 케이스 식별자나 이벤트 타임스탬프가 없는 행을 제거하고, 타임스탬프를 하나의 시간대로 통일하며, 감사 목적으로 소스 타임스탬프를 보존합니다. EndTime이 EventTime보다 앞서지 않는지 확인합니다. 소스 레코드가 누락된 경우 가상 이벤트를 만들지 마십시오.
- 결과를 UTF-8 CSV 또는 ProcessMind에서 지원하는 다른 표 형식으로 내보냅니다. 필수 열 이름인 ShipmentId, ActivityName, EventTime을 그대로 사용합니다. 값이 있는 경우 EndTime과 권장 속성도 포함합니다. 파일을 업로드하거나 승인된 쿼리 결과를 ProcessMind에 연결한 다음 Shipment 케이스 식별자와 Activity Name 필드가 올바르게 매핑됐는지 확인합니다.
구성
- 핵심 원본 테이블: 운송 주문 또는 Freight Order의 기본 데이터에는 /SCMTMS/D_TORROT을, 경유지 및 마일스톤 데이터에는 /SCMTMS/D_TOSTOP을 사용합니다. 배포 전에 대상 SAP TM 시스템에서 추가 원본 객체를 모두 검증합니다.
- 케이스 식별자: 안정적인 배송 또는 Freight Order 식별자를 사용합니다. 예시 조회에서는 TOR_ID를 ShipmentId로 사용합니다. 계획, 실행, 정산 및 ERP 결제 기록 전반에서 이 식별자가 유지되는지 확인합니다.
- 활동 매핑: 필수 활동 15개 모두에 대해 명시적인 원본 조건을 설정합니다. 각 활동은 실제 이벤트 로그 행으로 출력해야 합니다. ProcessMind는 다른 행을 바탕으로 활동을 추론하지 않습니다.
- 기간: 먼저 최근 3~6개월의 이력을 사용합니다. 각 원본 분기에서 가능한 한 이른 단계에 EventTime 조건을 적용합니다. 증분 적재에는 관리되는 워터마크를 사용하고, 늦게 반영되는 업데이트를 포착할 수 있도록 짧은 중복 기간을 둡니다.
- 비즈니스 필터: 구현 환경에 맞게 회사 코드, 구매 조직, 영업 조직, 문서 유형, 운송 수단, 운송사, 플랜트, 위치 및 상태 필터를 설정합니다. 해당 필드를 확인하지 못한 경우 [Company code filter]와 같은 자리표시자를 사용합니다.
- 타임스탬프 처리: 원본 타임스탬프를 일관된 시간대로 변환합니다. 원본에 날짜와 시간이 별도 필드로 저장되어 있다면 해당 HANA 릴리스에서 지원하는 시스템별 변환 방식을 사용해 결합합니다. 감사 추적이 필요한 경우 원본 타임스탬프를 보존합니다.
- 권장 속성: 검증된 원본 필드 또는 승인된 계산 View에서 CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery를 가져옵니다. 원본에 신뢰할 수 있는 값이 없으면 null로 둡니다.
- 성능: 기간을 제한하고 필요한 열만 선택하며, 조인 전에 필터링합니다. 제한 없는 전체 테이블 조회를 피하고 HANA 실행 계획을 검토합니다. 대규모 데이터 세트에는 파티션을 고려한 조건, 증분 추출, 스테이징 테이블 또는 승인된 계산 View를 사용합니다.
- 중복 제어: 일대다 조인으로 활동 하나에 여러 행이 생길 수 있습니다. 검증된 이벤트 키, 원본 문서 키 또는 결정론적 집계 규칙을 사용합니다. 유효한 반복 이벤트가 삭제될 수 있는 임의의 중복 제거는 하지 않습니다.
- 사전 요건: 필요한 데이터베이스 권한, SAP TM 데이터 접근 권한, 연결된 ERP 또는 정산 데이터 접근 권한, 승인된 추출 도구가 필요합니다. 관련 SAP TM 모듈, 통합 및 사용자 지정 확장이 활성화되어 있는지도 확인해야 합니다.
- 시스템별 매핑: 상태 코드, 파트너 역할, 통관 마일스톤, 정산 상태, 송장 상태 및 결제 상태는 릴리스와 구성에 따라 다릅니다. 매핑을 통제되는 구성 문서로 관리하고 업그레이드 후 테스트합니다.
샘플 쿼리 sql
WITH
base_tor AS (
SELECT
r.TOR_ID AS ShipmentId,
r.TOR_ID AS SourceDocumentId,
r.CREATED_AT AS RequestEventTime,
r.CREATED_AT AS PlannedEventTime,
r.CREATED_AT AS CarrierAssignedEventTime,
r.CREATED_AT AS CarrierConfirmedEventTime,
r.CREATED_AT AS PickupEventTime,
r.CREATED_AT AS CustomsFiledEventTime,
r.CREATED_AT AS CustomsClearedEventTime,
r.CREATED_AT AS ReroutedEventTime,
r.CREATED_AT AS DeliveredEventTime,
r.CREATED_AT AS PodReceivedEventTime,
r.CREATED_AT AS SettlementCreatedEventTime,
r.CREATED_AT AS DisputeCreatedEventTime,
r.CREATED_AT AS InvoiceVerifiedEventTime,
r.CREATED_AT AS CancelledEventTime,
r.CREATED_AT AS PaymentProcessedEventTime,
r.CREATED_AT AS EndTime,
CAST(NULL AS NVARCHAR(255)) AS CarrierName,
CAST(NULL AS TIMESTAMP) AS RequestedDeliveryDate,
CAST(NULL AS NVARCHAR(50)) AS ModeOfTransport,
CAST(NULL AS DECIMAL(19, 2)) AS TotalFreightCost,
CAST(NULL AS NVARCHAR(5)) AS IsOnTimeDelivery
FROM "/SCMTMS/D_TORROT" r
WHERE r.CREATED_AT >= TO_TIMESTAMP('[Start timestamp]')
AND r.CREATED_AT < TO_TIMESTAMP('[End timestamp]')
AND ('[Company code filter]' = '[Company code filter]' OR r.TOR_ID IS NOT NULL)
),
stop_data AS (
SELECT
s.TOR_ID AS ShipmentId,
MIN(s.STOP_SEQ) AS FirstStopSequence,
MAX(s.STOP_SEQ) AS LastStopSequence
FROM "/SCMTMS/D_TOSTOP" s
GROUP BY s.TOR_ID
),
source_data AS (
SELECT
b.ShipmentId,
b.SourceDocumentId,
b.RequestEventTime,
b.PlannedEventTime,
b.CarrierAssignedEventTime,
b.CarrierConfirmedEventTime,
b.PickupEventTime,
b.CustomsFiledEventTime,
b.CustomsClearedEventTime,
b.ReroutedEventTime,
b.DeliveredEventTime,
b.PodReceivedEventTime,
b.SettlementCreatedEventTime,
b.DisputeCreatedEventTime,
b.InvoiceVerifiedEventTime,
b.CancelledEventTime,
b.PaymentProcessedEventTime,
b.EndTime,
b.CarrierName,
b.RequestedDeliveryDate,
b.ModeOfTransport,
b.TotalFreightCost,
CASE
WHEN b.DeliveredEventTime IS NOT NULL
AND b.RequestedDeliveryDate IS NOT NULL
AND b.DeliveredEventTime <= b.RequestedDeliveryDate THEN 'true'
WHEN b.DeliveredEventTime IS NOT NULL
AND b.RequestedDeliveryDate IS NOT NULL THEN 'false'
ELSE NULL
END AS IsOnTimeDelivery
FROM base_tor b
LEFT JOIN stop_data s
ON s.ShipmentId = b.ShipmentId
),
event_log AS (
SELECT ShipmentId, 'Transportation Request Received' AS ActivityName, RequestEventTime AS EventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE RequestEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Planned', PlannedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PlannedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Carrier Assigned', CarrierAssignedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CarrierAssignedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Confirmed By Carrier', CarrierConfirmedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CarrierConfirmedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Goods Picked Up', PickupEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PickupEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Customs Declaration Filed', CustomsFiledEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CustomsFiledEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Customs Cleared', CustomsClearedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CustomsClearedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Rerouted', ReroutedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE ReroutedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Goods Delivered', DeliveredEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE DeliveredEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Proof Of Delivery Received', PodReceivedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PodReceivedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Freight Settlement Created', SettlementCreatedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE SettlementCreatedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Freight Dispute Created', DisputeCreatedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE DisputeCreatedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Invoice Verified', InvoiceVerifiedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE InvoiceVerifiedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Cancelled', CancelledEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CancelledEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Payment Processed', PaymentProcessedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PaymentProcessedEventTime IS NOT NULL
)
SELECT
ShipmentId,
ActivityName,
EventTime,
EndTime,
CarrierName,
RequestedDeliveryDate,
ModeOfTransport,
TotalFreightCost,
IsOnTimeDelivery,
SourceDocumentId
FROM event_log
WHERE ShipmentId IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY ShipmentId, EventTime, ActivityName; 단계
- 데이터 요건 정의: 필수 활동 15개 각각의 로직과 모든 속성을 먼저 확정합니다. SAP TM 시스템의 특정 상태 변경, 생성 이벤트 또는 문서 연결을 각 활동에 매핑해야 합니다. 예를 들어 'Goods Picked Up'을 나타내는 정확한 실행 상태를 확인합니다.
- ABAP 개발 환경 접속: SAP GUI에 로그인하고 트랜잭션 코드
SE38을 사용해 ABAP Editor를 엽니다. 새 프로그램 이름을 입력합니다. 예를 들어ZTM_PROCESS_EXTRACT를 입력하고 'Create'를 선택합니다. 제목을 입력하고 프로그램 유형을 'Executable Program'으로 설정합니다. - 선택 화면 만들기: 프로그램에서 사용자가 볼 선택 화면을 정의합니다. Freight Order 생성일 범위(
SO_CREDT)와 같은 데이터 필터 매개변수, 문서 유형(SO_TYPE) 또는 운송사(SO_CARR)와 같은 선택 옵션을 포함합니다. - 출력 구조 정의: 필수 이벤트 로그 형식에 맞는 내부 테이블 구조를 정의합니다. ShipmentId, ActivityName, EventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery 필드를 포함해야 합니다.
- 데이터 선택 로직 구현: 필수 활동 15개 각각의 데이터를 선택하는 ABAP 로직을 작성합니다. 일반적으로 여러 SAP TM 테이블을 조회해야 합니다. 지정한 기간에 해당하는 Freight Order와 같은 기본 배송 문서를 먼저 선택합니다.
- 계획 및 실행 이벤트 추출: 선택한 각 배송 문서(예: Freight Order)와 관련된 테이블 및 비즈니스 객체를 조회해 이벤트별 타임스탬프를 찾습니다.
/SCMTMS/D_TORROT테이블에서 Freight Order 생성('Shipment Planned'), 운송사 지정('Carrier Assigned'), 'Goods Picked Up' 및 'Goods Delivered'에 해당하는 실행 상태 변경을 확인합니다. 선행 Forwarding Order(/SCMTMS/D_TRQROT)의 생성 시점은 'Transportation Request Received'를 나타낼 수 있습니다. - 운송사 확인 및 경로 변경 추출: Freight Order와 관련된 상태 테이블 또는 변경 문서(CDHDR/CDPOS)를 조회해
CONFIRMATION상태가 설정된 시점을 찾습니다. 이 시점은 'Shipment Confirmed By Carrier'를 나타냅니다. 마찬가지로 경로 정보의 주요 변경을 확인해 'Shipment Rerouted'를 추출합니다. - 통관 이벤트 추출: SAP Global Trade Services(GTS) 또는 유사한 모듈을 사용하는 경우 'Customs Declaration Filed' 및 'Customs Cleared' 이벤트는 연결된 문서에 기록되는 경우가 많습니다. Freight Order의 문서 흐름(
/SCMTMS/D_TORDOC)을 조회해 관련 문서와 생성 또는 상태 변경 시점을 찾도록 로직을 구성합니다. - 정산 및 분쟁 이벤트 추출: Freight Settlement Document 헤더 테이블(
/SCMTMS/D_SFIRHD)과 관련 항목 및 상태를 조회해 'Freight Settlement Created', 'Freight Dispute Created', 'Invoice Verified' 이벤트를 추출합니다. 원래ShipmentId와 연결합니다. - 데이터 통합: 찾은 이벤트마다 최종 내부 테이블에 새 레코드를 만듭니다. 해당 활동을 ActivityName에, 이벤트 타임스탬프를 EventTime에, Freight Order 또는 Freight Booking ID를 ShipmentId에 입력합니다. 나머지 속성은 원본 문서에서 가져옵니다.
- 파일 형식 지정 및 내보내기: 최종 내부 테이블이 완성되면 데이터를 평면 파일로 변환합니다.
OPEN DATASET,LOOP AT... TRANSFER...,CLOSE DATASET명령을 사용해 내부 테이블 내용을 SAP 애플리케이션 서버의 CSV 또는 TXT 파일로 기록합니다. 트랜잭션 AL11에서 파일에 접근할 수 있습니다. - 예약 및 파일 가져오기: 트랜잭션 SM36을 사용해 ABAP 프로그램을 백그라운드 작업으로 예약하고 데이터 추출을 자동화할 수 있습니다. 생성된 파일은 트랜잭션
CG3Y를 사용해 애플리케이션 서버에서 로컬 컴퓨터로 다운로드한 뒤 ProcessMind에 업로드합니다.
구성
- 기간: 선택 화면에는 핵심 운송 문서(예: Freight Order)의 생성일 범위를 필수로 포함해야 합니다. 초기 분석에는 대표성 있는 데이터 세트를 확보하면서 실행 시간이 지나치게 길어지지 않도록 3~6개월 범위를 권장합니다.
- 문서 유형 필터: Transportation Document Type(예: Freight Order, Freight Booking) 필터를 제공합니다. 도로 운송과 해상 운송처럼 특정 프로세스에 초점을 맞추는 데 필요합니다.
- 운송사 필터: 사용자가 특정 운송사를 기준으로 필터링할 수 있도록 합니다. 이를 통해 개별 물류 파트너의 성과를 분석할 수 있습니다.
- 조직 필터: 관련 사업 영역으로 추출 범위를 좁힐 수 있도록 Purchasing Organization 또는 Company Code와 같은 조직 단위 필터를 포함합니다.
- 성능 최적화: 대규모 데이터 세트에서는 ABAP 코드의
WHERE절에 인덱스가 있는 데이터베이스 필드를 사용하고, 가능한 경우 중첩 루프를 피하며, 메모리 사용량을 줄이도록 필요한 필드만 데이터베이스에서 선택합니다. - 사전 요건: 보고서를 실행하는 사용자에게는 ABAP 프로그램 실행 권한이 필요합니다. 개발자에게는
S_DEVELOP권한이 필요합니다. 프로그램에는 애플리케이션 서버 파일 시스템 접근 권한(객체S_DATASET)과 관련 TM 데이터베이스 테이블 및 BOPF 객체 접근 권한이 필요합니다.
샘플 쿼리 abap
REPORT ztm_process_extract.
*&---------------------------------------------------------------------*
*& Data Structures
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_s_event_log,
shipmentid TYPE /scmtms/tor_id,
activityname TYPE string,
eventtime TYPE timestamp,
endtime TYPE timestamp,
carriername TYPE string,
requesteddeliverydate TYPE timestamp,
modeoftransport TYPE /scmtms/mot,
totalfreightcost TYPE /scmtms/chargeable_weight,
isontimedelivery TYPE abap_bool,
END OF ty_s_event_log.
DATA: lt_event_log TYPE TABLE OF ty_s_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: so_credt FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: so_torid FOR /scmtms/d_torrot-tor_id.
SELECT-OPTIONS: so_carr FOR /scmtms/d_torrot-lsp_id.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA: ls_event_log TYPE ty_s_event_log.
" Select base data: Freight Orders (Shipments)
SELECT tor_id, tor_cat, lsp_id, mot_code, cretd_tst, btd_tstmp_end
FROM /scmtms/d_torrot
INTO TABLE @DATA(lt_tor_root)
WHERE CAST( cretd_tst AS DATS ) IN @so_credt
AND tor_id IN @so_torid
AND lsp_id IN @so_carr.
IF lt_tor_root IS INITIAL.
MESSAGE 'No data found for the given selection.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" Loop through each shipment to build the event log
LOOP AT lt_tor_root INTO DATA(ls_tor_root).
" 1. Transportation Request Received (Approximation from FWO creation)
SELECT SINGLE created_at_utc FROM /scmtms/d_trqrot
WHERE db_key IN ( SELECT trq_root_key FROM /scmtms/d_tordoc
WHERE parent_key = @ls_tor_root-db_key AND bo_node_cat = 'TRQ_ROOT' )
INTO @DATA(lv_trq_created_ts).
IF sy-subrc = 0.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Transportation Request Received'.
ls_event_log-eventtime = lv_trq_created_ts.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 2. Shipment Planned
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Planned'.
ls_event_log-eventtime = ls_tor_root-cretd_tst.
APPEND ls_event_log TO lt_event_log.
" 3. Carrier Assigned
IF ls_tor_root-lsp_id IS NOT INITIAL.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Carrier Assigned'.
ls_event_log-eventtime = ls_tor_root-cretd_tst. " Approximated with creation time
APPEND ls_event_log TO lt_event_log.
ENDIF.
" Get statuses from /SCMTMS/D_TORSTA
SELECT status, tstmp FROM /scmtms/d_torsta
INTO TABLE @DATA(lt_statuses)
WHERE parent_key = @ls_tor_root-db_key.
" 4. Shipment Confirmed By Carrier
READ TABLE lt_statuses WITH KEY status = 'CONFIRMED' INTO DATA(ls_conf_status).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Confirmed By Carrier'.
ls_event_log-eventtime = ls_conf_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 5. Goods Picked Up
READ TABLE lt_statuses WITH KEY status = 'LOADING_END' INTO DATA(ls_pickup_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Goods Picked Up'.
ls_event_log-eventtime = ls_pickup_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 6. Customs Declaration Filed (Placeholder logic)
" 7. Customs Cleared (Placeholder logic)
" 8. Shipment Rerouted (Placeholder logic, needs change documents)
" 9. Goods Delivered
READ TABLE lt_statuses WITH KEY status = 'UNLOADING_END' INTO DATA(ls_delivery_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Goods Delivered'.
ls_event_log-eventtime = ls_delivery_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 10. Proof Of Delivery Received
READ TABLE lt_statuses WITH KEY status = 'POD_RECEIVED' INTO DATA(ls_pod_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Proof Of Delivery Received'.
ls_event_log-eventtime = ls_pod_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 11. Freight Settlement Created
SELECT SINGLE created_at_utc FROM /scmtms/d_sfirhd
WHERE db_key IN ( SELECT sfir_root_key FROM /scmtms/d_tordoc
WHERE parent_key = @ls_tor_root-db_key AND bo_node_cat = 'SFIR_ROOT' )
INTO @DATA(lv_fsd_created_ts).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Freight Settlement Created'.
ls_event_log-eventtime = lv_fsd_created_ts.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 12. Freight Dispute Created (Needs logic based on dispute status in SFIR)
" 13. Invoice Verified (Needs logic based on invoice status in SFIR)
" 14. Shipment Cancelled
READ TABLE lt_statuses WITH KEY status = 'CANCELLED' INTO DATA(ls_cancel_status).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Cancelled'.
ls_event_log-eventtime = ls_cancel_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 15. Payment Processed (Data is typically in the ERP system, not TM)
ENDLOOP.
" Final step: Write lt_event_log to a file on the application server
DATA(lv_filepath) = '/usr/sap/trans/[YourInstance]/[YourFileName].csv'.
OPEN DATASET lv_filepath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'ShipmentId,ActivityName,EventTime'.
TRANSFER lv_header TO lv_filepath.
" Write data
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |{ ls_event_log-shipmentid },{ ls_event_log-activityname },{ ls_event_log-eventtime }|.
TRANSFER lv_line TO lv_filepath.
ENDLOOP.
CLOSE DATASET lv_filepath.
ELSE.
MESSAGE 'Error opening file on application server.' TYPE 'E'.
ENDIF.
ENDFOR. 시작할 준비가 되셨나요?
이 템플릿을 활용해 운송 프로세스 개선을 시작하고, 더 빠르고 저렴하게 배송할 방법을 찾아보세요. 지금 바로 데이터에서 인사이트를 확인할 수 있습니다.
지금 운송 관리 프로세스의 병목을 해소하세요
비효율을 찾아 경로를 최적화하고 처리 시간을 30% 단축하세요.
신용카드가 필요하지 않습니다. 몇 분이면 설정할 수 있습니다.