Šablona dat pro proces od nákupu k platbě, objednávky
Šablona dat pro proces od nákupu k platbě, objednávky
- Doporučené atributy ke shromáždění
- Aktivity, které je vhodné sledovat
- Pokyny k extrakci dat ze SAP ECC
Atributy procesu od nákupu k platbě, objednávky
| Název | Popis | ||
|---|---|---|---|
| Aktivita Activity | Název konkrétní obchodní události nebo kroku, ke kterému došlo během životního cyklu nákupní objednávky. | ||
| Popis Tento atribut popisuje jednotlivé kroky procesu, například „Vytvoření nákupní objednávky“, „Schválení nákupní objednávky“ nebo „Zaúčtování příjmu zboží“. Jejich posloupnost tvoří tok procesu pro každou nákupní objednávku. Analýza pořadí, četnosti a doby trvání aktivit je základem process mining. Pomáhá odhalit úzká místa, opakované přepracování a odchylky od standardního procesu. Na základě těchto zjištění lze cíleně zlepšovat a sjednocovat postupy. Proč je to důležité Aktivity určují jednotlivé kroky procesu. Analýza jejich pořadí a načasování ukazuje skutečný tok procesu, úzká místa a odchylky. Kde data získat Údaje se odvozují z různých tabulek SAP a protokolů transakcí, například z CDHDR/CDPOS pro změny, EKBE pro příjem zboží a fakturaci a EBAN pro nákupní požadavky. K jejich vytvoření je často potřeba vlastní logika nebo program pro extrakci dat. Příklady Vytvoření nákupní objednávkySchválení nákupní objednávkyZaúčtování příjmu zboží | |||
| Čas události EventTime | Přesné datum a čas, kdy k aktivitě došlo. | ||
| Popis Tato časová značka označuje přesný okamžik události, například schválení nákupní objednávky nebo zaúčtování příjmu zboží. Určuje chronologické pořadí všech aktivit v rámci případu. Časové značky jsou pro process mining zásadní, protože umožňují veškeré časové analýzy. Patří mezi ně výpočet doby cyklu mezi aktivitami, odhalování zpoždění, analýza průchodnosti procesu a měření výkonu vůči dohodnutým úrovním služeb (SLA). Proč je to důležité Tato časová značka je nezbytná pro výpočet všech ukazatelů založených na době trvání, například doby cyklu a úzkých míst, i pro chronologické řazení událostí. Kde data získat Údaje se odvozují z různých polí data a času v tabulkách SAP, například EKKO-AEDAT (datum změny), CDHDR-UDATE/UTIME (časová značka protokolu změn) nebo EKBE-BUDAT (datum zaúčtování). Příklady 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Nákupní objednávka PurchaseOrder | Jedinečný identifikátor dokladu nákupní objednávky (PO), který slouží jako hlavní případ pro sledování nákupního procesu. | ||
| Popis Číslo nákupní objednávky je hlavní identifikátor, který propojuje všechny aktivity od jejího vytvoření až po konečný příjem zboží a dokončení. Každé jedinečné číslo objednávky představuje jeden nákupní proces. V process mining je tento atribut nezbytný pro rekonstrukci celého průběhu každého nákupu. Umožňuje podrobně analyzovat dobu cyklu, odchylky v procesu a shodu u každé objednávky. Tvoří tak základ celého modelu procesu. Proč je to důležité Jde o hlavní identifikátor, který propojuje všechny související události a umožňuje analyzovat celý životní cyklus každé nákupní objednávky. Kde data získat Tabulka: EKKO, pole: EBELN Příklady 450001762345000176244500017625 | |||
| Částka objednávky OrderAmount | Celková peněžní hodnota položky nákupní objednávky. | ||
| Popis Tento atribut představuje celkovou hodnotu konkrétní položky nákupní objednávky, vypočtenou jako množství vynásobené čistou cenou. Celkovou hodnotu objednávky získáte sečtením částek za jednotlivé položky. Analýza procesu podle částky objednávky pomáhá určit transakce s vysokou hodnotou, které mohou vyžadovat přísnější kontroly nebo jiný postup schvalování. Tento atribut využívá dashboard „Analýza hodnoty nákupních objednávek“ a pomáhá zaměřit zlepšování procesů na objednávky s největším finančním dopadem. Proč je to důležité Vyjadřuje finanční dopad každého nákupu a umožňuje upřednostnit objednávky s vysokou hodnotou nebo hledat příležitosti k úsporám. Kde data získat Tabulka: EKPO, pole: NETWR (čistá hodnota objednávky). Příklady 1500.00250.7512345.50 | |||
| Číslo dodavatele VendorNumber | Jedinečný identifikátor dodavatele. | ||
| Popis Tento kód jednoznačně identifikuje dodavatele, od kterého se pořizuje zboží nebo služby. Jde o důležitou součást kmenových dat nákupního procesu. Atribut je nezbytný pro analýzu podle dodavatelů. Umožňuje vyhodnotit jejich výkon při dodávkách, porovnat dodací lhůty a analyzovat výdaje. Je hlavním rozměrem dashboardu „Výkon dodavatelů při dodávkách“. Proč je to důležité Umožňuje analyzovat výkon dodavatelů a určit, kteří dodávají spolehlivě a kteří způsobují zpoždění nebo problémy s kvalitou. Kde data získat Tabulka: EKKO, pole: LIFNR Příklady 100345V-20598700112 | |||
| Kód společnosti CompanyCode | Identifikátor právnické osoby nebo společnosti, která nákup zadává. | ||
| Popis Kód společnosti v SAP označuje samostatnou právnickou osobu. Všechny transakce se účtují na úrovni kódu společnosti, který je proto základní organizační jednotkou. Analýza procesu podle kódu společnosti umožňuje porovnat efektivitu nákupu a shodu mezi různými organizačními jednotkami nebo zeměmi. Pomáhá najít postupy, které lze převzít od jiné společnosti, i určit jednotky, které mají s procesem potíže. Proč je to důležité Označuje právnickou osobu a umožňuje porovnávat výkon procesu a ověřovat shodu v různých částech organizace. Kde data získat Tabulka: EKKO, pole: BUKRS Příklady 10002100US01 | |||
| Skupina materiálu MaterialGroup | Klasifikace pro seskupení materiálů nebo služeb s podobnými vlastnostmi. | ||
| Popis Skupina materiálu neboli nákupní kategorie slouží ke klasifikaci pořizovaného zboží nebo služeb. Příklady: „IT hardware“, „Kancelářské potřeby“ nebo „Odborné služby“. Tento atribut je důležitý pro analýzu výdajů a pochopení nákupních vzorců. Umožňuje filtrovat proces podle kategorií a analyzovat, jak se s nimi pracuje, kdo je schvaluje a kteří dodavatelé je zajišťují. Jde o důležitý rozměr dashboardu „Analýza hodnoty nákupních objednávek“. Proč je to důležité Umožňuje rozdělit proces podle kategorie produktu nebo služby a odhalit rozdíly v postupech, době cyklu či dodavatelích podle typu výdajů. Kde data získat Tabulka: EKPO, pole: MATKL Příklady 00101IT_HWCONSULT | |||
| Typ dokladu DocumentType | Kód, který rozlišuje různé typy nákupních objednávek. | ||
| Popis Typ dokladu je nastavení v SAP, které určuje číselnou řadu, výběr polí a celkový tok procesu pro nákupní objednávku. Mohou například existovat různé typy pro standardní objednávky, objednávky služeb nebo objednávky na přepravu zásob. Tento atribut je užitečný pro analýzu, protože různé typy dokladů často záměrně procházejí odlišnými procesy. Filtrování podle typu dokladu umožňuje přesněji porovnávat dobu cyklu a tok procesu. Proč je to důležité Rozlišuje různé druhy nákupních procesů, například standardní nákup, služby nebo vrácení. Každý z nich může mít jiný průběh a očekávaný výkon. Kde data získat Tabulka: EKKO, pole: BSART Příklady NBFOUB | |||
| Uživatelské jméno UserName | ID uživatele, který aktivitu provedl. | ||
| Popis Tento atribut zachycuje uživatelské jméno SAP zaměstnance, který doklad vytvořil, změnil nebo schválil. U automatizovaných kroků může uvádět ID systémového nebo dávkového uživatele. Analýza podle uživatelů pomáhá určit potřebu školení, najít pracovníky s dobrými výsledky nebo odhalit možné problémy se shodou. Je důležitá pro tvorbu dashboardů o rozložení pracovní zátěže, dodržování schvalovací matice a výkonu jednotlivých týmů či pracovníků. Proč je to důležité Přiřazuje akce konkrétním uživatelům a umožňuje analyzovat jejich výkon, pracovní zátěž a dodržování pravidel shody. Kde data získat Tabulka: EKKO, pole: ERNAM (vytvořil); tabulka: CDHDR, pole: USERNAME (změnil). Příklady JSMITHMBROWNBATCH_USER | |||
| Dodání včas IsOnTimeDelivery | Příznak označující, zda bylo zboží přijato v požadovaném termínu nebo dříve. | ||
| Popis Tento booleovský atribut má hodnotu true, pokud časové razítko aktivity „Příjem zboží zaúčtován“ připadá na požadované datum dodání nebo na dřívější datum. Pro každou položku objednávky tak poskytuje jednoznačný výsledek hodnocení včasnosti dodání. Atribut je základem KPI „Míra včasného příjmu zboží“. Usnadňuje analýzu výkonnosti dodavatelů a efektivity interního příjmu, protože umožňuje snadno seskupovat a filtrovat včasné a opožděné dodávky. Proč je to důležité Poskytuje jednoznačný ukazatel včasnosti dodání a přímo podporuje KPI a dashboardy pro hodnocení dodavatelů. Kde data získat Jde o vypočítaný atribut, který porovnává datum zaúčtování příjmu zboží (EKBE-BUDAT) s požadovaným datem dodání (EKPO-EINDT). Příklady truefalse | |||
| Důvod zamítnutí RejectionReason | Kód nebo text vysvětlující, proč byl nákupní požadavek nebo objednávka zamítnuta. | ||
| Popis Tento atribut zachycuje konkrétní důvod uvedený při zamítnutí objednávky ve schvalovacím workflow. Pomáhá zjistit hlavní příčiny přepracování a zpoždění. Analýza důvodů zamítnutí může odhalit časté problémy, například nesprávnou cenu, překročení rozpočtu nebo výběr dodavatele, který nesplňuje požadavky. Na základě těchto zjištění můžete řešit příčiny, zlepšit kvalitu původního zadání objednávky a zjednodušit schvalování. Proč je to důležité Ukazuje, proč schvalování selhává. Díky tomu můžete cíleně omezit přepracování a zkrátit dobu schvalovacího cyklu. Kde data získat Tyto informace může být obtížné najít. Mohou být uložené v polích s dlouhým textem nebo záviset na vlastní konfiguraci workflow. Jejich získání často vyžaduje znalost konkrétní implementace. Příklady Nesprávná cenaPřekročený rozpočetDuplicitní požadavek | |||
| Měna Currency | Kód měny částky nákupní objednávky. | ||
| Popis Tento atribut určuje měnu, ve které je vyjádřena hodnota nákupní objednávky, například USD, EUR nebo GBP. Poskytuje nezbytný kontext pro všechny peněžní hodnoty. U mezinárodních organizací je měna nezbytná pro správnou finanční analýzu. Umožňuje správně sčítat a porovnávat hodnoty objednávek. Všechny peněžní KPI je nutné vyhodnocovat s ohledem na měnu. Proč je to důležité Poskytuje potřebný kontext pro všechny peněžní hodnoty a zajišťuje přesnou finanční analýzu, zejména v mezinárodních organizacích. Kde data získat Tabulka: EKKO, pole: WAERS Příklady USDEURJPY | |||
| Nákupní organizace PurchasingOrganization | Organizační jednotka odpovědná za sjednávání cen a nákup materiálů nebo služeb. | ||
| Popis Nákupní organizace je důležitá organizační jednotka v SAP, která odpovídá za nákup. Může být centralizovaná pro celou společnost nebo decentralizovaná podle závodu či regionu. Analýza výkonu procesu podle nákupní organizace pomáhá určit, které nákupní týmy pracují nejefektivněji. Umožňuje porovnávat dobu cyklu, míru přepracování a náklady mezi organizačními jednotkami a odhalovat osvědčené postupy i oblasti, které potřebují podporu. Proč je to důležité Označuje odpovědný nákupní tým a umožňuje porovnávat výkon a analyzovat rozdíly mezi organizačními jednotkami. Kde data získat Tabulka: EKKO, pole: EKORG Příklady 1000US01DE01 | |||
| Nákupní skupina PurchasingGroup | Konkrétní nákupčí nebo skupina nákupčích odpovědná za nákupní aktivitu. | ||
| Popis Nákupní skupina označuje jednotlivého nákupčího nebo tým odpovědný za určitou nákupní aktivitu. Je hlavním kontaktním místem pro dodavatele. Tento atribut umožňuje podrobnější analýzu než nákupní organizace. Pomáhá pochopit rozložení pracovní zátěže mezi nákupčími a určit rozdíly ve výkonu jednotlivců. Na základě těchto informací lze lépe rozdělit zdroje a plánovat školení. Proč je to důležité Poskytuje podrobný přehled o tom, kdo za nákup odpovídá. Umožňuje analyzovat pracovní vytížení a výkonnost jednotlivých nákupčích nebo týmů. Kde data získat Tabulka: EKKO, pole: EKGRP Příklady 001002N01 | |||
| Název dodavatele VendorName | Právní název dodavatele. | ||
| Popis Popisný název dodavatele, který se uživatelům lépe čte než jeho číslo. Obvykle se načítá z kmenových dat dodavatelů. Číslo dodavatele slouží k propojení dat a jednoznačné identifikaci, zatímco název dodavatele je důležitý pro dashboardy a sestavy určené uživatelům. Analýzy jsou díky němu srozumitelnější i pro pracovníky, kteří neznají kódy dodavatelů. Proč je to důležité Zobrazuje název dodavatele v čitelné podobě, takže dashboardům a sestavám lépe rozumějí i uživatelé z obchodních týmů. Kde data získat Tabulka: LFA1, pole: NAME1. Je nutné propojit EKKO-LIFNR s LFA1-LIFNR. Příklady Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Poslední aktualizace dat LastDataUpdate | Časová značka označující, kdy byla data naposledy aktualizována ze zdrojového systému. | ||
| Popis Tento atribut zaznamenává datum a čas poslední extrakce nebo aktualizace dat. Informuje o aktuálnosti analyzovaných dat. Zobrazení této informace v dashboardech je důležité, aby uživatelé věděli, zda přehled vychází z téměř aktuálních dat, nebo z historického snímku. Pomáhá nastavit očekávání a zajistit, aby rozhodnutí vycházela z dat se známým stářím. Proč je to důležité Informuje uživatele o aktuálnosti dat, aby věděli, zda analýza zachycuje současný stav provozu. Kde data získat Tuto časovou značku vytvoří a přidá proces extrakce dat nebo ETL při svém spuštění. Příklady 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Požadavek na nákup PurchaseRequisition | Identifikátor nákupního požadavku, který předcházel nákupní objednávce. | ||
| Popis Tento atribut propojuje nákupní objednávku s původním nákupním požadavkem. Ne každé objednávce předchází požadavek. Toto propojení je důležité pro analýzu dashboardu „Převod požadavku na objednávku“ a KPI „Míra převodu nákupních požadavků na objednávky“. Umožňuje měřit efektivitu předchozí části procesu od původního požadavku po vytvoření formální objednávky a odhalit objednávky vytvořené bez požadavku, které nejsou v souladu s pravidly. Proč je to důležité Propojuje objednávku s původním požadavkem, takže lze analyzovat převod požadavků na objednávky a odhalit objednávky vytvořené bez předchozího požadavku. Kde data získat Tabulka: EKPO, pole: BANFN Příklady 1001589010015891 | |||
| Požadované datum dodání RequestedDeliveryDate | Datum, do kterého firma požaduje, aby dodavatel dodal zboží nebo služby. | ||
| Popis Jde o cílové datum dodání uvedené v nákupní objednávce. Slouží jako základ pro měření skutečného výkonu dodávek. Toto datum je nezbytné pro výpočet KPI „Podíl včasného příjmu zboží“. Porovnáním skutečného data příjmu s požadovaným datem mohou organizace měřit spolehlivost dodavatelů a efektivitu interního příjmu. Výsledek přímo využívá dashboard „Výkon dodavatelů při dodávkách“. Proč je to důležité Jde o cílové datum dodání, které je nezbytné pro výpočet KPI včasnosti a vyhodnocení spolehlivosti dodavatelů. Kde data získat Tabulka: EKPO, pole: EINDT Příklady 2023-06-102023-07-222023-08-01 | |||
| Závod Plant | Fyzické místo nebo závod, kam má být zboží dodáno. | ||
| Popis Závod je organizační jednotka představující výrobní provoz, sklad nebo jiné místo, kam se dodává zboží či služby. Analýza podle závodu pomáhá odhalit geografické rozdíly v procesu nákupu. Může ukázat, že dodací lhůty dodavatelů se v jednotlivých lokalitách liší, nebo upozornit na závody, kde příjem zboží neprobíhá efektivně. Díky tomu lze posoudit včasnost příjmu zboží. Proč je to důležité Určuje místo dodání. Hodí se k analýze regionálních rozdílů v procesu a výkonnosti logistiky. Kde data získat Tabulka: EKPO, pole: WERKS Příklady 100011002000 | |||
| Zdrojový systém SourceSystem | Systém, ze kterého byla data načtena. | ||
| Popis Tento atribut označuje původ dat, obvykle identifikátor instance SAP ECC, například „ECC_PROD_100“. V prostředí s více systémy pomáhá rozlišit jednotlivé zdroje dat. Pro správu dat a sledování jejich původu je důležité znát zdrojový systém. Pomáhá zajistit integritu dat a řešit problémy s extrakcí nebo kvalitou, zejména při slučování dat z různých systémů ERP nebo modulů. Proč je to důležité Označuje původ dat, což je důležité pro správu a ověřování dat i pro analýzy napříč více systémy. Kde data získat Obvykle jde o statickou hodnotu, která se přidává při extrakci dat a označuje systém, ze kterého datová sada pochází. Příklady SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Změna po schválení IsPostApprovalChange | Příznak označující, zda byla objednávka změněna po prvním schválení. | ||
| Popis Tento booleovský atribut má hodnotu true, pokud je u stejné objednávky zaznamenána aktivita „Objednávka schválena“ a po ní aktivita „Objednávka změněna“. Pomáhá odhalit problematické změny provedené v pozdější fázi procesu. Toto vypočítané pole přímo podporuje KPI „Míra změn objednávek po schválení“ a dashboard „Přepracování a změny objednávek“. Pomáhá vyčíslit a zvýraznit změny, které mohou způsobit zpoždění a vyžadovat nové schválení. Tyto změny mohou poukazovat na nedostatky v původním zadání nebo vymezení požadavků. Proč je to důležité Přímo měří přepracování po schválení, což je důležitý KPI pro stabilitu a efektivitu procesu. Vysoká míra ukazuje na problémy při definování požadavků v předchozích fázích. Kde data získat Jde o vypočítaný atribut odvozený z pořadí aktivit v záznamu událostí. Příklady truefalse | |||
Aktivity procesu od nákupu k platbě, objednávky
| Aktivita | Popis | ||
|---|---|---|---|
| Dokončení nákupní objednávky | Označuje, že položka nákupní objednávky je považována za plně dodanou. Jde o odvozenou událost, která se obvykle určuje podle automatického nebo ručního nastavení ukazatele „Dodávka dokončena“ u položky objednávky. | ||
| Proč je to důležité Tato aktivita představuje logický konec části procesu, která se týká vyřízení objednávky. Je nezbytná pro výpočet celkové doby cyklu objednávky od vytvoření po dokončení. Kde data získat Událost se odvozuje z dokladů změn (CDHDR/CDPOS), které zaznamenávají nastavení ukazatele „Dodávka dokončena“ (EKPO-ELIKZ) na hodnotu „X“ u položky objednávky. Dokončení celé objednávky může označovat okamžik, kdy je jako dokončená označena poslední položka. Zachycení V dokladech změn určete časovou značku, kdy je nastaven příznak EKPO-ELIKZ. Typ události inferred | |||
| Odeslání nákupní objednávky dodavateli | Tato aktivita označuje okamžik, kdy je schválená nákupní objednávka oficiálně odeslána dodavateli, například přes EDI, e-mailem nebo tiskem. Jde o explicitní událost zaznamenanou v tabulkách řízení zpráv při úspěšném zpracování výstupní zprávy. | ||
| Proč je to důležité Jde o důležitý milník, od kterého se počítá dodací lhůta dodavatele. Analýza doby od této události do příjmu zboží pomáhá vyhodnotit výkon dodavatele a včasnost dodávek. Kde data získat Událost se zaznamenává v tabulce stavů zpráv (NAST). Časovou značku lze získat z polí NAST-DATVR a NAST-UHRVR, pokud je stav zpracování (NAST-VSTAT) pro příslušný typ výstupu objednávky nastaven na „1“ (úspěšně zpracováno). Zachycení Pro výstupní zprávu objednávky použijte časovou značku zpracování z tabulky NAST. Typ události explicit | |||
| Schválení nákupní objednávky | Označuje konečné schválení nákupní objednávky, po kterém ji lze odeslat dodavateli. Tento důležitý milník se obvykle odvozuje ze změny stavu uvolnění objednávky na „plně uvolněno“ nebo „schváleno“. | ||
| Proč je to důležité Tato aktivita je důležitá pro výpočet KPI doby schválení objednávky a odhalení úzkých míst ve workflow schvalování. Je podmínkou pro většinu následujících aktivit, například odeslání objednávky dodavateli. Kde data získat Událost se odvozuje ze sledování protokolů změn (CDHDR/CDPOS) hlavičkové tabulky nákupních objednávek (EKKO). Zjišťuje se, kdy byl použit konečný kód uvolnění nebo kdy byl celkový ukazatel stavu uvolnění (EKKO-FRGKE) nastaven na „uvolněno“. Zachycení Určete časovou značku, kdy se celkový stav uvolnění objednávky (EKKO-FRGKE) změní na konečný schválený stav. Typ události inferred | |||
| Vytvoření nákupní objednávky | Tato aktivita označuje vytvoření formálního dokladu nákupní objednávky, který představuje závaznou smlouvu s dodavatelem. Jde o explicitní událost zaznamenanou při vytvoření a uložení objednávky uživatelem, například pomocí transakce ME21N. Výsledkem jsou záznamy v tabulkách EKKO a EKPO. | ||
| Proč je to důležité Označuje oficiální začátek životního cyklu nákupní objednávky. Jde o důležitý milník pro měření doby převodu požadavku na objednávku i celkové doby vyřízení objednávky. Kde data získat Údaj se získává z data vytvoření (EKKO-AEDAT) v hlavičkové tabulce nákupních objednávek (EKKO) pro příslušné číslo objednávky (EKKO-EBELN). Zachycení U každé nové nákupní objednávky použijte časovou značku vytvoření z tabulky EKKO. Typ události explicit | |||
| Vytvoření nákupního požadavku | Tato aktivita označuje vytvoření formálního požadavku na zboží nebo služby. Jde o explicitní událost zaznamenanou při uložení nového nákupního požadavku uživatelem, například pomocí transakce ME51N. Tím vznikne jedinečný záznam v tabulce EBAN. | ||
| Proč je to důležité Jde o hlavní počáteční bod nákupního procesu. Analýza doby od této události do vytvoření nákupní objednávky ukazuje, jak efektivně se interní poptávka mění v konkrétní objednávky. Kde data získat Událost se zaznamená při vytvoření záznamu v hlavičkové tabulce nákupních požadavků (EBAN). Časovou značku tvoří datum vytvoření (EBAN-BADAT) a čas. Zachycení Vyhledejte nové záznamy v tabulce EBAN podle data vytvoření. Typ události explicit | |||
| Zaúčtování příjmu zboží | Tato aktivita označuje fyzické převzetí zboží od dodavatele na základě konkrétní nákupní objednávky. Zaúčtování příjmu zboží je explicitní úkon, například pomocí transakce MIGO, který vytvoří materiálový doklad a aktualizuje zásoby. | ||
| Proč je to důležité Jde o důležitý milník pro sledování dodávek od dodavatele a začátek ověřování faktury. Používá se k výpočtu podílu včasných dodávek a včasnosti příjmu zboží. Kde data získat Událost se zaznamená při vytvoření materiálového dokladu. Časovou značkou je datum zaúčtování (MKPF-BUDAT) nebo datum vytvoření (MKPF-CPUDT) z hlavičkové tabulky materiálových dokladů (MKPF), propojené s objednávkou přes tabulku položek (MSEG). Zachycení Pro materiálové doklady vztahující se k objednávce použijte datum a čas zaúčtování nebo vytvoření z tabulky MKPF. Typ události explicit | |||
| Odstranění nákupní objednávky | Označuje zrušení nebo logické odstranění položky nákupní objednávky, které brání dalšímu zpracování, například příjmu zboží nebo fakturaci. Jde o odvozenou událost zaznamenanou při nastavení příznaku odstranění u položky objednávky. | ||
| Proč je to důležité Jde o koncovou aktivitu, která označuje zrušení objednávky. Analýza důvodů a načasování odstranění objednávek může odhalit problémy s plánováním poptávky nebo výběrem dodavatele. Kde data získat Událost se odvozuje z dokladů změn (CDHDR/CDPOS), které zachycují nastavení příznaku odstranění (EKPO-LOEKZ) na hodnotu „L“ u položky nákupní objednávky. Zachycení V dokladech změn určete časovou značku, kdy je nastaven příznak EKPO-LOEKZ. Typ události inferred | |||
| Provedení kontroly kvality | Označuje, že přijaté zboží prošlo kontrolou kvality. Tato aktivita se obvykle odvozuje od rozhodnutí o použití pro kontrolní dávku, která vznikla při příjmu zboží, v modulu řízení kvality. | ||
| Proč je to důležité V odvětvích, kde je kvalita zásadní, tato aktivita pomáhá analyzovat dobu trvání a výsledky kontroly. Zpoždění mohou vytvořit úzká místa mezi příjmem zboží a jeho dostupností k použití. Kde data získat Událost se odvozuje z modulu řízení kvality. Při příjmu zboží vznikne kontrolní dávka (tabulka QALS). Aktivitu označuje vytvoření rozhodnutí o použití (tabulka QAVE), které obsahuje časovou značku. Zachycení V tabulce QAVE určete časovou značku rozhodnutí o použití pro kontrolní dávku propojenou s materiálovým dokladem. Typ události inferred | |||
| Schválení nákupního požadavku | Označuje formální schválení nákupního požadavku, které umožňuje převést jej na nákupní objednávku. Událost se odvozuje ze změn polí stavu uvolnění v datech nákupního požadavku, které sleduje workflow strategie uvolňování v SAP. | ||
| Proč je to důležité Sledování schválení pomáhá odhalit úzká místa ve fázi před objednáním a ověřit shodu s pravidly schvalování. Zpoždění v této fázi přímo prodlužují celkovou dobu nákupního cyklu. Kde data získat Událost se odvozuje z protokolů změn tabulky nákupních požadavků (EBAN), zejména ze změn polí stavu uvolnění, například EBAN-FRGZU. Lze ji také určit analýzou dokladů změn CDHDR/CDPOS pro objekt EBAN. Zachycení Sledujte doklady změn polí stavu uvolnění v EBAN a určete časovou značku konečného schválení. Typ události inferred | |||
| Vrácení zboží | Označuje vrácení již přijatého zboží dodavateli, často kvůli problémům s kvalitou nebo nesprávné dodávce. Jde o explicitní událost zaznamenanou zaúčtováním materiálového dokladu s typem pohybu určeným pro vrácení. | ||
| Proč je to důležité Tato aktivita upozorňuje na problémy s kvalitou dodavatele nebo správností objednávky a je důležitým ukazatelem přepracování procesu. Je nezbytná pro výpočet KPI míry odchylek při příjmu zboží. Kde data získat Událost se zaznamenává v tabulkách materiálových dokladů (MKPF/MSEG) při použití typu pohybu pro vrácení, například „122“ pro vrácení dodavateli. Časovou značkou je datum zaúčtování (MKPF-BUDAT). Zachycení Vyhledejte materiálové doklady s typem pohybu pro vrácení, například 122, které odkazují na původní nákupní objednávku. Typ události explicit | |||
| Vyžádání schválení nákupní objednávky | Označuje, že vytvořená nebo změněná nákupní objednávka byla podle nastavené strategie uvolňování odeslána ke schválení. Událost se odvozuje od spuštění strategie uvolňování a přechodu objednávky do stavu čekajícího na schválení. | ||
| Proč je to důležité Rozlišení mezi vytvořením objednávky a zahájením schvalování umožňuje přesně měřit KPI doby schválení. Odhalí také prodlevu před spuštěním workflow schvalování. Kde data získat Událost se odvozuje z dokladů změn (CDHDR/CDPOS) pro nákupní objednávku (objekt EINKBELEG), které zachycují první nastavení stavu uvolnění. Lze ji také určit podle prvního nastavení celkového stavu uvolnění (EKKO-FRGKE) na hodnotu označující probíhající schvalování. Zachycení Vyhledejte první záznam v dokladech změn, který spouští strategii uvolňování objednávky. Typ události inferred | |||
| Zadání potvrzení poskytnutí služeb | U nákupních objednávek služeb tato aktivita označuje potvrzení, že služby byly poskytnuty. Jde o explicitní událost zaznamenanou vytvořením výkazu o poskytnutých službách (například pomocí transakce ML81N). | ||
| Proč je to důležité U služeb jde o obdobu příjmu zboží, která je nezbytná pro sledování plnění objednávek služeb. Spouští finanční proces úhrady služeb. Kde data získat Údaj se získává z data vytvoření (ESSR-ERDAT) v hlavičkové tabulce výkazů o poskytnutých službách (ESSR). Propojení s nákupní objednávkou je v tabulce ESLL. Zachycení Pro výkazy o poskytnutých službách propojené s objednávkou použijte časovou značku vytvoření z tabulky ESSR. Typ události explicit | |||
| Zamítnutí nákupní objednávky | K této aktivitě dochází, když schvalovatel během workflow schvalování nákupní objednávku zamítne. Jde o odvozenou událost, která se určuje podle změny stavu v datech strategie uvolňování objednávky a označuje její zamítnutí. | ||
| Proč je to důležité Sledování zamítnutí pomáhá odhalit problémy s kvalitou dat objednávky, nedodržováním pravidel nebo nastavením schvalovací matice. Zamítnutí často vede k přepracování a prodlužuje celkovou dobu cyklu. Kde data získat Událost se odvozuje z dokladů změn (CDHDR/CDPOS) stavu uvolnění nákupní objednávky. Zamítnutí se obvykle zaznamená zrušením kódu uvolnění nebo nastavením konkrétního stavu zamítnutí. Zachycení Sledujte protokoly změn a vyhledejte zrušení kódu uvolnění nebo změnu stavu označující zamítnutí. Typ události inferred | |||
| Změna nákupní objednávky | Označuje jakoukoli změnu nákupní objednávky po jejím prvním vytvoření, například změnu množství, ceny nebo data dodání. Tyto změny se výslovně zaznamenávají v systému dokladů změn SAP. | ||
| Proč je to důležité Časté změny, zejména po schválení, ukazují na neefektivní proces, nedostatečné plánování na začátku nebo postupné rozšiřování rozsahu. Tato aktivita je důležitá pro dashboard přepracování a změn nákupních objednávek i související KPI. Kde data získat Změny se výslovně zaznamenávají v hlavičkové tabulce dokladů změn (CDHDR) a v tabulce položek (CDPOS) pro objekt nákupní objednávky (EINKBELEG). Každá změna vytvoří nový záznam s časovou značkou. Zachycení Z tabulek CDHDR a CDPOS propojených s číslem nákupní objednávky načtěte události změn a jejich časové značky. Typ události explicit | |||
Návody k extrakci dat
Kroky
- Vytvoření programu ABAP: Otevřete editor ABAP pomocí transakčního kódu SE38. Zadejte název nového programu, například Z_PM_PO_EXTRACT, a klikněte na „Create“. Zadejte název, například „Process Mining PO Data Extraction“, a jako typ nastavte „Executable Program“.
- Definice výběrové obrazovky: V programu definujte parametry výběrové obrazovky. Uživatelé díky nim mohou filtrovat data, která chtějí extrahovat. Mezi hlavní parametry patří období vytvoření nákupní objednávky, kód společnosti (BUKRS) a typ nákupního dokladu (BSART).
- Definice datových struktur: Deklarujte interní tabulku odpovídající výslednému formátu záznamu událostí. Měla by obsahovat všechny povinné a doporučené atributy: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode a DocumentType.
- Implementace logiky výběru dat: Napište hlavní logiku ABAP pro výběr dat ke každé ze 14 požadovaných aktivit. Bude potřeba načíst data z několika tabulek SAP, například EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS a NAST. Pro každou aktivitu použijte samostatnou podprogramovou rutinu (PERFORM), aby byl kód přehledný.
- Výběr dat nákupních požadavků: Z tabulky EBAN načtěte události „Purchase Requisition Created“ a propojte je s nákupními objednávkami prostřednictvím tabulky EKPO. Pomocí tabulek záznamů změn (CDHDR, CDPOS) určete události „Purchase Requisition Approved“ sledováním změn polí stavu uvolnění.
- Výběr hlavních událostí nákupních objednávek: Z tabulek EKKO a EKPO načtěte událost „Purchase Order Created“. Pomocí tabulek záznamů změn (CDHDR, CDPOS) pro objekt EINKBELEG získejte události „Purchase Order Changed“, „Purchase Order Approved“, „Purchase Order Rejected“, „Purchase Order Completed“ a „Purchase Order Deleted“ podle změn konkrétních polí, například indikátorů uvolnění a příznaků odstranění.
- Výběr událostí komunikace k nákupní objednávce: V tabulce NAST vyhledejte záznamy o úspěšném odeslání nákupní objednávky a zachyťte aktivitu „Purchase Order Sent to Vendor“.
- Výběr událostí příjmu zboží a služeb: V tabulce EKBE vyhledejte zaúčtování materiálových dokladů a podle kategorie pohybu určete aktivity „Goods Receipt Posted“ a „Goods Returned“. V tabulkách ESSR a ESLL vyhledejte záznamy o službách a zachyťte aktivitu „Services Confirmation Entered“.
- Výběr událostí řízení kvality: Pokud používáte modul řízení kvality, vyhledejte v tabulkách QALS a QAVE okamžik přijetí rozhodnutí o použití pro kontrolní dávku propojenou s nákupní objednávkou. Tím zachytíte aktivitu „Quality Inspection Performed“.
- Spojení a formátování dat: Spojte data ze všech jednotlivých výběrů do jedné výsledné interní tabulky. Zajistěte jednotný formát pole EventTime, například YYYY-MM-DDTHH:MI:SS.
- Přidání stahování souboru: Přidejte možnost stáhnout výslednou interní tabulku jako soubor. Doporučeným formátem je soubor oddělený tabulátory nebo CSV. K jeho vytvoření můžete použít funkční modul GUI_DOWNLOAD.
- Spuštění a uložení: Spusťte program pomocí transakce SE38 nebo SA38. Vyplňte kritéria výběru a spusťte sestavu. Po zobrazení výzvy uložte výstupní soubor do počítače s příponou .csv. Pak jej můžete nahrát.
Konfigurace
- Období: Pro extrakci je důležité nastavit konkrétní období, obvykle podle data vytvoření objednávky (EKKO-AEDAT). Dobrým začátkem bývá rozsah 3 až 6 měsíců. Získáte tak dostatek dat pro analýzu, aniž by jejich objem byl příliš velký.
- Kód společnosti (BUKRS): Omezte extrakci na jeden nebo více kódů společností, abyste zahrnuli pouze relevantní právní subjekty. Tento parametr ovlivňuje výkon i relevanci výsledků.
- Typ nákupního dokladu (BSART): Vyberte konkrétní typy dokladů, například „NB“ pro standardní objednávku. Analýza se tak zaměří na běžné procesy a podle potřeby vyloučí zvláštní typy nákupu.
- Úroveň podrobnosti dat: Extrakce je navržena pro úroveň položek objednávky. ID případu je číslo objednávky (EBELN). Všechny události, včetně událostí na úrovni položky, jako jsou příjmy zboží, se propojí s tímto hlavním ID případu.
- Výkon: U rozsáhlých datových sad naplánujte spuštění programu jako úlohy na pozadí (SM36), abyste předešli chybám způsobeným překročením časového limitu. Ověřte, že v databázi existují indexy pro pole používaná v podmínkách WHERE, zejména v tabulkách CDHDR a CDPOS.
- Předpoklady: Uživatel spouštějící report musí mít oprávnění k přístupu do vývojového prostředí ABAP (SE38) a oprávnění program spustit. Potřebuje také přístup pro čtení všech podkladových tabulek, včetně EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR a tabulek QM.
Ukázkový dotaz abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. Kroky
- Navázání připojení k databázi: Získejte přihlašovací údaje s oprávněním pouze pro čtení a údaje pro připojení k databázi SAP ECC, tedy název hostitele, port a název databáze. Ověřte, že máte nainstalované potřebné klientské nástroje, například DBeaver, SQL Developer nebo SSMS.
- Zjištění schématu SAP: Připojte se k databázi a zjistěte hlavní schéma SAP, ve kterém jsou tabulky uloženy. Často jde o SAPSR3, SAPHANADB nebo jiný název specifický pro daný systém. Pokud toto schéma není pro vašeho uživatele výchozí, budete ho muset v dotazu uvést před každým názvem tabulky.
- Kontrola SQL dotazu: Otevřete dodaný SQL skript v klientském nástroji. Tento dotaz spojuje několik tabulek SAP a získává 14 různých aktivit z procesu od nákupu po platbu.
- Úprava parametrů dotazu: Na začátku skriptu najděte společný tabulkový výraz PO_BASE (CTE). Upravte zástupné hodnoty a určete rozsah extrakce:
- [START_DATE] a [END_DATE]: Nastavte období analýzy, například '20230101' a '20230630'. Doporučujeme filtrovat podle pole AEDAT (Changed On).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Zadejte kódy společností SAP, které chcete zahrnout.
- [DOC_TYPE_1], [DOC_TYPE_2]: Zadejte typy nákupních dokladů, které chcete zahrnout.
- [Your SAP Schema]: V celém skriptu nahraďte tento zástupný text skutečným názvem schématu SAP.
- Spuštění dotazu: Spusťte upravený SQL skript nad databází SAP. Doba zpracování závisí na zvoleném období, objemu dat a výkonu databáze.
- Kontrola výsledků: Po dokončení dotazu rychle zkontrolujte výstup. Ověřte, že počet řádků dává smysl a že klíčové sloupce, například PurchaseOrder, Activity a EventTime, obsahují očekávané hodnoty.
- Export dat do CSV: Exportujte celý výsledek z SQL klienta do souboru CSV. Použijte kódování UTF-8, aby se předešlo problémům se znaky.
- Příprava dat k nahrání: Ověřte, že názvy sloupců v souboru CSV přesně odpovídají požadovaným názvům atributů: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentType.
- Nahrání do nástroje pro process mining: Nahrajte výsledný soubor CSV do aplikace pro process mining, kde můžete data analyzovat a zobrazit.
Konfigurace
- Předpoklady: Je nutný přímý přístup pouze pro čtení k podkladové databázi SAP ECC. Uživatelé potřebují dostatečná oprávnění k dotazování tabulek, jako jsou EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS a NAST.
- Filtrování podle období: Objem dat je nutné omezit filtrem období. Běžným začátkem je filtrování podle EKKO.AEDAT (datum změny objednávky) za období 3 až 6 měsíců. Při delším období může spuštění dotazu trvat velmi dlouho.
- Filtry pro výběr dat: Pro cílenou analýzu vždy filtrujte podle EKKO.BUKRS (kód společnosti) a EKKO.BSART (typ dokladu). Zúžíte tak rozsah na relevantní právní subjekty a obchodní procesy.
- Výkon: Dotaz propojuje několik rozsáhlých tabulek, včetně tabulek historie změn (CDHDR, CDPOS), a může výrazně zatížit zdroje. Doporučujeme spouštět extrakci mimo špičku nebo nad replikovanou databází, která neslouží k produkčnímu provozu, aby nedošlo k ovlivnění výkonu systému.
- Protokolování změn dokladů: Přesnost aktivit jako „Schváleno“, „Zamítnuto“, „Dokončeno“ a „Změněno“ závisí na tom, zda je v SAP aktivní protokolování změn příslušných polí. Ověřte u správce SAP, že je protokolování zapnuté (pomocí transakce SCDO).
Ukázkový dotaz sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator Kroky
- Předpoklady a připojení: Ověřte, že máte v nástroji ETL třetí strany nainstalovaný a licencovaný certifikovaný konektor SAP. V administrační konzoli nástroje ETL nastavte nové připojení k systému SAP ECC. Budete potřebovat hostitele aplikačního serveru, číslo systému, ID klienta a vyhrazeného uživatele SAP s příslušnými oprávněními RFC a oprávněními ke čtení tabulek.
- Určení zdrojových tabulek: V úloze ETL nebo datovém toku nastavte požadované tabulky SAP jako zdroje dat. Mezi hlavní tabulky patří EKKO (hlavička nákupní objednávky), EKPO (položka nákupní objednávky), EBAN (nákupní požadavek), CDHDR (hlavička záznamu změn), CDPOS (položka záznamu změn), MSEG (položka dokladu: materiál), MKPF (hlavička materiálového dokladu), NAST (stav zprávy), ESSR (hlavička záznamu o službě) a QALS (kontrolní dávka).
- Extrakce události „Purchase Order Created“: Vytvořte datový tok se zdrojem v tabulce EKKO. Filtrujte záznamy podle požadovaného období, například pomocí AEDAT, a organizačního rozsahu, například BUKRS pro kód společnosti a BSART pro typ dokladu. Namapujte EKKO.EBELN na PurchaseOrder, „Purchase Order Created“ na Activity a spojte AEDAT a ERZET pro hodnotu EventTime. Namapujte také další požadované atributy.
- Extrakce události „Goods Receipt Posted“: Vytvořte samostatný datový tok se zdroji MSEG a MKPF, které spojíte podle MBLNR a MJAHR. Filtrujte relevantní druhy pohybu, například '101'. Namapujte MSEG.EBELN na PurchaseOrder, „Goods Receipt Posted“ na Activity a použijte MKPF.CPUDT a MKPF.CPUTM pro EventTime.
- Extrakce událostí podle změn (schválení, změny, odstranění): Vytvořte datový tok se zdroji CDHDR a CDPOS, které spojíte podle CHANGENR. Z tohoto zdroje lze odvodit několik aktivit.
- Filtrujte OBJECTCLAS = 'EINKBELEG' a TABNAME = 'EKPO'.
- U události „Purchase Order Approved“ filtrujte změny pole stavu uvolnění, například FNAME = 'FRGZU', kde nová hodnota (VALUE_NEW) označuje konečné schválení.
- U události „Purchase Order Deleted“ filtrujte změny indikátoru odstranění (FNAME = 'LOEKZ'), jehož nová hodnota je 'L'.
- U události „Purchase Order Changed“ filtrujte změny dalších relevantních polí a vynechte pole stavů použitá pro jiné aktivity.
- U všech těchto událostí použijte pro EventTime hodnoty CDHDR.UDATE a CDHDR.UTIME.
- Extrakce událostí nákupních požadavků: Vytvořte datový tok z EBAN pro událost „Purchase Requisition Created“. Chcete-li ji propojit s případem PurchaseOrder, spojte EBAN s EKPO podle čísla požadavku (BANFN) a položky (BNFPO). Pro událost „Purchase Requisition Approved“ použijte CDHDR/CDPOS s OBJECTCLAS = 'BANF'. Pečlivě nastavte mapování, aby se událost přiřadila k odpovídající nákupní objednávce.
- Extrakce události „PO Sent to Vendor“: Vytvořte datový tok se zdrojem v tabulce NAST. Filtrujte podle OBJECTKEY, který obsahuje číslo nákupní objednávky, příslušného typu výstupu (KSCHL) a úspěšného stavu zpracování (VSTAT = '1'). Pro EventTime použijte ERDAT a UHR.
- Spojení datových toků aktivit: Pomocí transformace „Union“ nebo „Merge“ v nástroji ETL spojte výstupy všech datových toků vytvořených v předchozích krocích. Ověřte, že názvy sloupců a datové typy jsou ve všech tocích stejné (PurchaseOrder, Activity, EventTime atd.).
- Převod datových typů a formátů: Převeďte sloupec EventTime na jednotný formát časového razítka, například YYYY-MM-DD HH:MM:SS. Převeďte OrderAmount na běžný desetinný formát.
- Nastavení cílového umístění: Nastavte cíl, tedy „sink“, pro spojený datový tok. Obvykle jde o plochý soubor, například CSV nebo Parquet. Nastavte oddělovač, uvozovací znaky textu a možnosti záhlaví.
- Spuštění a ověření: Spusťte celou úlohu ETL. Zkontrolujte výstupní soubor: ověřte, že obsahuje všech 14 aktivit, počet řádků dává smysl a klíčové atributy jsou správně vyplněné.
- Plánování a export: Po ověření naplánujte pravidelné spouštění úlohy ETL, například každou noc, aby data zůstala aktuální. Vygenerovaný soubor je připravený k nahrání do nástroje pro process mining.
Konfigurace
- Předpoklady: Komerční nástroj ETL (např. Informatica PowerCenter, Talend nebo SAP Data Services) s odpovídajícím konektorem pro ECC certifikovaným společností SAP. Dialogový nebo systémový uživatel SAP s oprávněními S_RFC a S_TABU_DIS pro požadované tabulky.
- Připojení k SAP: Konektor musí být nakonfigurován s aplikačním serverem SAP, číslem systému, klientem, uživatelem a heslem. Doporučujeme používat Secure Network Communications (SNC).
- Filtr časového období: Je důležité omezit objem dat filtrem časového období. Běžně se filtruje EKKO.AEDAT (datum vytvoření objednávky) za poslední 3 až 12 měsíců. Filtr nastavte přímo u zdroje, aby se ze SAP neextrahovalo zbytečně velké množství dat.
- Filtry organizačního rozsahu: Vždy filtrujte podle EKKO.BUKRS (kód společnosti). Zvažte také filtrování podle EKPO.WERKS (závod) nebo EKKO.EKORG (nákupní organizace), abyste analýzu omezili na konkrétní organizační jednotku.
- Filtr typu dokladu: Pomocí EKKO.BSART zahrňte pouze relevantní typy objednávek a vylučte převody zásob nebo jiné interní doklady, které nejsou součástí standardního procesu P2P.
- Ladění výkonu: Extrakce z tabulek změnových dokladů (CDHDR, CDPOS) může být pomalá. Nastavte filtry pro OBJECTCLAS, OBJECTID a UDATE. Upravte nastavení „Packet Size“ v konektoru SAP, abyste optimalizovali rychlost přenosu dat. U velmi rozsáhlých systémů zvažte nejprve jednorázové načtení historických dat a poté plánované přírůstkové načítání.
Ukázkový dotaz sql
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]); Chcete začít?
Tato šablona vám poskytne podklady k optimalizaci procesu od nákupu k platbě, objednávky, v SAP ECC. Začněte využívat svá data k odhalování příležitostí ke zlepšení a zvyšování efektivity.
Optimalizujte objednávky v procesu od nákupu k platbě: začněte zkušební verzi
Odstraňte úzká místa a zkraťte dobu cyklu alespoň o 30 %.
Platební kartu nepotřebujete. Začít můžete během několika minut.