Adatsablon a beszerzéstől a fizetésig tartó folyamathoz, megrendelések
Adatsablon a beszerzéstől a fizetésig tartó folyamathoz, megrendelések
- Javasolt attribútumok
- Követendő fő tevékenységek
- Útmutató az adatok kinyeréséhez SAP ECC-ből
A beszerzéstől a fizetésig tartó folyamat megrendelési attribútumai
| Név | Leírás | ||
|---|---|---|---|
| Esemény időpontja EventTime | A tevékenység pontos dátuma és időpontja. | ||
| Leírás Ez az időbélyeg jelzi, hogy pontosan mikor történt egy esemény, például mikor hagyták jóvá a megrendelést vagy könyvelték az áruátvételt. Segítségével időrendbe állíthatók az eset összes tevékenységei. Az időbélyegek alapvetőek a process mining elemzéseihez. Lehetővé teszik a tevékenységek közötti ciklusidő kiszámítását, a késések feltárását, a folyamat átbocsátóképességének elemzését és a szolgáltatási szintre vonatkozó megállapodások (SLA-k) teljesítésének mérését. Miért fontos? Ez az időbélyeg szükséges az időtartam-alapú mutatók, például a ciklusidők és a szűk keresztmetszetek kiszámításához, valamint az események időrendi sorrendbe állításához. Hol szerezhető be? Különböző SAP-táblák dátum- és időmezőiből származik, például az EKKO-AEDAT (módosítás dátuma), a CDHDR-UDATE/UTIME (változásnapló időbélyege) vagy az EKBE-BUDAT (könyvelési dátum) mezőből. Példák 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Megrendelés PurchaseOrder | A megrendelés (PO) egyedi azonosítója, amely a beszerzési folyamat követésének alapjául szolgál. | ||
| Leírás A megrendelésszám az azonosító, amely összekapcsolja a megrendelés létrehozását, az áruátvételt és a teljesítést rögzítő összes eseményt. Minden egyedi megrendelésszám egy beszerzési folyamat egy példányát jelöli. A process mining során ez az attribútum teszi lehetővé az egyes beszerzések teljes folyamatának rekonstruálását. Segítségével megrendelésenként elemezhetők a ciklusidők, a folyamatváltozatok és a megfelelés. Ez adja a teljes folyamatmodell alapját. Miért fontos? Ez az alapvető azonosító kapcsolja össze az összes kapcsolódó eseményt, így elemezhető minden egyes megrendelés teljes életciklusa. Hol szerezhető be? Tábla: EKKO, mező: EBELN Példák 450001762345000176244500017625 | |||
| Tevékenység Activity | A megrendelés életciklusa során bekövetkezett konkrét üzleti esemény vagy lépés neve. | ||
| Leírás Ez az attribútum a folyamat egyetlen lépését írja le, például a megrendelés létrehozását, jóváhagyását vagy az áruátvétel könyvelését. Ezek a tevékenységek alkotják az egyes megrendelések folyamatát. A tevékenységek sorrendjének, gyakoriságának és időtartamának elemzése a process mining alapja. Segít feltárni a szűk keresztmetszeteket, az újramunkálási köröket és a standard folyamattól való eltéréseket, így célzott fejlesztés és egységesítés válik lehetővé. Miért fontos? A tevékenységek határozzák meg a folyamat lépéseit. Sorrendjük és időzítésük elemzésével feltárható a tényleges folyamat, a szűk keresztmetszetek és az eltérések. Hol szerezhető be? Különböző SAP-táblákból és tranzakciónaplókból származik, például a módosításokat tartalmazó CDHDR/CDPOS, az áruátvételi és számlázási adatokat tartalmazó EKBE, valamint az igényeket tároló EBAN táblából. Az előállításához gyakran egyedi logika vagy adatkinyerő program szükséges. Példák Megrendelés létrehozásaMegrendelés jóváhagyásaÁruátvétel könyvelése | |||
| Anyagcsoport MaterialGroup | Hasonló jellemzőjű anyagok vagy szolgáltatások csoportosítására szolgáló besorolás. | ||
| Leírás Az anyagcsoport, más néven beszerzési kategória, a beszerzett áruk vagy szolgáltatások típusát jelöli. Ilyen kategória például az „IT-eszközök”, az „Irodaszerek” vagy a „Szakmai szolgáltatások”. Ez az attribútum fontos a kiadások és a beszerzési minták elemzéséhez. Segítségével kategóriánként vizsgálható, hogyan zajlik a folyamat, ki hagyja jóvá a beszerzést, és mely szállítók biztosítják az árut vagy szolgáltatást. A megrendelési értékeket elemző dashboard egyik fontos dimenziója. Miért fontos? Lehetővé teszi a folyamat termék- vagy szolgáltatáskategória szerinti bontását, így feltárhatók az eltérő költési típusokhoz kapcsolódó különbségek a működésben, a ciklusidőben és a szállítók körében. Hol szerezhető be? Tábla: EKPO, mező: MATKL Példák 00101IT_HWCONSULT | |||
| Bizonylattípus DocumentType | A különböző megrendeléstípusokat besoroló kód. | ||
| Leírás Az SAP-ban a bizonylattípus beállításai határozzák meg a megrendelés számtartományát, a mezők kiválasztását és a teljes folyamat menetét. Például külön típus vonatkozhat a normál, a szolgáltatási vagy a készletáthelyezési megrendelésekre. Ez az attribútum fontos elemzési szempont, mert a különböző bizonylattípusok gyakran eltérő folyamatot követnek. A bizonylattípus szerinti szűrés pontosabb összehasonlítást tesz lehetővé a ciklusidők és a folyamatok között. Miért fontos? Megkülönbözteti a beszerzési folyamatok típusait, például a normál, a szolgáltatási és a visszáru-folyamatot, amelyek útvonala és elvárt teljesítménye eltérhet. Hol szerezhető be? Tábla: EKKO, mező: BSART Példák NBFOUB | |||
| Felhasználónév UserName | A tevékenységet végrehajtó személy felhasználói azonosítója. | ||
| Leírás Ez az attribútum rögzíti annak a munkatársnak az SAP-felhasználónevét, aki létrehozott, módosított vagy jóváhagyott egy dokumentumot. Automatizált lépéseknél rendszer- vagy kötegelt feldolgozást végző felhasználói azonosító is megjelenhet. A felhasználók szerinti elemzés feltárhatja a képzési igényeket, a kiemelkedő teljesítményt vagy a megfelelési problémákat. Fontos a munkaterhelés eloszlását, a jóváhagyási mátrix betartását, valamint a csapatok és az egyes munkatársak teljesítményét bemutató dashboardokhoz. Miért fontos? Az egyes felhasználói műveleteket konkrét személyekhez rendeli, így elemezhető a teljesítmény, a munkaterhelés és a megfelelési szabályok betartása. Hol szerezhető be? Tábla: EKKO, mező: ERNAM (létrehozta); tábla: CDHDR, mező: USERNAME (módosította). Példák JSMITHMBROWNBATCH_USER | |||
| Megrendelés értéke OrderAmount | A megrendelés egy tételének teljes pénzértéke. | ||
| Leírás Ez az attribútum a megrendelés egy adott tételének teljes értékét mutatja, amely a mennyiség és a nettó egységár szorzata. A teljes megrendelési értékhez össze kell adni a tételek értékét. A megrendelés értéke szerinti elemzés segít azonosítani azokat a nagy értékű tranzakciókat, amelyek szigorúbb ellenőrzést vagy eltérő jóváhagyási útvonalat igényelhetnek. Ez az attribútum szolgál a megrendelési értékeket elemző dashboard alapjául, és segít a folyamatfejlesztési erőforrásokat a pénzügyileg legjelentősebb megrendelésekre összpontosítani. Miért fontos? Számszerűsíti az egyes beszerzések pénzügyi hatását, így az érték alapján előtérbe helyezhetők a nagy összegű megrendelések, és feltárhatók a költségcsökkentési lehetőségek. Hol szerezhető be? Tábla: EKPO, mező: NETWR (nettó megrendelési érték). Példák 1500.00250.7512345.50 | |||
| Szállítóazonosító VendorNumber | A szállító egyedi azonosítója. | ||
| Leírás Ez a kód azonosítja egyértelműen azt a szállítót, akitől az árut vagy szolgáltatást beszerzik. A beszerzési folyamat törzsadatainak fontos eleme. Ez az attribútum szükséges a szállítók szerinti elemzéshez. Segítségével értékelhető a szállítók szállítási teljesítménye, összehasonlíthatók az átfutási idők, és elemezhetők a kiadási minták. A szállítói teljesítményt bemutató dashboard elsődleges dimenziója. Miért fontos? Lehetővé teszi a szállítói teljesítmény elemzését, így azonosíthatók a megbízható szállítók, valamint azok, akik késést vagy minőségi problémát okoznak. Hol szerezhető be? Tábla: EKKO, mező: LIFNR Példák 100345V-20598700112 | |||
| Vállalatkód CompanyCode | A beszerzést kezdeményező jogi személy vagy vállalat azonosítója. | ||
| Leírás Az SAP-ban a vállalatkód egy önálló jogi személyt jelöl. Minden tranzakciót vállalatkód szinten könyvelnek, ezért ez alapvető szervezeti egység. A folyamat vállalatkód szerinti elemzésével összehasonlítható a beszerzés hatékonysága és a szabályok betartása az üzleti egységek vagy országok között. Feltárhatók az egyik szervezetnél bevált gyakorlatok, amelyek máshol is alkalmazhatók, és azonosíthatók azok az egységek, amelyeknek nehézséget okoz a folyamat. Miért fontos? A jogi személyt jelöli, így összehasonlítható a folyamat teljesítménye, és ellenőrizhető a megfelelés a szervezet különböző részein. Hol szerezhető be? Tábla: EKKO, mező: BUKRS Példák 10002100US01 | |||
| Beszerzési igény PurchaseRequisition | A megrendelést megelőző beszerzési igény azonosítója. | ||
| Leírás Ez az attribútum összekapcsolja a megrendelést az alapjául szolgáló beszerzési igénnyel. Nem minden megrendelést előz meg beszerzési igény. Ez a kapcsolat szükséges az igénytől a megrendelésig tartó folyamatot bemutató dashboard és a beszerzési igényből megrendeléssé alakítás arányát mérő KPI elemzéséhez. Segítségével mérhető a folyamat korábbi szakaszának hatékonysága, az első igénytől a hivatalos megrendelés létrehozásáig. Az is feltárható, ha a szabályoktól eltérően, beszerzési igény nélkül hoztak létre megrendelést. Miért fontos? Összekapcsolja a megrendelést az alapjául szolgáló igénnyel, így elemezhető az igényből megrendeléssé alakítás folyamata, és azonosíthatók az előzetes igény nélkül létrehozott megrendelések. Hol szerezhető be? Tábla: EKPO, mező: BANFN Példák 1001589010015891 | |||
| Beszerzési szervezet PurchasingOrganization | Az az árak megtárgyalásáért, valamint az anyagok vagy szolgáltatások beszerzéséért felelős szervezeti egység. | ||
| Leírás Az SAP-ban a beszerzési szervezet felel a beszerzési tevékenységekért. Működhet központilag, az egész vállalat nevében, vagy decentralizáltan, telephelyenként, illetve régiónként. A folyamat teljesítményének beszerzési szervezet szerinti elemzésével azonosíthatók a leghatékonyabb beszerzési csapatok. Összehasonlíthatók a ciklusidők, az újramunkálási arányok és a költségek a különböző szervezeti egységek között, így feltárhatók a bevált gyakorlatok és a támogatást igénylő területek. Miért fontos? Azonosítja a beszerzésért felelős csapatot, így összehasonlítható a teljesítmény és elemezhető a működés a különböző szervezeti egységek között. Hol szerezhető be? Tábla: EKKO, mező: EKORG Példák 1000US01DE01 | |||
| Beszerzőcsoport PurchasingGroup | A beszerzési tevékenységért felelős beszerző vagy beszerzők csoportja. | ||
| Leírás A beszerzőcsoport egy adott beszerzési tevékenységért felelős beszerzőt vagy csapatot jelöl. Ők a szállítók elsődleges kapcsolattartói. Ez az attribútum a beszerzési szervezetnél részletesebb elemzést tesz lehetővé. Segít megérteni a beszerzők közötti munkaterhelés-eloszlást, és feltárni az egyéni teljesítménykülönbségeket. Az eredmények alapján tervezhető az erőforrások elosztása és a képzés. Miért fontos? Részletesen megmutatja, ki felel az egyes beszerzésekért. Így a vevők és a csapatok munkaterhelése és teljesítménye is elemezhető. Hol szerezhető be? Tábla: EKKO, mező: EKGRP Példák 001002N01 | |||
| Elutasítás oka RejectionReason | Az elutasítás okát megadó kód vagy szöveg, amely beszerzési igényre vagy megrendelésre vonatkozik. | ||
| Leírás Ez az attribútum rögzíti a megrendelés jóváhagyási munkafolyamatban történő elutasításakor megadott konkrét indokot. Ez az információ segít feltárni az utómunka és a késedelmek kiváltó okait. Az elutasítási okok elemzésével azonosíthatók a gyakori problémák, például a hibás ár, a költségkeret túllépése vagy a megfelelési követelményeknek nem megfelelő beszállító kiválasztása. Az eredmények alapján kezelhetők a kiváltó okok, javítható a megrendelések első változatának minősége, és egyszerűsíthető a jóváhagyási folyamat. Miért fontos? Közvetlenül megmutatja, miért hiúsulnak meg a jóváhagyások. Így célzott intézkedésekkel csökkenthető az utómunka és rövidíthető a jóváhagyási ciklusidő. Hol szerezhető be? Ezt az információt nehéz lehet megtalálni. Hosszú szöveges mezőkben tárolhatják, vagy egyedi workflow-beállításoktól függhet. Kinyeréséhez gyakran speciális bevezetési ismeretekre van szükség. Példák Hibás árA költségkeret túllépéseDuplikált igény | |||
| Forrásrendszer SourceSystem | Az a rendszer, amelyből az adatokat kinyerték. | ||
| Leírás Ez az attribútum azonosítja az adatok forrását, amely jellemzően egy SAP ECC-rendszer azonosítója, például „ECC_PROD_100”. Több rendszer használatakor segít megkülönböztetni az adatforrásokat. Az adatirányításhoz és az adatok eredetének követéséhez fontos ismerni a forrásrendszert. Ez segít megőrizni az adatok integritását, és feltárni az adatkinyerési vagy adatminőségi problémákat, különösen akkor, ha több ERP-rendszer vagy modul adatait egyesítik. Miért fontos? Azonosítja az adatok forrását, ami fontos az adatirányításhoz, az ellenőrzéshez és a több rendszert érintő elemzések kezeléséhez. Hol szerezhető be? Ez jellemzően egy rögzített érték, amelyet az adatkinyerés során adnak hozzá, hogy jelezze az adatkészlet forrásrendszerét. Példák SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Gyár Plant | Az a fizikai telephely vagy gyár, ahová az árut szállítani kell. | ||
| Leírás A gyár olyan szervezeti egység, amely termelőüzemet, raktárt vagy más átvételi helyet jelöl, ahol árut vagy szolgáltatást vesznek át. A gyár szerinti elemzés feltárja a beszerzési folyamat földrajzi eltéréseit. Megmutathatja például, ha egyes helyszínekre hosszabb a beszállítási idő, vagy ha bizonyos gyárakban lassú az áruátvétel. Ez segít az áruátvétel időzítésének vizsgálatában. Miért fontos? Megadja a szállítás helyét, így elemezhetők a régiók közötti folyamatkülönbségek és a logisztikai teljesítmény. Hol szerezhető be? Tábla: EKPO, mező: WERKS Példák 100011002000 | |||
| Határidőre érkezett a szállítmány IsOnTimeDelivery | Jelzi, hogy az árut a kért szállítási dátumon vagy az előtt vették-e át. | ||
| Leírás Ez a logikai attribútum akkor igaz, ha az „Áruátvétel könyvelve” tevékenység időbélyege a kért szállítási dátummal megegyezik vagy annál korábbi. Egyértelmű, igen vagy nem eredményt ad a megrendelés minden tételére. Ez az attribútum az „Időben könyvelt áruátvételek aránya” KPI alapja. Egyszerűbbé teszi a beszállítói teljesítmény és a belső áruátvétel hatékonyságának elemzését, mivel könnyen összesíthetők és szűrhetők a határidőre, illetve késve érkező szállítmányok. Miért fontos? Egyértelműen jelzi, hogy időben érkezett-e a szállítmány. Közvetlenül támogatja a beszállítói teljesítmény KPI-jait és dashboardjait. Hol szerezhető be? Ez a számított attribútum az áruátvétel könyvelési dátumának (EKBE-BUDAT) és a kért szállítási dátumnak (EKPO-EINDT) az összehasonlításából származik. Példák truefalse | |||
| Jóváhagyás utáni módosítás történt IsPostApprovalChange | Jelzi, hogy a megrendelést az első jóváhagyás után módosították-e. | ||
| Leírás Ez a logikai attribútum akkor igaz, ha ugyanahhoz a megrendeléshez a „Megrendelés módosítva” tevékenység a „Megrendelés jóváhagyva” után következik. Segít elkülöníteni a folyamat késői szakaszában történt, problémás módosításokat. A számított mező közvetlenül támogatja a „Jóváhagyás utáni megrendelés-módosítási arány” KPI-t és a „Megrendelés utómunka és módosítások” dashboardot. Segítségével mérhetővé és láthatóvá válnak azok a zavaró módosítások, amelyek késedelmet okozhatnak, és újabb jóváhagyást tehetnek szükségessé. Ezek a kezdeti specifikáció vagy a hatókör meghatározásának hiányosságaira utalhatnak. Miért fontos? Közvetlenül méri a jóváhagyás utáni utómunkát, amely a folyamat stabilitásának és hatékonyságának fontos KPI-ja. A magas arány a kezdeti igények meghatározásának problémáira utal. Hol szerezhető be? Ez a számított attribútum az eseménynaplóban szereplő tevékenységek sorrendjéből származik. Példák truefalse | |||
| Kért szállítási dátum RequestedDeliveryDate | Az a dátum, amelyre a vállalat az áru vagy szolgáltatás szállítását kérte a szállítótól. | ||
| Leírás Ez a megrendelésben megadott célzott szállítási dátum. Ehhez viszonyítva mérhető a tényleges szállítási teljesítmény. Ez a dátum szükséges a határidőre történő áruátvételek arányát mérő KPI kiszámításához. A tényleges áruátvételi dátum és a kért dátum összehasonlításával számszerűsíthető a szállítók megbízhatósága és a belső áruátvétel hatékonysága. Ez közvetlenül támogatja a szállítói teljesítményt bemutató dashboardot. Miért fontos? Ez a szállítás célzott dátuma, amely szükséges a határidőre történő teljesítést mérő KPI-k kiszámításához és a szállítók megbízhatóságának értékeléséhez. Hol szerezhető be? Tábla: EKPO, mező: EINDT Példák 2023-06-102023-07-222023-08-01 | |||
| Pénznem Currency | A megrendelés összegének pénznemkódja. | ||
| Leírás Ez az attribútum jelzi, milyen pénznemben adták meg a megrendelés értékét, például USD-ben, EUR-ban vagy GBP-ben. Minden pénzösszeg értelmezéséhez szükséges. Nemzetközi szervezeteknél a pénznem ismerete elengedhetetlen a pontos pénzügyi elemzéshez. Lehetővé teszi a megrendelési értékek helyes összesítését és összehasonlítását. Minden pénzügyi KPI-t a pénznem figyelembevételével kell értelmezni. Miért fontos? Megadja a pénzösszegek értelmezéséhez szükséges hátteret, így pontosabb pénzügyi elemzés végezhető, különösen a nemzetközi szervezeteknél. Hol szerezhető be? Tábla: EKKO, mező: WAERS Példák USDEURJPY | |||
| Szállító neve VendorName | A szállító hivatalos neve. | ||
| Leírás A szállító leíró neve, amely a szállítóazonosítónál könnyebben értelmezhető. Általában a szállítói törzsadatokból származik. A szállítóazonosító szolgál az összekapcsolásra és az egyedi azonosításra, a szállító neve pedig a felhasználóknak szóló dashboardokon és jelentésekben fontos. Könnyebben értelmezhetővé teszi az elemzéseket azoknak az üzleti felhasználóknak is, akik nem ismerik a szállítói kódokat. Miért fontos? A szállító könnyen olvasható nevét jeleníti meg, így az üzleti felhasználók könnyebben értelmezhetik a dashboardokat és a jelentéseket. Hol szerezhető be? Tábla: LFA1, mező: NAME1. Ehhez az EKKO-LIFNR és az LFA1-LIFNR mezőt kell összekapcsolni. Példák Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Utolsó adatfrissítés LastDataUpdate | Az időbélyeg azt mutatja, mikor frissítették utoljára az adatokat a forrásrendszerből. | ||
| Leírás Ez az attribútum rögzíti a legutóbbi adatkinyerés vagy frissítés dátumát és időpontját. Megmutatja, mennyire frissek az elemzett adatok. Fontos, hogy ez az információ a dashboardokon is megjelenjen. Így a felhasználók láthatják, hogy az elemzés közel valós idejű adatokon vagy egy korábbi állapotot rögzítő modellpillanatképen alapul-e. Ez segít reális elvárásokat kialakítani, és biztosítja, hogy a döntések ismert korú adatokra épüljenek. Miért fontos? Tájékoztatja a felhasználókat az adatok frissességéről, így láthatják, hogy az elemzés a működés legutóbbi állapotát tükrözi-e. Hol szerezhető be? Ezt az időbélyeget az adatkinyerési vagy ETL-folyamat hozza létre és adja hozzá a futásakor. Példák 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
A beszerzéstől a fizetésig tartó folyamat megrendelési tevékenységei
| Tevékenység | Leírás | ||
|---|---|---|---|
| Áruátvétel könyvelése | Ez az esemény jelzi, hogy a szállítótól fizikailag átvették az árut az adott megrendelés alapján. Az áruátvétel könyvelése kifejezett művelet, például az MIGO tranzakcióval. Ennek hatására anyagbizonylat jön létre, és frissül a készlet. | ||
| Miért fontos? Ez fontos mérföldkő a szállítói teljesítmény követésében, és innen indul a számlaellenőrzés folyamata. Az esemény alapján mérhető a határidőre történő szállítás aránya és az áruátvétel időzítése. Hol szerezhető be? Az esemény anyagbizonylat létrehozásakor rögzül. Időpontja az anyagbizonylat fejlécét tartalmazó MKPF tábla könyvelési dátuma (MKPF-BUDAT) vagy létrehozási dátuma (MKPF-CPUDT). A megrendeléshez az MSEG tételtáblán keresztül kapcsolható. Rögzítés A megrendelésre hivatkozó anyagbizonylatoknál használja az MKPF táblában szereplő könyvelési vagy létrehozási időbélyeget. Eseménytípus explicit | |||
| Beszerzési igény létrehozása | Ez az esemény jelzi az árukra vagy szolgáltatásokra vonatkozó hivatalos igény létrehozását. Akkor rögzül, amikor a felhasználó elment egy új beszerzési igényt, például az ME51N tranzakcióval. Ekkor egyedi rekord jön létre az EBAN táblában. | ||
| Miért fontos? Ez a beszerzési folyamat kiindulópontja. Az esemény és a megrendelés létrehozása közötti idő megmutatja, milyen hatékonyan alakul át a belső igény végrehajtható megrendeléssé. Hol szerezhető be? Az esemény akkor rögzül, amikor új bejegyzés jön létre a beszerzési igények fejlécadatait tároló EBAN táblában. Az esemény időpontját a létrehozás dátuma (EBAN-BADAT) és időpontja adja. Rögzítés Az EBAN táblában a létrehozás dátuma alapján azonosítsa az új bejegyzéseket. Eseménytípus explicit | |||
| Megrendelés elküldése a szállítónak | Ez az esemény jelzi, amikor a jóváhagyott megrendelést hivatalosan továbbítják a szállítónak, például EDI-n, e-mailben vagy nyomtatott formában. Az esemény az üzenetvezérlési táblákban rögzül, amikor a kimenő üzenet feldolgozása sikeres. | ||
| Miért fontos? Ez a fontos mérföldkő indítja el a szállítói átfutási idő mérését. Az esemény és az áruátvétel közötti idő elemzésével értékelhető a szállító teljesítménye és a szállítás pontossága. Hol szerezhető be? Az esemény a NAST üzenetállapot-táblában rögzül. Az időbélyeg a NAST-DATVR és NAST-UHRVR mezőből olvasható ki, ha az adott megrendelés kimenő üzenetének feldolgozási állapota (NAST-VSTAT) „1”, vagyis a feldolgozás sikeres volt. Rögzítés A megrendelés kimenő üzenetéhez használja a NAST táblában szereplő feldolgozási időbélyeget. Eseménytípus explicit | |||
| Megrendelés jóváhagyása | A megrendelés végső jóváhagyását jelzi, amely után a megrendelés elküldhető a szállítónak. Ez a fontos mérföldkő jellemzően abból következtethető ki, hogy a megrendelés jóváhagyási állapota „teljesen jóváhagyott” vagy „jóváhagyott” értékre változik. | ||
| Miért fontos? Ez az esemény szükséges a megrendelés jóváhagyási ciklusidejének KPI-jához, és segít feltárni a jóváhagyási munkafolyamat szűk keresztmetszeteit. A legtöbb további lépés, például a megrendelés szállítónak való elküldése, csak ezután történhet meg. Hol szerezhető be? Az esemény az EKKO megrendelés-fejléc tábla CDHDR/CDPOS változásnaplóinak követésével következtethető ki. Keresse meg, mikor alkalmazták a végső jóváhagyási kódot, vagy mikor állították az általános jóváhagyási állapotot jelző mezőt (EKKO-FRGKE) „jóváhagyott” értékre. Rögzítés Azonosítsa, mikor változik a megrendelés általános jóváhagyási állapota (EKKO-FRGKE) a végleges jóváhagyást jelző értékre. Eseménytípus inferred | |||
| Megrendelés létrehozása | Ez az esemény egy hivatalos megrendelés létrehozását jelzi. A megrendelés a szállítóval kötött, kötelező érvényű megállapodás. Az esemény akkor rögzül, amikor a felhasználó létrehozza és elmenti a megrendelést, például az ME21N tranzakcióval. Ekkor bejegyzések jönnek létre az EKKO és az EKPO táblában. | ||
| Miért fontos? Ez jelöli a megrendelés életciklusának hivatalos kezdetét. Fontos mérföldkő a beszerzési igény és a megrendelés létrehozása közötti idő, valamint a teljes megrendelési ciklusidő méréséhez. Hol szerezhető be? Az esemény időpontja a megrendelések fejlécadatait tartalmazó EKKO tábla létrehozási dátumából (EKKO-AEDAT) olvasható ki, az adott megrendelésszámhoz (EKKO-EBELN) kapcsolva. Rögzítés Minden új megrendelésnél használja az EKKO táblában szereplő létrehozási időbélyeget. Eseménytípus explicit | |||
| Megrendelés teljesítése | Azt jelzi, hogy a megrendelés egy tételét teljes egészében leszállítottnak tekintik. Az esemény jellemzően abból következtethető ki, hogy a megrendelés tételénél automatikusan vagy manuálisan beállítják a „Szállítás befejezve” jelzőt. | ||
| Miért fontos? Ez az esemény a megrendelés teljesítési szakaszának logikai végét jelöli. Szükséges a teljes megrendelési ciklusidő kiszámításához, a létrehozástól a teljesítésig. Hol szerezhető be? Az esemény a CDHDR/CDPOS változásdokumentumokból következtethető ki, amelyek rögzítik, mikor állítják „X” értékre a megrendelés tételénél a „Szállítás befejezve” jelzőt (EKPO-ELIKZ). A teljes megrendelés akkor tekinthető befejezettnek, amikor az utolsó tételt is teljesítettnek jelölik. Rögzítés A változásdokumentumokból azonosítsa azt az időpontot, amikor beállítják az EKPO-ELIKZ jelzőt. Eseménytípus inferred | |||
| Áru visszaküldése | A korábban átvett áru visszaküldését jelzi, gyakran minőségi probléma vagy hibás szállítás miatt. Kifejezett eseményként akkor rögzül, amikor visszáruhoz használt mozgásnemmel anyagbizonylatot könyvelnek. | ||
| Miért fontos? Ez az esemény a szállító minőségével vagy a megrendelés pontosságával kapcsolatos problémákra hívja fel a figyelmet, és az újramunka fontos mutatója. Szükséges az áruátvételi eltérések arányát mérő KPI kiszámításához. Hol szerezhető be? Az esemény az anyagbizonylatokat tartalmazó MKPF/MSEG táblákban rögzül, ha visszáru-mozgásnemet használnak, például a szállítónak történő visszaküldéshez használt „122” értéket. Az időbélyeg a könyvelési dátum (MKPF-BUDAT). Rögzítés Azonosítsa az eredeti megrendelésre hivatkozó, visszáru-mozgásnemmel, például 122-vel rögzített anyagbizonylatokat. Eseménytípus explicit | |||
| Beszerzési igény jóváhagyása | A beszerzési igény hivatalos jóváhagyását jelzi, amely lehetővé teszi, hogy az igényből megrendelés legyen. Az esemény a beszerzési igény adatainak jóváhagyási állapotát jelző mezők változásából következtethető ki, amelyeket az SAP jóváhagyási stratégiája követ. | ||
| Miért fontos? A jóváhagyások követése segít feltárni a megrendelés előtti szakasz szűk keresztmetszeteit, és ellenőrizni, hogy a folyamat megfelel-e a jóváhagyási szabályoknak. Az itt jelentkező késések közvetlenül növelik a teljes beszerzési ciklusidőt. Hol szerezhető be? Az esemény a beszerzési igényeket tartalmazó EBAN tábla változásnaplóiból következtethető ki. Különösen a jóváhagyási állapotot jelző mezők, például az EBAN-FRGZU változását kell figyelni, vagy az EBAN objektum CDHDR/CDPOS változásdokumentumait kell elemezni. Rögzítés Az EBAN jóváhagyási állapotot jelző mezőinek változásdokumentumaiból állapítsa meg a végső jóváhagyás időpontját. Eseménytípus inferred | |||
| Megrendelés elutasítása | Ez az esemény akkor történik, amikor a jóváhagyó elutasítja a megrendelést a jóváhagyási munkafolyamatban. Az esemény a megrendelés jóváhagyási stratégiájának adataiban bekövetkező állapotváltozásból következtethető ki, amely az elutasítást jelzi. | ||
| Miért fontos? Az elutasítások követése segít feltárni a megrendelés adatainak minőségi problémáit, a szabályoktól való eltéréseket és a jóváhagyási mátrix hibáit. Az elutasítás gyakran újramunkát okoz, és növeli a teljes ciklusidőt. Hol szerezhető be? Az esemény a megrendelés jóváhagyási állapotához tartozó CDHDR/CDPOS változásdokumentumokból következtethető ki. Az elutasítást jellemzően egy jóváhagyási kód visszavonása vagy egy külön elutasítási állapot rögzíti. Rögzítés A változásnaplókban keresse a jóváhagyási kód visszavonását vagy az elutasítást jelző állapotváltozást. Eseménytípus inferred | |||
| Megrendelés jóváhagyásának kérése | Azt jelzi, hogy a létrehozott vagy módosított megrendelést a beállított jóváhagyási stratégia szerint jóváhagyásra küldték. Az esemény akkor következtethető ki, amikor aktiválódik a jóváhagyási stratégia, és a megrendelés jóváhagyásra váró állapotba kerül. | ||
| Miért fontos? Ha külön kezeli a megrendelés létrehozását és a jóváhagyási folyamat kezdetét, pontosabban mérheti a jóváhagyási ciklusidő KPI-t. Az is láthatóvá válik, mennyi idő telik el a megrendelés létrehozása és a jóváhagyási munkafolyamat indulása között. Hol szerezhető be? Az esemény az EINKBELEG objektumhoz tartozó megrendelés CDHDR/CDPOS változásdokumentumaiból következtethető ki. Ezek jelzik a jóváhagyási állapot kezdeti beállítását. Az esemény akkor is azonosítható, amikor az általános jóváhagyási állapot (EKKO-FRGKE) először olyan értéket kap, amely aktív jóváhagyási folyamatot jelez. Rögzítés Azonosítsa az első olyan változásdokumentum-bejegyzést, amely elindítja a megrendelés jóváhagyási stratégiáját. Eseménytípus inferred | |||
| Megrendelés módosítása | A megrendelés kezdeti létrehozása utáni bármilyen módosítást jelzi, például a mennyiség, az ár vagy a szállítási dátum változását. Az SAP változásdokumentum-rendszere ezeket a módosításokat rögzíti. | ||
| Miért fontos? A gyakori módosítások, különösen a jóváhagyás után, a folyamat hatékonysági problémáira, a kezdeti tervezés hiányosságaira vagy a követelmények utólagos bővülésére utalhatnak. Ez az esemény szükséges a megrendelések újramunkálását és módosításait bemutató dashboardhoz, valamint a kapcsolódó KPI-khoz. Hol szerezhető be? A megrendeléshez tartozó változásokat az EINKBELEG objektum CDHDR fejléc- és CDPOS tételtáblája rögzíti. Minden módosítás új, időbélyeggel ellátott bejegyzést hoz létre. Rögzítés Nyerje ki a megrendelésszámhoz kapcsolódó CDHDR és CDPOS táblákból a módosítási eseményeket és időbélyegeiket. Eseménytípus explicit | |||
| Megrendelés törlése | A megrendelés egy tételének visszavonását vagy logikai törlését jelzi, amely megakadályozza a további feldolgozást, például az áruátvételt vagy a számlázást. Az esemény abból következtethető ki, hogy a megrendelés tételénél beállítják a törlési jelzőt. | ||
| Miért fontos? Ez a folyamatot lezáró esemény jelzi, hogy a megrendelést törölték. A törlés okának és időpontjának elemzése feltárhatja a kereslettervezés vagy a szállító kiválasztásának problémáit. Hol szerezhető be? Az esemény a CDHDR/CDPOS változásdokumentumokból következtethető ki, amelyek rögzítik, amikor a megrendelés tételénél „L” értékre állítják a törlési jelzőt (EKPO-LOEKZ). Rögzítés A változásdokumentumokból azonosítsa azt az időpontot, amikor beállítják az EKPO-LOEKZ jelzőt. Eseménytípus inferred | |||
| Minőségellenőrzés elvégzése | Azt jelzi, hogy az átvett árut minőségellenőrzésnek vetették alá. Az esemény jellemzően abból következtethető ki, hogy az áruátvételkor létrehozott ellenőrzési tételhez felhasználási döntés születik a minőségirányítási modulban. | ||
| Miért fontos? A minőséget kiemelten kezelő iparágakban ez az esemény segít elemezni az ellenőrzés időtartamát és eredményét. Az itt jelentkező késések szűk keresztmetszetet okozhatnak az áruátvétel és a felhasználhatóság között. Hol szerezhető be? Az esemény a minőségirányítási modul adataiból következtethető ki. Áruátvételkor ellenőrzési tétel jön létre a QALS táblában, az eseményt pedig a felhasználási döntés létrehozása jelzi a QAVE táblában, időbélyeggel együtt. Rögzítés Az anyagbizonylathoz kapcsolódó ellenőrzési tételnél keresse meg a felhasználási döntés időbélyegét a QAVE táblában. Eseménytípus inferred | |||
| Szolgáltatás teljesítésének igazolása | Szolgáltatásalapú megrendeléseknél ez az esemény jelzi a szolgáltatás teljesítésének igazolását. Kifejezett eseményként akkor rögzül, amikor létrejön a szolgáltatási teljesítésigazolás, például az ML81N tranzakcióval. | ||
| Miért fontos? Szolgáltatások esetén ez felel meg az áruátvételnek, és szükséges a szolgáltatási megrendelések teljesítésének követéséhez. Elindítja a szolgáltatás kifizetéséhez szükséges pénzügyi folyamatot. Hol szerezhető be? Az esemény időpontja a szolgáltatási teljesítésigazolások fejlécadatait tartalmazó ESSR tábla létrehozási dátumából (ESSR-ERDAT) olvasható ki. A megrendeléshez az ESLL tábla kapcsolja. Rögzítés A megrendeléshez kapcsolódó szolgáltatási teljesítésigazolásoknál használja az ESSR táblában szereplő létrehozási időbélyeget. Eseménytípus explicit | |||
Útmutatók az adatok kinyeréséhez
Lépések
- ABAP-program létrehozása: Nyissa meg az ABAP-szerkesztőt az SE38 tranzakcióval. Adjon nevet az új programnak, például Z_PM_PO_EXTRACT, majd kattintson a „Létrehozás” gombra. Adjon meg egy címet, például „Process Mining PO-adatok kinyerése”, és állítsa a típust „Executable Program” értékre.
- A kiválasztóképernyő meghatározása: Határozza meg a program kiválasztóképernyőjének paramétereit. Ezekkel a felhasználók szűrhetik a kinyerni kívánt adatokat. A fontos paraméterek közé tartozik a beszerzési rendelés létrehozási dátumának tartománya, a vállalatkód (BUKRS) és a beszerzési bizonylat típusa (BSART).
- Adatszerkezetek meghatározása: Deklaráljon a végleges eseménynapló formátumának megfelelő belső táblaszerkezetet. Tartalmazza az összes szükséges és ajánlott attribútumot: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode és DocumentType.
- Az adatlekérdezési logika megvalósítása: Írja meg a 14 szükséges tevékenység adatainak lekérdezéséhez szükséges ABAP-logikát. Ehhez több SAP-táblát kell lekérdezni, például az EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS és NAST táblákat. A kód áttekinthetősége érdekében minden tevékenységhez használjon külön alprogramot (
PERFORM). - Beszerzési igény adatainak lekérdezése: A „Beszerzési igény létrehozva” eseményekhez kérdezze le az EBAN táblát, és az EKPO táblán keresztül kapcsolja össze őket a beszerzési rendelésekkel. A kiadási állapot mezőinek változásait a módosítási naplótáblákban (CDHDR, CDPOS) követve azonosítsa a „Beszerzési igény jóváhagyva” eseményeket.
- A beszerzési rendelés alapvető eseményeinek lekérdezése: A „Beszerzési rendelés létrehozva” eseményhez kérdezze le az EKKO és az EKPO táblát. Az EINKBELEG objektumhoz tartozó módosítási naplótáblákból (CDHDR, CDPOS) nyerje ki a „Beszerzési rendelés módosítva”, „Beszerzési rendelés jóváhagyva”, „Beszerzési rendelés elutasítva”, „Beszerzési rendelés teljesítve” és „Beszerzési rendelés törölve” eseményeket. Ehhez a kiadási jelzők és a törlési jelzők meghatározott mezőinek változásait használja.
- A beszerzési rendelés kommunikációs eseményeinek lekérdezése: A NAST táblában keresse meg azokat a rekordokat, amelyek a beszerzési rendelés sikeres továbbítását jelzik, és rögzítse a „Beszerzési rendelés elküldve a szállítónak” tevékenységet.
- Az áru- és szolgáltatási események lekérdezése: Az EKBE táblában a mozgástípus-kategória alapján keresse meg az anyagbizonylat-könyveléseket, és azonosítsa az „Áruátvétel könyvelve” és az „Áru visszaküldve” tevékenységeket. A szolgáltatási teljesítésigazolások „Szolgáltatás teljesítése rögzítve” eseményeihez kérdezze le az ESSR és az ESLL táblát.
- A minőségirányítási események lekérdezése: Ha használják a minőségirányítási modult, a QALS és a QAVE táblában keresse meg, mikor született felhasználási döntés a beszerzési rendeléshez kapcsolódó vizsgálati tételről. Ez jelenti a „Minőségellenőrzés elvégezve” tevékenységet.
- Az adatok egyesítése és formázása: Egyesítse az egyes lekérdezések eredményeit egyetlen végleges belső táblában. Gondoskodjon az EventTime mező egységes formátumáról, például YYYY-MM-DDTHH:MI:SS.
- Fájlletöltés megvalósítása: Adjon hozzá funkciót, amellyel a végleges belső tábla fájlba tölthető le. Javasolt formátum a tabulátorral tagolt fájl vagy a CSV, amely a GUI_DOWNLOAD függvénymodullal hozható létre.
- Futtatás és mentés: Futtassa a programot az SE38 vagy az SA38 tranzakcióval. Adja meg a kiválasztási feltételeket, majd indítsa el a jelentést. Amikor a rendszer kéri, mentse a kimeneti fájlt a saját gépére .csv kiterjesztéssel. Ezután feltöltheti.
Konfiguráció
- Dátumtartomány: A kinyeréshez mindenképpen adjon meg egy konkrét dátumtartományt, általában a megrendelés létrehozási dátuma (EKKO-AEDAT) alapján. Kiindulásként gyakran megfelelő a 3–6 hónapos időszak, mert egyensúlyt teremt az adatmennyiség és az elemzés részletessége között.
- Vállalatkód (BUKRS): Egy vagy több vállalatkódra szűrve csak a releváns jogi személyek adatait nyeri ki. Ez a teljesítmény és az elemzés szempontjából is fontos paraméter.
- Beszerzési bizonylat típusa (BSART): Szűrjön a kívánt bizonylattípusokra, például az „NB” normál megrendeléstípusra. Így a szokásos folyamatokra összpontosíthat, és szükség esetén kizárhatja a speciális beszerzési típusokat.
- Adatok részletessége: A kinyerés a megrendeléstételek szintjén történik. Az esetazonosító a megrendelés száma (EBELN). Minden esemény, a tételszintűek, például az áruátvételek is, ehhez a fő esetazonosítóhoz kapcsolódik.
- Teljesítménnyel kapcsolatos szempontok: Nagy adathalmazok esetén ütemezze a programot háttérfeladatként (SM36), hogy elkerülje az időtúllépést. Ellenőrizze, hogy vannak-e adatbázisindexek a WHERE feltételekben használt fontos mezőkön, különösen a CDHDR és CDPOS táblában.
- Előfeltételek: A jelentést futtató felhasználónak hozzáférési jogosultságra van szüksége az ABAP Workbenchhez (SE38), valamint a program fejlesztéséhez és futtatásához. Emellett olvasási hozzáférés kell az összes érintett táblához, köztük az EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR és QM táblákhoz.
Példa-lekérdezés 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. Lépések
- Adatbázis-kapcsolat létrehozása: Kérjen csak olvasási jogosultságú hozzáférési adatokat és kapcsolati információkat (gépnév, port, adatbázisnév) az SAP ECC adatbázishoz. Telepítse a szükséges kliensprogramokat, például a DBeavert, az SQL Developert vagy az SSMS-t.
- Az SAP-séma azonosítása: Csatlakozzon az adatbázishoz, és keresse meg azt az elsődleges SAP-sémát, amelyben a táblák találhatók. Ez gyakran SAPSR3, SAPHANADB vagy más, a rendszerre jellemző név. Ha nem ez a felhasználó alapértelmezett sémája, a lekérdezésben minden táblanév elé írja oda a séma nevét.
- Az SQL-lekérdezés áttekintése: Nyissa meg a megadott SQL-szkriptet a kliensprogramban. A lekérdezés a Beszerzéstől a fizetésig folyamat 14 különböző tevékenységének kinyerésére készült, több SAP-tábla összekapcsolásával.
- A lekérdezési paraméterek testreszabása: Keresse meg a szkript elején a PO_BASE közös táblakifejezést (CTE). Módosítsa a helyőrzőket a kinyerés hatókörének megadásához:
- [START_DATE] és [END_DATE]: Adja meg az elemzés dátumtartományát, például '20230101' és '20230630'. Javasoljuk, hogy az AEDAT (módosítás dátuma) mezőre szűrjön.
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Adja meg a bevonni kívánt SAP-vállalatkódokat.
- [DOC_TYPE_1], [DOC_TYPE_2]: Adja meg a beszerzési rendelés bizonylattípusait.
- [Your SAP Schema]: A szkriptben mindenhol cserélje le ezt a helyőrzőt az SAP-séma tényleges nevére.
- A lekérdezés futtatása: Futtassa a testreszabott SQL-szkriptet az SAP-adatbázison. A futási idő a dátumtartománytól, az adatmennyiségtől és az adatbázis teljesítményétől függ.
- Az eredmények ellenőrzése: A lekérdezés befejezése után gyorsan ellenőrizze a kimenetet. Nézze meg, hogy az adatsorok száma ésszerű-e, és a fontos oszlopok, például a PurchaseOrder, az Activity és az EventTime, a várt módon ki vannak-e töltve.
- Adatok exportálása CSV-fájlba: Exportálja az SQL-kliensből a teljes eredményhalmazt CSV-fájlba. A karakterkódolási problémák elkerülése érdekében UTF-8 kódolást használjon.
- Előkészítés a feltöltésre: Ellenőrizze, hogy a CSV-fájl oszlopfejlécei pontosan megegyeznek-e az elvárt attribútumnevekkel: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentType.
- Feltöltés a process mining eszközbe: Töltse fel a végleges CSV-fájlt a process mining alkalmazásba elemzéshez és vizualizációhoz.
Konfiguráció
- Előfeltételek: Közvetlen, csak olvasási hozzáférés szükséges az SAP ECC adatbázisához. A felhasználóknak megfelelő jogosultsággal kell rendelkezniük az olyan táblák lekérdezéséhez, mint az EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS és NAST.
- Szűrés dátumtartományra: A mennyiség korlátozásához mindenképpen szűrjön dátumtartományra. Gyakori kiindulópont az EKKO.AEDAT (a megrendelés módosításának dátuma) mezőre történő szűrés 3–6 hónapra. A hosszabb időszakok jelentősen megnövelhetik a lekérdezés futási idejét.
- Fontos adatszűrők: Az elemzés célzottabbá tételéhez mindig szűrjön az EKKO.BUKRS (vállalatkód) és az EKKO.BSART (bizonylattípus) mezőre. Így csak a releváns jogi személyek és üzleti folyamatok adatai kerülnek be.
- Teljesítménnyel kapcsolatos szempontok: A lekérdezés több nagy táblát kapcsol össze, köztük a változástörténeti táblákat (CDHDR, CDPOS). Ez jelentős erőforrásokat igényelhet. A rendszer teljesítményének megóvása érdekében a kinyerést lehetőleg csúcsidőn kívül vagy egy replikált, nem éles adatbázison futtassa.
- Változásdokumentumok naplózása: Az olyan tevékenységek pontossága, mint a „Jóváhagyva”, „Elutasítva”, „Teljesítve” és „Módosítva”, attól függ, hogy az SAP naplózza-e az érintett mezők változásait. Az SAP-rendszergazdával ellenőrizze, hogy a naplózás engedélyezve van-e az SCDO tranzakcióban.
Példa-lekérdezés 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 Lépések
- Előfeltételek és kapcsolat: Ellenőrizze, hogy a külső ETL-eszközéhez telepítve van-e és érvényes licenccel rendelkezik-e az SAP Certified Connector. Az ETL-eszköz felügyeleti felületén állítson be új kapcsolatot az SAP ECC-rendszerhez. Szüksége lesz az alkalmazáskiszolgáló gépnevére, a rendszerszámra, a kliensazonosítóra, valamint egy megfelelő RFC- és táblaleolvasási jogosultságokkal rendelkező, erre a célra létrehozott SAP-felhasználóra.
- Forrástáblák azonosítása: Az ETL-feladatban vagy adatfolyamban adja meg adatforrásként a szükséges SAP-táblákat. Az elsődleges táblák: EKKO (beszerzési rendelés fejléce), EKPO (beszerzési rendelés tétele), EBAN (beszerzési igény), CDHDR (módosítási dokumentum fejléce), CDPOS (módosítási dokumentum tétele), MSEG (bizonylatszegmens: anyag), MKPF (anyagbizonylat fejléce), NAST (üzenetállapot), ESSR (szolgáltatási teljesítésigazolás fejléce) és QALS (vizsgálati tétel).
- A „Beszerzési rendelés létrehozva” esemény kinyerése: Hozzon létre adatfolyamot az EKKO táblából. Szűrje a rekordokat a kívánt dátumtartomány és szervezeti kör alapján, például az AEDAT, a vállalatkódhoz használt BUKRS és a bizonylattípushoz használt BSART mezővel. Az EKKO.EBELN értékét rendelje a PurchaseOrder mezőhöz, a „Beszerzési rendelés létrehozva” értéket az Activity mezőhöz, az AEDAT és az ERZET egyesítésével pedig állítsa elő az EventTime értékét. Rendelje hozzá a többi szükséges attribútumot is.
- Az „Áruátvétel könyvelve” esemény kinyerése: Hozzon létre külön adatfolyamot az MSEG táblából, és kapcsolja össze az MKPF táblával az MBLNR és az MJAHR mezők alapján. Szűrjön a releváns mozgástípusokra, például a „101” értékre. Az MSEG.EBELN értékét rendelje a PurchaseOrder mezőhöz, az „Áruátvétel könyvelve” értéket az Activity mezőhöz, az EventTime értékét pedig az MKPF.CPUDT és MKPF.CPUTM mezőből állítsa elő.
- Változásokon alapuló események kinyerése (jóváhagyások, módosítások, törlések): Hozzon létre adatfolyamot a CDHDR és CDPOS táblákból, a CHANGENR mező alapján összekapcsolva őket. Ebből az adatforrásból több tevékenység is előállítható.
- Szűrjön az OBJECTCLAS = 'EINKBELEG' és a TABNAME = 'EKPO' feltételekre.
- A „Beszerzési rendelés jóváhagyva” eseményhez szűrjön a kiadási állapot mezőjének változásaira, például az FNAME = 'FRGZU' értékre, ahol az új érték (VALUE_NEW) a végleges jóváhagyást jelzi.
- A „Beszerzési rendelés törölve” eseményhez szűrjön a törlési jelző változásaira (FNAME = 'LOEKZ'), ahol az új érték 'L'.
- A „Beszerzési rendelés módosítva” eseményhez szűrjön az egyéb releváns mezőváltozásokra, kihagyva a más tevékenységekhez használt állapotmezőket.
- Ezeknél az eseményeknél a CDHDR.UDATE és CDHDR.UTIME mezőből állítsa elő az EventTime értékét.
- A beszerzési igény eseményeinek kinyerése: A „Beszerzési igény létrehozva” eseményhez hozzon létre adatfolyamot az EBAN táblából. A beszerzési rendeléshez kapcsoláshoz a BANFN igényszám és a BNFPO tételszám alapján kapcsolja össze az EBAN és az EKPO táblát. A „Beszerzési igény jóváhagyva” eseményhez használja a CDHDR/CDPOS táblákat az OBJECTCLAS = 'BANF' feltétellel. Gondosan állítsa be a megfeleltetést, hogy az esemény a később létrejövő beszerzési rendeléshez kapcsolódjon.
- A „Beszerzési rendelés elküldve a szállítónak” esemény kinyerése: Hozzon létre adatfolyamot a NAST táblából. Szűrjön az OBJECTKEY mezőre, amely a beszerzési rendelés számát tartalmazza, a megfelelő kimenettípusra (KSCHL), valamint a sikeres feldolgozási állapotra (VSTAT = '1'). Az EventTime értékéhez használja az ERDAT és az UHR mezőt.
- A tevékenység-adatfolyamok egyesítése: Az előző lépésekben létrehozott adatfolyamok kimenetét egyesítse az ETL-eszköz „Union” vagy „Merge” átalakításával. Ellenőrizze, hogy az oszlopnevek és az adattípusok minden adatfolyamban egységesek-e (PurchaseOrder, Activity, EventTime stb.).
- Adattípusok és formátumok átalakítása: Alakítsa át az EventTime oszlopot egységes időbélyeg-formátumra, például YYYY-MM-DD HH:MM:SS formátumra. Az OrderAmount értékét alakítsa szabványos decimális formátumra.
- Célhely beállítása: Állítson be célhelyet vagy „sink”-et az egyesített adatfolyamhoz. Ez általában egyszerű fájl, például CSV- vagy Parquet-fájl. Állítsa be az elválasztót, a szövegminősítőket és a fejléc beállításait.
- Futtatás és ellenőrzés: Futtassa a teljes ETL-feladatot. Ellenőrizze a kimeneti fájlt: mind a 14 tevékenység szerepeljen benne, az adatsorok száma legyen ésszerű, a fontos attribútumok pedig legyenek megfelelően kitöltve.
- Ütemezés és exportálás: Az ellenőrzés után ütemezze rendszeres futtatásra az ETL-feladatot, például minden éjszakára, hogy az adatok naprakészek maradjanak. A létrehozott fájl ezután feltölthető a process mining eszközbe.
Konfiguráció
- Előfeltételek: Kereskedelmi ETL-eszköz (például Informatica PowerCenter, Talend vagy SAP Data Services), valamint az ECC-hez tartozó SAP Certified Connector. A szükséges táblák eléréséhez S_RFC és S_TABU_DIS jogosultsággal rendelkező SAP-párbeszéd- vagy rendszerfelhasználó.
- SAP-kapcsolat: A csatlakozót az SAP alkalmazáskiszolgálójával, rendszerszámával, kliensével, felhasználónevével és jelszavával kell beállítani. Javasoljuk a Secure Network Communications (SNC) használatát.
- Dátumtartomány szűrése: A nagy adatmennyiség korlátozásához feltétlenül állítson be dátumtartomány-szűrőt. Gyakori megoldás az EKKO.AEDAT (megrendelés létrehozásának dátuma) szűrése az elmúlt 3–12 hónapra. A szűrőt a forrásrendszerben alkalmazza, így elkerülhető a szükségesnél több adat kinyerése az SAP-ból.
- Szervezeti hatókör szűrése: Mindig szűrjön az EKKO.BUKRS (vállalatkód) mezőre, és fontolja meg az EKPO.WERKS (gyár) vagy az EKKO.EKORG (beszerzési szervezet) szerinti szűrést is, hogy az elemzés egy adott üzleti egységre korlátozódjon.
- Bizonylattípus szűrése: Az EKKO.BSART mezővel csak a releváns megrendeléstípusokat vegye fel, a készletáthelyezéseket és az egyéb, a szokásos P2P-folyamathoz nem tartozó belső bizonylatokat pedig zárja ki.
- Teljesítményhangolás: A módosítási bizonylatok tábláiból (CDHDR, CDPOS) történő adatkinyerés lassú lehet. Állítson be szűrőt az OBJECTCLAS, OBJECTID és UDATE mezőkre. Az adatátvitel sebességének optimalizálásához módosítsa az SAP-csatlakozó „Packet Size” beállítását. Nagyon nagy rendszereknél először végezzen teljes történeti betöltést, majd ütemezzen delta betöltéseket.
Példa-lekérdezés 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]); Kezdheti?
Ezzel a sablonnal megtervezheti a SAP ECC-ben futó, beszerzéstől a fizetésig tartó megrendelési folyamat fejlesztését. Kezdje el használni az adatait, hogy feltárja a fejlesztési lehetőségeket és hatékonyabbá tegye a működést.
Optimalizálja a P2P megrendelési folyamatot: indítsa el a próbaverziót még ma
Szüntesse meg a szűk keresztmetszeteket, és csökkentse legalább 30%-kal a ciklusidőt.
Nincs szükség bankkártyára, percek alatt elkezdheti