Mẫu dữ liệu quản lý chuỗi cung ứng
Mẫu dữ liệu quản lý chuỗi cung ứng
- Các thuộc tính nên thu thập
- Các hoạt động chính cần theo dõi
- Hướng dẫn trích xuất
Thuộc tính quản lý chuỗi cung ứng
| Tên | Mô tả | ||
|---|---|---|---|
| Đơn hàng logistics LogisticsOrder | Mã định danh duy nhất cho một quy trình chuỗi cung ứng xuyên suốt, từ khi phát sinh nhu cầu đến khi xác nhận giao hàng cuối cùng. | ||
| Mô tả Đơn hàng logistics là mã định danh chính của một trường hợp, liên kết mọi hoạt động liên quan đến một nhu cầu hoặc yêu cầu hoàn tất đơn hàng cụ thể trong chuỗi cung ứng. Cách này giúp theo dõi toàn bộ vòng đời sản phẩm, từ lập kế hoạch và mua hàng đến sản xuất và phân phối, để bạn có cái nhìn đầy đủ về quy trình. Trong process mining, phân tích theo đơn hàng logistics cho thấy toàn bộ lộ trình đáp ứng một nhu cầu. Cách này giúp nhận diện các biến thể phổ biến, điểm nghẽn và sai lệch trên toàn chuỗi cung ứng, thay vì chỉ xem riêng từng quy trình như mua hàng hoặc bán hàng. Vì sao điều này quan trọng Đây là khóa thiết yếu để liên kết mọi sự kiện liên quan thành một phiên bản quy trình duy nhất, từ đó phân tích chuỗi cung ứng xuyên suốt. Lấy dữ liệu ở đâu Đây là mã định danh mang tính khái niệm và có thể cần được tạo bằng cách liên kết nhiều số chứng từ, chẳng hạn số đơn hàng bán với các số đơn đặt hàng và giao hàng phát sinh sau đó. Tham khảo tài liệu SAP S/4HANA Supply Chain hoặc hỏi chuyên gia nghiệp vụ. Ví dụ LO-4500078192LO-4500078193LO-4500078194 | |||
| Tên hoạt động ActivityName | Tên hoạt động nghiệp vụ hoặc sự kiện diễn ra tại một thời điểm cụ thể trong quy trình chuỗi cung ứng. | ||
| Mô tả Thuộc tính này mô tả một bước hoặc cột mốc cụ thể trong vòng đời đơn hàng logistics, chẳng hạn như 'Đã phát hành đơn đặt hàng' hoặc 'Đã hạch toán xuất hàng'. Các hoạt động này tạo thành chuỗi sự kiện của quy trình. Phân tích trình tự hoạt động là trọng tâm của process mining. Việc này giúp khám phá luồng quy trình thực tế, so sánh với quy trình vận hành tiêu chuẩn và xác định những bước gây chậm trễ hoặc cần làm lại. Vì sao điều này quan trọng Thuộc tính này xác định các bước trong quy trình, làm cơ sở để khám phá sơ đồ quy trình, phân tích biến thể và đo thời gian chu kỳ giữa các hoạt động. Lấy dữ liệu ở đâu Được tạo bằng cách ánh xạ mã giao dịch hoặc thay đổi trạng thái từ nhiều bảng SAP (ví dụ: EKKO, LIKP, VBUK) sang tên hoạt động dễ hiểu trong quá trình chuyển đổi dữ liệu. Ví dụ Phát hành đơn mua hàngGhi nhận nhận hàng theo đơn mua hàngTạo chứng từ giao hàng đầu raĐã xác nhận giao hàng | |||
| Thời gian sự kiện EventTime | Dấu thời gian cho biết hoạt động diễn ra khi nào, gồm ngày và giờ. | ||
| Mô tả Thuộc tính này cung cấp ngày giờ chính xác của từng hoạt động trong quy trình. Đây là cơ sở thời gian của nhật ký sự kiện, giúp sắp xếp các bước theo đúng thứ tự đã diễn ra. Thời gian sự kiện rất quan trọng với mọi phân tích dựa trên thời gian. Thuộc tính này được dùng để tính thời gian chu kỳ giữa các hoạt động, đo tổng thời gian xử lý của quy trình, theo dõi xu hướng hiệu suất và xác định thời điểm dễ phát sinh điểm nghẽn. Vì sao điều này quan trọng Dấu thời gian này cần thiết để tính mọi khoảng thời gian và chỉ số hiệu suất, qua đó phân tích điểm nghẽn và thời gian xử lý của quy trình. Lấy dữ liệu ở đâu Được trích xuất từ các trường dấu thời gian gắn với việc tạo chứng từ hoặc thay đổi trạng thái trong các bảng SAP cốt lõi, chẳng hạn CDHDR/CDPOS cho chứng từ thay đổi hoặc các trường ngày giờ như ERDAT/ERZET trong bảng phần đầu. Ví dụ 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Hệ thống nguồn SourceSystem | Hệ thống nơi dữ liệu được tạo ra. | ||
| Mô tả Xác định phiên bản hệ thống nguồn cụ thể đã tạo dữ liệu sự kiện. Trong môi trường phức tạp, một công ty có thể dùng nhiều phiên bản SAP S/4HANA cho các khu vực hoặc đơn vị kinh doanh khác nhau. Thuộc tính này quan trọng đối với quản trị dữ liệu và phân nhóm phân tích. Nhờ đó, chuyên viên phân tích có thể so sánh hiệu suất quy trình giữa các hệ thống hoặc chỉ xem dữ liệu từ một nguồn đáng tin cậy. Vì sao điều này quan trọng Cung cấp thông tin quan trọng về nguồn gốc dữ liệu, hỗ trợ xác thực dữ liệu và so sánh quy trình giữa các môi trường hệ thống khác nhau. Lấy dữ liệu ở đâu Đây thường là giá trị tĩnh được thêm trong quá trình trích xuất dữ liệu để xác định nguồn, chẳng hạn như mã hệ thống SAP (SAPSID). Ví dụ S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Lần cập nhật dữ liệu gần nhất LastDataUpdate | Dấu thời gian cho biết lần gần nhất dữ liệu được làm mới hoặc trích xuất từ hệ thống nguồn. | ||
| Mô tả Thuộc tính này cho biết lần gần nhất dữ liệu trong nhật ký sự kiện được cập nhật. Ngày cập nhật giúp bạn biết dữ liệu đang phân tích mới đến đâu. Khi phân tích, cần biết dữ liệu được cập nhật gần đây hay chưa để đưa ra quyết định phù hợp. Dấu thời gian này giúp bạn tin tưởng vào dữ liệu và nắm được khoảng thời gian mà dashboard và KPI bao quát. Vì sao điều này quan trọng Cho biết rõ dữ liệu được cập nhật gần đây hay chưa, giúp người dùng biết phân tích quy trình phản ánh tình hình hiện tại đến mức nào. Lấy dữ liệu ở đâu Đây là trường siêu dữ liệu thường do công cụ trích xuất dữ liệu hoặc ETL tạo và điền sau khi làm mới dữ liệu thành công. Ví dụ 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Kết quả kiểm tra chất lượng QualityInspectionResult | Kết quả kiểm tra chất lượng, chẳng hạn 'Đạt' hoặc 'Không đạt'. | ||
| Mô tả Thuộc tính này ghi lại kết quả kiểm tra chất lượng đối với hàng hóa được sản xuất hoặc nhận về. Kết quả quyết định hàng hóa có thể chuyển sang bước tiếp theo hay cần làm lại, trả lại hoặc loại bỏ. Đây là thuộc tính quan trọng đối với dashboard và KPI Tỷ lệ hàng bị từ chối qua kiểm tra chất lượng. Phân tích tần suất và nguyên nhân không đạt giúp xác định vấn đề chất lượng mang tính hệ thống ở một số sản phẩm, nhà cung cấp hoặc dây chuyền sản xuất. Vì sao điều này quan trọng Hỗ trợ trực tiếp việc tính KPI chất lượng và giúp xác định nguồn gây ra vấn đề chất lượng trong chuỗi cung ứng. Lấy dữ liệu ở đâu Thông tin này thường được lưu trong mô-đun Quality Management (QM). Dữ liệu có thể lấy từ các bảng lô kiểm tra như QALS và mã quyết định sử dụng trong QAVE. Ví dụ ĐạtKhông đạtCần làm lạiĐạt nhưng có sai lệch | |||
| Mã vật tư MaterialNumber | Mã định danh duy nhất của sản phẩm hoặc vật tư đang được xử lý. | ||
| Mô tả Mã vật tư, thường gọi là SKU, là mã duy nhất của một sản phẩm cụ thể trong SAP. Mã này liên kết các hoạt động trong quy trình với hàng hóa thực tế hoặc hàng hóa số được sản xuất, mua hoặc giao. Thuộc tính này rất quan trọng khi phân tích theo sản phẩm. Thuộc tính giúp xác định sản phẩm nào dễ gặp vấn đề về chất lượng, chậm sản xuất hoặc hết hàng. Bạn có thể lọc dashboard theo vật tư để xem hiệu suất của từng dòng sản phẩm. Vì sao điều này quan trọng Hỗ trợ phân tích theo sản phẩm để xác định liệu các vấn đề như chậm trễ hoặc lỗi chất lượng có tập trung ở một số vật tư cụ thể hay không. Lấy dữ liệu ở đâu Có trong bảng chi tiết của hầu hết chứng từ, chẳng hạn VBAP cho đơn hàng bán, EKPO cho đơn đặt hàng và LIPS cho giao hàng. Trường này thường có tên MATNR. Ví dụ FG-100-ARM-2034-BSA-5500 | |||
| Ngày giao hàng yêu cầu RequestedDeliveryDate | Ngày nhà cung cấp được yêu cầu giao hàng. | ||
| Mô tả Đây là ngày giao hàng ghi trong đơn đặt hàng, thể hiện thời hạn mục tiêu dành cho nhà cung cấp. Ngày này là mốc chuẩn để đo hiệu suất giao hàng thực tế. Ngày này rất cần thiết để tính KPI Tỷ lệ giao hàng đúng hạn của nhà cung cấp. Bằng cách so sánh ngày nhận hàng thực tế với ngày yêu cầu, doanh nghiệp có thể đánh giá khách quan việc nhà cung cấp có đáp ứng cam kết hay không. Vì sao điều này quan trọng Đây là ngày chuẩn dùng để tính KPI 'Tỷ lệ giao hàng đúng hạn của nhà cung cấp', nên rất quan trọng trong việc quản lý hiệu suất nhà cung cấp. Lấy dữ liệu ở đâu Có trong bảng chi tiết đơn đặt hàng EKPO, trường EINDT (Ngày giao hàng). Ví dụ 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Người dùng thực hiện ExecutingUser | ID người dùng của người đã thực hiện hoạt động. | ||
| Mô tả Thuộc tính này ghi lại tên hoặc ID người dùng SAP của nhân viên thực hiện hoạt động, chẳng hạn như tạo đơn đặt hàng hoặc hạch toán nhận hàng. Thuộc tính này liên kết các bước trong quy trình với nhân sự tham gia. Phân tích theo người dùng giúp hiểu cách phân bổ khối lượng công việc, xác định nhu cầu đào tạo và nhận ra khác biệt về hiệu suất giữa các cá nhân hoặc nhóm. Thuộc tính này cũng hữu ích khi phân tích tuân thủ để biết ai đã thực hiện các bước quan trọng. Vì sao điều này quan trọng Gắn hoạt động với từng người dùng, hỗ trợ phân tích khối lượng công việc, so sánh hiệu suất và điều tra các hành động không tuân thủ. Lấy dữ liệu ở đâu Có trong các trường 'Người tạo' hoặc 'Người thay đổi' ở nhiều bảng SAP, chẳng hạn ERNAM trong EKKO (phần đầu đơn đặt hàng), LIKP (phần đầu giao hàng) và VBRK (phần đầu hóa đơn). Ví dụ CBROWNJSMITHASINGH | |||
| Nhà máy Plant | Cơ sở sản xuất hoặc phân phối nơi hoạt động diễn ra. | ||
| Mô tả Nhà máy là đơn vị tổ chức trong SAP, đại diện cho địa điểm sản xuất, lưu trữ hoặc phân phối hàng hóa. Thuộc tính này cung cấp bối cảnh địa lý hoặc chức năng cho các hoạt động trong quy trình. Phân tích hiệu suất quy trình theo nhà máy là nhu cầu phổ biến. Cách này giúp so sánh hiệu quả, sản lượng và mức độ tuân thủ giữa các cơ sở vận hành, từ đó tìm ra cách làm hiệu quả hoặc địa điểm cần cải thiện. Vì sao điều này quan trọng Cung cấp chiều dữ liệu địa lý hoặc tổ chức để so sánh hiệu suất giữa các cơ sở. Lấy dữ liệu ở đâu Có trong nhiều bảng chi tiết chứng từ, chẳng hạn VBAP (bán hàng), EKPO (mua hàng) và LIPS (giao hàng). Trường này thường có tên WERKS. Ví dụ 100021003500 | |||
| Tên khách hàng CustomerName | Tên khách hàng nhận đơn hàng. | ||
| Mô tả Thuộc tính này xác định khách hàng cuối gắn với đơn hàng bán và các hoạt động hoàn tất đơn hàng tiếp theo. Thuộc tính này cung cấp bối cảnh về phía nhu cầu trong quy trình chuỗi cung ứng. Trong process mining, phân tích theo khách hàng giúp nhận diện các cách hoàn tất đơn hàng hoặc mức hiệu suất khác nhau giữa các khách hàng lớn. Thuộc tính này được dùng trong các dashboard như Phân tích độ trễ xác nhận giao hàng để xem liệu một số khách hàng có thường xuyên chậm xác nhận hay không. Vì sao điều này quan trọng Cho phép phân nhóm phân tích theo khách hàng, qua đó nhận diện hành vi riêng, điểm nghẽn hoặc mức độ đáp ứng thỏa thuận mức dịch vụ của từng khách hàng. Lấy dữ liệu ở đâu Mã khách hàng (KUNNR) được lưu trong chứng từ bán hàng (ví dụ: bảng VBAK). Tên được lấy từ bảng dữ liệu chủ khách hàng KNA1. Ví dụ Retail CorpInnovate SolutionsManufacturing Partners | |||
| Tên nhà cung cấp SupplierName | Tên nhà cung cấp gắn với các hoạt động mua hàng. | ||
| Mô tả Thuộc tính này xác định nhà cung cấp hàng hóa hoặc dịch vụ. Thuộc tính này thường gắn với các hoạt động như 'Đã tạo yêu cầu mua hàng' và 'Đã phát hành đơn đặt hàng'. Tên nhà cung cấp rất cần thiết cho dashboard Hiệu suất giao hàng của nhà cung cấp. Bạn có thể lọc và phân nhóm dữ liệu để so sánh tỷ lệ giao hàng đúng hạn, thời gian giao hàng và chất lượng giữa các nhà cung cấp. Đây là thông tin quan trọng để xây dựng chiến lược tìm nguồn cung ứng và quản lý quan hệ với nhà cung cấp. Vì sao điều này quan trọng Hỗ trợ phân tích hiệu suất theo nhà cung cấp, giúp tối ưu hóa quy trình mua hàng và đánh giá độ tin cậy của nhà cung cấp. Lấy dữ liệu ở đâu Mã nhà cung cấp (LIFNR) được lưu trong chứng từ mua hàng (ví dụ: bảng EKKN, EBAN). Tên được lấy từ bảng dữ liệu chủ nhà cung cấp LFA1. Ví dụ Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Có làm lại IsRework | Cờ cho biết một hoạt động hoặc chuỗi hoạt động có phải là làm lại hay không. | ||
| Mô tả Thuộc tính đúng/sai này đánh dấu các hoạt động lặp lại bước trước đó trong quy trình, cho biết có việc làm lại hoặc sửa lỗi. Ví dụ, nếu sau hoạt động 'Kiểm tra chất lượng' là bước 'Đã tạo lệnh sản xuất', rồi tiếp tục có một hoạt động 'Kiểm tra chất lượng' khác, lần kiểm tra thứ hai có thể được đánh dấu là làm lại. Nhận diện việc làm lại là yếu tố quan trọng để hiểu tình trạng kém hiệu quả và chi phí ẩn của quy trình. Cờ này giúp định lượng tần suất và ảnh hưởng của các vòng lặp làm lại, hỗ trợ tính KPI Tỷ lệ lỗi xử lý đơn hàng và xác định những điểm cần cải tiến quy trình. Vì sao điều này quan trọng Giúp định lượng tình trạng kém hiệu quả của quy trình bằng cách xác định và đếm rõ các hoạt động thuộc vòng lặp làm lại. Lấy dữ liệu ở đâu Trường này thường được tính trong công cụ process mining bằng cách xác định các chuỗi hoạt động lặp lại trong cùng một trường hợp. Ví dụ truefalse | |||
| Giao hàng trễ IsLateDelivery | Cờ đúng/sai cho biết nhà cung cấp có giao hàng sau ngày giao hàng yêu cầu hay không. | ||
| Mô tả Cờ tính toán này cho biết đơn giản liệu một lần giao hàng có đúng hạn hay không. Cờ được tính bằng cách so sánh dấu thời gian của hoạt động 'Đã hạch toán nhận hàng cho đơn đặt hàng' với thuộc tính 'Ngày giao hàng yêu cầu'. Thuộc tính này giúp tạo dashboard và KPI về hiệu suất nhà cung cấp. Bạn có thể nhanh chóng lọc và tổng hợp dữ liệu để tính Tỷ lệ giao hàng đúng hạn của nhà cung cấp, đồng thời xác định nhà cung cấp, vật tư hoặc khu vực thường xuyên bị chậm trễ nhất. Vì sao điều này quan trọng Giúp phân tích hiệu suất nhà cung cấp dễ dàng hơn bằng cách thể hiện rõ kết quả đúng hoặc trễ của từng lần giao hàng, thông tin thiết yếu để tính KPI giao hàng đúng hạn. Lấy dữ liệu ở đâu Đây là trường được tính toán. Logic: IF ('Đã hạch toán nhận hàng cho đơn đặt hàng'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Ví dụ truefalse | |||
| Số đơn đặt hàng PurchaseOrderNumber | Mã định danh duy nhất của chứng từ đơn đặt hàng (PO). | ||
| Mô tả Số đơn đặt hàng là số chứng từ chính thức dùng để đặt mua vật tư từ nhà cung cấp. Đây là mã định danh quan trọng trong khâu mua hàng của chuỗi cung ứng. Thuộc tính này giúp bạn đi sâu vào quy trình mua hàng. Thuộc tính được dùng trong dashboard Thời gian chu kỳ mua hàng xuyên suốt và để tính KPI Tỷ lệ giao hàng đúng hạn của nhà cung cấp, liên kết các hoạt động yêu cầu mua hàng, đặt hàng, nhận hàng và thanh toán. Vì sao điều này quan trọng Là mã định danh quan trọng để đi sâu xuống một cấp trong quy trình con mua hàng và liên kết các sự kiện mua hàng liên quan. Lấy dữ liệu ở đâu Có trong bảng phần đầu đơn đặt hàng EKKO và bảng chi tiết EKPO. Trường này có tên EBELN. Ví dụ 450007819245000781934500078194 | |||
| Số đơn hàng bán SalesOrderNumber | Mã định danh duy nhất của chứng từ đơn hàng bán (SO). | ||
| Mô tả Số đơn hàng bán là số chứng từ chính thức xác nhận giao dịch bán hàng với khách hàng. Đây là mã định danh quan trọng trong khâu từ đặt hàng đến thu tiền của chuỗi cung ứng. Thuộc tính này rất quan trọng để theo dõi việc hoàn tất một đơn hàng cụ thể. Thuộc tính giúp liên kết yêu cầu ban đầu của khách hàng với các hoạt động tiếp theo như giao hàng và lập hóa đơn, hỗ trợ phân tích thời gian hoàn tất đơn hàng. Vì sao điều này quan trọng Là mã định danh quan trọng cho quy trình con hoàn tất đơn hàng, liên kết nhu cầu của khách hàng với hoạt động logistics và quyết toán tài chính. Lấy dữ liệu ở đâu Có trong bảng phần đầu đơn hàng bán VBAK và bảng chi tiết VBAP. Trường này có tên VBELN. Ví dụ 100023451000234610002347 | |||
| Số lượng đặt hàng OrderQuantity | Số lượng vật tư trong một dòng hàng của đơn đặt hàng. | ||
| Mô tả Thuộc tính này cho biết số lượng đơn vị vật tư được yêu cầu trong một dòng hàng của đơn hàng bán hoặc đơn đặt hàng. Thuộc tính thể hiện quy mô của từng giao dịch. Phân tích theo số lượng giúp ưu tiên xem xét các đơn hàng có khối lượng lớn, vì chúng có thể ảnh hưởng nhiều hơn đến hoạt động kinh doanh. Thuộc tính này cũng có thể dùng để chuẩn hóa các chỉ số khác, chẳng hạn tính chi phí trên mỗi đơn vị hoặc tìm hiểu ảnh hưởng của quy mô đơn hàng đến thời gian xử lý. Vì sao điều này quan trọng Cung cấp thông tin về quy mô giao dịch, hỗ trợ phân tích mức độ ảnh hưởng và phân nhóm trường hợp theo số lượng. Lấy dữ liệu ở đâu Có trong các bảng chi tiết, chẳng hạn MENGE trong EKPO (đơn đặt hàng) hoặc KWMENG trong VBAP (đơn hàng bán). Ví dụ 100500025 | |||
| Tên đơn vị vận chuyển CarrierName | Tên công ty vận tải hoặc đơn vị giao nhận phụ trách lô hàng. | ||
| Mô tả Tên đơn vị vận chuyển xác định nhà cung cấp dịch vụ logistics chịu trách nhiệm vận chuyển hàng giữa các địa điểm, chẳng hạn từ kho đến khách hàng. Thuộc tính này rất cần thiết cho dashboard Phân tích thời gian chu kỳ vận chuyển. Thuộc tính giúp so sánh thời gian vận chuyển, chi phí và độ tin cậy giữa các đơn vị, từ đó hỗ trợ lập kế hoạch logistics và lựa chọn đơn vị vận chuyển phù hợp. Vì sao điều này quan trọng Hỗ trợ phân tích hiệu suất theo đơn vị vận chuyển, yếu tố quan trọng để tối ưu chi phí logistics và thời gian giao hàng. Lấy dữ liệu ở đâu Mã đơn vị vận chuyển (đại lý giao nhận) được lưu trong chứng từ lô hàng, chẳng hạn bảng VTTK (phần đầu lô hàng). Tên được lấy từ các bảng dữ liệu chủ như LFA1. Ví dụ DHLFedExMaersk Logistics | |||
| Thời gian kết thúc EndTime | Dấu thời gian cho biết khi nào hoạt động hoàn tất, dùng để tính thời gian xử lý. | ||
| Mô tả Thời gian kết thúc đánh dấu lúc một hoạt động cụ thể hoàn tất. Thời gian bắt đầu (EventTime) cho biết hoạt động bắt đầu khi nào, còn thời gian kết thúc giúp xác định hoạt động mất bao lâu, nhất là với những hoạt động không diễn ra tức thời. Có cả thời gian bắt đầu và kết thúc giúp đo chính xác thời gian xử lý so với thời gian chờ. Nhờ đó, bạn phân biệt được thời gian thực sự làm việc với thời gian chờ bước tiếp theo, một yếu tố quan trọng để tìm cơ hội nâng cao hiệu quả. Vì sao điều này quan trọng Giúp tính chính xác thời gian xử lý từng hoạt động và phân biệt công việc tạo giá trị với thời gian chờ. Lấy dữ liệu ở đâu Có thể suy ra từ các thay đổi trạng thái trong SAP. Ví dụ, thời gian bắt đầu là lúc trạng thái được cập nhật thành 'Đang xử lý', còn thời gian kết thúc là lúc trạng thái chuyển thành 'Đã hoàn tất' trong các bảng như JEST/JCDS. Với sự kiện diễn ra tức thời, EndTime có thể bằng StartTime. Ví dụ 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
Hoạt động quản lý chuỗi cung ứng
| Hoạt động | Mô tả | ||
|---|---|---|---|
| Đã hạch toán xuất hàng | Hoạt động này ghi nhận thời điểm hàng hóa rời kho cả về mặt pháp lý lẫn thực tế. Sự kiện này làm giảm tồn kho và hạch toán giá vốn hàng bán, đánh dấu đơn hàng đã chính thức được giao đi. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng đánh dấu thời điểm bắt đầu giai đoạn hàng đang vận chuyển. Đây là thời điểm xác nhận hàng đã rời khỏi quyền sở hữu của công ty để được giao đến nơi nhận. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng khi tạo chứng từ vật tư. Thời gian được lưu trong phần đầu chứng từ vật tư (MKPF, trường BUDAT) và cập nhật trạng thái luân chuyển hàng hóa trong chứng từ giao hàng (LIKP, trường WBSTK). Thu thập Dùng ngày hạch toán (MKPF-BUDAT) trong chứng từ vật tư xuất hàng gắn với giao hàng đi. Loại sự kiện explicit | |||
| Đã xác nhận giao hàng | Ghi nhận xác nhận chính thức từ khách hàng hoặc đơn vị vận chuyển rằng hàng đã được nhận đúng như yêu cầu. Thông tin này thường được lưu bằng cách cập nhật dữ liệu xác nhận giao hàng trong chứng từ giao hàng đi. | ||
| Vì sao điều này quan trọng Hoạt động này đánh dấu điểm kết thúc chính thức của quy trình hoàn tất đơn hàng. Đây là thông tin quan trọng để lập hóa đơn chính xác, giải quyết tranh chấp và đo lường chặng cuối của chu kỳ giao hàng. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng. Ngày xác nhận giao hàng được lưu trong bảng phần đầu giao hàng (LIKP, trường PODAT) hoặc các bảng POD liên quan (VLPOD). Thu thập Dùng ngày xác nhận giao hàng (LIKP-PODAT) trong chứng từ giao hàng. Loại sự kiện explicit | |||
| Ghi nhận nhận hàng theo đơn mua hàng | Ghi nhận việc nhà cung cấp giao nguyên vật liệu hoặc hàng hóa theo đơn mua hàng. Sự kiện này được ghi lại khi hàng được nhận tại kho hoặc nhà máy. | ||
| Vì sao điều này quan trọng Hoạt động này hoàn tất khâu giao hàng của nhà cung cấp trong chu kỳ mua hàng. Đây là dữ liệu quan trọng để tính tỷ lệ giao hàng đúng hạn của nhà cung cấp và đánh giá hiệu suất logistics đầu vào. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng khi hạch toán chứng từ vật tư. Dấu thời gian sự kiện nằm trong bảng tiêu đề chứng từ vật tư (MKPF, trường BUDAT). Liên kết đến đơn mua hàng nằm trong bảng mặt hàng (MSEG). Thu thập Dùng ngày hạch toán (MKPF-BUDAT) của chứng từ vật tư gắn với đơn mua hàng. Loại sự kiện explicit | |||
| Hoàn tất sản xuất hàng hóa | Hoạt động này xác nhận quá trình sản xuất hàng hóa đã hoàn tất. Thông thường, sự kiện được ghi nhận dưới dạng nhập kho từ lệnh sản xuất, đưa thành phẩm vào tồn kho. | ||
| Vì sao điều này quan trọng Đây là mốc kết thúc chu kỳ sản xuất. Khoảng thời gian từ lúc tạo lệnh sản xuất đến sự kiện này là thời gian sản xuất, một chỉ số quan trọng để đánh giá hiệu quả sản xuất. Lấy dữ liệu ở đâu Có thể ghi nhận sự kiện này trực tiếp qua chứng từ vật tư (nhập kho từ lệnh sản xuất), hoặc suy ra từ xác nhận cuối cùng của lệnh sản xuất (bảng AFRU) hay thay đổi trạng thái thành 'Đã giao'. Thu thập Suy ra từ ngày hạch toán của chứng từ vật tư nhập kho cuối cùng cho lệnh sản xuất hoặc từ thay đổi trạng thái. Loại sự kiện inferred | |||
| Phát hành đơn mua hàng | Ghi nhận việc chính thức tạo và phát hành đơn mua hàng cho nhà cung cấp bên ngoài để mua nguyên vật liệu cần thiết. Hoạt động này chuyển yêu cầu mua hàng thành cam kết ràng buộc pháp lý với nhà cung cấp. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng để đo thời gian giao hàng của nhà cung cấp và chu kỳ mua hàng. Mốc này cũng là cơ sở để đánh giá hiệu suất giao hàng đúng hạn của nhà cung cấp. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng khi tạo đơn mua hàng. Dấu thời gian tạo được lưu trong bảng tiêu đề đơn mua hàng (EKKO, trường AEDAT). Thu thập Dùng ngày tạo chứng từ (EKKO-AEDAT) của đơn mua hàng. Loại sự kiện explicit | |||
| Tạo đơn hàng bán | Hoạt động này ghi nhận việc tạo đơn hàng bán mới, chính thức lưu lại yêu cầu mua hàng của khách. Đây là sự kiện được ghi rõ khi người dùng lưu chứng từ đơn hàng bán mới trong hệ thống. | ||
| Vì sao điều này quan trọng Đây là điểm bắt đầu chính của quy trình từ đơn hàng đến thu tiền. Phân tích thời gian từ sự kiện này đến các sự kiện khác giúp xác định tổng thời gian hoàn tất đơn hàng và phát hiện chậm trễ ở khâu xử lý ban đầu. Lấy dữ liệu ở đâu Sự kiện này được ghi nhận rõ ràng. Bạn có thể tìm thấy sự kiện trong chứng từ thay đổi của các bảng đơn hàng bán (CDHDR/CDPOS) hoặc dùng dấu thời gian tạo trong bảng tiêu đề đơn hàng bán (VBAK, trường ERDAT). Thu thập Dùng ngày tạo (VBAK-ERDAT) và giờ tạo (VBAK-ERZET) của chứng từ đơn hàng bán. Loại sự kiện explicit | |||
| Đã dỡ hàng tại điểm đến | Hoạt động này ghi nhận việc dỡ hàng thực tế tại địa điểm của khách hàng. SAP có thể không ghi nhận rõ sự kiện này, nên thường cần suy ra từ dữ liệu của đơn vị vận chuyển hoặc các sự kiện tiếp theo. | ||
| Vì sao điều này quan trọng Sự kiện này đánh dấu kết thúc chặng vận chuyển. Khoảng thời gian từ lúc xuất hàng đến thời điểm này là thời gian vận chuyển, một chỉ số quan trọng để tối ưu hóa logistics. Lấy dữ liệu ở đâu Sự kiện này hiếm khi được ghi nhận rõ trong hệ thống ERP cốt lõi. Có thể suy ra sự kiện từ thông điệp EDI của đơn vị vận chuyển, dữ liệu trong mô-đun Transportation Management (TM) hoặc dấu thời gian trên chứng từ xác nhận giao hàng, nếu có. Thu thập Suy ra từ cập nhật trạng thái của đơn vị vận chuyển (ví dụ: EDI 214) hoặc dùng dấu thời gian trên chứng từ xác nhận giao hàng làm mốc gần đúng. Loại sự kiện inferred | |||
| Đã tạo hóa đơn khách hàng | Hoạt động này ghi nhận việc tạo chứng từ thanh toán cho khách hàng dựa trên hàng hóa hoặc dịch vụ đã giao. Đây là bước khởi đầu cho giai đoạn quyết toán tài chính cuối cùng của quy trình. | ||
| Vì sao điều này quan trọng Hoạt động này rất quan trọng khi phân tích thời gian xử lý hóa đơn. Chậm trễ giữa lúc xác nhận giao hàng và lúc lập hóa đơn có thể ảnh hưởng xấu đến dòng tiền. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng. Dấu thời gian tạo chứng từ được lưu trong bảng phần đầu chứng từ thanh toán (VBRK, trường ERDAT). Thu thập Dùng ngày tạo (VBRK-ERDAT) trong phần đầu chứng từ thanh toán. Loại sự kiện explicit | |||
| Đã tạo lô hàng | Ghi nhận việc tạo chứng từ lô hàng, dùng để nhóm một hoặc nhiều lần giao hàng cho kế hoạch vận chuyển. Chứng từ này chứa thông tin về đơn vị vận chuyển, tuyến đường và phương thức vận chuyển. | ||
| Vì sao điều này quan trọng Hoạt động này đánh dấu thời điểm bắt đầu lập kế hoạch vận chuyển chính thức. Phân tích khoảng thời gian từ lúc xuất hàng đến khi hoàn tất lô hàng giúp đánh giá hiệu quả của quy trình vận chuyển. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng trong bảng phần đầu lô hàng (VTTK, trường ERDAT). Sự kiện này thuộc mô-đun LE-TRA, nhưng không phải tổ chức nào cũng sử dụng mô-đun này. Thu thập Dùng ngày tạo (VTTK-ERDAT) trong phần đầu chứng từ lô hàng. Loại sự kiện explicit | |||
| Hoàn tất lấy hàng | Hoạt động này ghi nhận việc hoàn tất lấy hàng trong kho để giao cho khách. Trong nhiều hệ thống, bước này được xác nhận khi trạng thái lấy hàng của chứng từ giao hàng được cập nhật. | ||
| Vì sao điều này quan trọng Lấy hàng hiệu quả là yếu tố quan trọng để tăng năng suất kho. Theo dõi hoạt động này giúp phát hiện điểm nghẽn trong vận hành kho và đo lường hiệu suất lấy hàng. Lấy dữ liệu ở đâu Đây thường không phải là một sự kiện riêng lẻ mà có thể được suy ra từ các thay đổi trạng thái. Sự kiện được ghi nhận khi trạng thái lấy hàng trong bảng hạng mục giao hàng (LIPS, trường KOSTA) được đặt thành 'C' (Đã xử lý hoàn toàn). Thu thập Suy ra từ chứng từ thay đổi khi trạng thái lấy hàng (LIPS-KOSTA) được cập nhật thành đã lấy đủ hàng. Loại sự kiện inferred | |||
| Kiểm tra hàng tồn kho | Đây là bước kiểm tra tự động hoặc thủ công để xác định hàng được yêu cầu có sẵn trong kho nhằm đáp ứng đơn hàng bán hay không. Bước này thường diễn ra tự động khi tạo đơn hàng bán, nhưng có thể không được ghi nhận thành một sự kiện riêng. | ||
| Vì sao điều này quan trọng Hiểu khoảng thời gian từ lúc tạo đơn hàng đến khi kiểm tra tồn kho, cùng với kết quả kiểm tra, giúp bạn phân tích ảnh hưởng của mức tồn kho đến thời gian hoàn tất đơn hàng. Chậm trễ ở đây thường dẫn đến các hoạt động mua hàng hoặc sản xuất. Lấy dữ liệu ở đâu Thông thường, đây không phải là sự kiện được ghi nhận riêng. Bạn có thể suy ra sự kiện này từ việc tạo dòng lịch giao hàng đầu tiên đã được xác nhận trong bảng mặt hàng đơn hàng bán (VBEP) hoặc từ các thay đổi trạng thái trong mặt hàng đơn hàng. Thu thập Suy ra từ cập nhật trạng thái xác nhận trên dòng lịch giao hàng của đơn hàng bán (bảng VBEP). Loại sự kiện inferred | |||
| Tạo chứng từ giao hàng đầu ra | Ghi nhận việc tạo chứng từ giao hàng, cho phép lấy hàng và gửi hàng cho khách. Hoạt động này chuyển quy trình từ quản lý đơn hàng sang thực hiện logistics. | ||
| Vì sao điều này quan trọng Đây là bước quan trọng, mở đầu cho quá trình giao hàng thực tế. Chậm trễ giữa lúc tạo đơn hàng và tạo chứng từ giao hàng có thể cho thấy vấn đề về lập kế hoạch hoặc khả năng cung ứng. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng. Dấu thời gian tạo được lưu trong bảng tiêu đề giao hàng (LIKP, trường ERDAT). Thu thập Dùng ngày tạo (LIKP-ERDAT) và giờ tạo (LIKP-ERZET) trong tiêu đề chứng từ giao hàng. Loại sự kiện explicit | |||
| Tạo lệnh sản xuất | Cho biết lệnh sản xuất đã được tạo để sản xuất thành phẩm cần cho đơn hàng bán. Đây là thời điểm chính thức bắt đầu quy trình sản xuất nội bộ. | ||
| Vì sao điều này quan trọng Việc tạo lệnh sản xuất đánh dấu thời điểm bắt đầu thời gian sản xuất. Phân tích mốc này giúp phát hiện chậm trễ giữa tín hiệu nhu cầu và lúc bắt đầu sản xuất. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng. Ngày tạo được lưu trong bảng tiêu đề lệnh sản xuất (AUFK, trường ERDAT). Thu thập Dùng ngày tạo (AUFK-ERDAT) trong bảng tiêu đề lệnh. Loại sự kiện explicit | |||
| Tạo yêu cầu mua hàng | Hoạt động này ghi nhận việc tạo yêu cầu nội bộ để mua hàng hóa hoặc nguyên vật liệu cần thiết. Yêu cầu thường được tạo khi tồn kho không đủ để đáp ứng đơn hàng bán hoặc giảm xuống dưới mức đặt hàng lại. | ||
| Vì sao điều này quan trọng Đây là bước đầu tiên trong chu kỳ mua hàng. Theo dõi thời điểm tạo yêu cầu giúp phát hiện chậm trễ khi bắt đầu mua hàng và phân tích toàn bộ quy trình mua sắm. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng. Dấu thời gian tạo được lưu trong bảng tiêu đề yêu cầu mua hàng (EBAN, trường BADAT). Thu thập Dùng ngày tạo (EBAN-BADAT) của chứng từ yêu cầu mua hàng. Loại sự kiện explicit | |||
| Thực hiện kiểm tra chất lượng | Ghi nhận việc hoàn tất kiểm tra chất lượng hàng hóa đã sản xuất. Kết quả kiểm tra, đạt hoặc không đạt, được lưu trong quyết định sử dụng. | ||
| Vì sao điều này quan trọng Hoạt động này rất quan trọng để theo dõi chất lượng sản phẩm và phát hiện vấn đề trong sản xuất. Tỷ lệ hàng bị từ chối cao hoặc thời gian kiểm tra kéo dài có thể tạo thành điểm nghẽn đáng kể. Lấy dữ liệu ở đâu Đây là sự kiện được ghi nhận rõ ràng khi đưa ra quyết định sử dụng cho lô kiểm tra chất lượng. Ngày quyết định nằm trong bảng QALS (trường PASTRTERM) hoặc bảng QAVE. Thu thập Dùng dấu thời gian ghi nhận quyết định sử dụng cho lô kiểm tra (bảng QALS/QAVE). Loại sự kiện explicit | |||
Hướng dẫn trích xuất
Các bước
- Điều kiện cần: Đảm bảo bạn có người dùng với đủ quyền để truy cập các CDS View (Core Data Services) cần thiết của SAP S/4HANA. Thông thường, nhóm bảo mật SAP cần cấp một vai trò cụ thể. Bạn cũng cần một SQL client như DBeaver hoặc SAP HANA Studio có thể kết nối với cơ sở dữ liệu SAP HANA.
- Kết nối cơ sở dữ liệu: Cấu hình SQL client để kết nối với cơ sở dữ liệu SAP S/4HANA. Bạn cần tên máy chủ cơ sở dữ liệu, cổng (ví dụ: 3xx15, trong đó xx là số phiên bản), tên người dùng cơ sở dữ liệu và mật khẩu.
- Chuẩn bị truy vấn SQL: Sao chép toàn bộ truy vấn SQL trong phần truy vấn của tài liệu này vào trình soạn thảo của SQL client. Truy vấn được thiết kế để trích xuất tất cả hoạt động đã nêu từ nhiều phân hệ logistics và bán hàng.
- Đặt tham số trích xuất: Trước khi chạy truy vấn, tìm các điều kiện giữ chỗ trong mệnh đề
WHEREcủa từng truy vấn con. Thay'YourCompanyCode'bằng mã công ty thực tế cần phân tích và điều chỉnh các giá trị ngày giữ chỗ như'YYYY-MM-DD'để xác định khoảng thời gian trích xuất. - Chạy truy vấn: Chạy toàn bộ tập lệnh SQL. Thời gian chạy tùy thuộc vào khoảng ngày đã chọn và lượng dữ liệu trong hệ thống. Nên chạy vào giờ thấp điểm để giảm tải hệ thống.
- Kiểm tra kết quả ban đầu: Khi truy vấn chạy xong, xem nhanh kết quả trong SQL client. Kiểm tra số hàng có hợp lý không, các cột như LogisticsOrder, ActivityName và EventTime đã có dữ liệu chưa, đồng thời xác nhận có nhiều tên hoạt động khác nhau.
- Xuất dữ liệu sang CSV: Xuất toàn bộ kết quả từ SQL client thành tệp CSV. Chọn mã hóa UTF-8 để tránh lỗi ký tự đặc biệt.
- Định dạng để tải lên: Đảm bảo tiêu đề cột trong tệp CSV cuối cùng khớp chính xác với tên thuộc tính cần nhập (ví dụ:
LogisticsOrder,ActivityName,EventTime). Nếu dùng truy vấn SQL như hướng dẫn, bạn không cần chuyển đổi dữ liệu thêm.
Cấu hình
- Điều kiện cần: Cần có quyền truy cập cơ sở dữ liệu SAP HANA bên dưới. Người dùng cơ sở dữ liệu phải có quyền
SELECTtrên tất cả CDS View được tham chiếu trong truy vấn, bao gồm nhưng không giới hạn ở I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment và I_BillingDocumentItem. - Lọc theo khoảng ngày: Truy vấn có sẵn chỗ giữ chỗ để lọc theo khoảng ngày, thường dựa trên trường ngày tạo (
CreationDatehoặcDocumentDate). Với lần phân tích đầu tiên, nên chọn khoảng thời gian từ 3 đến 6 tháng để có bộ dữ liệu đại diện mà không gây tải quá lớn cho hệ thống. - Bộ lọc nghiệp vụ chính: Cần lọc dữ liệu theo các đơn vị tổ chức cụ thể để kết quả phù hợp. Truy vấn đã có chỗ giữ chỗ cho
CompanyCode. Tùy phạm vi phân tích, bạn cũng có thể thêm bộ lọc choSalesOrganization,DistributionChannelhoặcPlant. - Lưu ý về hiệu suất: Truy vấn phức tạp này kết hợp nhiều CDS View lớn. Khi chạy, truy vấn có thể tiêu tốn đáng kể tài nguyên hệ thống. Hãy lên lịch trích xuất ngoài giờ làm việc. Với bộ dữ liệu rất lớn, nên chạy truy vấn thành nhiều đợt nhỏ liên tiếp theo tháng.
Truy vấn mẫu 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; Các bước
- Xác nhận bạn có quyền đọc trực tiếp lược đồ SAP HANA chứa dữ liệu logistics, bán hàng, mua sắm, tồn kho, sản xuất, chất lượng, giao hàng, vận chuyển, xác nhận giao hàng và lập hóa đơn liên quan. Nhờ nhóm SAP Basis hoặc nhóm nền tảng dữ liệu cung cấp tên lược đồ, thông tin kết nối và quyền truy cập. Không ghi dữ liệu vào hệ thống nguồn.
- Xác nhận chính xác mô hình dữ liệu S/4HANA trong hệ thống đích. EKKO và EKPO dùng cho đơn mua hàng, LIKP và LIPS dùng cho giao hàng đi. Cần cấu hình thêm các đối tượng cho đơn bán hàng, yêu cầu mua hàng, chứng từ vật tư, lệnh sản xuất, kết quả kiểm tra chất lượng, chuyến hàng, xác nhận giao hàng và hóa đơn. Thay từng chỗ giữ chỗ cho đối tượng hoặc cột trong ngoặc vuông bằng đối tượng đã được xác minh trong từ điển dữ liệu hệ thống.
- Xác định quy tắc liên kết LogisticsOrder. Nên dùng mối quan hệ luồng chứng từ đã xác minh từ đơn bán hàng đến các chứng từ giao hàng, vật tư, sản xuất hoặc mua sắm và lập hóa đơn ở các bước sau. Nếu không có mối quan hệ trực tiếp, hãy cấu hình bảng liên kết có tài liệu mô tả hoặc ánh xạ riêng theo nghiệp vụ. Không liên kết các trường hợp chỉ dựa vào mã vật tư hoặc ngày.
- Đặt thời gian trích xuất bằng [Start date parameter] và [End date parameter]. Áp dụng nhất quán khoảng thời gian cho dấu thời gian sự kiện, đồng thời giữ lại các chứng từ được tạo trước khoảng này nếu cần để giải thích sự kiện xảy ra trong khoảng thời gian đó.
- Cấu hình mã công ty, tổ chức bán hàng, nhà máy, tổ chức mua hàng, loại chứng từ và các bộ lọc nghiệp vụ khác trong phần được đánh dấu. Chỉ dùng bộ lọc sau khi xác nhận giá trị trong hệ thống đích.
- Thay các tham chiếu bảng và cột trong ngoặc vuông ở từng nhánh hoạt động bằng tên đã xác minh. Mỗi nhánh phải trả về cùng các cột với kiểu dữ liệu tương thích. Truy vấn tạo rõ một hàng cho mỗi hoạt động trong số 15 hoạt động bắt buộc, vì ProcessMind không tự suy ra các sự kiện còn thiếu.
- Chạy truy vấn trong SAP HANA Database Explorer, SAP HANA cockpit SQL Console hoặc SQL client được phê duyệt. Kiểm tra riêng từng nhánh hoạt động trước khi chạy toàn bộ truy vấn UNION ALL. Xem kế hoạch thực thi và giới hạn lần kiểm tra đầu tiên trong một khoảng ngày ngắn.
- Xác thực mối quan hệ giữa chứng từ, dấu thời gian, mã người dùng, thông tin nhà cung cấp và khách hàng, vật tư và nhà máy, cùng kết quả chất lượng. Kiểm tra các hàng trùng do kết hợp dữ liệu ở cấp mặt hàng và áp dụng quy tắc xác định cấp độ sự kiện đã cấu hình, chẳng hạn một sự kiện cho mỗi chứng từ hoặc mỗi mặt hàng trong chứng từ.
- Xuất kết quả thành CSV mã hóa UTF-8 hoặc định dạng bảng khác được ProcessMind hỗ trợ. Giữ nguyên chính xác tên các cột đầu ra: LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate và QualityInspectionResult. Đảm bảo EventTime có kiểu dấu thời gian và LastDataUpdate được điền nhất quán.
- Tải tệp lên ProcessMind và ánh xạ LogisticsOrder làm mã trường hợp, ActivityName làm hoạt động và EventTime làm dấu thời gian sự kiện. Xác nhận cả 15 nhãn hoạt động được xử lý như các sự kiện tường minh, sau đó lên lịch làm mới có kiểm soát sau khi xác thực cách trích xuất dữ liệu tăng dần.
Cấu hình
- Khoảng ngày: Bắt đầu với dữ liệu trong 3 đến 6 tháng. Dùng khoảng thời gian ngắn hơn để kiểm tra ban đầu, chỉ mở rộng sau khi xác thực hiệu suất và mối quan hệ giữa các chứng từ.
- Lược đồ nguồn: Đặt [SAP HANA schema name] thành lược đồ chứa các bảng hoặc view S/4HANA đã được xác minh. Không mặc định rằng bảng ERP cổ điển luôn có cùng tên trong mọi bản triển khai S/4HANA.
- Phạm vi chứng từ: Cấu hình [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] và [Document Type filter] theo phạm vi quy trình.
- Liên kết: Cấu hình [Your document flow or correlation object] để mỗi sự kiện được gán cho một LogisticsOrder. Nếu thiếu mối liên kết hoặc mối liên kết không rõ ràng, hãy báo cáo thay vì tự động gán.
- Cấp độ sự kiện: Chọn một sự kiện cho mỗi chứng từ, mỗi mặt hàng trong chứng từ hoặc mỗi lần thay đổi trạng thái có ý nghĩa nghiệp vụ. Áp dụng cùng một quy tắc cho mọi nhánh và chỉ loại bỏ các hàng trùng do kỹ thuật.
- Thứ tự ưu tiên dấu thời gian: Dùng dấu thời gian ghi sổ, tạo, xác nhận, thay đổi trạng thái, kiểm tra, giao hàng, dỡ hàng, POD hoặc lập hóa đơn đã được xác minh cho từng hoạt động. Không dùng thời điểm trích xuất thay cho thời điểm sự kiện nghiệp vụ.
- Nhãn nguồn: Đặt [Source system label] thành giá trị ổn định, chẳng hạn mã định danh hệ thống SAP S/4HANA đã được phê duyệt.
- Dấu thời gian làm mới: Đặt [Last data update expression] thành dấu thời gian trích xuất hoặc dấu thời gian làm mới nguồn đã được phê duyệt.
- Hiệu suất: Áp dụng bộ lọc ngày và đơn vị tổ chức từ sớm, chỉ chọn các cột cần thiết, tránh kết hợp dữ liệu cấp mặt hàng không giới hạn, kiểm tra kế hoạch thực thi và cân nhắc dùng view trích xuất đã lưu hoặc bảng trung gian cho các lần tải định kỳ.
- Quyền truy cập: Cần có quyền đọc các đối tượng trong lược đồ SAP HANA liên quan và quyền chạy SQL. Để xác thực nghiệp vụ, cần truy cập dữ liệu bán hàng, mua sắm, tồn kho, sản xuất, chất lượng, thực hiện logistics, vận tải và lập hóa đơn tương ứng.
- Phạm vi chức năng: Xác nhận hệ thống đã triển khai có các quy trình nghiệp vụ tương ứng với những hoạt động được yêu cầu. Dữ liệu vận chuyển, dỡ hàng, POD, chất lượng, sản xuất và lập hóa đơn có thể nằm trong các ứng dụng hoặc phần mở rộng riêng.
- Bảo mật: Tuân thủ quy định của tổ chức về dữ liệu khách hàng, nhà cung cấp, vật tư, tài chính và người dùng. Che hoặc giới hạn các trường nhạy cảm khi cần.
Truy vấn mẫu 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; Các bước
- Điều kiện cần: Đảm bảo bạn có khóa nhà phát triển và đủ quyền trong hệ thống SAP S/4HANA để tạo và chạy chương trình ABAP (truy cập giao dịch SE38), cũng như đọc các bảng chuỗi cung ứng như VBAK, LIKP, EKKO và MKPF.
- Tạo chương trình: Mở ABAP Editor bằng mã giao dịch
SE38. Nhập tên cho chương trình mới, chẳng hạnZ_PM_SCM_EXTRACTION, rồi nhấn 'Create'. Nhập tiêu đề mô tả và đặt loại chương trình là 'Executable Program'. - Chèn mã: Sao chép toàn bộ mã ABAP trong phần 'query' bên dưới và dán vào ABAP Editor của chương trình mới.
- Xác định phần tử văn bản: Vào Go To > Text Elements > Selection Texts. Kích hoạt tất cả nhãn màn hình chọn được đề xuất để giao diện rõ ràng, dễ dùng.
- Kích hoạt chương trình: Lưu và kích hoạt chương trình bằng cách nhấn CTRL+S rồi CTRL+F3, hoặc dùng biểu tượng kích hoạt trên thanh công cụ. Sửa các lỗi cú pháp có thể phát sinh do cấu hình riêng của hệ thống.
- Chạy chương trình: Nhấn F8 hoặc dùng nút 'Direct Processing' để chạy chương trình. Màn hình chọn sẽ xuất hiện, cho phép bạn lọc dữ liệu cần trích xuất.
- Đặt tham số trích xuất: Trên màn hình chọn, chỉ định khoảng ngày cho ngày tạo đơn bán hàng. Bạn nên lọc thêm theo mã công ty hoặc tổ chức bán hàng cụ thể để kiểm soát lượng dữ liệu. Nhập đường dẫn đầy đủ đến tệp đầu ra trên máy chủ ứng dụng SAP.
- Chạy ở chế độ nền: Với bộ dữ liệu lớn kéo dài nhiều tháng, cần chạy chương trình ở chế độ nền để tránh hết thời gian chờ giao dịch. Trong menu, chọn Program > Execute in Background và lên lịch công việc.
- Lấy tệp dữ liệu: Sau khi chương trình chạy xong, dùng mã giao dịch
AL11để mở thư mục trên máy chủ ứng dụng đã chỉ định. Tìm tệp vừa tạo và tải xuống máy tính bằng giao dịchCG3Y. - Chuẩn bị tải lên: Đảm bảo tệp đã tải xuống ở định dạng văn bản thuần, chẳng hạn CSV dùng dấu phẩy hoặc dấu chấm phẩy để phân tách, và được mã hóa UTF-8. Tệp đã sẵn sàng để tải lên công cụ process mining.
Cấu hình
- Khoảng ngày chọn (S_ERDAT): Đây là bộ lọc quan trọng nhất. Bộ lọc xác định khoảng thời gian chọn đơn bán hàng ban đầu dựa trên ngày tạo (
VBAK-ERDAT). Bắt đầu với khoảng thời gian phù hợp, chẳng hạn 3 đến 6 tháng gần nhất, để kiểm soát lượng dữ liệu. - Tổ chức bán hàng (S_VKORG): Bộ lọc tùy chọn để giới hạn dữ liệu trích xuất theo các tổ chức bán hàng cụ thể. Bộ lọc này hữu ích khi bạn muốn tập trung phân tích vào một đơn vị kinh doanh hoặc khu vực.
- Mã công ty (S_BUKRS): Bộ lọc tùy chọn để giới hạn dữ liệu theo các mã công ty cụ thể. Bạn nên dùng bộ lọc này để thu hẹp phạm vi dữ liệu và cải thiện hiệu suất.
- Đường dẫn tệp đầu ra (P_FILE): Đường dẫn đầy đủ trên máy chủ ứng dụng SAP, nơi lưu tệp nhật ký sự kiện cuối cùng. Người chạy chương trình phải có quyền ghi vào thư mục này. Ví dụ:
/usr/sap/trans/tmp/scm_event_log.csv. - Chế độ chạy: Có thể chạy chương trình ở chế độ tiền cảnh để trích xuất thử với lượng dữ liệu nhỏ. Với lượng dữ liệu đáng kể, bắt buộc chạy ở chế độ nền để tránh hết thời gian chờ và giảm tải hệ thống trong giờ cao điểm.
- Quyền hệ thống: Người chạy báo cáo cần có quyền đọc tất cả bảng bên dưới, bao gồm nhưng không giới hạn ở VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 và LFA1.
Truy vấn mẫu 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. Bạn đã sẵn sàng bắt đầu chưa?
Dùng mẫu này để chuẩn bị dữ liệu và bắt đầu cải thiện hiệu quả chuỗi cung ứng ngay hôm nay. Chúng tôi luôn sẵn sàng hỗ trợ bạn trong từng bước.
Cải thiện quản lý chuỗi cung ứng ngay
Theo dõi toàn bộ quy trình từ đầu đến cuối, cải thiện độ chính xác của dự báo lên 90% chỉ trong vài ngày.
Dùng thử miễn phí trong 14 ngày, không cần thẻ tín dụng.