Templat data Purchase to Pay - Purchase Order Anda
Templat data Purchase to Pay - Purchase Order Anda
- Atribut yang disarankan untuk analisis terperinci
- Aktivitas utama yang perlu dilacak dalam proses
- Panduan ekstraksi data langkah demi langkah
Atribut Purchase to Pay - Purchase Order
| Nama | Deskripsi | ||
|---|---|---|---|
| Aktivitas ActivityName | Nama peristiwa bisnis atau langkah yang terjadi dalam proses Purchase Order. | ||
| Deskripsi Atribut ini menjelaskan tindakan atau perubahan status tertentu dalam siklus Purchase Order, seperti 'Purchase Order dibuat', 'Purchase Order disetujui', atau 'Penerimaan barang dibukukan'. Urutan aktivitas ini membentuk alur proses. Analisis urutan dan frekuensi aktivitas merupakan inti process mining. Analisis ini membantu menemukan proses yang sebenarnya, membandingkannya dengan model yang dirancang, menemukan hambatan, misalnya waktu tunggu yang lama setelah 'Faktur diterima', dan mengukur pekerjaan ulang, misalnya aktivitas 'Purchase Order diubah' yang berulang. Mengapa ini penting Atribut ini menentukan langkah-langkah proses sehingga Anda dapat memvisualisasikan dan menganalisis alur dari awal hingga akhir, variasi proses, serta hambatan. Sumber data Biasanya diturunkan dari gabungan tabel dan kolom, seperti kolom status di EKKO/EKPO atau log dokumen perubahan di CDHDR/CDPOS, untuk menunjukkan tahap penting dalam proses bisnis. Contoh Purchase Order dibuatPurchase Order disetujuiPenerimaan barang dibukukanFaktur diterima | |||
| Purchase Order PurchaseOrderNumber | Pengenal unik Purchase Order (PO), yang menjadi ID kasus utama untuk melacak siklus pengadaan. | ||
| Deskripsi Nomor Purchase Order adalah pengenal utama yang menghubungkan semua aktivitas terkait, dari pembuatan awal hingga penerimaan barang dan penyelesaian. Nomor ini berfungsi sebagai ID kasus untuk analisis process mining. Dalam analisis, pengelompokan peristiwa berdasarkan nomor ini memungkinkan Anda menyusun kembali perjalanan setiap PO. Ini penting untuk menghitung waktu siklus, menganalisis variasi proses, serta menemukan hambatan atau penyimpangan pada pesanan tertentu. Mengapa ini penting Kunci penting untuk menghubungkan semua peristiwa pengadaan menjadi satu proses dari awal hingga akhir, sehingga siklus setiap Purchase Order dapat dianalisis secara terperinci. Sumber data Atribut ini terdapat di tabel EKKO SAP S/4HANA, kolom EBELN. Contoh 450001712345000171244500017125 | |||
| Waktu peristiwa EventTime | Stempel waktu yang menunjukkan kapan aktivitas terjadi. | ||
| Deskripsi Atribut ini mencatat tanggal dan waktu persis setiap aktivitas dalam proses. Data ini menjadi dasar semua analisis berbasis waktu dalam process mining. Waktu peristiwa digunakan untuk mengurutkan aktivitas secara kronologis dan menyusun alur proses. Data ini juga menjadi dasar penghitungan metrik durasi, seperti waktu siklus antaraktivitas, waktu tunggu, dan waktu pemrosesan, yang penting untuk menganalisis kinerja dan menemukan hambatan. Mengapa ini penting Stempel waktu ini penting untuk mengurutkan peristiwa dengan benar dan menghitung semua metrik kinerja, termasuk waktu siklus, waktu tunggu pemasok, dan waktu tunggu. Sumber data Kolom stempel waktu yang terkait dengan aktivitas tertentu, seperti Tanggal Pembuatan (EKKO-AEDAT untuk perubahan) atau Tanggal Pembukuan (MKPF-BUDAT untuk penerimaan barang). Data dari beberapa tabel sering kali perlu digabungkan. Contoh 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Pembaruan data terakhir LastDataUpdate | Stempel waktu saat data terakhir diperbarui atau diekstrak dari sistem sumber. | ||
| Deskripsi Atribut ini menunjukkan seberapa baru data yang dianalisis. Atribut ini mencatat tanggal dan waktu pengambilan data terbaru dari SAP S/4HANA. Waktu pembaruan data terakhir membantu pengguna memahami kemutakhiran analisis. Dengan informasi ini, mereka dapat menafsirkan temuan secara tepat, baik berdasarkan informasi terkini maupun rekam data dari waktu tertentu. Hal ini memengaruhi relevansi tindakan yang diambil berdasarkan analisis. Mengapa ini penting Memberi tahu pengguna seberapa baru data yang digunakan, sehingga mereka dapat memahami konteks dan relevansi temuan analisis. Sumber data Stempel waktu metadata ini ditambahkan selama proses ekstraksi, transformasi, dan pemuatan data (ETL). Contoh 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Sistem sumber SourceSystem | Menunjukkan sistem sumber tempat data diekstrak. | ||
| Deskripsi Atribut ini menunjukkan sistem asal data peristiwa, misalnya 'SAP S/4HANA Production' atau 'SAP ECC'. Jika lingkungan menggunakan beberapa sistem, kolom ini penting untuk menelusuri asal data, memecahkan masalah, dan memastikan data dari berbagai sumber ditafsirkan dengan benar. Kolom ini membantu menjelaskan konteks data dan memfilter analisis untuk lingkungan sistem tertentu. Mengapa ini penting Memberikan konteks penting tentang asal data, yang diperlukan untuk tata kelola, validasi, dan analisis data di lingkungan dengan beberapa sistem. Sumber data Biasanya berupa nilai tetap yang ditambahkan selama proses ekstraksi, transformasi, dan pemuatan data (ETL) untuk menandai asal kumpulan data. Contoh S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| ID pemasok VendorId | Pengenal unik pemasok yang menyediakan barang atau jasa. | ||
| Deskripsi ID pemasok adalah data induk penting yang menghubungkan Purchase Order dengan pemasok tertentu. ID ini digunakan selama proses pengadaan untuk komunikasi, pengiriman, dan pembayaran. Dalam process mining, atribut ini memungkinkan analisis kinerja berdasarkan pemasok. Atribut ini penting untuk dasbor seperti 'Kinerja waktu tunggu pemasok' dan 'Tingkat pengembalian barang per pemasok'. Dengan begitu, Anda dapat menemukan pemasok yang paling andal serta pemasok yang mungkin menyebabkan keterlambatan atau masalah kualitas. Mengapa ini penting Memungkinkan analisis berdasarkan pemasok untuk mengevaluasi kinerja, menemukan pemasok dengan kinerja tinggi maupun rendah, dan mengoptimalkan rantai pasok. Sumber data Atribut ini terdapat di tabel EKKO SAP S/4HANA, kolom LIFNR. Contoh 100023100045100088 | |||
| Jenis dokumen PO DocumentType | Klasifikasi yang membedakan jenis Purchase Order, seperti PO standar, PO jasa, atau pesanan transfer stok. | ||
| Deskripsi Jenis dokumen adalah elemen konfigurasi penting di SAP yang mengatur alur proses, rentang nomor, dan kolom untuk Purchase Order. Elemen ini memungkinkan perusahaan menyesuaikan proses pengadaan untuk berbagai kebutuhan. Analisis proses berdasarkan jenis dokumen penting untuk memahami variasi proses. Misalnya, proses PO barang standar dapat sangat berbeda dari PO jasa atau transfer stok. Atribut ini memungkinkan Anda memfilter dan membandingkan alur proses tersebut untuk menemukan peluang perbaikan yang spesifik. Mengapa ini penting Mengelompokkan Purchase Order agar berbagai proses pengadaan dapat dibandingkan dan membantu menjelaskan variasi alur proses serta waktu siklus. Sumber data Atribut ini terdapat di tabel EKKO SAP S/4HANA, kolom BSART. Contoh NBFOUB | |||
| Pengguna UserName | Pengenal pengguna yang melakukan aktivitas tertentu. | ||
| Deskripsi Atribut ini mencatat ID pengguna SAP yang bertanggung jawab membuat, mengubah, atau menyetujui dokumen. Data ini membantu menelusuri tindakan yang dilakukan di sistem. Analisis berdasarkan pengguna membantu menemukan kebutuhan pelatihan, pembagian beban kerja, dan kinerja individu. Misalnya, Anda dapat melihat apakah pengguna tertentu sering terkait dengan waktu persetujuan yang lama atau perubahan setelah persetujuan. Temuan ini dapat menjadi dasar pengelolaan sumber daya dan perbaikan proses. Mengapa ini penting Mendukung akuntabilitas dan analisis kinerja individu maupun tim, serta membantu menemukan kebutuhan pelatihan atau keterbatasan sumber daya. Sumber data Informasi ini terdapat di kolom seperti ERNAM (Dibuat oleh) di EKKO atau kolom pengguna di tabel dokumen perubahan (CDHDR-USERNAME). Contoh CB9980000012JSMITHRROE | |||
| Permintaan pembelian PurchaseRequisitionNumber | Pengenal permintaan pembelian (PR) yang menjadi asal Purchase Order. | ||
| Deskripsi Atribut ini menghubungkan Purchase Order dengan permintaan pembelian yang menjadi asalnya. Tidak semua PO memiliki PR, terutama jika dibuat secara langsung. Tautan ini penting untuk menganalisis proses pengadaan dari awal hingga akhir, dimulai dari permintaan awal. Tautan ini mendukung KPI seperti 'Waktu persetujuan permintaan pembelian' dan membantu menemukan 'Pembelian di luar prosedur', yaitu PO yang dibuat tanpa permintaan sebelumnya yang telah disetujui. Mengapa ini penting Menghubungkan PO dengan permintaan awal, sehingga analisis proses dari awal hingga akhir dapat dilakukan dan pembelian di luar prosedur yang tidak patuh dapat ditemukan. Sumber data Atribut ini terdapat di tabel EKPO SAP S/4HANA (tingkat item PO), kolom BANFN. Contoh 1001005110010052 | |||
| Tanggal pengiriman yang diminta RequestedDeliveryDate | Tanggal saat bisnis meminta pemasok mengirimkan barang atau jasa. | ||
| Deskripsi Atribut ini menunjukkan tanggal target pengiriman yang disepakati dalam Purchase Order. Tanggal ini menjadi acuan untuk mengukur kinerja pengiriman pemasok. Dalam process mining, tanggal ini dibandingkan dengan tanggal penerimaan barang aktual (stempel waktu 'Penerimaan barang dibukukan') untuk menghitung KPI 'Tingkat ketepatan waktu pengiriman pemasok'. Analisis penyimpangan dari tanggal ini membantu menilai keandalan pemasok dan mengelola risiko rantai pasok. Mengapa ini penting Menjadi acuan untuk mengukur ketepatan waktu pengiriman pemasok, KPI penting untuk pengelolaan rantai pasok dan perencanaan operasional. Sumber data Data ini terdapat di tabel baris jadwal EKET, kolom EINDT. Contoh 2023-06-012023-06-152023-07-01 | |||
| Total nilai bersih TotalNetAmount | Nilai total Purchase Order, tidak termasuk pajak dan biaya pengiriman. | ||
| Deskripsi Atribut ini menunjukkan nilai bersih Purchase Order dalam bentuk uang. Angka ini menjadi informasi keuangan penting yang menggambarkan skala transaksi pengadaan. Nilai ini penting untuk analisis keuangan, misalnya mengelompokkan PO berdasarkan nilai tinggi atau rendah untuk melihat perbedaan alur prosesnya. Anda juga dapat menggunakannya untuk menentukan prioritas analisis, dengan berfokus pada pesanan bernilai tinggi yang mungkin memiliki risiko keuangan lebih besar atau dampak bisnis yang lebih luas. Mengapa ini penting Memungkinkan analisis berdasarkan nilai keuangan, membantu mengelompokkan Purchase Order menurut nilainya dan memprioritaskan perbaikan proses pada area dengan belanja tinggi. Sumber data Atribut ini terdapat di tabel EKKO SAP S/4HANA, kolom NETWR. Contoh 1500.0025000.50125.75 | |||
| Apakah ada pengerjaan ulang IsRework | Penanda hasil perhitungan yang menunjukkan apakah pesanan pembelian perlu dikerjakan ulang, misalnya karena perubahan setelah persetujuan atau pengembalian barang. | ||
| Deskripsi Atribut boolean ini dihitung dengan menganalisis urutan aktivitas untuk setiap pesanan pembelian. Nilainya menjadi 'true' jika peristiwa 'Purchase Order Changed' terjadi setelah peristiwa 'Purchase Order Approved', atau jika terdapat peristiwa 'Goods Returned'. Penanda ini memudahkan penghitungan KPI 'Tingkat pemrosesan langsung'. Anda dapat memfilter dan menampilkan semua pesanan pembelian yang memerlukan intervensi atau koreksi manual, sehingga biaya dan frekuensi pengerjaan ulang dapat diukur. Mengapa ini penting Membantu mengukur ketidakefisienan proses dengan menandai kasus yang perlu dikerjakan ulang. Informasi ini penting untuk menghitung tingkat pemrosesan langsung dan menemukan akar penyimpangan. Sumber data Field hasil perhitungan berdasarkan urutan aktivitas. Logikanya memeriksa apakah peristiwa 'Purchase Order Changed' terjadi setelah persetujuan atau apakah terdapat peristiwa 'Goods Returned'. Contoh truefalse | |||
| Apakah pembelian di luar prosedur IsMaverickSpend | Penanda hasil perhitungan yang menunjukkan apakah pesanan pembelian dibuat tanpa permintaan pembelian yang telah disetujui sebelumnya. | ||
| Deskripsi Penanda boolean ini dihasilkan saat data diproses. Nilainya menjadi 'true' jika pesanan pembelian tidak memiliki permintaan pembelian terkait atau jika pembuatannya melewati alur persetujuan standar. Atribut ini mendukung langsung dashboard 'Identifikasi pembelian di luar prosedur' dan KPI terkait. Atribut ini membantu mengukur besarnya pembelian yang tidak patuh, sehingga bisnis dapat menentukan bagian atau grup pengguna tertentu untuk memperkuat kebijakan dan pengendalian pengadaan. Mengapa ini penting Menandai pembelian yang tidak patuh secara langsung, sehingga penyimpangan proses dapat diukur dan pengendalian keuangan serta kebijakan pengadaan dapat ditegakkan. Sumber data Field hasil perhitungan berdasarkan tidak adanya nilai pada 'PurchaseRequisitionNumber' untuk jenis dokumen tertentu, atau berdasarkan analisis urutan peristiwa. Contoh truefalse | |||
| Grup pembelian PurchasingGroup | Kelompok pembeli yang bertanggung jawab atas aktivitas pengadaan tertentu. | ||
| Deskripsi Grup pembelian terdiri dari satu atau beberapa pembeli yang bertanggung jawab atas aktivitas pembelian, material, atau pemasok tertentu. Mereka menjadi kontak utama bagi pemasok. Atribut ini memungkinkan analisis beban kerja dan kinerja yang lebih terperinci dibandingkan organisasi pembelian. Anda dapat menggunakannya untuk menemukan tim yang kewalahan, mengukur efisiensi tiap grup pembeli, dan mengetahui grup yang lebih sering menyimpang dari proses, misalnya melakukan pembelian di luar prosedur. Mengapa ini penting Memberikan gambaran terperinci tentang kinerja grup pembeli, sehingga beban kerja, efisiensi, dan kepatuhan proses dapat dianalisis di tingkat tim. Sumber data Atribut ini terdapat di tabel SAP S/4HANA EKKO, pada field EKGRP. Contoh 001002N00 | |||
| Kategori item ItemCategory | Mengelompokkan item Purchase Order, misalnya standar, konsinyasi, subkontrak, atau jasa. | ||
| Deskripsi Kategori item menentukan cara pengadaan material atau jasa tertentu dikendalikan dan diproses. Kategori ini memengaruhi langkah berikutnya, seperti penerimaan barang dan verifikasi faktur. Atribut ini penting untuk menganalisis variasi proses berdasarkan jenis barang atau jasa yang dibeli. Misalnya, proses untuk item jasa, yang memerlukan lembar penerimaan jasa, sangat berbeda dari proses untuk item stok standar. Analisis berdasarkan kategori item membantu menjelaskan perbedaan ini dan menentukan perbaikan proses yang tepat. Mengapa ini penting Menjelaskan variasi proses dengan membedakan jenis pengadaan, seperti barang, jasa, atau pekerjaan subkontrak. Sumber data Atribut ini terdapat di tabel SAP S/4HANA EKPO, pada field PSTYP. Contoh 093 | |||
| Ketepatan waktu pengiriman pemasok SupplierOnTimeDelivery | Penanda hasil perhitungan yang menunjukkan apakah penerimaan barang dicatat pada atau sebelum tanggal pengiriman yang diminta. | ||
| Deskripsi Atribut boolean ini dihasilkan dengan membandingkan waktu aktivitas 'Goods Receipt Posted' dengan 'Requested Delivery Date'. Nilainya menjadi 'true' jika barang diterima pada atau sebelum tanggal yang diminta. Atribut ini mendukung langsung KPI 'Tingkat ketepatan waktu pengiriman pemasok'. Atribut ini memudahkan analisis dengan memungkinkan pengguna memfilter pengiriman yang tepat waktu atau terlambat. Informasi ini penting untuk dashboard kinerja pemasok dan penilaian pemasok. Mengapa ini penting Mengukur keandalan pemasok secara langsung, menjadi dasar KPI ketepatan waktu pengiriman dan mendukung pengelolaan kinerja pemasok. Sumber data Dihitung dengan membandingkan waktu aktivitas 'Goods Receipt Posted' dengan atribut 'RequestedDeliveryDate'. Contoh truefalse | |||
| Kode perusahaan CompanyCode | Identitas badan hukum atau perusahaan tempat pesanan pembelian dibuat. | ||
| Deskripsi Kode perusahaan menunjukkan unit akuntansi mandiri dalam organisasi. Semua transaksi keuangan terkait pesanan pembelian dicatat pada kode perusahaan tertentu. Atribut organisasi ini menjadi dasar untuk memfilter dan membandingkan proses pengadaan di berbagai badan hukum. Analisis berdasarkan kode perusahaan dapat mengungkap ketidakkonsistenan dalam pelaksanaan proses, perbedaan efisiensi, atau tingkat kepatuhan di berbagai bagian organisasi. Mengapa ini penting Memungkinkan analisis proses dikelompokkan berdasarkan badan hukum, sehingga kinerja dan kepatuhan dapat dibandingkan di berbagai bagian bisnis. Sumber data Atribut ini terdapat di tabel SAP S/4HANA EKKO, pada field BUKRS. Contoh 101017102000 | |||
| Nomor material MaterialNumber | Identitas material atau barang tertentu yang dibeli. | ||
| Deskripsi Nomor material adalah kode unik untuk setiap catatan master material di SAP. Kode ini digunakan dalam semua transaksi terkait material tersebut, termasuk pengadaan, pengelolaan persediaan, dan penjualan. Analisis berdasarkan nomor atau grup material memungkinkan analisis per jenis komoditas. Analisis ini dapat membantu mengetahui apakah proses pengadaan material tertentu kurang efisien, memiliki waktu tunggu lebih lama, atau lebih sering mengalami pengembalian. Hasilnya dapat menjadi masukan untuk pengelolaan kategori. Mengapa ini penting Memungkinkan analisis per jenis komoditas untuk menemukan masalah proses atau kinerja pemasok yang terkait dengan produk atau material tertentu. Sumber data Atribut ini terdapat di tabel SAP S/4HANA EKPO, pada field MATNR. Contoh RM100-100FG210SERV-CONSULT | |||
| Organisasi pembelian PurchasingOrganization | Unit organisasi yang bertanggung jawab atas pengadaan material dan jasa serta negosiasi dengan pemasok. | ||
| Deskripsi Organisasi pembelian adalah unit penting dalam pengadaan. Strukturnya dapat berada di tingkat perusahaan, badan hukum, atau pabrik, dan bertanggung jawab atas seluruh aktivitas pembelian. Analisis proses berdasarkan organisasi pembelian membantu menilai efisiensi dan kinerja tim pengadaan atau wilayah yang berbeda. Analisis ini dapat menunjukkan perbedaan dalam negosiasi dengan pemasok, kepatuhan proses, atau keterlambatan persetujuan antarunit organisasi. Mengapa ini penting Memungkinkan perbandingan kinerja antarbagian pengadaan atau wilayah, sehingga praktik terbaik dan area yang perlu diperbaiki dapat diketahui. Sumber data Atribut ini terdapat di tabel SAP S/4HANA EKKO, pada field EKORG. Contoh 10101710US01 | |||
| Pabrik Plant | Fasilitas atau lokasi operasional tempat barang dikirim atau jasa diberikan. | ||
| Deskripsi Di SAP, pabrik adalah lokasi fisik tempat barang diproduksi, disimpan, atau jasa diberikan. Pabrik berperan penting dalam logistik dan perencanaan. Analisis proses berdasarkan pabrik dapat mengungkap perbedaan pengadaan antarwilayah atau lokasi. Misalnya, analisis dapat menunjukkan apakah pengiriman ke pabrik tertentu memerlukan waktu lebih lama atau lebih sering mengalami pengembalian barang. Hal ini dapat mengindikasikan masalah logistik atau pengendalian kualitas di lokasi tersebut. Mengapa ini penting Memungkinkan analisis berdasarkan lokasi untuk melihat perbedaan kinerja proses di berbagai lokasi operasional, pabrik, atau gudang. Sumber data Atribut ini terdapat di tabel SAP S/4HANA EKPO, pada field WERKS. Contoh 10101710DE01 | |||
Aktivitas Purchase to Pay - Purchase Order
| Aktivitas | Deskripsi | ||
|---|---|---|---|
| Faktur diterima | Menandai pencatatan faktur pemasok di sistem SAP dan penautannya ke Purchase Order terkait. Pembukuan keuangan ini secara eksplisit membuat dokumen akuntansi. | ||
| Mengapa ini penting Ini adalah tahap penting yang menghubungkan proses pengadaan dengan proses utang usaha. Anda dapat menganalisis waktu antara penerimaan barang dan pemrosesan faktur. Sumber data Dokumen akuntansi dibuat di tabel BKPF (header), sedangkan item barisnya tercatat di BSEG atau universal journal ACDOCA. Dokumen ini ditautkan ke PO di tabel RSEG. Pengumpulan data Tanggal entri dokumen (CPUDT) dari tabel header dokumen akuntansi BKPF. Jenis peristiwa explicit | |||
| Penerimaan barang dibukukan | Menandai penerimaan fisik barang dari pemasok beserta pencatatannya di sistem. Transaksi ini secara eksplisit memperbarui riwayat Purchase Order. | ||
| Mengapa ini penting Ini adalah tahap penting yang mengakhiri waktu tunggu pemasok dan memulai proses internal verifikasi faktur. Peristiwa ini diperlukan untuk melacak tingkat ketepatan waktu pengiriman. Sumber data Tercatat sebagai dokumen material di tabel MKPF (header) dan MSEG (item), serta ditautkan ke tabel riwayat Purchase Order EKBE dengan jenis pergerakan tertentu, misalnya 101. Pengumpulan data Tanggal pembukuan (BUDAT) dari header dokumen material (MKPF) yang ditautkan melalui EKBE. Jenis peristiwa explicit | |||
| Permintaan pembelian dibuat | Aktivitas ini menandai permintaan resmi atas barang atau jasa dan memulai proses pengadaan. Peristiwa ini tercatat secara eksplisit saat pengguna menyimpan dokumen permintaan pembelian baru, misalnya melalui transaksi ME51N. | ||
| Mengapa ini penting Ini menjadi titik awal bagi banyak siklus Purchase Order. Dengan menganalisis waktu dari peristiwa ini hingga PO dibuat, Anda dapat menemukan keterlambatan dalam pencarian sumber dan pemrosesan internal. Sumber data Tercatat di tabel EBAN (Purchase Requisition). Stempel waktu pembuatan dapat ditemukan di tabel riwayat perubahan CDHDR dan CDPOS untuk objek EBAN. Pengumpulan data Peristiwa tercatat saat dokumen dibuat di tabel EBAN. Jenis peristiwa explicit | |||
| Permintaan pembelian disetujui | Menandai persetujuan resmi atas permintaan pembelian oleh manajer atau pemberi persetujuan yang ditunjuk. Biasanya, peristiwa ini disimpulkan dari perubahan status dokumen permintaan, yang menandakan dokumen siap diubah menjadi Purchase Order. | ||
| Mengapa ini penting Ini adalah tahap penting untuk mengukur waktu siklus persetujuan dan menemukan hambatan. Keterlambatan pada tahap ini langsung memengaruhi kecepatan pembuatan Purchase Order dan pengirimannya kepada pemasok. Sumber data Disimpulkan dari kolom status rilis di tabel EBAN, misalnya FRGZU (indikator rilis). Stempel waktu diambil dari dokumen perubahan (CDHDR/CDPOS) yang mencatat kapan status rilis akhir ditetapkan. Pengumpulan data Disimpulkan dari log perubahan (CDHDR/CDPOS) untuk kolom status rilis di tabel EBAN. Jenis peristiwa inferred | |||
| Purchase Order dibuat | Menandai pembuatan dokumen Purchase Order resmi, baik dengan maupun tanpa referensi ke permintaan pembelian. Peristiwa ini tercatat secara eksplisit saat dokumen PO pertama kali disimpan di sistem. | ||
| Mengapa ini penting Aktivitas ini dapat menjadi titik awal alternatif untuk proses, terutama saat menganalisis pembelian di luar prosedur. Peristiwa ini menjadi dasar untuk melacak keseluruhan waktu pemrosesan PO. Sumber data Tercatat di tabel header Purchase Order EKKO. Tanggal pembuatan (AEDAT) dan waktunya disimpan langsung di tabel ini untuk dokumen tersebut. Pengumpulan data Stempel waktu pembuatan (AEDAT) di tabel EKKO untuk dokumen Purchase Order. Jenis peristiwa explicit | |||
| Purchase Order disetujui | Menandakan bahwa Purchase Order telah menerima semua persetujuan internal yang diperlukan dan boleh dikirim kepada pemasok. Peristiwa ini disimpulkan dari perubahan status dalam strategi rilis Purchase Order. | ||
| Mengapa ini penting Ini adalah tahap penting untuk mengukur efisiensi persetujuan dan pekerjaan ulang setelah persetujuan. Analisis waktu antara pembuatan dan persetujuan PO dapat menunjukkan keterlambatan proses internal. Sumber data Disimpulkan dari indikator rilis (FRGKE) di tabel EKKO. Stempel waktu ditentukan dengan melihat riwayat perubahan (CDHDR/CDPOS) untuk mengetahui kapan kolom ini diperbarui ke status 'dirilis'. Pengumpulan data Disimpulkan dari log perubahan untuk kolom indikator rilis (FRGKE) di tabel EKKO. Jenis peristiwa inferred | |||
| Purchase Order selesai | Aktivitas ini menandakan bahwa item Purchase Order dianggap ditutup dari sisi logistik. Status ini disimpulkan saat indikator 'Pengiriman Selesai' dan 'Faktur Akhir' sama-sama ditetapkan. | ||
| Mengapa ini penting Ini menjadi titik akhir analisis siklus Purchase Order. Mengukur waktu hingga peristiwa ini memberikan waktu siklus pengadaan dari awal hingga akhir. Sumber data Disimpulkan dari penanda status pada tabel item Purchase Order EKPO. Peristiwa terjadi saat indikator 'Pengiriman Selesai' (ELIKZ) dan 'Faktur Akhir' (EREKZ) sama-sama bernilai benar. Pengumpulan data Disimpulkan dari log perubahan saat kolom ELIKZ dan EREKZ di EKPO sama-sama ditandai selesai. Jenis peristiwa inferred | |||
| Barang dikembalikan | Menandakan bahwa barang yang sebelumnya diterima dikembalikan kepada pemasok, biasanya karena masalah kualitas, kerusakan, atau pengiriman yang keliru. Peristiwa ini tercatat secara eksplisit sebagai pembalikan pergerakan barang. | ||
| Mengapa ini penting Aktivitas ini menunjukkan adanya pekerjaan ulang dan kemungkinan masalah pada kualitas pemasok atau ketepatan pesanan. Pengembalian yang sering terjadi untuk pemasok atau material tertentu menandakan adanya masalah. Sumber data Tercatat sebagai dokumen material dengan jenis pergerakan retur tertentu, misalnya 122. Peristiwa ini dicatat di MKPF/MSEG dan ditautkan ke PO dalam tabel riwayat EKBE. Pengumpulan data Tanggal pembukuan dari dokumen material dengan jenis pergerakan retur di EKBE. Jenis peristiwa explicit | |||
| Faktur dibayar | Menandai pelunasan akhir faktur pemasok melalui proses pembayaran atau pembayaran manual. Transaksi keuangan ini secara eksplisit membuat dokumen kliring. | ||
| Mengapa ini penting Meski secara teknis termasuk dalam proses pembayaran, aktivitas ini memberikan gambaran lengkap tentang siklus procure-to-pay. Aktivitas ini penting untuk menganalisis ketentuan dan kinerja pembayaran. Sumber data Pembayaran dicatat sebagai dokumen kliring di BKPF/ACDOCA. Tanggal kliring (AUGDT) pada item baris faktur di tabel BSEG atau ACDOCA menunjukkan peristiwa pembayaran. Pengumpulan data Tanggal kliring (AUGDT) dokumen faktur, yang terdapat di BSEG atau ACDOCA. Jenis peristiwa explicit | |||
| Konfirmasi jasa dimasukkan | Aktivitas ini menandai konfirmasi bahwa jasa yang tercantum di Purchase Order telah diberikan. Peristiwa ini tercatat secara eksplisit saat lembar penerimaan jasa dibuat. | ||
| Mengapa ini penting Untuk pengadaan jasa, tahap ini setara dengan penerimaan barang. Peristiwa ini penting untuk melacak waktu penyelesaian jasa dan memastikan pembayaran pemasok dilakukan tepat waktu. Sumber data Tercatat saat lembar penerimaan jasa dibuat. Datanya disimpan di tabel ESSR (header) dan ESLL (baris). Tanggal pembuatan digunakan sebagai stempel waktu. Pengumpulan data Tanggal pembuatan dokumen Service Entry Sheet di tabel ESSR. Jenis peristiwa explicit | |||
| Purchase Order dihapus | Menandai pembatalan atau penghapusan logis item Purchase Order maupun seluruh dokumen. Peristiwa ini tercatat saat pengguna menetapkan penanda penghapusan pada dokumen. | ||
| Mengapa ini penting Aktivitas ini menjadi titik akhir alternatif yang menandakan kegagalan atau pembatalan proses. Analisis alasan PO dihapus dapat mengungkap masalah dalam perencanaan permintaan atau perumusan kebutuhan. Sumber data Diambil dari penanda penghapusan (LOEKZ) di tabel header Purchase Order (EKKO) atau item (EKPO). Stempel waktu diambil dari dokumen perubahan (CDHDR/CDPOS). Pengumpulan data Stempel waktu dari dokumen perubahan (CDHDR/CDPOS) saat penanda penghapusan (LOEKZ) ditetapkan. Jenis peristiwa explicit | |||
| Purchase Order dikirim ke pemasok | Menandai saat Purchase Order disampaikan kepada pemasok, misalnya melalui EDI, email, atau cetakan. Peristiwa ini sering tercatat di log manajemen output sistem. | ||
| Mengapa ini penting Aktivitas ini menandai awal waktu tunggu pemasok yang sebenarnya. Peristiwa ini penting untuk mengukur kinerja pemasok secara akurat sejak pesanan diterima. Sumber data Diambil dari tabel kontrol output NAST, yang mencatat pesan yang dikirim untuk dokumen pembelian. Tanggal dan waktu jenis output terkait, misalnya EDI atau email, dapat digunakan. Pengumpulan data Stempel waktu pesan output PO pertama yang berhasil di tabel NAST. Jenis peristiwa inferred | |||
| Purchase Order diubah | Aktivitas ini menandakan perubahan pada Purchase Order setelah pertama kali dibuat, misalnya perubahan jumlah, harga, atau tanggal pengiriman. Perubahan tercatat secara eksplisit di log perubahan sistem. | ||
| Mengapa ini penting Melacak perubahan, terutama setelah persetujuan, penting untuk menemukan inefisiensi proses, pekerjaan ulang, dan potensi masalah kepatuhan. Perubahan yang sering terjadi dapat menunjukkan spesifikasi awal yang kurang tepat. Sumber data Tercatat di tabel dokumen perubahan CDHDR (header) dan CDPOS (item) untuk objek Purchase Order (EINKBELEG). Setiap perubahan menghasilkan entri log terperinci. Pengumpulan data Peristiwa dicatat saat kolom penting di tabel EKKO atau EKPO berubah, dengan catatan di CDHDR/CDPOS. Jenis peristiwa explicit | |||
Panduan ekstraksi
Langkah
- Prasyarat dan akses: Pastikan Anda memiliki pengguna dengan otorisasi yang sesuai untuk menjalankan kueri pada view Core Data Services (CDS) di sistem SAP S/4HANA. Anda dapat mengaksesnya melalui SAP HANA Studio, ABAP Development Tools (ADT) untuk Eclipse, atau alat ekstraksi data pihak ketiga yang mendukung koneksi SQL ke database SAP HANA.
- Cari detail koneksi sistem: Dapatkan parameter koneksi yang diperlukan untuk sistem SAP S/4HANA, termasuk host, nomor instance, dan kredensial autentikasi.
- Hubungkan ke database: Gunakan klien SQL pilihan Anda untuk terhubung ke database SAP S/4HANA tempat CDS view berada.
- Siapkan kueri SQL: Salin seluruh kueri SQL dari bagian kueri dokumen ini ke editor SQL Anda. Kueri ini dirancang untuk mengambil semua aktivitas dan atribut yang diperlukan.
- Atur parameter filter: Cari nilai placeholder di dalam kueri. Ganti _start_date dan _end_date dengan rentang tanggal yang ingin dianalisis, misalnya '20230101' dan '20231231'. Ubah filter poh.CompanyCode agar mencakup kode perusahaan yang ingin dianalisis.
- Jalankan kueri: Jalankan kueri SQL yang telah diubah pada database S/4HANA. Waktu eksekusi dapat bervariasi, tergantung volume data dan rentang tanggal yang ditentukan.
- Periksa hasil awal: Setelah kueri selesai, periksa hasilnya di klien SQL. Pastikan berbagai aktivitas tersedia, stempel waktu terisi dengan benar, dan ID kasus (PurchaseOrderNumber) konsisten.
- Ekspor data: Ekspor seluruh hasil dari alat SQL ke file CSV (Comma Separated Values). Pastikan file menggunakan encoding UTF-8 agar karakter tampil dengan benar.
- Siapkan data untuk diunggah: Sebelum mengunggah ke ProcessMind, buka file CSV dan pastikan nama header kolom sama persis dengan atribut yang ditentukan dalam persyaratan data (PurchaseOrderNumber, ActivityName, EventTime, dan seterusnya). Sesuaikan nama kolom jika alat ekspor mengubahnya.
- Unggah ke ProcessMind: Unggah file CSV final ke proyek ProcessMind Anda. Saat mengimpor, petakan kolom dalam file ke kolom ID kasus, aktivitas, dan stempel waktu yang sesuai.
Konfigurasi
- CDS view utama yang digunakan: Logika ekstraksi menggunakan sejumlah CDS view standar dengan makna data yang jelas. View utamanya meliputi:
- I_PurchaseOrderItemAPI01: Data utama item purchase order.
- I_PurchaseRequisitionItemAPI01: Detail purchase requisition.
- I_MaterialDocumentItem: Pergerakan barang, seperti penerimaan dan retur.
- I_ServiceEntrySheetAPI01: Aktivitas konfirmasi layanan.
- I_SupplierInvoiceAPI01: Informasi faktur pemasok.
- I_OperationalAcctgDocItem: Pengaitan faktur dengan dokumen keuangan untuk melacak pembayaran.
- I_ChangeDocument: Perubahan pada purchase order.
- Filter rentang tanggal: Terapkan filter rentang tanggal untuk mengendalikan kinerja dan volume data. Kueri menggunakan placeholder _start_date dan _end_date pada tanggal pembuatan purchase order (PurchaseOrderDate). Sebagai langkah awal, gunakan rentang data 3 hingga 6 bulan.
- Filter organisasi: Selalu filter kueri berdasarkan CompanyCode agar ekstraksi hanya mencakup unit bisnis yang relevan. Untuk mempersempit hasil, Anda juga dapat menambahkan filter PurchaseOrderType atau PurchasingOrganization ke ekspresi tabel umum PO_base.
- Prasyarat: Pengguna yang menjalankan kueri memerlukan otorisasi SELECT pada semua CDS view di atas. Akses ke view ini biasanya diberikan melalui peran bisnis atau analitik tertentu di S/4HANA. Kueri akan gagal jika izin yang diperlukan tidak tersedia.
Contoh kueri sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Langkah
- Pastikan akses SQL langsung ke skema SAP HANA yang berisi EKKO dan EKPO tersedia, lalu dapatkan otorisasi baca yang diperlukan. Ganti placeholder skema dan koneksi dengan nilai yang dikonfigurasi untuk sistem Anda.
- Tentukan periode ekstraksi menggunakan [Stempel waktu mulai] dan [Stempel waktu akhir]. Untuk pemuatan awal, disarankan menggunakan rentang tiga hingga enam bulan. Terapkan filter kode perusahaan dan jenis dokumen hanya jika diperlukan oleh cakupan pelaporan.
- Identifikasi purchase order di EKKO dan EKPO. Ambil nomor purchase order, pemasok, jenis dokumen, kode perusahaan, tanggal pembuatan, waktu pembuatan, serta atribut tingkat item. Agregasikan nilai neto EKPO untuk menghitung TotalNetAmount pada tingkat purchase order.
- Ambil aktivitas pembuatan dan persetujuan purchase requisition dari EBAN. Gunakan nomor dan referensi item purchase requisition di EKPO untuk mengaitkan requisition dengan purchase order. Indikator dan stempel waktu persetujuan berbeda-beda menurut konfigurasi rilis, jadi atur ekspresi status dan stempel waktu persetujuan sesuai strategi rilis SAP yang aktif di [Konfigurasikan sesuai sistem Anda].
- Ambil aktivitas pembuatan, persetujuan, perubahan, penghapusan, dan penyelesaian purchase order. Untuk aktivitas pembuatan, gunakan tanggal dan waktu pembuatan EKKO. Aktivitas persetujuan, perubahan, dan penghapusan memerlukan sumber riwayat rilis atau perubahan. Atur ekspresi sumber terkait menggunakan [Nama tabel Anda] dan [Nama kolom Anda] jika riwayat yang diperlukan tidak tersedia di skema yang dipilih.
- Ambil aktivitas komunikasi pemasok, penerimaan barang, konfirmasi layanan, retur barang, penerimaan faktur, dan pembayaran faktur dari sumber output, dokumen material, entri layanan, faktur, akuntansi, dan clearing yang sesuai. Kueri menyediakan placeholder sumber khusus sistem karena data tersebut tidak hanya tersedia di EKKO dan EKPO.
- Samakan struktur setiap aktivitas sumber dengan format log peristiwa yang sama. Setiap baris harus memuat PurchaseOrderNumber, ActivityName, EventTime, SourceSystem, LastDataUpdate, VendorId, UserName, TotalNetAmount, PurchaseRequisitionNumber, RequestedDeliveryDate, dan DocumentType. Pertahankan setiap kemunculan aktivitas yang valid jika sumber memuat beberapa peristiwa.
- Validasi stempel waktu, hapus hanya baris sumber yang benar-benar duplikat, dan jangan menyimpulkan aktivitas yang tidak memiliki catatan sumber. ProcessMind membaca log peristiwa apa adanya. Karena itu, setiap aktivitas yang ditampilkan dalam visualisasi proses harus tercatat sebagai baris tersendiri.
- Ekspor hasil sebagai file berpemisah kolom atau kumpulan hasil database dengan satu baris header dan nama kolom yang konsisten. Gunakan format stempel waktu yang didukung konfigurasi unggahan ProcessMind, simpan PurchaseOrderNumber sebagai teks, lalu unggah seluruh log peristiwa melalui koneksi data ProcessMind yang telah dikonfigurasi.
Konfigurasi
- Objek sumber: EKKO dan EKPO adalah sumber yang telah dipastikan untuk header dan item purchase order. Konfigurasikan objek tambahan untuk requisition, status rilis, riwayat perubahan, output, pergerakan barang, lembar entri layanan, faktur, pembayaran, dan clearing sesuai rilis SAP S/4HANA serta model data yang aktif.
- ID kasus: Gunakan PurchaseOrderNumber sebagai ID kasus. Kaitkan aktivitas tingkat item dengan nomor purchase order. Jika diperlukan, simpan referensi item di kolom tambahan khusus sumber.
- Rentang tanggal: Mulai dengan rentang tiga hingga enam bulan. Untuk pemuatan data historis, gunakan rentang yang lebih kecil dan cocokkan batas waktu yang tumpang tindih agar tidak ada data yang terlewat.
- Filter: Atur filter Company Code, Document Type, VendorId, organisasi pembelian, grup pembelian, dan tanggal aktivitas sesuai cakupan yang diperlukan. Nilai filter kode perusahaan dan jenis dokumen harus valid di sistem tujuan.
- Makna aktivitas: Aktivitas pembuatan dan penghapusan dapat dicatat secara eksplisit jika kolom dokumen atau log terkait tersedia. Persetujuan dan penyelesaian merupakan aktivitas berbasis status yang memerlukan stempel waktu status. Jangan membuat baris hanya berdasarkan status terkini tanpa stempel waktu peristiwa yang dapat dipertanggungjawabkan.
- Kinerja: Terapkan filter tanggal aktivitas dan cakupan organisasi sejak awal. Jika memungkinkan, agregasikan EKPO sebelum menggabungkannya dengan sumber aktivitas, dan jalankan pemuatan data historis berukuran besar dalam beberapa rentang waktu. Pastikan statistik database sesuai dan hindari penggabungan tanpa filter antara sumber item, akuntansi, dan riwayat perubahan.
- Stempel waktu pembaruan: Isi LastDataUpdate dengan stempel waktu saat ekstraksi dijalankan pada setiap baris dalam satu proses ekstraksi.
- Prasyarat: Anda memerlukan koneksi SAP HANA, otorisasi baca untuk semua objek sumber yang dikonfigurasi, akses ke data pembelian, manajemen inventaris, pengadaan layanan, verifikasi faktur, dan utang usaha yang relevan, serta koneksi ProcessMind yang dapat mengimpor file atau kumpulan hasil yang dipilih.
- Konfigurasi khusus sistem: Ganti setiap placeholder sumber dalam tanda kurung siku di kueri dengan tabel, view, kolom, atau ekspresi yang disetujui untuk sistem SAP S/4HANA tujuan. Jangan mencantumkan kredensial dalam kueri atau konfigurasi ekstraksi.
Contoh kueri sql
WITH
params AS (
SELECT
CAST('[Start timestamp]' AS TIMESTAMP) AS start_ts,
CAST('[End timestamp]' AS TIMESTAMP) AS end_ts,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update,
CAST('[Source system]' AS NVARCHAR(100)) AS source_system
FROM DUMMY
),
po_base AS (
SELECT
h.MANDT,
h.EBELN AS PurchaseOrderNumber,
h.LIFNR AS VendorId,
h.BSART AS DocumentType,
h.BUKRS AS CompanyCode,
CAST(h.AEDAT AS DATE) AS POChangedDate,
CAST(h.AEDAT AS TIMESTAMP) AS POChangedTimestamp,
CAST(h.ERNAM AS NVARCHAR(100)) AS POCreatedBy,
CAST(h.BEDAT AS DATE) AS PODate,
CAST(h.EBELN AS NVARCHAR(20)) AS PurchaseOrderKey,
CAST(SUM(COALESCE(i.NETWR, 0)) AS DECIMAL(23, 2)) AS TotalNetAmount,
CAST(MIN(i.BEDNR) AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
CAST(MIN(i.EINDT) AS DATE) AS RequestedDeliveryDate
FROM EKKO h
INNER JOIN EKPO i
ON i.MANDT = h.MANDT
AND i.EBELN = h.EBELN
WHERE h.AEDAT >= (SELECT start_ts FROM params)
AND h.AEDAT < (SELECT end_ts FROM params)
AND h.BUKRS IN ([Company Code filter])
AND h.BSART IN ([Document Type filter])
GROUP BY
h.MANDT,
h.EBELN,
h.LIFNR,
h.BSART,
h.BUKRS,
h.AEDAT,
h.ERNAM,
h.BEDAT
),
po_items AS (
SELECT
i.MANDT,
i.EBELN AS PurchaseOrderNumber,
i.EBELP,
i.BANFN AS PurchaseRequisitionNumber,
i.BEDNR,
i.EINDT AS RequestedDeliveryDate
FROM EKPO i
),
events AS (
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(r.[Purchase requisition creation timestamp] AS TIMESTAMP) AS EventTime,
s.source_system AS SourceSystem,
s.last_data_update AS LastDataUpdate,
p.VendorId,
CAST(r.[Purchase requisition created by] AS NVARCHAR(100)) AS UserName,
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition source table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition creation timestamp] >= s.start_ts
AND r.[Purchase requisition creation timestamp] < s.end_ts
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(r.[Purchase requisition approval timestamp] AS TIMESTAMP) AS EventTime,
s.source_system,
s.last_data_update,
p.VendorId,
CAST(r.[Purchase requisition approver] AS NVARCHAR(100)),
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)),
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition approval history table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition approval timestamp] >= s.start_ts
AND r.[Purchase requisition approval timestamp] < s.end_ts
AND r.[Approval status] = '[Approved status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Created',
CAST(p.PODate AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
p.POCreatedBy,
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
CROSS JOIN params s
WHERE p.PODate >= CAST(s.start_ts AS DATE)
AND p.PODate < CAST(s.end_ts AS DATE)
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Approved',
CAST(a.[Purchase order approval timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(a.[Approver] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order release history table or view] a
ON a.[Client] = p.MANDT
AND a.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE a.[Purchase order approval timestamp] >= s.start_ts
AND a.[Purchase order approval timestamp] < s.end_ts
AND a.[Release status] = '[Approved release status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Sent to Vendor',
CAST(o.[Output timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(o.[Output user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order output source table or view] o
ON o.[Client] = p.MANDT
AND o.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE o.[Output timestamp] >= s.start_ts
AND o.[Output timestamp] < s.end_ts
AND o.[Output status] = '[Successfully processed output status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Changed',
CAST(c.[Change timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(c.[Changed by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order change history table or view] c
ON c.[Client] = p.MANDT
AND c.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE c.[Change timestamp] >= s.start_ts
AND c.[Change timestamp] < s.end_ts
AND c.[Change indicator] = '[Changed indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Receipt Posted',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods receipt movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Services Confirmation Entered',
CAST(v.[Service entry timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(v.[Entered by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your service entry sheet source table or view] v
ON v.[Client] = p.MANDT
AND v.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE v.[Service entry timestamp] >= s.start_ts
AND v.[Service entry timestamp] < s.end_ts
AND v.[Service entry status] = '[Accepted service entry status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Returned',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods return movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Received',
CAST(i.[Invoice posting timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Invoice posting timestamp] >= s.start_ts
AND i.[Invoice posting timestamp] < s.end_ts
AND i.[Invoice status] = '[Posted invoice status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Paid',
CAST(i.[Clearing timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Cleared by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice clearing source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Clearing timestamp] >= s.start_ts
AND i.[Clearing timestamp] < s.end_ts
AND i.[Clearing status] = '[Cleared status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Completed',
CAST(x.[Completion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(x.[Completion user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order item status source table or view] x
ON x.[Client] = p.MANDT
AND x.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE x.[Completion timestamp] >= s.start_ts
AND x.[Completion timestamp] < s.end_ts
AND x.[Delivery completed indicator] = '[Set indicator value]'
AND x.[Final invoice indicator] = '[Set indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Deleted',
CAST(d.[Deletion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(d.[Deleted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order deletion history table or view] d
ON d.[Client] = p.MANDT
AND d.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE d.[Deletion timestamp] >= s.start_ts
AND d.[Deletion timestamp] < s.end_ts
AND d.[Deletion indicator] = '[Set deletion indicator value]'
)
SELECT
PurchaseOrderNumber,
ActivityName,
EventTime,
SourceSystem,
LastDataUpdate,
VendorId,
UserName,
TotalNetAmount,
PurchaseRequisitionNumber,
RequestedDeliveryDate,
DocumentType
FROM events
WHERE PurchaseOrderNumber IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY PurchaseOrderNumber, EventTime, ActivityName; Langkah
- Spesifikasi dan desain: Tentukan struktur akhir file log peristiwa, termasuk semua atribut wajib dan yang disarankan. Dokumentasikan tabel SAP tertentu, misalnya EKKO, EKPO, EKBE, CDHDR, CDPOS, BKPF, yang akan menjadi sumber untuk masing-masing dari 13 aktivitas wajib.
- Membuat program: Di SAP GUI, buka ABAP Editor melalui kode transaksi SE38 atau SE80. Buat program baru yang dapat dijalankan, misalnya Z_PM_PO_EXTRACT.
- Tentukan layar seleksi: Tulis kode layar seleksi untuk laporan. Layar ini memungkinkan pengguna memfilter data yang akan diekstrak. Sertakan parameter rentang tanggal pembuatan Purchase Order (P_AEDAT), Company Code (P_BUKRS), dan Purchasing Document Type (P_BSART).
- Deklarasi data: Tentukan tabel internal dan struktur data yang diperlukan program. Ini mencakup tabel internal untuk log peristiwa akhir yang sesuai dengan struktur pada langkah spesifikasi.
- Terapkan logika pemilihan data: Tulis logika inti ABAP untuk memilih data bagi masing-masing dari 13 aktivitas. Gunakan serangkaian pernyataan SELECT pada tabel SAP yang relevan dan lakukan penggabungan jika diperlukan. Untuk aktivitas berbasis perubahan, baca tabel log perubahan CDHDR dan CDPOS.
- Ubah dan petakan data: Untuk setiap catatan yang diambil, petakan kolom tabel SAP ke kolom yang sesuai dalam tabel internal log peristiwa akhir. Isi ActivityName berdasarkan aktivitas yang diproses, misalnya 'Purchase Order Created'. Ubah kolom tanggal dan waktu ke format stempel waktu yang konsisten untuk EventTime.
- Gabungkan data aktivitas: Setelah memproses 13 jenis aktivitas, pastikan semua data terkumpul dalam satu tabel internal terpadu. Tabel ini menjadi log peristiwa lengkap untuk purchase order yang dipilih.
- Terapkan output file: Tambahkan fungsi untuk menulis tabel internal akhir ke file. Cara yang disarankan adalah menggunakan metode cl_gui_frontend_services=>gui_download agar pengguna dapat menyimpan file sebagai CSV di komputer lokal, atau menggunakan OPEN DATASET untuk menyimpannya di server aplikasi SAP agar dapat diproses di latar belakang.
- Buat kode transaksi (opsional): Agar program mudah diakses pengguna bisnis, gunakan kode transaksi SE93 untuk membuat kode transaksi khusus, misalnya ZPM_PO_EXTRACT, yang menjalankan program ABAP Anda.
- Jadwalkan pekerjaan latar belakang: Untuk volume data besar atau ekstraksi otomatis, gunakan kode transaksi SM36 untuk menjadwalkan program sebagai pekerjaan latar belakang. File output akan ditulis ke jalur server aplikasi yang ditentukan dalam logika program.
Konfigurasi
- Kriteria seleksi: Program sebaiknya menyediakan parameter seleksi untuk memfilter data secara efektif. Filter utama meliputi:
- Rentang tanggal: Rentang tanggal wajib untuk tanggal pembuatan Purchase Order (EKKO-AEDAT). Sebaiknya mulai dengan periode 3-6 bulan untuk mengendalikan volume data dan menjaga kinerja laporan.
- Company Code (BUKRS): Penting bagi organisasi dengan beberapa badan hukum untuk membatasi cakupan ekstraksi.
- Purchasing Document Type (BSART): Memungkinkan Anda memfilter jenis PO tertentu, seperti Standard PO, Framework Order, atau Stock Transport Order, agar analisis lebih terarah.
- Pembacaan log perubahan: Ekstraksi aktivitas seperti 'Purchase Order Approved' atau 'Purchase Order Changed' bergantung pada pembacaan tabel log perubahan SAP (CDHDR, CDPOS). Proses ini dapat menggunakan banyak sumber daya. Optimalkan logika ABAP agar hanya memilih kelas objek (EINKBELEG, BANF) serta kombinasi tabel dan kolom yang diperlukan.
- Otorisasi: Pengguna atau akun teknis yang menjalankan laporan ini memerlukan otorisasi baca yang luas untuk tabel di beberapa modul SAP, termasuk Materials Management (MM), Financial Accounting (FI), dan tabel seluruh sistem. Tabel yang diperlukan mencakup EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR, dan CDPOS.
- Eksekusi di latar belakang: Untuk ekstraksi data lebih dari beberapa bulan atau pada sistem dengan volume transaksi tinggi, selalu jalankan program di latar belakang agar proses dialog tidak mengalami batas waktu.
Contoh kueri abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log. Siap memulai?
Template ini memberi Anda landasan untuk memulai process mining. Manfaatkan data SAP S/4HANA untuk menemukan peluang efisiensi dan memperbaiki proses Purchase to Pay Anda sekarang.
Perbaiki Purchase Order P2P dan pangkas waktu siklus
Hilangkan proses yang tidak efisien dan pangkas waktu siklus Purchase Order P2P hingga 30%.
Tidak perlu kartu kredit. Siapkan dalam hitungan menit.