Mẫu dữ liệu quy trình ghi nhận đến báo cáo: bút toán
Mẫu dữ liệu quy trình ghi nhận đến báo cáo: bút toán
- Các thuộc tính nên có để phân tích chi tiết
- Các hoạt động bút toán chính cần theo dõi
- Hướng dẫn thực tế để trích xuất dữ liệu từ SAP ECC
Thuộc tính quy trình ghi nhận đến báo cáo: bút toán
| Tên | Mô tả | ||
|---|---|---|---|
| Journal Entry ID JournalEntryId | Mã định danh duy nhất của chứng từ kế toán tài chính, kết hợp mã công ty, số chứng từ và năm tài chính. | ||
| Mô tả Journal Entry ID là mã định danh trường hợp chính để theo dõi vòng đời của một bút toán. Đây là khóa ghép, thường được tạo bằng cách nối Mã công ty (BUKRS), Số chứng từ (BELNR) và Năm tài chính (GJAHR), nhằm đảm bảo tính duy nhất trên toàn hệ thống SAP. Trong phân tích quy trình, mã này liên kết mọi hoạt động liên quan, như tạo, lưu tạm, gửi, phê duyệt, từ chối và hạch toán. Bằng cách theo dõi mã định danh này, bạn có thể dựng lại toàn bộ hành trình của từng bút toán, đo thời gian xử lý và phát hiện sai lệch quy trình hoặc điểm nghẽn ở từng bút toán. Vì sao điều này quan trọng Đây là khóa thiết yếu để theo dõi bút toán từ lúc tạo đến khi hạch toán cuối cùng, giúp phân tích quy trình từ đầu đến cuối và so sánh các biến thể. Lấy dữ liệu ở đâu Đây là thuộc tính được suy ra, thường bằng cách nối các trường trong bảng BKPF: Mã công ty (BUKRS), Số chứng từ (BELNR) và Năm tài chính (GJAHR). Ví dụ 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Tên hoạt động ActivityName | Tên hoạt động nghiệp vụ hoặc sự kiện xảy ra tại một thời điểm cụ thể trong quy trình hạch toán bút toán. | ||
| Mô tả Tên hoạt động mô tả một bước cụ thể trong vòng đời bút toán, chẳng hạn như 'Bút toán được tạo', 'Bút toán đã được phê duyệt' hoặc 'Bút toán đã hạch toán'. Thuộc tính này thường được suy ra từ nhiều nguồn trong SAP, bao gồm mã giao dịch (TCODE), nhật ký thay đổi chứng từ (bảng CDHDR và CDPOS) và các trường trạng thái chứng từ. Phân tích 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, tính thời gian chuyển tiếp giữa các bước và phát hiện vòng lặp làm lại (ví dụ: 'Bút toán bị từ chối' rồi đến 'Bút toán đã được sửa'). Dữ liệu này là nền tảng cho các bảng điều khiển về thời gian xử lý, tỷ lệ làm lại và biến thể quy trình. Vì sao điều này quan trọng Thuộc tính này xác định các bước trong sơ đồ quy trình, giúp bạn trực quan hóa, phân tích và tối ưu hóa quy trình làm việc hạch toán bút toán. Lấy dữ liệu ở đâu Suy ra từ nhiều nguồn, bao gồm mã giao dịch trong BKPF (TCODE), trạng thái chứng từ, nhật ký workflow trong các bảng như SWW_WI2OBJ hoặc chứng từ thay đổi trong CDHDR và CDPOS. Ví dụ Bút toán được tạoBút toán đã được phê duyệtBút toán bị từ chốiBút toán đã hạch toán | |||
| Thời điểm sự kiện EventTime | Dấu thời gian cho biết thời điểm một hoạt động hoặc sự kiện cụ thể xảy ra với bút toán. | ||
| Mô tả Thời điểm sự kiện cung cấp ngày giờ chính xác của từng hoạt động trong quy trình hạch toán bút toán. Dữ liệu này rất quan trọng để tính các chỉ số dựa trên thời gian, như thời gian xử lý toàn bộ quy trình, thời lượng xử lý và độ trễ giữa các bước. Nguồn dấu thời gian tùy thuộc vào hoạt động, có thể là ngày giờ tạo chứng từ (CPUDT/CPUTM) hoặc dấu thời gian thay đổi trong nhật ký (CDHDR-UDATE/UTIME). Khi phân tích, Thời điểm sự kiện được dùng để sắp xếp sự kiện theo trình tự thời gian, làm cơ sở dựng sơ đồ quy trình. Đây là dữ liệu thiết yếu để tính mọi KPI liên quan đến thời gian, như Thời gian xử lý trung bình của bút toán, Thời gian phê duyệt trung bình và Thời gian từ phê duyệt đến hạch toán. Vì sao điều này quan trọng Dấu thời gian này là cơ sở cho mọi phân tích liên quan đến thời gian, giúp tính thời gian xử lý, thời lượng và điểm nghẽn. Lấy dữ liệu ở đâu Nguồn dữ liệu tùy theo hoạt động, chủ yếu là dấu thời gian tạo (CPUDT, CPUTM) từ BKPF hoặc dấu thời gian thay đổi chứng từ (UDATE, UTIME) từ CDHDR. Ví dụ 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Hệ thống nguồn SourceSystem | Hệ thống nơi trích xuất dữ liệu quy trình. | ||
| Mô tả Thuộc tính này xác định nguồn gốc dữ liệu, trong trường hợp này là phiên bản SAP ECC cụ thể. Thông thường, đây là giá trị cố định được thêm trong quá trình trích xuất dữ liệu. Dù đơn giản, thuộc tính này rất quan trọng trong môi trường có nhiều ERP hoặc nguồn dữ liệu. Thuộc tính giúp làm rõ nguồn gốc dữ liệu và cho phép lọc hoặc phân đoạn phân tích theo hệ thống nguồn. Vì sao điều này quan trọng Giúp làm rõ nguồn gốc dữ liệu và rất cần thiết để theo dõi chất lượng dữ liệu, nhất là trong môi trường có nhiều hệ thống nguồn. Lấy dữ liệu ở đâu Thông thường, đây là giá trị cố định được thêm trong quá trình chuyển đổi dữ liệu để xác định phiên bản SAP ECC cụ thể (ví dụ: 'ECC_PROD_100'). Ví dụ SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| 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 trích xuất hoặ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ờ gần nhất dữ liệu được lấy từ SAP ECC. Đây là trường siêu dữ liệu quan trọng, giúp bạn biết dữ liệu đang phân tích mới đến mức nào. Trong mọi bảng điều khiển hoặc phân tích process mining, việc biết thời điểm cập nhật gần nhất rất quan trọng để người dùng tin tưởng dữ liệu và đưa ra quyết định phù hợp. Thuộc tính này giúp trả lời câu hỏi: 'Thông tin này được cập nhật đến thời điểm nào?'. Vì sao điều này quan trọng Cho người dùng biết dữ liệu mới đến mức nào, giúp họ hiểu khoảng thời gian được phân tích và tin tưởng kết quả. Lấy dữ liệu ở đâu Đây là trường siêu dữ liệu do công cụ trích xuất dữ liệu hoặc quy trình ETL tạo và lưu tại thời điểm làm mới dữ liệu. Ví dụ 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Đã đảo bút toán IsReversed | Giá trị đúng/sai cho biết bút toán đã bị đảo hay chưa. | ||
| Mô tả Cờ này cho biết bút toán đã được đảo bằng một chứng từ kế toán khác. Trong SAP, chứng từ bị đảo được liên kết với chứng từ đảo, tạo thành dấu vết kiểm toán rõ ràng. Thuộc tính này rất quan trọng đối với bảng điều khiển 'Phân tích bút toán đảo' và KPI 'Tỷ lệ bút toán đảo'. Bạn có thể lọc riêng các bút toán bị đảo để tìm nguyên nhân gốc rễ, chẳng hạn như lỗi nhập liệu hoặc hạch toán sai, từ đó giảm số lần phải đảo bút toán. Vì sao điều này quan trọng Đánh dấu các bút toán đã bị hủy sau đó để hỗ trợ phân tích việc đảo bút toán, tìm nguyên nhân gốc rễ của lỗi và cải thiện tính toàn vẹn dữ liệu. Lấy dữ liệu ở đâu Lấy từ trường số chứng từ đảo (STBLG) trong bảng BKPF. Nếu STBLG không trống, cờ này có giá trị true. Ví dụ truefalse | |||
| Loại chứng từ DocumentType | Phân loại chứng từ kế toán, quy định cách xử lý và lưu trữ chứng từ. | ||
| Mô tả Loại chứng từ phân biệt các loại giao dịch kinh doanh, chẳng hạn như bút toán sổ cái tổng hợp (SA), hóa đơn nhà cung cấp (KR) hoặc hạch toán tài sản (AA). Loại chứng từ được xác định khi cấu hình hệ thống và gán cho từng bút toán. Đây là thuộc tính quan trọng để phân tích vì cho phép phân đoạn quy trình theo tính chất giao dịch. Bảng điều khiển 'Số lượng bút toán theo loại' và KPI 'Thời gian xử lý trung bình theo loại bút toán' phụ thuộc trực tiếp vào trường này. Thuộc tính giúp phát hiện liệu một số loại bút toán có dễ bị chậm trễ, phải làm lại hoặc bị đảo hơn hay không. Vì sao điều này quan trọng Cho phép phân đoạn phân tích theo loại giao dịch, giúp xác định vấn đề quy trình có chỉ xảy ra với một số loại bút toán nhất định hay không. Lấy dữ liệu ở đâu Nằm trong bảng tiêu đề chứng từ BKPF, trường BLART. Ví dụ SAKRREAA | |||
| Mã công ty CompanyCode | Đơn vị tổ chức đại diện cho một pháp nhân độc lập, nơi lập báo cáo tài chính. | ||
| Mô tả Mã công ty là đơn vị tổ chức cơ bản trong SAP Financials. Mã này đại diện cho một công ty độc lập về mặt pháp lý và là trường quan trọng trong tiêu đề chứng từ bút toán. Thuộc tính này cần thiết để phân đoạn phân tích quy trình theo pháp nhân. Bạn có thể so sánh hiệu suất quy trình, tỷ lệ tuân thủ và kết quả KPI giữa các bộ phận khác nhau của doanh nghiệp. Ví dụ, thuộc tính này giúp xác định liệu tình trạng chậm phê duyệt hoặc tỷ lệ đảo bút toán cao chỉ xảy ra ở một số mã công ty nhất định hay không. Vì sao điều này quan trọng Cho phép lọc và so sánh hiệu suất quy trình giữa các pháp nhân hoặc đơn vị kinh doanh trong tổ chức. Lấy dữ liệu ở đâu Nằm trong bảng tiêu đề chứng từ BKPF, trường BUKRS. Ví dụ 10002000US01DE01 | |||
| Mã giao dịch TransactionCode | Mã giao dịch SAP dùng để tạo hoặc xử lý bút toán. | ||
| Mô tả Mã giao dịch (T-Code) là mã định danh duy nhất cho một chức năng hoặc chương trình cụ thể trong SAP. Với bút toán, mã này cho biết cách tạo bút toán, chẳng hạn như nhập thủ công (FB01, F-02), lưu tạm (FV50) hoặc qua giao diện tự động. Thuộc tính này rất hữu ích cho bảng điều khiển 'Tối ưu hóa hoạt động thủ công'. Phân tích T-Code giúp phân biệt hoạt động thủ công với tự động, xác định quy trình thủ công nào tốn nhiều thời gian nhất và tìm cơ hội tự động hóa để giảm công sức thủ công, nâng cao hiệu quả. Vì sao điều này quan trọng Giúp phân biệt quy trình thủ công và tự động, từ đó xác định cơ hội tự động hóa và chuẩn hóa quy trình. Lấy dữ liệu ở đâu Nằm trong bảng tiêu đề chứng từ BKPF, trường TCODE. Ví dụ FB01F-02FV50FBD1 | |||
| Ngày hạch toán PostingDate | Ngày giao dịch được ghi nhận vào sổ cái tổng hợp và ảnh hưởng đến kỳ tài chính. | ||
| Mô tả Ngày hạch toán xác định kỳ tài chính ghi nhận bút toán. Đây là trường ngày quan trọng về mặt tài chính và tuân thủ, vì ngày này phải phù hợp với lịch khóa sổ kế toán và các quy định. Trong process mining, ngày này được dùng để theo dõi việc tuân thủ. Bảng điều khiển 'Theo dõi tuân thủ quy định' và KPI 'Tỷ lệ tuân thủ quy định' sử dụng thuộc tính này để kiểm tra bút toán có được hạch toán đúng kỳ hay không. Thuộc tính này cũng có thể dùng để phân tích xu hướng số lượng bút toán theo thời gian. Vì sao điều này quan trọng Rất quan trọng đối với báo cáo tài chính và phân tích tuân thủ, giúp đảm bảo bút toán được hạch toán đúng kỳ kế toán. Lấy dữ liệu ở đâu Nằm trong bảng tiêu đề chứng từ BKPF, trường BUDAT. Ví dụ 2023-10-312023-11-302024-01-15 | |||
| Người dùng User | Mã người dùng SAP của người tạo hoặc thay đổi bút toán. | ||
| Mô tả Thuộc tính này ghi nhận tên người dùng SAP chịu trách nhiệm cho một hoạt động cụ thể, chẳng hạn như tạo, lưu tạm hoặc hạch toán chứng từ. Dữ liệu được lấy trực tiếp từ tiêu đề chứng từ hoặc các bảng nhật ký thay đổi. Phân tích thuộc tính Người dùng giúp bạn hiểu hiệu suất của nhóm và từng cá nhân. Thuộc tính này hỗ trợ bảng điều khiển Năng suất người dùng bằng cách theo dõi số lượng hoạt động và thời gian xử lý của từng người dùng. Thuộc tính cũng giúp xác định ai tham gia vào các vòng lặp làm lại, các lần đảo bút toán hoặc sai lệch tuân thủ, từ đó có thể đào tạo hoặc cải tiến quy trình phù hợp. Vì sao điều này quan trọng Xác định người dùng chịu trách nhiệm cho từng hoạt động, giúp phân tích hiệu suất, phân bổ khối lượng công việc và các trường hợp phải làm lại. Lấy dữ liệu ở đâu Thường lấy từ bảng BKPF (trường USNAM của người tạo) hoặc bảng CDHDR (trường USERNAME của người thay đổi). Ví dụ ABROWNCJONESDSMITH | |||
| Có làm lại IsRework | Cờ boolean cho biết bút toán đã trải qua một vòng làm lại hay chưa, chẳng hạn như bị từ chối rồi được chỉnh sửa. | ||
| Mô tả Cờ này đánh dấu các trường hợp đi chệch quy trình thông thường và cần được xử lý lại. Cờ thường có giá trị true nếu chuỗi hoạt động của một bút toán có các bước như 'Đã từ chối bút toán' rồi đến 'Đã chỉnh sửa bút toán'. Thuộc tính này rất cần thiết để tính KPI 'Tỷ lệ bút toán phải làm lại' và phân tích bảng điều khiển 'Tỷ lệ làm lại và từ chối'. Thuộc tính giúp định lượng mức độ kém hiệu quả của quy trình, đồng thời tạo cơ sở để tìm nguyên nhân gốc rễ, chẳng hạn như yêu cầu chưa rõ ràng hoặc tài liệu chưa đầy đủ. Vì sao điều này quan trọng Đánh dấu các bút toán cần chỉnh sửa, giúp định lượng công việc làm lại và phân tích nguyên nhân để tăng tỷ lệ xử lý đúng ngay lần đầu. Lấy dữ liệu ở đâu Đây là thuộc tính được tính toán bằng cách phân tích chuỗi hoạt động của một trường hợp. Vòng làm lại được xác định khi có hoạt động từ chối hoặc chỉnh sửa. Ví dụ truefalse | |||
| Đã tạm lưu IsParked | Cờ boolean cho biết bút toán đã được lưu dưới dạng chứng từ tạm lưu trước khi hạch toán hay chưa. | ||
| Mô tả Tạm lưu chứng từ cho phép người dùng lưu bút toán chưa hoàn chỉnh mà không làm thay đổi số dư tài chính. Sau đó, người dùng có thể hoàn tất hoặc nhờ người khác xem xét trước khi hạch toán. Cờ này đánh dấu các bút toán đã qua bước tạm lưu. Phân tích thuộc tính này giúp bạn hiểu cách tính năng tạm lưu được sử dụng. Kết quả có thể cho thấy tính năng này đang được dùng như một bước duyệt không chính thức và có thể gây chậm trễ. Thuộc tính này cũng hỗ trợ phân tích thời gian xử lý từ đầu đến cuối, phân biệt bút toán được hạch toán ngay với bút toán phải tạm lưu trước. Vì sao điều này quan trọng Đánh dấu các bút toán sử dụng tính năng tạm lưu. Đây có thể là nguyên nhân gây chậm trễ hoặc dấu hiệu cho thấy đang có bước duyệt không chính thức. Lấy dữ liệu ở đâu Lấy từ trường trạng thái chứng từ (BSTAT) trong bảng BKPF. Giá trị 'V' cho biết chứng từ đã được tạm lưu. Ví dụ truefalse | |||
| Lý do đảo bút toán ReversalReason | Mã cho biết lý do bút toán bị đảo. | ||
| Mô tả Khi đảo chứng từ, SAP cho phép người dùng chỉ định mã lý do. Mã này ghi lại thông tin có cấu trúc về lý do cần đảo, chẳng hạn như ngày hạch toán không đúng hoặc lỗi nhập liệu. Thuộc tính này là dữ liệu đầu vào quan trọng cho bảng điều khiển 'Phân tích bút toán đảo'. Phân tích những lý do đảo phổ biến nhất giúp tổ chức phát hiện vấn đề mang tính hệ thống trong quy trình hoặc thiếu sót trong đào tạo. Từ đó, bạn có thể đưa ra biện pháp phù hợp để ngăn lỗi tái diễn và giảm tỷ lệ đảo bút toán. Vì sao điều này quan trọng Cho biết trực tiếp lý do bút toán bị đảo, giúp phân tích nguyên nhân gốc rễ và nhắm đúng vấn đề để giảm lỗi trong tương lai. Lấy dữ liệu ở đâu Nằm trong bảng đầu chứng từ BKPF, trường STGRD. Ví dụ 010205 | |||
| Mã tiền tệ CurrencyKey | Mã tiền tệ của các khoản tiền được ghi nhận trong bút toán. | ||
| Mô tả Thuộc tính này cho biết đơn vị tiền tệ của bút toán, chẳng hạn như USD, EUR hoặc JPY. Nhờ đó, bạn biết đơn vị tiền tệ áp dụng cho các khoản tiền liên quan đến chứng từ. Đây không phải lúc nào cũng là chiều phân tích chính, nhưng rất cần thiết để diễn giải chính xác các giá trị tiền tệ. Các tổ chức hoạt động trên nhiều quốc gia cũng có thể dùng thuộc tính này để phân nhóm và xem quy trình xử lý bút toán ngoại tệ có khác với nội tệ hay không. Vì sao điều này quan trọng Cung cấp thông tin cần thiết về đơn vị tiền tệ cho mọi giá trị, giúp phân tích và diễn giải số liệu tài chính chính xác. Lấy dữ liệu ở đâu Nằm trong bảng đầu chứng từ BKPF, trường WAERS. Ví dụ USDEURGBPJPY | |||
| Thời gian phê duyệt ApprovalTime | Thời gian từ lúc gửi bút toán để phê duyệt đến khi bút toán được phê duyệt hoặc từ chối. | ||
| Mô tả Chỉ số này đo thời gian xử lý của quy trình con phê duyệt, vốn thường chiếm phần đáng kể trong tổng thời gian xử lý. Chỉ số được tính bằng khoảng thời gian từ hoạt động 'Đã gửi bút toán' đến hoạt động tương ứng là 'Đã phê duyệt bút toán' hoặc 'Đã từ chối bút toán'. Thời gian phê duyệt là chỉ số chính của bảng điều khiển 'Hiệu quả phê duyệt bút toán' và KPI 'Thời gian phê duyệt bút toán trung bình'. Phân tích khoảng thời gian này giúp bạn tìm điểm nghẽn trong quy trình phê duyệt, đo hiệu quả của người phê duyệt và đánh giá cơ sở cho những thay đổi như điều chỉnh ngưỡng phê duyệt. Vì sao điều này quan trọng Đo thời gian của giai đoạn phê duyệt, giúp xác định và xử lý các chậm trễ trong quy trình xem xét và phê duyệt. Lấy dữ liệu ở đâu Tính bằng cách lấy dấu thời gian của sự kiện 'Đã phê duyệt bút toán' hoặc 'Đã từ chối bút toán' trừ dấu thời gian của sự kiện 'Đã gửi bút toán'. Ví dụ P1DT2HPT4H15MP3D | |||
| Tổng giá trị chứng từ TotalDocumentAmount | Tổng giá trị bút toán theo đơn vị tiền tệ của chứng từ. | ||
| Mô tả Thuộc tính này thể hiện tổng giá trị tài chính của bút toán. Thông thường, giá trị được tính bằng cách cộng giá trị tuyệt đối của tất cả dòng mục ghi nợ hoặc ghi có thuộc chứng từ. Phân tích quy trình theo giá trị tài chính có thể cho thấy những xu hướng quan trọng. Ví dụ, bút toán giá trị cao có thể đi theo quy trình phê duyệt khác, chặt chẽ hơn. Bạn có thể dùng thuộc tính này để lọc hoặc phân đoạn phân tích, xem thời gian xử lý, tỷ lệ từ chối hoặc độ trễ phê duyệt có liên quan đến giá trị bút toán hay không. Vì sao điều này quan trọng Cho phép phân tích tác động tài chính, chẳng hạn như xem thời gian xử lý hoặc tỷ lệ từ chối có liên quan đến giá trị tiền tệ của bút toán hay không. Lấy dữ liệu ở đâu Đây là trường được tính toán bằng cách cộng giá trị của trường số tiền (WRBTR hoặc DMBTR) từ tất cả dòng mục trong bảng BSEG của một bút toán. Ví dụ 1500.0025000.75125.50 | |||
| Trung tâm chi phí CostCenter | Đơn vị trong một khu vực kiểm soát, đại diện cho nơi phát sinh chi phí. | ||
| Mô tả Trung tâm chi phí là dữ liệu chủ quan trọng trong phân hệ Controlling (CO), thường được gán ở cấp dòng bút toán. Thuộc tính này dùng để theo dõi chi phí của một phòng ban, chức năng hoặc địa điểm cụ thể. Thêm trung tâm chi phí giúp phân tích quy trình bút toán chi tiết hơn. Bạn có thể xác định phòng ban nào phát sinh nhiều công việc làm lại, có thời gian xử lý dài hơn hoặc tạo ra nhiều bút toán thủ công hơn. Nhờ vậy, bạn có thể xem hiệu quả quy trình theo từng phòng ban. Vì sao điều này quan trọng Cho phép phân tích hiệu quả quy trình theo phòng ban hoặc chức năng, giúp xác định những điểm kém hiệu quả ở từng bộ phận. Lấy dữ liệu ở đâu Nằm trong bảng dòng chứng từ BSEG, trường KOSTL. Ví dụ 4100CC_FINANCE_US10010101 | |||
Hoạt động trong quy trình ghi nhận đến báo cáo: bút toán
| Hoạt động | Mô tả | ||
|---|---|---|---|
| Bút toán đã được phê duyệt | Hoạt động này đánh dấu lần phê duyệt cuối cùng của bút toán trong workflow, sau đó bút toán đủ điều kiện để hạch toán. Sự kiện được ghi nhận từ nhật ký workflow khi hoàn tất bước 'release' hoặc 'approve' cuối cùng. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng kết thúc quy trình phê duyệt. Thời gian đến mốc này là KPI then chốt để đánh giá hiệu quả phê duyệt. Thời gian từ sự kiện này đến khi hạch toán cho biết độ trễ sau phê duyệt. Lấy dữ liệu ở đâu Suy ra từ dấu thời gian hoàn tất bước phê duyệt cuối cùng trong nhật ký SAP Business Workflow. Đây là thao tác phê duyệt cuối trước khi chứng từ được hạch toán hoặc sẵn sàng để hạch toán. Thu thập Xác định thời điểm hoàn tất bước 'release' hoặc 'approve' cuối cùng trong nhật ký workflow. Loại sự kiện inferred | |||
| Bút toán đã hạch toán | Đây là hoạt động chính thức ghi nhận bút toán vào sổ cái tổng hợp, làm thay đổi báo cáo tài chính. SAP ghi nhận rõ sự kiện này khi trạng thái chứng từ chuyển thành 'posted' và có ngày hạch toán. | ||
| Vì sao điều này quan trọng Đây là mốc quan trọng nhất, cho biết bút toán đã được xử lý thành công. Thời gian xử lý toàn bộ quy trình thường được tính đến mốc này. Đây cũng là sự kiện then chốt khi phân tích quy trình khóa sổ tài chính. Lấy dữ liệu ở đâu Sự kiện được xác định khi chứng từ trong bảng BKPF có ngày hạch toán (BKPF-BUDAT). Với chứng từ lưu tạm, sự kiện tương ứng với thời điểm trạng thái BKPF-BSTAT đổi từ 'V' thành để trống. Dấu thời gian hạch toán là ngày nhập BKPF-CPUDT. Thu thập Xác định thời điểm BKPF-BSTAT đổi từ 'V' thành để trống, hoặc sự kiện tạo chứng từ đối với bút toán hạch toán trực tiếp. Loại sự kiện explicit | |||
| Bút toán được gửi | Hoạt động này cho biết người tạo đã hoàn tất bút toán lưu tạm và bút toán đã sẵn sàng để rà soát, phê duyệt. Thông thường, hoạt động được ghi nhận khi bắt đầu một tác vụ SAP Business Workflow gắn với chứng từ lưu tạm. | ||
| Vì sao điều này quan trọng Đây là thời điểm bàn giao từ người tạo sang người phê duyệt, đồng thời bắt đầu tính thời gian cho các KPI về chu kỳ phê duyệt. Đây là mốc quan trọng để đo lường hiệu quả của quy trình phê duyệt. Lấy dữ liệu ở đâu Suy ra từ thời điểm bắt đầu phiên bản quy trình phê duyệt được liên kết với đối tượng chứng từ tài chính. Cần phân tích các bảng nhật ký workflow như SWW_WI2OBJ để tìm quy trình được khởi chạy cho mã công ty, số chứng từ và năm tài chính cụ thể. Thu thập Xác định sự kiện bắt đầu workflow cho đối tượng chứng từ lưu tạm. Loại sự kiện inferred | |||
| Bút toán được lưu tạm | Hoạt động này đánh dấu thời điểm tạo bút toán ở trạng thái tạm, trước khi chính thức hạch toán vào sổ cái tổng hợp. SAP ghi nhận rõ hoạt động này khi người dùng lưu chứng từ bằng giao dịch lưu tạm, khiến trạng thái chứng từ chuyển thành 'parked'. | ||
| Vì sao điều này quan trọng Đây là sự kiện bắt đầu quan trọng đối với các quy trình có bước rà soát và phê duyệt. Phân tích khoảng thời gian từ lúc lưu tạm đến khi hạch toán giúp phát hiện chậm trễ trong các giai đoạn trước khi hạch toán và phê duyệt. Lấy dữ liệu ở đâu Sự kiện này được xác định từ bảng tiêu đề chứng từ BKPF. Chứng từ được xem là lưu tạm khi được tạo với trạng thái BKPF-BSTAT = 'V'. Thời điểm sự kiện là ngày và giờ tạo, BKPF-CPUDT và BKPF-CPUTM. Thu thập Xác định chứng từ được tạo trong BKPF khi BKPF-BSTAT là 'V'. Loại sự kiện explicit | |||
| Đã xử lý đảo bút toán | Hoạt động này đánh dấu việc đảo một bút toán đã hạch toán trước đó. Bút toán đảo là chứng từ kế toán mới dùng để triệt tiêu bút toán ban đầu. | ||
| Vì sao điều này quan trọng Đây là sự kiện quan trọng để đo lường chất lượng dữ liệu và độ chính xác của quy trình. Tỷ lệ đảo bút toán cao cho thấy có vấn đề mang tính hệ thống ở khâu nhập dữ liệu hoặc phê duyệt ban đầu. Mỗi lần đảo bút toán đều phát sinh công việc làm lại. Lấy dữ liệu ở đâu Sự kiện này được xác định trong tiêu đề chứng từ gốc (bảng BKPF). Khi đảo chứng từ, SAP điền số chứng từ đảo (BKPF-STBLG) và lý do đảo (BKPF-STGRD). Dấu thời gian của sự kiện là ngày hạch toán của chứng từ đảo mới. Thu thập Xác định thời điểm BKPF-STBLG có giá trị trên chứng từ gốc. Dấu thời gian là ngày hạch toán của chứng từ đảo. Loại sự kiện explicit | |||
| Bút toán bị từ chối | Hoạt động này đánh dấu việc bút toán bị từ chối hoàn toàn và sẽ không được hạch toán. Đây thường là trạng thái kết thúc trong workflow phê duyệt, sau đó chứng từ lưu tạm sẽ bị xóa. | ||
| Vì sao điều này quan trọng Theo dõi các trường hợp từ chối rất quan trọng đối với việc quản lý chất lượng. Phân tích lý do và tần suất bị từ chối giúp cải thiện tỷ lệ bút toán đúng ngay từ lần đầu. Lấy dữ liệu ở đâu Đây là kết quả được ghi nhận trong nhật ký SAP Business Workflow, thể hiện quyết định 'reject' cuối cùng của người dùng và kết thúc quy trình. Chứng từ lưu tạm có thể bị xóa sau đó. Thu thập Xác định trạng thái 'reject' kết thúc trong nhật ký workflow của chứng từ. Loại sự kiện inferred | |||
| Bút toán đã được sửa | Hoạt động này cho biết người tạo ban đầu đã chỉnh sửa bút toán lưu tạm sau khi nhận yêu cầu sửa. Có thể suy ra hoạt động bằng cách phát hiện thay đổi trên chứng từ sau sự kiện 'Changes Requested'. | ||
| Vì sao điều này quan trọng Theo dõi các lần sửa giúp định lượng công sức dành cho việc làm lại. Khoảng thời gian từ lúc yêu cầu sửa đến khi hoàn tất chỉnh sửa cho thấy mức độ chậm trễ trong việc xử lý vấn đề của bút toán đã gửi. Lấy dữ liệu ở đâu Suy ra bằng cách phân tích nhật ký thay đổi chứng từ (bảng CDHDR và CDPOS) của chứng từ lưu tạm. Thay đổi được ghi nhận sau sự kiện từ chối trong workflow cho biết bút toán đã được sửa. Dấu thời gian lấy từ bảng CDHDR. Thu thập Xác định mục nhật ký thay đổi trong CDHDR/CDPOS sau sự kiện từ chối. Loại sự kiện inferred | |||
| Bút toán được tạo | Hoạt động này thể hiện việc tạo bút toán và hạch toán trực tiếp, không qua bước lưu tạm. SAP ghi nhận hoạt động này khi chứng từ được tạo bằng giao dịch hạch toán trực tiếp. | ||
| Vì sao điều này quan trọng Hoạt động này là điểm bắt đầu thay thế cho các quy trình hạch toán bút toán đơn giản, không cần quy trình phê duyệt. Nhờ đó, bạn có thể phân biệt giữa bút toán trực tiếp đơn giản và bút toán lưu tạm có quy trình phức tạp hơn. Lấy dữ liệu ở đâu Sự kiện này tương ứng với việc tạo chứng từ trong bảng BKPF khi trạng thái BKPF-BSTAT để trống (đã hạch toán). Thời điểm sự kiện là ngày tạo chứng từ, BKPF-CPUDT. Với các chứng từ này, sự kiện 'Created' và 'Posted' xảy ra đồng thời. Thu thập Xác định chứng từ được tạo trong BKPF khi BKPF-BSTAT để trống. Loại sự kiện explicit | |||
| Đã đính kèm tài liệu | Hoạt động này thể hiện việc người dùng đính kèm tài liệu hỗ trợ, chẳng hạn như hóa đơn hoặc bảng tính, vào bút toán. Sự kiện này không được ghi lại rõ ràng như một sự kiện kế toán tiêu chuẩn. Thông thường, sự kiện được suy ra bằng cách kiểm tra các tệp đính kèm được tạo và liên kết với đối tượng chứng từ kế toán. | ||
| Vì sao điều này quan trọng Theo dõi hoạt động này giúp xác minh việc tuân thủ các chính sách yêu cầu có tài liệu hỗ trợ. Việc đính kèm tài liệu chậm trễ có thể là nguyên nhân khiến chu kỳ phê duyệt kéo dài. Lấy dữ liệu ở đâu Khó ghi nhận sự kiện này một cách đáng tin cậy kèm dấu thời gian. Có thể suy ra sự kiện bằng cách phân tích các bảng tệp đính kèm của Generic Object Services (GOS), chẳng hạn như SOOD, rồi liên kết dấu thời gian tạo tệp với khóa đối tượng bút toán. Thu thập Suy ra từ dấu thời gian tạo các đối tượng được liên kết trong bảng GOS (ví dụ: SOOD). Loại sự kiện inferred | |||
| Đã tất toán dòng mục bút toán | Hoạt động này thể hiện việc đối chiếu một dòng mục của tài khoản G/L được quản lý theo khoản mục chưa tất toán, chẳng hạn như tài khoản thanh toán ngân hàng. Hoạt động xảy ra khi một dòng mục được khớp với dòng khác và tất toán. | ||
| Vì sao điều này quan trọng Với các quy trình như đối chiếu ngân hàng, thời gian tất toán khoản mục là KPI quan trọng. Hoạt động này giúp phân tích hiệu quả đối chiếu và quy trình khóa sổ cuối tháng. Lấy dữ liệu ở đâu Sự kiện này được ghi nhận từ bảng dòng mục BSEG. Khi một dòng mục được tất toán, các trường ngày tất toán (BSEG-AUGDT) và chứng từ tất toán (BSEG-AUGBL) sẽ có giá trị. Dấu thời gian của sự kiện là ngày tất toán. Thu thập Xác định thời điểm trường ngày tất toán (BSEG-AUGDT) có giá trị cho một dòng mục. Loại sự kiện explicit | |||
| Đã xác định bút toán nhập thủ công | Hoạt động này xác định bút toán được tạo bằng giao dịch trực tuyến thủ công hay qua giao diện tự động hoặc quy trình xử lý theo lô. Đây không phải thao tác của người dùng mà là thuộc tính được tính toán từ dữ liệu hệ thống. | ||
| Vì sao điều này quan trọng Phân biệt bút toán thủ công và tự động là điều cần thiết để cải tiến quy trình có trọng tâm. Các quy trình thủ công thường là đối tượng cần chuẩn hóa và tự động hóa. Lấy dữ liệu ở đâu Thuộc tính này được tính bằng cách phân tích các trường trong bảng tiêu đề chứng từ BKPF. Mã giao dịch (BKPF-TCODE) như 'FB01', 'FB50' hoặc 'FV50' cho biết bút toán được nhập thủ công. Các mã T-code khác hoặc tên nhập liệu theo lô cụ thể (BKPF-AWKEY) thường cho thấy quy trình tự động. Thu thập Suy ra từ BKPF-TCODE hoặc các chỉ báo khác của hệ thống nguồn trong tiêu đề chứng từ. Loại sự kiện calculated | |||
| Đã xác định hạch toán liên công ty | Hoạt động được tính toán để đánh dấu bút toán ảnh hưởng đến nhiều mã công ty. Có thể xác định bằng cách phân tích các dòng mục của một chứng từ tài chính. | ||
| Vì sao điều này quan trọng Giao dịch liên công ty có thể cần quy trình xử lý và phê duyệt phức tạp hơn. Việc xác định các giao dịch này cho phép phân tích riêng thời gian xử lý và đường đi của quy trình, từ đó tìm ra những điểm nghẽn đặc thù. Lấy dữ liệu ở đâu Được tính bằng cách kiểm tra bảng dòng mục BSEG cho một số chứng từ (BELNR). Nếu các dòng mục có nhiều mã công ty khác nhau (BSEG-BUKRS), đây là bút toán hạch toán liên công ty. Thu thập Kiểm tra xem một BKPF-BELNR có nhiều giá trị BSEG-BUKRS khác nhau hay không. Loại sự kiện calculated | |||
| Đã xóa bút toán lưu tạm | Hoạt động này thể hiện việc xóa bút toán lưu tạm chưa từng được hạch toán. Việc này có thể xảy ra sau khi bút toán bị từ chối hoặc do bút toán được tạo nhầm. | ||
| Vì sao điều này quan trọng Hoạt động này đánh dấu quy trình kết thúc không thành công. Phân tích lý do xóa chứng từ lưu tạm có thể giúp phát hiện vấn đề như bút toán trùng lặp hoặc hiểu sai quy trình. Lấy dữ liệu ở đâu Sự kiện này được ghi nhận khi trạng thái của chứng từ lưu tạm trong bảng BKPF thay đổi. Trường trạng thái BKPF-BSTAT được cập nhật thành 'Z' (chứng từ lưu tạm đã bị xóa). Có thể tìm dấu thời gian thay đổi trong nhật ký thay đổi chứng từ (CDHDR). Thu thập Xác định thời điểm BKPF-BSTAT được cập nhật thành 'Z'. Loại sự kiện explicit | |||
| Yêu cầu sửa bút toán | Hoạt động này đánh dấu thời điểm người phê duyệt đã rà soát bút toán và gửi lại cho người tạo để chỉnh sửa. Sự kiện được ghi nhận từ nhật ký workflow, trong đó có quyết định của người dùng như 'rejection' hoặc 'send back'. | ||
| Vì sao điều này quan trọng Hoạt động này rất quan trọng để phát hiện các vòng lặp làm lại, vốn là nguyên nhân chính gây kém hiệu quả và sai lệch quy trình. Sự kiện này xảy ra thường xuyên cho thấy chất lượng bút toán có vấn đề hoặc yêu cầu chưa rõ ràng. Lấy dữ liệu ở đâu Sự kiện này được suy ra từ dấu thời gian của một bước quyết định cụ thể trong nhật ký SAP Business Workflow, tương ứng với thao tác 'reject' hoặc 'send for correction'. Thu thập Xác định dấu thời gian của quyết định 'rejection' hoặc 'rework' trong nhật ký workflow. Loại sự kiện inferred | |||
Hướng dẫn trích xuất
Các bước
- Tạo chương trình ABAP: Trong hệ thống SAP, mở mã giao dịch SE38 (ABAP Editor). Nhập tên cho chương trình mới, chẳng hạn Z_PM_JE_EXTRACTION, rồi nhấp Create. Đặt tiêu đề phù hợp và chọn loại chương trình 'Executable Program'.
- Tạo màn hình chọn dữ liệu: Trong mã nguồn chương trình, định nghĩa màn hình chọn dữ liệu. Màn hình này cho phép người dùng chỉ định tham số như khoảng ngày tạo chứng từ, mã công ty và loại chứng từ để giới hạn lượng dữ liệu cần trích xuất.
- Khai báo cấu trúc dữ liệu: Định nghĩa cấu trúc bảng nội bộ để lưu nhật ký sự kiện cuối cùng. Cấu trúc này phải có đủ các trường bắt buộc: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate và các thuộc tính nên có như User, CompanyCode, PostingDate.
- Viết logic chọn dữ liệu: Viết các truy vấn ABAP SQL chính để trích xuất dữ liệu cho từng hoạt động trong số 14 hoạt động bắt buộc. Cần lấy dữ liệu từ các bảng chính như BKPF (đầu chứng từ), BSEG (dòng chứng từ), bảng nhật ký thay đổi CDHDR và CDPOS, bảng workflow như SWWLOGHIST và bảng thanh toán bù trừ như BSAS và BSAK.
- Trích xuất chứng từ tạm lưu và đã hạch toán: Với sự kiện 'Đã tạm lưu bút toán', chọn dữ liệu từ BKPF khi trạng thái chứng từ (BSTAT) là 'V'. Với sự kiện 'Đã tạo bút toán' và 'Đã hạch toán bút toán', chọn dữ liệu từ BKPF khi trường trạng thái để trống, nghĩa là chứng từ thông thường đã được hạch toán.
- Trích xuất sự kiện thay đổi và xóa: Truy vấn các bảng chứng từ thay đổi CDHDR và CDPOS với lớp đối tượng 'BELEG'. Lọc theo khóa chứng từ để tìm các thay đổi tương ứng với hoạt động 'Đã chỉnh sửa bút toán' hoặc 'Đã xóa bút toán tạm lưu'.
- Trích xuất sự kiện workflow: Để ghi nhận các hoạt động như 'Đã gửi bút toán', 'Đã phê duyệt', 'Đã từ chối' và 'Đã yêu cầu chỉnh sửa', hãy truy vấn các bảng workflow. Dùng bảng SWW_WI2OBJ để liên kết chứng từ kế toán với một phiên bản workflow, sau đó đọc SWWLOGHIST để lấy quyết định cụ thể của người dùng hoặc thay đổi trạng thái.
- Xác định sự kiện được tính toán: Với hoạt động 'Đã xác định bút toán thủ công', kiểm tra mã giao dịch (BKPF-TCODE) theo danh sách mã giao dịch thủ công đã biết. Với hoạt động 'Đã xác định hạch toán liên công ty', phân tích các dòng trong BSEG của một chứng từ để xem có nhiều mã công ty hay không.
- Gộp và chuyển đổi dữ liệu: Khi chọn dữ liệu cho từng hoạt động, chuyển dữ liệu sang cấu trúc nhật ký sự kiện cuối cùng. Ghép Company Code, Document Number và Fiscal Year để tạo JournalEntryId. Chuyển ngày và giờ SAP thành một dấu thời gian EventTime. Thêm kết quả của từng truy vấn vào bảng nội bộ cuối cùng.
- Xuất tệp: Dùng các câu lệnh xử lý tệp ABAP như OPEN DATASET, LOOP AT, TRANSFER và CLOSE DATASET để ghi bảng nội bộ đã gộp thành tệp CSV hoặc tệp văn bản thuần trong thư mục máy chủ ứng dụng SAP (có thể xem bằng mã giao dịch AL11).
- Lên lịch chạy nền: Mở mã giao dịch SM36 (Define Background Job). Tạo công việc mới, thêm bước chạy chương trình ABAP và đặt lịch, chẳng hạn chạy hằng đêm hoặc hằng tuần vào giờ thấp điểm, để tự động hóa việc trích xuất.
- Tải và định dạng tệp: Dùng mã giao dịch CG3Y hoặc nhờ quản trị viên hệ thống tải tệp đã tạo từ máy chủ ứng dụng về máy tính. Đảm bảo mã hóa và định dạng tệp phù hợp để tải lên công cụ process mining của bạn.
Cấu hình
- Khoảng ngày: Cần xác định khoảng ngày để kiểm soát hiệu năng. Dùng ngày tạo chứng từ (BKPF-CPUDT) làm bộ lọc chính. Với lần phân tích đầu tiên, nên chọn khoảng thời gian từ 3 đến 6 tháng. Khi kiểm thử, hãy chọn vài ngày đã biết có dữ liệu.
- Lọc theo mã công ty: Luôn lọc theo mã công ty (BKPF-BUKRS). Trích xuất cùng lúc dữ liệu của tất cả mã công ty có thể tiêu tốn rất nhiều tài nguyên hệ thống. Hãy bắt đầu với một mã hoặc một nhóm nhỏ các mã công ty liên quan.
- Lọc theo loại chứng từ: Dùng bộ lọc loại chứng từ (BKPF-BLART) để giới hạn phạm vi vào các loại bút toán cụ thể, chẳng hạn 'SA' cho chứng từ sổ cái, nếu bạn không cần phân tích tất cả loại chứng từ.
- ID tác vụ workflow: Logic trích xuất sự kiện workflow phụ thuộc vào ID tác vụ cụ thể được dùng trong hệ thống để phê duyệt, từ chối và gửi. Cần cấu hình các ID này trong mã nguồn chương trình theo định nghĩa workflow của công ty bạn.
- Lưu ý về hiệu năng: Chương trình kết hợp một số bảng lớn, đặc biệt là CDPOS và các bảng lịch sử workflow. Chạy chương trình vào giờ cao điểm có thể ảnh hưởng đến hiệu năng hệ thống. Luôn lên lịch chạy nền vào giờ thấp điểm. Nếu hiệu năng thường xuyên gặp vấn đề, hãy cân nhắc tạo chỉ mục cơ sở dữ liệu phụ.
- Điều kiện tiên quyết: Cần có người dùng được cấp quyền phát triển ABAP (cho SE38) và quyền tạo, quản lý công việc chạy nền (cho SM36). Người dùng hoặc công việc cũng cần quyền đọc tất cả các bảng tài chính, workflow và hệ thống liên quan (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST, v.v.).
Truy vấn mẫu abap
REPORT Z_PM_JE_EXTRACTION.
*&---------------------------------------------------------------------*
*& Data Structures for Final Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
username TYPE uname,
companycode TYPE bukrs,
documenttype TYPE blart,
postingdate TYPE budat,
transactioncode TYPE tcode,
isreversed TYPE abap_bool,
END OF ty_event_log.
DATA: lt_final_log TYPE STANDARD TABLE OF ty_event_log.
DATA: ls_event TYPE ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen Parameters
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_blart FOR bkpf-blart,
s_cpudt FOR bkpf-cpudt OBLIGATORY.
PARAMETERS: p_sysid TYPE sy-sysid DEFAULT sy-sysid.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA(lv_last_update) = cl_abap_context_info=>get_system_timestamp( ).
" 1. Journal Entry Parked
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
'Journal Entry Parked' AS activityname,
a~cpudt, a~cputm,
a~usnam AS username,
a~bukrs AS companycode,
a~blart AS documenttype,
a~bldat AS postingdate,
a~tcode AS transactioncode
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~bstat = 'V' " Parked Document
INTO TABLE @DATA(lt_parked).
IF sy-subrc = 0.
LOOP AT lt_parked ASSIGNING FIELD-SYMBOL(<fs_parked>).
ls_event-journalentryid = <fs_parked>-journalentryid.
ls_event-activityname = <fs_parked>-activityname.
CONVERT DATE <fs_parked>-cpudt TIME <fs_parked>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_parked>-username.
ls_event-companycode = <fs_parked>-companycode.
ls_event-documenttype = <fs_parked>-documenttype.
ls_event-postingdate = <fs_parked>-postingdate.
ls_event-transactioncode = <fs_parked>-transactioncode.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 2. Journal Entry Created (directly posted, not parked first)
" 9. Journal Entry Posted
" These two events happen at the same time for a direct posting.
SELECT CONCAT( bukrs, belnr, gjahr ) AS journalentryid,
cpudt, cputm, usnam, bukrs, blart, budat, tcode, stblg
FROM bkpf
WHERE bukrs IN s_bukrs
AND blart IN s_blart
AND cpudt IN s_cpudt
AND bstat = '' " Normal, posted document
INTO TABLE @DATA(lt_posted).
IF sy-subrc = 0.
LOOP AT lt_posted ASSIGNING FIELD-SYMBOL(<fs_posted>).
" Activity: Journal Entry Created
ls_event-journalentryid = <fs_posted>-journalentryid.
ls_event-activityname = 'Journal Entry Created'.
CONVERT DATE <fs_posted>-cpudt TIME <fs_posted>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_posted>-usnam.
ls_event-companycode = <fs_posted>-bukrs.
ls_event-documenttype = <fs_posted>-blart.
ls_event-postingdate = <fs_posted>-budat.
ls_event-transactioncode = <fs_posted>-tcode.
ls_event-isreversed = COND #( WHEN <fs_posted>-stblg IS NOT INITIAL THEN abap_true ELSE abap_false ).
APPEND ls_event TO lt_final_log.
" Activity: Journal Entry Posted
ls_event-activityname = 'Journal Entry Posted'.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 3. Documentation Attached (via GOS)
SELECT a~instid_a, c~cr_timestamp
FROM srgbtbrel AS a
INNER JOIN sood AS b ON a~instid_b = b~objid
INNER JOIN socf AS c ON b~filid = c~filid
WHERE a~typeid_a = 'BKPF'
AND a~bukrs IN s_bukrs
INTO TABLE @DATA(lt_attachments).
IF sy-subrc = 0.
LOOP AT lt_attachments ASSIGNING FIELD-SYMBOL(<fs_attach>).
ls_event-journalentryid = |{ <fs_attach>-instid_a(4) }{ <fs_attach>-instid_a+4(10) }{ <fs_attach>-instid_a+14(4) }|.
ls_event-activityname = 'Documentation Attached'.
ls_event-eventtime = <fs_attach>-cr_timestamp.
" Other attributes may need to be looked up from BKPF if needed.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 4, 5, 6, 7, 8: Workflow events (Submitted, Changes Requested, Corrected, Approved, Rejected)
" This is a simplified example. Real logic depends on specific workflow templates.
SELECT a~instid, b~wi_cd, b~wi_ct, b~wi_aagent, b~wi_text
FROM sww_wi2obj AS a
INNER JOIN swwloghist AS b ON a~wi_id = b~wi_id
WHERE a~typeid = 'BKPF'
AND a~catid = 'BO'
AND a~bukrs IN s_bukrs
AND b~wi_cd BETWEEN s_cpudt-low AND s_cpudt-high
INTO TABLE @DATA(lt_workflow).
IF sy-subrc = 0.
LOOP AT lt_workflow ASSIGNING FIELD-SYMBOL(<fs_wf>).
ls_event-journalentryid = |{ <fs_wf>-instid(4) }{ <fs_wf>-instid+4(10) }{ <fs_wf>-instid+14(4) }|.
ls_event-activityname = CASE <fs_wf>-wi_text. " Simplified logic based on work item text
WHEN '[Placeholder for Submit Text]' THEN 'Journal Entry Submitted'
WHEN '[Placeholder for Approve Text]' THEN 'Journal Entry Approved'
WHEN '[Placeholder for Reject Text]' THEN 'Journal Entry Rejected'
WHEN '[Placeholder for Rework Text]' THEN 'Journal Entry Changes Requested'
ELSE ''
ENDCASE.
IF ls_event-activityname IS NOT INITIAL.
CONVERT DATE <fs_wf>-wi_cd TIME <fs_wf>-wi_ct INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_wf>-wi_aagent.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
ENDIF.
" 10. Manual Entry Identified & 11. Cross-Company Posting Identified
SELECT bukrs, belnr, gjahr, tcode FROM bkpf
WHERE bukrs IN s_bukrs AND blart IN s_blart AND cpudt IN s_cpudt
INTO TABLE @DATA(lt_calc_base).
LOOP AT lt_calc_base ASSIGNING FIELD-SYMBOL(<fs_calc>).
ls_event-journalentryid = |{ <fs_calc>-bukrs }{ <fs_calc>-belnr }{ <fs_calc>-gjahr }|.
" Check for manual entry T-Codes
IF <fs_calc>-tcode = 'FB01' OR <fs_calc>-tcode = 'F-02' OR <fs_calc>-tcode = 'FB50'.
ls_event-activityname = 'Manual Entry Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
" Check for cross-company posting
SELECT SINGLE bukrs FROM bseg WHERE belnr = <fs_calc>-belnr AND gjahr = <fs_calc>-gjahr AND bukrs <> <fs_calc>-bukrs INTO @DATA(lv_cross_bukrs).
IF sy-subrc = 0.
ls_event-activityname = 'Cross-Company Posting Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 12. Journal Entry Line Item Cleared
SELECT a~bukrs, a~belnr, a~gjahr, a~augdt, a~augbl
FROM bsas AS a " G/L Cleared Items
WHERE a~bukrs IN s_bukrs
AND a~budat IN s_cpudt
INTO TABLE @DATA(lt_cleared_gl).
IF sy-subrc = 0.
LOOP AT lt_cleared_gl ASSIGNING FIELD-SYMBOL(<fs_clr>).
ls_event-journalentryid = |{ <fs_clr>-bukrs }{ <fs_clr>-belnr }{ <fs_clr>-gjahr }|.
ls_event-activityname = 'Journal Entry Line Item Cleared'.
CONVERT DATE <fs_clr>-augdt INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
" User is often not directly available for clearing events
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 13. Parked Journal Entry Deleted & 6. Journal Entry Corrected
SELECT objectid, changenr, username, udate, utime FROM cdhdr
WHERE objectclas = 'BELEG'
AND udate IN s_cpudt
INTO TABLE @DATA(lt_cdhdr).
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
SELECT SINGLE tcode FROM cdpos WHERE changenr = <fs_cdhdr>-changenr AND fname = 'BSTAT' AND value_new = 'Z' INTO @DATA(lv_deleted_tcode).
ls_event-journalentryid = |{ <fs_cdhdr>-objectid(4) }{ <fs_cdhdr>-objectid+4(10) }{ <fs_cdhdr>-objectid+14(4) }|.
CONVERT DATE <fs_cdhdr>-udate TIME <fs_cdhdr>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_cdhdr>-username.
IF sy-subrc = 0.
ls_event-activityname = 'Parked Journal Entry Deleted'.
APPEND ls_event TO lt_final_log.
ELSE.
ls_event-activityname = 'Journal Entry Corrected'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 14. Journal Entry Reversal Processed
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
a~cpudt, a~cputm, a~usnam
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~stblg IS NOT NULL " Document is a reversal
INTO TABLE @DATA(lt_reversals).
IF sy-subrc = 0.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
ls_event-journalentryid = <fs_rev>-journalentryid.
ls_event-activityname = 'Journal Entry Reversal Processed'.
CONVERT DATE <fs_rev>-cpudt TIME <fs_rev>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_rev>-usnam.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" Final step: Output to file
DATA(lv_filename) = |/tmp/je_extraction_{ sy-datum }_{ sy-uzeit }.csv|.
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'JournalEntryId,ActivityName,EventTime,SourceSystem,LastDataUpdate,User,CompanyCode,DocumentType,PostingDate,TransactionCode,IsReversed'.
TRANSFER lv_header TO lv_filename.
LOOP AT lt_final_log INTO ls_event.
DATA(lv_line) = |"{ ls_event-journalentryid }","|
|{ ls_event-activityname }","|
|{ ls_event-eventtime }","|
|{ ls_event-sourcesystem }","|
|{ ls_event-lastdataupdate }","|
|{ ls_event-username }","|
|{ ls_event-companycode }","|
|{ ls_event-documenttype }","|
|{ ls_event-postingdate }","|
|{ ls_event-transactioncode }","|
|{ ls_event-isreversed }"|.
TRANSFER lv_line TO lv_filename.
ENDLOOP.
CLOSE DATASET lv_filename.
ENDIF. Các bước
- Kết nối cơ sở dữ liệu: Lấy thông tin đăng nhập chỉ có quyền đọc vào cơ sở dữ liệu SAP ECC. Dùng ứng dụng SQL tiêu chuẩn như DBeaver, SAP HANA Studio hoặc SQL Server Management Studio để kết nối.
- Chuẩn bị truy vấn SQL: Sao chép toàn bộ truy vấn SQL trong phần 'query' của tài liệu này vào ứng dụng SQL.
- Đặt tham số trích xuất: Trước khi chạy, hãy thay các placeholder trong truy vấn. Thay '[START_DATE]' và '[END_DATE]' bằng khoảng ngày cần lấy theo định dạng 'YYYYMMDD'. Thay '[COMPANY_CODE_1]', '[COMPANY_CODE_2]' bằng mã công ty SAP cụ thể bạn muốn phân tích.
- Xác định hệ thống nguồn: Trong câu lệnh
SELECTchính, thay placeholder '[Your SAP System ID]' bằng SAP System ID (SID) thực tế để xác định đúng nguồn dữ liệu. - Chạy truy vấn: Chạy truy vấn SQL đã cấu hình trên cơ sở dữ liệu SAP. Thời gian chạy tùy thuộc vào khoảng ngày và kích thước các bảng cơ sở dữ liệu.
- Kiểm tra kết quả ban đầu: Khi truy vấn hoàn tất, xem nhanh các hàng trả về để đảm bảo dữ liệu được điền như mong đợi. Kiểm tra xem có nhiều hoạt động khác nhau không và các trường quan trọng như
JournalEntryId,EventTimecó dữ liệu. - Xử lý dấu thời gian: Truy vấn ghép các trường ngày và giờ thành chuỗi
YYYYMMDDHHMMSS. Đảm bảo bước xử lý sau đó hoặc hệ thống đích có thể phân tích định dạng này. Nếu cơ sở dữ liệu hỗ trợ, bạn cũng có thể sửa hàm SQLCONCATđể dùng định dạng ISO 8601 nhưYYYY-MM-DDTHH:MI:SS. - Xuất dữ liệu: Xuất toàn bộ kết quả từ ứng dụng SQL sang tệp CSV. Chọn mã hóa UTF-8 để tránh lỗi với ký tự đặc biệt.
- Chuẩn bị tải lên: Trước khi tải lên công cụ process mining, hãy xác nhận tiêu đề cột khớp với lược đồ dữ liệu bắt buộc.
JournalEntryId,ActivityNamevàEventTimelà các trường quan trọng. Thêm cộtLastDataUpdatevà điền dấu thời gian lúc trích xuất dữ liệu. - Kiểm tra lần cuối: Thực hiện các bước trong phần 'validationSteps' để đảm bảo dữ liệu đã trích xuất đầy đủ và chính xác trước khi bắt đầu phân tích.
Cấu hình
- Quyền truy cập cơ sở dữ liệu: Người dùng cơ sở dữ liệu cần có quyền đọc các bảng SAP sau: BKPF, BSEG, CDHDR, CDPOS, T001 và V_USERNAME. Với các hoạt động liên quan đến workflow, cần có quyền truy cập SWW_WI2OBJ và SWWLOGHIST. Thông thường, chỉ các nhóm kỹ thuật chuyên trách mới được cấp quyền này.
- Lọc theo khoảng ngày: Cần lọc dữ liệu theo khoảng ngày cụ thể để đảm bảo truy vấn hoạt động hiệu quả. Truy vấn được cung cấp có placeholder cho ngày bắt đầu và ngày kết thúc, áp dụng cho ngày tạo chứng từ (
BKPF.CPUDT). Với lần phân tích đầu tiên, nên chọn khoảng thời gian từ 3 đến 6 tháng. - Lọc theo đơn vị: Để kiểm soát lượng dữ liệu và tập trung phân tích, luôn lọc theo mã công ty (
BKPF.BUKRS). Bạn cũng có thể lọc theo loại chứng từ (BKPF.BLART) để chỉ lấy các loại bút toán liên quan, chẳng hạn 'SA' cho chứng từ sổ cái, đồng thời loại trừ chứng từ vận hành như hóa đơn hoặc thanh toán nếu chúng không thuộc phạm vi phân tích. - Lưu ý về hiệu năng: Truy vấn trực tiếp các bảng chính như BSEG và CDPOS có thể tiêu tốn nhiều tài nguyên. Nên chạy trích xuất vào giờ thấp điểm để tránh ảnh hưởng đến hiệu năng hệ thống đối với người dùng cuối. Không nên trích xuất dữ liệu quá một năm trong một lần chạy.
- ID tác vụ workflow: Truy vấn có các placeholder như '[WF_TASK_ID_SUBMIT]' và '[WF_TASK_ID_APPROVE]'. Hãy thay chúng bằng ID tác vụ thực tế trong cấu hình workflow bút toán của hệ thống. Bạn có thể xác định các ID này bằng cách phối hợp với chuyên gia SAP Workflow hoặc phân tích định nghĩa workflow kỹ thuật trong mã giao dịch PFTC.
Truy vấn mẫu sql
WITH DOC_HEADERS AS (
SELECT
BUKRS,
BELNR,
GJAHR,
BLART,
BLDAT,
BUDAT,
CPUDT,
CPUTM,
USNAM,
TCODE,
BSTAT,
STBLG,
XRECH
FROM BKPF
WHERE CPUDT BETWEEN '[START_DATE]' AND '[END_DATE]'
AND BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]')
)
-- Event 1: Journal Entry Created (Directly Posted)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = '' OR H.BSTAT = 'U'
UNION ALL
-- Event 2: Journal Entry Parked
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = 'V'
UNION ALL
-- Event 3: Journal Entry Posted (from Parked state)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT <> 'V'
AND P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW <> 'V'
UNION ALL
-- Event 4: Parked Journal Entry Deleted
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Parked Journal Entry Deleted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND C.TCODE = 'FBV0'
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW = 'Z'
UNION ALL
-- Event 5: Journal Entry Reversal Processed
SELECT
CONCAT(H.BUKRS, H.STBLG, H.GJAHR) AS "JournalEntryId", -- Linking to the original document
'Journal Entry Reversal Processed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
TRUE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.STBLG IS NOT NULL AND H.STBLG <> ''
UNION ALL
-- Event 6: Journal Entry Line Item Cleared
SELECT
CONCAT(B.BUKRS, B.BELNR, B.GJAHR) AS "JournalEntryId",
'Journal Entry Line Item Cleared' AS "ActivityName",
TO_TIMESTAMP(B.AUGDT, 'YYYYMMDD') AS "EventTime", -- Clearing date used as event time
U.NAME_TEXT AS "User",
B.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode", -- Clearing transaction is in the clearing document header, complex to retrieve here
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM BSEG B
JOIN DOC_HEADERS H ON B.BUKRS = H.BUKRS AND B.BELNR = H.BELNR AND B.GJAHR = H.GJAHR
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE B.AUGBL IS NOT NULL AND B.AUGBL <> '' AND B.AUGDT <> '00000000'
UNION ALL
-- Event 7: Journal Entry Corrected (changes to a parked document)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT = 'V' AND C.TCODE IN ('FBV2', 'FBV4') -- FBV2 is change parked doc, FBV4 is change parked doc header
UNION ALL
-- Event 8: Documentation Attached (inferred from GOS attachment creation, requires configuration)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(CONCAT(REL.RECDATE, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SRGBTBREL REL ON REL.INSTID_A = CONCAT('BUS2081', H.BUKRS, H.BELNR, H.GJAHR) -- BUS2081 is object type for BKPF
LEFT JOIN V_USERNAME U ON REL.RECUNAM = U.BNAME
WHERE REL.TYPEID_A = 'BUS2081' AND REL.RELTYPE = 'ATTA'
UNION ALL
-- Events 9-13 from Workflow (Submitted, Changes Requested, Approved, Rejected) requires specific workflow config
-- This is a generic template. The WI_RH_TASK must be adapted to your system.
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
CASE
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_SUBMIT]' THEN 'Journal Entry Submitted'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_APPROVE]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Approved'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_REJECT]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Rejected'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_CHANGES_REQ]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Changes Requested'
ELSE NULL
END AS "ActivityName",
TO_TIMESTAMP(CONCAT(LOG.EVT_DATE, LOG.EVT_TIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SWW_WI2OBJ WIOBJ ON WIOBJ.INSTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND WIOBJ.TYPEID = 'BKPF'
JOIN SWWLOGHIST LOG ON WIOBJ.WI_ID = LOG.WI_ID
LEFT JOIN V_USERNAME U ON LOG.EXEC_USER = U.BNAME
WHERE LOG.WI_RH_TASK IN ('[WF_TASK_ID_SUBMIT]', '[WF_TASK_ID_APPROVE]', '[WF_TASK_ID_REJECT]', '[WF_TASK_ID_CHANGES_REQ]')
UNION ALL
-- Event 14: Manual Entry Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Manual Entry Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.TCODE IN ('FB01', 'F-02', 'FB50', 'F-04', 'F-22', 'F-43', 'FB60', 'FB70', 'FV50', 'FV60', 'FV70')
UNION ALL
-- Event 15: Cross-Company Posting Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Cross-Company Posting Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.XRECH = 'X' Các bước
- Thiết lập kết nối SAP: Trong công cụ ETL của bên thứ ba, cấu hình kết nối nguồn mới đến hệ thống SAP ECC của bạn. Thông thường, bạn cần thông tin máy chủ ứng dụng, client, số hệ thống và một tài khoản người dùng SAP riêng có đủ quyền RFC cần thiết.
- Chọn nguồn dữ liệu: Trong dự án trích xuất, thêm các bảng SAP cần thiết làm nguồn dữ liệu. Các bảng chính gồm BKPF (tiêu đề chứng từ kế toán), BSEG (chi tiết chứng từ kế toán), VBSEGK (tiêu đề chứng từ tạm giữ), CDHDR (tiêu đề nhật ký thay đổi), CDPOS (chi tiết thay đổi), SWW_WI2OBJ (liên kết quy trình làm việc với đối tượng), SWWLOGHIST (nhật ký quy trình làm việc) và SRGBTBREL (quan hệ của tệp đính kèm GOS).
- Trích xuất sự kiện ban đầu (được tạo và tạm giữ): Tạo luồng dữ liệu đầu tiên để trích xuất các sự kiện ban đầu. Với sự kiện 'Bút toán nhật ký được tạm giữ', dùng VBSEGK làm nguồn. Với sự kiện 'Bút toán nhật ký được tạo', dùng BKPF và lọc bỏ chứng từ đảo ngược cũng như chứng từ ban đầu được tạm giữ. Bạn có thể thực hiện việc này bằng cách kết hợp loại trừ với VBSEGK.
- Trích xuất sự kiện quy trình làm việc: Tạo luồng dữ liệu kết hợp BKPF với SWW_WI2OBJ bằng khóa đối tượng (mã công ty + số chứng từ + năm tài chính) để tìm mã phiên bản quy trình làm việc. Kết hợp kết quả này với SWWLOGHIST để trích xuất các sự kiện như 'Đã gửi', 'Đã phê duyệt', 'Bị từ chối' và 'Yêu cầu chỉnh sửa', dựa trên kết quả tác vụ và quyết định của người dùng được ghi trong nhật ký.
- Trích xuất sự kiện thay đổi và xóa: Dùng các bảng CDHDR và CDPOS để xác định thay đổi. Với sự kiện 'Bút toán nhật ký được chỉnh sửa', lọc các thay đổi trên chứng từ tạm giữ (Object Class 'FIPP'). Với sự kiện 'Bút toán nhật ký tạm giữ bị xóa', tìm dấu hiệu xóa trong nhật ký thay đổi của chứng từ tạm giữ.
- Trích xuất sự kiện đính kèm: Để ghi nhận sự kiện 'Đã đính kèm tài liệu', kết hợp BKPF với SRGBTBREL khi loại đối tượng là 'BKPF' và quan hệ là '[Your attachment relationship type]'. Ngày tạo liên kết được dùng làm thời điểm sự kiện.
- Trích xuất sự kiện tất toán và đảo ngược: Với sự kiện 'Khoản mục bút toán nhật ký đã được tất toán', truy vấn bảng BSEG khi trường chứng từ tất toán (AUGBL) có giá trị. Thời điểm sự kiện là ngày hạch toán của chứng từ tất toán (AUGDT). Với sự kiện 'Đã xử lý đảo ngược bút toán nhật ký', truy vấn BKPF để tìm chứng từ đảo ngược, được nhận diện qua trường chứng từ bị đảo ngược (STBLG) có giá trị.
- Tạo sự kiện tính toán: Tạo các khối logic riêng cho những sự kiện được tính toán. Với sự kiện 'Đã xác định bút toán thủ công', lọc BKPF theo danh sách mã giao dịch thủ công, chẳng hạn FB01, FB50, F-02. Với sự kiện 'Đã xác định hạch toán liên công ty', nhóm bảng BSEG theo mã chứng từ và tìm các chứng từ có nhiều hơn một mã công ty khác nhau.
- Kết hợp các luồng sự kiện: Dùng phép biến đổi UNION trong công cụ ETL để hợp nhất đầu ra của từng luồng sự kiện (được tạo, tạm giữ, được phê duyệt, v.v.) vào một bảng nhật ký sự kiện. Đảm bảo tên cột và kiểu dữ liệu nhất quán giữa các luồng.
- Ánh xạ sang cấu trúc dữ liệu cuối: Ánh xạ dữ liệu đã kết hợp sang cấu trúc nhật ký sự kiện cần thiết, tạo các trường
JournalEntryId,ActivityName,EventTime,Người dùngcùng các thuộc tính bắt buộc và nên có khác. Thêm các cột có giá trị cố định nhưSourceSystemvà dùng thời điểm chạy tác vụ ETL làmLastDataUpdate. - Cấu hình tải dữ liệu tăng dần: Với các lần trích xuất tiếp theo, hãy cấu hình chiến lược tải tăng dần. Dùng ngày tạo hoặc ngày thay đổi gần nhất (chẳng hạn BKPF.CPUDT, CDHDR.UDATE) làm mốc để chỉ lấy các bản ghi mới hoặc đã cập nhật kể từ lần chạy trước.
- Xuất dữ liệu cho ProcessMind: Lên lịch chạy tác vụ trích xuất và cấu hình bước đầu ra cuối cùng để lưu nhật ký sự kiện dưới dạng tệp CSV hoặc Parquet tại vị trí ProcessMind có thể truy cập để tải lên.
Cấu hình
- Điều kiện tiên quyết: Cần có giấy phép sử dụng công cụ ETL của bên thứ ba (ví dụ: Theobald Xtract Universal, Informatica, Talend) với trình kết nối SAP chuyên dụng. Tài khoản SAP cần có quyền RFC và quyền đọc các bảng tài chính (ví dụ: S_TABU_DIS cho nhóm bảng F_00, F_WF), dữ liệu workflow và nhật ký thay đổi.
- Thông số kết nối: Bạn cần địa chỉ IP hoặc tên máy chủ ứng dụng SAP, số hệ thống và ID client. Hãy dùng giải pháp quản lý thông tin đăng nhập an toàn cho tên người dùng và mật khẩu SAP.
- Bộ lọc chính: Luôn lọc theo mã công ty (BKPF.BUKRS) và năm tài chính (BKPF.GJAHR) ngay tại nguồn để giới hạn lượng dữ liệu. Bạn nên lọc theo ngày tạo chứng từ (BKPF.CPUDT) để xác định khoảng thời gian trích xuất cụ thể, chẳng hạn 6 tháng gần nhất.
- Chọn khoảng ngày: Với lần tải dữ liệu đầu tiên, hãy chọn khoảng thời gian đại diện, chẳng hạn 3 đến 6 tháng. Với các lần tải dữ liệu delta tiếp theo, dùng trường dấu thời gian như
CPUDTlàm mốc để chỉ lấy bản ghi mới. - Lưu ý về hiệu suất: Các phép nối trên BSEG, CDPOS và bảng workflow có thể chạy rất chậm. Nếu có thể, hãy đảm bảo công cụ ETL đẩy bộ lọc xuống nguồn SAP. Nếu công cụ hỗ trợ, hãy trích xuất dữ liệu thành các phần hoặc gói nhỏ hơn, nhất là khi tải lượng lớn dữ liệu lịch sử.
- Tùy chỉnh workflow: Cách xác định các hoạt động workflow như 'Đã phê duyệt' hoặc 'Bị từ chối' phụ thuộc nhiều vào mẫu workflow cụ thể của bạn. Bạn cần xác định đúng ID tác vụ workflow và khóa quyết định của người dùng trong hệ thống để dùng làm bộ lọc.
Truy vấn mẫu sql
/*
This is a logical representation of the extraction configuration in a third-party ETL tool.
It is not executable SQL but defines the sources, joins, and transformations for each activity.
Placeholders like [Your SAP Source], [Date Filter], and [Company Code Filter] must be configured in the tool.
*/
-- Extraction block for 'Journal Entry Parked'
SELECT
CONCAT(v.BUKRS, v.VBELN, v.GJAHR) AS JournalEntryId,
'Journal Entry Parked' AS ActivityName,
CAST(CONCAT(v.CPUDT, v.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
v.USNAM AS User,
v.BUKRS AS CompanyCode,
v.BLART AS DocumentType,
v.BUDAT AS PostingDate,
v.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].VBSEGK v
WHERE [Date Filter on v.CPUDT] AND [Company Code Filter on v.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Created'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Created' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
LEFT JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE h.BSTAT = '' AND v.VBELN IS NULL AND h.STBLG IS NULL
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Posted' (from parked)
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Posted' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Or a more precise posting time from change logs if available
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Submitted', 'Approved', 'Rejected', 'Changes Requested'
SELECT
CONCAT(SUBSTRING(o.INSTID, 3, 4), SUBSTRING(o.INSTID, 7, 10), SUBSTRING(o.INSTID, 17, 4)) AS JournalEntryId,
CASE
WHEN wl.WI_TEXT LIKE '%Submit%' THEN 'Journal Entry Submitted'
WHEN wl.WI_TEXT LIKE '%Approve%' THEN 'Journal Entry Approved'
WHEN wl.WI_TEXT LIKE '%Reject%' THEN 'Journal Entry Rejected'
WHEN wl.WI_TEXT LIKE '%Request Changes%' THEN 'Journal Entry Changes Requested'
END AS ActivityName,
CAST(CONCAT(wl.WI_CD, wl.WI_CT) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
wl.EXEC_USER AS User,
SUBSTRING(o.INSTID, 3, 4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SWW_WI2OBJ o
JOIN [Your SAP Source].SWWLOGHIST wl ON o.WI_ID = wl.WI_ID
WHERE o.TYPEID = 'BKPF' AND o.CATID = 'BO'
AND wl.WI_TEXT IN ('[Your Submit Task Name]', '[Your Approve Task Name]', '[Your Reject Task Name]', '[Your Changes Request Task Name]')
AND [Date Filter on wl.WI_CD]
UNION ALL
-- Extraction block for 'Journal Entry Corrected'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Journal Entry Corrected' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'U'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Parked Journal Entry Deleted'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Parked Journal Entry Deleted' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'D'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Documentation Attached'
SELECT
CONCAT(SUBSTRING(r.INSTID_A, 3, 4), SUBSTRING(r.INSTID_A, 7, 10), SUBSTRING(r.INSTID_A, 17, 4)) AS JournalEntryId,
'Documentation Attached' AS ActivityName,
-- Note: A precise timestamp is often unavailable. Using document creation time as a proxy.
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SRGBTBREL r
JOIN [Your SAP Source].BKPF h ON h.BUKRS = SUBSTRING(r.INSTID_A, 3, 4) AND h.BELNR = SUBSTRING(r.INSTID_A, 7, 10) AND h.GJAHR = SUBSTRING(r.INSTID_A, 17, 4)
WHERE r.TYPEID_A = 'BKPF' AND r.RELTYPE = '[Configure based on your system]'
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Reversal Processed'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Reversal Processed' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.STBLG IS NOT NULL AND h.STBLG <> ''
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Is Reversed' flag on original document
SELECT
CONCAT(h_orig.BUKRS, h_orig.BELNR, h_orig.GJAHR) AS JournalEntryId,
'Is Reversed' AS ActivityName, -- This is an attribute update, modeled as an event
CAST(CONCAT(h_rev.CPUDT, h_rev.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h_rev.USNAM AS User,
h_orig.BUKRS AS CompanyCode,
h_orig.BLART AS DocumentType,
h_orig.BUDAT AS PostingDate,
h_orig.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h_rev
JOIN [Your SAP Source].BKPF h_orig ON h_rev.STBLG = h_orig.BELNR AND h_rev.BUKRS = h_orig.BUKRS AND h_rev.GJAHR_S = h_orig.GJAHR
WHERE h_rev.STBLG IS NOT NULL AND h_rev.STBLG <> ''
AND [Date Filter on h_rev.CPUDT] AND [Company Code Filter on h_rev.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Line Item Cleared'
SELECT
CONCAT(i.BUKRS, i.BELNR, i.GJAHR) AS JournalEntryId,
'Journal Entry Line Item Cleared' AS ActivityName,
CAST(i.AUGDT AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
NULL AS User, -- User who performed clearing is on the clearing document header
i.BUKRS AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BSEG i
WHERE i.AUGBL IS NOT NULL AND i.AUGBL <> ''
AND [Date Filter on i.AUGDT] AND [Company Code Filter on i.BUKRS]
UNION ALL
-- Extraction block for 'Manual Entry Identified'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Manual Entry Identified' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.TCODE IN ('FB01', 'F-02', 'FB50', 'FV50', '[Add other manual T-Codes]')
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Cross-Company Posting Identified'
SELECT
JournalEntryId,
'Cross-Company Posting Identified' AS ActivityName,
EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
User,
CompanyCode,
DocumentType,
PostingDate,
TransactionCode,
IsReversed
FROM (
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed,
(SELECT COUNT(DISTINCT i.BUKRS) FROM [Your SAP Source].BSEG i WHERE i.BELNR = h.BELNR AND i.BUKRS = h.BUKRS AND i.GJAHR = h.GJAHR) as CompanyCodeCount
FROM [Your SAP Source].BKPF h
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
) AS CrossCompanyCheck
WHERE CompanyCodeCount > 1 Sẵn sàng bắt đầu chưa?
Dùng mẫu dữ liệu này để bắt đầu process mining cho quy trình ghi nhận đến báo cáo: bút toán. Khám phá thông tin chuyên sâu hơn và nâng cao hiệu quả trong hoạt động tài chính.
Tối ưu quy trình ghi nhận đến báo cáo: bút toán ngay hôm nay
Giảm 30% thời gian xử lý bút toán và đảm bảo báo cáo chính xác.
Không cần thẻ tín dụng. Bắt đầu cải thiện ngay hôm nay.