Mẫu dữ liệu quy trình mua hàng đến thanh toán, đơn đặt hàng
Mẫu dữ liệu quy trình mua hàng đến thanh toán, đơn đặt hàng
- Các thuộc tính nên dùng để phân tích chi tiết
- Các hoạt động chính cần theo dõi trong quy trình
- Hướng dẫn trích xuất dữ liệu từng bước
Thuộc tính quy trình mua hàng đến thanh toán, đơn đặt hàng
| Tên | Mô tả | ||
|---|---|---|---|
| Hoạt động ActivityName | Tên sự kiện hoặc bước nghiệp vụ đã diễn ra trong quy trình Purchase Order. | ||
| Mô tả Thuộc tính này mô tả một hành động cụ thể hoặc thay đổi trạng thái trong vòng đời Purchase Order, chẳng hạn 'Tạo Purchase Order', 'Phê duyệt Purchase Order' hoặc 'Ghi nhận nhận hàng'. Chuỗi hoạt động này tạo thành luồng quy trình. Phân tích trình tự và tần suất hoạt động là trọng tâm của process mining. Việc này giúp khám phá quy trình thực tế, so sánh với mô hình đã thiết kế, xác định điểm nghẽn, chẳng hạn thời gian chờ lâu sau bước 'Nhận hóa đơn', và đo lường công việc phải làm lại, chẳng hạn hoạt động 'Thay đổi Purchase Order' lặp 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, giúp trực quan hóa và phân tích luồng từ đầu đến cuối, các biến thể và điểm nghẽn. Lấy dữ liệu ở đâu Thường được xác định từ kết hợp nhiều bảng và trường, chẳng hạn các trường trạng thái trong EKKO/EKPO hoặc nhật ký chứng từ thay đổi trong CDHDR/CDPOS, để thể hiện các mốc nghiệp vụ quan trọng. Ví dụ Tạo Purchase OrderPhê duyệt Purchase OrderGhi nhận nhận hàngNhận hóa đơn | |||
| Purchase Order PurchaseOrderNumber | Mã định danh duy nhất của Purchase Order (PO), được dùng làm mã hồ sơ chính để theo dõi vòng đời mua sắm. | ||
| Mô tả Số Purchase Order là mã định danh trung tâm, liên kết mọi hoạt động liên quan từ lúc tạo đơn đến khi nhận hàng và hoàn tất. Mã này đóng vai trò là mã hồ sơ trong phân tích process mining. Khi phân tích, nhóm các sự kiện theo số này sẽ giúp tái dựng hành trình của từng PO. Đây là cơ sở để tính thời gian xử lý, phân tích các biến thể quy trình và xác định điểm nghẽn hoặc sai lệch của từng đơn hàng. Vì sao điều này quan trọng Đây là khóa thiết yếu để kết nối mọi sự kiện mua sắm thành một quy trình xuyên suốt, giúp phân tích chi tiết vòng đời của từng Purchase Order. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO của SAP S/4HANA, trường EBELN. Ví dụ 450001712345000171244500017125 | |||
| Thời điểm sự kiện EventTime | Dấu thời gian cho biết hoạt động diễn ra khi nào. | ||
| Mô tả Thuộc tính này ghi lại ngày giờ chính xác của từng hoạt động trong quy trình. Đây là dữ liệu nền tảng cho mọi phân tích theo thời gian trong process mining. Thời điểm sự kiện được dùng để sắp xếp hoạt động theo trình tự thời gian và dựng luồng quy trình. Thuộc tính này cũng là cơ sở để tính các chỉ số thời lượng như thời gian xử lý giữa các hoạt động, thời gian chờ và thời gian thực hiện, vốn rất quan trọng khi phân tích hiệu suất và xác định điểm nghẽn. Vì sao điều này quan trọng Dấu thời gian này rất quan trọng để sắp xếp sự kiện chính xác và tính các chỉ số hiệu suất, gồm thời gian xử lý, thời gian giao hàng và thời gian chờ. Lấy dữ liệu ở đâu Các trường dấu thời gian gắn với hoạt động cụ thể, chẳng hạn Ngày tạo (EKKO-AEDAT đối với thay đổi) hoặc Ngày hạch toán (MKPF-BUDAT đối với nhận hàng). Thường cần kết hợp dữ liệu từ nhiều bảng. Ví dụ 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Hệ thống nguồn SourceSystem | Xác định hệ thống nguồn nơi dữ liệu được trích xuất. | ||
| Mô tả Thuộc tính này cho biết hệ thống gốc của dữ liệu sự kiện, chẳng hạn 'SAP S/4HANA Production' hoặc 'SAP ECC'. Trong môi trường có nhiều hệ thống, trường này rất quan trọng để theo dõi nguồn gốc dữ liệu, xử lý sự cố và đảm bảo dữ liệu từ các nguồn khác nhau được diễn giải chính xác. Trường này giúp hiểu rõ ngữ cảnh dữ liệu và lọc phân tích theo từng môi trường hệ thống. Vì sao điều này quan trọng Cung cấp thông tin cần thiết về nguồn gốc dữ liệu, rất quan trọng cho việc quản trị, xác thực và phân tích dữ liệu trong môi trường có nhiều hệ thống. 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, chuyển đổi và tải dữ liệu (ETL) để ghi nhãn nguồn gốc của tập dữ liệu. Ví dụ S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| 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 dữ liệu đang phân tích mới đến mức nào. Giá trị này thể hiện ngày giờ gần nhất dữ liệu được lấy từ SAP S/4HANA. Người dùng cần biết thời điểm cập nhật dữ liệu gần nhất để hiểu phân tích có còn kịp thời hay không. Thông tin này giúp họ diễn giải kết quả chính xác, biết dữ liệu là thông tin cập nhật theo thời gian thực hay ảnh chụp tại một thời điểm cụ thể. Điều đó ảnh hưởng đến mức độ phù hợp của các hành động dựa trên kết quả phân tích. Vì sao điều này quan trọng Cho người dùng biết dữ liệu được cập nhật đến thời điểm nào, giúp họ hiểu đúng bối cảnh và mức độ phù hợp của kết quả phân tích. Lấy dữ liệu ở đâu Đây là dấu thời gian siêu dữ liệu được thêm trong quá trình trích xuất, chuyển đổi và tải dữ liệu (ETL). Ví dụ 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Loại chứng từ PO DocumentType | Phân loại các loại Purchase Order khác nhau, chẳng hạn PO tiêu chuẩn, PO dịch vụ hoặc đơn hàng điều chuyển hàng tồn kho. | ||
| Mô tả Loại chứng từ là yếu tố cấu hình quan trọng trong SAP, quyết định luồng quy trình, dải số và các trường của Purchase Order. Nhờ đó, doanh nghiệp có thể điều chỉnh quy trình mua sắm cho từng tình huống. Phân tích quy trình theo loại chứng từ rất quan trọng để hiểu các biến thể. Chẳng hạn, quy trình cho PO mua hàng hóa tiêu chuẩn có thể khác nhiều so với PO dịch vụ hoặc đơn hàng điều chuyển hàng tồn kho. Thuộc tính này giúp lọc và so sánh các luồng quy trình riêng biệt để tìm cơ hội cải tiến phù hợp. Vì sao điều này quan trọng Phân loại Purchase Order để so sánh các quy trình mua sắm khác nhau, đồng thời giúp giải thích sự khác biệt về luồng quy trình và thời gian xử lý. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO của SAP S/4HANA, trường BSART. Ví dụ NBFOUB | |||
| Mã nhà cung cấp VendorId | Mã định danh duy nhất của nhà cung cấp hàng hóa hoặc dịch vụ. | ||
| Mô tả Mã nhà cung cấp là dữ liệu chủ quan trọng, liên kết Purchase Order với một nhà cung cấp cụ thể. Mã này được dùng xuyên suốt quy trình mua sắm để liên lạc, giao hàng và thanh toán. Trong process mining, thuộc tính này cho phép phân tích hiệu suất theo từng nhà cung cấp. Đây là dữ liệu cần thiết cho các dashboard như 'Hiệu suất thời gian giao hàng của nhà cung cấp' và 'Tỷ lệ trả hàng theo nhà cung cấp', giúp xác định nhà cung cấp đáng tin cậy nhất và những nhà cung cấp có thể gây chậm trễ hoặc vấn đề chất lượng. Vì sao điều này quan trọng Cho phép phân tích theo từng nhà cung cấp, giúp đánh giá hiệu suất, xác định nhà cung cấp hoạt động tốt hoặc chưa tốt và tối ưu chuỗi cung ứng. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO của SAP S/4HANA, trường LIFNR. Ví dụ 100023100045100088 | |||
| Ngày giao hàng yêu cầu RequestedDeliveryDate | Ngày doanh nghiệp yêu cầu nhà cung cấp giao hàng hóa hoặc dịch vụ. | ||
| Mô tả Thuộc tính này xác định ngày giao hàng mục tiêu đã thỏa thuận trong Purchase Order. Đây là mốc chuẩn để đo lường hiệu suất giao hàng của nhà cung cấp. Trong process mining, ngày này được so sánh với ngày nhận hàng thực tế (dấu thời gian của hoạt động 'Ghi nhận nhận hàng') để tính KPI 'Tỷ lệ giao hàng đúng hạn của nhà cung cấp'. Phân tích chênh lệch so với ngày yêu cầu giúp đánh giá độ tin cậy của nhà cung cấp và quản lý rủi ro chuỗi cung ứng. Vì sao điều này quan trọng Là mốc chuẩn để đo lường hiệu suất giao hàng đúng hạn của nhà cung cấp, một KPI quan trọng trong quản lý chuỗi cung ứng và lập kế hoạch vận hành. Lấy dữ liệu ở đâu Có thể tìm thấy trong bảng dòng lịch giao hàng EKET, trường EINDT. Ví dụ 2023-06-012023-06-152023-07-01 | |||
| Người dùng UserName | Mã định danh của người dùng thực hiện một hoạt động cụ thể. | ||
| Mô tả Thuộc tính này ghi lại mã người dùng SAP chịu trách nhiệm tạo, thay đổi hoặc phê duyệt chứng từ. Nhờ đó, bạn có thể truy vết các thao tác trong hệ thống. Phân tích theo người dùng giúp xác định nhu cầu đào tạo, phân bổ khối lượng công việc và đánh giá hiệu suất cá nhân. Chẳng hạn, bạn có thể xem liệu một số người dùng thường xuyên gắn với thời gian phê duyệt kéo dài hoặc nhiều thay đổi sau phê duyệt hay không. Từ đó, bạn có thể đưa ra quyết định về quản lý tài nguyên và cải tiến quy trình. Vì sao điều này quan trọng Giúp xác định trách nhiệm và phân tích hiệu suất ở cấp cá nhân hoặc nhóm, từ đó phát hiện nhu cầu đào tạo hoặc hạn chế về tài nguyên. Lấy dữ liệu ở đâu Thông tin này nằm trong các trường như ERNAM (Người tạo) trong EKKO hoặc trường người dùng trong bảng chứng từ thay đổi (CDHDR-USERNAME). Ví dụ CB9980000012JSMITHRROE | |||
| Tổng giá trị thuần TotalNetAmount | Tổng giá trị Purchase Order, chưa bao gồm thuế và chi phí vận chuyển. | ||
| Mô tả Thuộc tính này thể hiện giá trị tiền thuần của Purchase Order. Đây là số liệu tài chính quan trọng cho biết quy mô giao dịch mua sắm. Số tiền này rất hữu ích cho phân tích tài chính, chẳng hạn phân loại PO theo giá trị cao hoặc thấp để xem luồng xử lý có khác nhau không. Bạn cũng có thể dùng số tiền này để ưu tiên phân tích các đơn hàng giá trị cao, vốn có thể tiềm ẩn rủi ro tài chính lớn hơn hoặc ảnh hưởng nhiều hơn đến doanh nghiệp. Vì sao điều này quan trọng Cho phép phân tích theo giá trị tài chính, giúp phân nhóm Purchase Order theo giá trị và ưu tiên cải tiến quy trình ở những lĩnh vực có mức chi tiêu cao. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO của SAP S/4HANA, trường NETWR. Ví dụ 1500.0025000.50125.75 | |||
| Yêu cầu mua hàng PurchaseRequisitionNumber | Mã định danh của yêu cầu mua hàng (PR) khởi tạo Purchase Order. | ||
| Mô tả Thuộc tính này liên kết Purchase Order với yêu cầu mua hàng ban đầu. Không phải PO nào cũng có PR, vì một số PO được tạo trực tiếp. Liên kết này cần thiết để phân tích toàn bộ quy trình mua sắm từ đầu đến cuối, bắt đầu từ yêu cầu ban đầu. Thuộc tính này hỗ trợ các KPI như 'Thời gian phê duyệt yêu cầu mua hàng' và giúp xác định 'Chi tiêu ngoài quy định', khi PO được tạo mà không có yêu cầu mua hàng đã được phê duyệt trước đó. Vì sao điều này quan trọng Liên kết PO với yêu cầu ban đầu, giúp phân tích quy trình từ đầu đến cuối và phát hiện chi tiêu ngoài quy định, không tuân thủ. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKPO của SAP S/4HANA (cấp mục PO), trường BANFN. Ví dụ 1001005110010052 | |||
| Có phải khoản mua ngoài quy trình không IsMaverickSpend | Cờ được tính toán để cho biết đơn đặt hàng có được tạo mà không có yêu cầu mua hàng đã được phê duyệt trước đó hay không. | ||
| Mô tả Cờ boolean này được tạo trong quá trình xử lý dữ liệu. Cờ có giá trị 'true' nếu đơn đặt hàng không có yêu cầu mua hàng liên quan hoặc nếu việc tạo đơn bỏ qua workflow phê duyệt tiêu chuẩn. Thuộc tính này hỗ trợ trực tiếp cho dashboard 'Nhận diện khoản mua ngoài quy trình' và các KPI liên quan. Thuộc tính giúp định lượng mức độ mua hàng không tuân thủ, để doanh nghiệp có thể tập trung vào các phòng ban hoặc nhóm người dùng cụ thể nhằm củng cố chính sách và kiểm soát mua sắm. Vì sao điều này quan trọng Trực tiếp nhận diện hoạt động mua hàng không tuân thủ, giúp định lượng sai lệch quy trình và thực thi các biện pháp kiểm soát tài chính cùng chính sách mua sắm. Lấy dữ liệu ở đâu Trường được tính toán dựa trên việc thiếu giá trị trong 'PurchaseRequisitionNumber' đối với một số loại chứng từ, hoặc dựa trên phân tích trình tự sự kiện. Ví dụ truefalse | |||
| Có phải làm lại không IsRework | Cờ được tính toán để cho biết đơn đặt hàng có phải làm lại hay không, chẳng hạn như thay đổi sau khi phê duyệt hoặc trả hàng. | ||
| Mô tả Thuộc tính boolean này được tính bằng cách phân tích trình tự hoạt động của từng đơn đặt hàng. Thuộc tính có giá trị 'true' nếu sự kiện 'Đơn đặt hàng đã thay đổi' xảy ra sau sự kiện 'Đơn đặt hàng đã được phê duyệt', hoặc nếu có sự kiện 'Đã trả hàng'. Cờ này giúp đơn giản hóa việc tính KPI 'Tỷ lệ xử lý xuyên suốt'. Bạn có thể dễ dàng lọc và trực quan hóa tất cả đơn đặt hàng cần can thiệp thủ công hoặc chỉnh sửa, từ đó định lượng chi phí và tần suất làm lại. Vì sao điều này quan trọng Giúp định lượng mức độ kém hiệu quả của quy trình bằng cách đánh dấu các trường hợp phải làm lại. Đây là thông tin quan trọng để tính tỷ lệ xử lý xuyên suốt và xác định nguyên nhân gốc rễ của sai lệch. Lấy dữ liệu ở đâu Trường được tính toán dựa trên trình tự hoạt động. Logic kiểm tra xem sự kiện 'Đơn đặt hàng đã thay đổi' có xảy ra sau khi phê duyệt hay không, hoặc có sự kiện 'Đã trả hàng' hay không. Ví dụ truefalse | |||
| Giao hàng đúng hạn của nhà cung cấp SupplierOnTimeDelivery | Cờ được tính toán để cho biết phiếu nhận hàng được ghi nhận vào hoặc trước ngày giao hàng yêu cầu hay không. | ||
| Mô tả Thuộc tính boolean này được tạo bằng cách so sánh dấu thời gian của hoạt động 'Đã ghi nhận nhận hàng' với 'Ngày giao hàng yêu cầu'. Nếu hàng được nhận vào hoặc trước ngày yêu cầu, thuộc tính có giá trị 'true'. Thuộc tính này hỗ trợ trực tiếp cho KPI 'Tỷ lệ giao hàng đúng hạn của nhà cung cấp'. Thuộc tính giúp người dùng dễ dàng lọc các trường hợp giao đúng hạn hoặc trễ hạn, rất cần thiết cho dashboard theo dõi hiệu quả nhà cung cấp và bảng đánh giá nhà cung cấp. Vì sao điều này quan trọng Đo lường trực tiếp độ tin cậy của nhà cung cấp, làm cơ sở cho KPI giao hàng đúng hạn và hỗ trợ quản lý hiệu quả nhà cung cấp. Lấy dữ liệu ở đâu Được tính bằng cách so sánh dấu thời gian của hoạt động 'Đã ghi nhận nhận hàng' với thuộc tính 'RequestedDeliveryDate'. Ví dụ truefalse | |||
| Loại mục ItemCategory | Phân loại một mục trong Purchase Order, chẳng hạn mục tiêu chuẩn, ký gửi, gia công hoặc dịch vụ. | ||
| Mô tả Loại mục quyết định cách kiểm soát và xử lý việc mua một vật tư hoặc dịch vụ cụ thể. Thuộc tính này ảnh hưởng đến các bước tiếp theo như nhận hàng và kiểm tra hóa đơn. Thuộc tính này rất quan trọng khi phân tích các biến thể quy trình theo loại hàng hóa hoặc dịch vụ được mua. Chẳng hạn, quy trình cho một mục dịch vụ, cần có phiếu xác nhận dịch vụ, khác đáng kể so với quy trình cho một mặt hàng tồn kho tiêu chuẩn. Phân tích theo loại mục giúp giải thích những khác biệt này và cải tiến quy trình đúng trọng tâm. Vì sao điều này quan trọng Giải thích các biến thể của quy trình bằng cách phân biệt những loại mua sắm khác nhau, chẳng hạn như hàng hóa, dịch vụ hoặc gia công. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKPO, trường PSTYP của SAP S/4HANA. Ví dụ 093 | |||
| Mã công ty CompanyCode | Mã định danh pháp nhân hoặc công ty tạo đơn đặt hàng. | ||
| Mô tả Mã công ty đại diện cho một đơn vị kế toán độc lập trong tổ chức. Mọi giao dịch tài chính liên quan đến đơn đặt hàng đều được ghi nhận vào một mã công ty cụ thể. Đây là thuộc tính tổ chức cơ bản, giúp bạn lọc và so sánh quy trình mua sắm giữa các pháp nhân. Phân tích theo mã công ty có thể cho thấy sự thiếu nhất quán trong cách thực hiện quy trình, mức độ hiệu quả khác nhau hoặc tỷ lệ tuân thủ khác nhau giữa các đơn vị. Vì sao điều này quan trọng Cho phép phân tích quy trình theo từng pháp nhân, giúp so sánh hiệu quả và mức độ tuân thủ giữa các bộ phận khác nhau của doanh nghiệp. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO, trường BUKRS của SAP S/4HANA. Ví dụ 101017102000 | |||
| Mã vật tư MaterialNumber | Mã định danh của vật tư hoặc hàng hóa cụ thể được mua. | ||
| Mô tả Mã vật tư là mã duy nhất được gán cho từng bản ghi danh mục vật tư trong SAP. Mã này được dùng cho mọi giao dịch liên quan đến vật tư, bao gồm mua sắm, quản lý hàng tồn kho và bán hàng. Phân tích theo mã vật tư hoặc nhóm vật tư giúp bạn xem xét hoạt động mua sắm theo từng nhóm hàng. Qua đó, bạn có thể xác định quy trình mua một số loại vật tư có kém hiệu quả hơn, thời gian cung ứng lâu hơn hoặc dễ phát sinh hàng trả lại hơn hay không, từ đó hỗ trợ quản lý danh mục. Vì sao điều này quan trọng Cho phép phân tích theo nhóm hàng, giúp xác định vấn đề trong quy trình hoặc hiệu quả nhà cung cấp liên quan đến sản phẩm hay vật tư cụ thể. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKPO, trường MATNR của SAP S/4HANA. Ví dụ Nguyên liệu RM100-100FG210Dịch vụ tư vấn SERV-CONSULT | |||
| Nhà máy Plant | Cơ sở hoặc địa điểm vận hành nơi hàng hóa được giao đến hoặc dịch vụ được cung cấp. | ||
| Mô tả Trong SAP, nhà máy là địa điểm thực tế nơi hàng hóa được sản xuất, lưu trữ hoặc dịch vụ được thực hiện. Đây là yếu tố quan trọng trong hoạt động logistics và lập kế hoạch. Phân tích quy trình theo nhà máy có thể cho thấy khác biệt giữa các khu vực hoặc địa điểm. Chẳng hạn, bạn có thể phát hiện một số nhà máy có thời gian giao hàng lâu hơn hoặc tỷ lệ hàng trả lại cao hơn, từ đó nhận diện vấn đề về logistics hoặc kiểm soát chất lượng tại địa phương. Vì sao điều này quan trọng Cho phép phân tích theo địa điểm, làm rõ khác biệt về hiệu quả quy trình giữa các cơ sở vận hành, nhà máy hoặc kho hàng. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKPO, trường WERKS của SAP S/4HANA. Ví dụ 10101710DE01 | |||
| Nhóm mua hàng PurchasingGroup | Nhóm người mua phụ trách một số hoạt động mua sắm cụ thể. | ||
| Mô tả Nhóm mua hàng gồm một hoặc nhiều người phụ trách các hoạt động mua hàng, vật tư hoặc nhà cung cấp cụ thể. Đây là đầu mối liên hệ chính với nhà cung cấp. Thuộc tính này cho phép phân tích khối lượng công việc và hiệu quả chi tiết hơn so với tổ chức mua hàng. Bạn có thể dùng thuộc tính này để xác định nhóm đang quá tải, đo lường hiệu quả của từng nhóm người mua và tìm hiểu nhóm nào thường làm sai lệch quy trình, chẳng hạn như mua hàng ngoài quy trình. Vì sao điều này quan trọng Cung cấp góc nhìn chi tiết về hiệu quả của từng nhóm người mua, giúp phân tích khối lượng công việc, hiệu suất và mức độ tuân thủ quy trình ở cấp nhóm. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO, trường EKGRP của SAP S/4HANA. Ví dụ 001002N00 | |||
| Tổ chức mua hàng PurchasingOrganization | Đơn vị tổ chức phụ trách mua vật tư, dịch vụ và đàm phán với nhà cung cấp. | ||
| Mô tả Tổ chức mua hàng là một đơn vị quan trọng trong hoạt động mua sắm. Đơn vị này có thể được tổ chức ở cấp tập đoàn, công ty hoặc nhà máy và chịu trách nhiệm về mọi hoạt động mua hàng. Phân tích quy trình theo tổ chức mua hàng giúp đánh giá hiệu quả và kết quả làm việc của các nhóm mua hàng hoặc khu vực khác nhau. Qua đó, bạn có thể nhận ra khác biệt trong việc đàm phán với nhà cung cấp, tuân thủ quy trình hoặc thời gian phê duyệt giữa các đơn vị. Vì sao điều này quan trọng Cho phép so sánh hiệu quả giữa các phòng ban mua hàng hoặc khu vực, giúp xác định cách làm tốt và những điểm cần cải thiện. Lấy dữ liệu ở đâu Thuộc tính này nằm trong bảng EKKO, trường EKORG của SAP S/4HANA. Ví dụ 10101710US01 | |||
Hoạt động trong quy trình mua hàng đến thanh toán, đơn đặt hàng
| Hoạt động | Mô tả | ||
|---|---|---|---|
| Ghi nhận nhận hàng | Ghi nhận việc nhận hàng thực tế từ nhà cung cấp và cập nhật tương ứng trong hệ thống. Đây là giao dịch cụ thể làm thay đổi lịch sử Purchase Order. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng, kết thúc thời gian giao hàng của nhà cung cấp và bắt đầu quy trình nội bộ kiểm tra hóa đơn. Mốc này cần thiết để theo dõi tỷ lệ giao hàng đúng hạn. Lấy dữ liệu ở đâu Được ghi thành chứng từ vật tư trong các bảng MKPF (tiêu đề) và MSEG (mục), đồng thời liên kết với Purchase Order trong bảng lịch sử EKBE bằng loại chuyển động cụ thể, chẳng hạn 101. Thu thập Ngày hạch toán (BUDAT) từ tiêu đề chứng từ vật tư (MKPF), được liên kết qua EKBE. Loại sự kiện explicit | |||
| Hoàn tất Purchase Order | Hoạt động này cho biết một mục Purchase Order đã được đóng xét theo khía cạnh logistics. Sự kiện được suy ra khi cả chỉ báo 'Đã giao hàng đầy đủ' và 'Hóa đơn cuối cùng' đều được bật. | ||
| Vì sao điều này quan trọng Đây là điểm kết thúc để phân tích vòng đời Purchase Order. Đo thời gian đến mốc này sẽ cho biết tổng thời gian xử lý mua sắm từ đầu đến cuối. Lấy dữ liệu ở đâu Được suy ra từ các cờ trạng thái trong bảng mục Purchase Order EKPO. Sự kiện xảy ra khi cả chỉ báo 'Đã giao hàng đầy đủ' (ELIKZ) và 'Hóa đơn cuối cùng' (EREKZ) đều được đặt thành đúng. Thu thập Được suy ra từ nhật ký thay đổi khi cả hai trường ELIKZ và EREKZ trong EKPO đều được đánh dấu hoàn tất. Loại sự kiện inferred | |||
| Nhận hóa đơn | Ghi nhận hóa đơn của nhà cung cấp vào hệ thống SAP và liên kết hóa đơn với Purchase Order tương ứng. Đây là nghiệp vụ tài chính cụ thể tạo ra chứng từ kế toán. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng kết nối quy trình mua sắm với quy trình phải trả. Mốc này giúp phân tích thời gian từ lúc nhận hàng đến khi xử lý hóa đơn. Lấy dữ liệu ở đâu Chứng từ kế toán được tạo trong bảng BKPF (tiêu đề); các dòng chứng từ nằm trong BSEG hoặc sổ cái chung ACDOCA. Chứng từ được liên kết với PO trong bảng RSEG. Thu thập Ngày nhập chứng từ (CPUDT) trong bảng tiêu đề chứng từ kế toán BKPF. Loại sự kiện explicit | |||
| Phê duyệt Purchase Order | Cho biết Purchase Order đã nhận đủ phê duyệt nội bộ cần thiết và được phép gửi cho nhà cung cấp. Sự kiện này được suy ra từ thay đổi trạng thái trong chiến lược phê duyệt của PO. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng để đo lường hiệu quả phê duyệt và công việc phải làm lại sau phê duyệt. Phân tích thời gian từ lúc tạo đến lúc phê duyệt PO giúp phát hiện chậm trễ trong quy trình nội bộ. Lấy dữ liệu ở đâu Được suy ra từ chỉ báo phê duyệt (FRGKE) trong bảng EKKO. Dấu thời gian được xác định từ lịch sử thay đổi (CDHDR/CDPOS), cho biết thời điểm trường này được cập nhật sang trạng thái 'đã phê duyệt'. Thu thập Được suy ra từ nhật ký thay đổi của trường chỉ báo phê duyệt (FRGKE) trong bảng EKKO. Loại sự kiện inferred | |||
| Phê duyệt yêu cầu mua hàng | Ghi nhận việc quản lý hoặc người có thẩm quyền chính thức phê duyệt yêu cầu mua hàng. Thông thường, sự kiện này được suy ra từ thay đổi trạng thái của chứng từ yêu cầu, cho biết chứng từ đã sẵn sàng chuyển thành Purchase Order. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng để theo dõi thời gian phê duyệt và phát hiện điểm nghẽn. Chậm trễ ở bước này ảnh hưởng trực tiếp đến thời điểm tạo Purchase Order và gửi cho nhà cung cấp. Lấy dữ liệu ở đâu Được suy ra từ các trường trạng thái phê duyệt trong bảng EBAN, chẳng hạn FRGZU (chỉ báo phê duyệt). Dấu thời gian được xác định từ chứng từ thay đổi (CDHDR/CDPOS), ghi lại thời điểm đặt trạng thái phê duyệt cuối cùng. Thu thập Được suy ra từ nhật ký thay đổi (CDHDR/CDPOS) của các trường trạng thái phê duyệt trong bảng EBAN. Loại sự kiện inferred | |||
| Tạo Purchase Order | Ghi nhận thời điểm tạo chứng từ Purchase Order chính thức, có thể tạo từ yêu cầu mua hàng hoặc không. Hệ thống ghi nhận sự kiện khi PO được lưu lần đầu. | ||
| Vì sao điều này quan trọng Hoạt động này có thể là điểm bắt đầu thay thế của quy trình, nhất là khi phân tích các giao dịch mua ngoài quy định. Đây là sự kiện cơ bản để theo dõi tổng thời gian xử lý PO. Lấy dữ liệu ở đâu Được ghi trong bảng tiêu đề Purchase Order EKKO. Ngày tạo (AEDAT) và thời gian của chứng từ được lưu trực tiếp trong bảng này. Thu thập Dấu thời gian tạo (AEDAT) trong bảng EKKO của chứng từ Purchase Order. Loại sự kiện explicit | |||
| Tạo yêu cầu mua hàng | Hoạt động này ghi nhận yêu cầu chính thức về hàng hóa hoặc dịch vụ, khởi đầu quy trình mua sắm. Hệ thống ghi nhận sự kiện khi người dùng lưu chứng từ yêu cầu mua hàng mới, chẳng hạn bằng giao dịch ME51N. | ||
| Vì sao điều này quan trọng Đây là điểm bắt đầu chính trong vòng đời của nhiều Purchase Order. Phân tích thời gian từ sự kiện này đến lúc tạo PO giúp phát hiện chậm trễ trong khâu tìm nguồn cung và xử lý nội bộ. Lấy dữ liệu ở đâu Được ghi trong bảng EBAN (Purchase Requisition). Dấu thời gian tạo có thể tìm thấy trong các bảng lịch sử thay đổi CDHDR và CDPOS của đối tượng EBAN. Thu thập Sự kiện được ghi nhận khi tạo chứng từ trong bảng EBAN. Loại sự kiện explicit | |||
| Gửi Purchase Order cho nhà cung cấp | Ghi nhận thời điểm Purchase Order được gửi cho nhà cung cấp, chẳng hạn qua EDI, email hoặc bản in. Sự kiện này thường được ghi lại trong nhật ký quản lý đầu ra của hệ thống. | ||
| Vì sao điều này quan trọng Hoạt động này đánh dấu thời điểm thực sự bắt đầu tính thời gian giao hàng của nhà cung cấp. Đây là mốc cần thiết để đo lường chính xác hiệu suất của nhà cung cấp kể từ khi họ nhận đơn hàng. Lấy dữ liệu ở đâu Dữ liệu được lấy từ bảng kiểm soát đầu ra NAST, nơi ghi lại các thông báo đã gửi cho chứng từ mua hàng. Có thể dùng ngày và giờ của loại đầu ra tương ứng, chẳng hạn EDI hoặc email. Thu thập Dấu thời gian của thông báo đầu ra đầu tiên gửi thành công cho PO trong bảng NAST. Loại sự kiện inferred | |||
| Nhập xác nhận dịch vụ | Hoạt động này ghi nhận việc xác nhận dịch vụ nêu trong Purchase Order đã được cung cấp. Hệ thống ghi nhận sự kiện khi tạo phiếu xác nhận dịch vụ. | ||
| Vì sao điều này quan trọng Với hoạt động mua dịch vụ, đây là bước tương đương với nhận hàng. Mốc này cần thiết để theo dõi thời gian cung cấp dịch vụ và thanh toán cho nhà cung cấp đúng hạn. Lấy dữ liệu ở đâu Được ghi nhận khi tạo phiếu xác nhận dịch vụ; dữ liệu được lưu trong các bảng ESSR (tiêu đề) và ESLL (dòng). Ngày tạo được dùng làm dấu thời gian. Thu thập Ngày tạo chứng từ phiếu xác nhận dịch vụ trong bảng ESSR. Loại sự kiện explicit | |||
| Thanh toán hóa đơn | Ghi nhận việc tất toán hóa đơn nhà cung cấp qua đợt thanh toán hoặc thanh toán thủ công. Đây là giao dịch tài chính cụ thể tạo ra chứng từ bù trừ. | ||
| Vì sao điều này quan trọng Dù về mặt kỹ thuật thuộc quy trình thanh toán, đưa hoạt động này vào sẽ giúp bạn có cái nhìn đầy đủ về chu trình mua hàng đến thanh toán. Đây là mốc quan trọng để phân tích điều khoản và hiệu quả thanh toán. Lấy dữ liệu ở đâu Khoản thanh toán được ghi nhận thành chứng từ bù trừ trong BKPF/ACDOCA. Ngày bù trừ (AUGDT) trên dòng hóa đơn trong bảng BSEG hoặc ACDOCA cho biết thời điểm thanh toán. Thu thập Ngày bù trừ (AUGDT) của chứng từ hóa đơn, nằm trong BSEG hoặc ACDOCA. Loại sự kiện explicit | |||
| Thay đổi Purchase Order | Hoạt động này ghi nhận việc sửa đổi Purchase Order sau khi tạo, chẳng hạn thay đổi số lượng, giá hoặc ngày giao hàng. Hệ thống ghi lại sự kiện này trong nhật ký thay đổi. | ||
| Vì sao điều này quan trọng Theo dõi thay đổi, nhất là sau phê duyệt, rất quan trọng để phát hiện quy trình kém hiệu quả, công việc phải làm lại và nguy cơ không tuân thủ. Thay đổi thường xuyên có thể cho thấy yêu cầu ban đầu chưa rõ ràng. Lấy dữ liệu ở đâu Được ghi trong các bảng chứng từ thay đổi CDHDR (tiêu đề) và CDPOS (mục) của đối tượng Purchase Order (EINKBELEG). Mỗi thay đổi tạo một mục nhật ký chi tiết. Thu thập Sự kiện được ghi nhận khi các trường quan trọng trong bảng EKKO hoặc EKPO thay đổi, thông qua CDHDR/CDPOS. Loại sự kiện explicit | |||
| Trả hàng | Ghi nhận hàng đã nhận được trả lại cho nhà cung cấp, thường do vấn đề chất lượng, hư hỏng hoặc giao sai hàng. Hệ thống ghi nhận đây là giao dịch đảo chuyển động hàng hóa. | ||
| Vì sao điều này quan trọng Hoạt động này cho thấy công việc phải làm lại và các vấn đề tiềm ẩn về chất lượng nhà cung cấp hoặc độ chính xác của đơn hàng. Nếu một nhà cung cấp hoặc mặt hàng có tỷ lệ trả hàng cao, đó có thể là dấu hiệu của vấn đề. Lấy dữ liệu ở đâu Được ghi thành chứng từ vật tư với loại chuyển động trả hàng cụ thể, chẳng hạn 122. Sự kiện được ghi trong MKPF/MSEG và liên kết với PO trong bảng lịch sử EKBE. Thu thập Ngày hạch toán của chứng từ vật tư có loại chuyển động trả hàng trong EKBE. Loại sự kiện explicit | |||
| Xóa Purchase Order | Ghi nhận việc hủy hoặc xóa logic một mục Purchase Order hay toàn bộ chứng từ. Sự kiện được ghi nhận khi người dùng đặt cờ xóa trên chứng từ. | ||
| Vì sao điều này quan trọng Hoạt động này là một điểm kết thúc khác của quy trình, cho biết đơn hàng bị hủy hoặc không thành công. Phân tích lý do xóa PO có thể giúp phát hiện vấn đề trong việc lập kế hoạch nhu cầu hoặc xác định yêu cầu. Lấy dữ liệu ở đâu Dữ liệu được lấy từ cờ chỉ báo xóa (LOEKZ) trong bảng tiêu đề Purchase Order (EKKO) hoặc bảng mục (EKPO). Dấu thời gian được xác định từ chứng từ thay đổi (CDHDR/CDPOS). Thu thập Dấu thời gian từ chứng từ thay đổi (CDHDR/CDPOS) khi cờ xóa (LOEKZ) được bật. Loại sự kiện explicit | |||
Hướng dẫn trích xuất dữ liệu
Các bước
- Điều kiện tiên quyết và quyền truy cập: Đảm bảo bạn có tài khoản với quyền phù hợp để truy vấn các CDS View (Core Data Services) trong hệ thống SAP S/4HANA. Bạn có thể truy cập qua SAP HANA Studio, ABAP Development Tools (ADT) cho Eclipse hoặc công cụ trích xuất dữ liệu của bên thứ ba có hỗ trợ kết nối SQL với cơ sở dữ liệu SAP HANA.
- Xác định thông tin kết nối hệ thống: Lấy các thông số cần thiết để kết nối với hệ thống SAP S/4HANA, gồm máy chủ, số phiên bản và thông tin xác thực.
- Kết nối cơ sở dữ liệu: Dùng ứng dụng SQL bạn chọn để kết nối với cơ sở dữ liệu SAP S/4HANA chứa các CDS View.
- 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 SQL. Truy vấn được thiết kế để trích xuất mọi hoạt động và thuộc tính cần thiết.
- Đặt tham số lọc: Tìm các giá trị giữ chỗ trong truy vấn. Thay _start_date và _end_date bằng khoảng ngày cần phân tích, chẳng hạn '20230101' và '20231231'. Sửa bộ lọc poh.CompanyCode để thêm mã công ty cần phân tích.
- Chạy truy vấn: Chạy truy vấn SQL đã chỉnh sửa trên cơ sở dữ liệu S/4HANA. Tùy vào lượng dữ liệu và khoảng ngày, quá trình này có thể mất một lúc.
- Kiểm tra kết quả sơ bộ: Khi truy vấn chạy xong, kiểm tra nhanh kết quả trong ứng dụng SQL. Xác nhận có đủ các hoạt động, dấu thời gian được điền chính xác và mã trường hợp (PurchaseOrderNumber) nhất quán.
- Xuất dữ liệu: Xuất toàn bộ kết quả từ công cụ SQL sang tệp CSV (Comma Separated Values). Đảm bảo tệp dùng mã hóa UTF-8 để tránh lỗi ký tự.
- Chuẩn bị tải lên: Trước khi tải lên ProcessMind, mở tệp CSV và kiểm tra tiêu đề cột khớp chính xác với các thuộc tính trong yêu cầu dữ liệu (PurchaseOrderNumber, ActivityName, EventTime, v.v.). Đổi tên cột nếu công cụ xuất đã tự sửa tên.
- Tải lên ProcessMind: Tải tệp CSV đã hoàn thiện lên dự án ProcessMind. Trong quá trình nhập, ánh xạ các cột trong tệp với trường mã trường hợp, hoạt động và dấu thời gian tương ứng.
Cấu hình
- Các CDS View chính được sử dụng: Logic trích xuất dựa trên một nhóm CDS View tiêu chuẩn, có ngữ nghĩa rõ ràng. Các View chính gồm:
- I_PurchaseOrderItemAPI01: Dữ liệu cốt lõi về mặt hàng trong đơn đặt hàng.
- I_PurchaseRequisitionItemAPI01: Thông tin chi tiết về yêu cầu mua hàng.
- I_MaterialDocumentItem: Các nghiệp vụ luân chuyển hàng hóa như nhận hàng và trả hàng.
- I_ServiceEntrySheetAPI01: Các sự kiện xác nhận dịch vụ.
- I_SupplierInvoiceAPI01: Thông tin hóa đơn nhà cung cấp.
- I_OperationalAcctgDocItem: Liên kết hóa đơn với chứng từ tài chính để theo dõi thanh toán.
- I_ChangeDocument: Ghi nhận các thay đổi đối với đơn đặt hàng.
- Lọc theo khoảng ngày: Cần lọc theo khoảng ngày để kiểm soát hiệu năng và lượng dữ liệu. Truy vấn dùng các giá trị giữ chỗ _start_date và _end_date cho ngày tạo đơn đặt hàng (PurchaseOrderDate). Nên bắt đầu với dữ liệu trong khoảng 3 đến 6 tháng.
- Lọc theo tổ chức: Luôn lọc truy vấn theo CompanyCode để giới hạn phạm vi trích xuất vào các đơn vị kinh doanh liên quan. Bạn có thể thêm bộ lọc PurchaseOrderType hoặc PurchasingOrganization vào biểu thức bảng chung PO_base để thu hẹp phạm vi hơn.
- Điều kiện tiên quyết: Người chạy truy vấn cần có quyền SELECT trên tất cả CDS View nêu trên. Thông thường, quyền truy cập các View này được cấp qua những vai trò nghiệp vụ hoặc phân tích cụ thể trong S/4HANA. Truy vấn sẽ không chạy nếu thiếu quyền phù hợp.
Truy vấn mẫu sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Các bước
- Xác nhận có quyền truy cập SQL trực tiếp vào lược đồ SAP HANA chứa EKKO và EKPO, đồng thời xin các quyền đọc cần thiết. Thay giá trị giữ chỗ cho lược đồ và kết nối bằng thông tin đã cấu hình cho hệ thống của bạn.
- Xác định khoảng trích xuất bằng [Start timestamp] và [End timestamp]. Với lần tải dữ liệu đầu tiên, nên chọn khoảng từ ba đến sáu tháng. Chỉ lọc theo mã công ty và loại chứng từ khi phạm vi báo cáo yêu cầu.
- Xác định các đơn đặt hàng trong EKKO và EKPO, giữ lại số đơn đặt hàng, nhà cung cấp, loại chứng từ, mã công ty, ngày tạo, giờ tạo và thuộc tính cấp mặt hàng. Tổng hợp giá trị thuần EKPO để tính TotalNetAmount ở cấp đơn đặt hàng.
- Trích xuất các sự kiện tạo và phê duyệt yêu cầu mua hàng từ EBAN. Dùng số yêu cầu mua hàng và tham chiếu mặt hàng trong EKPO để liên kết yêu cầu với đơn đặt hàng. Vì chỉ báo và dấu thời gian phê duyệt thay đổi tùy cấu hình phiên bản, hãy thiết lập biểu thức trạng thái và dấu thời gian phê duyệt theo chiến lược phê duyệt SAP đang dùng tại [Configure based on your system].
- Trích xuất các sự kiện tạo, phê duyệt, thay đổi, xóa và hoàn tất đơn đặt hàng. Sự kiện tạo dùng ngày và giờ tạo trong EKKO. Sự kiện phê duyệt, thay đổi và xóa cần nguồn lịch sử phê duyệt hoặc thay đổi. Nếu lược đồ đã chọn không cung cấp lịch sử liên quan, hãy cấu hình biểu thức nguồn tương ứng bằng [Your table name] và [Your column name].
- Trích xuất các sự kiện trao đổi với nhà cung cấp, nhận hàng, xác nhận dịch vụ, trả hàng, nhận hóa đơn và thanh toán hóa đơn từ các nguồn phù hợp về đầu ra, chứng từ vật tư, xác nhận dịch vụ, hóa đơn, kế toán và bù trừ. Truy vấn có các giá trị giữ chỗ riêng cho từng nguồn theo hệ thống, vì chỉ EKKO và EKPO không cung cấp các nguồn này.
- Chuẩn hóa mọi sự kiện nguồn theo cùng cấu trúc nhật ký sự kiện. Mỗi hàng phải có PurchaseOrderNumber, ActivityName, EventTime, SourceSystem, LastDataUpdate, VendorId, UserName, TotalNetAmount, PurchaseRequisitionNumber, RequestedDeliveryDate và DocumentType. Giữ lại nhiều lần phát sinh của cùng một hoạt động nếu nguồn có nhiều sự kiện hợp lệ.
- Kiểm tra dấu thời gian, chỉ xóa các hàng nguồn trùng khớp hoàn toàn và không suy đoán hoạt động nếu không có bản ghi nguồn. ProcessMind đọc nguyên trạng nhật ký sự kiện, vì vậy mỗi hoạt động xuất hiện trong phần trực quan hóa quy trình phải có một hàng riêng.
- Xuất kết quả thành tệp phân tách bằng dấu phân cách hoặc tập kết quả cơ sở dữ liệu, có một hàng tiêu đề và tên cột nhất quán. Dùng định dạng dấu thời gian được cấu hình để tải lên ProcessMind hỗ trợ, giữ PurchaseOrderNumber ở dạng văn bản và tải toàn bộ nhật ký sự kiện qua kết nối dữ liệu ProcessMind đã cấu hình.
Cấu hình
- Đối tượng nguồn: EKKO và EKPO là các nguồn đã xác nhận cho phần đầu và mặt hàng của đơn đặt hàng. Cần cấu hình thêm các đối tượng cho yêu cầu mua hàng, trạng thái phê duyệt, lịch sử thay đổi, đầu ra, luân chuyển hàng hóa, phiếu xác nhận dịch vụ, hóa đơn, thanh toán và bù trừ theo phiên bản SAP S/4HANA và mô hình dữ liệu đang dùng.
- Mã định danh trường hợp: Dùng PurchaseOrderNumber làm mã định danh trường hợp. Liên kết sự kiện cấp mặt hàng với số đơn đặt hàng; nếu cần, giữ tham chiếu mặt hàng trong một cột bổ sung dành riêng cho nguồn.
- Khoảng ngày: Bắt đầu với dữ liệu trong khoảng ba đến sáu tháng. Khi tải dữ liệu lịch sử, hãy xử lý theo từng khoảng nhỏ hơn và đối soát các mốc giao nhau để tránh bỏ sót.
- Bộ lọc: Cấu hình bộ lọc Company Code, Document Type, VendorId, tổ chức mua hàng, nhóm mua hàng và ngày sự kiện theo phạm vi cần thiết. Giá trị bộ lọc mã công ty và loại chứng từ phải hợp lệ trong hệ thống đích.
- Ý nghĩa sự kiện: Có thể ghi nhận rõ sự kiện tạo và xóa nếu có các trường chứng từ hoặc nhật ký liên quan. Phê duyệt và hoàn tất là sự kiện dựa trên trạng thái, cần cấu hình dấu thời gian trạng thái. Không tạo hàng chỉ dựa trên trạng thái hiện tại nếu không có dấu thời gian sự kiện đáng tin cậy.
- Hiệu năng: Lọc sớm theo ngày sự kiện và phạm vi tổ chức, tổng hợp EKPO trước khi nối với nguồn sự kiện nếu có thể, và chia các lần tải dữ liệu lịch sử lớn thành từng khoảng thời gian. Đảm bảo có thống kê cơ sở dữ liệu phù hợp và tránh nối không giới hạn giữa các nguồn mặt hàng, kế toán và lịch sử thay đổi.
- Dấu thời gian làm mới: Đặt LastDataUpdate thành thời điểm chạy trích xuất cho mọi hàng trong mỗi lần chạy.
- Điều kiện tiên quyết: Cần có kết nối SAP HANA, quyền đọc tất cả đối tượng nguồn đã cấu hình, quyền truy cập dữ liệu mua hàng, quản lý tồn kho, mua dịch vụ, kiểm tra hóa đơn và khoản phải trả, cùng kết nối ProcessMind có thể nhập tệp hoặc tập kết quả đã chọn.
- Cấu hình riêng cho hệ thống: Thay mọi giá trị giữ chỗ trong ngoặc vuông của truy vấn bằng bảng, View, cột hoặc biểu thức đã được phê duyệt trong hệ thống SAP S/4HANA đích. Không đưa thông tin xác thực vào truy vấn hoặc cấu hình trích xuất.
Truy vấn mẫu sql
WITH
params AS (
SELECT
CAST('[Start timestamp]' AS TIMESTAMP) AS start_ts,
CAST('[End timestamp]' AS TIMESTAMP) AS end_ts,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update,
CAST('[Source system]' AS NVARCHAR(100)) AS source_system
FROM DUMMY
),
po_base AS (
SELECT
h.MANDT,
h.EBELN AS PurchaseOrderNumber,
h.LIFNR AS VendorId,
h.BSART AS DocumentType,
h.BUKRS AS CompanyCode,
CAST(h.AEDAT AS DATE) AS POChangedDate,
CAST(h.AEDAT AS TIMESTAMP) AS POChangedTimestamp,
CAST(h.ERNAM AS NVARCHAR(100)) AS POCreatedBy,
CAST(h.BEDAT AS DATE) AS PODate,
CAST(h.EBELN AS NVARCHAR(20)) AS PurchaseOrderKey,
CAST(SUM(COALESCE(i.NETWR, 0)) AS DECIMAL(23, 2)) AS TotalNetAmount,
CAST(MIN(i.BEDNR) AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
CAST(MIN(i.EINDT) AS DATE) AS RequestedDeliveryDate
FROM EKKO h
INNER JOIN EKPO i
ON i.MANDT = h.MANDT
AND i.EBELN = h.EBELN
WHERE h.AEDAT >= (SELECT start_ts FROM params)
AND h.AEDAT < (SELECT end_ts FROM params)
AND h.BUKRS IN ([Company Code filter])
AND h.BSART IN ([Document Type filter])
GROUP BY
h.MANDT,
h.EBELN,
h.LIFNR,
h.BSART,
h.BUKRS,
h.AEDAT,
h.ERNAM,
h.BEDAT
),
po_items AS (
SELECT
i.MANDT,
i.EBELN AS PurchaseOrderNumber,
i.EBELP,
i.BANFN AS PurchaseRequisitionNumber,
i.BEDNR,
i.EINDT AS RequestedDeliveryDate
FROM EKPO i
),
events AS (
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(r.[Purchase requisition creation timestamp] AS TIMESTAMP) AS EventTime,
s.source_system AS SourceSystem,
s.last_data_update AS LastDataUpdate,
p.VendorId,
CAST(r.[Purchase requisition created by] AS NVARCHAR(100)) AS UserName,
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition source table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition creation timestamp] >= s.start_ts
AND r.[Purchase requisition creation timestamp] < s.end_ts
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(r.[Purchase requisition approval timestamp] AS TIMESTAMP) AS EventTime,
s.source_system,
s.last_data_update,
p.VendorId,
CAST(r.[Purchase requisition approver] AS NVARCHAR(100)),
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)),
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition approval history table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition approval timestamp] >= s.start_ts
AND r.[Purchase requisition approval timestamp] < s.end_ts
AND r.[Approval status] = '[Approved status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Created',
CAST(p.PODate AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
p.POCreatedBy,
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
CROSS JOIN params s
WHERE p.PODate >= CAST(s.start_ts AS DATE)
AND p.PODate < CAST(s.end_ts AS DATE)
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Approved',
CAST(a.[Purchase order approval timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(a.[Approver] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order release history table or view] a
ON a.[Client] = p.MANDT
AND a.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE a.[Purchase order approval timestamp] >= s.start_ts
AND a.[Purchase order approval timestamp] < s.end_ts
AND a.[Release status] = '[Approved release status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Sent to Vendor',
CAST(o.[Output timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(o.[Output user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order output source table or view] o
ON o.[Client] = p.MANDT
AND o.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE o.[Output timestamp] >= s.start_ts
AND o.[Output timestamp] < s.end_ts
AND o.[Output status] = '[Successfully processed output status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Changed',
CAST(c.[Change timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(c.[Changed by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order change history table or view] c
ON c.[Client] = p.MANDT
AND c.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE c.[Change timestamp] >= s.start_ts
AND c.[Change timestamp] < s.end_ts
AND c.[Change indicator] = '[Changed indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Receipt Posted',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods receipt movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Services Confirmation Entered',
CAST(v.[Service entry timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(v.[Entered by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your service entry sheet source table or view] v
ON v.[Client] = p.MANDT
AND v.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE v.[Service entry timestamp] >= s.start_ts
AND v.[Service entry timestamp] < s.end_ts
AND v.[Service entry status] = '[Accepted service entry status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Returned',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods return movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Received',
CAST(i.[Invoice posting timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Invoice posting timestamp] >= s.start_ts
AND i.[Invoice posting timestamp] < s.end_ts
AND i.[Invoice status] = '[Posted invoice status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Paid',
CAST(i.[Clearing timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Cleared by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice clearing source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Clearing timestamp] >= s.start_ts
AND i.[Clearing timestamp] < s.end_ts
AND i.[Clearing status] = '[Cleared status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Completed',
CAST(x.[Completion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(x.[Completion user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order item status source table or view] x
ON x.[Client] = p.MANDT
AND x.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE x.[Completion timestamp] >= s.start_ts
AND x.[Completion timestamp] < s.end_ts
AND x.[Delivery completed indicator] = '[Set indicator value]'
AND x.[Final invoice indicator] = '[Set indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Deleted',
CAST(d.[Deletion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(d.[Deleted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order deletion history table or view] d
ON d.[Client] = p.MANDT
AND d.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE d.[Deletion timestamp] >= s.start_ts
AND d.[Deletion timestamp] < s.end_ts
AND d.[Deletion indicator] = '[Set deletion indicator value]'
)
SELECT
PurchaseOrderNumber,
ActivityName,
EventTime,
SourceSystem,
LastDataUpdate,
VendorId,
UserName,
TotalNetAmount,
PurchaseRequisitionNumber,
RequestedDeliveryDate,
DocumentType
FROM events
WHERE PurchaseOrderNumber IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY PurchaseOrderNumber, EventTime, ActivityName; Các bước
- Đặc tả và thiết kế: Xác định cấu trúc dữ liệu cuối cùng cho tệp nhật ký sự kiện, gồm tất cả thuộc tính bắt buộc và nên có. Ghi lại các bảng SAP cụ thể, chẳng hạn EKKO, EKPO, EKBE, CDHDR, CDPOS, BKPF, sẽ dùng làm nguồn cho từng hoạt động trong số 13 hoạt động bắt buộc.
- Tạo chương trình: Trong SAP GUI, mở ABAP Editor bằng mã giao dịch SE38 hoặc SE80. Tạo chương trình thực thi mới, chẳng hạn Z_PM_PO_EXTRACT.
- Tạo màn hình chọn dữ liệu: Viết mã cho màn hình chọn dữ liệu của báo cáo để người dùng lọc dữ liệu cần trích xuất. Thêm tham số cho khoảng ngày tạo đơn đặt hàng (P_AEDAT), mã công ty (P_BUKRS) và loại chứng từ mua hàng (P_BSART).
- Khai báo dữ liệu: Xác định các bảng nội bộ và cấu trúc dữ liệu cần cho chương trình. Trong đó có bảng nội bộ chứa nhật ký sự kiện cuối cùng, theo cấu trúc đã xác định ở bước đặc tả.
- Viết logic chọn dữ liệu: Viết logic ABAP cốt lõi để chọn dữ liệu cho từng hoạt động trong số 13 hoạt động. Việc này gồm một loạt câu lệnh SELECT trên các bảng SAP liên quan, kết hợp bảng khi cần. Với sự kiện dựa trên thay đổi, đọc dữ liệu từ bảng nhật ký thay đổi CDHDR và CDPOS.
- Chuyển đổi và ánh xạ dữ liệu: Với mỗi bản ghi truy xuất được, ánh xạ các trường trong bảng SAP sang cột tương ứng trong bảng nội bộ nhật ký sự kiện cuối cùng. Đặt ActivityName theo sự kiện đang xử lý, chẳng hạn 'Đã tạo đơn đặt hàng'. Chuyển đổi trường ngày và giờ sang định dạng dấu thời gian thống nhất cho EventTime.
- Gộp dữ liệu sự kiện: Sau khi xử lý đủ 13 loại hoạt động, đảm bảo mọi dữ liệu được tập hợp vào một bảng nội bộ thống nhất. Bảng này là nhật ký sự kiện hoàn chỉnh cho các đơn đặt hàng đã chọn.
- Ghi tệp đầu ra: Thêm chức năng ghi bảng nội bộ cuối cùng ra tệp. Nên dùng phương thức cl_gui_frontend_services=>gui_download để người dùng lưu tệp CSV trên máy tính, hoặc dùng OPEN DATASET để lưu tệp trên máy chủ ứng dụng SAP khi xử lý nền.
- Tạo mã giao dịch (không bắt buộc): Để người dùng nghiệp vụ dễ truy cập chương trình, dùng mã giao dịch SE93 để tạo mã giao dịch tùy chỉnh, chẳng hạn ZPM_PO_EXTRACT, chạy chương trình ABAP.
- Lên lịch chạy nền: Với lượng dữ liệu lớn hoặc cần trích xuất tự động, dùng mã giao dịch SM36 để lên lịch chạy chương trình dưới dạng tác vụ nền. Tệp đầu ra sẽ được ghi vào đường dẫn máy chủ ứng dụng đã chỉ định trong logic chương trình.
Cấu hình
- Tiêu chí chọn dữ liệu: Chương trình nên có các tham số chọn để lọc dữ liệu hiệu quả. Các bộ lọc chính gồm:
- Khoảng ngày: Bắt buộc lọc theo ngày tạo đơn đặt hàng (EKKO-AEDAT). Nên bắt đầu với khoảng 3-6 tháng để kiểm soát lượng dữ liệu và hiệu năng báo cáo.
- Mã công ty (BUKRS): Cần thiết với tổ chức có nhiều pháp nhân để thu hẹp phạm vi trích xuất.
- Loại chứng từ mua hàng (BSART): Cho phép lọc các loại đơn đặt hàng cụ thể, như đơn tiêu chuẩn, đơn khung hoặc đơn điều chuyển tồn kho, để tập trung phân tích.
- Đọc nhật ký thay đổi: Việc trích xuất các hoạt động như 'Đã phê duyệt đơn đặt hàng' hoặc 'Đã thay đổi đơn đặt hàng' cần đọc bảng nhật ký thay đổi SAP (CDHDR, CDPOS). Thao tác này có thể tiêu tốn nhiều tài nguyên. Cần tối ưu logic ABAP để chỉ chọn các lớp đối tượng (EINKBELEG, BANF) và tổ hợp bảng/trường cần thiết.
- Quyền truy cập: Người dùng hoặc tài khoản kỹ thuật chạy báo cáo cần có quyền đọc rộng trên các bảng thuộc nhiều mô-đun SAP, gồm Materials Management (MM), Financial Accounting (FI) và các bảng toàn hệ thống. Các bảng cần quyền truy cập gồm EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR và CDPOS.
- Chạy nền: Nếu trích xuất dữ liệu dài hơn vài tháng hoặc chạy trên hệ thống có lượng giao dịch lớn, hãy luôn chạy chương trình ở chế độ nền để tránh hết thời gian chờ của tiến trình hộp thoại.
Truy vấn mẫu abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log. Sẵn sàng bắt đầu?
Mẫu này giúp bạn có nền tảng vững chắc để bắt đầu với process mining. Khai thác dữ liệu SAP S/4HANA để tìm cơ hội nâng cao hiệu quả và cải tiến quy trình Purchase to Pay ngay hôm nay.
Cải tiến đơn đặt hàng P2P, rút ngắn thời gian xử lý ngay
Loại bỏ các bước kém hiệu quả và rút ngắn 30% thời gian xử lý đơn đặt hàng P2P.
Không cần thẻ tín dụng. Thiết lập chỉ trong vài phút.