Satın Alma'dan Ödeme'ye - Satın Alma Siparişi Veri Template'iniz
Satın Alma'dan Ödeme'ye - Satın Alma Siparişi Veri Template'iniz
- Detaylı analiz için önerilen nitelikler
- Süreç içinde takip edilecek temel aktiviteler
- Adım adım veri çıkarma rehberliği
Satınalmadan Ödemeye - Satın Alma Siparişi Öznitelikleri
| Ad | Açıklama | ||
|---|---|---|---|
| Aktivite ActivityName | Satınalma siparişi sürecinde meydana gelen iş `event`'inin veya adımının adı. | ||
| Açıklama Bu Aktivitelerin sırasını ve sıklığını analiz etmek, Neden önemli Süreçteki adımları tanımlayarak uçtan uca akışın görselleştirilmesini ve analizini, varyant analizini ve Nereden alınır Genellikle, EKKO/EKPO'daki durum alanları veya CDHDR/CDPOS'taki değişiklik belgesi Örnekler Satın Alma Siparişi OluşturulduSatın Alma Siparişi OnaylandıMal Kabul Kaydı YapıldıFatura Alındı | |||
| Olay Zamanı EventTime | Aktivitenin ne zaman gerçekleştiğini gösteren timestamp. | ||
| Açıklama Bu
Neden önemli Bu zaman damgası, Nereden alınır Oluşturma Tarihi (değişiklikler için EKKO-AEDAT) veya Kayıt Tarihi (mal kabulleri için MKPF-BUDAT) gibi belirli aktivitelerle ilişkili zaman damgası alanları. Genellikle birden çok tablodan Örnekler 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Satın Alma Siparişi PurchaseOrderNumber | Tedarik yaşam döngüsünü izlemek için birincil `case` Kimliği olarak hizmet veren Satınalma Siparişi (PO) için benzersiz tanımlayıcı. | ||
| Açıklama Satınalma Siparişi Numarası, ilk oluşturmadan nihai mal kabulü ve tamamlanmaya kadar tüm ilgili aktiviteleri birbirine bağlayan merkezi tanımlayıcıdır. Analizde, Neden önemli Tüm tedarik Nereden alınır Bu Örnekler 450001712345000171244500017125 | |||
| Kaynak Sistem SourceSystem | `veri`nin çıkarıldığı kaynak sistemi tanımlar. | ||
| Açıklama Bu Birden çok sistemin olduğu ortamlarda, bu alan Neden önemli
Nereden alınır Bu, Örnekler S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Son Veri Güncellemesi LastDataUpdate | Verilerin kaynak sistemden en son ne zaman yenilendiğini veya çıkarıldığını gösteren zaman damgası. | ||
| Açıklama Bu Son Neden önemli Kullanıcıları verilerin güncelliği hakkında bilgilendirir, analitik bulgularının bağlamını ve alaka düzeyini anlamalarını sağlar. Nereden alınır Bu, Örnekler 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Kullanıcı UserName | Belirli bir aktiviteyi gerçekleştiren kullanıcının tanımlayıcısı. | ||
| Açıklama Bu Kullanıcıya göre analiz, eğitim ihtiyaçlarını, iş yükü dağılımını ve bireysel performansı belirlemeye yardımcı olur. Örneğin, belirli kullanıcıların sürekli olarak uzun onay süreleri veya sık onay sonrası değişikliklerle ilişkili olup olmadığını görmek için kullanılabilir, bu da kaynak yönetimi ve süreç iyileştirme girişimlerini bilgilendirebilir. Neden önemli Bireysel veya ekip düzeyinde hesap verebilirlik ve performans analizi sağlayarak, eğitim fırsatlarını veya kaynak kısıtlamalarını belirlemeye yardımcı olur. Nereden alınır Bu bilgi, EKKO'daki ERNAM (Oluşturan) gibi alanlarda veya değişiklik belgesi tablolarındaki (CDHDR-USERNAME) kullanıcı alanından bulunur. Örnekler CB9980000012JSMITHRROE | |||
| Satın Alma Talebi PurchaseRequisitionNumber | Satınalma siparişini başlatan satınalma talebinin (PR) tanımlayıcısı. | ||
| Açıklama Bu Bu bağlantı, ilk talepten başlayarak tüm uçtan uca tedarik sürecini analiz etmek için hayati öneme sahiptir. 'Satınalma Talebi Onay Süresi' gibi KPI'ları destekler ve önceden onaylanmış bir talebi olmadan oluşturulan Satınalma Siparişlerinin 'Kontrol Dışı Harcama' olarak tanımlanması için temeldir. Neden önemli Satın Alma Siparişini (PO) ilk talebe bağlar, uçtan uca süreç analizine ve uyumsuz onaysız harcamaların tespitine olanak tanır. Nereden alınır Bu Örnekler 1001005110010052 | |||
| Satınalma Siparişi Belge Tipi DocumentType | Standart Satın Alma Siparişleri, hizmet Satın Alma Siparişleri veya stok transfer siparişleri gibi farklı Satın Alma Siparişi türlerini ayıran bir sınıflandırma. | ||
| Açıklama Belge Tipi, SAP'de süreç akışını, numara aralığını ve bir satınalma siparişi için alanları kontrol eden önemli bir yapılandırma öğesidir. İşletmelerin tedarik sürecini farklı senaryolara göre uyarlamasına olanak tanır. Süreci belge tipine göre analiz etmek, süreç varyasyonlarını anlamak için çok önemlidir. Örneğin, standart bir mal Satınalma Siparişi süreci, bir hizmet Satınalma Siparişi veya stok transferinden çok farklı olabilir. Bu Neden önemli Satınalma siparişlerini kategorize ederek farklı tedarik süreçlerinin karşılaştırılmasına olanak tanır ve süreç akışlarındaki ile döngü sürelerindeki farklılıkları açıklamaya yardımcı olur. Nereden alınır Bu Örnekler NBFOUB | |||
| Talep Edilen Teslimat Tarihi RequestedDeliveryDate | İşletmenin, satıcıdan mal veya hizmetleri teslim etmesini talep ettiği tarih. | ||
| Açıklama Bu
Neden önemli Tedarikçi zamanında teslimat performansını ölçmek için temel teşkil eder; bu, tedarik zinciri yönetimi ve operasyonel planlama için kritik bir KPI'dır. Nereden alınır Bu, EKET planlama satırı tablosunda, EINDT alanında bulunabilir. Örnekler 2023-06-012023-06-152023-07-01 | |||
| Tedarikçi Kimliği VendorId | Mal veya hizmet sağlayan tedarikçi için benzersiz tanımlayıcı. | ||
| Açıklama Tedarikçi Kimliği, bir satınalma siparişini belirli bir tedarikçiye bağlayan kritik bir ana
Neden önemli Tedarikçi merkezli analize olanak tanır, performansı değerlendirmeye, yüksek ve düşük performanslı tedarikçileri belirlemeye ve tedarik zincirini optimize etmeye yardımcı olur. Nereden alınır Bu Örnekler 100023100045100088 | |||
| Toplam Net Tutar TotalNetAmount | Vergi ve navlun maliyetleri hariç, satınalma siparişinin toplam değeri. | ||
| Açıklama Bu Bu miktar, Satınalma Siparişlerini değere göre kategorize etme (yüksek değerliye karşı düşük değerli) gibi finansal analizler için çok önemlidir; süreç yollarının farklılık gösterip göstermediğini görmek için. Ayrıca, daha fazla finansal risk taşıyabilecek veya iş üzerinde daha büyük etkisi olabilecek yüksek değerli siparişlere odaklanarak analizi önceliklendirmek için de kullanılabilir. Neden önemli Finansal tabanlı analizlere olanak tanır, satın alma siparişlerini değere göre segmentlere ayırmaya ve yüksek harcama alanlarındaki süreç iyileştirme çabalarını önceliklendirmeye yardımcı olur. Nereden alınır Bu Örnekler 1500.0025000.50125.75 | |||
| Kalem Kategorisi ItemCategory | Standart, konsinye, fason üretim veya hizmet gibi bir satın alma siparişi kalemini sınıflandırır. | ||
| Açıklama Kalem Kategorisi, belirli bir malzeme veya hizmetin tedarikinin nasıl kontrol edildiğini ve işlendiğini belirler. Mal kabulü ve fatura doğrulaması gibi sonraki adımları etkiler. Bu Neden önemli Mal, hizmet veya fason üretim gibi farklı tedarik türleri arasında ayrım yaparak süreç varyasyonlarını açıklar. Nereden alınır Bu Örnekler 093 | |||
| Kontrol Dışı Harcama mı? IsMaverickSpend | Bir satın alma siparişinin, önceden onaylanmış bir satın alma talebi olmaksızın oluşturulup oluşturulmadığını gösteren hesaplanmış bir işaret. | ||
| Açıklama Bu boolean bayrağı, Bu Neden önemli Doğrudan uyumsuz satın alma işlemlerini tespit eder, süreç sapmalarını nicelendirmeye ve finansal kontroller ile tedarik politikalarını uygulamaya yardımcı olur. Nereden alınır Belirli belge türleri için 'PurchaseRequisitionNumber' alanında bir değerin olmaması veya olay dizisinin analizi temelinde hesaplanmış alan. Örnekler truefalse | |||
| Malzeme Numarası MaterialNumber | Tedarik edilen belirli malzeme veya malın tanımlayıcısı. | ||
| Açıklama Malzeme Numarası, SAP'deki her malzeme ana kaydına atanan benzersiz bir koddur. Tedarik, envanter yönetimi ve satış dahil olmak üzere o malzemeyle ilgili tüm işlemler için kullanılır. Malzeme numarasına veya malzeme grubuna göre analiz yapmak, emtia bazlı analizlere olanak tanır. Belirli malzeme türleri için tedarik süreçlerinin daha az verimli olup olmadığını, daha uzun teslim sürelerine sahip olup olmadığını veya iadelere daha yatkın olup olmadığını belirlemeye yardımcı olabilir; bu da kategori yönetimi için içgörüler sağlar. Neden önemli Emtiaya dayalı analize olanak tanır, belirli ürünler veya malzemelerle ilgili süreç sorunlarını veya tedarikçi performans problemlerini belirlemeye yardımcı olur. Nereden alınır Bu Örnekler RM100-100FG210SERV-CONSULT | |||
| PO Onay Döngü Süresi PoApprovalCycleTime | Bir satınalma siparişinin oluşturulmasından nihai onayını almasına kadar geçen hesaplanan süre. | ||
| Açıklama Bu metrik, 'Satınalma Siparişi Oluşturuldu' aktivitesi ile 'Satınalma Siparişi Onaylandı' aktivitesi arasında geçen süreyi ölçer. Her bir satınalma siparişi Bu Neden önemli Dahili onay sürecinin verimliliğini doğrudan ölçer, tedarik sürecini yavaşlatan bottlenecks'leri belirlemeye ve gidermeye yardımcı olur. Nereden alınır Her bir Satın Alma Siparişi için 'Satın Alma Siparişi Onaylandı' olayı ile 'Satın Alma Siparişi Oluşturuldu' olayı arasındaki zaman farkı bulunarak hesaplanır. Örnekler P2D4H30MP0D2H15MP5D | |||
| Satın Alma Grubu PurchasingGroup | Belirli tedarik aktivitelerinden sorumlu olan alıcıların özel grubu. | ||
| Açıklama Satın Alma Grubu, belirli satın alma faaliyetlerinden, malzemelerden veya tedarikçilerden sorumlu olan bir alıcı veya alıcı grubudur. Tedarikçiler için birincil temas noktasıdırlar. Bu öznitelik, satın alma organizasyonundan daha ayrıntılı bir iş yükü ve performans analizi yapılmasına olanak tanır. Aşırı yüklenmiş ekipleri belirlemek, farklı alıcı gruplarının verimliliğini ölçmek ve onaysız harcama gibi süreç sapmalarına hangi grupların daha yatkın olduğunu anlamak için kullanılabilir. Neden önemli Satın alma ekibi performansına dair ayrıntılı bir görünüm sunarak, iş yükü, verimlilik ve süreç uyumluluğunun ekip düzeyinde analiz edilmesini sağlar. Nereden alınır Bu Örnekler 001002N00 | |||
| Satın Alma Organizasyonu PurchasingOrganization | Malzeme ve hizmet tedarikinden ve tedarikçilerle müzakere etmekten sorumlu organizasyonel birim. | ||
| Açıklama Satınalma Organizasyonu, tedarikte kilit bir organizasyonel birimdir. Kurumsal, şirket veya fabrika düzeyinde yapılandırılabilir ve tüm satınalma aktivitelerinden sorumludur. Süreci satınalma organizasyonuna göre analiz etmek, farklı tedarik ekiplerinin veya bölgelerinin verimliliğini ve performansını değerlendirmeye yardımcı olur. Organizasyonel birimler arasında tedarikçi müzakerelerinde, süreç uyumluluğunda veya onay gecikmelerindeki farklılıkları vurgulayabilir. Neden önemli Farklı tedarik departmanları veya bölgeler arasındaki performans karşılaştırmasına olanak tanır, en iyi uygulamaları ve iyileştirme alanlarını belirlemeye yardımcı olur. Nereden alınır Bu Örnekler 10101710US01 | |||
| Şirket Kodu CompanyCode | Satınalma siparişinin oluşturulduğu tüzel kişiliğin veya şirketin tanımlayıcısı. | ||
| Açıklama Şirket Kodu, bir kuruluş içindeki bağımsız bir muhasebe birimini temsil eder. Bir satınalma siparişiyle ilgili tüm finansal işlemler belirli bir şirket koduna kaydedilir. Bu, farklı yasal varlıklar arasındaki tedarik süreçlerinin filtrelenmesine ve karşılaştırılmasına olanak tanıyan temel bir organizasyonel Neden önemli Süreç analizinin tüzel kişilik bazında segmentlere ayrılmasına olanak tanır, işletmenin farklı bölümleri arasında performans ve uyumluluk karşılaştırmalarını kolaylaştırır. Nereden alınır Bu Örnekler 101017102000 | |||
| Tedarikçi Zamanında Teslimat SupplierOnTimeDelivery | Mal girişinin, talep edilen teslimat tarihinde veya öncesinde yapılıp yapılmadığını gösteren hesaplanmış bir işaret. | ||
| Açıklama Bu boolean Bu Neden önemli Tedarikçi güvenilirliğini doğrudan ölçer, zamanında teslimat KPI'sinin temelini oluşturur ve etkili tedarikçi performans yönetimine olanak tanır. Nereden alınır 'Mal Kabulü Yapıldı' etkinliğinin zaman damgası ile 'Talep Edilen Teslimat Tarihi' özniteliğinin karşılaştırılmasıyla hesaplanır. Örnekler truefalse | |||
| Tesis Plant | Malların teslim edildiği veya hizmetlerin sağlandığı operasyonel tesis veya konum. | ||
| Açıklama SAP'de Fabrika, malların üretildiği, depolandığı veya hizmetlerin gerçekleştirildiği fiziksel bir konumdur. Lojistik ve planlama için kilit bir unsurdur. Süreç analizini fabrikaya göre segmentlere ayırmak, tedarik sürecindeki bölgesel veya lokasyona özgü farklılıkları ortaya çıkarabilir. Örneğin, belirli fabrikaların daha uzun teslimat süreleri deneyimleyip deneyimlemediğini veya daha yüksek mal iade oranlarına sahip olup olmadığını gösterebilir, bu da yerel lojistik veya kalite kontrol sorunlarına işaret eder. Neden önemli Konum tabanlı analizlere olanak tanır, çeşitli operasyonel sahalar, üretim tesisleri veya depolar arasındaki süreç performansı farklılıklarını vurgular. Nereden alınır Bu Örnekler 10101710DE01 | |||
| Yeniden İşleme mi? IsRework | Satın alma siparişinin, onay sonrası bir değişiklik veya mal iadesi gibi yeniden işleme tabi tutulup tutulmadığını gösteren hesaplanmış bir işaret. | ||
| Açıklama Bu boolean Bu bayrak, 'Doğrudan İşleme Oranı' KPI'ının hesaplanmasını basitleştirir. Manuel müdahale veya düzeltme gerektiren tüm Satınalma Siparişlerinin kolayca filtrelenmesini ve görselleştirilmesini sağlayarak yeniden işleme maliyetini ve sıklığını ölçmeye yardımcı olur. Neden önemli Yeniden işleme içeren durumları işaretleyerek süreç verimsizliğini nicelendirmeye yardımcı olur, bu da kesintisiz işlem oranlarını hesaplamak ve sapmanın temel nedenlerini belirlemek için çok önemlidir. Nereden alınır Etkinlik dizisine dayalı hesaplanmış alan. Mantık, bir onayı 'Satın Alma Siparişi Değiştirildi' olayının takip edip etmediğini veya bir 'Mal İade Edildi' olayının olup olmadığını kontrol eder. Örnekler truefalse | |||
Satınalmadan Ödemeye - Satın Alma Siparişi Activityleri
| Aktivite | Açıklama | ||
|---|---|---|---|
| Fatura Alındı | Bir tedarikçi faturasının SAP sistemine girişini temsil eder ve ilgili satınalma siparişiyle bağlantısını kurar. Bu, bir muhasebe belgesi oluşturan açık bir finansal kayıttır. | ||
| Neden önemli Bu, tedarik sürecini borç hesapları süreciyle bağlayan kritik bir kilometre taşıdır. Mal kabulü ile fatura işleme arasındaki sürenin analizine olanak tanır. Nereden alınır Bir muhasebe belgesi BKPF (başlık) tablosunda oluşturulur ve kalemleri BSEG veya evrensel defter ACDOCA'da bulunur. Belge, RSEG tablosundaki Satın Alma Siparişi (PO) ile bağlantılıdır. Yakala Muhasebe belgesi başlık tablosu BKPF'den Belge Giriş Tarihi (CPUDT). Event tipi explicit | |||
| Mal Kabul Kaydı Yapıldı | Tedarikçiden malların fiziksel olarak teslim alınmasını ve sistemdeki ilgili girişi temsil eder. Bu, satınalma siparişi geçmişini güncelleyen açık bir işlemdir. | ||
| Neden önemli Bu, tedarikçi teslim süresini sona erdiren ve fatura doğrulamasının iç sürecini başlatan önemli bir kilometre taşıdır. Zamanında teslimat oranlarını izlemek için hayati öneme sahiptir. Nereden alınır MKPF (başlık) ve MSEG (kalem) tablolarında bir malzeme belgesi olarak kaydedilir ve EKBE satınalma siparişi geçmişi tablosunda belirli bir hareket tipiyle (örn. 101) bağlantılıdır. Yakala EKBE aracılığıyla bağlanan malzeme belgesi başlığındaki (MKPF) kayıt tarihi (BUDAT). Event tipi explicit | |||
| Satın Alma İsteği Oluşturuldu | Bu aktivite, mal veya hizmetler için resmi talebi işaretleyerek tedarik sürecini başlatır. `event`, bir kullanıcı yeni bir satınalma talebi belgesini (örn. ME51N işlemi kullanılarak) kaydettiğinde açıkça yakalanır. | ||
| Neden önemli Bu, birçok satınalma siparişi yaşam döngüsü için birincil başlangıç noktasıdır. Bu Nereden alınır EBAN (Satınalma Talebi) tablosunda kaydedilir. Oluşturma Yakala EBAN tablosunda bir belge oluşturulduğunda kaydedilen olay. Event tipi explicit | |||
| Satın Alma İsteği Onaylandı | Bir yönetici veya belirlenmiş bir onaycı tarafından bir satınalma talebinin resmi onayını temsil eder. Bu genellikle, talep belgesindeki bir durum değişikliğinden çıkarılır ve bunun bir satınalma siparişine dönüştürülmeye hazır olduğunu gösterir. | ||
| Neden önemli Bu, onay döngüsü sürelerini izlemek ve Nereden alınır EBAN tablosundaki serbest bırakma durumu alanlarından (örneğin, FRGZU - Serbest Bırakma göstergesi) çıkarılır. Zaman damgası, nihai serbest bırakma durumunun ne zaman ayarlandığını kaydeden değişiklik belgelerinden (CDHDR/CDPOS) türetilir. Yakala EBAN tablosundaki serbest bırakma durumu alanları için değişiklik günlüklerinden (CDHDR/CDPOS) çıkarılır. Event tipi inferred | |||
| Satın Alma Siparişi Oluşturuldu | Satınalma talebine referansla veya referanssız oluşturulabilecek resmi satınalma siparişi belgesinin oluşturulmasını işaretler. Bu, Satınalma Siparişi belgesi sisteme ilk kaydedildiğinde yakalanan açık bir `event`'tir. | ||
| Neden önemli Bu aktivite, özellikle kontrol dışı satın alma analizi için sürece alternatif bir başlangıç noktası olabilir. Genel Satınalma Siparişi işleme süresini izlemek için temel bir Nereden alınır Satınalma siparişi başlık tablosu EKKO'da kaydedilir. Oluşturma tarihi (AEDAT) ve saati, belge için doğrudan bu tabloda saklanır. Yakala Satın alma siparişi belgesi için EKKO tablosundaki oluşturma zaman damgası (AEDAT). Event tipi explicit | |||
| Satın Alma Siparişi Onaylandı | Satınalma siparişinin gerekli tüm iç onayları aldığını ve tedarikçiye gönderilmek üzere yetkilendirildiğini belirtir. Bu `event`, satınalma siparişinin serbest bırakma stratejisindeki bir durum değişikliğinden çıkarılır. | ||
| Neden önemli Bu, onay verimliliğini ve onay sonrası yeniden işlemeyi ölçmek için önemli bir kilometre taşıdır. Satınalma Siparişi oluşturma ile onay arasındaki süreyi analiz etmek, dahili süreç gecikmelerini vurgular. Nereden alınır EKKO tablosundaki serbest bırakma göstergesinden (FRGKE) çıkarılır. Zaman damgası, bu alanın 'serbest bırakıldı' durumuna güncellendiği zamana ait değişiklik geçmişine (CDHDR/CDPOS) bakılarak belirlenir. Yakala EKKO tablosundaki serbest bırakma göstergesi alanı (FRGKE) için değişiklik günlüklerinden çıkarılır. Event tipi inferred | |||
| Satınalma Siparişi Tamamlandı | Bu aktivite, bir satınalma siparişi kaleminin lojistik açıdan kapalı kabul edildiğini gösterir. 'Teslimat Tamamlandı' ve 'Nihai Fatura' göstergeleri her ikisi de ayarlandığında çıkarılır. | ||
| Neden önemli Bu, satınalma siparişi yaşam döngüsü analizi için bitiş noktası olarak hizmet eder. Bu Nereden alınır Satın alma siparişi kalem tablosu EKPO'daki durum bayraklarından çıkarılır. Olay, hem 'Teslimat Tamamlandı' göstergesi (ELIKZ) hem de 'Son Fatura' göstergesi (EREKZ) doğru olarak ayarlandığında meydana gelir. Yakala EKPO alanları ELIKZ ve EREKZ'nin her ikisi de tamamlanmış olarak işaretlendiğinde değişiklik günlüklerinden çıkarılır. Event tipi inferred | |||
| Fatura Ödendi | Tedarikçi faturasının, bir ödeme çalıştırması veya manuel ödeme yoluyla nihai olarak kapatılmasını işaretler. Bu, bir mahsup belgesi oluşturan açık bir finansal işlemdir. | ||
| Neden önemli Teknik olarak ödeme sürecinin bir parçası olsa da, bu aktivitenin dahil edilmesi, Satınalmadan Ödemeye döngüsüne eksiksiz bir görünüm sağlar. Ödeme koşullarını ve performansını analiz etmek için kilit öneme sahiptir. Nereden alınır Ödeme, BKPF/ACDOCA'da bir mahsup belgesi olarak kaydedilir. BSEG veya ACDOCA tablosundaki fatura kalemindeki mahsup tarihi (AUGDT), ödeme Yakala BSEG veya ACDOCA'da bulunan fatura belgesinin Mahsup Tarihi (AUGDT). Event tipi explicit | |||
| Hizmet Onayı Girildi | Bu aktivite, bir satınalma siparişinde belirtilen bir hizmetin yerine getirildiğine dair onayı işaretler. Açıkça bir hizmet giriş sayfası oluşturularak yakalanır. | ||
| Neden önemli Hizmet tabanlı tedarik için bu, bir mal girişine eşdeğerdir. Hizmet teslimat zaman çizelgelerini takip etmek ve zamanında tedarikçi ödemelerini sağlamak için çok önemlidir. Nereden alınır Bir hizmet giriş sayfası oluşturularak kaydedilir, veriler ESSR (başlık) ve ESLL (satırlar) tablolarında saklanır. Oluşturma tarihi zaman damgası olarak kullanılır. Yakala ESSR tablosundaki Hizmet Giriş Sayfası belgesinin oluşturulma tarihi. Event tipi explicit | |||
| Mallar İade Edildi | Daha önce alınan malların tedarikçiye iade edildiğini gösterir, genellikle kalite sorunları, hasar veya yanlış sevkiyatlar nedeniyle. Bu, açık bir iptal mal hareketi olarak kaydedilir. | ||
| Neden önemli Bu aktivite, yeniden işlemeyi ve tedarikçi kalitesi veya sipariş doğruluğuyla ilgili olası sorunları vurgular. Belirli bir tedarikçi veya malzeme için yüksek iade sıklığı, bir soruna işaret eder. Nereden alınır Belirli bir iade hareket tipiyle (örn. 122) bir malzeme belgesi olarak kaydedilir. Yakala EKBE'deki iade hareket tipiyle malzeme belgesinden kayıt tarihi. Event tipi explicit | |||
| Satın Alma Siparişi Değiştirildi | Bu aktivite, ilk oluşturulduktan sonra satınalma siparişinde miktar, fiyat veya teslimat tarihi gibi bir değişikliğin yapıldığını gösterir. Sistem değişiklik `log`'larında açıkça yakalanır. | ||
| Neden önemli Değişiklikleri, özellikle onay sonrası olanları izlemek, süreç verimsizliklerini, yeniden işlemeyi ve olası uyumluluk sorunlarını belirlemek için kritiktir. Sık yapılan değişiklikler, zayıf başlangıç spesifikasyonlarına işaret edebilir. Nereden alınır Satınalma siparişi nesneleri (EINKBELEG) için değişiklik belgesi tabloları CDHDR (başlık) ve CDPOS (kalem) içinde kaydedilir. Her değişiklik, ayrıntılı bir Yakala EKKO veya EKPO tablolarındaki ana alanlarda yapılan değişiklikler için kaydedilen olay, CDHDR/CDPOS'ta tutulur. Event tipi explicit | |||
| Satın Alma Siparişi Satıcıya Gönderildi | Satınalma siparişinin tedarikçiye EDI, e-posta veya yazılı çıktı gibi yollarla iletildiği anı temsil eder. Bu `event` genellikle sistemin çıktı yönetimi `log`'ları aracılığıyla yakalanır. | ||
| Neden önemli Bu aktivite, tedarikçi teslim süresinin gerçek başlangıcıdır. Tedarikçi performansını, siparişi aldıkları andan itibaren doğru bir şekilde ölçmek için çok önemlidir. Nereden alınır Bir satın alma belgesi için gönderilen mesajları kaydeden çıktı kontrol tablosu NAST'tan alınır. İlgili çıktı türünün (örneğin, EDI, e-posta) tarihi ve saati kullanılabilir. Yakala NAST tablosunda Satınalma Siparişi için ilk başarılı çıktı mesajının zaman damgası. Event tipi inferred | |||
| Satınalma Siparişi Silindi | Bir satınalma siparişi kaleminin veya tüm belgenin iptalini veya mantıksal olarak silinmesini temsil eder. Bu, bir kullanıcının belge üzerinde bir silme işareti ayarlamasıyla yakalanır. | ||
| Neden önemli Bu aktivite, süreç için alternatif bir bitiş noktasıdır ve bir başarısızlık veya iptali gösterir. Satınalma Siparişlerinin neden silindiğini analiz etmek, talep planlaması veya gereksinim tanımlamasındaki sorunları ortaya çıkarabilir. Nereden alınır Satın alma siparişi başlık (EKKO) veya kalem (EKPO) tablolarındaki silme göstergesi bayrağından (LOEKZ) alınır. Zaman damgası, değişiklik belgelerinden (CDHDR/CDPOS) türetilir. Yakala Silme işareti (LOEKZ) ayarlandığında değişiklik belgelerinden (CDHDR/CDPOS) zaman damgası. Event tipi explicit | |||
Veri Çekim Kılavuzları
Adımlar
- Ön Koşullar ve Erişim: SAP S/4HANA sistemindeki Core Data Services (CDS) görünümlerini sorgulamak için uygun yetkilere sahip bir kullanıcınız olduğundan emin olun. Erişimi, SAP HANA Studio, Eclipse için ABAP Geliştirme Araçları (ADT) veya SAP HANA veritabanına SQL bağlantılarını destekleyen üçüncü taraf bir veri çıkarma aracı aracılığıyla sağlayabilirsiniz.
- Sistem Bağlantı Ayrıntılarını Belirleyin: Ana bilgisayar, örnek numarası ve kimlik doğrulama bilgileriniz dahil olmak üzere SAP S/4HANA sisteminiz için gerekli bağlantı parametrelerini edinin.
- Veritabanına Bağlanın: Tercih ettiğiniz SQL istemcisini kullanarak, CDS görünümlerinin bulunduğu SAP S/4HANA veritabanına bir bağlantı kurun.
- SQL Sorgusunu Hazırlayın: Bu belgenin sorgu bölümünde sağlanan tam SQL sorgusunu SQL düzenleyicinize kopyalayın. Bu sorgu, gerekli tüm etkinlikleri ve öznitelikleri çıkarmak için tasarlanmıştır.
- Filtreleme Parametrelerini Ayarlayın: Sorgudaki yer tutucu değerlerini bulun.
_start_dateve_end_datedeğerlerini analiziniz için istediğiniz tarih aralığıyla (örneğin, '20230101' ve '20231231') değiştirin. Analiz etmek istediğiniz belirli şirket kodlarını dahil etmek içinpoh.CompanyCodefiltresini düzenleyin. - Sorguyu Çalıştırın: Değiştirilmiş SQL sorgusunu S/4HANA veritabanına karşı çalıştırın. Veri hacmine ve belirtilen tarih aralığına bağlı olarak, bu çalıştırma biraz zaman alabilir.
- Ön Sonuçları Gözden Geçirin: Sorgu tamamlandığında, SQL istemcinizdeki çıktıyı hızlıca gözden geçirin. Farklı etkinliklerin varlığını kontrol edin, zaman damgalarının doğru şekilde doldurulduğundan emin olun ve vaka kimliğinin (PurchaseOrderNumber) tutarlı olduğunu doğrulayın.
- Veriyi Dışa Aktarın: SQL aracınızdaki tüm sonuç kümesini bir CSV (Virgülle Ayrılmış Değerler) dosyasına dışa aktarın. Karakter sorunlarını önlemek için dosyanın UTF-8 kodlamasını kullandığından emin olun.
- Yüklemeye Hazırlanın: ProcessMind'e yüklemeden önce CSV dosyasını açın ve sütun başlıklarının veri gereksinimlerinde tanımlanan özniteliklerle (PurchaseOrderNumber, ActivityName, EventTime vb.) tam olarak eşleştiğini doğrulayın. Dışa aktarma aracınız bunları değiştirmişse sütun adlarını ayarlayın.
- ProcessMind'e Yükleyin: Sonlandırılmış CSV dosyasını ProcessMind projenize yükleyin. İçe aktarma işlemi sırasında dosyanızdaki sütunları ilgili vaka kimliği, etkinlik ve zaman damgası alanlarıyla eşleştirin.
Konfigürasyon
- Kullanılan Temel CDS Görünümleri: Veri çıkarma mantığı, bir dizi standart, semantik açıdan zengin CDS görünümüne dayanır. Başlıca görünümler şunlardır:
- I_PurchaseOrderItemAPI01: Temel satın alma siparişi kalem verileri için.
- I_PurchaseRequisitionItemAPI01: Satın alma talebi ayrıntıları için.
- I_MaterialDocumentItem: Mal girişleri ve iadeler gibi mal hareketleri için.
- I_ServiceEntrySheetAPI01: Hizmet onay etkinlikleri için.
- I_SupplierInvoiceAPI01: Tedarikçi fatura bilgileri için.
- I_OperationalAcctgDocItem: Faturaları ödeme takibi için finansal belgelere bağlamak amacıyla.
- I_ChangeDocument: Satın alma siparişindeki değişiklikleri yakalamak için.
- Tarih Aralığı Filtreleme: Performansı ve veri hacmini yönetmek için bir tarih aralığı filtresi uygulamak çok önemlidir. Sorgu, satın alma siparişi oluşturma tarihi (PurchaseOrderDate) üzerinde
_start_dateve_end_dateyer tutucularını kullanır. Önerilen başlangıç aralığı 3 ila 6 aylık veridir. - Organizasyonel Filtreleme: Sorgu, veri çıkarma kapsamını ilgili iş birimleriyle sınırlamak için her zaman Şirket Kodu'na (CompanyCode) göre filtrelenmelidir. Daha fazla iyileştirme için ana
PO_baseortak tablo ifadesine Satın Alma Siparişi Türü (PurchaseOrderType) veya Satın Alma Organizasyonu (PurchasingOrganization) üzerinde ek filtreler eklenebilir. - Ön Koşullar: Sorguyu yürüten kullanıcının yukarıda listelenen tüm CDS görünümlerinde SELECT yetkisine sahip olması gerekir. Bu görünümlere erişim genellikle S/4HANA'daki belirli iş veya analitik rolleri aracılığıyla verilir. Uygun izinler olmadan sorgu başarısız olacaktır.
a Örnek Sorgu 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' Adımlar
- Ön Koşullar ve Erişim: SAP S/4HANA sistemindeki Core Data Services (CDS) görünümlerini sorgulamak için uygun yetkilere sahip bir kullanıcınız olduğundan emin olun. Erişimi, SAP HANA Studio, Eclipse için ABAP Geliştirme Araçları (ADT) veya SAP HANA veritabanına SQL bağlantılarını destekleyen üçüncü taraf bir veri çıkarma aracı aracılığıyla sağlayabilirsiniz.
- Sistem Bağlantı Ayrıntılarını Belirleyin: Ana bilgisayar, örnek numarası ve kimlik doğrulama bilgileriniz dahil olmak üzere SAP S/4HANA sisteminiz için gerekli bağlantı parametrelerini edinin.
- Veritabanına Bağlanın: Tercih ettiğiniz SQL istemcisini kullanarak, CDS görünümlerinin bulunduğu SAP S/4HANA veritabanına bir bağlantı kurun.
- SQL Sorgusunu Hazırlayın: Bu belgenin sorgu bölümünde sağlanan tam SQL sorgusunu SQL düzenleyicinize kopyalayın. Bu sorgu, gerekli tüm etkinlikleri ve öznitelikleri çıkarmak için tasarlanmıştır.
- Filtreleme Parametrelerini Ayarlayın: Sorgudaki yer tutucu değerlerini bulun.
_start_dateve_end_datedeğerlerini analiziniz için istediğiniz tarih aralığıyla (örneğin, '20230101' ve '20231231') değiştirin. Analiz etmek istediğiniz belirli şirket kodlarını dahil etmek içinpoh.CompanyCodefiltresini düzenleyin. - Sorguyu Çalıştırın: Değiştirilmiş SQL sorgusunu S/4HANA veritabanına karşı çalıştırın. Veri hacmine ve belirtilen tarih aralığına bağlı olarak, bu çalıştırma biraz zaman alabilir.
- Ön Sonuçları Gözden Geçirin: Sorgu tamamlandığında, SQL istemcinizdeki çıktıyı hızlıca gözden geçirin. Farklı etkinliklerin varlığını kontrol edin, zaman damgalarının doğru şekilde doldurulduğundan emin olun ve vaka kimliğinin (PurchaseOrderNumber) tutarlı olduğunu doğrulayın.
- Veriyi Dışa Aktarın: SQL aracınızdaki tüm sonuç kümesini bir CSV (Virgülle Ayrılmış Değerler) dosyasına dışa aktarın. Karakter sorunlarını önlemek için dosyanın UTF-8 kodlamasını kullandığından emin olun.
- Yüklemeye Hazırlanın: ProcessMind'e yüklemeden önce CSV dosyasını açın ve sütun başlıklarının veri gereksinimlerinde tanımlanan özniteliklerle (PurchaseOrderNumber, ActivityName, EventTime vb.) tam olarak eşleştiğini doğrulayın. Dışa aktarma aracınız bunları değiştirmişse sütun adlarını ayarlayın.
- ProcessMind'e Yükleyin: Sonlandırılmış CSV dosyasını ProcessMind projenize yükleyin. İçe aktarma işlemi sırasında dosyanızdaki sütunları ilgili vaka kimliği, etkinlik ve zaman damgası alanlarıyla eşleştirin.
Konfigürasyon
- Kullanılan Temel CDS Görünümleri: Veri çıkarma mantığı, bir dizi standart, semantik açıdan zengin CDS görünümüne dayanır. Başlıca görünümler şunlardır:
- I_PurchaseOrderItemAPI01: Temel satın alma siparişi kalem verileri için.
- I_PurchaseRequisitionItemAPI01: Satın alma talebi ayrıntıları için.
- I_MaterialDocumentItem: Mal girişleri ve iadeler gibi mal hareketleri için.
- I_ServiceEntrySheetAPI01: Hizmet onay etkinlikleri için.
- I_SupplierInvoiceAPI01: Tedarikçi fatura bilgileri için.
- I_OperationalAcctgDocItem: Faturaları ödeme takibi için finansal belgelere bağlamak amacıyla.
- I_ChangeDocument: Satın alma siparişindeki değişiklikleri yakalamak için.
- Tarih Aralığı Filtreleme: Performansı ve veri hacmini yönetmek için bir tarih aralığı filtresi uygulamak çok önemlidir. Sorgu, satın alma siparişi oluşturma tarihi (PurchaseOrderDate) üzerinde
_start_dateve_end_dateyer tutucularını kullanır. Önerilen başlangıç aralığı 3 ila 6 aylık veridir. - Organizasyonel Filtreleme: Sorgu, veri çıkarma kapsamını ilgili iş birimleriyle sınırlamak için her zaman Şirket Kodu'na (CompanyCode) göre filtrelenmelidir. Daha fazla iyileştirme için ana
PO_baseortak tablo ifadesine Satın Alma Siparişi Türü (PurchaseOrderType) veya Satın Alma Organizasyonu (PurchasingOrganization) üzerinde ek filtreler eklenebilir. - Ön Koşullar: Sorguyu yürüten kullanıcının yukarıda listelenen tüm CDS görünümlerinde SELECT yetkisine sahip olması gerekir. Bu görünümlere erişim genellikle S/4HANA'daki belirli iş veya analitik rolleri aracılığıyla verilir. Uygun izinler olmadan sorgu başarısız olacaktır.
a Örnek Sorgu 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' Adımlar
- Spesifikasyon ve Tasarım: Gerekli ve önerilen tüm öznitelikleri içeren olay günlüğü dosyası için nihai veri yapısını tanımlayın. Gerekli 13 etkinliğin her biri için veri sağlamak üzere kullanılacak belirli SAP tablolarını (örneğin, EKKO, EKPO, EKBE, CDHDR, CDPOS, BKPF) belgeleyin.
- Program Oluşturma: SAP GUI'de SE38 veya SE80 işlem kodunu kullanarak ABAP Editörü'ne gidin. Yeni bir yürütülebilir program oluşturun, örneğin Z_PM_PO_EXTRACT.
- Seçim Ekranını Tanımlayın: Rapor için seçim ekranını kodlayın. Bu, kullanıcıların ayıklamak istedikleri verileri filtrelemesine olanak tanır. Satın Alma Siparişi oluşturma tarih aralığı (P_AEDAT), Şirket Kodu (P_BUKRS) ve Satın Alma Belge Türü (P_BSART) için parametreler ekleyin.
- Veri Bildirimleri: Program için gerekli iç tabloları ve veri yapılarını tanımlayın. Bu, spesifikasyon adımında tanımlanan yapıya uyan nihai olay günlüğü için bir iç tabloyu içerir.
- Veri Seçimi Mantığını Uygulayın: 13 etkinliğin her biri için veri seçmek üzere temel ABAP mantığını yazın. Bu, ilgili SAP tablolarına karşı bir dizi SELECT ifadesi ve gerektiğinde birleştirmeler içerir. Değişiklik tabanlı olaylar için değişiklik kaydı tabloları CDHDR ve CDPOS'tan okuyun.
- Verileri Dönüştürün ve Eşleştirin: Alınan her kayıt için, SAP tablo alanlarını nihai olay günlüğü iç tablonuzdaki ilgili sütunlarla eşleştirin. İşlem gören olaya göre ActivityName'i ayarlayın (örneğin, 'Purchase Order Created'). Tarih ve saat alanlarını EventTime için tutarlı bir zaman damgası formatına dönüştürün.
- Olay Verilerini Konsolide Edin: Tüm 13 etkinlik türünü işledikten sonra, tüm verilerin tek, birleşik bir iç tabloda toplandığından emin olun. Bu tablo, seçilen satın alma siparişleri için eksiksiz olay günlüğünü temsil eder.
- Dosya Çıkışını Uygulayın: Nihai iç tabloyu bir dosyaya yazma işlevselliğini ekleyin. Önerilen yaklaşım, kullanıcıların dosyayı yerel makinelerinde CSV olarak kaydetmelerine olanak tanıyan
cl_gui_frontend_services=>gui_downloadyöntemini kullanmak veya arka plan işleme için SAP uygulama sunucusuna kaydetmek içinOPEN DATASETkullanmaktır. - İşlem Kodu Oluşturun (İsteğe Bağlı): Programı iş kullanıcıları için kolayca erişilebilir kılmak için, ABAP programınızı çalıştıran özel bir işlem kodu (örneğin, ZPM_PO_EXTRACT) oluşturmak için SE93 işlem kodunu kullanın.
- Arka Plan İşini Planlayın: Büyük veri hacimleri veya otomatik veri çıkarma işlemleri için, programı arka plan işi olarak çalıştırmak üzere SM36 işlem kodunu kullanın. Çıktı dosyası, program mantığında belirtilen uygulama sunucusu yoluna yazılacaktır.
Konfigürasyon
- Seçim Kriterleri: Program, veriyi etkili bir şekilde filtrelemek için seçim parametreleri içermelidir. Başlıca filtreler şunlardır:
- Tarih Aralığı: Satın Alma Siparişi oluşturma tarihi (EKKO-AEDAT) için zorunlu bir tarih aralığı. Veri hacmini ve rapor performansını yönetmek için 3-6 aylık bir süreyle başlanması önerilir.
- Şirket Kodu (BUKRS): Çok sayıda tüzel kişiliğe sahip kuruluşlar için veri çıkarma kapsamını daraltmak açısından önemlidir.
- Satın Alma Belge Türü (BSART): Analizi odaklamak için Standart Satın Alma Siparişi, Çerçeve Siparişi veya Stok Transfer Siparişi gibi belirli Satın Alma Siparişi türlerinin filtrelenmesine olanak tanır.
- Değişiklik Kaydı Okuma: 'Satın Alma Siparişi Onaylandı' veya 'Satın Alma Siparişi Değiştirildi' gibi etkinliklerin çıkarılması, SAP değişiklik kaydı tablolarının (CDHDR, CDPOS) okunmasına dayanır. Bu, kaynak yoğun bir işlem olabilir. ABAP mantığı, yalnızca gerekli nesne sınıflarını (EINKBELEG, BANF) ve tablo/alan kombinasyonlarını seçmek üzere optimize edilmelidir.
- Yetkilendirmeler: Bu raporu çalıştıran kullanıcı veya teknik hesap, Malzeme Yönetimi (MM), Finansal Muhasebe (FI) ve sistem genelindeki tablolar dahil olmak üzere birden fazla SAP modülündeki tablolar için kapsamlı okuma yetkilerine ihtiyaç duyar. Bu tablolar arasında EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR ve CDPOS bulunur.
- Arka Plan Çalıştırma: Birkaç aydan daha fazla veri içeren veya yüksek işlem hacmine sahip bir sistemde çalışan veri çıkarma işlemleri için, diyalog işlem zaman aşımlarını önlemek amacıyla programı her zaman arka planda çalıştırın.
a Örnek Sorgu 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.