재고 관리 데이터 템플릿
재고 관리 데이터 템플릿
- 수집 권장 속성
- 프로세스 탐색을 위해 추적할 주요 활동
- SAP S/4HANA에 맞춘 데이터 추출 안내
재고 관리 속성
| 이름 | 설명 | ||
|---|---|---|---|
| 이벤트 시간 EventTime | 재고 활동이 시스템에 기록된 정확한 날짜와 시간입니다. | ||
| 설명 이벤트 시간은 활동이 발생한 시점을 정확히 기록하는 타임스탬프입니다. 이 데이터는 이벤트를 시간순으로 정렬해 각 재고 배치의 프로세스 흐름을 재구성하는 데 필요합니다. 시간 기반 process mining 분석의 기준이 됩니다. 이벤트 시간의 정확도는 주기 시간, 리드 타임, 소요 시간과 같은 주요 성과 지표를 계산하는 데 중요합니다. 기간별 프로세스 성과를 분석하고 병목이 발생하는 시점을 파악할 수 있으며, 배치가 품질 검사에서 해제되기까지 걸리는 시간처럼 프로세스 지연을 이해하는 데 필요한 근거를 제공합니다. 중요한 이유 이 타임스탬프를 기준으로 이벤트를 시간순으로 정렬하며, 소요 시간과 성과를 계산합니다. 확보 방법 일반적으로 자재 문서 헤더 테이블 MKPF의 전기일(MKPF-BUDAT)과 입력 시간(MKPF-CPUTM)을 조합해 사용합니다. 예시 2023-10-26T09:00:00Z2023-11-15T14:35:10Z2024-01-05T23:15:00Z | |||
| 재고 배치/로트 InventoryBatchLot | 특정 제품 수량을 식별하는 고유 값으로, 해당 재고의 수명 주기를 추적하는 사례 ID로 사용됩니다. | ||
| 설명 재고 배치 또는 로트 번호는 특정 제품 수량과 관련된 모든 활동을 묶는 주요 사례 식별자입니다. 이를 통해 창고에 처음 입고된 시점부터 내부 이동과 상태 변경을 거쳐 판매, 생산 또는 폐기를 위해 출고될 때까지 재고의 전체 흐름을 시간순으로 확인할 수 있습니다. 프로세스 분석에서 이 속성은 기본이 됩니다. 배치별 전체 흐름을 추적하고, 주기 시간을 정확히 측정하며, 프로세스 편차를 파악하고, 배치별 처리 방식의 차이를 이해할 수 있습니다. 의약품, 식음료, 화학 제품처럼 추적성, 품질 관리, 유통기한 관리가 중요한 산업에서는 배치 단위 분석이 특히 중요합니다. 중요한 이유 관련된 모든 재고 이벤트를 하나의 사례로 연결하는 기본 식별자로, 프로세스 전반을 분석할 수 있게 합니다. 확보 방법 일반적으로 배치 번호를 사용합니다. SAP의 MCHA(배치 마스터) 또는 MCH1(배치) 테이블에서 CHARG 필드로 확인할 수 있습니다. 예시 B001-A452023L202405-XYZ789456123BATCH-05-24 | |||
| 활동 ActivityName | 재고 관리 프로세스의 특정 시점에 발생한 업무 이벤트의 이름입니다. | ||
| 설명 활동 속성은 배치의 재고 수명 주기에서 발생한 개별 단계나 이벤트를 나타냅니다. 입고, 재고 이동, 품질 검사, 자재 출고와 같은 주요 업무 작업이 여기에 포함됩니다. 각 활동은 특정 시점에 재고 배치에 일어난 일을 기록합니다. 활동 분석은 process mining의 기반입니다. 프로세스 흐름을 시각화하고, 자주 발생하거나 드문 경로를 파악하며, 활동 지연에 따른 병목과 재작업 반복을 찾아낼 수 있습니다. '재고 폐기'나 '품질 검사'와 같은 활동의 순서와 빈도를 파악하면 프로세스 개선과 운영 효율을 높일 영역을 찾을 수 있습니다. 중요한 이유 프로세스의 단계를 정의하므로 재고 수명 주기를 시각화하고 분석할 수 있습니다. 확보 방법 SAP 이동 유형(MSEG-BWART)이나 거래 코드(MKPF-TCODE2)를 사용자가 이해하기 쉬운 활동명으로 변환해 만드는 파생 속성인 경우가 많습니다. 예시 입고 처리 완료입고 적치 이전 전기납품 출고 전기재고 폐기 | |||
| 사용자 이름 UserName | SAP에서 거래를 실행한 사람의 사용자 ID입니다. | ||
| 설명 이 속성은 문서를 전기하거나 활동을 실행한 직원의 SAP 사용자 ID를 기록합니다. 재고 관리 프로세스에서 누가 특정 작업을 담당했는지 추적할 수 있습니다. 사용자별 분석은 성과와 규정 준수, 교육 필요성을 파악하는 데 중요합니다. 예를 들어 '수동 재고 조정 요인' 대시보드에서 이 속성을 활용해 조정을 가장 많이 수행한 사용자를 확인할 수 있습니다. 추가 교육이 필요한 사용자나 승인되지 않은 활동을 파악하고, 우수한 성과를 보인 사용자를 확인하는 데도 도움이 됩니다. 중요한 이유 책임 소재를 명확히 하고 사용자별 작업 방식, 교육 필요성 또는 규정 준수 문제를 파악하는 데 도움이 됩니다. 확보 방법 자재 문서 헤더 테이블 MKPF의 USNAM(사용자 이름) 필드에서 확인합니다. 예시 JSMITHMBROWNWAREHOUSE_OPS | |||
| 수량 Quantity | 재고 이동에 포함된 자재의 수량입니다. | ||
| 설명 이 속성은 특정 활동에서 이동, 입고, 출고 또는 조정된 자재의 양을 나타냅니다. 자재의 기본 단위로 기록됩니다. 수량을 분석하면 재고 프로세스의 규모와 영향을 파악할 수 있습니다. 예를 들어 SKU별 출고 처리량을 시각화하는 대시보드를 만들 수 있습니다. 또한 폐기 재고 비율과 같은 KPI를 계산하는 데도 사용되므로, 이벤트 수만 세는 것보다 구체적으로 프로세스를 분석할 수 있습니다. 중요한 이유 각 활동에서 처리된 자재량을 수치로 나타내므로 처리량, 폐기량, 조정의 영향을 분석할 수 있습니다. 확보 방법 자재 문서 항목 테이블 MSEG의 MENGE(Quantity) 필드에서 확인할 수 있습니다. 예시 10012.55000-10 | |||
| 이동 사유 코드 MovementReasonCode | 재고 이동 사유를 지정하는 코드입니다. | ||
| 설명 이동 사유 코드는 재고 이동을 수행한 이유를 추가로 설명합니다. 재고 조정, 반품, 폐기처럼 계획되지 않은 이동의 사유를 기록할 때 주로 사용합니다. 근본 원인 분석에 유용한 속성입니다. ‘수동 재고 조정 요인’ 대시보드에서 사유 코드별로 분석하면 파손, 도난, 입력 오류 등 재고 불일치의 원인을 파악할 수 있습니다. 이를 통해 증상만 바로잡는 데 그치지 않고 근본 문제를 해결할 수 있습니다. 중요한 이유 계획되지 않은 재고 이동의 사유를 파악해 원인을 집중적으로 분석할 수 있습니다. 확보 방법 자재 문서 항목 테이블 MSEG의 GRUND(Reason for Movement) 필드에서 확인할 수 있습니다. 예시 00010005102 | |||
| 이동 유형 MovementType | SAP에서 재고 이동을 전기하는 방식을 제어하는 세 자리 코드입니다. | ||
| 설명 이동 유형은 자재 이동의 특성을 결정하는 SAP 재고 관리의 주요 제어 코드입니다. 업데이트할 계정과 거래 화면의 구성, 수량 또는 금액 필드의 업데이트 방식을 지정합니다. 예를 들어 101은 입고, 311은 재고 이전 전기, 551은 폐기에 사용합니다. 이 속성은 사용자가 이해하기 쉬운 '활동' 이름을 만드는 데 자주 사용됩니다. 이동 유형별로 프로세스를 분석하면 재고 흐름을 기술적으로 자세히 살펴볼 수 있습니다. 프로세스 맵의 정확성을 검증하고 병목이나 편차를 유발할 수 있는 특정 거래 유형을 파악하는 데도 필요합니다. 중요한 이유 각 재고 이벤트를 정확하고 기술적으로 분류하므로 활동을 도출하고 상세 분석을 수행하는 데 중요합니다. 확보 방법 자재 문서 품목 테이블 MSEG의 BWART(이동 유형) 필드에서 확인합니다. 예시 101311261551601 | |||
| 자재 번호 MaterialNumber | 관리 대상 제품이나 자재를 식별하는 고유 값입니다. | ||
| 설명 자재 번호는 SKU(재고 관리 단위)라고도 하며, 특정 제품에 부여된 고유 코드입니다. 재고 관리의 기본 마스터 데이터로, 상품의 수량과 가치, 이동을 추적하는 데 사용됩니다. process mining에서 자재 번호별로 분석하면 제품 중심으로 재고 프로세스를 살펴볼 수 있습니다. 어떤 제품의 품질 검사 시간이 가장 긴지, 어떤 제품이 가장 자주 폐기되는지, 내부 이전이 가장 많은 제품은 무엇인지 확인할 수 있습니다. 이러한 세분화는 제품별 문제를 파악하고 품목 특성에 맞게 재고 전략을 개선하는 데 중요합니다. 중요한 이유 제품별로 분석을 나눠 특정 품목에 나타나는 패턴과 문제를 파악할 수 있습니다. 확보 방법 자재 문서 품목 테이블 MSEG의 MATNR 필드에서 확인합니다. 마스터 데이터는 MARA 테이블에 있습니다. 예시 RM-1001FG-2050-B100-400-A | |||
| 저장 위치 StorageLocation | Plant 내에서 재고를 실제로 보관하는 특정 위치입니다. | ||
| 설명 Storage Location은 Plant 내 자재 재고를 구분하는 조직 단위입니다. 예를 들어 하나의 Plant에 원자재, 완제품, 품질 검사 대기 재고를 위한 저장 위치를 각각 둘 수 있습니다. Plant보다 세부적인 위치 정보를 제공하며, 입고 구역에서 주 창고로 재고를 옮기는 데 걸리는 시간처럼 재고 구역 간 이동을 분석할 때 사용합니다. 저장 위치별 공간 활용도와 이동 빈도를 분석하면 창고 배치와 내부 물류를 개선하는 데 도움이 됩니다. 중요한 이유 Plant 내 재고 위치를 세부적으로 파악해 내부 이동과 보관 효율을 분석할 수 있습니다. 확보 방법 자재 문서 항목 테이블 MSEG의 LGORT(Storage Location) 필드에서 확인할 수 있습니다. 예시 0001RM01FG01QI01 | |||
| 플랜트 Plant | 공장이나 물류 센터처럼 재고가 보관된 시설을 나타내는 조직 단위입니다. | ||
| 설명 Plant는 SAP의 중앙 조직 단위로, 생산 시설, 중앙 창고 또는 본사를 나타낼 수 있습니다. 모든 재고는 물리적 또는 논리적으로 Plant에 속합니다. Plant별 분석은 사업장 간 프로세스 성과를 비교하는 데 기본이 됩니다. 예를 들어 ‘입고 적치 시간이 가장 긴 Plant는 어디인가요?’ 또는 ‘Plant A의 재고 불일치율이 Plant B보다 높은가요?’와 같은 질문에 답할 수 있습니다. 이처럼 지역이나 조직 단위로 구분하면 특정 사업장의 문제를 찾아내고 조직 전체에 모범 사례를 공유할 수 있습니다. 중요한 이유 회사 사업장별로 재고 프로세스와 성과를 비교할 수 있습니다. 확보 방법 자재 문서 항목 테이블 MSEG의 WERKS(Plant) 필드에서 확인할 수 있습니다. 예시 10001710DE01US01 | |||
| 소스 시스템 SourceSystem | 데이터를 추출한 소스 시스템을 식별합니다. | ||
| 설명 이 속성은 재고 관리 데이터가 생성된 기준 시스템을 나타냅니다. 여기서는 특정 SAP S/4HANA 인스턴스가 해당합니다. 여러 ERP, 창고 관리 시스템 또는 기존 플랫폼에서 데이터를 가져오는 환경에서는 이 정보가 중요합니다. 단일 시스템만 분석할 때는 고정된 값처럼 보일 수 있지만, 여러 소스의 데이터를 결합해 전체 프로세스를 파악할 때는 필수적입니다. 데이터 거버넌스와 데이터 추출 문제 해결에 도움이 되며, 데이터 계보를 명확히 하는 데도 유용합니다. 중요한 이유 데이터의 출처를 파악할 수 있어 데이터 거버넌스와 여러 시스템을 함께 분석하는 데 도움이 됩니다. 확보 방법 일반적으로 데이터 변환 과정에서 특정 SAP S/4HANA 인스턴스를 식별하도록 고정값을 설정합니다. 예시 S4H_PROD_100SAP_S4_FINANCES4HANA_GLOBAL | |||
| 유효 기간 만료일 ExpirationDate | 자재 배치의 유효 기간이 끝나 더 이상 사용할 수 없게 되는 날짜입니다. | ||
| 설명 유효 기간 만료일(SLED)은 부패하기 쉽거나 사용 기한이 정해진 제품의 주요 마스터 데이터입니다. 배치 단위로 관리하며, 제품을 판매하거나 소비할 수 있는 마지막 시점을 나타냅니다. 이 속성은 ‘노후 및 만료 재고 분석’ 대시보드에 필요합니다. 만료일을 기준으로 활동을 분석하면 만료 위험이 있는 배치를 찾아 사전에 대응할 수 있습니다. 선입선출이 아닌 선기한선출(FEFO)과 같은 재고 회전 정책의 효과를 측정하고, 만료 재고 폐기로 인한 손실을 산출하는 데도 도움이 됩니다. 중요한 이유 노후 재고와 만료 재고를 분석해 폐기와 재정 손실을 줄일 수 있습니다. 확보 방법 배치 마스터 테이블 MCH1 또는 MCHA의 VFDAT(Shelf Life Expiration Date) 필드에서 확인할 수 있습니다. 예시 2024-12-312025-06-302024-09-01 | |||
| 자재 문서 번호 MaterialDocumentNumber | 입출고 내역을 기록하는 자재 문서를 식별하는 고유 번호입니다. | ||
| 설명 SAP에서 재고 이동을 전기하면 시스템이 해당 이동의 증빙으로 자재 문서를 생성합니다. 이 속성은 문서의 고유 식별자입니다. 하나의 자재 문서에 여러 항목이나 활동이 포함될 수 있습니다. process mining에서 자재 문서 번호는 함께 전기된 관련 이벤트를 묶는 데 사용할 수 있는 주요 거래 식별자입니다. 감사에 필요하며, 프로세스 분석 결과에서 특정 거래를 조사하기 위해 원본 시스템으로 이동할 때도 활용됩니다. 중요한 이유 감사에 활용하는 거래 키이며, 함께 실행된 활동을 그룹화할 수 있습니다. 확보 방법 MKPF(헤더) 및 MSEG(항목) 테이블의 MBLNR(Number of Material Document) 필드에서 확인할 수 있습니다. 예시 490000123450000056784900002345 | |||
| 재고 유형 StockType | 사용 가능, 품질 검사 중, 사용 제한 등 재고의 상태를 나타냅니다. | ||
| 설명 Stock Type은 사용 가능 여부에 따라 재고를 분류합니다. 주요 유형은 자유롭게 사용할 수 있는 unrestricted-use stock, 품질 검사를 기다리는 quality inspection stock, 사용할 수 없는 blocked stock입니다. 재고 이동 과정에서 재고 유형이 바뀌는 경우가 많습니다. 재고 유형의 변화를 추적하면 재고 가용성 프로세스를 파악할 수 있습니다. ‘재고 품질 검사 전기’나 ‘재고 상태를 사용 제한으로 변경’과 같은 활동을 분석하는 데 직접 활용됩니다. 각 유형에 머문 시간을 분석하면 특히 품질 검사로 인한 지연을 찾아내고, 판매나 생산에 필요한 재고의 가용성에 미치는 영향을 확인할 수 있습니다. 중요한 이유 재고의 사용 가능 상태를 추적하므로 품질 검사 지연과 재고 가용성을 분석하는 데 유용합니다. 확보 방법 자재 문서 항목 테이블 MSEG의 INSMK(Stock Type) 필드에서 확인할 수 있습니다. 예시 자유 사용 가능품질 검사사용 제한 재고 | |||
| 주문 처리 주기 시간 OrderFulfillmentCycleTime | 피킹 시작부터 배송을 위해 상품을 출고할 때까지 걸리는 전체 시간입니다. | ||
| 설명 ‘피킹 시작’ 활동부터 ‘배송 출고 전기’ 활동까지 걸리는 총시간을 계산하는 지표입니다. 프로세스가 시작된 뒤 창고에서 고객 주문을 준비하고 발송하기까지 걸리는 시간을 나타냅니다. 이 속성은 ‘주문 처리 주기 시간’ KPI를 직접 측정합니다. 소요 시간을 분석하면 고객 수요에 얼마나 신속하게 대응하는지 파악할 수 있습니다. 제품, 창고, 고객별로 나누어 피킹, 포장, 배송 과정에서 지연이 발생하는 지점을 찾을 수 있으며, 이는 고객 만족도와 물류 효율에 직접 영향을 줍니다. 중요한 이유 창고에서 상품을 출고하는 속도와 효율을 측정하며, 이는 고객 만족도에 큰 영향을 줍니다. 확보 방법 계산된 속성입니다. 각 배치의 ‘피킹 시작’ 이벤트와 ‘배송 출고 전기’ 이벤트 사이의 시간 차이로 산출합니다. 예시 7200144003600 | |||
| 창고 빈 StorageBin | 창고에서 자재가 실제로 보관되는 가장 세부적인 단위입니다. | ||
| 설명 Storage Bin은 선반 위치와 같이 창고 내 특정 좌표를 나타냅니다. 일반적으로 SAP Warehouse Management(WM) 또는 Extended Warehouse Management(EWM)를 사용하는 경우 이 수준까지 관리합니다. ‘창고 공간 활용도’ 대시보드에서 중요한 속성입니다. 창고 공간을 얼마나 효율적으로 쓰는지 분석하고, 혼잡이 예상되는 구역을 찾으며, 비효율적인 적치나 피킹 경로를 파악할 수 있습니다. 빈 간 이동을 분석하면 창고 배치를 개선하고 작업자의 이동 시간을 줄일 수 있습니다. 중요한 이유 창고 위치를 가장 세부적으로 파악해 공간 활용도와 운영 효율을 분석할 수 있습니다. 확보 방법 WM을 사용하는 경우 LTAK/LTAP와 같은 이전 오더 테이블에서 확인할 수 있습니다. 재고 문서에서는 MSEG-LGPBE에 있을 수 있습니다. SAP S/4HANA 문서를 참조하십시오. 예시 A-01-01-AB-05-10-C입고-구역-01 | |||
| 최근 데이터 업데이트 LastDataUpdate | 소스 시스템에서 이 레코드의 데이터를 마지막으로 새로 고친 시점을 나타내는 타임스탬프입니다. | ||
| 설명 이 속성은 소스 시스템에서 데이터를 마지막으로 추출하거나 업데이트한 날짜와 시간을 기록합니다. 분석 중인 정보가 얼마나 최신인지 보여주는 중요한 메타데이터입니다. 이를 통해 사용자는 거의 실시간 데이터인지, 이전 기간의 스냅샷인지 확인할 수 있습니다. 관련성 있고 정확한 결론을 내리려면 데이터의 최신성을 파악해야 합니다. 이 필드를 통해 분석가와 업무 사용자는 데이터가 최신인지 확인할 수 있습니다. 인사이트의 맥락을 제공하기 위해 대시보드에 표시하는 경우가 많습니다. 중요한 이유 데이터의 최신 상태를 알려주므로 최신 정보를 바탕으로 분석할 수 있습니다. 확보 방법 데이터 추출, 변환, 적재(ETL) 과정에서 타임스탬프를 생성해 추가합니다. 예시 2024-05-21T08:00:00Z2024-05-20T08:00:00Z | |||
| 측정 단위 UnitOfMeasure | 자재 수량을 측정하는 단위입니다(예: 개, 킬로그램). | ||
| 설명 Unit of Measure는 ‘수량’ 속성의 단위를 지정합니다. 일반적인 단위로는 개(PC), 킬로그램(KG), 리터(L), 상자(BOX) 등이 있습니다. 수량 필드를 정확히 해석하려면 단위 정보가 필요합니다. 단순한 설명값으로 쓰이는 경우가 많지만, 데이터 품질을 유지하고 서로 다른 단위를 공통 기준으로 환산하는 분석에도 중요합니다. 예를 들어 폐기 재고의 총가치를 정확히 계산하려면 단위가 다른 수량을 파악하고 필요에 따라 환산해야 합니다. 중요한 이유 ‘수량’ 속성을 정확히 해석하는 데 필요한 단위 정보를 제공합니다. 확보 방법 자재 문서 항목 테이블 MSEG의 MEINS(Base Unit of Measure) 필드에서 확인할 수 있습니다. 예시 개킬로그램개미터 | |||
재고 관리 활동
| 활동 | 설명 | ||
|---|---|---|---|
| 납품 출고 전기 | 출고 프로세스의 마지막 단계로, 배치의 소유권이 고객이나 운송업체로 이전됩니다. 재고를 감소시키고 회계에 반영하는 명시적 거래입니다. | ||
| 중요한 이유 주문 처리의 주요 완료 이벤트입니다. 정시 배송을 측정하고 전체 주문 처리 주기를 계산하는 데 중요합니다. 확보 방법 MATDOC 테이블에 기록됩니다. 일반적으로 이동 유형(BWART) 601로 식별하며, 판매 오더 납품에 대한 출고를 나타냅니다. 기록 이동 유형 601이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 생산 출고 전기 | 생산 오더나 프로세스 오더에서 재고 배치를 소비하는 작업입니다. 재고를 감소시키고 자재 비용을 제조 오더에 배부합니다. | ||
| 중요한 이유 주요 자재 소비 이벤트로, 구성품의 재고 수명 주기가 끝나는 시점을 나타냅니다. 생산에 필요한 자재의 가용성과 소비 패턴을 분석하는 데 중요합니다. 확보 방법 MATDOC 테이블에 기록됩니다. 오더 출고를 나타내는 이동 유형(BWART), 예를 들어 261로 식별합니다. 기록 이동 유형 261이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 입고 적치 이전 전기 | 배치를 입고 구역이나 임시 보관 구역에서 최종 저장 위치 또는 빈으로 실제 이동하는 작업입니다. SAP에서는 재고 이전 전기 자재 문서로 기록됩니다. | ||
| 중요한 이유 입고 프로세스를 완료하는 단계입니다. 적치 시간이라고도 하는 이 활동의 소요 시간은 창고 효율성을 측정하는 주요 KPI입니다. 확보 방법 MATDOC 테이블에 재고 이전 전기로 기록되며, 저장 위치 간 이동(예: 이동 유형 311)으로 나타나는 경우가 많습니다. 구체적인 이동 유형은 창고 구조에 따라 다를 수 있습니다. 기록 임시 또는 입고 저장 위치에서 최종 저장 위치로 재고를 이동하는 MATDOC의 이전 전기 문서로 식별합니다. 이벤트 유형 explicit | |||
| 입고 처리 완료 | 공급업체나 생산 현장에서 들어온 재고 배치가 창고에 처음 입고된 시점을 나타냅니다. SAP S/4HANA에서는 입고 시 자재 문서가 생성되므로 이 이벤트를 명시적으로 확인할 수 있습니다. | ||
| 중요한 이유 재고 수명 주기의 주요 시작 이벤트입니다. 이 활동부터 적치와 같은 후속 활동까지 걸리는 시간을 분석하면 입고 도크의 효율성을 측정할 수 있습니다. 확보 방법 MATDOC 테이블에 기록됩니다. 구매 오더 입고를 나타내는 101, 입고된 재고를 보류 재고로 처리하는 103 등 특정 이동 유형(BWART)으로 식별합니다. 기록 해당 입고 이동 유형이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 재고 조정 전기 | 실물 재고 조사나 기타 불일치로 인해 재고 수량이 변경된 내역을 기록합니다. 실사 결과에 맞춰 장부상 재고를 조정하는 이벤트입니다. | ||
| 중요한 이유 재고 정확도를 유지하려면 조정이 필요합니다. 조정이 자주 발생하면 재고 취급, 보안 또는 데이터 입력에 근본적인 문제가 있을 수 있습니다. 확보 방법 MATDOC 테이블에 기록됩니다. 재고 증가를 나타내는 701이나 재고 감소를 나타내는 702 등 실사 이동 유형(BWART)으로 식별합니다. 기록 실사 조정 이동 유형(예: 701, 702)이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 재고 폐기 | 재고 배치를 최종 처분하고 재고 기록에서 영구적으로 제거하는 작업입니다. 유통기한이 지났거나 손상되었거나 진부화된 재고를 주로 폐기합니다. | ||
| 중요한 이유 재무 손실을 나타내는 종료 이벤트입니다. 폐기 내역을 분석하면 재고 노후화, 취급 절차 또는 수요 예측 문제를 파악할 수 있습니다. 확보 방법 MATDOC 테이블에 기록됩니다. 자유 사용 재고에서 폐기하는 551, 품질 검사 재고에서 폐기하는 553, 보류 재고에서 폐기하는 555 등 폐기 이동 유형(BWART)으로 식별합니다. 기록 폐기 이동 유형(예: 551)이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 품질 검사 재고 해제 | 배치가 품질 검사를 통과해 사용 또는 적치가 가능한 상태임을 나타냅니다. 품질 검사 재고에서 자유 사용 재고와 같은 다른 재고 유형으로 이전 전기한 내역으로 기록됩니다. | ||
| 중요한 이유 이 단계는 품질 프로세스의 완료를 나타내며 재고를 사용할 수 있게 합니다. 이 단계가 지연되면 생산이나 주문 처리에 큰 차질이 생길 수 있습니다. 확보 방법 MATDOC 테이블에 재고 이전 전기로 기록됩니다. 일반적으로 이동 유형(BWART) 321로 식별하며, '품질 검사' 재고를 '자유 사용' 재고로 전환합니다. 기록 이동 유형 321이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 내부 재고 이전 전기 | 같은 플랜트 내에서 재고 배치를 서로 다른 저장 위치나 빈으로 이동하는 작업입니다. 자재 문서를 생성하는 명시적 거래로 기록됩니다. | ||
| 중요한 이유 내부 이전을 추적하면 창고 운영 효율성을 분석하고 불필요한 이동을 찾아내며 저장 위치 간 재고 보충에 필요한 리드 타임을 측정할 수 있습니다. 확보 방법 MATDOC 테이블에 기록됩니다. 저장 위치 간 이전에는 일반적으로 이동 유형(BWART) 311을 사용합니다. 기록 내부 재고 이동 유형(예: 311)이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 배치 상태 변경 | 배치 마스터 레코드의 상태가 '자유 사용'에서 '제한'으로 바뀌는 경우처럼 배치 마스터 데이터의 변경을 나타냅니다. 자재 이동은 아니지만 변경 내역이 기록됩니다. | ||
| 중요한 이유 배치 상태는 판매나 생산에 사용할 수 있는지에 직접 영향을 줍니다. 상태 변경을 분석하면 실제 이동 없이도 유통기한 임박 재고나 품질 관리 문제를 파악할 수 있습니다. 확보 방법 배치 마스터 테이블(MCH1, MCHA)의 변경 로그에서 추론합니다. CDHDR 및 CDPOS 테이블에서 배치 상태 필드(MCH1-ZUSTD)의 변경 내역을 확인합니다. 기록 배치 마스터 레코드의 상태 필드(MCH1-ZUSTD)에 대한 CDHDR/CDPOS 변경 문서에서 확인합니다. 이벤트 유형 inferred | |||
| 재고 상태를 보류로 변경 | 배치 상태를 변경해 출고할 수 없도록 합니다. 손상, 보류 요청 또는 기타 사유로 발생할 수 있으며 SAP에서 명시적 재고 이전 전기로 기록됩니다. | ||
| 중요한 이유 재고를 사용할 수 없게 된 상황을 보여줍니다. 보류 이벤트가 자주 발생하면 취급이나 보관 조건, 공급업체 품질에 문제가 있을 수 있습니다. 확보 방법 MATDOC 테이블에 재고 이전 전기로 기록됩니다. 일반적으로 이동 유형(BWART) 344는 '보류' 재고를 '자유 사용' 재고로, 343은 '자유 사용' 재고를 '보류' 재고로 전환합니다. 이 활동에는 343을 사용합니다. 기록 이동 유형 343이 기록된 MATDOC의 자재 문서로 식별합니다. 이벤트 유형 explicit | |||
| 재고 상태를 자유 사용으로 변경 | 배치의 보류 또는 품질 검사 상태를 해제해 사용할 수 있게 합니다. 명시적 재고 이전 전기로 기록됩니다. | ||
| 중요한 이유 이 활동은 재고 보류가 해제된 시점을 나타냅니다. 재고가 보류 상태로 머문 시간을 분석하면 해제 프로세스를 개선할 수 있습니다. 확보 방법 MATDOC 테이블에 재고 이전 전기로 기록됩니다. 이동 유형(BWART) 344는 '보류' 재고를 '자유 사용' 재고로 전환합니다. 기록 이동 유형 344가 기록된 MATDOC의 자재 문서로 식별합니다. 이벤트 유형 explicit | |||
| 재고를 품질 검사 대상으로 전환 | 입고된 배치를 품질 검사 보류 상태로 전환해 검사가 끝날 때까지 사용할 수 없도록 합니다. SAP에서 배치의 재고 유형을 변경하는 명시적 거래로 기록됩니다. | ||
| 중요한 이유 이 활동은 품질 검사 프로세스의 시작을 나타냅니다. 이 시점부터 품질 검사 해제까지 걸리는 시간은 품질 관련 지연을 파악하는 주요 지표입니다. 확보 방법 MATDOC 테이블에 기록됩니다. 재고 유형(INSMK)이 'Q'(품질 검사)로 설정된 입고 이동(예: 101)이나 재고 이전 전기(예: 322)로 나타날 수 있습니다. 기록 재고를 '품질 검사' 유형으로 전환하는 MATDOC의 자재 문서로 식별합니다. 이벤트 유형 explicit | |||
| 판매 반품 입고 | 고객에게 출고했던 배치가 창고로 반품된 내역을 기록합니다. 재고를 증가시키는 명시적 거래입니다. | ||
| 중요한 이유 반품을 추적하면 제품 품질 문제와 고객 불만을 파악할 수 있습니다. 반품 처리와 처분 과정에서도 비효율이 발생할 수 있습니다. 확보 방법 MATDOC 테이블에 기록됩니다. 자유 사용 재고로 전환하는 651이나 품질 검사 재고로 전환하는 653 등 판매 반품 이동 유형(BWART)으로 식별합니다. 기록 판매 반품 이동 유형(예: 651, 653)이 기록된 MATDOC의 자재 문서에서 확인합니다. 이벤트 유형 explicit | |||
| 피킹 시작 | 주문 처리의 시작을 나타냅니다. 창고 작업이 생성되어 보관 빈에서 배치를 피킹합니다. 이전 오더나 창고 작업이 생성된 시점에 기록되는 경우가 많습니다. | ||
| 중요한 이유 이 활동은 피킹 프로세스의 시작점입니다. 이 이벤트부터 피킹 완료까지 걸리는 시간을 분석하면 창고 작업자의 효율성을 측정하고 지연을 파악할 수 있습니다. 확보 방법 일반적으로 MATDOC에는 기록되지 않습니다. Warehouse Management(WM/EWM)를 사용하는 시스템에서는 이전 오더(LTAK 테이블)나 창고 작업의 생성 타임스탬프를 바탕으로 추론합니다. 기록 재고 배치와 연결된 이전 오더(WM) 또는 창고 작업(EWM)의 생성 기록에서 추론합니다. 이벤트 유형 inferred | |||
데이터 추출 가이드
단계
- 시스템 접근 권한 확인: SAP S/4HANA 시스템에서 Core Data Services(CDS) 뷰를 조회할 수 있는 권한이 있는 사용자를 준비합니다. 일반적으로 시스템 관리자가 권한을 부여해야 합니다.
- SQL 클라이언트 선택: SAP HANA 데이터베이스에 연결할 수 있는 SQL 클라이언트를 선택합니다. SAP HANA Studio, SAP HANA Database Explorer 또는 DBeaver와 같은 타사 도구를 사용할 수 있습니다.
- 데이터베이스 연결 설정: SQL 클라이언트에서 새 데이터베이스 연결을 만듭니다. HANA 데이터베이스 호스트 이름, 포트 번호(일반적으로 3<instance_number>15), 데이터베이스 사용자 인증 정보가 필요합니다.
- SQL 쿼리 준비: 이 문서의 ‘query’ 섹션에 있는 SQL 쿼리 전체를 복사해 SQL 클라이언트 편집기에 붙여 넣습니다.
- 쿼리 매개변수 설정: 쿼리에서 자리표시자를 찾습니다.
I_MaterialDocumentItem.PostingDate BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'를 원하는 날짜 범위로 바꿉니다. 예:BETWEEN '20230101' AND '20230630'.MaterialDocumentItem.Plant IN ('Plant1', 'Plant2')와 같은 회사 또는 Plant 필터도 조직 구조에 맞게 수정합니다. - 쿼리 실행: 수정한 SQL 쿼리를 S/4HANA 데이터베이스에서 실행합니다. 실행 시간은 날짜 범위와 시스템의 재고 데이터 양에 따라 달라집니다.
- 데이터 검토: 쿼리가 끝나면 SQL 클라이언트에서 결과가 정확하고 완전한지 확인합니다. 여러 활동이 포함되어 있는지, 주요 속성에 값이 채워졌는지 살펴봅니다.
- 이벤트 로그 내보내기: SQL 클라이언트에서 전체 결과를 CSV 파일로 내보냅니다. 문자 인코딩 문제가 발생하지 않도록 UTF-8을 선택합니다.
- 업로드 준비: CSV 파일의 열 이름을 쿼리에서 지정한 별칭과 정확히 일치시킵니다. 예:
InventoryBatchLot,ActivityName,EventTime등. 이제 파일을 process mining 도구에 업로드할 수 있습니다.
구성
- 권한: 쿼리를 실행하는 사용자에게 다음 CDS 뷰에 대한
SELECT권한이 필요합니다:I_MaterialDocumentItem,I_BatchChangeDocument,I_WarehouseTask. 해당 뷰가 있는 데이터베이스 스키마에 대한 접근 권한도 필요합니다. - 날짜 범위 필터링:
PostingDate,ChangeDocumentCreationDate또는WarehouseTaskCreationDate필드에 날짜 범위 필터를 적용해야 합니다. 일반적인 분석 범위는 3~12개월입니다. 여러 해의 데이터를 조회하면 성능 문제가 크게 발생할 수 있습니다. - 조직 필터: 성능을 높이고 분석 범위를 좁히려면
Plant또는CompanyCode를 기준으로WHERE절을 추가합니다. 데이터 양을 줄이고 관련 사업 영역에 집중할 수 있습니다. - 데이터 양: 재고 관리 시스템에서는 대량의 데이터가 생성됩니다. 날짜 범위가 넓으면 행이 수백만 개에 이를 수 있으며, 추출 중 원본 시스템과 클라이언트 도구의 성능에 영향을 줄 수 있습니다.
- Extended Warehouse Management(EWM): ‘피킹 시작’ 활동은
I_WarehouseTaskCDS 뷰를 사용하며, SAP Extended Warehouse Management를 사용하는 경우에만 데이터가 채워집니다. 구형 Warehouse Management(WM) 모듈이나 Inventory Management(IM)만 사용하는 조직에서는 이 활동을 추출할 수 없습니다.
샘플 쿼리 sql
SELECT
mat_doc.Batch AS "InventoryBatchLot",
CASE
WHEN mat_doc.MovementType = '101' AND mat_doc.InventoryStockType = '2' THEN 'Stock Posted to Quality Inspection'
WHEN mat_doc.MovementType = '101' THEN 'Goods Receipt Posted'
WHEN mat_doc.MovementType = '321' THEN 'Quality Inspection Stock Released'
WHEN mat_doc.MovementType = '311' THEN 'Internal Stock Transfer Posted'
WHEN mat_doc.MovementType = '344' THEN 'Stock Status Changed to Blocked'
WHEN mat_doc.MovementType IN ('343', '322') THEN 'Stock Status Changed to Unrestricted'
WHEN mat_doc.MovementType IN ('701', '702') THEN 'Inventory Adjustment Posted'
WHEN mat_doc.MovementType = '601' THEN 'Goods Issue for Delivery Posted'
WHEN mat_doc.MovementType = '261' THEN 'Goods Issue for Production Posted'
WHEN mat_doc.MovementType IN ('651', '653') THEN 'Sales Return Received'
WHEN mat_doc.MovementType = '551' THEN 'Stock Scrapped'
WHEN mat_doc.MovementType = '313' THEN 'Put-Away Transfer Posted' -- Example for two-step transfers
ELSE 'Unknown Material Movement'
END AS "ActivityName",
TO_TIMESTAMP(mat_doc.PostingDate || LPAD(mat_doc.CreationTime, 6, '0'), 'YYYYMMDDHH24MISS') AS "EventTime",
mat_doc.Material AS "MaterialNumber",
mat_doc.CreatedByUser AS "UserName",
mat_doc.MovementType AS "MovementType",
mat_doc.Plant AS "Plant",
mat_doc.StorageLocation AS "StorageLocation",
mat_doc.QuantityInEntryUnit AS "Quantity",
mat_doc.ReasonForMovement AS "MovementReasonCode"
FROM
I_MaterialDocumentItem AS mat_doc
WHERE
mat_doc.Batch IS NOT NULL AND mat_doc.Batch <> ''
AND mat_doc.PostingDate BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
-- AND mat_doc.Plant IN ('Plant1', 'Plant2') -- Placeholder: Add filters for relevant plants
UNION ALL
SELECT
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 3) AS "InventoryBatchLot",
'Batch Status Changed' AS "ActivityName",
change_doc.ChangeDocumentCreationDateTime AS "EventTime",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 1) AS "MaterialNumber",
change_doc.ChangedByUser AS "UserName",
NULL AS "MovementType",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 2) AS "Plant",
NULL AS "StorageLocation",
NULL AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_BatchChangeDocument AS change_doc
WHERE
change_doc.ChangeDocumentTable = 'MCHA' AND change_doc.ChangeDocumentTableFieldName = 'ZUSTD'
AND TO_VARCHAR(change_doc.ChangeDocumentCreationDate) BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
UNION ALL
SELECT
wh_task.Batch AS "InventoryBatchLot",
'Picking Initiated' AS "ActivityName",
wh_task.WarehouseTaskCreationDateTime AS "EventTime",
wh_task.Product AS "MaterialNumber",
wh_task.CreatedByUser AS "UserName",
NULL AS "MovementType",
wh_task.Plant AS "Plant",
wh_task.SourceStorageLocation AS "StorageLocation",
wh_task.TargetQuantity AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_WarehouseTask AS wh_task
WHERE
wh_task.Batch IS NOT NULL AND wh_task.Batch <> ''
AND wh_task.WarehouseProcessType IN ('P210', 'P220') -- Placeholder: Adjust process types based on your picking configuration
AND TO_VARCHAR(wh_task.WarehouseTaskCreationDate) BETWEEN '20230101' AND '20231231'; -- Placeholder: Set your date range 단계
- SAP HANA SQL에 직접 접근하는 방식이 승인되었는지 확인하고, 추출 사용자에게 MATDOC 및 시스템에서 요구하는 배치 마스터 테이블의 읽기 권한이 있는지 확인합니다. 실제 스키마 소유자를 확인하고 [Your SAP HANA schema]를 승인된 스키마 이름으로 바꿉니다.
- 대상 SAP S/4HANA 릴리스에서 사용할 수 있는 MATDOC 및 배치 테이블 필드를 확인합니다. 아래 쿼리는 일반적으로 제공되는 MATDOC 및 MCHA 필드를 사용하지만, 필드의 제공 여부와 이름은 릴리스, 배포 방식, 활성화된 범위에 따라 다를 수 있습니다. 실행 전에 [Configure based on your system]으로 표시된 필드를 모두 수정합니다.
- [Start timestamp]와 [End timestamp]를 ISO 타임스탬프 값으로 바꿔 추출 기간을 지정합니다. 처음에는 3~6개월 범위로 추출하고, 데이터 양과 성능을 확인한 뒤 기간을 늘립니다.
- 승인된 SQL 클라이언트, SAP HANA Database Explorer 또는 이에 준하는 승인된 데이터베이스 도구에서 쿼리를 실행합니다. 해당 필터 자리표시자를 바꿔 필요한 회사 코드, Plant, 문서 유형 또는 이동 유형만 조회합니다.
- 활동 CTE의 이동 유형 매핑을 검토합니다. 이동 유형은 시스템 및 업무 설정에 따라 다릅니다. 예시 이동 유형 목록을 대상 시스템에서 입고, 품질 검사, 승인, 적치, 내부 이동, 사용 제한 재고, 자유 사용 가능 재고, 재고 조정, 피킹, 배송 출고, 생산 출고, 판매 반품, 폐기에 사용하는 값으로 바꿉니다.
- 각 출력 행에 InventoryBatchLot, ActivityName, EventTime이 포함되는지 확인합니다. 배치 식별자를 ProcessMind 케이스 ID로 사용할 만큼 일관되게 관리하는지도 확인합니다. 조직 단위별로 같은 배치 값이 중복될 수 있어 자재, Plant 또는 저장 위치를 구분해야 한다면 배치 값만 사용하지 말고 설정된 복합 케이스 ID를 사용합니다.
- 이벤트 순서, 중복 행, 취소 및 역분개 문서, 시간대 처리를 검증합니다. MATDOC는 문서 전기를 기록하므로, 명시적으로 제외하거나 매핑하지 않으면 역분개 및 취소 기록이 별도 이벤트로 나타날 수 있습니다.
- 쿼리 결과를 이벤트당 한 행으로 구성된 평면 파일로 내보냅니다. 열은 InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode로 구성합니다. 타임스탬프는 일관된 ISO 8601 형식으로 유지하고 자재, 배치, Plant, 저장 위치 값의 앞자리 0을 보존합니다.
- 결과 이벤트 로그를 ProcessMind에 업로드하고 InventoryBatchLot을 케이스 ID로, ActivityName을 활동으로, EventTime을 이벤트 타임스탬프로 매핑합니다. ProcessMind가 활동을 추론하거나 레코드를 결합하거나 누락된 이벤트를 생성한다고 가정하지 마십시오.
구성
- 추출 방식: SAP HANA의 재고 및 배치 데이터를 직접 SQL로 조회합니다. 쿼리는 MATDOC를 읽고 MCHA의 배치 마스터 데이터를 조인합니다. 대상 시스템에서 관련 필드와 배치 수준을 확인한 뒤에만 MCH1 또는 다른 배치 테이블을 추가합니다.
- 날짜 범위: 처음에는 3~6개월로 설정합니다. EventTime은 MATDOC에서 확인할 수 있는 자재 문서 전기 날짜와 시간을 기준으로 지정합니다. 증분 적재에서는 늦은 전기를 포착할 수 있도록 관리되는 중복 기간을 두고, 설정된 문서 및 항목 식별자를 사용해 중복을 제거합니다.
- 필수 필터: 프로세스 범위에 맞춰 회사 코드, Plant, 자재 문서 유형, 이동 유형, 배치 존재 여부, 전기일을 설정합니다. 쿼리에 회사 코드와 문서 유형 필드를 추가하기 전에 설치된 릴리스에서 해당 필드를 확인해야 합니다.
- 활동 매핑: 이동 유형의 의미는 시스템 설정에 따라 다릅니다. 승인된 매핑 테이블을 관리하거나 쿼리의 이동 유형 목록을 업무에서 사용하는 값으로 바꿉니다. 예시 목록을 모든 SAP 시스템에 적용되는 의미로 간주하지 마십시오.
- 배치 범위: 케이스 ID가 InventoryBatchLot이므로 배치 값이 없는 행은 쿼리에서 제외합니다. 다른 원본에서 배치 값을 가져와야 한다면 추출 전에 해당 원본을 명시적으로 설정합니다.
- 이벤트 단위: 조건에 맞는 MATDOC 항목마다 이벤트 행 하나를 출력합니다. 이후 레코드를 바탕으로 피킹, 품질 판정, 배치 상태 변경 또는 다른 활동을 추론하지 않습니다.
- 배치 마스터 변경: MATDOC만으로는 배치 상태 변경을 안정적으로 확인할 수 없습니다. Batch Status Changed 활동을 구성하려면 변경 문서 또는 배치 이력 원본을 설정합니다. 쿼리에는 자리표시자 분기가 포함되어 있으며, 실행 전에 검증된 원본에 연결해야 합니다.
- 피킹: 피킹 시작 정보는 일반적으로 MATDOC 전기가 아니라 창고 실행 데이터에 있습니다. 검증된 창고 작업 또는 이전 오더 원본을 설정하고 실행 전에 자리표시자 분기를 바꿉니다.
- 성능: 전기 타임스탬프 또는 전기일, Plant, 회사 코드, 관련 이동 유형으로 필터링합니다. 필요한 열만 선택하고 전체 이력 조회를 피하며 승인된 작업 시간에 실행합니다. MATDOC 데이터가 많으면 분할 또는 증분 추출을 권장합니다.
- 권한 및 사전 요건: 승인된 데이터베이스 연결, 스키마 접근 권한, 읽기 권한, SAP S/4HANA 재고 데이터 접근 권한과 두 가지 비-MATDOC 활동에 사용하는 창고 실행 또는 변경 이력 원본에 대한 접근 권한을 확보합니다. 직접 데이터베이스에 접근하는 방식이 조직의 SAP 운영 모델 및 지원 정책에 부합하는지 확인합니다.
- 시간대: 데이터베이스와 애플리케이션의 시간대를 확인합니다. ProcessMind에 업로드하기 전에 EventTime을 일관된 방식으로 변환합니다.
- 데이터 보호: 사용자 ID, 자재 데이터, 고객 관련 데이터, 데이터베이스 인증 정보에 조직의 관리 기준을 적용합니다. 쿼리 텍스트에 인증 정보를 입력하지 마십시오.
샘플 쿼리 sql
WITH
params AS (
SELECT
TO_TIMESTAMP('[Start timestamp]') AS start_ts,
TO_TIMESTAMP('[End timestamp]') AS end_ts
FROM DUMMY
),
movement_map AS (
SELECT '101' AS movement_type, 'Goods Receipt Posted' AS activity_name FROM DUMMY
UNION ALL SELECT '105', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '107', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '109', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '321', 'Stock Posted to Quality Inspection' FROM DUMMY
UNION ALL SELECT '322', 'Quality Inspection Stock Released' FROM DUMMY
UNION ALL SELECT '343', 'Stock Status Changed to Unrestricted' FROM DUMMY
UNION ALL SELECT '344', 'Stock Status Changed to Blocked' FROM DUMMY
UNION ALL SELECT '311', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '309', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '301', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '311', 'Put-Away Transfer Posted' FROM DUMMY
UNION ALL SELECT '309', 'Put-Away Transfer Posted' FROM DUMMY
UNION ALL SELECT '701', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '702', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '703', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '704', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '705', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '706', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '601', 'Goods Issue for Delivery Posted' FROM DUMMY
UNION ALL SELECT '602', 'Goods Issue for Delivery Posted' FROM DUMMY
UNION ALL SELECT '261', 'Goods Issue for Production Posted' FROM DUMMY
UNION ALL SELECT '262', 'Goods Issue for Production Posted' FROM DUMMY
UNION ALL SELECT '651', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '653', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '654', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '551', 'Stock Scrapped' FROM DUMMY
UNION ALL SELECT '552', 'Stock Scrapped' FROM DUMMY
),
matdoc_events AS (
SELECT
m.MATNR AS MaterialNumber,
m.CHARG AS InventoryBatchLot,
COALESCE(m.BUDAT_MKPF, m.BUDAT) AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(m.BWART AS NVARCHAR(3)) AS MovementType,
m.WERKS AS Plant,
m.LGORT AS StorageLocation,
m.MENGE AS Quantity,
m.GRUND AS MovementReasonCode,
mm.activity_name AS ActivityName,
m.MBLNR AS MaterialDocumentNumber,
m.MJAHR AS MaterialDocumentYear,
m.ZEILE AS MaterialDocumentItem
FROM [Your SAP HANA schema].MATDOC m
INNER JOIN movement_map mm
ON CAST(m.BWART AS NVARCHAR(3)) = mm.movement_type
CROSS JOIN params p
WHERE m.CHARG IS NOT NULL
AND TRIM(m.CHARG) <> ''
AND COALESCE(m.BUDAT_MKPF, m.BUDAT) >= p.start_ts
AND COALESCE(m.BUDAT_MKPF, m.BUDAT) < p.end_ts
AND m.WERKS IN ([Configure based on your system])
),
batch_enriched_events AS (
SELECT
e.InventoryBatchLot,
e.ActivityName,
e.EventTime,
e.MaterialNumber,
e.UserName,
e.MovementType,
e.Plant,
e.StorageLocation,
e.Quantity,
e.MovementReasonCode,
e.MaterialDocumentNumber,
e.MaterialDocumentYear,
e.MaterialDocumentItem,
c.CUOBJ_BM AS BatchObjectNumber
FROM matdoc_events e
LEFT JOIN [Your SAP HANA schema].MCHA c
ON c.MATNR = e.MaterialNumber
AND c.CHARG = e.InventoryBatchLot
AND c.WERKS = e.Plant
),
verified_batch_status_events AS (
SELECT
CAST(NULL AS NVARCHAR(40)) AS InventoryBatchLot,
'Batch Status Changed' AS ActivityName,
CAST(NULL AS TIMESTAMP) AS EventTime,
CAST(NULL AS NVARCHAR(40)) AS MaterialNumber,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(NULL AS NVARCHAR(3)) AS MovementType,
CAST(NULL AS NVARCHAR(4)) AS Plant,
CAST(NULL AS NVARCHAR(4)) AS StorageLocation,
CAST(NULL AS DECIMAL(31,3)) AS Quantity,
CAST(NULL AS NVARCHAR(3)) AS MovementReasonCode,
CAST(NULL AS NVARCHAR(20)) AS MaterialDocumentNumber,
CAST(NULL AS NVARCHAR(4)) AS MaterialDocumentYear,
CAST(NULL AS NVARCHAR(6)) AS MaterialDocumentItem,
CAST(NULL AS NVARCHAR(40)) AS BatchObjectNumber
FROM DUMMY
WHERE 1 = 0
),
verified_picking_events AS (
SELECT
CAST(NULL AS NVARCHAR(40)) AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CAST(NULL AS TIMESTAMP) AS EventTime,
CAST(NULL AS NVARCHAR(40)) AS MaterialNumber,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(NULL AS NVARCHAR(3)) AS MovementType,
CAST(NULL AS NVARCHAR(4)) AS Plant,
CAST(NULL AS NVARCHAR(4)) AS StorageLocation,
CAST(NULL AS DECIMAL(31,3)) AS Quantity,
CAST(NULL AS NVARCHAR(3)) AS MovementReasonCode,
CAST(NULL AS NVARCHAR(20)) AS MaterialDocumentNumber,
CAST(NULL AS NVARCHAR(4)) AS MaterialDocumentYear,
CAST(NULL AS NVARCHAR(6)) AS MaterialDocumentItem,
CAST(NULL AS NVARCHAR(40)) AS BatchObjectNumber
FROM DUMMY
WHERE 1 = 0
),
all_events AS (
SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM batch_enriched_events
UNION ALL SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM verified_batch_status_events
UNION ALL SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM verified_picking_events
)
SELECT
InventoryBatchLot,
ActivityName,
EventTime,
MaterialNumber,
UserName,
MovementType,
Plant,
StorageLocation,
Quantity,
MovementReasonCode
FROM all_events
WHERE InventoryBatchLot IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY InventoryBatchLot, EventTime, MaterialDocumentYear, MaterialDocumentNumber, MaterialDocumentItem, ActivityName; 단계
- ABAP 편집기 열기: SAP S/4HANA 시스템에 로그인한 다음 트랜잭션 코드
SE38을 사용해 ABAP 편집기를 엽니다. - 새 프로그램 만들기: 'Program' 필드에 새 프로그램 이름을 입력합니다. 예를 들어
Z_PM_INVENTORY_EXTRACT를 입력한 다음 'Create' 버튼을 클릭합니다. 프로그램을 설명하는 제목을 입력하고 'Type'을 'Executable Program'으로 설정한 뒤 패키지에 저장합니다. - 프로그램 매개변수 정의: 프로그램 편집기에서 추출 작업의 사용자 인터페이스가 될 선택 화면을 정의합니다. 사용자가 데이터 추출 기간과 플랜트 등의 매개변수를 지정할 수 있습니다.
- 추출 로직 구현: 'Query' 섹션에 제공된 ABAP 코드를 모두 복사해 ABAP 편집기에 붙여 넣습니다. 이 코드는 여러 SAP 테이블에서 필요한 14개 재고 활동의 데이터를 선택하도록 작성되었습니다.
- 핵심 로직 이해: 프로그램은 각 재고 활동의 데이터를 원본 테이블에서 선택합니다. 예를 들어 자재 이동은
MKPF및MSEG에서, 마스터 데이터 변경은CDHDR및CDPOS에서 가져옵니다. 그런 다음 각 선택 결과를UNION ALL로 결합해 이벤트 로그를 나타내는 단일 내부 테이블을 만듭니다. - 파일 출력 설정: 코드의 마지막 부분에서는 내부 테이블의 통합 데이터를 파일에 씁니다.
OPEN DATASET문을 사용해 SAP 애플리케이션 서버에 파일을 만듭니다. SAP 시스템 사용자가 쓰기 권한을 가진 유효한 서버 경로를 지정해야 합니다. - 프로그램 실행: ABAP 프로그램을 저장하고 활성화합니다(Ctrl+F3). F8을 눌러 실행합니다. 선택 화면에서 원하는 기간과 플랜트 또는 회사 코드 등의 관련 필터를 입력합니다.
- 백그라운드 작업으로 실행: 데이터가 많으면 세션 시간 초과를 방지하기 위해 프로그램을 백그라운드 작업으로 실행해야 합니다. 실행 화면(F8)에서
Program -> Execute in Background메뉴를 선택하고, 업무량이 적은 시간대에 작업을 예약합니다. - 출력 파일 가져오기: 작업이 완료되면 SAP 애플리케이션 서버에서 출력 파일을 찾습니다. 트랜잭션 코드
AL11로 서버 디렉터리를 확인하고 파일을 찾습니다. 트랜잭션CG3Y를 사용해 애플리케이션 서버에서 로컬 컴퓨터로 파일을 다운로드합니다. - 업로드 준비: 다운로드한 파일을 텍스트 편집기나 스프레드시트 프로그램에서 엽니다. 헤더 행이 있고 쉼표를 구분 기호로, 큰따옴표를 텍스트 한정자로 사용하는 CSV 형식인지 확인합니다. 업로드하기 전에 열 이름이 요구사항과 일치하는지 확인합니다.
구성
- 전기일 기간: 가장 중요한 매개변수입니다. 성능을 유지하고 시스템 시간 초과를 방지하려면 한 번에 3~6개월씩 나누어 데이터를 추출하는 것이 좋습니다.
- 플랜트 필터: 하나 이상의 특정 플랜트(
WERKS)를 기준으로 필터링하는 것이 좋습니다. 모든 플랜트를 한 번에 추출하면 리소스 사용량이 크게 늘어날 수 있습니다. - 회사 코드 필터: 같은 시스템에서 여러 회사 코드를 사용하는 경우 회사 코드(
BUKRS) 필터를 추가해 데이터 범위를 더 좁힐 수 있습니다. 이 필터는 선택 사항입니다. - 애플리케이션 서버 파일 경로: ABAP 프로그램에는 SAP 애플리케이션 서버의 유효한 디렉터리 경로를 미리 지정해야 합니다. SAP 시스템 사용자(
SY-UNAME)에게 해당 디렉터리에 파일을 쓸 수 있는 운영체제 수준의 권한이 있는지 확인합니다. - 권한: 추출을 실행하는 사용자에게는 트랜잭션
SE38을 사용해 프로그램을 만들고 실행할 권한, 테이블MKPF,MSEG,MCH1,CDHDR,CDPOS,LTAK,LTAP을 조회할 권한, 백그라운드 작업을 예약할 권한(SM36/SM37)이 필요합니다.
샘플 쿼리 abap
REPORT Z_PM_INVENTORY_EXTRACT.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECT-OPTIONS: s_budat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_werks FOR mseg-werks.
PARAMETERS: p_fpath TYPE string DEFAULT '/usr/sap/trans/tmp/inventory_log.csv' OBLIGATORY.
" ====================================================================
" DATA STRUCTURES
" ====================================================================
TYPES: BEGIN OF ty_event_log,
InventoryBatchLot TYPE charg,
ActivityName TYPE string,
EventTime TYPE string,
MaterialNumber TYPE matnr,
UserName TYPE xubname,
MovementType TYPE bwart,
Plant TYPE werks_d,
StorageLocation TYPE lgort_d,
Quantity TYPE menge_d,
MovementReasonCode TYPE grund,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log.
" ====================================================================
" DATA SELECTION
" ====================================================================
START-OF-SELECTION.
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Receipt Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('101', '103', '105', '501', '521', '561')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~shkzg
WHEN 'H' THEN 'Stock Posted to Quality Inspection'
WHEN 'S' THEN 'Quality Inspection Stock Released'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '321' " For QI to Unrestricted
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Put-Away Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '311' AND mseg~shkzg = 'H' " Assume put-away is the credit side
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Internal Stock Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('301', '311', '313', '315')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~bwart
WHEN '343' THEN 'Stock Status Changed to Blocked'
WHEN '344' THEN 'Stock Status Changed to Unrestricted'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('343', '344')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Inventory Adjustment Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('701', '702', '711', '712')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Delivery Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '601'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Production Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '261'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Sales Return Received' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('651', '653')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Stock Scrapped' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '551'
UNION ALL
SELECT
ltap~charg AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CONCAT( ltak~bdatu, ltak~bzeit ) AS EventTime,
ltap~matnr AS MaterialNumber,
ltak~bname AS UserName,
ltak~bwart AS MovementType,
ltap~werks AS Plant,
ltap~lgort AS StorageLocation,
ltap~nista AS Quantity,
'' AS MovementReasonCode
FROM ltap
JOIN ltak ON ltak~tanum = ltap~tanum
WHERE ltak~bdatu IN s_budat
AND ltap~werks IN s_werks
AND ltap~charg IS NOT NULL AND ltap~charg <> ''
UNION ALL
SELECT
SUBSTRING( cdhdr~objectid, 5, 18 ) AS InventoryBatchLot, " Object ID for BATCH is MATNR+WERKS+CHARG
'Batch Status Changed' AS ActivityName,
CONCAT( cdhdr~udate, cdhdr~utime ) AS EventTime,
SUBSTRING( cdhdr~objectid, 1, 4 ) AS MaterialNumber,
cdhdr~username AS UserName,
'' AS MovementType,
'' AS Plant,
'' AS StorageLocation,
0 AS Quantity,
'' AS MovementReasonCode
FROM cdhdr
JOIN cdpos ON cdpos~objectclas = cdhdr~objectclas
AND cdpos~objectid = cdhdr~objectid
AND cdpos~changenr = cdhdr~changenr
WHERE cdhdr~udate IN s_budat
AND cdhdr~objectclas = 'BATCH'
AND cdpos~tabname = 'MCH1'
AND cdpos~fname = 'ZUSTD'
INTO TABLE @lt_event_log.
" ====================================================================
" WRITE OUTPUT FILE
" ====================================================================
DATA: lv_string TYPE string.
DATA: lo_conv TYPE REF TO cl_abap_conv_out_ce.
lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'InventoryBatchLot,ActivityName,EventTime,MaterialNumber,UserName,MovementType,Plant,StorageLocation,Quantity,MovementReasonCode'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT lt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
CONCATENATE
<fs_log>-InventoryBatchLot
<fs_log>-ActivityName
<fs_log>-EventTime
<fs_log>-MaterialNumber
<fs_log>-UserName
<fs_log>-MovementType
<fs_log>-Plant
<fs_log>-StorageLocation
<fs_log>-Quantity
<fs_log>-MovementReasonCode
INTO lv_string
SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: 'Extraction complete. File written to:', p_fpath. 시작할 준비가 되셨나요?
이 템플릿을 활용해 데이터를 준비하고 재고 관리 운영에 관한 유용한 인사이트를 확인하십시오. 지금 효율을 높이고 비용을 줄이는 작업을 시작할 수 있습니다.
SAP S/4HANA 재고 관리 개선
비효율을 찾아 주기 시간을 30% 줄이고 비용을 절감하십시오.
신용카드가 필요하지 않습니다 • 몇 분이면 설정할 수 있습니다