Šablona dat pro proces od nákupu po platbu: objednávky
Šablona dat pro proces od nákupu po platbu: objednávky
- Doporučené atributy pro podrobnou analýzu
- Hlavní aktivity, které je třeba v procesu sledovat
- Postup extrakce dat krok za krokem
Atributy procesu od nákupu po platbu: objednávky
| Název | Popis | ||
|---|---|---|---|
| Aktivita ActivityName | Název obchodní události nebo kroku, který v procesu objednávky proběhl. | ||
| Popis Tento atribut popisuje konkrétní akci nebo změnu stavu během životního cyklu objednávky, například „Vytvoření objednávky“, „Schválení objednávky“ nebo „Zaúčtování příjmu zboží“. Pořadí těchto aktivit tvoří průběh procesu. Analýza pořadí a četnosti aktivit je základem process mining. Pomáhá odhalit skutečný průběh procesu, porovnat ho s navrženým modelem, najít úzká místa, například dlouhé čekání po „Přijetí faktury“, a vyčíslit přepracování, například opakované aktivity „Změna objednávky“. Proč je to důležité Určuje jednotlivé kroky procesu a umožňuje zobrazit a analyzovat jeho průběh od začátku do konce, varianty i úzká místa. Kde data získat Obvykle se odvozuje z kombinace tabulek a polí, například polí stavu v EKKO/EKPO nebo protokolů dokladů změn v CDHDR/CDPOS, které zachycují důležité obchodní milníky. Příklady Vytvoření objednávkySchválení objednávkyZaúčtování příjmu zbožíPřijetí faktury | |||
| Čas události EventTime | Časové razítko určující, kdy aktivita proběhla. | ||
| Popis Tento atribut zaznamenává přesné datum a čas každé aktivity v procesu. Je základem všech časových analýz v process mining. Čas události slouží k chronologickému seřazení aktivit a sestavení průběhu procesu. Používá se také k výpočtu všech časových ukazatelů, například doby mezi aktivitami, čekání a zpracování. Tyto údaje jsou důležité pro analýzu výkonnosti a hledání úzkých míst. Proč je to důležité Toto časové razítko je nezbytné pro správné seřazení událostí a výpočet všech ukazatelů výkonnosti včetně doby zpracování, dodací lhůty a čekání. Kde data získat Pole s časovými údaji přiřazená ke konkrétním aktivitám, například datum vytvoření (EKKO-AEDAT u změn) nebo datum zaúčtování (MKPF-BUDAT u příjmu zboží). Často je nutné spojit data z více tabulek. Příklady 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Objednávka PurchaseOrderNumber | Jedinečný identifikátor objednávky (PO), který slouží jako hlavní ID případu pro sledování celého nákupního cyklu. | ||
| Popis Číslo objednávky je hlavní identifikátor, který propojuje všechny související aktivity od vytvoření až po příjem zboží a dokončení. V analýze process mining slouží jako ID případu. Seskupením událostí podle tohoto čísla lze rekonstruovat průběh každé objednávky. To je nezbytné pro výpočet doby zpracování, analýzu variant procesu a hledání úzkých míst nebo odchylek u jednotlivých objednávek. Proč je to důležité Tento identifikátor propojuje všechny nákupní události do jednoho procesu od začátku do konce a umožňuje podrobně analyzovat životní cyklus každé objednávky. Kde data získat Tento atribut najdete v tabulce EKKO v SAP S/4HANA, v poli EBELN. Příklady 450001712345000171244500017125 | |||
| Poslední aktualizace dat LastDataUpdate | Časové razítko poslední aktualizace nebo extrakce dat ze zdrojového systému. | ||
| Popis Tento atribut ukazuje, jak aktuální jsou analyzovaná data. Uvádí datum a čas posledního načtení dat ze SAP S/4HANA. Informace o poslední aktualizaci pomáhá uživatelům posoudit aktuálnost analýzy. Díky ní vědí, zda pracují s aktuálními informacemi, nebo se snímkem dat z určitého okamžiku. To ovlivňuje, jak relevantní jsou případná opatření založená na analýze. Proč je to důležité Informuje uživatele o aktuálnosti dat, aby mohli správně posoudit kontext a význam výsledků analýzy. Kde data získat Jde o časové razítko metadat přidané při extrakci, transformaci a načítání dat (ETL). Příklady 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Zdrojový systém SourceSystem | Určuje zdrojový systém, ze kterého byla data extrahována. | ||
| Popis Tento atribut označuje systém, ze kterého pocházejí data události, například „SAP S/4HANA Production“ nebo „SAP ECC“. V prostředí s více systémy je toto pole důležité pro sledování původu dat, řešení problémů a správnou interpretaci dat z různých zdrojů. Pomáhá pochopit jejich kontext a filtrovat analýzu podle konkrétního systémového prostředí. Proč je to důležité Poskytuje důležitý kontext o původu dat, který je nezbytný pro správu, ověřování a analýzu dat v prostředí s více systémy. Kde data získat Obvykle jde o statickou hodnotu přidanou při extrakci, transformaci a načítání dat (ETL), která označuje původ datové sady. Příklady S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Celková čistá částka TotalNetAmount | Celková hodnota objednávky bez daní a nákladů na dopravu. | ||
| Popis Tento atribut vyjadřuje čistou peněžní hodnotu objednávky. Jde o důležitý finanční údaj, který ukazuje rozsah nákupní transakce. Částka je důležitá pro finanční analýzu. Objednávky můžete například rozdělit podle hodnoty a zjistit, zda se jejich průběh liší. Lze ji také využít k určení priorit analýzy a zaměřit se na objednávky s vysokou hodnotou, které mohou představovat větší finanční riziko nebo mít větší dopad na podnik. Proč je to důležité Umožňuje finanční analýzu, rozdělení objednávek podle hodnoty a zaměření zlepšování procesů na oblasti s vysokými výdaji. Kde data získat Tento atribut najdete v tabulce EKKO v SAP S/4HANA, v poli NETWR. Příklady 1500.0025000.50125.75 | |||
| ID dodavatele VendorId | Jedinečný identifikátor dodavatele zboží nebo služeb. | ||
| Popis ID dodavatele je důležitý kmenový údaj, který propojuje objednávku s konkrétním dodavatelem. Používá se při komunikaci, dodání i platbě. V process mining umožňuje tento atribut rozdělit analýzu výkonnosti podle dodavatelů. Hodí se pro dashboardy jako „Výkonnost dodavatelů podle dodací lhůty“ nebo „Míra vrácení zboží podle dodavatele“. Pomáhá tak určit nejspolehlivější dodavatele i ty, kteří mohou způsobovat zpoždění nebo problémy s kvalitou. Proč je to důležité Umožňuje analyzovat proces z pohledu dodavatelů, vyhodnocovat jejich výkonnost, odhalit nejlepší i nejslabší dodavatele a zlepšit řízení dodavatelského řetězce. Kde data získat Tento atribut najdete v tabulce EKKO v SAP S/4HANA, v poli LIFNR. Příklady 100023100045100088 | |||
| Nákupní požadavek PurchaseRequisitionNumber | Identifikátor nákupního požadavku (PR), na jehož základě byla objednávka vytvořena. | ||
| Popis Tento atribut propojuje objednávku s původním nákupním požadavkem. Některé PO nákupní požadavek nemají, pokud byly vytvořeny přímo. Toto propojení je nezbytné pro analýzu celého nákupního procesu od původní žádosti. Podporuje KPI, jako je „Doba schválení nákupního požadavku“, a pomáhá odhalit nákupy mimo schválené postupy, kdy se PO vytvoří bez předchozího schváleného požadavku. Proč je to důležité Propojuje PO s původním požadavkem, umožňuje analyzovat celý proces od začátku do konce a odhalovat nákupy mimo schválené postupy. Kde data získat Tento atribut najdete v tabulce EKPO v SAP S/4HANA na úrovni položky PO, v poli BANFN. Příklady 1001005110010052 | |||
| Požadované datum dodání RequestedDeliveryDate | Datum, do kterého podnik požádal dodavatele o dodání zboží nebo služeb. | ||
| Popis Tento atribut určuje cílové datum dodání uvedené v objednávce. Slouží jako základ pro měření výkonnosti dodavatele při dodržování termínů. V process mining se toto datum porovnává se skutečným datem příjmu zboží, tedy s časovým razítkem aktivity „Zaúčtování příjmu zboží“. Na jeho základě se vypočítá KPI „Podíl včasných dodávek dodavatele“. Odchylky od požadovaného data pomáhají vyhodnotit spolehlivost dodavatele a řídit rizika v dodavatelském řetězci. Proč je to důležité Slouží jako základ pro měření včasnosti dodávek dodavatele, což je důležitý KPI pro řízení dodavatelského řetězce a plánování provozu. Kde data získat Tento údaj najdete v tabulce řádků plánu EKET, v poli EINDT. Příklady 2023-06-012023-06-152023-07-01 | |||
| Typ dokladu PO DocumentType | Klasifikace, která rozlišuje různé typy objednávek, například standardní PO, PO na služby nebo objednávky pro přesun zásob. | ||
| Popis Typ dokladu je konfigurační prvek SAP, který určuje průběh procesu, číselnou řadu a pole objednávky. Umožňuje přizpůsobit nákupní proces různým situacím. Analýza podle typu dokladu je důležitá pro pochopení rozdílů mezi průběhy procesu. Například proces standardní objednávky zboží se může výrazně lišit od objednávky služby nebo převodu zásob. Tento atribut umožňuje filtrovat a porovnávat jednotlivé průběhy a hledat konkrétní možnosti zlepšení. Proč je to důležité Rozděluje objednávky do kategorií, takže můžete porovnávat různé nákupní procesy a vysvětlit rozdíly v jejich průběhu a době zpracování. Kde data získat Tento atribut najdete v tabulce EKKO v SAP S/4HANA, v poli BSART. Příklady NBFOUB | |||
| Uživatel UserName | Identifikátor uživatele, který provedl konkrétní aktivitu. | ||
| Popis Tento atribut zachycuje ID uživatele SAP, který dokument vytvořil, změnil nebo schválil. Umožňuje dohledat, kdo v systému provedl jednotlivé kroky. Analýza podle uživatelů pomáhá určit potřeby školení, rozložení pracovní zátěže a individuální výkonnost. Můžete například zjistit, zda jsou někteří uživatelé opakovaně spojeni s dlouhým schvalováním nebo častými změnami po schválení. Tato zjištění mohou podpořit plánování zdrojů a zlepšování procesů. Proč je to důležité Umožňuje určit odpovědnost a analyzovat výkonnost jednotlivců nebo týmů. Pomáhá také odhalit potřebu školení nebo nedostatek zdrojů. Kde data získat Tyto údaje najdete například v poli ERNAM (Created by) v EKKO nebo v poli uživatele v tabulkách dokladů změn (CDHDR-USERNAME). Příklady CB9980000012JSMITHRROE | |||
| Číslo materiálu MaterialNumber | Identifikátor konkrétního pořizovaného materiálu nebo zboží. | ||
| Popis Číslo materiálu je jedinečný kód přiřazený každému záznamu v kmenových datech materiálu v SAP. Používá se ve všech transakcích souvisejících s daným materiálem, včetně nákupu, správy zásob a prodeje. Analýza podle čísla materiálu nebo skupiny materiálů umožňuje porovnávat nákup podle komodit. Pomůže zjistit, zda je nákup některých druhů materiálu méně efektivní, trvá déle nebo častěji vede k vrácení zboží. Tyto poznatky lze využít při řízení kategorií. Proč je to důležité Umožňuje analýzu podle komodit a pomáhá odhalit problémy v procesu nebo výkonnosti dodavatelů u konkrétních produktů či materiálů. Kde data získat Tento atribut se nachází v tabulce SAP S/4HANA EKPO, v poli MATNR. Příklady RM100-100FG210SERV-CONSULT | |||
| Kategorie položky ItemCategory | Klasifikuje položku objednávky, například jako standardní, konsignační, subdodavatelskou nebo službu. | ||
| Popis Kategorie položky určuje, jak se řídí a zpracovává nákup konkrétního materiálu nebo služby. Ovlivňuje následující kroky, například příjem zboží a ověření faktury. Tento atribut je důležitý pro analýzu variant procesu podle toho, co se nakupuje. Proces u služby, která vyžaduje výkaz o poskytnuté službě, se například výrazně liší od procesu u standardní skladové položky. Analýza podle kategorie položky pomáhá tyto rozdíly vysvětlit a cíleně zlepšovat proces. Proč je to důležité Vysvětluje varianty procesu podle typu nákupu, například zboží, služeb nebo subdodávek. Kde data získat Tento atribut se nachází v tabulce SAP S/4HANA EKPO, v poli PSTYP. Příklady 093 | |||
| Nákup mimo schválený postup IsMaverickSpend | Vypočítaný příznak, který označuje, zda byla objednávka vytvořena bez předchozí schválené nákupní žádanky. | ||
| Popis Tento logický příznak se vypočítává při zpracování dat. Nastaví se na hodnotu 'true', pokud k objednávce není přiřazena nákupní žádanka nebo pokud její vytvoření obešlo standardní schvalovací workflow. Tento atribut přímo podporuje dashboard „Identifikace nákupů mimo schválený postup“ a související KPI. Pomáhá vyčíslit rozsah nákupů, které nedodržují pravidla, a určit oddělení nebo skupiny uživatelů, na které se zaměřit při posilování nákupních zásad a kontrol. Proč je to důležité Přímo identifikuje nákupy, které nedodržují pravidla. Pomáhá vyčíslit odchylky od procesu a prosazovat finanční kontroly i nákupní zásady. Kde data získat Vypočítané pole založené na chybějící hodnotě v 'PurchaseRequisitionNumber' u konkrétních typů dokladů nebo na analýze posloupnosti událostí. Příklady truefalse | |||
| Nákupní organizace PurchasingOrganization | Organizační jednotka odpovědná za nákup materiálu a služeb a za jednání s dodavateli. | ||
| Popis Nákupní organizace je důležitou organizační jednotkou v oblasti nákupu. Může působit na úrovni celé skupiny, společnosti nebo závodu a odpovídá za veškeré nákupní činnosti. Analýza procesu podle nákupní organizace pomáhá vyhodnotit efektivitu a výkonnost různých nákupních týmů nebo regionů. Může odhalit rozdíly v jednání s dodavateli, dodržování procesů nebo prodlevách při schvalování mezi organizačními jednotkami. Proč je to důležité Umožňuje porovnat výkonnost různých nákupních oddělení nebo regionů a pomáhá určit osvědčené postupy i oblasti ke zlepšení. Kde data získat Tento atribut se nachází v tabulce SAP S/4HANA EKKO, v poli EKORG. Příklady 10101710US01 | |||
| Nákupní skupina PurchasingGroup | Skupina nákupčích odpovědná za konkrétní nákupní činnosti. | ||
| Popis Nákupní skupinu tvoří jeden nebo více nákupčích odpovědných za konkrétní nákupní činnosti, materiál nebo dodavatele. Pro dodavatele jsou hlavním kontaktním místem. Tento atribut umožňuje podrobnější analýzu vytížení a výkonnosti než nákupní organizace. Pomáhá odhalit přetížené týmy, měřit efektivitu jednotlivých skupin nákupčích a zjistit, které skupiny častěji nedodržují proces, například při nákupech mimo schválené postupy. Proč je to důležité Poskytuje podrobný přehled o výkonnosti skupin nákupčích a umožňuje na úrovni týmů analyzovat vytížení, efektivitu i dodržování procesů. Kde data získat Tento atribut se nachází v tabulce SAP S/4HANA EKKO, v poli EKGRP. Příklady 001002N00 | |||
| Přepracování IsRework | Vypočítaný příznak, který označuje, zda bylo nutné objednávku přepracovat, například kvůli změně po schválení nebo vrácení zboží. | ||
| Popis Tento logický atribut se vypočítává analýzou posloupnosti aktivit u každé objednávky. Nastaví se na hodnotu 'true', pokud po události 'Purchase Order Approved' následuje událost 'Purchase Order Changed' nebo pokud se vyskytne událost 'Goods Returned'. Příznak usnadňuje výpočet KPI „Míra zpracování bez zásahu“. Umožňuje snadno filtrovat a zobrazit všechny objednávky, které vyžadovaly ruční zásah nebo opravu, a vyčíslit četnost i náklady na přepracování. Proč je to důležité Pomáhá vyčíslit neefektivitu procesu tím, že označuje případy vyžadující přepracování. To je důležité pro výpočet míry zpracování bez zásahu i hledání příčin odchylek. Kde data získat Vypočítané pole založené na posloupnosti aktivit. Logika ověřuje, zda po schválení následuje událost 'Purchase Order Changed' nebo zda existuje událost 'Goods Returned'. Příklady truefalse | |||
| Účetní okruh CompanyCode | Identifikátor právnické osoby nebo společnosti, pro kterou se vytváří objednávka. | ||
| Popis Účetní okruh představuje samostatnou účetní jednotku v rámci organizace. Veškeré finanční transakce související s objednávkou se účtují na konkrétní účetní okruh. Jde o základní organizační atribut, který umožňuje filtrovat a porovnávat nákupní procesy napříč různými právnickými osobami. Analýza podle účetního okruhu může odhalit rozdíly v průběhu procesu, efektivitě nebo míře dodržování pravidel v jednotlivých částech organizace. Proč je to důležité Umožňuje rozdělit analýzu procesu podle právnické osoby a porovnat výkonnost a dodržování pravidel v různých částech firmy. Kde data získat Tento atribut se nachází v tabulce SAP S/4HANA EKKO, v poli BUKRS. Příklady 101017102000 | |||
| Včasnost dodávek dodavatele SupplierOnTimeDelivery | Vypočítaný příznak, který označuje, zda byl příjem zboží zaúčtován v požadovaném termínu nebo dříve. | ||
| Popis Tento logický atribut se vypočítává porovnáním časového razítka aktivity 'Goods Receipt Posted' s hodnotou 'Requested Delivery Date'. Pokud je příjem zboží zaúčtován v požadovaném termínu nebo dříve, příznak se nastaví na hodnotu 'true'. Atribut přímo podporuje KPI „Míra včasných dodávek dodavatele“. Usnadňuje analýzu, protože uživatelé mohou jednoduše filtrovat včasné a opožděné dodávky. To je důležité pro dashboardy výkonnosti dodavatelů a jejich hodnocení. Proč je to důležité Přímo měří spolehlivost dodavatele. Je základem KPI včasných dodávek a umožňuje účinně řídit výkonnost dodavatelů. Kde data získat Vypočítává se porovnáním časového razítka aktivity 'Goods Receipt Posted' s atributem 'RequestedDeliveryDate'. Příklady truefalse | |||
| Závod Plant | Provozní místo nebo lokalita, kam se zboží dodává nebo kde se poskytují služby. | ||
| Popis V SAP je závod fyzické místo, kde se zboží vyrábí nebo skladuje, případně kde se poskytují služby. Je důležitou součástí logistiky a plánování. Rozdělení analýzy procesu podle závodu může odhalit regionální rozdíly nebo odlišnosti mezi jednotlivými provozy. Ukáže například, zda se v některých závodech zboží dodává déle nebo častěji vrací, což může poukazovat na místní problémy v logistice nebo kontrole kvality. Proč je to důležité Umožňuje analýzu podle lokality a odhaluje rozdíly ve výkonnosti procesu mezi provozy, závody nebo sklady. Kde data získat Tento atribut se nachází v tabulce SAP S/4HANA EKPO, v poli WERKS. Příklady 10101710DE01 | |||
Aktivity procesu od nákupu po platbu: objednávky
| Aktivita | Popis | ||
|---|---|---|---|
| Dokončení objednávky | Tato aktivita označuje, že je položka objednávky z logistického hlediska uzavřená. Stav se odvozuje z nastavení ukazatelů „Dodávka dokončena“ a „Konečná faktura“. | ||
| Proč je to důležité Tato aktivita představuje konec životního cyklu objednávky. Doba do této události ukazuje celkovou dobu nákupního procesu od začátku do konce. Kde data získat Stav se odvozuje z příznaků v tabulce položek objednávky EKPO. Událost nastane, když jsou nastaveny ukazatele „Dodávka dokončena“ (ELIKZ) i „Konečná faktura“ (EREKZ). Zachycení Odvozuje se ze záznamů změn, když jsou pole ELIKZ a EREKZ v EKPO označena jako dokončená. Typ události inferred | |||
| Přijetí faktury | Označuje zadání faktury dodavatele do systému SAP a její propojení s příslušnou objednávkou. Jde o explicitní finanční zaúčtování, při kterém vzniká účetní doklad. | ||
| Proč je to důležité Tento milník propojuje nákupní proces se zpracováním závazků. Umožňuje analyzovat dobu mezi příjmem zboží a zpracováním faktury. Kde data získat Účetní doklad se vytvoří v tabulce BKPF (hlavička), jeho řádky jsou v BSEG nebo v univerzálním deníku ACDOCA. S objednávkou je propojen přes tabulku RSEG. Zachycení Datum zadání dokladu (CPUDT) z tabulky hlaviček účetních dokladů BKPF. Typ události explicit | |||
| Schválení nákupního požadavku | Označuje formální schválení nákupního požadavku vedoucím nebo určeným schvalovatelem. Obvykle se odvozuje ze změny stavu dokumentu, která znamená, že požadavek lze převést na objednávku. | ||
| Proč je to důležité Tento milník je důležitý pro sledování doby schvalování a hledání úzkých míst. Zdržení v této fázi přímo ovlivňuje, jak rychle lze vytvořit objednávku a odeslat ji dodavateli. Kde data získat Odvozuje se z polí stavu uvolnění v tabulce EBAN, například FRGZU (Release indicator). Časové razítko se určuje z dokladů změn CDHDR/CDPOS, které zaznamenávají nastavení konečného stavu uvolnění. Zachycení Odvozuje se ze záznamů změn polí stavu uvolnění v tabulce EBAN v CDHDR/CDPOS. Typ události inferred | |||
| Schválení objednávky | Označuje, že objednávka získala všechna potřebná interní schválení a lze ji odeslat dodavateli. Událost se odvozuje ze změny stavu strategie uvolnění objednávky. | ||
| Proč je to důležité Tento milník je důležitý pro měření efektivity schvalování a přepracování po schválení. Doba mezi vytvořením a schválením PO ukazuje zdržení v interním procesu. Kde data získat Odvozuje se z ukazatele uvolnění (FRGKE) v tabulce EKKO. Časové razítko se určí z historie změn (CDHDR/CDPOS), která zaznamenává, kdy se pole změnilo na stav „uvolněno“. Zachycení Odvozuje se ze záznamů změn pole ukazatele uvolnění (FRGKE) v tabulce EKKO. Typ události inferred | |||
| Vytvoření nákupního požadavku | Tato aktivita označuje formální žádost o zboží nebo služby a zahajuje nákupní proces. Událost se zaznamená při uložení nového dokumentu nákupního požadavku, například pomocí transakce ME51N. | ||
| Proč je to důležité Pro mnoho objednávek jde o výchozí bod jejich životního cyklu. Analýza doby mezi touto událostí a vytvořením PO pomáhá odhalit zdržení při zajišťování dodávek a interním zpracování. Kde data získat Záznam je v tabulce EBAN (Purchase Requisition). Časové razítko vytvoření lze dohledat v tabulkách historie změn CDHDR a CDPOS pro objekt EBAN. Zachycení Událost se zaznamená při vytvoření dokumentu v tabulce EBAN. Typ události explicit | |||
| Vytvoření objednávky | Označuje vytvoření oficiálního dokladu objednávky, který může vzniknout s odkazem na nákupní požadavek i bez něj. Jde o explicitní událost zaznamenanou při prvním uložení dokladu PO v systému. | ||
| Proč je to důležité Tato aktivita může sloužit jako alternativní začátek procesu, zejména při analýze nákupů mimo schválené postupy. Je také základní událostí pro sledování celkové doby zpracování PO. Kde data získat Záznam je v tabulce hlaviček objednávek EKKO. Datum vytvoření (AEDAT) a čas dokumentu jsou uloženy přímo v této tabulce. Zachycení Časové razítko vytvoření (AEDAT) dokumentu objednávky v tabulce EKKO. Typ události explicit | |||
| Zaúčtování příjmu zboží | Označuje fyzické převzetí zboží od dodavatele a odpovídající záznam v systému. Jde o explicitní transakci, která aktualizuje historii objednávky. | ||
| Proč je to důležité Tento důležitý milník ukončuje dodací lhůtu dodavatele a zahajuje interní ověřování faktury. Je nezbytný pro sledování podílu včasných dodávek. Kde data získat Záznam o materiálu je v tabulkách MKPF (hlavička) a MSEG (položka) a v historii objednávky EKBE je propojen s konkrétním druhem pohybu, například 101. Zachycení Datum zaúčtování (BUDAT) z hlavičky dokladu o materiálu (MKPF), propojené přes EKBE. Typ události explicit | |||
| Odeslání objednávky dodavateli | Označuje okamžik, kdy je objednávka předána dodavateli, například přes EDI, e-mailem nebo v tištěné podobě. Událost se často zaznamenává v protokolech správy výstupů systému. | ||
| Proč je to důležité Touto aktivitou začíná skutečná dodací lhůta dodavatele. Je nezbytná pro přesné měření jeho výkonnosti od chvíle, kdy objednávku obdrží. Kde data získat Údaje se získávají z tabulky řízení výstupů NAST, která zaznamenává zprávy odeslané k nákupnímu dokladu. Lze použít datum a čas příslušného typu výstupu, například EDI nebo e-mailu. Zachycení Časové razítko první úspěšně odeslané zprávy k PO v tabulce NAST. Typ události inferred | |||
| Smazání objednávky | Označuje zrušení nebo logické smazání položky objednávky či celého dokladu. Zaznamená se, když uživatel nastaví na dokladu příznak smazání. | ||
| Proč je to důležité Tato aktivita představuje alternativní konec procesu a signalizuje jeho neúspěch nebo zrušení. Analýza důvodů mazání PO může odhalit problémy s plánováním poptávky nebo definováním požadavků. Kde data získat Zaznamenává se z příznaku smazání (LOEKZ) v tabulce hlaviček objednávek (EKKO) nebo položek (EKPO). Časové razítko se odvozuje z dokladů změn (CDHDR/CDPOS). Zachycení Časové razítko z dokladů změn (CDHDR/CDPOS), kdy je nastaven příznak smazání (LOEKZ). Typ události explicit | |||
| Úhrada faktury | Označuje konečné vypořádání faktury dodavatele prostřednictvím platebního běhu nebo ruční platby. Jde o explicitní finanční transakci, při které vzniká vyrovnávací doklad. | ||
| Proč je to důležité Tato aktivita je sice součástí platebního procesu, její zahrnutí ale poskytuje úplný přehled o cyklu procure-to-pay. Je důležitá pro analýzu platebních podmínek a výkonnosti. Kde data získat Platba se zaznamená jako vyrovnávací doklad v BKPF/ACDOCA. Událost úhrady faktury označuje datum vyrovnání (AUGDT) u řádku faktury v tabulce BSEG nebo ACDOCA. Zachycení Datum vyrovnání (AUGDT) dokladu faktury v BSEG nebo ACDOCA. Typ události explicit | |||
| Vrácení zboží | Označuje vrácení dříve převzatého zboží dodavateli, obvykle kvůli problémům s kvalitou, poškození nebo nesprávné dodávce. Zaznamená se jako explicitní storno pohybu zboží. | ||
| Proč je to důležité Tato aktivita ukazuje na přepracování a možné problémy s kvalitou dodavatele nebo správností objednávky. Časté vracení zboží od konkrétního dodavatele nebo u určitého materiálu signalizuje problém. Kde data získat Záznam o materiálu se vytvoří s konkrétním druhem pohybu pro vrácení, například 122. Událost se zaznamená v MKPF/MSEG a propojí s PO v historii EKBE. Zachycení Datum zaúčtování z dokladu o materiálu s druhem pohybu pro vrácení v EKBE. Typ události explicit | |||
| Zadání potvrzení služby | Tato aktivita označuje potvrzení, že byla poskytnuta služba uvedená v objednávce. Zaznamená se při vytvoření výkazu o poskytnuté službě. | ||
| Proč je to důležité U nákupu služeb jde o obdobu příjmu zboží. Aktivita je důležitá pro sledování termínů poskytnutí služby a včasné platby dodavatelům. Kde data získat Záznam vzniká při vytvoření výkazu o poskytnuté službě. Data jsou uložena v tabulkách ESSR (hlavička) a ESLL (řádky). Časové razítko vychází z data vytvoření. Zachycení Datum vytvoření dokumentu výkazu o poskytnuté službě v tabulce ESSR. Typ události explicit | |||
| Změna objednávky | Tato aktivita označuje změnu objednávky po jejím prvním vytvoření, například úpravu množství, ceny nebo data dodání. Změna se zaznamenává v protokolech systému. | ||
| Proč je to důležité Sledování změn, zejména po schválení, je důležité pro odhalení neefektivity, přepracování a možných problémů s dodržováním pravidel. Časté změny mohou ukazovat na nepřesné původní zadání. Kde data získat Změny se zaznamenávají v tabulkách dokladů změn CDHDR (hlavička) a CDPOS (položka) pro objekty objednávek (EINKBELEG). Každá změna vytvoří podrobný záznam. Zachycení Událost se zaznamená při změně důležitých polí v tabulkách EKKO nebo EKPO. Změna je uvedena v CDHDR/CDPOS. Typ události explicit | |||
Návody k extrakci dat
Kroky
- Předpoklady a přístup: Ověřte, že máte uživatele s potřebnými oprávněními pro dotazování nad CDS View v systému SAP S/4HANA. Připojit se můžete přes SAP HANA Studio, ABAP Development Tools (ADT) pro Eclipse nebo nástroj třetí strany pro extrakci dat, který podporuje připojení SQL k databázi SAP HANA.
- Zjistěte údaje pro připojení k systému: Získejte potřebné parametry připojení k systému SAP S/4HANA, včetně hostitele, čísla instance a přihlašovacích údajů.
- Připojte se k databázi: Pomocí zvoleného klienta SQL se připojte k databázi SAP S/4HANA, ve které jsou CDS View uložena.
- Připravte dotaz SQL: Zkopírujte celý dotaz SQL z části Dotaz tohoto dokumentu do editoru SQL. Dotaz je určen k extrakci všech požadovaných aktivit a atributů.
- Nastavte filtry: Vyhledejte v dotazu zástupné hodnoty. Nahraďte _start_date a _end_date požadovaným rozsahem dat pro analýzu, například '20230101' a '20231231'. Upravte filtr poh.CompanyCode tak, aby zahrnoval kódy společností, které chcete analyzovat.
- Spusťte dotaz: Spusťte upravený dotaz SQL nad databází S/4HANA. V závislosti na objemu dat a zadaném období může jeho zpracování chvíli trvat.
- Zkontrolujte předběžné výsledky: Po dokončení dotazu rychle zkontrolujte výstup v klientovi SQL. Ověřte, že jsou zastoupeny různé aktivity, časová razítka jsou správně vyplněna a ID případu (PurchaseOrderNumber) je konzistentní.
- Exportujte data: Exportujte celou sadu výsledků z nástroje SQL do souboru CSV (hodnoty oddělené čárkami). Použijte kódování UTF-8, aby nedošlo k problémům se znaky.
- Připravte data k nahrání: Před nahráním do ProcessMind otevřete soubor CSV a ověřte, že názvy sloupců přesně odpovídají atributům uvedeným v požadavcích na data (PurchaseOrderNumber, ActivityName, EventTime atd.). Pokud exportní nástroj názvy sloupců změnil, upravte je.
- Nahrajte data do ProcessMind: Nahrajte připravený soubor CSV do projektu ProcessMind. Během importu namapujte sloupce v souboru na odpovídající pole ID případu, aktivity a časového razítka.
Konfigurace
- Použitá CDS View: Extrakce využívá sadu standardních CDS View s bohatou sémantikou. Mezi hlavní patří:
- I_PurchaseOrderItemAPI01: Základní údaje o položkách objednávek.
- I_PurchaseRequisitionItemAPI01: Údaje o nákupních požadavcích.
- I_MaterialDocumentItem: Pohyby zboží, například příjem a vrácení.
- I_ServiceEntrySheetAPI01: Události potvrzení služeb.
- I_SupplierInvoiceAPI01: Údaje o fakturách dodavatelů.
- I_OperationalAcctgDocItem: Propojení faktur s účetními doklady za účelem sledování plateb.
- I_ChangeDocument: Záznam změn objednávek.
- Filtr období: Pro zajištění výkonu a omezení objemu dat je důležité nastavit filtr období. Dotaz používá zástupné hodnoty _start_date a _end_date pro datum vytvoření objednávky (PurchaseOrderDate). Doporučujeme začít s daty za 3 až 6 měsíců.
- Filtr podle organizace: Dotaz vždy filtrujte podle CompanyCode, aby extrakce zahrnovala pouze relevantní organizační jednotky. Pro přesnější výběr můžete do hlavního společného výrazu PO_base přidat filtry PurchaseOrderType nebo PurchasingOrganization.
- Předpoklady: Uživatel spouštějící dotaz potřebuje oprávnění SELECT pro všechny výše uvedené CDS View. Přístup k těmto pohledům se obvykle uděluje prostřednictvím konkrétních obchodních nebo analytických rolí v S/4HANA. Bez potřebných oprávnění se dotaz nezdaří.
Ukázkový dotaz sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Kroky
- Ověřte, že máte přímý přístup SQL ke schématu SAP HANA obsahujícímu EKKO a EKPO, a zajistěte si potřebná oprávnění ke čtení. Zástupné hodnoty schématu a připojení nahraďte údaji nastavenými pro váš systém.
- Určete období extrakce pomocí [Start timestamp] a [End timestamp]. Pro první načtení doporučujeme období tří až šesti měsíců. Filtry kódu společnosti a typu dokladu použijte pouze tehdy, pokud je vyžaduje rozsah reportingu.
- Vyhledejte objednávky v EKKO a EKPO a ponechte číslo objednávky, dodavatele, typ dokladu, kód společnosti, datum a čas vytvoření a atributy na úrovni položek. Sečtením čistých hodnot v EKPO vypočítejte TotalNetAmount na úrovni objednávky.
- Získejte události vytvoření a schválení nákupního požadavku z EBAN. K propojení požadavků s objednávkami použijte číslo nákupního požadavku a odkaz na položku dostupný v EKPO. Indikátory schválení a časová razítka požadavků se liší podle nastavení verze, proto nakonfigurujte výrazy pro stav schválení a časové razítko podle aktivní strategie schvalování SAP v části [Configure based on your system].
- Získejte události vytvoření, schválení, změny, odstranění a dokončení objednávky. Pro vytvoření použijte datum a čas vytvoření z EKKO. Schválení, změna a odstranění vyžadují zdroje historie uvolnění nebo změn. Pokud příslušná historie není ve vybraném schématu dostupná, nastavte odpovídající výrazy zdrojů pomocí [Your table name] a [Your column name].
- Získejte události komunikace s dodavatelem, příjmu zboží, potvrzení služby, vrácení zboží, přijetí faktury a její úhrady z příslušných zdrojů výstupů, materiálových dokladů, potvrzení služeb, faktur, účetnictví a vyrovnání. Dotaz obsahuje zástupné hodnoty pro objekty specifické pro daný systém, protože samotné EKKO a EKPO tyto zdroje nepokrývají.
- Převeďte všechny události ze zdrojů do stejné struktury záznamu událostí. Každý řádek musí obsahovat PurchaseOrderNumber, ActivityName, EventTime, SourceSystem, LastDataUpdate, VendorId, UserName, TotalNetAmount, PurchaseRequisitionNumber, RequestedDeliveryDate a DocumentType. Pokud zdroj obsahuje více platných událostí stejného typu, zachovejte je všechny.
- Ověřte časová razítka, odstraňte pouze přesné duplicity zdrojových řádků a nevytvářejte události, pro které neexistuje zdrojový záznam. ProcessMind načítá záznam událostí beze změn, takže každá aktivita zobrazená ve vizualizaci procesu musí být uvedena jako samostatný řádek.
- Exportujte výsledek jako soubor s oddělovači nebo sadu výsledků databázového dotazu s jedním řádkem záhlaví a stálými názvy sloupců. Použijte formát časového razítka podporovaný nastavením nahrávání v ProcessMind, zachovejte PurchaseOrderNumber jako text a nahrajte celý záznam událostí přes nakonfigurované datové připojení ProcessMind.
Konfigurace
- Zdrojové objekty: EKKO a EKPO jsou potvrzené zdroje záhlaví a položek objednávek. Další objekty pro požadavky, stav uvolnění, historii změn, výstupy, pohyby zboží, potvrzení služeb, faktury, platby a vyrovnání je nutné nastavit podle verze SAP S/4HANA a aktivního datového modelu.
- Identifikátor případu: Jako identifikátor případu použijte PurchaseOrderNumber. Události na úrovni položek přiřaďte k číslu objednávky. Pokud je to potřeba, odkazy na položky ponechte v dalším sloupci specifickém pro zdroj.
- Období: Začněte s rozsahem tří až šesti měsíců. Při načítání historických dat zpracovávejte kratší období a kontrolujte překryvy na hranicích, abyste předešli vynechání záznamů.
- Filtry: Nastavte filtry Company Code, Document Type, VendorId, nákupní organizace, nákupní skupiny a data události podle požadovaného rozsahu. Filtry kódu společnosti a typu dokladu musí používat hodnoty platné v cílovém systému.
- Význam událostí: Vytvoření a odstranění lze zaznamenat jako explicitní události, pokud jsou k dispozici příslušná pole dokladu nebo protokoly. Schválení a dokončení jsou události založené na stavu a vyžadují nakonfigurovaná časová razítka stavu. Nevytvářejte řádky pouze na základě aktuálního stavu, pokud pro ně nelze doložit čas události.
- Výkon: Filtrujte co nejdříve podle data události a organizačního rozsahu. Pokud možno, agregujte EKPO před spojením se zdroji událostí a rozsáhlá historická data zpracovávejte po časových úsecích. Zajistěte odpovídající statistiky databáze a vyhněte se neomezenému spojování zdrojů položek, účetnictví a historie změn.
- Čas poslední aktualizace: Pro každý řádek nastavte LastDataUpdate na čas spuštění extrakce.
- Předpoklady: Potřebujete připojení k SAP HANA, oprávnění ke čtení všech nastavených zdrojových objektů, přístup k příslušným datům nákupu, správy zásob, nákupu služeb, ověřování faktur a závazků a připojení ProcessMind, které umožňuje import vybraného souboru nebo sady výsledků.
- Nastavení specifické pro systém: Každý zástupný zdroj v hranatých závorkách nahraďte schválenou tabulkou, pohledem, sloupcem nebo výrazem z cílového systému SAP S/4HANA. V dotazu ani nastavení extrakce neuvádějte přihlašovací údaje.
Ukázkový dotaz sql
WITH
params AS (
SELECT
CAST('[Start timestamp]' AS TIMESTAMP) AS start_ts,
CAST('[End timestamp]' AS TIMESTAMP) AS end_ts,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update,
CAST('[Source system]' AS NVARCHAR(100)) AS source_system
FROM DUMMY
),
po_base AS (
SELECT
h.MANDT,
h.EBELN AS PurchaseOrderNumber,
h.LIFNR AS VendorId,
h.BSART AS DocumentType,
h.BUKRS AS CompanyCode,
CAST(h.AEDAT AS DATE) AS POChangedDate,
CAST(h.AEDAT AS TIMESTAMP) AS POChangedTimestamp,
CAST(h.ERNAM AS NVARCHAR(100)) AS POCreatedBy,
CAST(h.BEDAT AS DATE) AS PODate,
CAST(h.EBELN AS NVARCHAR(20)) AS PurchaseOrderKey,
CAST(SUM(COALESCE(i.NETWR, 0)) AS DECIMAL(23, 2)) AS TotalNetAmount,
CAST(MIN(i.BEDNR) AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
CAST(MIN(i.EINDT) AS DATE) AS RequestedDeliveryDate
FROM EKKO h
INNER JOIN EKPO i
ON i.MANDT = h.MANDT
AND i.EBELN = h.EBELN
WHERE h.AEDAT >= (SELECT start_ts FROM params)
AND h.AEDAT < (SELECT end_ts FROM params)
AND h.BUKRS IN ([Company Code filter])
AND h.BSART IN ([Document Type filter])
GROUP BY
h.MANDT,
h.EBELN,
h.LIFNR,
h.BSART,
h.BUKRS,
h.AEDAT,
h.ERNAM,
h.BEDAT
),
po_items AS (
SELECT
i.MANDT,
i.EBELN AS PurchaseOrderNumber,
i.EBELP,
i.BANFN AS PurchaseRequisitionNumber,
i.BEDNR,
i.EINDT AS RequestedDeliveryDate
FROM EKPO i
),
events AS (
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(r.[Purchase requisition creation timestamp] AS TIMESTAMP) AS EventTime,
s.source_system AS SourceSystem,
s.last_data_update AS LastDataUpdate,
p.VendorId,
CAST(r.[Purchase requisition created by] AS NVARCHAR(100)) AS UserName,
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition source table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition creation timestamp] >= s.start_ts
AND r.[Purchase requisition creation timestamp] < s.end_ts
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(r.[Purchase requisition approval timestamp] AS TIMESTAMP) AS EventTime,
s.source_system,
s.last_data_update,
p.VendorId,
CAST(r.[Purchase requisition approver] AS NVARCHAR(100)),
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)),
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition approval history table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition approval timestamp] >= s.start_ts
AND r.[Purchase requisition approval timestamp] < s.end_ts
AND r.[Approval status] = '[Approved status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Created',
CAST(p.PODate AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
p.POCreatedBy,
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
CROSS JOIN params s
WHERE p.PODate >= CAST(s.start_ts AS DATE)
AND p.PODate < CAST(s.end_ts AS DATE)
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Approved',
CAST(a.[Purchase order approval timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(a.[Approver] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order release history table or view] a
ON a.[Client] = p.MANDT
AND a.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE a.[Purchase order approval timestamp] >= s.start_ts
AND a.[Purchase order approval timestamp] < s.end_ts
AND a.[Release status] = '[Approved release status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Sent to Vendor',
CAST(o.[Output timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(o.[Output user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order output source table or view] o
ON o.[Client] = p.MANDT
AND o.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE o.[Output timestamp] >= s.start_ts
AND o.[Output timestamp] < s.end_ts
AND o.[Output status] = '[Successfully processed output status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Changed',
CAST(c.[Change timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(c.[Changed by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order change history table or view] c
ON c.[Client] = p.MANDT
AND c.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE c.[Change timestamp] >= s.start_ts
AND c.[Change timestamp] < s.end_ts
AND c.[Change indicator] = '[Changed indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Receipt Posted',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods receipt movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Services Confirmation Entered',
CAST(v.[Service entry timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(v.[Entered by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your service entry sheet source table or view] v
ON v.[Client] = p.MANDT
AND v.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE v.[Service entry timestamp] >= s.start_ts
AND v.[Service entry timestamp] < s.end_ts
AND v.[Service entry status] = '[Accepted service entry status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Returned',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods return movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Received',
CAST(i.[Invoice posting timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Invoice posting timestamp] >= s.start_ts
AND i.[Invoice posting timestamp] < s.end_ts
AND i.[Invoice status] = '[Posted invoice status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Paid',
CAST(i.[Clearing timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Cleared by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice clearing source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Clearing timestamp] >= s.start_ts
AND i.[Clearing timestamp] < s.end_ts
AND i.[Clearing status] = '[Cleared status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Completed',
CAST(x.[Completion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(x.[Completion user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order item status source table or view] x
ON x.[Client] = p.MANDT
AND x.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE x.[Completion timestamp] >= s.start_ts
AND x.[Completion timestamp] < s.end_ts
AND x.[Delivery completed indicator] = '[Set indicator value]'
AND x.[Final invoice indicator] = '[Set indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Deleted',
CAST(d.[Deletion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(d.[Deleted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order deletion history table or view] d
ON d.[Client] = p.MANDT
AND d.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE d.[Deletion timestamp] >= s.start_ts
AND d.[Deletion timestamp] < s.end_ts
AND d.[Deletion indicator] = '[Set deletion indicator value]'
)
SELECT
PurchaseOrderNumber,
ActivityName,
EventTime,
SourceSystem,
LastDataUpdate,
VendorId,
UserName,
TotalNetAmount,
PurchaseRequisitionNumber,
RequestedDeliveryDate,
DocumentType
FROM events
WHERE PurchaseOrderNumber IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY PurchaseOrderNumber, EventTime, ActivityName; Kroky
- Specifikace a návrh: Definujte výslednou strukturu souboru se záznamem událostí včetně všech povinných a doporučených atributů. Zdokumentujte konkrétní tabulky SAP, například EKKO, EKPO, EKBE, CDHDR a CDPOS, ze kterých získáte data pro každou z 13 požadovaných aktivit.
- Vytvoření programu: V SAP GUI otevřete editor ABAP pomocí transakčního kódu SE38 nebo SE80. Vytvořte nový spustitelný program, například Z_PM_PO_EXTRACT.
- Definice výběrové obrazovky: Napište kód výběrové obrazovky reportu. Uživatelé díky ní mohou filtrovat extrahovaná data. Přidejte parametry pro období vytvoření objednávky (P_AEDAT), kód společnosti (P_BUKRS) a typ nákupního dokladu (P_BSART).
- Deklarace dat: Definujte interní tabulky a datové struktury potřebné pro program. Patří sem interní tabulka výsledného záznamu událostí, která odpovídá struktuře určené ve specifikaci.
- Implementace logiky výběru dat: Napište hlavní logiku ABAP pro výběr dat všech 13 aktivit. Použijte řadu příkazů SELECT nad příslušnými tabulkami SAP a podle potřeby je propojte. U událostí založených na změnách čtěte tabulky protokolu změn CDHDR a CDPOS.
- Transformace a mapování dat: U každého načteného záznamu namapujte pole tabulek SAP na odpovídající sloupce výsledné interní tabulky záznamu událostí. Nastavte ActivityName podle zpracovávané události, například 'Purchase Order Created'. Pole data a času převeďte na jednotný formát časového razítka pro EventTime.
- Sloučení dat událostí: Po zpracování všech 13 typů aktivit shromážděte všechna data do jedné sjednocené interní tabulky. Ta nyní představuje úplný záznam událostí pro vybrané objednávky.
- Zápis do souboru: Přidejte funkci pro zápis výsledné interní tabulky do souboru. Doporučujeme použít metodu cl_gui_frontend_services=>gui_download, která uživatelům umožní uložit soubor CSV na místní počítač. Pro zpracování na pozadí lze použít také OPEN DATASET a uložit soubor na aplikační server SAP.
- Vytvoření transakčního kódu (volitelné): Chcete-li program zpřístupnit obchodním uživatelům, vytvořte pomocí transakčního kódu SE93 vlastní transakční kód, například ZPM_PO_EXTRACT, který spustí váš program ABAP.
- Naplánování úlohy na pozadí: Při velkém objemu dat nebo automatizované extrakci naplánujte spuštění programu jako úlohy na pozadí pomocí transakčního kódu SM36. Výstupní soubor se zapíše do cesty na aplikačním serveru určené v logice programu.
Konfigurace
- Kritéria výběru: Program by měl obsahovat parametry pro účinné filtrování dat. Mezi hlavní filtry patří:
- Období: Povinné období pro datum vytvoření objednávky (EKKO-AEDAT). Doporučujeme začít rozsahem 3 až 6 měsíců, aby byl objem dat i doba zpracování reportu přiměřená.
- Kód společnosti (BUKRS): Nezbytný pro organizace s více právními subjekty, protože omezuje rozsah extrakce.
- Typ nákupního dokladu (BSART): Umožňuje filtrovat konkrétní typy objednávek, například standardní objednávku, rámcovou objednávku nebo objednávku na přesun zásob.
- Čtení protokolu změn: Extrakce aktivit, jako jsou 'Purchase Order Approved' nebo 'Purchase Order Changed', vyžaduje čtení tabulek protokolu změn SAP (CDHDR, CDPOS). To může výrazně zatížit zdroje. Optimalizujte logiku ABAP tak, aby vybírala pouze potřebné třídy objektů (EINKBELEG, BANF) a kombinace tabulek a polí.
- Oprávnění: Uživatel nebo technický účet spouštějící report potřebuje rozsáhlá oprávnění ke čtení tabulek z několika modulů SAP, včetně Materials Management (MM), Financial Accounting (FI) a celosystémových tabulek. Patří sem například EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR a CDPOS.
- Spuštění na pozadí: Pokud extrakce zahrnuje data za více než několik měsíců nebo probíhá v systému s vysokým objemem transakcí, spouštějte program vždy na pozadí. Předejdete tak vypršení časového limitu dialogového procesu.
Ukázkový dotaz abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log. Chcete začít?
Tato šablona vám poskytne pevný základ pro práci s process mining. Využijte data ze SAP S/4HANA, odhalte možnosti zefektivnění a začněte zlepšovat proces Purchase to Pay ještě dnes.
Zlepšete objednávky v procesu P2P a zkraťte dobu jejich zpracování
Odstraňte neefektivní postupy a zkraťte dobu zpracování objednávek v procesu P2P o 30 %.
Platební kartu nepotřebujete. Nastavení zabere jen několik minut.