Satın Almadan Ödemeye - Satınalma Siparişi Veri Template'inuz
Satın Almadan Ödemeye - Satınalma Siparişi Veri Template'inuz
- Detaylı analiz için önerilen nitelikler
- Süreç içinde takip edilecek temel aktiviteler
- Adım adım veri veri çekme kılavuzu
Satın Almadan Ödemeye - Satınalma Siparişi Öznitelikleri
| Ad | Açıklama | ||
|---|---|---|---|
| Aktivite ActivityName | Satınalma siparişi sürecinde meydana gelen iş olayının veya adımının adı. | ||
| Açıklama Bu Aktivitelerin sırasını ve sıklığını analiz etmek, Neden Önemli?dir? 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ınalma Siparişi OluşturulduSatınalma Siparişi OnaylandıMal Kabul Kaydı YapıldıFatura Alındı | |||
| Olay Zamanı EventTime | Aktivitenin ne zaman gerçekleştiğini gösteren zaman damgası (zaman damgası)dır. | ||
| Açıklama Bu
Neden Önemli?dir? Bu zaman damgası (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ı (zaman damgası) alanları. Genellikle birden çok tablodan Örnekler::::::: 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Satınalma Siparişi PurchaseOrderNumber | Tedarik süreç döngüsünü izlemek için birincil vaka (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?dir? Tüm tedarik Nereden Alınır?? Bu Örnekler::::::: 450001712345000171244500017125 | |||
| Kaynak Sistem SourceSystem | verinin çıkarıldığı kaynak sistemi tanımlar. | ||
| Açıklama Bu Birden çok sistemin olduğu ortamlarda, bu alan Neden Önemli?dir?
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ı (zaman damgası)dır. | ||
| Açıklama Bu Son Neden Önemli?dir? Kullanıcıları verilerin güncelliği hakkında bilgilendirir, analitik bulgularının bağlamını ve alaka düzeyini anlamalarını sunar. 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 kimliğidir. | ||
| 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?dir? 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 büyük önem taşır. 'Satınalma Talebi Onay Süresi' gibi KPI'ları destekler ve önceden onaylanmış bir talebi olmadan oluşturulan Satın Alma Siparişlerinin 'Kontrol Dışı Harcama' olarak tanımlanması için büyük önem taşır. Neden Önemli?dir? Satınalma Siparişini (PO) ilk talebe bağlar, uçtan uca süreç analizine ve uyumsuz onaysız harcamaların tespitine sunar. 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ınalma 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 sunar. Süreci belge tipine göre analiz etmek, süreç varyasyonlarını anlamak için büyük önem taşır. Ö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?dir? Satınalma siparişlerini kategorize ederek farklı tedarik süreçlerinin karşılaştırılmasına sunar 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?dir? 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?dir? Tedarikçi merkezli analize sunar, 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ın Alma Siparişlerini değere göre kategorize etme (yüksek değerliye karşı düşük değerli) gibi finansal analizler için büyük önem taşır; 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?dir? Finansal tabanlı analizlere sunar, 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?dir? 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 değeri, Bu Neden Önemli?dir? Doğrudan uyumsuz satın alma işlemlerini tespit eder, süreç sapmalarını ölçmeye 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 sunar. 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 stratejik bilgiler sunar. Neden Önemli?dir? Emtiaya dayalı analize sunar, 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 | |||
| 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 sunar. 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?dir? 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 sunar. 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?dir? Farklı tedarik departmanları veya bölgeler arasındaki performans karşılaştırmasına sunar, 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?dir? Süreç analizinin tüzel kişilik bazında segmentlere ayrılmasına sunar, 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?dir? Tedarikçi güvenilirliğini doğrudan ölçer, zamanında teslimat KPI'sinin temelini oluşturur ve etkili tedarikçi performans yönetimine sunar. Nereden Alınır?? 'Mal Kabulü Yapıldı' etkinliğinin zaman damgası (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?dir? Konum tabanlı analizlere sunar, ç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ın Alma 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?dir? Yeniden işleme içeren durumları işaretleyerek süreç verimsizliğini ölçmeye yardımcı olur, bu da sorunsuz işlem oranlarını hesaplamak ve sapmanın temel nedenlerini belirlemek için büyük önem taşır. Nereden Alınır?? Etkinlik dizisine dayalı hesaplanmış alan. Mantık, bir onayı 'Satınalma 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ın Almadan Ödemeye - Satınalma Siparişi Aktiviteleri
| 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?dir? 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 sunar. 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ınalma 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?dir? 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 büyük önem taşır. 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?dir? Bu, birçok satınalma siparişi süreç 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?dir? Bu, onay döngüsü sürelerini izlemek ve darboğazları belirlemek için kritik bir kilometre taşıdır. Buradaki gecikmeler, bir satınalma siparişinin ne kadar hızlı oluşturulup bir tedarikçiye gönderileceğini doğrudan etkiler. 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ınalma 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?dir? 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ı (zaman damgası) (AEDAT). Event tipi explicit | |||
| Satınalma 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?dir? 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?dir? Bu, satınalma siparişi süreç döngüsü analizi için bitiş noktası olarak olarak kullanılır. 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?dir? Teknik olarak ödeme sürecinin bir parçası olsa da, bu aktivitenin dahil edilmesi, Satın Almadan Ödemeye döngüsüne eksiksiz bir görünüm sunar. Ödeme koşullarını ve performansını analiz etmek için önemlidir. 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?dir? 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 güçlüak için büyük önem taşır. 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ı (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?dir? 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ınalma 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?dir? Değişiklikleri, özellikle onay sonrası olanları izlemek, süreç verimsizliklerini, yeniden işlemeyi ve olası uyumluluk sorunlarını belirlemek için büyük önem taşır. 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ınalma 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?dir? 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 büyük önem taşır. 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ı (zaman damgası)dır. 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?dir? Bu aktivite, süreç için alternatif bir bitiş noktasıdır ve bir başarısızlık veya iptali gösterir. Satın Alma 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ı (zaman damgası)dır. Event tipi explicit | |||
Veri Çıkarma 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 oluşturabilirsiniz.
- 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 nitelikleri çıkarmak için optimize edilmiştir.
- 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ışanş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ği (Case ID)nin (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 öznitelikler.le (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 (Case ID), etkinlik ve zaman damgası (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 büyük önem taşır. 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ınalma 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 oluşturabilirsiniz.
- 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 nitelikleri çıkarmak için optimize edilmiştir.
- 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ışanş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ği (Case ID)nin (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 öznitelikler.le (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 (Case ID), etkinlik ve zaman damgası (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 büyük önem taşır. 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ınalma 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 nitelikleri içeren event log dosyası için nihai veri yapısını tanımlayın. Gerekli 13 etkinliğin her biri için veri güçlüak ü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 sunar. Satınalma 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 event log 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 event log 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ı (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 event lognü 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 (Opsiyonel): 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ınalma 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ınalma Siparişi, Çerçeve Siparişi veya Stok Transfer Siparişi gibi belirli Satınalma Siparişi türlerinin filtrelenmesine sunar.
- Değişiklik Kaydı Okuma: 'Satınalma Siparişi Onaylandı' veya 'Satınalma 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 detaylı okuma yetkilerine ihtiyaç duyar. Bu tablolar arasında EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR ve CDPOS bulunur.
- Arka Plan Çalışanş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.