Templat Data Pesanan Pembelian Purchase to Pay
Templat Data Pesanan Pembelian Purchase to Pay
- Atribut yang disarankan untuk dikumpulkan
- Aktivitas utama yang perlu dilacak
- Panduan ekstraksi untuk SAP ECC
Atribut Purchase to Pay, Pesanan Pembelian
| Nama | Deskripsi | ||
|---|---|---|---|
| Aktivitas Activity | Nama peristiwa atau langkah bisnis tertentu yang terjadi dalam siklus hidup pesanan pembelian. | ||
| Deskripsi Atribut ini menjelaskan satu langkah dalam proses, seperti 'Pesanan pembelian dibuat', 'Pesanan pembelian disetujui', atau 'Penerimaan barang dibukukan'. Urutan aktivitas ini membentuk alur proses untuk setiap pesanan pembelian. Menganalisis urutan, frekuensi, dan durasi antaraktivitas merupakan inti process mining. Analisis ini membantu menemukan hambatan, siklus pengerjaan ulang, dan penyimpangan dari proses standar, sehingga perbaikan dan standardisasi dapat dilakukan secara terarah. Mengapa ini penting Aktivitas menentukan langkah-langkah proses. Analisis urutan dan waktunya menunjukkan alur proses yang sebenarnya, hambatan, dan penyimpangan. Sumber data Diambil dari berbagai tabel dan log transaksi SAP, seperti CDHDR/CDPOS untuk perubahan, EKBE untuk GR/IR, dan EBAN untuk permintaan. Biasanya diperlukan logika khusus atau program ekstraksi untuk membuat data ini. Contoh Pesanan pembelian dibuatPesanan pembelian disetujuiPenerimaan barang dibukukan | |||
| Pesanan pembelian PurchaseOrder | Pengenal unik dokumen Pesanan Pembelian (PO), yang menjadi kasus utama untuk melacak proses pengadaan. | ||
| Deskripsi Nomor Pesanan Pembelian adalah pengenal utama yang menghubungkan semua aktivitas, mulai dari pembuatan hingga penerimaan barang dan penyelesaian akhir. Setiap nomor PO unik mewakili satu proses pengadaan. Dalam process mining, atribut ini penting untuk merekonstruksi perjalanan setiap pembelian dari awal hingga akhir. Atribut ini memungkinkan analisis terperinci atas waktu siklus, variasi proses, dan pemeriksaan kepatuhan untuk setiap pesanan. Inilah dasar seluruh model proses. Mengapa ini penting Ini adalah pengenal utama yang menghubungkan semua peristiwa terkait, sehingga seluruh siklus hidup setiap pesanan pembelian dapat dianalisis. Sumber data Tabel: EKKO, Kolom: EBELN Contoh 450001762345000176244500017625 | |||
| Waktu peristiwa EventTime | Tanggal dan waktu tepat saat aktivitas terjadi. | ||
| Deskripsi Stempel waktu ini menunjukkan saat tepat suatu peristiwa terjadi, misalnya saat PO disetujui atau penerimaan barang dibukukan. Data ini menentukan urutan kronologis semua aktivitas dalam satu kasus. Stempel waktu menjadi dasar process mining karena memungkinkan analisis berbasis waktu. Analisis ini mencakup penghitungan waktu siklus antaraktivitas, pencarian keterlambatan, analisis throughput proses, dan pengukuran kinerja terhadap perjanjian tingkat layanan (SLA). Mengapa ini penting Stempel waktu ini penting untuk menghitung semua metrik durasi, seperti waktu siklus dan hambatan, serta mengurutkan peristiwa secara kronologis. Sumber data Diambil dari berbagai kolom tanggal dan waktu di tabel SAP, seperti EKKO-AEDAT (Tanggal Perubahan), CDHDR-UDATE/UTIME (Stempel Waktu Log Perubahan), atau EKBE-BUDAT (Tanggal Pembukuan). Contoh 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Jenis dokumen DocumentType | Kode untuk mengklasifikasikan berbagai jenis pesanan pembelian. | ||
| Deskripsi Jenis Dokumen adalah pengaturan di SAP yang mengendalikan rentang nomor, pemilihan kolom, dan alur proses keseluruhan untuk pesanan pembelian. Misalnya, tersedia jenis berbeda untuk PO standar, PO jasa, atau pesanan pemindahan stok. Atribut ini berguna untuk analisis karena jenis dokumen yang berbeda sering mengikuti proses yang memang berbeda. Memfilter berdasarkan jenis dokumen memungkinkan perbandingan waktu siklus dan alur proses yang lebih setara. Mengapa ini penting Membedakan berbagai jenis proses pembelian, seperti standar, jasa, dan pengembalian, yang sering memiliki jalur dan target kinerja berbeda. Sumber data Tabel: EKKO, Kolom: BSART Contoh NBFOUB | |||
| Kelompok material MaterialGroup | Klasifikasi untuk mengelompokkan material atau jasa dengan karakteristik serupa. | ||
| Deskripsi Kelompok Material, atau kategori pembelian, digunakan untuk mengklasifikasikan jenis barang atau jasa yang dibeli. Contohnya 'Perangkat keras TI', 'Perlengkapan kantor', atau 'Jasa profesional'. Atribut ini penting untuk analisis belanja dan memahami pola pengadaan. Anda dapat memfilter proses untuk menganalisis cara penanganan setiap kategori, pihak yang menyetujuinya, dan vendor yang memasoknya. Atribut ini menjadi dimensi utama dalam dashboard 'Analisis Nilai Pesanan Pembelian'. Mengapa ini penting Memungkinkan proses dikelompokkan berdasarkan kategori produk atau jasa, sehingga perbedaan perilaku, waktu siklus, atau vendor untuk tiap jenis belanja dapat terlihat. Sumber data Tabel: EKPO, Kolom: MATKL Contoh 00101IT_HWCONSULT | |||
| Kode perusahaan CompanyCode | Pengenal badan hukum atau perusahaan yang melakukan pembelian. | ||
| Deskripsi Kode Perusahaan mewakili badan hukum independen di SAP. Semua transaksi dibukukan pada tingkat kode perusahaan, sehingga unit ini menjadi bagian dasar struktur organisasi. Analisis proses berdasarkan Kode Perusahaan memungkinkan perbandingan efisiensi pengadaan dan kepatuhan antarunit bisnis atau negara. Analisis ini membantu menemukan praktik baik yang dapat diterapkan di unit lain atau menunjukkan unit yang mengalami kendala dalam proses. Mengapa ini penting Menunjukkan badan hukum, sehingga kinerja proses dan kepatuhan dapat dibandingkan di berbagai bagian organisasi. Sumber data Tabel: EKKO, Kolom: BUKRS Contoh 10002100US01 | |||
| Nama pengguna UserName | ID pengguna yang menjalankan aktivitas. | ||
| Deskripsi Atribut ini mencatat nama pengguna SAP karyawan yang membuat, mengubah, atau menyetujui dokumen. Untuk langkah otomatis, atribut ini dapat menampilkan ID pengguna sistem atau batch. Analisis berdasarkan pengguna membantu menemukan kebutuhan pelatihan, karyawan berkinerja tinggi, atau potensi masalah kepatuhan. Atribut ini penting untuk membuat dashboard terkait distribusi beban kerja, kepatuhan terhadap matriks persetujuan, serta kinerja tim atau individu. Mengapa ini penting Mengaitkan tindakan pengguna dengan individu tertentu, sehingga kinerja, beban kerja, dan kepatuhan terhadap prosedur dapat dianalisis. Sumber data Tabel: EKKO, Kolom: ERNAM (Dibuat oleh); Tabel: CDHDR, Kolom: USERNAME (Diubah oleh). Contoh JSMITHMBROWNBATCH_USER | |||
| Nilai pesanan OrderAmount | Nilai total uang untuk item baris pesanan pembelian. | ||
| Deskripsi Atribut ini menunjukkan nilai total item baris tertentu pada pesanan pembelian, yang dihitung dari jumlah dikalikan harga neto. Untuk mengetahui nilai total PO, jumlahkan nilai semua item. Analisis proses berdasarkan nilai pesanan penting untuk menemukan transaksi bernilai tinggi yang mungkin memerlukan kontrol lebih ketat atau jalur persetujuan berbeda. Atribut ini mendukung dashboard 'Analisis Nilai Pesanan Pembelian' dan membantu memprioritaskan perbaikan proses pada pesanan dengan dampak keuangan terbesar. Mengapa ini penting Mengukur dampak keuangan setiap pembelian, sehingga analisis berdasarkan nilai dapat memprioritaskan pesanan bernilai tinggi atau menemukan peluang penghematan biaya. Sumber data Tabel: EKPO, Kolom: NETWR (Nilai Neto Pesanan). Contoh 1500.00250.7512345.50 | |||
| Nomor vendor VendorNumber | Pengenal unik untuk vendor atau pemasok. | ||
| Deskripsi Kode ini mengidentifikasi pemasok barang atau jasa secara unik. Kode ini merupakan bagian penting dari data induk dalam proses pengadaan. Atribut ini penting untuk analisis berdasarkan vendor. Anda dapat menilai kinerja pengiriman vendor, membandingkan waktu tunggu antar pemasok, dan menganalisis pola belanja. Atribut ini menjadi dimensi utama untuk dashboard 'Kinerja Pengiriman Vendor'. Mengapa ini penting Memungkinkan analisis kinerja vendor untuk menemukan pemasok yang andal dan pemasok yang menyebabkan keterlambatan atau masalah kualitas. Sumber data Tabel: EKKO, Kolom: LIFNR Contoh 100345V-20598700112 | |||
| Alasan Penolakan RejectionReason | Kode atau keterangan yang menjelaskan alasan permintaan pembelian atau pesanan ditolak. | ||
| Deskripsi Atribut ini mencatat alasan spesifik yang diberikan saat PO ditolak dalam alur persetujuan. Informasi ini penting untuk memahami penyebab utama pengerjaan ulang dan keterlambatan. Analisis alasan penolakan membantu menemukan masalah yang sering terjadi, seperti harga yang keliru, anggaran terlampaui, atau pemilihan pemasok yang tidak sesuai ketentuan. Dengan informasi ini, perusahaan dapat menangani penyebab utama, meningkatkan kualitas pembuatan PO sejak awal, dan memperlancar proses persetujuan. Mengapa ini penting Menunjukkan secara langsung alasan persetujuan gagal. Dengan begitu, Anda dapat melakukan perbaikan yang tepat sasaran untuk mengurangi pengerjaan ulang dan mempersingkat waktu siklus persetujuan. Sumber data Informasi ini mungkin sulit ditemukan. Data dapat tersimpan di kolom teks panjang atau bergantung pada konfigurasi workflow khusus. Biasanya, Anda memerlukan pengetahuan khusus tentang penerapannya. Contoh Harga tidak sesuaiAnggaran terlampauiPermintaan duplikat | |||
| Apakah Ada Perubahan Setelah Persetujuan IsPostApprovalChange | Penanda yang menunjukkan apakah PO berubah setelah persetujuan awal. | ||
| Deskripsi Atribut boolean ini bernilai true jika aktivitas 'Purchase Order Changed' terdeteksi setelah aktivitas 'Purchase Order Approved' untuk PO yang sama. Atribut ini membantu mengidentifikasi perubahan bermasalah yang terjadi pada tahap akhir proses. Kolom hasil perhitungan ini mendukung KPI 'Post-Approval PO Change Rate' dan dashboard 'Purchase Order Rework and Changes'. Atribut ini membantu mengukur dan menyoroti perubahan yang mengganggu proses, menyebabkan keterlambatan, dan memerlukan persetujuan ulang. Perubahan tersebut dapat menunjukkan masalah pada spesifikasi awal atau penentuan ruang lingkup. Mengapa ini penting Mengukur langsung pengerjaan ulang setelah persetujuan, salah satu KPI penting untuk menilai stabilitas dan efisiensi proses. Angka yang tinggi menunjukkan masalah pada perumusan kebutuhan di tahap awal. Sumber data Atribut ini dihitung dari urutan aktivitas dalam log peristiwa. Contoh truefalse | |||
| Apakah Pengiriman Tepat Waktu IsOnTimeDelivery | Penanda yang menunjukkan apakah barang diterima pada atau sebelum tanggal pengiriman yang diminta. | ||
| Deskripsi Atribut boolean ini bernilai true jika stempel waktu aktivitas 'Goods Receipt Posted' jatuh pada atau sebelum 'Requested Delivery Date'. Atribut ini memberikan hasil yang jelas, ya atau tidak, untuk kinerja pengiriman setiap baris item PO. Atribut ini menjadi dasar KPI 'On-Time Goods Receipt Rate'. Anda dapat menggunakannya untuk menyederhanakan analisis kinerja pemasok dan efisiensi penerimaan internal, serta mengelompokkan dan memfilter pengiriman yang tepat waktu atau terlambat. Mengapa ini penting Memberikan ukuran yang jelas untuk menilai ketepatan waktu pengiriman, sekaligus mendukung KPI dan dashboard kinerja pemasok. Sumber data Atribut ini dihitung dengan membandingkan tanggal pencatatan penerimaan barang (EKBE-BUDAT) dengan tanggal pengiriman yang diminta (EKPO-EINDT). Contoh truefalse | |||
| Grup pembelian PurchasingGroup | Pembeli atau kelompok pembeli yang bertanggung jawab atas kegiatan pengadaan. | ||
| Deskripsi Grup Pembelian mewakili individu atau tim pembeli yang bertanggung jawab atas kegiatan pembelian tertentu. Mereka menjadi kontak utama bagi vendor. Atribut ini memungkinkan analisis yang lebih terperinci daripada Organisasi Pembelian. Atribut ini membantu memahami pembagian beban kerja antar pembeli dan menemukan perbedaan kinerja di tingkat pembeli, sebagai dasar untuk mengalokasikan sumber daya dan merencanakan pelatihan. Mengapa ini penting Memberikan gambaran terperinci tentang pihak yang bertanggung jawab atas pembelian. Informasi ini mendukung analisis beban kerja dan kinerja pada tingkat pembeli atau tim. Sumber data Tabel: EKKO, Kolom: EKGRP Contoh 001002N01 | |||
| Mata uang Currency | Kode mata uang untuk nilai pesanan pembelian. | ||
| Deskripsi Atribut ini menunjukkan mata uang yang digunakan untuk menyatakan nilai pesanan pembelian, seperti USD, EUR, atau GBP. Informasi ini memberi konteks penting untuk semua nilai uang. Bagi organisasi global, mata uang diperlukan agar analisis keuangan akurat. Atribut ini memungkinkan nilai pesanan dijumlahkan dan dibandingkan dengan benar. Semua KPI keuangan harus ditafsirkan sesuai mata uangnya. Mengapa ini penting Memberi konteks yang diperlukan untuk semua nilai uang dan mendukung analisis keuangan yang akurat, terutama di organisasi multinasional. Sumber data Tabel: EKKO, Kolom: WAERS Contoh USDEURJPY | |||
| Nama vendor VendorName | Nama resmi vendor atau pemasok. | ||
| Deskripsi Nama vendor yang lebih mudah dikenali daripada nomor vendor. Biasanya, nama ini diambil dari data induk vendor. Nomor Vendor digunakan untuk menghubungkan data dan mengidentifikasi vendor secara unik. Nama Vendor penting untuk dashboard dan laporan yang dilihat pengguna. Nama ini membuat analisis lebih mudah dipahami oleh pengguna bisnis yang mungkin tidak mengenal kode vendor. Mengapa ini penting Menampilkan nama vendor yang mudah dikenali, sehingga dashboard dan laporan lebih mudah dipahami pengguna bisnis. Sumber data Tabel: LFA1, Kolom: NAME1. Data ini memerlukan penggabungan EKKO-LIFNR dengan LFA1-LIFNR. Contoh Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organisasi pembelian PurchasingOrganization | Unit organisasi yang bertanggung jawab menegosiasikan harga dan membeli material atau jasa. | ||
| Deskripsi Organisasi Pembelian adalah unit organisasi utama di SAP yang bertanggung jawab atas kegiatan pengadaan. Unit ini dapat terpusat untuk seluruh perusahaan atau dibagi berdasarkan pabrik maupun wilayah. Analisis kinerja proses berdasarkan Organisasi Pembelian membantu menemukan tim pengadaan yang paling efisien. Anda dapat membandingkan metrik seperti waktu siklus, tingkat pengerjaan ulang, dan biaya antarunit organisasi, lalu melihat praktik baik dan area yang memerlukan dukungan. Mengapa ini penting Menunjukkan tim pengadaan yang bertanggung jawab, sehingga kinerja dapat dibandingkan dan dianalisis antarunit organisasi. Sumber data Tabel: EKKO, Kolom: EKORG Contoh 1000US01DE01 | |||
| Pabrik Plant | Lokasi fisik atau pabrik tempat barang akan dikirim. | ||
| Deskripsi Pabrik adalah unit organisasi yang mewakili fasilitas produksi, gudang, atau lokasi lain tempat barang atau jasa diterima. Analisis berdasarkan pabrik membantu Anda memahami perbedaan proses pengadaan antarwilayah. Analisis ini dapat menunjukkan perbedaan waktu pengiriman pemasok ke lokasi tertentu atau mengungkap pabrik dengan proses penerimaan yang tidak efisien. Informasi ini mendukung analisis ketepatan waktu penerimaan barang. Mengapa ini penting Menentukan lokasi pengiriman. Informasi ini berguna untuk menganalisis perbedaan proses antarwilayah dan kinerja logistik. Sumber data Tabel: EKPO, Kolom: WERKS Contoh 100011002000 | |||
| Pembaruan data terakhir LastDataUpdate | Stempel waktu yang menunjukkan kapan data terakhir kali diperbarui dari sistem sumber. | ||
| Deskripsi Atribut ini mencatat tanggal dan waktu ekstraksi atau pembaruan data terbaru. Informasi ini memberi konteks tentang seberapa baru data yang dianalisis. Menampilkan informasi ini di dashboard penting agar pengguna tahu apakah wawasan didasarkan pada data yang hampir real-time atau rekam data historis. Informasi ini membantu mengatur ekspektasi pengguna dan memastikan keputusan dibuat berdasarkan data dengan usia yang diketahui. Mengapa ini penting Memberi tahu pengguna seberapa baru data yang tersedia, sehingga mereka memahami apakah analisis mencerminkan kondisi operasional terkini. Sumber data Stempel waktu ini dibuat dan ditambahkan oleh proses ekstraksi data atau ETL saat dijalankan. Contoh 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Permintaan pembelian PurchaseRequisition | Pengenal permintaan pembelian yang dibuat sebelum pesanan pembelian. | ||
| Deskripsi Atribut ini menghubungkan pesanan pembelian dengan permintaan pembelian asalnya. Tidak semua PO memiliki permintaan pembelian sebelumnya. Tautan ini penting untuk menganalisis dashboard 'Konversi Permintaan menjadi Pesanan' dan KPI 'Tingkat Konversi PR ke PO'. Anda dapat mengukur efisiensi proses di tahap awal, mulai dari permintaan hingga pesanan resmi dibuat, serta menemukan PO yang dibuat tanpa permintaan sebelumnya dan tidak mematuhi prosedur. Mengapa ini penting Menghubungkan PO dengan permintaan asalnya, sehingga proses konversi PR ke PO dapat dianalisis dan PO yang dibuat tanpa permintaan sebelumnya dapat ditemukan. Sumber data Tabel: EKPO, Kolom: BANFN Contoh 1001589010015891 | |||
| Sistem sumber SourceSystem | Sistem tempat data diambil. | ||
| Deskripsi Atribut ini menunjukkan asal data, yang biasanya berupa pengenal instans SAP ECC, misalnya 'ECC_PROD_100'. Jika ada beberapa sistem, atribut ini membantu membedakan sumber data. Untuk tata kelola dan penelusuran asal data, mengetahui sistem sumber sangat penting. Informasi ini membantu menjaga integritas data dan mengatasi masalah ekstraksi atau kualitas data, terutama saat data digabungkan dari beberapa sistem atau modul ERP. Mengapa ini penting Menunjukkan asal data. Informasi ini penting untuk tata kelola data, validasi, dan pengelolaan analisis di beberapa sistem. Sumber data Biasanya berupa nilai tetap yang ditambahkan selama proses ekstraksi data untuk menandai sistem asal dataset. Contoh SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Tanggal pengiriman yang diminta RequestedDeliveryDate | Tanggal saat bisnis meminta vendor mengirimkan barang atau jasa. | ||
| Deskripsi Ini adalah tanggal target pengiriman yang tercantum dalam pesanan pembelian. Tanggal ini menjadi acuan untuk mengukur kinerja pengiriman aktual. Tanggal ini penting untuk menghitung KPI 'Tingkat Penerimaan Barang Tepat Waktu'. Dengan membandingkan tanggal penerimaan barang aktual dengan tanggal yang diminta, organisasi dapat mengukur keandalan vendor dan efisiensi penerimaan internal. Hasilnya mendukung dashboard 'Kinerja Pengiriman Vendor'. Mengapa ini penting Tanggal ini menjadi target pengiriman dan penting untuk menghitung KPI ketepatan waktu serta menilai keandalan vendor. Sumber data Tabel: EKPO, Kolom: EINDT Contoh 2023-06-102023-07-222023-08-01 | |||
Aktivitas Purchase to Pay, Pesanan Pembelian
| Aktivitas | Deskripsi | ||
|---|---|---|---|
| Penerimaan barang dibukukan | Aktivitas ini menandai penerimaan fisik barang dari vendor berdasarkan pesanan pembelian tertentu. Pembukuan penerimaan barang adalah tindakan eksplisit, misalnya melalui transaksi MIGO, yang membuat dokumen material dan memperbarui persediaan. | ||
| Mengapa ini penting Ini adalah tonggak penting untuk melacak kinerja pengiriman vendor dan awal proses verifikasi faktur. Data ini digunakan untuk menghitung tingkat ketepatan waktu pengiriman dan ketepatan waktu penerimaan barang. Sumber data Tercatat saat dokumen material dibuat. Stempel waktu peristiwa menggunakan tanggal pembukuan (MKPF-BUDAT) atau tanggal pembuatan (MKPF-CPUDT) dari tabel header dokumen material (MKPF), yang terhubung ke PO melalui tabel item (MSEG). Pengumpulan data Gunakan stempel waktu pembukuan atau pembuatan dari tabel MKPF untuk dokumen material yang merujuk ke PO. Jenis peristiwa explicit | |||
| Permintaan pembelian dibuat | Aktivitas ini menandai pembuatan permintaan resmi untuk barang atau jasa. Peristiwa ini tercatat secara eksplisit saat pengguna menyimpan dokumen permintaan pembelian baru, misalnya melalui transaksi ME51N. Tindakan ini membuat catatan unik di tabel EBAN. | ||
| Mengapa ini penting Ini adalah titik awal utama proses pengadaan. Dengan menganalisis waktu dari peristiwa ini hingga pesanan pembelian dibuat, Anda dapat mengukur efisiensi proses mengubah kebutuhan internal menjadi pesanan yang siap ditindaklanjuti. Sumber data Peristiwa ini tercatat saat entri dibuat di tabel header Permintaan Pembelian (EBAN). Tanggal pembuatan (EBAN-BADAT) dan waktunya menjadi stempel waktu peristiwa. Pengumpulan data Temukan entri baru di tabel EBAN berdasarkan tanggal pembuatan. Jenis peristiwa explicit | |||
| Pesanan pembelian dibuat | Aktivitas ini menandai pembuatan dokumen pesanan pembelian resmi yang menjadi kontrak mengikat dengan vendor. Peristiwa ini tercatat secara eksplisit saat pengguna membuat dan menyimpan PO, misalnya melalui transaksi ME21N. Tindakan ini menghasilkan entri di tabel EKKO dan EKPO. | ||
| Mengapa ini penting Menandai awal resmi siklus hidup pesanan pembelian. Ini menjadi tonggak penting untuk mengukur waktu konversi PR ke PO dan waktu pemenuhan pesanan dari awal hingga akhir. Sumber data Diambil dari tanggal pembuatan (EKKO-AEDAT) di tabel header Pesanan Pembelian (EKKO) untuk nomor PO terkait (EKKO-EBELN). Pengumpulan data Gunakan stempel waktu pembuatan dari tabel EKKO untuk setiap Pesanan Pembelian baru. Jenis peristiwa explicit | |||
| Pesanan pembelian dikirim ke vendor | Aktivitas ini menandai saat pesanan pembelian yang telah disetujui resmi dikirim ke vendor, misalnya melalui EDI, email, atau cetak. Peristiwa ini tercatat secara eksplisit di tabel kontrol pesan saat pesan keluaran berhasil diproses. | ||
| Mengapa ini penting Ini adalah tonggak penting yang memulai penghitungan waktu tunggu vendor. Menganalisis waktu dari peristiwa ini hingga barang diterima penting untuk menilai kinerja vendor dan ketepatan waktu pengiriman. Sumber data Tercatat di tabel status pesan (NAST). Stempel waktu dapat diambil dari NAST-DATVR dan NAST-UHRVR saat status pemrosesan (NAST-VSTAT) bernilai '1' (berhasil diproses) untuk jenis keluaran PO terkait. Pengumpulan data Gunakan stempel waktu pemrosesan dari tabel NAST untuk pesan keluaran PO. Jenis peristiwa explicit | |||
| Pesanan pembelian disetujui | Menandai persetujuan akhir atas pesanan pembelian, yang mengizinkannya dikirim ke vendor. Tonggak penting ini biasanya disimpulkan dari perubahan status rilis PO menjadi 'dirilis sepenuhnya' atau 'disetujui'. | ||
| Mengapa ini penting Aktivitas ini penting untuk menghitung KPI waktu siklus persetujuan PO dan menemukan hambatan dalam workflow persetujuan. Persetujuan ini menjadi prasyarat bagi sebagian besar aktivitas berikutnya, seperti mengirim pesanan ke vendor. Sumber data Disimpulkan dengan melacak log perubahan (CDHDR/CDPOS) untuk tabel header Pesanan Pembelian (EKKO), guna mengetahui kapan kode rilis akhir diterapkan atau indikator status rilis keseluruhan (EKKO-FRGKE) diatur ke 'dirilis'. Pengumpulan data Temukan stempel waktu saat status rilis keseluruhan PO (EKKO-FRGKE) berubah menjadi status persetujuan akhir. Jenis peristiwa inferred | |||
| Pesanan pembelian selesai | Menandakan bahwa item pesanan pembelian dianggap telah dikirim sepenuhnya. Peristiwa ini disimpulkan, biasanya dari indikator 'Pengiriman Selesai' yang diatur secara otomatis atau manual pada item pesanan pembelian. | ||
| Mengapa ini penting Aktivitas ini menjadi titik akhir logis untuk tahap pemenuhan pesanan. Data ini penting untuk menghitung waktu siklus PO dari awal hingga akhir, sejak dibuat sampai selesai. Sumber data Disimpulkan dari dokumen perubahan (CDHDR/CDPOS) yang mencatat kapan indikator 'Pengiriman Selesai' (EKPO-ELIKZ) diatur ke 'X' untuk item PO. Item terakhir yang ditandai selesai dapat menandakan bahwa seluruh PO telah selesai. Pengumpulan data Temukan stempel waktu di dokumen perubahan saat penanda EKPO-ELIKZ diatur. Jenis peristiwa inferred | |||
| Barang dikembalikan | Menandai pengembalian barang yang sebelumnya diterima kepada vendor, biasanya karena masalah kualitas atau pengiriman yang tidak sesuai. Peristiwa ini tercatat secara eksplisit saat dokumen material dibukukan dengan jenis pergerakan khusus untuk pengembalian. | ||
| Mengapa ini penting Aktivitas ini menunjukkan masalah kualitas vendor atau ketepatan pesanan dan menjadi indikator penting pengerjaan ulang proses. Data ini penting untuk menghitung KPI tingkat selisih penerimaan barang. Sumber data Tercatat di tabel dokumen material (MKPF/MSEG) saat jenis pergerakan pengembalian digunakan, misalnya '122' untuk Pengembalian Pengiriman ke Vendor. Tanggal pembukuan (MKPF-BUDAT) menjadi stempel waktunya. Pengumpulan data Temukan dokumen material dengan jenis pergerakan pengembalian, misalnya 122, yang merujuk ke PO asli. Jenis peristiwa explicit | |||
| Konfirmasi jasa dimasukkan | Untuk pesanan pembelian jasa, aktivitas ini menandai konfirmasi bahwa jasa telah diberikan. Peristiwa ini tercatat secara eksplisit saat Lembar Entri Jasa dibuat, misalnya melalui transaksi ML81N. | ||
| Mengapa ini penting Ini setara dengan penerimaan barang untuk jasa dan penting untuk melacak pemenuhan pesanan jasa. Peristiwa ini memicu proses pembayaran jasa. Sumber data Diambil dari tanggal pembuatan (ESSR-ERDAT) di tabel header Lembar Entri Jasa (ESSR). Tautan ke pesanan pembelian terdapat di tabel ESLL. Pengumpulan data Gunakan stempel waktu pembuatan dari tabel ESSR untuk lembar entri jasa yang terhubung ke PO. Jenis peristiwa explicit | |||
| Pemeriksaan kualitas dilakukan | Menandakan bahwa barang yang diterima telah menjalani pemeriksaan kualitas. Aktivitas ini biasanya disimpulkan saat lot inspeksi yang dibuat ketika barang diterima memiliki keputusan penggunaan di modul Quality Management. | ||
| Mengapa ini penting Untuk industri yang sangat mengutamakan kualitas, aktivitas ini membantu menganalisis durasi dan hasil pemeriksaan. Keterlambatan dapat menimbulkan hambatan antara penerimaan barang dan ketersediaannya untuk digunakan. Sumber data Disimpulkan dari modul Quality Management. Lot inspeksi dibuat di tabel QALS saat barang diterima. Aktivitas ini ditandai dengan pembuatan keputusan penggunaan di tabel QAVE, yang mencakup stempel waktu. Pengumpulan data Temukan stempel waktu keputusan penggunaan di tabel QAVE untuk lot inspeksi yang terhubung ke dokumen material. Jenis peristiwa inferred | |||
| Permintaan pembelian disetujui | Menandai persetujuan resmi atas permintaan pembelian, yang mengizinkannya untuk diubah menjadi pesanan pembelian. Peristiwa ini disimpulkan dari perubahan pada kolom status rilis dalam data permintaan pembelian, sesuai catatan workflow strategi rilis SAP. | ||
| Mengapa ini penting Melacak persetujuan penting untuk menemukan hambatan sebelum pemesanan dan memastikan kepatuhan terhadap kebijakan persetujuan. Keterlambatan pada tahap ini langsung memengaruhi durasi keseluruhan siklus pengadaan. Sumber data Disimpulkan dari log perubahan tabel Permintaan Pembelian (EBAN), khususnya perubahan pada kolom status rilis, seperti EBAN-FRGZU, atau dari analisis dokumen perubahan di CDHDR/CDPOS untuk objek EBAN. Pengumpulan data Pantau dokumen perubahan pada kolom status rilis EBAN untuk mengetahui stempel waktu persetujuan akhir. Jenis peristiwa inferred | |||
| Persetujuan pesanan pembelian diminta | Menandakan bahwa pesanan pembelian yang baru dibuat atau diubah telah diajukan untuk disetujui sesuai strategi rilis yang dikonfigurasi. Peristiwa ini disimpulkan saat strategi rilis dipicu dan PO berstatus menunggu persetujuan. | ||
| Mengapa ini penting Membedakan waktu pembuatan PO dari awal proses persetujuan membantu mengukur KPI waktu siklus persetujuan dengan tepat. Ini juga menunjukkan jeda sebelum workflow persetujuan dimulai. Sumber data Disimpulkan dari dokumen perubahan (CDHDR/CDPOS) untuk Pesanan Pembelian (objek EINKBELEG) yang menunjukkan pengaturan awal status rilis, atau saat status rilis keseluruhan (EKKO-FRGKE) pertama kali diatur ke nilai yang menandakan proses persetujuan sedang berlangsung. Pengumpulan data Temukan entri dokumen perubahan pertama yang memicu strategi rilis untuk PO. Jenis peristiwa inferred | |||
| Pesanan pembelian dihapus | Menandai pembatalan atau penghapusan logis item pesanan pembelian, sehingga item tersebut tidak dapat diproses lebih lanjut, misalnya untuk penerimaan barang atau penagihan. Peristiwa ini disimpulkan saat indikator penghapusan diatur pada item PO. | ||
| Mengapa ini penting Ini adalah aktivitas akhir yang menandakan pesanan dibatalkan. Menganalisis alasan dan waktu penghapusan pesanan dapat mengungkap masalah dalam perencanaan kebutuhan atau pemilihan vendor. Sumber data Disimpulkan dari dokumen perubahan (CDHDR/CDPOS) yang menunjukkan indikator penghapusan (EKPO-LOEKZ) diatur ke 'L' untuk item pesanan pembelian. Pengumpulan data Temukan stempel waktu di dokumen perubahan saat penanda EKPO-LOEKZ diatur. Jenis peristiwa inferred | |||
| Pesanan pembelian ditolak | Aktivitas ini terjadi saat pemberi persetujuan menolak pesanan pembelian dalam workflow persetujuan. Peristiwa ini disimpulkan dari perubahan status pada data strategi rilis PO yang menunjukkan penolakan. | ||
| Mengapa ini penting Melacak penolakan membantu menemukan masalah kualitas data PO, ketidakpatuhan terhadap kebijakan, atau kendala pada matriks persetujuan. Penolakan sering memicu pengerjaan ulang dan memperpanjang waktu siklus secara keseluruhan. Sumber data Disimpulkan dari dokumen perubahan (CDHDR/CDPOS) untuk status rilis pesanan pembelian. Penolakan biasanya tercatat saat kode rilis dibatalkan atau status penolakan tertentu ditetapkan. Pengumpulan data Pantau log perubahan untuk mengetahui pembatalan kode rilis atau perubahan status yang menandakan penolakan. Jenis peristiwa inferred | |||
| Pesanan pembelian diubah | Menandai setiap perubahan pada pesanan pembelian setelah pertama kali dibuat, seperti perubahan jumlah, harga, atau tanggal pengiriman. Perubahan ini tercatat secara eksplisit di sistem dokumen perubahan SAP. | ||
| Mengapa ini penting Perubahan yang sering terjadi, terutama setelah persetujuan, dapat menandakan proses yang tidak efisien, perencanaan awal yang kurang matang, atau perubahan lingkup. Aktivitas ini penting untuk dashboard Pengerjaan Ulang dan Perubahan PO serta KPI terkait. Sumber data Tercatat secara eksplisit di tabel header dokumen perubahan (CDHDR) dan item (CDPOS) untuk objek Pesanan Pembelian (EINKBELEG). Setiap perubahan membuat entri baru dengan stempel waktu. Pengumpulan data Ekstrak peristiwa perubahan dan stempel waktunya dari tabel CDHDR dan CDPOS yang terhubung ke nomor Pesanan Pembelian. Jenis peristiwa explicit | |||
Panduan Ekstraksi
Langkah
- Buat program ABAP: Buka ABAP Editor menggunakan kode transaksi SE38. Masukkan nama program baru, misalnya Z_PM_PO_EXTRACT, lalu klik 'Create'. Isi judul, misalnya 'Ekstraksi data pesanan pembelian Process Mining', dan atur jenisnya ke 'Executable Program'.
- Tentukan layar pilihan: Tentukan parameter layar pilihan di dalam program. Parameter ini memungkinkan pengguna memfilter data yang akan diekstrak. Parameter utama mencakup rentang tanggal pembuatan pesanan pembelian, Company Code (BUKRS), dan Purchasing Document Type (BSART).
- Tentukan struktur data: Deklarasikan struktur tabel internal yang sesuai dengan format akhir log peristiwa. Struktur ini harus mencakup semua atribut wajib dan yang disarankan: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, dan DocumentType.
- Terapkan logika pemilihan data: Tulis logika ABAP utama untuk memilih data bagi masing-masing dari 14 aktivitas yang diperlukan. Proses ini melibatkan kueri ke beberapa tabel SAP, seperti EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS, dan NAST. Gunakan subrutin terpisah (PERFORM) untuk setiap aktivitas agar kode tetap teratur.
- Pilih data permintaan pembelian: Kueri tabel EBAN untuk peristiwa 'Purchase Requisition Created', lalu hubungkan dengan pesanan pembelian melalui tabel EKPO. Gunakan tabel log perubahan (CDHDR, CDPOS) untuk mengidentifikasi peristiwa 'Purchase Requisition Approved' dengan melacak perubahan pada kolom status pelepasan.
- Pilih peristiwa utama pesanan pembelian: Kueri tabel EKKO dan EKPO untuk peristiwa 'Purchase Order Created'. Gunakan tabel log perubahan (CDHDR, CDPOS) pada objek EINKBELEG untuk mengambil peristiwa 'Purchase Order Changed', 'Purchase Order Approved', 'Purchase Order Rejected', 'Purchase Order Completed', dan 'Purchase Order Deleted' berdasarkan perubahan pada kolom tertentu, seperti indikator pelepasan dan tanda penghapusan.
- Pilih peristiwa komunikasi pesanan pembelian: Kueri tabel NAST untuk menemukan catatan yang menunjukkan pesanan pembelian berhasil dikirim. Catat aktivitas 'Purchase Order Sent to Vendor'.
- Pilih peristiwa barang dan jasa: Kueri tabel EKBE untuk menemukan pencatatan dokumen material dan mengidentifikasi aktivitas 'Goods Receipt Posted' serta 'Goods Returned' berdasarkan kategori jenis pergerakan. Kueri ESSR dan ESLL untuk lembar entri jasa dan mencatat 'Services Confirmation Entered'.
- Pilih peristiwa manajemen kualitas: Jika modul Quality Management digunakan, kueri tabel QALS dan QAVE untuk menemukan waktu keputusan penggunaan dibuat bagi lot inspeksi yang terkait dengan pesanan pembelian. Catat sebagai aktivitas 'Quality Inspection Performed'.
- Gabungkan dan format data: Gabungkan data dari semua pemilihan ke dalam satu tabel internal akhir. Pastikan kolom EventTime menggunakan format yang konsisten, misalnya YYYY-MM-DDTHH:MI:SS.
- Tambahkan fungsi unduh file: Tambahkan fungsi untuk mengunduh tabel internal akhir sebagai file. Format yang disarankan adalah file berbatas tab atau CSV, yang dapat dibuat menggunakan modul fungsi GUI_DOWNLOAD.
- Jalankan dan simpan: Jalankan program menggunakan transaksi SE38 atau SA38. Isi kriteria pilihan, lalu jalankan laporan. Saat diminta, simpan file keluaran ke komputer Anda dengan ekstensi .csv agar siap diunggah.
Konfigurasi
- Rentang Tanggal: Tentukan rentang tanggal ekstraksi secara spesifik, biasanya berdasarkan tanggal pembuatan Pesanan Pembelian (EKKO-AEDAT). Rentang 3-6 bulan sering menjadi titik awal yang baik untuk menyeimbangkan volume data dan wawasan proses.
- Company Code (BUKRS): Filter berdasarkan satu atau beberapa company code agar ekstraksi hanya mencakup badan hukum yang relevan. Parameter ini penting untuk menjaga kinerja dan relevansi data.
- Purchasing Document Type (BSART): Filter berdasarkan jenis dokumen tertentu, misalnya 'NB' untuk PO standar, agar analisis berfokus pada proses standar dan mengecualikan jenis pengadaan khusus jika diperlukan.
- Perincian Data: Ekstraksi ini dirancang untuk tingkat item pesanan pembelian. Case ID adalah nomor Pesanan Pembelian (EBELN). Semua peristiwa, termasuk yang terjadi pada tingkat item seperti penerimaan barang, ditautkan ke Case ID utama ini.
- Pertimbangan Kinerja: Untuk kumpulan data besar, jadwalkan program sebagai pekerjaan latar belakang (SM36) agar tidak terjadi kesalahan batas waktu. Pastikan indeks basis data tersedia pada kolom utama yang digunakan dalam klausa WHERE, terutama pada tabel seperti CDHDR dan CDPOS.
- Prasyarat: Pengguna yang menjalankan laporan harus memiliki otorisasi untuk mengakses ABAP workbench (SE38) dan hak untuk menjalankan program. Pengguna juga memerlukan akses baca ke semua tabel terkait, termasuk EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR, dan tabel QM.
Contoh kueri abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. Langkah
- Siapkan koneksi database: Dapatkan kredensial hanya-baca dan detail koneksi (nama host, port, nama database) untuk database SAP ECC. Pastikan alat klien yang diperlukan, seperti DBeaver, SQL Developer, atau SSMS, sudah terpasang.
- Identifikasi skema SAP: Hubungkan ke database dan cari skema SAP utama tempat tabel berada. Nama yang umum digunakan antara lain SAPSR3, SAPHANADB, atau nama khusus sistem lainnya. Jika skema tersebut bukan skema default untuk pengguna Anda, tambahkan nama skema di depan setiap nama tabel dalam kueri.
- Tinjau kueri SQL: Buka skrip SQL yang disediakan di alat klien Anda. Kueri ini dirancang untuk mengekstrak 14 aktivitas berbeda dari proses Purchase-to-Pay dengan menggabungkan beberapa tabel SAP.
- Sesuaikan parameter kueri: Cari Common Table Expression (CTE) PO_BASE di awal skrip. Ubah nilai placeholder untuk menentukan cakupan ekstraksi:
- [START_DATE] dan [END_DATE]: Tentukan rentang tanggal analisis, misalnya '20230101' dan '20230630'. Sebaiknya gunakan filter pada kolom AEDAT (Changed On).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Tentukan kode perusahaan SAP yang akan disertakan.
- [DOC_TYPE_1], [DOC_TYPE_2]: Tentukan jenis dokumen PO yang akan disertakan.
- [Your SAP Schema]: Ganti placeholder ini dengan nama skema SAP Anda di seluruh skrip.
- Jalankan kueri: Jalankan skrip SQL yang sudah disesuaikan pada database SAP. Waktu eksekusi bergantung pada rentang tanggal, volume data, dan kinerja database.
- Periksa hasil: Setelah kueri selesai, tinjau hasilnya secara singkat. Pastikan jumlah baris masuk akal dan kolom penting seperti PurchaseOrder, Activity, dan EventTime terisi sesuai harapan.
- Ekspor data ke CSV: Ekspor seluruh hasil kueri dari klien SQL ke file CSV. Gunakan encoding UTF-8 agar karakter tidak bermasalah.
- Siapkan data untuk diunggah: Pastikan judul kolom di file CSV sama persis dengan nama atribut yang diwajibkan: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentType.
- Unggah ke alat process mining: Unggah file CSV akhir ke aplikasi process mining Anda untuk dianalisis dan divisualisasikan.
Konfigurasi
- Prasyarat: Anda memerlukan akses langsung hanya-baca ke basis data SAP ECC. Pengguna harus memiliki otorisasi yang memadai untuk mengueri tabel seperti EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS, dan NAST.
- Filter Rentang Tanggal: Terapkan filter rentang tanggal untuk membatasi volume data. Memfilter EKKO.AEDAT (Tanggal Perubahan PO) untuk periode 3-6 bulan merupakan titik awal yang umum. Rentang tanggal yang terlalu panjang dapat membuat kueri berjalan sangat lama.
- Filter Data Utama: Selalu filter EKKO.BUKRS (Company Code) dan EKKO.BSART (Document Type) agar analisis tetap terarah. Filter ini membatasi cakupan pada badan hukum dan proses bisnis yang relevan.
- Pertimbangan Kinerja: Kueri ini menggabungkan beberapa tabel besar, termasuk tabel riwayat perubahan (CDHDR, CDPOS), sehingga dapat menggunakan banyak sumber daya. Sebaiknya jalankan ekstraksi di luar jam sibuk atau pada basis data replika nonproduksi agar kinerja sistem tidak terganggu.
- Pencatatan Dokumen Perubahan: Keakuratan aktivitas seperti 'Approved', 'Rejected', 'Completed', dan 'Changed' bergantung pada aktifnya pencatatan dokumen perubahan untuk kolom terkait di SAP. Pastikan administrator SAP mengaktifkan pencatatan ini melalui transaksi SCDO.
Contoh kueri sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator Langkah
- Prasyarat dan koneksi: Pastikan alat ETL pihak ketiga Anda sudah dilengkapi konektor bersertifikasi SAP dan lisensinya aktif. Di konsol administrasi alat ETL, buat koneksi baru ke sistem SAP ECC. Anda memerlukan host server aplikasi, nomor sistem, ID klien, serta akun pengguna SAP khusus dengan otorisasi RFC dan izin baca tabel yang sesuai.
- Identifikasi tabel sumber: Di tugas ETL atau alur data, tetapkan tabel SAP yang diperlukan sebagai sumber data. Tabel utama meliputi EKKO (PO Header), EKPO (PO Item), EBAN (Purchase Requisition), CDHDR (Change Document Header), CDPOS (Change Document Item), MSEG (Document Segment: Material), MKPF (Material Document Header), NAST (Message Status), ESSR (Service Entry Sheet Header), dan QALS (Inspection Lot).
- Ekstrak 'Purchase Order Created': Buat alur data dengan sumber dari tabel EKKO. Filter data berdasarkan rentang tanggal yang diinginkan, misalnya menggunakan AEDAT, dan cakupan organisasi, misalnya BUKRS untuk Company Code dan BSART untuk Document Type. Petakan EKKO.EBELN ke PurchaseOrder, 'Purchase Order Created' ke Activity, lalu gabungkan AEDAT dan ERZET untuk mengisi EventTime. Petakan juga atribut lain yang diwajibkan.
- Ekstrak 'Goods Receipt Posted': Buat alur data terpisah dari MSEG dan gabungkan dengan MKPF menggunakan MBLNR dan MJAHR. Filter jenis pergerakan yang relevan, seperti '101'. Petakan MSEG.EBELN ke PurchaseOrder, 'Goods Receipt Posted' ke Activity, lalu gunakan MKPF.CPUDT dan MKPF.CPUTM untuk mengisi EventTime.
- Ekstrak peristiwa berdasarkan perubahan (persetujuan, perubahan, penghapusan): Buat alur data dari CDHDR dan CDPOS, lalu gabungkan keduanya menggunakan CHANGENR. Sumber data ini dapat digunakan untuk menghasilkan beberapa aktivitas.
- Filter OBJECTCLAS = 'EINKBELEG' dan TABNAME = 'EKPO'.
- Untuk 'Purchase Order Approved', filter perubahan pada kolom status persetujuan, misalnya FNAME = 'FRGZU', dengan nilai baru (VALUE_NEW) yang menandakan persetujuan akhir.
- Untuk 'Purchase Order Deleted', filter perubahan pada indikator penghapusan (FNAME = 'LOEKZ') dengan nilai baru 'L'.
- Untuk 'Purchase Order Changed', filter perubahan pada kolom lain yang relevan, kecuali kolom status khusus yang digunakan untuk aktivitas lain.
- Untuk semua peristiwa ini, gunakan CDHDR.UDATE dan CDHDR.UTIME sebagai EventTime.
- Ekstrak peristiwa 'Purchase Requisition': Buat alur data dari EBAN untuk 'Purchase Requisition Created'. Agar dapat ditautkan ke kasus PurchaseOrder, gabungkan EBAN dengan EKPO menggunakan nomor permintaan (BANFN) dan nomor item (BNFPO). Untuk 'Purchase Requisition Approved', gunakan CDHDR/CDPOS dengan OBJECTCLAS = 'BANF'. Petakan datanya dengan cermat agar peristiwa dikaitkan dengan PO yang terbentuk.
- Ekstrak 'PO Sent to Vendor': Buat alur data dari tabel NAST. Filter berdasarkan OBJECTKEY (yang berisi nomor PO), jenis keluaran yang relevan (KSCHL), dan status pemrosesan berhasil (VSTAT = '1'). Gunakan ERDAT dan UHR untuk mengisi EventTime.
- Gabungkan aliran aktivitas: Gunakan transformasi 'Union' atau 'Merge' di alat ETL untuk menggabungkan keluaran dari semua alur data yang dibuat pada langkah sebelumnya. Pastikan nama kolom dan jenis datanya konsisten di semua aliran, termasuk PurchaseOrder, Activity, dan EventTime.
- Konversi jenis dan format data: Pastikan kolom EventTime dikonversi ke format stempel waktu yang konsisten, misalnya YYYY-MM-DD HH:MM:SS. Ubah OrderAmount ke format desimal standar.
- Tentukan tujuan data: Atur tujuan atau 'sink' untuk aliran data gabungan. Biasanya, tujuan berupa file datar seperti CSV atau Parquet. Atur pemisah, tanda kutip teks, dan opsi judul kolom.
- Jalankan dan validasi: Jalankan seluruh tugas ETL. Periksa file keluaran untuk memastikan semua 14 aktivitas tersedia, jumlah baris masuk akal, dan atribut penting terisi dengan benar.
- Jadwalkan dan ekspor: Setelah validasi, jadwalkan tugas ETL agar berjalan berkala, misalnya setiap malam, supaya data tetap terbaru. File yang dihasilkan siap diunggah ke alat process mining.
Konfigurasi
- Prasyarat: Alat ETL komersial (misalnya Informatica PowerCenter, Talend, SAP Data Services) dengan SAP Certified Connector yang sesuai untuk ECC. Pengguna dialog atau pengguna sistem SAP dengan otorisasi S_RFC dan S_TABU_DIS untuk tabel yang diperlukan.
- Koneksi SAP: Konfigurasikan konektor dengan server aplikasi SAP, nomor sistem, client, nama pengguna, dan kata sandi. Sebaiknya gunakan Secure Network Communications (SNC).
- Filter rentang tanggal: Terapkan filter rentang tanggal untuk membatasi volume data. Umumnya, EKKO.AEDAT (tanggal pembuatan PO) difilter untuk 3 hingga 12 bulan terakhir. Terapkan filter ini di sumber data agar data yang diekstrak dari SAP tidak berlebihan.
- Filter cakupan organisasi: Selalu filter berdasarkan EKKO.BUKRS (kode perusahaan). Pertimbangkan juga filter berdasarkan EKPO.WERKS (pabrik) atau EKKO.EKORG (organisasi pembelian) agar analisis berfokus pada unit bisnis tertentu.
- Filter jenis dokumen: Gunakan EKKO.BSART untuk menyertakan hanya jenis pesanan pembelian yang relevan. Kecualikan transfer stok atau dokumen internal lain yang bukan bagian dari proses P2P standar.
- Penyetelan kinerja: Ekstraksi dari tabel dokumen perubahan (CDHDR, CDPOS) dapat berlangsung lambat. Pastikan filter untuk OBJECTCLAS, OBJECTID, dan UDATE diterapkan. Sesuaikan pengaturan 'Packet Size' di konektor SAP untuk mengoptimalkan kecepatan transfer data. Untuk sistem yang sangat besar, pertimbangkan pemuatan data historis awal, lalu lanjutkan dengan pemuatan delta terjadwal.
Contoh kueri sql
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]); Siap Memulai?
Dengan templat ini, Anda memiliki panduan untuk mengoptimalkan proses Purchase to Pay, Pesanan Pembelian di SAP ECC. Mulai manfaatkan data Anda untuk menemukan wawasan dan meningkatkan efisiensi.
Optimalkan Pesanan Pembelian P2P: Mulai Uji Coba Gratis Hari Ini
Atasi hambatan dan pangkas waktu siklus hingga 30% atau lebih.
Tidak perlu kartu kredit. Mulai dalam hitungan menit.