Veri Şablonu: Siparişten Nakde - Satış Siparişi İşleme
Siparişten Tahsilata (Order to Cash) - Satış Siparişi İşleme Veri Şablonunuz (Data Template)
- Toplanması Önerilen Nitelikler
- Takip Edilmesi Gereken Temel Aktiviteler
- SAP ECC için Veri Çıkarım Rehberliği
Siparişten Tahsilata - Satış Siparişi İşleme Nitelikleri
| Ad | Açıklama | ||
|---|---|---|---|
Satış Siparişi SalesOrder | Tüm Siparişten Nakite sürecini izlemek için birincil vaka olarak hizmet eden bir satış siparişi belgesinin benzersiz tanımlayıcısı. | ||
Açıklama Satış Siparişi, satış sürecindeki merkezi belgedir ve bir müşterinin mal veya hizmet talebini temsil eder. Müşterinin talebini baştan sona işlemek için gerekli tüm bilgileri içerir. Process Mining'de bu nitelik, Case ID (Vaka Kimliği) olarak kullanılır. Her benzersiz Satış Siparişi numarası, bir uçtan uca süreç örneğini temsil eder. Süreçleri Satış Siparişi'ne göre analiz etmek, tam yaşam döngüsünü izlemeye, cycle time'ları (döngü sürelerini) ölçmeye ve her bir müşteri siparişi için varyasyonları belirlemeye olanak tanır. Neden önemli Her bir müşteri siparişinin yolculuğunun eksiksiz, uçtan uca analizini sağlayarak, ilgili tüm aktivite ve event'leri birbirine bağlayan temel anahtardır. Nereden alınır Satış Belgesi Başlık Verileri tablosunda (VBAK) VBELN alanı olarak bulunur. Örnekler 900001234590000123469000012347 | |||
Aktivite Activity | Satış siparişi süreci içinde gerçekleşen belirli bir iş adımı veya olayın adı. | ||
Açıklama Bu nitelik, 'Satış Siparişi Oluşturuldu', 'Teslimat Oluşturuldu' veya 'Ödeme Alındı' gibi Siparişten Nakite sürecindeki tek bir adımı tanımlar. Bu etkinlikler, her satış siparişi için süreç akışını yeniden oluşturmakta kullanılan yapı taşlarıdır. Bu etkinliklerin sıralamasını ve zamanlamasını analiz etmek, Process Mining'in temelini oluşturur. Bu, süreç haritasını görselleştirmeye, bottleneck'leri (darboğazları) belirlemeye, süreç varyantlarını keşfetmeye ve standart bir modele karşı uyumluluğu kontrol etmeye yardımcı olur. Etkinlikler genellikle belge oluşturma olayları, durum değişiklikleri veya sisteme kaydedilen belirli işlem kodlarının bir kombinasyonundan türetilir. Neden önemli Aktiviteler, süreç haritasının temelini oluşturur; süreç akışının, sapmaların ve darboğazların görselleştirilmesini ve analiz edilmesini sağlar. Nereden alınır Bu, genellikle veri çıkarma sırasında SAP işlem kodlarını (T-Kodları), belge durum değişikliklerini (örneğin, VBUK, VBUP tablolarından) veya değişiklik belgesi kayıtlarını (CDHDR, CDPOS tabloları) kullanıcı dostu aktivite adlarına eşleştirilerek oluşturulan türetilmiş bir özniteliktir. Örnekler Satış Siparişi OluşturulduTeslimat OluşturulduMallar Sevk EdildiFatura OluşturulduÖdeme Alındı | |||
Başlangıç Zamanı StartTime | Bir etkinlik veya olayın ne zaman başladığını gösteren timestamp (zaman damgası). | ||
Açıklama Başlangıç Zamanı, olay timestamp'i (zaman damgası) olarak da bilinir, belirli bir etkinliğin gerçekleştiği kesin tarih ve saati kaydeder. Örneğin, bir satış siparişinin ne zaman oluşturulduğunu, malların ne zaman sevk edildiğini veya bir faturanın ne zaman kayda alındığını kaydeder. Bu timestamp, Process Mining'deki tüm zaman tabanlı analizler için temeldir. Etkinlikler arasındaki cycle time'ları (döngü sürelerini) hesaplamak, bir vakanın toplam süresini ölçmek ve gecikmeleri veya bottleneck'leri (darboğazları) belirlemek için kullanılır. Doğru timestamp'ler, zamanında teslimatı veya karşılama teslim sürelerini izleyen performans analizi dashboard'ları için kritik öneme sahiptir. Neden önemli Bu, cycle timelar ve süreler gibi tüm performans metriklerini hesaplamak için kritik bir özniteliktir ve bottleneck'leri belirlemek için esastır. Nereden alınır Bu, genellikle VBAK (Satış Siparişi), LIKP (Teslimat) ve VBRK (Fatura) gibi çeşitli SAP tablolarından bir tarih alanı (örneğin, ERDAT) ve bir saat alanı (örneğin, ERZET) birleştirilerek türetilen birleşik bir özniteliktir. Örnekler 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
Kaynak Sistem SourceSystem | verinin çıkarıldığı kaynak sistemi tanımlar. | ||
Açıklama Bu öznitelik, verilerin kaynak sistemini, örneğin belirli bir SAP ECC örnek adını veya istemci numarasını belirtir. Özellikle birden fazla üretim sistemi veya eski sistemlerden gelen verilerin bulunduğu ortamlarda, verilere bağlam sağlar. Analizde, verileri kökenine göre filtrelemek veya segmentlere ayırmak için kullanılır. Bu, farklı sistemler arasındaki süreçleri karşılaştırmak veya sistem geçiş projeleri sırasında veri bütünlüğünü ve tutarlılığını sağlamak için özellikle yararlıdır. Neden önemli Çoklu sistem ortamlarında özellikle önemli bir bağlam sağlar, süreç karşılaştırmasına olanak tanır ve veri akışının net olmasını garantiler. Nereden alınır Bu değer, genellikle veri çıkarım sürecinde eklenir ve çoğu zaman SAP Sistem ID'si (SAPSID) veya client (MANDT)'ı temsil eden statik bir değerdir. Örnekler ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
Son Veri Güncellemesi LastDataUpdate | Bu kaydın verilerinin kaynak sistemden en son ne zaman yenilendiğini gösteren timestamp. | ||
Açıklama Bu nitelik, belirli bir olay veya vaka için en son veri çıkarma veya güncelleme tarihini ve saatini kaydeder. Analiz edilen veri'nin güncelliği hakkında şeffaflık sağlar. Dashboard'larda ve raporlarda, bu bilgi kullanıcıların içgörülerin güncelliğini anlamaları için kritik öneme sahiptir. Analizin operasyonların en güncel durumunu yansıtıp yansıtmadığını veya eski veri'lere dayanıp dayanmadığını teyit ederek, kullanıcıların veri'nin güncelliği hakkındaki beklentilerini yönetmelerine yardımcı olur. Neden önemli Kullanıcıların Process Mining analizine dayalı olarak zamanında ve bilinçli kararlar alması için kritik olan verinin güncelliğinden haberdar olmalarını sağlar. Nereden alınır Bu, veri alımı sırasında veri çıkarma aracı veya süreci tarafından doldurulan bir meta veri özniteliğidir. Kaynak SAP tablolarında saklanmaz. Örnekler 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
Kullanıcı User | Belgeyi oluşturan, son değiştiren veya etkinliği gerçekleştiren çalışanın kullanıcı kimliği. | ||
Açıklama Bu nitelik, süreçteki belirli bir olaydan sorumlu SAP kullanıcı kimliğini yakalar. Örneğin, siparişi oluşturan satış memurunu veya mal çıkışını kaydeden depo personelini tanımlar. Süreci kullanıcıya göre analiz etmek, iş yükü dağılımını anlamaya, eğitim ihtiyaçlarını belirlemeye ve farklı kullanıcıların aynı görevi nasıl yerine getirdiğindeki varyasyonları tespit etmeye yardımcı olur. Bu durum, kaynak performansına, uyumluluğa ve manuel müdahalelerin belirlenmesine odaklanan dashboard'lar için kritik öneme sahiptir. Neden önemli Kaynak performansına ve iş yüküne ilişkin görünürlük sağlar, kullanıcıya özel süreç sapmalarını belirlemeye yardımcı olur ve uyumluluk ve otomasyon analizi için anahtardır. Nereden alınır VBAK, LIKP, VBRK gibi birçok SAP başlık tablosunda 'Oluşturan' (ERNAM) veya 'Değiştiren' (AENAM) alanı olarak bulunur. Örnekler CBURKEJSMITHRWILLIAMS | |||
Malzeme Numarası MaterialNumber | Satılan bir ürün veya hizmet için benzersiz tanımlayıcı. | ||
Açıklama Malzeme Numarası, bir satış siparişi kalemindeki belirli öğeyi tanımlar. Tek bir satış siparişi birden fazla malzeme içerebildiğinden, bu nitelik genellikle kalem seviyesinde analiz edilir. Süreci Malzeme Numarası'na göre analiz etmek, ürüne özgü sorunları ortaya çıkarmaya yardımcı olur. Bu sayede, belirli ürünlerin daha uzun karşılama süreleri, daha yüksek teslimat engeli oranları veya daha sık fatura tutarsızlıkları ile ilişkili olup olmadığı tespit edilebilir. Bu durum, tedarik zinciri ve ürün yönetiminin farklı ürün grupları için süreci optimize etmesi açısından kritik öneme sahiptir. Neden önemli Ürün bazlı süreç analizine olanak tanır; hangi ürünlerin gecikmeler, blokajlar veya tekrar işleme gibi süreç verimsizlikleriyle ilişkili olduğunu ortaya çıkarır. Nereden alınır Satış Belgesi Kalem Verileri tablosunda (VBAP) MATNR alanı olarak bulunur. Örnekler FG-1001-ARAW-205BSERV-INSTALL | |||
Müşteri Numarası CustomerNumber | Satış siparişini veren müşteri için benzersiz tanımlayıcı. | ||
Açıklama Bu nitelik, satış siparişiyle ilişkili birincil müşteri hesabı olan 'Satış Yapılan Taraf'ı temsil eder. İşlemi, ana veri'lerdeki belirli bir müşteriye bağlar. Müşteri numarasına göre analiz etmek, süreci segmentlere ayırarak müşteriye özgü davranışları ve performansı anlamaya olanak tanır. Hangi müşterilerin en uzun cycle time'lara (döngü sürelerine), en yüksek yeniden işleme oranlarına veya en sık sipariş değişikliklerine sahip olduğu gibi soruları yanıtlamaya yardımcı olur. Bu durum, müşteri ilişkileri yönetimini ve hizmet seviyelerini iyileştirmek için kritik öneme sahiptir. Neden önemli Müşteri odaklı analizi mümkün kılar, belirli müşterileri etkileyen süreç sorunlarını belirlemeye ve müşteriye özel performansı ölçmeye yardımcı olur. Nereden alınır Satış Belgesi Başlık Verileri tablosunda (VBAK) KUNNR alanı olarak bulunur. Örnekler 100234100567200112 | |||
Net Tutar NetAmount | Başlık seviyesinde vergiler ve indirimler hariç, satış siparişinin toplam değeri. | ||
Açıklama Net Tutar, satış siparişinin parasal değerini temsil eder. Her process instance ile ilişkili önemli bir finansal metriktir. Bu nitelik, değere dayalı process mining için çok önemlidir. Yüksek değerli siparişlere odaklanarak süreç iyileştirme girişimlerini önceliklendirmeye olanak tanır. Analistler, gecikmeler veya yeniden işleme gibi süreç sorunlarını finansal etkiyle ilişkilendirebilir ve değişiklik için daha güçlü bir iş gerekçesi oluşturmaya yardımcı olabilir. Örneğin, yüksek değerli siparişlerin düşük değerli siparişlere göre daha verimli işlenip işlenmediğini analiz etmek için kullanılabilir. Neden önemli Değer tabanlı analizi sağlar, şirketin finansal performansı üzerinde en önemli etkiye sahip siparişlerdeki iyileştirme çalışmalarını önceliklendirmeye yardımcı olur. Nereden alınır Satış Belgesi Başlık Verileri tablosunda (VBAK) NETWR alanı olarak bulunur. Örnekler 1500.0012550.75850.50 | |||
Ret Nedeni RejectionReason | Bir satış siparişi kaleminin neden reddedildiğini veya iptal edildiğini gösteren bir kod. | ||
Açıklama Reddetme Nedeni, bir satış siparişinin veya belirli bir kaleminin neden karşılanmadığına dair bağlam sağlar. Bu durum, müşteri iptali, ürünün mevcut olmaması veya diğer iş nedenlerinden kaynaklanabilir. Bu nitelik, 'Satış Siparişi İptal Trendleri' dashboard'ı için büyük önem taşır. En yaygın reddetme nedenlerini analiz ederek, işletmeler kaybedilen satışların temel nedenlerini ortaya çıkarabilir. Bu içgörü, sipariş iptal oranını azaltmak amacıyla envanter yönetimi, fiyatlandırma stratejisi veya müşteri iletişimi alanlarında iyileştirmeleri tetikleyebilir. Neden önemli Sipariş iptallerinin 'nedenlerini' sunar, kaybedilen satışları azaltmak ve tahmin doğruluğunu artırmak için kök neden analizine olanak tanır. Nereden alınır Satış Belgesi Kalem Verileri tablosunda (VBAP) ABGRU alanı olarak bulunur. Örnekler 0215Z5 | |||
Satış Organizasyonu SalesOrganization | Ürün veya hizmetlerin satışından sorumlu organizasyonel birim. | ||
Açıklama Bir Satış Organizasyonu, şirketi satış gereksinimlerine göre yapılandıran SAP'deki kilit bir organizasyonel birimdir. Satış koşullarını müzakere etmekten ve mal ve hizmetleri dağıtmaktan sorumludur. Process Mining'de bu nitelik, analiz için kritik bir boyuttur. Süreç performansını, verimliliğini ve uyumluluğu farklı satış birimleri, bölgeler veya departmanlar arasında karşılaştırmaya olanak tanır. Bu, yüksek performanslı organizasyonlarda en iyi uygulamaları ve diğerlerinde iyileştirme alanlarını belirlemeye yardımcı olur. Neden önemli Kurumsal benchmarking (kıyaslama) olanağı sunar, farklı iş birimleri veya bölgeler arasında süreç verimliliği ve uyumluluk karşılaştırması yapılmasını sağlar. Nereden alınır Satış Belgesi Başlık Verileri tablosunda (VBAK) VKORG alanı olarak bulunur. Örnekler 100025003100 | |||
Satış Siparişi Döngü Süresi SalesOrderCycleTime | Satış siparişinin oluşturulmasından nihai kapanışına veya ödemesine kadar geçen toplam süre. | ||
Açıklama Bu hesaplanmış metrik, tek bir satış siparişinin baştan sona işleme süresini ölçer. Genellikle, ilk aktivitenin ('Sales Order Created') zaman damgası ile en son aktivitenin (örneğin, 'Payment Received' veya 'Order Item Closed') zaman damgası arasındaki fark olarak hesaplanır. Bu öznitelik, 'Sales Order End-to-End Cycle Time' dashboard'u ve Sales Order Fulfillment Cycle Time KPI'ı için birincil ölçüttür. Süreç verimliliğine üst düzey bir bakış açısı sunar ve uzun süren siparişleri ve genel süreç sağlığını belirlemek için kritik bir metriktir. Bu metriğin dağılımını analiz etmek, kıyaslamalar oluşturmaya ve zaman içindeki iyileştirme girişimlerinin etkisini izlemeye yardımcı olur. Neden önemli Bu, genel süreç hızı ve verimliliğini ölçmek için birincil KPI'dır ve iyileştirme girişimleri için kritik bir temel sağlar. Nereden alınır Bu, belirli bir SalesOrder için maksimum ve minimum StartTime arasındaki farkı alarak event log'dan türetilmiş hesaplanmış bir metriktir. Örnekler 10 gün 4 saat25 gün 11 saat5 gün 2 saat | |||
Teslimat Engeli DeliveryBlock | Bir satış siparişinin teslimat için bloke edilip edilmediğini, böylece bir teslimat belgesinin oluşturulmasını engelleyip engellemediğini gösteren bir kod. | ||
Açıklama Teslimat Engeli, bir satış siparişinde (belge başlığı veya kalem seviyesinde) teslimat adımından önce sürecin geçici olarak durdurulmasını sağlayan bir durumdur. Bu engellemeler, kredi limiti yetersizliği veya eksik veri gibi nedenlerle bir kullanıcı tarafından manuel olarak veya sistem tarafından otomatik olarak ayarlanabilir. Bu nitelik, 'Satış Siparişi Engelleme ve Yeniden İşleme Analizi' dashboard'ı için kritik önem taşır. Teslimat engellerinin sıklığını, süresini ve nedenlerini analiz etmek, sipariş karşılama sürecindeki ana bottleneck'leri (darboğazları) belirlemeye yardımcı olur. Bu engellemeleri azaltmak, zamanında teslimatı ve genel cycle time'ı iyileştirmenin kilit noktasıdır. Neden önemli Tedarik sürecindeki darboğazları doğrudan belirler. Siparişlerin neden ve ne sıklıkla bloke edildiğini analiz etmek, akış verimliliğini artırmak için kritik öneme sahiptir. Nereden alınır Satış Belgesi Başlık Verileri tablosunda (VBAK) LIFSK alanı olarak bulunur. Örnekler 0102Z1 | |||
Kredi Kontrol Durumu CreditCheckStatus | Satış belgesi için kredi kontrolünün durumunu gösterir. | ||
Açıklama Bu öznitelik, bir satış siparişinde gerçekleştirilen otomatik veya manuel kredi kontrolünün sonucunu gösterir. Yaygın durumlar arasında 'Approved' (Onaylandı), 'Rejected' (Reddedildi) veya 'Blocked' (Engellendi) bulunur. Bu, 'Credit Check Processing Time Analysis' dashboard'u için kritik bir özniteliktir. Kredi kontrol aşamasındaki gecikmeler veya engellemeler, genel sipariş karşılama cycle timeını önemli ölçüde etkileyebilir. Bu durumu analiz etmek, kredi yönetimi sürecinin verimliliğini ve satış hızına olan etkisini anlamaya yardımcı olur. Neden önemli Sipariş işleme hızını doğrudan etkiler. Bu durumu analiz etmek, siparişin yerine getirilmesini geciktiren kredi yönetimi darboğazlarını belirlemeye yardımcı olur. Nereden alınır Satış Belgesi Başlık Durum tablosunda (VBUK) veya doğrudan VBAK'ta kredi durumu alanı (örn. CMGST) olarak bulunur. Örnekler ABD | |||
Onaylanmış Teslim Tarihi ConfirmedDeliveryDate | Mal veya hizmetlerin müşteriye teslimatının onaylandığı tarih. | ||
Açıklama Bu, malzeme mevcudiyeti ve planlamaya dayalı olarak müşteriye verilen taahhüt edilen teslimat tarihidir. Teslimat performansını ölçmek için temel teşkil eder. Bu öznitelik, 'On-Time Delivery Performance' dashboard'u ve On-Time Delivery Rate KPI'ı için temeldir. Confirmed Delivery Date'i, gerçek 'Goods Issued' tarihiyle karşılaştırarak, analiz, bir siparişin zamanında, erken veya geç teslim edilip edilmediğini belirleyebilir. Bu, tedarik zinciri güvenilirliğinin ve müşteri memnuniyetinin birincil ölçüsüdür. Neden önemli Bu, müşteri memnuniyeti ve tedarik zinciri verimliliği için kritik bir KPI olan zamanında teslimat performansını ölçmek için kıyas noktasıdır. Nereden alınır Satış Belgesi Program Satırı tablosunda (VBEP) EDATU alanı olarak bulunur. Örnekler 2023-05-102023-06-202023-07-01 | |||
Sevkiyat Koşulları ShippingConditions | Müşteriye yapılan ürün teslimatları için genel sevkiyat stratejisini tanımlar. | ||
Açıklama Sevkiyat Koşulları, bir siparişin nasıl gönderileceğini belirler; örneğin 'Standart', 'Ekspres' veya 'Teslim Alma'. Bu, müşteriyle kararlaştırılır ve lojistik planlamayı etkiler. Bu öznitelik, 'Sevkiyat Yöntemi Verimliliği ve Maliyeti' analizinde kullanılır. Süreçi sevkiyat koşullarına göre bölümlendirerek şirketler, belirli yöntemlerin gecikmelere daha yatkın olup olmadığını veya daha uzun döngü sürelerine sahip olup olmadığını analiz edebilir. Bu veri, lojistiği optimize etmeye ve müşterilerin teslimat süreleri hakkındaki beklentilerini yönetmeye yardımcı olur. Neden önemli Lojistik performansının analiz edilmesini sağlayarak, belirli sevkiyat yöntemlerinin gecikmelerle veya daha yüksek verimlilikle ilişkili olup olmadığını belirlemeye yardımcı olur. Nereden alınır Satış Belgesi Başlık Verileri tablosunda (VBAK) VSBED alanı olarak bulunur. Örnekler 011020 | |||
Yeniden İşleme mi? IsRework | Bir satış siparişinin ilk oluşturulduktan sonra önemli bir değişiklik veya yeniden işleme aktivitesine uğradığını gösteren bir boolean bayrağı. | ||
Açıklama Bu hesaplanmış öznitelik, bir veya daha fazla 'Sales Order Changed' aktivitesi gibi yeniden işleme (rework) maruz kalmış süreç örneklerini tanımlar. Yeniden işlemenin ne olduğunu (örneğin, fiyat, miktar veya teslimat tarihinde yapılan bir değişiklik) belirleyen özel mantık, proje kurulumu sırasında tanımlanır. Bu öznitelik, 'Sales Order Rework and Change Frequency' dashboard'u ve Sales Order Rework Rate KPI'ı için hayati öneme sahiptir. Sorunsuz bir yoldan ilerleyen siparişler ile manuel değişiklik gerektiren siparişler arasında doğrudan filtreleme ve karşılaştırma yapmaya olanak tanıyarak analizi basitleştirir. Bu, yeniden işlemenin cycle timeları ve maliyetler üzerindeki etkisini ölçmeye yardımcı olur. Neden önemli Yeniden çalışma sıklığını doğrudan ölçer, bu da nedenlerinin ve genel süreç verimliliği ile döngü süresi üzerindeki etkisinin analiz edilmesini sağlar. Nereden alınır Bu, event log'dan türetilmiş hesaplanmış bir özniteliktir. Mantık, 'Sales Order Changed' aktivitelerinin veya CDHDR/CDPOS tablolarından belirli değişiklik olaylarının varlığını kontrol eder. Örnekler truefalse | |||
Zamanında Teslimat mı IsOnTimeDelivery | Malların onaylanan teslimat tarihinde veya daha önce sevk edilip edilmediğini gösteren bir boolean bayrağı. | ||
Açıklama Bu hesaplanmış öznitelik, bir satış siparişi için gerçek mal çıkış tarihini 'ConfirmedDeliveryDate' ile karşılaştırır. Mal çıkış tarihi, teyit edilen tarihte veya öncesinde ise doğru, aksi takdirde yanlış olarak işaretlenir. Bu öznitelik, 'On-Time Delivery Performance' dashboard'unun oluşturulmasını ve On-Time Delivery Rate KPI'ının hesaplanmasını basitleştirir. Her analiz veya grafik içinde anında tarih karşılaştırmaları yapmaya gerek kalmadan performansın kolayca toplanmasına ve görselleştirilmesine olanak tanır. Bu sayede, teslimat güvenilirliğinin net ve hızlı bir ölçüsünü sunar. Neden önemli Teslimat performansının açık ve basit bir ölçüsünü sunarak, genel Zamanında Teslimat Oranı KPI'ını hesaplamayı kolaylaştırır. Nereden alınır Bu, hesaplanmış bir özniteliktir. Mantık, 'Goods Issued' aktivitesinin zaman damgasını 'ConfirmedDeliveryDate' özniteliğinden gelen değerle karşılaştırır. Örnekler truefalse | |||
Siparişten Tahsilata - Satış Siparişi İşleme Etkinlikleri
| Aktivite | Açıklama | ||
|---|---|---|---|
Fatura Oluşturuldu | Müşteri faturası veya faturalandırma belgesinin oluşturulmasını işaretler. Bu, sistemde yeni bir belge oluşturan ve sürecin ödeme kısmını başlatan açık bir event'tir. | ||
Neden önemli Bu, 'Invoice to Payment Cycle Time'ı için süreyi başlatan önemli bir kilometre taşıdır. Faturalandırmadaki gecikmeler nakit akışını doğrudan etkiler. Nereden alınır VBRK tablosunda (Fatura Belgesi: Başlık Verileri) oluşturulma tarihine (ERDAT) göre kaydedilir. Satış siparişi veya teslimata bağlantı VBFA tablosundadır. Yakala VBRK tablosundaki oluşturma timestamp'ine (ERDAT) dayalı Event. Event tipi explicit | |||
Mallar Sevk Edildi | Malların mülkiyetinin devredildiği ve resmi olarak depodan ayrıldığı kritik bir event'tir. Bu, bir malzeme belgesi oluşturan ve envanteri güncelleyen açık bir finansal kayıttır. | ||
Neden önemli Bu, 'sevkiyat' olayıdır ve zamanında teslimatı ve karşılama teslim sürelerini ölçmek için anahtar bir kilometre taşıdır. Finansal güncellemeleri tetikler ve fiziksel karşılama sürecinde geri dönüşü olmayan bir noktadır. Nereden alınır Teslimat belgesine bağlı, mal çıkış hareket tipi (örn. 601) içeren bir malzeme belgesi (MKPF/MSEG) oluşturulması. Yakala Teslimata bağlı, mal çıkış hareket tipi içeren bir malzeme belgesi (MKPF/MSEG) oluşturulması. Event tipi explicit | |||
Ödeme Alındı | Bu olay, müşterinin ödemesinin alındığını ve faturaya uygulanarak açık alacak kalemini kapattığını gösterir. Bu, bir finansal belgenin kapatılmasından çıkarılan bir muhasebe olayıdır. | ||
Neden önemli Bu, satıştan nakit tahsilatını gerçekleştirmenin son adımıdır. 'Faturadan Ödemeye Süre' ve genel 'Satış Siparişi Karşılama Süresi'ni ölçmek için son noktadır. Nereden alınır Müşteri kalemi için BSEG tablosundaki kapanış belgesi bilgilerinden çıkarılmıştır. BSEG-AUGBL (Kapanış Belgesi) ve BSEG-AUGDT (Kapanış Tarihi) doldurulduğunda, ödeme alınmış demektir. Yakala AR kalemleri için BSEG tablosundaki kapanış tarihi (AUGDT) bilgisinden çıkarılmıştır. Event tipi inferred | |||
Satış Siparişi Oluşturuldu | Yeni bir satış siparişi belgesinin oluşturulmasını işaretler. Bu, bir kullanıcının yeni bir siparişi kaydettiğinde, tipik olarak SAP'deki VA01 işlemi aracılığıyla yakalanan açık bir event'tir. | ||
Neden önemli Bu, 'Siparişten Naktie' sürecinin birincil başlangıç eventidir. Zamanlamasının analiz edilmesi, genel cycle time ve sipariş alım oranlarını ölçmek için hayati öneme sahiptir. Nereden alınır VBAK tablosunda (Satış Belgesi Başlık Verileri) oluşturma tarihi (ERDAT) ve saati (ERZET) kullanılarak kaydedilir. İşlem kodu VBAK-TCODE'da saklanır. Yakala VBAK tablosundaki oluşturma timestamp'ine (ERDAT, ERZET) dayalı Event. Event tipi explicit | |||
Sipariş Kalemi Kapatıldı | Bu etkinlik, bir satış siparişi kaleminin nihai kapanışını işaret eder; bu da ürünün tamamen teslim edildiği, faturalandırıldığı ve tamamlandığı anlamına gelir. Bu durum, kalemin genel durumundan çıkarılır. | ||
Neden önemli Sürecin başarılı son olayı olarak işlev görür. Öğelerin ne zaman kapandığını analiz etmek, uçtan uca süreç süresini anlamaya ve gereksiz yere açık kalan siparişleri belirlemeye yardımcı olur. Nereden alınır Kalem için VBUP tablosundaki (Satış Belgesi: Kalem Durumu) genel durum alanından çıkarılmıştır. VBUP-GBSTA 'C' (Tamamen işlendi) olduğunda, kalem kapatılmış demektir. Yakala Kalem durumunun (VBUP-GBSTA) 'C' (Tamamen işlendi) olarak değişmesinden çıkarılmıştır. Event tipi inferred | |||
Sipariş Onaylandı | Bu etkinlik, satış siparişinin tüm ilk kontrollerden geçtiğini ve sipariş karşılama için onaylandığını gösterir. Genellikle siparişin artık engellenmediği ve planlama kalemlerinde onaylanmış miktarlar bulunduğu zaman çıkarılır. | ||
Neden önemli Bu, sipariş girişini karşılamadan ayıran önemli bir kilometre taşıdır. Karşılama teslim sürelerini ve zamanında teslimat performansını ölçmek için başlangıç noktasıdır. Nereden alınır VBEP'deki çizelge kalemlerinin onaylanmış bir miktarı (BMENG > 0) olduğunda ve sipariş teslimat için engellenmediğinde (örn. VBUK-LIFSK boş olduğunda) çıkarılabilir. Yakala Tedarik planı satırı onayından (VBEP-BMENG > 0) ve başlık seviyesindeki blokların kaldırılmasından çıkarılmıştır. Event tipi inferred | |||
Fatura İptal Edildi | Önceden oluşturulmuş bir fatura belgesinin tersine çevrilmesini temsil eder. Bu, orijinal belgeyi dengelemek için yeni bir iptal belgesi oluşturan açık bir işlemdir. | ||
Neden önemli Fatura iptallerini izlemek, fiyatlandırma, sevkiyat tutarsızlıkları veya veri hatalarıyla ilgili sorunları belirlemeye yardımcı olur. Bu, 'Fatura Farklılık Oranı' KPI'ını destekler. Nereden alınır İptal faturalandırma belgesi (VBRK-VBTYP = 'N' veya 'O') oluşturularak yakalanan açık bir event. Orijinal fatura VBRK-SFAKN'de referans alınır. Yakala VBRK'da orijinal faturaya referans veren bir iptal belgesi oluşturulması. Event tipi explicit | |||
Kredi Kontrolü Gerçekleştirildi | Satış siparişindeki müşteri için otomatik veya manuel kredi kontrolünün tamamlandığını gösterir. Bu durum genellikle belgenin genel kredi durumundaki bir değişiklikten çıkarılır. | ||
Neden önemli Kredi kontrolü genellikle kritik bir darboğazdır. Bu adım için harcanan süreyi ölçmek, 'Kredi Kontrolü İşlem Süresi Analizi' ve sipariş işlemeyi hızlandırmak için esastır. Nereden alınır VBUK tablosundaki (Satış Belgesi: Başlık Durumu) kredi durumu alanlarından çıkarılmıştır. VBUK-CMGST'nin bloke durumdan serbest bırakılma durumuna değişmesi bu aktiviteyi işaretler. Yakala Genel kredi durumu (VBUK-CMGST) alanındaki değişikliklerden çıkarılmıştır. Event tipi inferred | |||
Satış Siparişi Değiştirildi | Mevcut bir satış siparişinin ilk oluşturulmasından sonra yapılan bir değişikliği temsil eder. Bu değişiklikler, miktar, fiyat veya tarihler gibi alanlar değiştirildiğinde özel değişim log tablolarında (CDHDR, CDPOS) yakalanır. | ||
Neden önemli Değişiklikleri izlemek, yeniden işleme, süreç istikrarsızlığı ve veri kalitesi sorunlarını belirlemeye yardımcı olur. Yüksek değişiklik sıklığı, ilk sipariş giriş sürecindeki sorunlara işaret edebilir ve gecikmelere yol açabilir. Nereden alınır OBJECTCLAS = 'VERKBELEG' için değişim belgesi tabloları CDHDR (başlık) ve CDPOS (kalem) sisteminden alınır. Timestamp ve değişen alan tanımlanabilir. Yakala Satış belgesi nesneleri için değişiklik belgesi tablolarından (CDHDR, CDPOS) Event. Event tipi explicit | |||
Sipariş İptal Edildi | Bir satış siparişinin karşılanmadan önce iptal edildiğini gösterir. Bu durum genellikle, siparişteki ilgili tüm kalemlere bir 'reddetme nedeni' uygulanarak yakalanır. | ||
Neden önemli Bu, 'Order Cancellation Rate' KPI'ını doğrudan destekleyen kritik bir başarısızlık noktasıdır. Siparişlerin ne zaman ve neden iptal edildiğini anlamak, satış süreci sorunlarına ilişkin içgörüler sağlar. Nereden alınır Bir satış siparişindeki tüm aktif kalemler için VBAP-ABGRU (Reddetme nedeni) alanının doldurulmasından çıkarılmıştır. Değişiklik tarihi CDHDR/CDPOS'ta bulunabilir. Yakala Tüm kalemlerde 'Reddetme Nedeni' (VBAP-ABGRU) alanının doldurulmasından çıkarılmıştır. Event tipi inferred | |||
Teslimat Engeli Konuldu | Satış siparişine bir teslimat engeli uygulandığı, teslimat belgesinin oluşturulmasını engelleyen bir eylemi temsil eder. Bu, değişim loglarından açıkça yakalanabilir veya durum tablolarından çıkarılabilir. | ||
Neden önemli Bu etkinlik, 'Satış Siparişi Engelleme Oranı' KPI'ı ile doğrudan ilişkilidir. Engellemelerin neden ve ne sıklıkla ayarlandığını belirlemek, sipariş karşılama gecikmelerinin nedenlerini ortaya çıkarmaya yardımcı olur. Nereden alınır VBAK-LIFSK alanı için değişiklik log'larında (CDHDR/CDPOS) bulunabilir. Alternatif olarak, VBAK-LIFSK alanının ne zaman doldurulduğu gözlemlenerek çıkarılır. Yakala VBAK-LIFSK veya VBAP-LIFSP alanı için değişiklik belgelerinden Event. Event tipi explicit | |||
Teslimat Kanıtı Onaylandı | Bu etkinlik, müşterinin malları teslim aldığının onayını temsil eder. Teslimat kanıtı sisteme kaydedildiğinde, genellikle teslimat belgesi durumu güncellenerek kayıtlara geçer. | ||
Neden önemli Bu olay, 'On-Time Delivery Rate'i vaat edilen tarihe göre doğru bir şekilde ölçmek için esas olan gerçek teslimat tarihini sağlar. Nereden alınır Teslimat kanıtı durumunun (VBUK-PODAT) 'C' (Onaylandı) olarak ayarlanmasından çıkarılmıştır. Onay tarihi VLPOD-PODAT'ta saklanır. Bu her zaman uygulanmayabilir. Yakala Teslimat üzerinde POD durumu güncellemesinden (VBUK-PODAT) veya VLPOD tablosu girişinden çıkarılmıştır. Event tipi inferred | |||
Teslimat Oluşturuldu | Bu olay, depoya toplama ve sevkiyat faaliyetlerine başlaması talimatını veren çıkış teslimat belgesinin oluşturulmasını işaretler. Bu, belge akışından yakalanan açık bir olaydır. | ||
Neden önemli Bu, fiziksel karşılama sürecindeki ilk adımdır. Sipariş onayı ile teslimat oluşturma arasındaki süre, lojistik sürecinin ne kadar hızlı başlatıldığını gösterir. Nereden alınır LIKP tablosunda (SD Belgesi: Teslimat Başlık Verileri) bir kaydın oluşturulması. Satış siparişine bağlantı belge akışı tablosu VBFA'da tutulur. Yakala VBFA tablosu aracılığıyla bağlanan, LIKP tablosundaki oluşturma timestamp'ine dayalı Event. Event tipi explicit | |||
Toplama Tamamlandı | Teslimat için tüm kalemlerin depodan fiziksel olarak toplandığını gösterir. Depo Yönetimi (WM) kullanılıyorsa, bu durum Transfer Siparişinin durumundan çıkarılabilir. | ||
Neden önemli Toplama süresini analiz etmek depo operasyonlarını optimize etmeye yardımcı olur. Buradaki gecikmeler, genel sevkiyat zaman çizelgesini ve sipariş karşılama döngüsünü doğrudan etkiler. Nereden alınır LIPS-KOSTA tablosundaki teslimat kaleminin toplama durumunun 'C' (tamamen toplandı) olarak değişmesinden çıkarılmıştır. WM aktifse, Transfer Emri onayından (LTAK/LTAP tabloları) çıkarılabilir. Yakala Toplama durumu (LIPS-KOSTA) değişikliğinden veya WM Transfer Emri onayından çıkarılmıştır. Event tipi inferred | |||
Veri Çekim Kılavuzları
Adımlar
- Program Geliştirme: SE38 veya SE80 işlemini kullanarak yeni bir çalıştırılabilir ABAP programı oluşturun. Bu program, tüm veri çıkarma mantığını içerecektir.
- Seçim Ekranı Tanımlama: Programınızda verileri filtrelemek için bir seçim ekranı oluşturun. Satış Belgesi Oluşturma Tarihi (VBAK-ERDAT), Satış Organizasyonu (VBAK-VKORG) ve Satış Belgesi Türü (VBAK-AUART) için parametreler ekleyin. Bu, veri çıkarmanın yeniden kullanılabilir ve yönetilebilir olmasını sağlar.
- Veri Tanımlamaları: Çeşitli SAP tablolarından (örneğin, VBAK, VBAP, VBFA, CDHDR, CDPOS, VBRK, BSAD) verileri tutmak için gerekli dahili tabloları ve yapıları tanımlayın. Ayrıca, gerekli niteliklerle eşleşen event log için son çıktı yapısını tanımlayın.
- Temel Satış Siparişlerini Seçin: Kullanıcının seçim ekranı girişlerine göre satış siparişi başlıklarını (VBAK) ve kalemlerini (VBAP) almak için başlangıç SELECT ifadesini yazın. Bu, analiz edilecek vakaların temel veri kümesini oluşturur.
- 'Oluşturma' Event'ini Çıkarın: Seçilen VBAK kayıtları üzerinde döngü yapın. Her kayıt için, StartTime olarak VBAK-ERDAT ve VBAK-ERZET kullanarak 'Sales Order Created' aktivitesi ile event log yapısını doldurun.
- Değişiklik Log Event'lerini Çıkarın: Seçilen satış siparişleri için OBJECTCLAS 'VERKBELEG' olan CDHDR ve CDPOS kayıtlarını seçin. Belirli alan değişikliklerini belirlemek için sonuçlar üzerinde döngü yapın. Örneğin, VBAK-LIFSK'deki bir değişiklik 'Teslimat Engeli Ayarlandı' anlamına gelirken, VBUK-CMGST'deki bir değişiklik 'Kredi Kontrolü Yapıldı' anlamına gelir. Diğer ilgili herhangi bir değişiklik 'Satış Siparişi Değiştirildi' olarak loglanabilir.
- Belge Akış Verilerini Çıkarın: Seçilen satış siparişleri için belge akış tablosunu (VBFA) sorgulayın. Bu tablo, satış siparişlerini teslimatlar, mal hareketleri ve faturalar gibi sonraki belgelere bağlar. Daha fazla işleme için ilgili tüm belgeleri seçin.
- Teslimat ve Gerçekleştirme Event'lerini Çıkarın: VBFA'dan gelen teslimat belge numaralarını kullanarak, 'Teslimat Oluşturuldu' event'leri için LIKP ve LIPS'i sorgulayın. MKPF ve MSEG'yi mal çıkışı belgeleri (hareket türü '601') için sorgulayarak 'Mal Çıktı' event'ini yakalayın. Depo Yönetimi aktifse, 'Toplama Tamamlandı'yı belirlemek için son transfer siparişi kaleminin onay süresini bulmak üzere LTAK ve LTAP'ı sorgulayın. Teslimat başlık durumu VBUK-PODAT'ı 'Teslimat Kanıtı Onaylandı' için kontrol edin.
- Faturalama ve Ödeme Event'lerini Çıkarın: VBFA'dan gelen faturalama belge numaralarını kullanarak, 'Fatura Oluşturuldu' ve 'Fatura İptal Edildi' ( VBRK-FKSTO = 'X' olduğunda) event'lerini yakalamak için VBRK ve VBRP'yi sorgulayın. 'Ödeme Alındı'yı bulmak için, VBRK'deki faturayı BKPF'deki muhasebe belgesine bağlayın, ardından BSAD'de temizleme belgesini ve temizleme tarihini bulun.
- Durum Tabanlı Event'leri Çıkarın: İş event'lerini çıkarmak için durum tablolarını VBUP (Kalem Durumu) ve VBUK (Başlık Durumu) kullanın. Örneğin, bir kalem VBUP-GBSTA 'C'ye eşit olduğunda 'Sipariş Kalemi Kapalı' olarak kabul edilir. Tüm ilgili kalemler için bir 'Reddetme Nedeni' (VBAP-ABGRU) ayarlandığında bir sipariş 'Sipariş İptal Edildi' olarak kabul edilir.
- Birleştirme ve Biçimlendirme: Yakalanan tüm event'leri tek bir son dahili tabloda birleştirin. Her event kaydı için tüm niteliklerin (SalesOrder, Activity, StartTime, User vb.) doğru şekilde doldurulduğundan emin olun. SourceSystem ve LastDataUpdate zaman damgalarını ekleyin.
- Çıktı Dosyası Oluşturun: Son dahili tabloyu kullanıcının yerel makinesindeki bir CSV dosyasına dışa aktarmak için GUI_DOWNLOAD fonksiyon modülünü veya cl_gui_frontend_services=>gui_download yöntemini kullanın. Dosyanın UTF-8 kodlamasıyla kaydedildiğinden emin olun.
Konfigürasyon
- Önkoşullar: ABAP geliştirici yetkileri (örneğin, SE38 işlemine erişim) ve gerekli tüm SAP tabloları (örneğin, VBAK, VBAP, CDHDR, CDPOS, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG ve BSAD dahil) için okuma izinleri.
- Seçim Parametreleri: Program, filtreleme için parametreler içeren bir seçim ekranı içermelidir. Başlıca parametreler şunlardır:
- Tarih Aralığı: Satış siparişi oluşturma tarihi (VBAK-ERDAT) için zorunlu bir tarih aralığı. Veri setini yönetilebilir kılmak için 3-6 aylık yakın bir dönemle başlayın.
- Satış Organizasyonu: Analizi belirli iş birimlerine odaklamak için VBAK-VKORG'e göre filtreleme yapın.
- Satış Belge Türü: Yalnızca ilgili sipariş türlerini (örneğin, standart siparişler) dahil etmek ve diğerlerini (örneğin, teklifler, iadeler) hariç tutmak için VBAK-AUART'a göre filtreleme yapın.
- Performans Notları: Değişiklik günlüğü tablolarından (CDHDR, CDPOS) ve belge akışından (VBFA) veri çekmek, büyük veri hacimleri için çok yavaş olabilir. Program, WHERE koşullarında indeks alanlarını kullanmak üzere optimize edilmelidir. Çok büyük veri çekimleri durumunda, programı SM36 işlemi aracılığıyla yoğun olmayan saatlerde bir arka plan işi olarak çalışacak şekilde planlayın.
- Değişiklik Günlüğü Aktivasyonu: Bu yöntem, SAP'nin değişiklik belgesi fonksiyonelliğine dayanır. Anahtar veri elemanları (örneğin, LIFSK, CMGST, ABGRU) için değişiklik kaydının etkin olduğundan emin olun. Bu, VERKBELEG nesnesi için SCDO işlemi aracılığıyla kontrol edilebilir.
a Örnek Sorgu abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN s_erdat
AND h~vkorg IN s_vkorg
AND h~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM.Adımlar
- Ön Koşullar: Temel SAP ECC veri tabanına doğrudan, salt okunur erişiminizin olduğundan emin olun. Bağlantı kurmak ve sorguları çalıştırmak için DBeaver, SQL Server Management Studio veya Oracle SQL Developer gibi bir veri tabanı istemci aracına ihtiyacınız olacaktır.
- SQL Script'i Edinin: Bu belgenin 'sorgu' bölümünde sağlanan SQL sorgusunun tamamını kopyalayın.
- Veri Tabanına Bağlanın: Veri tabanı istemcinizi açın ve SAP ECC veri tabanı örneğine bir bağlantı kurun. Sunucu adresine, port numarasına, veri tabanı adına ve uygun giriş bilgilerine ihtiyacınız olacaktır.
- Sorguyu Yapılandırın: SQL script'i yeni bir sorgu düzenleyici penceresine yapıştırın. Ana Common Table Expression (CTE) olan SalesOrders adlı bölümdeki yapılandırma bölümünü bulun. Başlangıç tarihi ('{StartDate}'), bitiş tarihi ('{EndDate}'), satış organizasyonları ('{SalesOrgs}') ve belge türleri ('{DocTypes}') için yer tutucu değerleri, analiziniz için gerçek değerlerle değiştirin.
- Sorguyu Çalıştırın: Yapılandırılmış SQL script'ini çalıştırın. Tarih aralığına ve SAP veri tabanınızın boyutuna bağlı olarak, bu sorgunun tamamlanması birkaç dakika sürebilir.
- Sonuçları Gözden Geçirin: Sorgu tamamlandığında, bir sonuç kümesi görüntülenecektir. Verilerin beklenen sütunları (SalesOrder, Activity, StartTime vb.) içerdiğinden ve çeşitli aktiviteler için satırların döndürüldüğünden emin olmak için verileri kısaca gözden geçirin.
- Veriyi Dışa Aktarın: Sonuç kümesini bir CSV dosyası olarak kaydetmek için veri tabanı istemcinizin dışa aktarma işlevini kullanın. Dosyayı SAP_O2C_Event_Log.csv gibi açıklayıcı bir şekilde adlandırın.
- ProcessMind için Biçimlendirme: CSV dosyasını bir e-tablo düzenleyicisinde açın. Sütun başlıklarının gerekli niteliklerle (SalesOrder, Activity, StartTime gibi) tam olarak eşleştiğini doğrulayın. StartTime ve LastDataUpdate için tarih ve saat formatının tutarlı ve ProcessMind tarafından desteklendiğinden emin olun, örneğin YYYY-MM-DD HH:MI:SS.
- ProcessMind'e Yükleme: Son, biçimlendirilmiş CSV dosyasını analiz için ProcessMind projenize yükleyin.
Konfigürasyon
- Tarih Aralığı: Sorgu, satış siparişlerini oluşturulma tarihlerine (VBAK.ERDAT) göre filtrelemek üzere yer tutucular ('{StartDate}' ve '{EndDate}') kullanır. Veritabanında aşırı yük oluşturmadan temsili bir örneklem elde etmek için tipik bir analiz dönemi 3 ila 6 aylık veridir.
- Satış Organizasyonu Filtresi: Veri çekimini belirli satış organizasyonlarıyla (örneğin, '1000', '2000') sınırlamak amacıyla '{SalesOrgs}' yer tutucusunu kullanın. Bu, analizi odaklamak ve sorgu performansını artırmak için oldukça önemlidir.
- Belge Türü Filtresi: Belirli satış siparişi türlerini (örneğin, Standart Sipariş için 'OR') seçmek için '{DocTypes}' yer tutucusunu kullanın. Bu, ana süreç akışından ücretsiz teslimatlar veya iadeler gibi alakasız belgelerin çıkarılmasına yardımcı olur.
- Kaynak Sistem Tanımlayıcı: Her kaydı kaynak sistemiyle etiketlemek amacıyla '{SourceSystemName}' adında, sabit kodlu bir yer tutucu kullanılır. Bu, SAP ECC örneğiniz için anlamlı bir adla (örneğin, SAP_ECC_PRD) ayarlanmalıdır.
- Veritabanı Uyumluluğu: Tarih ve saat alanlarını birleştirmek için kullanılan [Veritabanınıza özgü zaman damgası fonksiyonu] bir yer tutucudur. Bunu, kendi veritabanınıza uygun doğru fonksiyonla değiştirmelisiniz (örneğin, SAP HANA için TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS') veya SQL Server için CAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME)).
- Önkoşullar: Bu yöntem, doğrudan ve salt okunur veritabanı kimlik bilgileri gerektirir. Veritabanı kullanıcısının, sorguda referans verilen tüm tablolara (VBAK, VBAP, VBFA, CDHDR, CDPOS, LIKP, VBRK ve BSAD dahil) erişim yetkisi olmalıdır.
a Örnek Sorgu sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> '';