Mẫu dữ liệu xử lý đơn hàng bán từ đơn hàng đến thu tiền
Mẫu dữ liệu xử lý đơn hàng bán từ đơn hàng đến thu tiền
- 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 dữ liệu từ SAP ECC
Thuộc tính của quy trình xử lý đơn hàng bán từ đơn hàng đến thu tiền
| Tên | Mô tả | ||
|---|---|---|---|
| Đơn hàng bán SalesOrder | Mã định danh duy nhất của chứng từ đơn hàng bán, được dùng làm hồ sơ chính để theo dõi toàn bộ quy trình từ đơn hàng đến thu tiền. | ||
| Mô tả Đơn hàng bán là chứng từ trung tâm trong quy trình bán hàng, thể hiện yêu cầu mua hàng hóa hoặc dịch vụ của khách hàng. Chứng từ này chứa mọi thông tin cần thiết để xử lý yêu cầu từ đầu đến cuối. Trong process mining, thuộc tính này được dùng làm Case ID. Mỗi số đơn hàng bán duy nhất tương ứng với một trường hợp quy trình từ đầu đến cuối. Phân tích theo đơn hàng bán giúp theo dõi toàn bộ vòng đời, tính thời gian xử lý và xác định khác biệt của từng đơn hàng khách. Vì sao điều này quan trọng Đây là khóa thiết yếu để liên kết mọi hoạt động và sự kiện liên quan, giúp phân tích toàn bộ hành trình của từng đơn hàng khách. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu tiêu đề chứng từ bán hàng (VBAK), tại trường VBELN. Ví dụ 900001234590000123469000012347 | |||
| 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, chẳng hạn tên một phiên bản SAP ECC cụ thể hoặc số client. Thông tin này giúp hiểu rõ nguồn gốc dữ liệu, nhất là khi có nhiều hệ thống đang vận hành hoặc dữ liệu từ các hệ thống cũ. Khi phân tích, thuộc tính này được dùng để lọc hoặc phân nhóm dữ liệu theo nguồn. Điều này đặc biệt hữu ích khi so sánh quy trình giữa các hệ thống hoặc trong dự án chuyển đổi hệ thống, nhằm đảm bảo dữ liệu đầy đủ và nhất quán. Vì sao điều này quan trọng Cung cấp bối cảnh cần thiết, nhất là khi có nhiều hệ thống, giúp so sánh quy trình và làm rõ nguồn gốc dữ liệu. Lấy dữ liệu ở đâu Giá trị này thường được thêm trong quá trình trích xuất dữ liệu và thường là giá trị cố định đại diện cho mã hệ thống SAP (SAPSID) hoặc client (MANDT). Ví dụ ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
| Hoạt động Activity | Tên của một bước nghiệp vụ hoặc sự kiện cụ thể diễn ra trong quy trình xử lý đơn hàng bán. | ||
| Mô tả Thuộc tính này mô tả một bước trong quy trình từ đơn hàng đến thu tiền, chẳng hạn như 'Đã tạo đơn hàng bán', 'Đã tạo chứng từ giao hàng' hoặc 'Đã nhận thanh toán'. Các hoạt động này là những thành phần dùng để dựng lại luồng quy trình cho từng đơn hàng bán. Phân tích trình tự và thời điểm diễn ra các hoạt động là trọng tâm của process mining. Việc này giúp trực quan hóa sơ đồ quy trình, xác định điểm nghẽn, phát hiện các biến thể quy trình và kiểm tra mức độ tuân thủ so với mô hình chuẩn. Hoạt động thường được xác định từ sự kết hợp giữa sự kiện tạo chứng từ, thay đổi trạng thái hoặc mã giao dịch cụ thể được ghi trong hệ thống. Vì sao điều này quan trọng Hoạt động là nền tảng của sơ đồ quy trình, giúp trực quan hóa và phân tích luồng quy trình, các sai lệch và điểm nghẽn. Lấy dữ liệu ở đâu Đây là thuộc tính được suy ra, thường được tạo trong quá trình trích xuất dữ liệu bằng cách ánh xạ mã giao dịch SAP (T-Code), thay đổi trạng thái chứng từ (ví dụ: từ các bảng VBUK, VBUP) hoặc nhật ký thay đổi chứng từ (các bảng CDHDR, CDPOS) sang tên hoạt động dễ hiểu. Ví dụ Đã tạo đơn hàng bánĐã tạo chứng từ giao hàngĐã xuất hàngĐã tạo hóa đơnĐã nhận thanh toán | |||
| 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ủa bản ghi này được làm mới từ hệ thống nguồn. | ||
| Mô tả Thuộc tính này ghi lại ngày giờ trích xuất hoặc cập nhật dữ liệu gần nhất cho một sự kiện hay trường hợp. Nhờ đó, bạn biết dữ liệu đang phân tích mới đến mức nào. Trong dashboard và báo cáo, thông tin này giúp người dùng đánh giá mức độ cập nhật của thông tin phân tích. Bạn có thể kiểm tra xem phân tích phản ánh tình hình vận hành mới nhất hay dựa trên dữ liệu cũ, từ đó đặt kỳ vọng phù hợp về độ mới của dữ liệu. Vì sao điều này quan trọng Giúp người dùng biết dữ liệu mới đến mức nào. Đây là thông tin quan trọng để đưa ra quyết định kịp thời và có căn cứ dựa trên kết quả phân tích process mining. Lấy dữ liệu ở đâu Đây là thuộc tính siêu dữ liệu do công cụ hoặc quy trình trích xuất dữ liệu điền vào khi nạp dữ liệu. Thuộc tính này không được lưu trong các bảng SAP nguồn. Ví dụ 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
| Thời gian bắt đầu StartTime | Dấu thời gian cho biết một hoạt động hoặc sự kiện bắt đầu khi nào. | ||
| Mô tả Thời gian bắt đầu, còn gọi là dấu thời gian sự kiện, ghi lại chính xác ngày giờ một hoạt động cụ thể diễn ra. Ví dụ: thời điểm tạo đơn hàng bán, xuất hàng hoặc ghi nhận hóa đơn. Dấu thời gian này là cơ sở cho mọi phân tích theo thời gian trong process mining. Dữ liệu được dùng để tính thời gian giữa các hoạt động, đo tổng thời lượng của một trường hợp và xác định chậm trễ hoặc điểm nghẽn. Dấu thời gian chính xác rất quan trọng với các dashboard phân tích hiệu suất, chẳng hạn dashboard theo dõi giao hàng đúng hạn hoặc thời gian hoàn tất đơn hàng. Vì sao điều này quan trọng Đây là thuộc tính quan trọng để tính các chỉ số hiệu suất như thời gian xử lý và thời lượng, qua đó xác định điểm nghẽn. Lấy dữ liệu ở đâu Đây là thuộc tính tổng hợp, thường được tạo bằng cách kết hợp trường ngày (ví dụ: ERDAT) và trường giờ (ví dụ: ERZET) từ nhiều bảng SAP như VBAK (Đơn hàng bán), LIKP (Chứng từ giao hàng) và VBRK (Hóa đơn). Ví dụ 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
| Chặn giao hàng DeliveryBlock | Mã cho biết đơn hàng bán có bị chặn giao hàng hay không. Khi bị chặn, hệ thống không thể tạo chứng từ giao hàng. | ||
| Mô tả Chặn giao hàng là trạng thái được đặt cho đơn hàng bán ở cấp tiêu đề hoặc mục hàng để tạm dừng quy trình trước bước giao hàng. Người dùng có thể đặt chặn thủ công hoặc hệ thống tự động chặn do vượt hạn mức tín dụng, thiếu dữ liệu hoặc lý do khác. Thuộc tính này rất quan trọng với dashboard 'Phân tích chặn đơn hàng bán và làm lại'. Phân tích tần suất, thời gian và lý do chặn giao hàng giúp xác định điểm nghẽn lớn trong quy trình hoàn tất đơn hàng. Giảm số lần bị chặn là yếu tố then chốt để cải thiện tỷ lệ giao hàng đúng hạn và thời gian xử lý tổng thể. Vì sao điều này quan trọng Giúp xác định trực tiếp điểm nghẽn trong quy trình hoàn tất đơn hàng. Phân tích lý do và tần suất đơn hàng bị chặn là việc cần thiết để cải thiện luồng xử lý. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu tiêu đề chứng từ bán hàng (VBAK), tại trường LIFSK. Ví dụ 0102Z1 | |||
| Đơn vị bán hàng SalesOrganization | Đơn vị tổ chức chịu trách nhiệm bán sản phẩm hoặc dịch vụ. | ||
| Mô tả Đơn vị bán hàng là một bộ phận tổ chức quan trọng trong SAP, giúp cơ cấu công ty theo yêu cầu bán hàng. Đơn vị này chịu trách nhiệm đàm phán điều kiện bán hàng và phân phối hàng hóa, dịch vụ. Trong process mining, thuộc tính này là một chiều phân tích quan trọng. Thuộc tính giúp so sánh hiệu suất, hiệu quả và mức độ tuân thủ quy trình giữa các đơn vị bán hàng, khu vực hoặc bộ phận. Qua đó, bạn có thể tìm ra cách làm hiệu quả ở những đơn vị có kết quả tốt và xác định nơi cần cải thiện. Vì sao điều này quan trọng Hỗ trợ so sánh giữa các đơn vị, giúp đối chiếu hiệu quả và mức độ tuân thủ quy trình giữa các đơn vị kinh doanh hoặc khu vực. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu tiêu đề chứng từ bán hàng (VBAK), tại trường VKORG. Ví dụ 100025003100 | |||
| Giá trị thuần NetAmount | Tổng giá trị đơn hàng bán, chưa tính thuế và chiết khấu ở cấp tiêu đề. | ||
| Mô tả Giá trị thuần là giá trị tiền tệ của đơn hàng bán. Đây là chỉ số tài chính quan trọng gắn với từng trường hợp quy trình. Thuộc tính này cần thiết cho process mining dựa trên giá trị. Bạn có thể ưu tiên các sáng kiến cải tiến quy trình bằng cách tập trung vào đơn hàng có giá trị cao. Chuyên viên phân tích có thể đối chiếu vấn đề quy trình, như chậm trễ hoặc làm lại, với tác động tài chính để xây dựng cơ sở thuyết phục cho việc thay đổi. Ví dụ, có thể phân tích xem đơn hàng giá trị cao được xử lý hiệu quả hơn hay kém hơn đơn hàng giá trị thấp. Vì sao điều này quan trọng Hỗ trợ phân tích theo giá trị, giúp ưu tiên cải tiến những đơn hàng có ảnh hưởng tài chính lớn nhất đến công ty. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu tiêu đề chứng từ bán hàng (VBAK), tại trường NETWR. Ví dụ 1500.0012550.75850.50 | |||
| Lý do từ chối RejectionReason | Mã cho biết lý do một mục trong đơn hàng bán bị từ chối hoặc hủy. | ||
| Mô tả Lý do từ chối cho biết vì sao đơn hàng bán hoặc một mục hàng cụ thể không được hoàn tất. Nguyên nhân có thể là khách hàng hủy, sản phẩm không có sẵn hoặc lý do kinh doanh khác. Thuộc tính này cần thiết cho dashboard 'Xu hướng hủy đơn hàng bán'. Phân tích các lý do từ chối phổ biến nhất giúp doanh nghiệp tìm nguyên nhân gốc rễ dẫn đến mất đơn hàng. Từ đó, doanh nghiệp có thể cải thiện quản lý tồn kho, chiến lược giá hoặc cách trao đổi với khách hàng để giảm tỷ lệ hủy đơn. Vì sao điều này quan trọng Cho biết lý do hủy đơn hàng, hỗ trợ tìm nguyên nhân gốc rễ để giảm doanh số bị mất và cải thiện độ chính xác của dự báo. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu mục chứng từ bán hàng (VBAP), tại trường ABGRU. Ví dụ 0215Z5 | |||
| Mã khách hàng CustomerNumber | Mã định danh duy nhất của khách hàng đã đặt đơn hàng bán. | ||
| Mô tả Thuộc tính này đại diện cho 'Bên mua', tức tài khoản khách hàng chính gắn với đơn hàng bán. Thuộc tính liên kết giao dịch với một khách hàng cụ thể trong dữ liệu chủ. Phân tích theo mã khách hàng giúp chia nhóm quy trình để hiểu hành vi và hiệu suất của từng khách hàng. Bạn có thể tìm khách hàng nào có thời gian xử lý lâu nhất, tỷ lệ làm lại cao nhất hoặc thường xuyên thay đổi đơn hàng nhất. Đây là thông tin quan trọng để cải thiện quản lý quan hệ khách hàng và chất lượng dịch vụ. Vì sao điều này quan trọng Hỗ trợ phân tích theo từng khách hàng, giúp xác định vấn đề quy trình ảnh hưởng đến khách hàng cụ thể và đo lường hiệu suất phục vụ từng khách hàng. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu tiêu đề chứng từ bán hàng (VBAK), tại trường KUNNR. Ví dụ 100234100567200112 | |||
| Mã vật tư MaterialNumber | Mã định danh duy nhất của sản phẩm hoặc dịch vụ được bán. | ||
| Mô tả Mã vật tư xác định mặt hàng cụ thể trong một dòng đơn hàng bán. Vì một đơn hàng có thể gồm nhiều vật tư, thuộc tính này thường được phân tích ở cấp mục hàng. Phân tích quy trình theo mã vật tư giúp phát hiện vấn đề riêng của từng sản phẩm. Bạn có thể tìm ra sản phẩm nào thường mất nhiều thời gian hoàn tất đơn hàng hơn, bị chặn giao hàng nhiều hơn hoặc có nhiều sai lệch hóa đơn hơn. Đây là thông tin quan trọng để bộ phận quản lý chuỗi cung ứng và sản phẩm tối ưu quy trình cho từng dòng sản phẩm. Vì sao điều này quan trọng Hỗ trợ phân tích quy trình theo sản phẩm, cho thấy sản phẩm nào gắn với tình trạng kém hiệu quả như chậm trễ, bị chặn hoặc phải làm lại. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu mục chứng từ bán hàng (VBAP), tại trường MATNR. Ví dụ FG-1001-ARAW-205BSERV-INSTALL | |||
| Người dùng User | ID người dùng của nhân viên đã tạo hoặc thay đổi chứng từ lần gần nhất, hoặc thực hiện hoạt động. | ||
| Mô tả Thuộc tính này ghi lại ID người dùng SAP chịu trách nhiệm cho một sự kiện trong quy trình. Ví dụ: thuộc tính cho biết nhân viên bán hàng nào đã tạo đơn hoặc nhân viên kho nào đã ghi nhận xuất hàng. Phân tích quy trình 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à phát hiện khác biệt trong cách người dùng thực hiện cùng một tác vụ. Đây là thông tin cần thiết cho dashboard theo dõi hiệu suất tài nguyên, tuân thủ và các thao tác thủ công. Vì sao điều này quan trọng Cho thấy hiệu suất và khối lượng công việc của tài nguyên, giúp phát hiện sai lệch quy trình theo từng người dùng, đồng thời hỗ trợ phân tích tuân thủ và tự động hóa. Lấy dữ liệu ở đâu Có trong nhiều bảng tiêu đề SAP, tại trường 'Người tạo' (ERNAM) hoặc 'Người thay đổi' (AENAM), chẳng hạn trong VBAK, LIKP, VBRK. Ví dụ CBURKEJSMITHRWILLIAMS | |||
| Có phải làm lại IsRework | Cờ đúng/sai cho biết đơn hàng bán có trải qua thay đổi đáng kể hoặc hoạt động làm lại sau khi được tạo ban đầu hay không. | ||
| Mô tả Thuộc tính được tính toán này xác định các trường hợp quy trình có phát sinh làm lại, chẳng hạn có một hoặc nhiều hoạt động 'Đã thay đổi đơn hàng bán'. Logic xác định thế nào là làm lại, ví dụ thay đổi giá, số lượng hoặc ngày giao hàng, được thiết lập trong quá trình triển khai dự án. Thuộc tính này rất quan trọng với dashboard 'Tần suất làm lại và thay đổi đơn hàng bán' và KPI Tỷ lệ làm lại đơn hàng bán. Thuộc tính giúp lọc và so sánh trực tiếp các đơn hàng đi theo quy trình liền mạch với những đơn cần thay đổi thủ công. Nhờ đó, bạn có thể định lượng ảnh hưởng của việc làm lại đến thời gian xử lý và chi phí. Vì sao điều này quan trọng Định lượng trực tiếp tần suất làm lại, giúp phân tích nguyên nhân và ảnh hưởng đến hiệu quả cũng như thời gian xử lý của toàn quy trình. Lấy dữ liệu ở đâu Đây là thuộc tính được tính toán từ nhật ký sự kiện. Logic kiểm tra xem có hoạt động 'Đã thay đổi đơn hàng bán' hoặc sự kiện thay đổi cụ thể nào trong các bảng CDHDR/CDPOS hay không. Ví dụ truefalse | |||
| Điều kiện giao hàng ShippingConditions | Xác định phương thức giao hàng tổng thể cho khách hàng. | ||
| Mô tả Điều kiện giao hàng xác định cách gửi đơn hàng, chẳng hạn như 'Tiêu chuẩn', 'Chuyển phát nhanh' hoặc 'Khách đến nhận'. Điều kiện này được thống nhất với khách hàng và ảnh hưởng đến việc lập kế hoạch logistics. Thuộc tính này được dùng trong phân tích 'Hiệu quả và chi phí phương thức giao hàng'. Bằng cách phân nhóm quy trình theo điều kiện giao hàng, công ty có thể xem phương thức nào dễ bị chậm trễ hơn hoặc có thời gian xử lý dài hơn. Dữ liệu này giúp tối ưu logistics và quản lý kỳ vọng của khách hàng về thời gian giao hàng. Vì sao điều này quan trọng Hỗ trợ phân tích hiệu suất logistics, giúp xác định phương thức giao hàng nào thường đi kèm với chậm trễ hoặc hiệu quả cao hơn. Lấy dữ liệu ở đâu Có trong bảng Dữ liệu tiêu đề chứng từ bán hàng (VBAK), tại trường VSBED. Ví dụ 011020 | |||
| Giao hàng đúng hạn IsOnTimeDelivery | Cờ đúng/sai cho biết hàng hóa được gửi vào hoặc trước ngày giao hàng đã xác nhận hay không. | ||
| Mô tả Thuộc tính được tính toán này so sánh ngày xuất hàng thực tế với 'ConfirmedDeliveryDate' của đơn hàng bán. Nếu ngày xuất hàng vào hoặc trước ngày đã xác nhận, thuộc tính có giá trị đúng; nếu không, giá trị là sai. Thuộc tính này giúp tạo dashboard 'Hiệu suất giao hàng đúng hạn' và tính KPI Tỷ lệ giao hàng đúng hạn dễ dàng hơn. Bạn có thể tổng hợp và trực quan hóa hiệu suất mà không cần so sánh ngày ngay trong từng phân tích hoặc biểu đồ. Nhờ đó, mức độ tin cậy của việc giao hàng được thể hiện rõ ràng. Vì sao điều này quan trọng Cung cấp thước đo hiệu suất giao hàng rõ ràng, đơn giản, giúp dễ dàng tính KPI Tỷ lệ giao hàng đúng hạn tổng thể. Lấy dữ liệu ở đâu Đây là thuộc tính được tính toán. Logic so sánh dấu thời gian của hoạt động 'Xuất hàng' với giá trị trong thuộc tính 'ConfirmedDeliveryDate'. Ví dụ truefalse | |||
| Ngày giao hàng đã xác nhận ConfirmedDeliveryDate | Ngày giao hàng hóa hoặc dịch vụ đã được xác nhận với khách hàng. | ||
| Mô tả Đây là ngày giao hàng đã cam kết với khách hàng, dựa trên tình trạng sẵn có của vật tư và lịch giao hàng. Ngày này là mốc chuẩn để đo lường hiệu suất giao hàng. Thuộc tính này là cơ sở cho dashboard 'Hiệu suất giao hàng đúng hạn' và KPI Tỷ lệ giao hàng đúng hạn. Bằng cách so sánh Ngày giao hàng đã xác nhận với ngày 'Xuất hàng' thực tế, bạn có thể xác định đơn hàng được giao đúng hạn, sớm hay trễ. Đây là thước đo quan trọng về độ tin cậy của chuỗi cung ứng và mức độ hài lòng của khách hàng. Vì sao điều này quan trọng Đây là mốc chuẩn để đo lường hiệu suất giao hàng đúng hạn, một KPI quan trọng đối với sự hài lòng của khách hàng và hiệu quả chuỗi cung ứng. Lấy dữ liệu ở đâu Có trong bảng Dòng lịch chứng từ bán hàng (VBEP), tại trường EDATU. Ví dụ 2023-05-102023-06-202023-07-01 | |||
| Trạng thái kiểm tra tín dụng CreditCheckStatus | Cho biết trạng thái kiểm tra tín dụng của chứng từ bán hàng. | ||
| Mô tả Thuộc tính này cho biết kết quả kiểm tra tín dụng tự động hoặc thủ công đối với đơn hàng bán. Các trạng thái thường gặp gồm 'Đã duyệt', 'Bị từ chối' hoặc 'Bị chặn'. Đây là thuộc tính quan trọng cho dashboard 'Phân tích thời gian xử lý kiểm tra tín dụng'. Chậm trễ hoặc bị chặn ở bước kiểm tra tín dụng có thể kéo dài đáng kể thời gian hoàn tất đơn hàng. Phân tích trạng thái này giúp đánh giá hiệu quả quản lý tín dụng và ảnh hưởng của quy trình đó đến tốc độ bán hàng. Vì sao điều này quan trọng Ảnh hưởng trực tiếp đến tốc độ xử lý đơn hàng. Phân tích trạng thái này giúp xác định điểm nghẽn trong quản lý tín dụng làm chậm quá trình hoàn tất đơn hàng. Lấy dữ liệu ở đâu Có trong bảng Trạng thái tiêu đề chứng từ bán hàng (VBUK) hoặc trực tiếp trong VBAK, tại trường trạng thái tín dụng (ví dụ: CMGST). Ví dụ ABD | |||
Các hoạt động trong quy trình xử lý đơn hàng bán từ đơn hàng đến thu tiền
| Hoạt động | Mô tả | ||
|---|---|---|---|
| Đã đóng mục đơn hàng | Hoạt động này đánh dấu việc đóng hoàn toàn một mục đơn hàng bán, nghĩa là mục đó đã được giao đủ, lập hóa đơn và hoàn tất. Trạng thái tổng thể của mục được dùng để suy ra sự kiện này. | ||
| Vì sao điều này quan trọng Đây là sự kiện kết thúc thành công của quy trình. Phân tích thời điểm đóng các mục giúp xác định thời lượng toàn quy trình và tìm những đơn hàng vẫn mở không cần thiết. Lấy dữ liệu ở đâu Suy ra từ trường trạng thái tổng thể trong bảng VBUP (Chứng từ bán hàng: Trạng thái mục) của mục hàng. Khi VBUP-GBSTA là 'C' (Đã xử lý hoàn toàn), mục hàng được xem là đã đóng. Thu thập Suy ra khi trạng thái mục hàng (VBUP-GBSTA) chuyển thành 'C' (Đã xử lý hoàn toàn). Loại sự kiện inferred | |||
| Đã nhận thanh toán | Sự kiện này cho biết khách hàng đã thanh toán và khoản tiền đã được ghi nhận cho hóa đơn, tất toán khoản phải thu còn mở. Đây là sự kiện kế toán, được suy ra từ việc tất toán chứng từ tài chính. | ||
| Vì sao điều này quan trọng Đây là bước cuối cùng để thu tiền từ giao dịch bán hàng. Mốc này dùng để tính 'Thời gian từ lập hóa đơn đến thanh toán' và tổng thể 'Thời gian hoàn tất đơn hàng bán'. Lấy dữ liệu ở đâu Suy ra từ thông tin tất toán trong bảng BSEG cho dòng mục khách hàng. Khi BSEG-AUGBL (Chứng từ tất toán) và BSEG-AUGDT (Ngày tất toán) có dữ liệu, nghĩa là đã nhận thanh toán. Thu thập Suy ra từ ngày tất toán (AUGDT) được điền trong bảng BSEG cho dòng mục phải thu khách hàng. Loại sự kiện inferred | |||
| Đã tạo đơn hàng bán | Đánh dấu thời điểm tạo chứng từ đơn hàng bán mới. Đây là sự kiện được ghi nhận rõ ràng khi người dùng lưu đơn hàng mới, thường qua giao dịch VA01 trong SAP. | ||
| Vì sao điều này quan trọng Đây là sự kiện bắt đầu chính của quy trình Order-to-Cash. Phân tích thời điểm này rất quan trọng để đo tổng thời gian xử lý và tốc độ tiếp nhận đơn hàng. Lấy dữ liệu ở đâu Được ghi trong bảng VBAK (dữ liệu đầu mục chứng từ bán hàng) bằng ngày tạo (ERDAT) và giờ tạo (ERZET). Mã giao dịch được lưu trong VBAK-TCODE. Thu thập Sự kiện dựa trên dấu thời gian tạo (ERDAT, ERZET) trong bảng VBAK. Loại sự kiện explicit | |||
| Đã tạo hóa đơn | Đánh dấu thời điểm tạo hóa đơn khách hàng hoặc chứng từ thanh toán. Đây là sự kiện được ghi nhận rõ ràng, tạo chứng từ mới trong hệ thống và bắt đầu phần thanh toán của quy trình. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng để bắt đầu tính 'Thời gian từ lập hóa đơn đến thanh toán'. Lập hóa đơn chậm ảnh hưởng trực tiếp đến dòng tiền. Lấy dữ liệu ở đâu Được ghi trong bảng VBRK (Chứng từ thanh toán: Dữ liệu tiêu đề), dựa trên ngày tạo (ERDAT). Liên kết đến đơn hàng hoặc chứng từ giao hàng nằm trong bảng VBFA. Thu thập Sự kiện được xác định dựa trên dấu thời gian tạo (ERDAT) trong bảng VBRK. Loại sự kiện explicit | |||
| Đã xác nhận đơn hàng | Hoạt động này cho biết đơn hàng bán đã vượt qua mọi bước kiểm tra ban đầu và được xác nhận để hoàn tất. Sự kiện thường được suy ra khi đơn hàng không còn bị chặn và có số lượng được xác nhận trong các dòng lịch giao hàng. | ||
| Vì sao điều này quan trọng Đây là cột mốc quan trọng, đánh dấu chuyển tiếp từ nhập đơn sang hoàn tất đơn hàng. Đây cũng là điểm bắt đầu để đo thời gian hoàn tất và hiệu suất giao hàng đúng hạn. Lấy dữ liệu ở đâu Có thể suy ra sự kiện này khi các dòng lịch giao hàng trong VBEP có số lượng được xác nhận (BMENG > 0) và đơn hàng không bị chặn giao hàng (ví dụ: VBUK-LIFSK để trống). Thu thập Được suy ra từ việc xác nhận dòng lịch giao hàng (VBEP-BMENG > 0) và gỡ bỏ các lệnh chặn ở cấp đầu mục. Loại sự kiện inferred | |||
| Đã xuất hàng | Đây là sự kiện quan trọng, đánh dấu quyền sở hữu hàng hóa được chuyển giao và hàng chính thức rời khỏi kho. Đây là bút toán tài chính được ghi nhận rõ ràng, tạo chứng từ vật tư và cập nhật hàng tồn kho. | ||
| Vì sao điều này quan trọng Đây là sự kiện 'xuất hàng' và là cột mốc quan trọng để đo hiệu suất giao hàng đúng hạn cũng như thời gian hoàn tất đơn hàng. Sự kiện này kích hoạt cập nhật tài chính và đánh dấu thời điểm không thể đảo ngược trong quy trình giao hàng thực tế. Lấy dữ liệu ở đâu Tạo chứng từ vật tư (MKPF/MSEG) với loại chuyển động xuất hàng (ví dụ: 601), được liên kết với chứng từ giao hàng. Thu thập Tạo chứng từ vật tư (MKPF/MSEG) với loại chuyển động xuất hàng, được liên kết với chứng từ giao hàng. Loại sự kiện explicit | |||
| Đã đặt lệnh chặn giao hàng | Thể hiện hành động áp dụng lệnh chặn giao hàng cho đơn hàng bán, ngăn tạo chứng từ giao hàng. Sự kiện này có thể được ghi nhận rõ ràng từ nhật ký thay đổi hoặc suy ra từ các bảng trạng thái. | ||
| Vì sao điều này quan trọng Hoạt động này liên quan trực tiếp đến KPI tỷ lệ đơn hàng bán bị chặn. Xác định lý do và tần suất đặt lệnh chặn giúp tìm ra nguyên nhân làm chậm quá trình hoàn tất đơn hàng. Lấy dữ liệu ở đâu Có thể tìm thấy trong nhật ký thay đổi (CDHDR/CDPOS) cho trường VBAK-LIFSK. Ngoài ra, có thể suy ra sự kiện này khi trường VBAK-LIFSK được điền. Thu thập Sự kiện lấy từ chứng từ thay đổi cho trường VBAK-LIFSK hoặc VBAP-LIFSP. Loại sự kiện explicit | |||
| Đã hoàn tất lấy hàng | Cho biết toàn bộ mặt hàng trong đợt giao đã được lấy khỏi kho. Nếu sử dụng Warehouse Management (WM), có thể suy ra sự kiện này từ trạng thái của lệnh chuyển kho. | ||
| Vì sao điều này quan trọng Phân tích thời gian lấy hàng giúp tối ưu hoạt động kho. Chậm trễ ở bước này ảnh hưởng trực tiếp đến tiến độ vận chuyển và thời gian hoàn tất đơn hàng. Lấy dữ liệu ở đâu Được suy ra khi trạng thái lấy hàng của mặt hàng giao trong bảng LIPS-KOSTA chuyển thành 'C' (đã lấy đủ). Nếu WM đang hoạt động, có thể suy ra từ xác nhận lệnh chuyển kho (các bảng LTAK/LTAP). Thu thập Được suy ra từ thay đổi trạng thái lấy hàng (LIPS-KOSTA) hoặc xác nhận lệnh chuyển kho WM. Loại sự kiện inferred | |||
| Đã hủy đơn hàng | Cho biết đơn hàng bán đã bị hủy trước khi hoàn tất. Thông thường, sự kiện này được ghi nhận khi áp dụng 'lý do từ chối' cho tất cả mục hàng liên quan trong đơn. | ||
| Vì sao điều này quan trọng Đây là điểm kết thúc do quy trình không thành công, hỗ trợ trực tiếp KPI 'Tỷ lệ hủy đơn hàng'. Tìm hiểu thời điểm và lý do hủy đơn giúp phát hiện vấn đề trong quy trình bán hàng. Lấy dữ liệu ở đâu Suy ra khi trường VBAP-ABGRU (Lý do từ chối) được điền cho tất cả mục hàng đang hoạt động trong đơn bán hàng. Có thể tìm ngày thay đổi trong CDHDR/CDPOS. Thu thập Suy ra khi trường 'Lý do từ chối' (VBAP-ABGRU) được điền cho tất cả mục hàng. Loại sự kiện inferred | |||
| Đã hủy hóa đơn | Ghi nhận việc đảo một chứng từ thanh toán đã tạo trước đó. Đây là giao dịch được ghi nhận rõ ràng, tạo chứng từ hủy mới để bù trừ chứng từ ban đầu. | ||
| Vì sao điều này quan trọng Theo dõi hóa đơn bị hủy giúp phát hiện vấn đề về giá, sai lệch giao hàng hoặc lỗi dữ liệu. Thông tin này hỗ trợ KPI 'Tỷ lệ sai lệch hóa đơn'. Lấy dữ liệu ở đâu Sự kiện được ghi nhận rõ ràng khi tạo chứng từ thanh toán hủy (VBRK-VBTYP = 'N' hoặc 'O'). Hóa đơn gốc được tham chiếu trong VBRK-SFAKN. Thu thập Tạo chứng từ hủy trong VBRK và tham chiếu hóa đơn gốc. Loại sự kiện explicit | |||
| Đã tạo chứng từ giao hàng | Sự kiện này đánh dấu thời điểm tạo chứng từ giao hàng đi, tức chỉ thị để kho bắt đầu lấy và vận chuyển hàng. Đây là sự kiện được ghi nhận rõ ràng từ luồng chứng từ. | ||
| Vì sao điều này quan trọng Đây là bước đầu tiên trong quy trình hoàn tất đơn hàng thực tế. Thời gian từ khi xác nhận đơn hàng đến khi tạo chứng từ giao hàng cho biết quy trình logistics được khởi động nhanh đến đâu. Lấy dữ liệu ở đâu Tạo bản ghi trong bảng LIKP (dữ liệu đầu mục chứng từ giao hàng SD). Liên kết với đơn hàng bán được lưu trong bảng luồng chứng từ VBFA. Thu thập Sự kiện dựa trên dấu thời gian tạo trong bảng LIKP, liên kết qua bảng VBFA. Loại sự kiện explicit | |||
| Đã thay đổi đơn hàng bán | Thể hiện thay đổi được thực hiện với đơn hàng bán hiện có sau khi tạo lần đầu. Những thay đổi này được ghi trong các bảng nhật ký thay đổi chuyên dụng (CDHDR, CDPOS) khi các trường như số lượng, giá hoặc ngày tháng được chỉnh sửa. | ||
| Vì sao điều này quan trọng Theo dõi thay đổi giúp xác định việc xử lý lại, quy trình thiếu ổn định và vấn đề về chất lượng dữ liệu. Thay đổi quá thường xuyên có thể cho thấy khâu nhập đơn ban đầu có vấn đề, dẫn đến chậm trễ. Lấy dữ liệu ở đâu Lấy từ các bảng chứng từ thay đổi CDHDR (đầu mục) và CDPOS (mặt hàng) với OBJECTCLAS = 'VERKBELEG'. Có thể xác định dấu thời gian và trường đã thay đổi. Thu thập Sự kiện lấy từ các bảng chứng từ thay đổi (CDHDR, CDPOS) cho đối tượng chứng từ bán hàng. Loại sự kiện explicit | |||
| Đã thực hiện kiểm tra tín dụng | Cho biết việc kiểm tra tín dụng tự động hoặc thủ công đối với khách hàng của đơn hàng bán đã hoàn tất. Sự kiện này thường được suy ra từ thay đổi trong trạng thái tín dụng tổng thể của chứng từ. | ||
| Vì sao điều này quan trọng Kiểm tra tín dụng thường là một điểm nghẽn quan trọng. Đo thời gian xử lý bước này là điều cần thiết để phân tích thời gian xử lý kiểm tra tín dụng và đẩy nhanh quá trình xử lý đơn hàng. Lấy dữ liệu ở đâu Được suy ra từ các trường trạng thái tín dụng trong bảng VBUK (trạng thái đầu mục chứng từ bán hàng). Khi VBUK-CMGST chuyển từ bị chặn sang được giải phóng, hoạt động này được ghi nhận. Thu thập Được suy ra từ thay đổi trong trường trạng thái tín dụng tổng thể (VBUK-CMGST). Loại sự kiện inferred | |||
| Đã xác nhận bằng chứng giao hàng | Hoạt động này ghi nhận khách hàng đã nhận hàng. Sự kiện được ghi lại khi biên bản giao hàng được nhập vào hệ thống, thường đồng thời cập nhật trạng thái chứng từ giao hàng. | ||
| Vì sao điều này quan trọng Sự kiện này cung cấp ngày giao hàng thực tế, cần thiết để tính chính xác KPI 'Tỷ lệ giao hàng đúng hạn' so với ngày đã cam kết. Lấy dữ liệu ở đâu Suy ra từ trạng thái biên bản giao hàng (VBUK-PODAT) được đặt thành 'C' (Đã xác nhận). Ngày xác nhận được lưu trong VLPOD-PODAT. Không phải hệ thống nào cũng triển khai thông tin này. Thu thập Suy ra từ cập nhật trạng thái POD trên chứng từ giao hàng (VBUK-PODAT) hoặc bản ghi trong bảng VLPOD. Loại sự kiện inferred | |||
Hướng dẫn trích xuất dữ liệu
Các bước
- Phát triển chương trình: Dùng giao dịch SE38 hoặc SE80 để tạo chương trình ABAP có thể chạy độc lập. Chương trình này sẽ chứa toàn bộ logic trích xuất.
- Xác định màn hình chọn dữ liệu: Trong chương trình, tạo màn hình để lọc dữ liệu. Thêm tham số cho ngày tạo chứng từ bán hàng (VBAK-ERDAT), tổ chức bán hàng (VBAK-VKORG) và loại chứng từ bán hàng (VBAK-AUART). Nhờ vậy, bạn có thể tái sử dụng và quản lý việc trích xuất dễ dàng hơn.
- Khai báo dữ liệu: Xác định các bảng nội bộ và cấu trúc cần thiết để chứa dữ liệu từ nhiều bảng SAP, chẳng hạn VBAK, VBAP, VBFA, CDHDR, CDPOS, VBRK và BSAD. Đồng thời, xác định cấu trúc đầu ra cuối cùng cho nhật ký sự kiện, khớp với các thuộc tính bắt buộc.
- Chọn các đơn hàng bán cơ sở: Viết câu lệnh SELECT ban đầu để lấy tiêu đề đơn hàng bán (VBAK) và các mặt hàng (VBAP) dựa trên thông tin người dùng nhập ở màn hình chọn dữ liệu. Đây là tập dữ liệu chính gồm các trường hợp cần phân tích.
- Trích xuất sự kiện 'Creation': Duyệt qua các bản ghi VBAK đã chọn. Với mỗi bản ghi, điền hoạt động 'Sales Order Created' vào cấu trúc nhật ký sự kiện, dùng VBAK-ERDAT và VBAK-ERZET làm StartTime.
- Trích xuất sự kiện từ nhật ký thay đổi: Chọn các bản ghi trong CDHDR và CDPOS có OBJECTCLAS là 'VERKBELEG' cho những đơn hàng bán đã chọn. Duyệt kết quả để xác định các trường cụ thể đã thay đổi. Ví dụ, thay đổi ở VBAK-LIFSK cho biết sự kiện 'Delivery Block Set', còn thay đổi ở VBUK-CMGST cho biết 'Credit Check Performed'. Có thể ghi nhận thay đổi liên quan khác dưới tên 'Sales Order Changed'.
- Trích xuất dữ liệu luồng chứng từ: Với các đơn hàng bán đã chọn, truy vấn bảng luồng chứng từ VBFA. Bảng này liên kết đơn hàng bán với các chứng từ tiếp theo như giao hàng, luân chuyển hàng hóa và hóa đơn. Chọn tất cả chứng từ liên quan để xử lý tiếp.
- Trích xuất sự kiện giao hàng và hoàn tất đơn hàng: Dùng số chứng từ giao hàng từ VBFA để truy vấn LIKP và LIPS, ghi nhận sự kiện 'Delivery Created'. Truy vấn MKPF và MSEG với chứng từ xuất hàng (loại luân chuyển '601') để ghi nhận sự kiện 'Goods Issued'. Nếu đang dùng Warehouse Management, truy vấn LTAK và LTAP để tìm thời điểm xác nhận của mục lệnh chuyển cuối cùng, từ đó xác định 'Picking Completed'. Kiểm tra trạng thái tiêu đề giao hàng VBUK-PODAT để ghi nhận 'Proof of Delivery Confirmed'.
- Trích xuất sự kiện lập hóa đơn và thanh toán: Dùng số chứng từ lập hóa đơn từ VBFA để truy vấn VBRK và VBRP, ghi nhận các sự kiện 'Invoice Created' và 'Invoice Cancelled' (khi VBRK-FKSTO = 'X'). Để tìm sự kiện 'Payment Received', liên kết hóa đơn từ VBRK với chứng từ kế toán trong BKPF, rồi tìm chứng từ đối trừ và ngày đối trừ trong BSAD.
- Trích xuất sự kiện dựa trên trạng thái: Dùng các bảng trạng thái VBUP (trạng thái mặt hàng) và VBUK (trạng thái tiêu đề) để suy ra sự kiện nghiệp vụ. Ví dụ, một mặt hàng được xem là 'Order Item Closed' khi VBUP-GBSTA bằng 'C'. Một đơn hàng được xem là 'Order Cancelled' khi tất cả mặt hàng liên quan đều có 'Reason for Rejection' (VBAP-ABGRU).
- Gộp và định dạng dữ liệu: Gộp mọi sự kiện đã ghi nhận vào một bảng nội bộ cuối cùng. Đảm bảo mọi thuộc tính (SalesOrder, Activity, StartTime, User, v.v.) được điền chính xác cho từng bản ghi sự kiện. Thêm SourceSystem và dấu thời gian LastDataUpdate.
- Tạo tệp đầu ra: Dùng mô-đun chức năng GUI_DOWNLOAD hoặc phương thức cl_gui_frontend_services=>gui_download để xuất bảng nội bộ cuối cùng thành tệp CSV trên máy tính của người dùng. Đảm bảo tệp được lưu với mã hóa UTF-8.
Cấu hình
- Điều kiện tiên quyết: Cần có quyền phát triển ABAP (ví dụ: quyền truy cập giao dịch SE38) và quyền đọc tất cả bảng SAP cần thiết, gồm VBAK, VBAP, CDHDR, CDPOS, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG và BSAD.
- Tham số lọc dữ liệu: Chương trình cần có màn hình chọn dữ liệu với các tham số lọc. Các tham số chính gồm:
- Khoảng ngày: Bắt buộc nhập khoảng ngày tạo đơn hàng bán (VBAK-ERDAT). Nên bắt đầu với dữ liệu của 3-6 tháng gần nhất để dễ quản lý khối lượng.
- Tổ chức bán hàng: Lọc theo VBAK-VKORG để tập trung phân tích vào các đơn vị kinh doanh cụ thể.
- Loại chứng từ bán hàng: Lọc theo VBAK-AUART để chỉ lấy các loại đơn hàng cần thiết (ví dụ: đơn hàng tiêu chuẩn) và loại trừ các loại khác (ví dụ: báo giá, hàng trả lại).
- Lưu ý về hiệu năng: Trích xuất dữ liệu từ bảng nhật ký thay đổi (CDHDR, CDPOS) và luồng chứng từ (VBFA) có thể rất chậm khi khối lượng dữ liệu lớn. Tối ưu chương trình bằng cách dùng các trường chỉ mục trong mệnh đề WHERE. Với dữ liệu rất lớn, hãy lên lịch chạy chương trình dưới dạng tác vụ nền vào giờ thấp điểm bằng giao dịch SM36.
- Kích hoạt nhật ký thay đổi: Phương pháp này dựa vào chức năng ghi nhận thay đổi của SAP. Hãy kiểm tra tính năng ghi nhật ký đã được bật cho các trường dữ liệu chính (ví dụ: LIFSK, CMGST, ABGRU) hay chưa. Bạn có thể kiểm tra bằng giao dịch SCDO cho đối tượng VERKBELEG.
Truy vấn mẫu abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
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~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM. Các bước
- Điều kiện tiên quyết: Đảm bảo bạn có quyền truy cập trực tiếp, chỉ đọc vào cơ sở dữ liệu SAP ECC bên dưới. Bạn cần một công cụ kết nối cơ sở dữ liệu như DBeaver, SQL Server Management Studio hoặc Oracle SQL Developer để kết nối và chạy truy vấn.
- Lấy tập lệnh SQL: Sao chép toàn bộ truy vấn SQL trong phần 'query' của tài liệu này.
- Kết nối cơ sở dữ liệu: Mở công cụ kết nối cơ sở dữ liệu và kết nối với phiên bản cơ sở dữ liệu SAP ECC. Bạn cần địa chỉ máy chủ, cổng, tên cơ sở dữ liệu và thông tin đăng nhập phù hợp.
- Cấu hình truy vấn: Dán tập lệnh SQL vào cửa sổ soạn truy vấn mới. Tìm phần cấu hình trong Common Table Expression (CTE) chính có tên SalesOrders. Thay các giá trị giữ chỗ cho ngày bắt đầu ('{StartDate}'), ngày kết thúc ('{EndDate}'), tổ chức bán hàng ('{SalesOrgs}') và loại chứng từ ('{DocTypes}') bằng giá trị thực tế dùng cho phân tích.
- Chạy truy vấn: Chạy tập lệnh SQL đã cấu hình. Tùy vào khoảng ngày và dung lượng cơ sở dữ liệu SAP, truy vấn có thể mất vài phút.
- Kiểm tra kết quả: Khi truy vấn chạy xong, kết quả sẽ hiển thị. Kiểm tra nhanh để đảm bảo có các cột mong đợi (SalesOrder, Activity, StartTime, v.v.) và có hàng dữ liệu cho nhiều hoạt động.
- Xuất dữ liệu: Dùng chức năng xuất của công cụ cơ sở dữ liệu để lưu kết quả thành tệp CSV. Đặt tên dễ nhận biết, chẳng hạn SAP_O2C_Event_Log.csv.
- Định dạng cho ProcessMind: Mở tệp CSV bằng trình chỉnh sửa bảng tính. Kiểm tra tiêu đề cột khớp chính xác với các thuộc tính bắt buộc, chẳng hạn SalesOrder, Activity và StartTime. Đảm bảo StartTime và LastDataUpdate dùng định dạng ngày giờ nhất quán mà ProcessMind hỗ trợ, chẳng hạn YYYY-MM-DD HH:MI:SS.
- Tải lên ProcessMind: Tải tệp CSV đã định dạng hoàn chỉnh lên dự án ProcessMind để phân tích.
Cấu hình
- Khoảng ngày: Truy vấn dùng các giá trị giữ chỗ ('{StartDate}' và '{EndDate}') để lọc đơn hàng bán theo ngày tạo (VBAK.ERDAT). Thời gian phân tích thường dùng là 3 đến 6 tháng, đủ để có mẫu dữ liệu đại diện mà không làm cơ sở dữ liệu quá tải.
- Bộ lọc tổ chức bán hàng: Dùng giá trị giữ chỗ '{SalesOrgs}' để giới hạn dữ liệu trích xuất vào các tổ chức bán hàng cụ thể (ví dụ: '1000', '2000'). Cách này giúp tập trung phân tích và cải thiện hiệu năng truy vấn.
- Bộ lọc loại chứng từ: Dùng giá trị giữ chỗ '{DocTypes}' để chọn loại đơn hàng bán cụ thể (ví dụ: 'OR' cho đơn hàng tiêu chuẩn). Nhờ đó, bạn có thể loại các chứng từ không liên quan như giao hàng miễn phí hoặc hàng trả lại khỏi luồng quy trình chính.
- Mã định danh hệ thống nguồn: Giá trị giữ chỗ cố định '{SourceSystemName}' dùng để gắn tên hệ thống nguồn vào từng bản ghi. Hãy thay bằng tên phù hợp với phiên bản SAP ECC của bạn (ví dụ: SAP_ECC_PRD).
- Tương thích cơ sở dữ liệu: Hàm kết hợp trường ngày và giờ, [Your DB-specific timestamp function], chỉ là giá trị giữ chỗ. Bạn cần thay bằng hàm phù hợp với cơ sở dữ liệu đang dùng (ví dụ: TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS') cho SAP HANA hoặc CAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME) cho SQL Server).
- Điều kiện tiên quyết: Phương pháp này cần thông tin đăng nhập cơ sở dữ liệu có quyền chỉ đọc trực tiếp. Người dùng cơ sở dữ liệu phải được phép truy cập tất cả bảng trong truy vấn, gồm VBAK, VBAP, VBFA, CDHDR, CDPOS, LIKP, VBRK và BSAD.
Truy vấn mẫu sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''; Sẵn sàng bắt đầu?
Dùng mẫu dữ liệu này để hiểu rõ hơn quy trình xử lý đơn hàng bán từ đơn hàng đến thu tiền. Bắt đầu tối ưu hiệu quả và đẩy nhanh dòng tiền ngay hôm nay.
Tối ưu quy trình xử lý đơn hàng bán từ đơn hàng đến thu tiền ngay hôm nay
Gỡ bỏ điểm nghẽn, giảm 30% thời gian chu kỳ và nhanh chóng cải thiện dòng tiền.
Không cần thẻ tín dụng. Thiết lập chỉ trong vài phút.