Szablon danych dla procesu Purchase to Pay: zamówienia zakupu
Szablon danych dla procesu Purchase to Pay: zamówienia zakupu
- Zalecane atrybuty do zebrania
- Najważniejsze aktywności do śledzenia
- Wskazówki dotyczące ekstrakcji danych z SAP ECC
Atrybuty procesu Purchase to Pay: zamówienia zakupu
| Nazwa | Opis | ||
|---|---|---|---|
| Czas zdarzenia EventTime | Dokładna data i godzina wystąpienia czynności. | ||
| Opis Ten znacznik czasu wskazuje dokładny moment wystąpienia zdarzenia, na przykład zatwierdzenia zamówienia zakupu lub zaksięgowania przyjęcia towaru. Określa chronologiczną kolejność wszystkich czynności w ramach danego case. Znaczniki czasu są podstawą process mining, ponieważ umożliwiają analizę czasu. Pozwalają obliczać czas cyklu między czynnościami, wykrywać opóźnienia, analizować przepustowość procesu i mierzyć wyniki względem umów o gwarantowanym poziomie usług (SLA). Dlaczego to ważne Ten znacznik czasu jest niezbędny do obliczania miar opartych na czasie, takich jak czas cyklu i wąskie gardła, oraz do chronologicznego porządkowania zdarzeń. Skąd pobrać Dane pochodzą z różnych pól daty i godziny w tabelach SAP, takich jak EKKO-AEDAT (data zmiany), CDHDR-UDATE/UTIME (znacznik czasu dziennika zmian) lub EKBE-BUDAT (data księgowania). Przykłady 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Czynność Activity | Nazwa konkretnego zdarzenia biznesowego lub kroku, który wystąpił w cyklu życia zamówienia zakupu. | ||
| Opis Ten atrybut opisuje pojedynczy krok procesu, na przykład „Utworzenie zamówienia zakupu”, „Zatwierdzenie zamówienia zakupu” lub „Zaksięgowanie przyjęcia towaru”. Sekwencja tych czynności tworzy przepływ procesu dla każdego zamówienia zakupu. Analiza kolejności, częstotliwości i czasu między czynnościami stanowi podstawę process mining. Pomaga wykrywać wąskie gardła, pętle ponownej pracy i odstępstwa od standardowego procesu, co ułatwia wprowadzanie ukierunkowanych usprawnień i standaryzację. Dlaczego to ważne Czynności określają kolejne kroki procesu. Analiza ich kolejności i czasu pozwala poznać rzeczywisty przebieg procesu, wykryć wąskie gardła i odstępstwa. Skąd pobrać Dane pochodzą z różnych tabel SAP i dzienników transakcji, takich jak CDHDR/CDPOS dla zmian, EKBE dla przyjęć towaru i faktur oraz EBAN dla zapotrzebowań. Ich przygotowanie często wymaga niestandardowej logiki lub programu ekstrakcji. Przykłady Utworzenie zamówienia zakupuZatwierdzenie zamówienia zakupuZaksięgowanie przyjęcia towaru | |||
| Zamówienie zakupu PurchaseOrder | Unikalny identyfikator dokumentu zamówienia zakupu (PO), który służy jako główny case do śledzenia procesu zakupowego. | ||
| Opis Numer zamówienia zakupu to główny identyfikator łączący wszystkie działania, od utworzenia zamówienia po przyjęcie towaru i zakończenie realizacji. Każdy unikalny numer PO odpowiada jednej instancji procesu zakupowego. W process mining ten atrybut jest niezbędny do odtworzenia pełnego przebiegu każdego zakupu. Umożliwia szczegółową analizę czasu cyklu, wariantów procesu i zgodności dla poszczególnych zamówień. Stanowi podstawę całego modelu procesu. Dlaczego to ważne To główny identyfikator łączący wszystkie powiązane zdarzenia. Dzięki niemu można analizować pełny cykl życia każdego zamówienia zakupu. Skąd pobrać Tabela: EKKO, pole: EBELN Przykłady 450001762345000176244500017625 | |||
| Grupa materiałowa MaterialGroup | Klasyfikacja służąca do grupowania materiałów lub usług o podobnych cechach. | ||
| Opis Grupa materiałowa, czyli kategoria zakupowa, służy do klasyfikowania kupowanych towarów lub usług. Przykłady to „Sprzęt IT”, „Artykuły biurowe” i „Usługi profesjonalne”. Ten atrybut jest ważny przy analizie wydatków i wzorców zakupowych. Pozwala filtrować proces według kategorii i sprawdzać, jak są one obsługiwane, kto je zatwierdza i którzy dostawcy je realizują. Stanowi ważny wymiar dashboardu „Analiza wartości zamówień zakupu”. Dlaczego to ważne Pozwala analizować proces według kategorii produktów lub usług i porównywać przebieg, czas cyklu oraz dostawców dla różnych rodzajów wydatków. Skąd pobrać Tabela: EKPO, pole: MATKL Przykłady 00101Sprzęt ITUsługi konsultingowe | |||
| Kod spółki CompanyCode | Identyfikator jednostki prawnej lub spółki składającej zamówienie. | ||
| Opis Kod spółki w SAP oznacza niezależną jednostkę prawną. Wszystkie transakcje są księgowane na poziomie kodu spółki, dlatego jest to podstawowa jednostka organizacyjna. Analiza procesu według kodu spółki pozwala porównywać sprawność zakupów i zgodność w różnych jednostkach biznesowych lub krajach. Pomaga wskazać dobre praktyki, które można zastosować w innych jednostkach, oraz te, które mają trudności z realizacją procesu. Dlaczego to ważne Oznacza jednostkę prawną i umożliwia porównywanie wyników procesu oraz kontrolę zgodności w różnych częściach organizacji. Skąd pobrać Tabela: EKKO, pole: BUKRS Przykłady 10002100US01 | |||
| Nazwa użytkownika UserName | Identyfikator użytkownika, który wykonał daną czynność. | ||
| Opis Ten atrybut zawiera nazwę użytkownika SAP pracownika, który utworzył, zmienił lub zatwierdził dokument. W przypadku kroków automatycznych może wskazywać identyfikator użytkownika systemowego lub wsadowego. Analiza według użytkownika pomaga określić potrzeby szkoleniowe, wskazać osoby osiągające dobre wyniki lub wykryć potencjalne problemy ze zgodnością. Jest przydatna przy tworzeniu dashboardów dotyczących podziału obciążenia, zgodności z macierzą zatwierdzeń oraz wyników zespołów i poszczególnych osób. Dlaczego to ważne Przypisuje działania konkretnym osobom, umożliwiając analizę wyników, obciążenia pracą i przestrzegania zasad zgodności. Skąd pobrać Tabela: EKKO, pole: ERNAM (utworzył); tabela: CDHDR, pole: USERNAME (zmienił). Przykłady JSMITHMBROWNBATCH_USER | |||
| Numer dostawcy VendorNumber | Unikalny identyfikator dostawcy. | ||
| Opis To kod jednoznacznie identyfikujący dostawcę, od którego kupowane są towary lub usługi. Jest ważnym elementem danych podstawowych w procesie zakupowym. Ten atrybut jest niezbędny do analiz dotyczących dostawców. Pozwala oceniać terminowość dostaw, porównywać czasy realizacji u różnych dostawców i analizować strukturę wydatków. Stanowi główny wymiar dashboardu „Terminowość dostawców”. Dlaczego to ważne Umożliwia analizę wyników dostawców i pomaga wskazać tych, którzy dostarczają terminowo, oraz tych, którzy powodują opóźnienia lub problemy z jakością. Skąd pobrać Tabela: EKKO, pole: LIFNR Przykłady 100345V-20598700112 | |||
| Typ dokumentu DocumentType | Kod klasyfikujący różne rodzaje zamówień zakupu. | ||
| Opis Typ dokumentu to ustawienie w SAP, które określa zakres numeracji, wybór pól i ogólny przebieg procesu dla zamówienia zakupu. Mogą istnieć osobne typy dla standardowych zamówień, zamówień na usługi lub zamówień przesunięcia zapasów. Ten atrybut jest przydatny w analizie, ponieważ różne typy dokumentów często podlegają odmiennym procesom. Filtrowanie według typu dokumentu pozwala rzetelniej porównywać czasy cyklu i przebieg procesu. Dlaczego to ważne Rozróżnia rodzaje procesów zakupowych, na przykład standardowe, dotyczące usług lub zwrotów, które często mają inne ścieżki i oczekiwane wyniki. Skąd pobrać Tabela: EKKO, pole: BSART Przykłady NBFOUB | |||
| Wartość zamówienia OrderAmount | Łączna wartość pieniężna pozycji zamówienia zakupu. | ||
| Opis Ten atrybut określa łączną wartość konkretnej pozycji zamówienia zakupu, obliczaną jako iloczyn ilości i ceny netto. Aby uzyskać wartość całego zamówienia, należy zsumować wartości pozycji. Analiza procesu według wartości zamówienia pomaga wykrywać transakcje o wysokiej wartości, które mogą wymagać ściślejszej kontroli lub innej ścieżki zatwierdzania. Zasila dashboard „Analiza wartości zamówień zakupu” i pomaga skupić działania usprawniające na zamówieniach o największym znaczeniu finansowym. Dlaczego to ważne Określa wartość finansową każdego zakupu, umożliwiając analizę według wartości, ustalanie priorytetów dla dużych zamówień i wykrywanie możliwości ograniczenia kosztów. Skąd pobrać Tabela: EKPO, pole: NETWR (wartość netto zamówienia). Przykłady 1500.00250.7512345.50 | |||
| Czy dostawa była terminowa IsOnTimeDelivery | Flaga wskazująca, czy towary odebrano w wymaganym terminie lub wcześniej. | ||
| Opis Ten atrybut logiczny ma wartość true, jeśli znacznik czasu aktywności „Zaksięgowano przyjęcie towaru” przypada w wymaganym terminie lub wcześniej. Dla każdej pozycji PO jednoznacznie określa, czy dostawa była terminowa. Atrybut ten stanowi podstawę KPI „Odsetek terminowych przyjęć towarów”. Ułatwia analizę wyników dostawców i efektywności wewnętrznego procesu odbioru, ponieważ pozwala agregować dane i filtrować dostawy terminowe oraz opóźnione. Dlaczego to ważne Jednoznacznie wskazuje, czy dostawa dotarła na czas, i bezpośrednio zasila KPI oraz dashboardy dotyczące wyników dostawców. Skąd pobrać To atrybut obliczany przez porównanie daty księgowania przyjęcia towaru (EKBE-BUDAT) z wymaganą datą dostawy (EKPO-EINDT). Przykłady truefalse | |||
| Czy zmieniono po zatwierdzeniu IsPostApprovalChange | Flaga wskazująca, czy zamówienie zakupu (PO) zmieniono po jego wstępnym zatwierdzeniu. | ||
| Opis Ten atrybut logiczny ma wartość true, jeśli dla tego samego PO po aktywności „Zatwierdzono zamówienie zakupu” wykryto aktywność „Zmieniono zamówienie zakupu”. Pozwala wyodrębnić problematyczne zmiany wprowadzane na późnym etapie procesu. To pole obliczane bezpośrednio zasila KPI „Odsetek zmian PO po zatwierdzeniu” oraz dashboard „Poprawki i zmiany zamówień zakupu”. Pozwala określić skalę zmian zakłócających przebieg procesu, które mogą powodować opóźnienia i wymagać ponownego zatwierdzenia. Wskazuje też na problemy z początkowym określeniem wymagań lub zakresu. Dlaczego to ważne Bezpośrednio mierzy poprawki wprowadzane po zatwierdzeniu. To ważny KPI stabilności i efektywności procesu. Wysoki odsetek wskazuje na problemy z wcześniejszym określeniem wymagań. Skąd pobrać To atrybut obliczany na podstawie kolejności aktywności w dzienniku zdarzeń. Przykłady truefalse | |||
| Grupa zakupowa PurchasingGroup | Kupiec lub grupa kupców odpowiedzialna za daną czynność zakupową. | ||
| Opis Grupa zakupowa oznacza osobę lub zespół kupców odpowiedzialnych za określone zakupy. Jest głównym punktem kontaktu dla dostawców. Ten atrybut pozwala analizować proces dokładniej niż organizacja zakupowa. Pomaga ocenić podział obciążenia między kupców i wykrywać różnice w wynikach poszczególnych osób. Wnioski mogą wspierać planowanie zasobów i szkoleń. Dlaczego to ważne Pozwala sprawdzić, kto odpowiada za zakup, oraz szczegółowo analizować obciążenie pracą i wyniki na poziomie kupującego lub zespołu. Skąd pobrać Tabela: EKKO, pole: EKGRP Przykłady 001002N01 | |||
| Nazwa dostawcy VendorName | Nazwa prawna dostawcy. | ||
| Opis Opisowa nazwa dostawcy, łatwiejsza do odczytania niż jego numer. Zwykle pochodzi z danych podstawowych dostawcy. Numer dostawcy służy do łączenia danych i jednoznacznej identyfikacji. Nazwa dostawcy jest natomiast ważna w dashboardach i raportach dla użytkowników. Ułatwia zrozumienie analiz osobom, które nie znają kodów dostawców. Dlaczego to ważne Podaje czytelną nazwę dostawcy, dzięki czemu dashboardy i raporty są łatwiejsze do zrozumienia dla użytkowników biznesowych. Skąd pobrać Tabela: LFA1, pole: NAME1. Wymaga połączenia EKKO-LIFNR z LFA1-LIFNR. Przykłady Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organizacja zakupowa PurchasingOrganization | Jednostka organizacyjna odpowiedzialna za negocjowanie cen i zakup materiałów lub usług. | ||
| Opis Organizacja zakupowa to ważna jednostka organizacyjna w SAP, odpowiedzialna za działania zakupowe. Może obsługiwać całą firmę centralnie albo działać w podziale na zakłady lub regiony. Analiza wyników procesu według organizacji zakupowej pomaga ustalić, które zespoły zakupowe pracują najsprawniej. Umożliwia porównywanie czasu cyklu, wskaźnika ponownej pracy i kosztów między jednostkami, a także wskazywanie dobrych praktyk i obszarów wymagających wsparcia. Dlaczego to ważne Wskazuje zespół odpowiedzialny za zakupy i umożliwia porównywanie wyników oraz analizę różnych jednostek organizacyjnych. Skąd pobrać Tabela: EKKO, pole: EKORG Przykłady 1000US01DE01 | |||
| Ostatnia aktualizacja danych LastDataUpdate | Znacznik czasu wskazujący, kiedy dane zostały ostatnio odświeżone z systemu źródłowego. | ||
| Opis Ten atrybut zapisuje datę i godzinę ostatniej ekstrakcji lub aktualizacji danych. Informuje, jak aktualne są analizowane dane. Wyświetlanie tej informacji w dashboardach pomaga użytkownikom ocenić, czy wnioski opierają się na danych zbliżonych do bieżących, czy na historycznej migawce. Pozwala ustalić oczekiwania i podejmować decyzje na podstawie danych o znanym wieku. Dlaczego to ważne Informuje użytkowników o aktualności danych, dzięki czemu wiadomo, czy analiza odzwierciedla bieżący stan operacji. Skąd pobrać Ten znacznik czasu jest generowany i dodawany przez proces ekstrakcji danych lub ETL podczas jego wykonywania. Przykłady 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Przyczyna odrzucenia RejectionReason | Kod lub opis wyjaśniający, dlaczego odrzucono zapotrzebowanie lub zamówienie zakupu. | ||
| Opis Ten atrybut zapisuje konkretną przyczynę podaną przy odrzuceniu zamówienia zakupu w workflow zatwierdzania. Informacja ta pomaga ustalić źródła poprawek i opóźnień. Analiza przyczyn odrzucenia pozwala wykryć powtarzające się problemy, takie jak nieprawidłowa cena, przekroczenie budżetu lub wybór dostawcy niezgodny z wymaganiami. Dzięki temu można usunąć źródła problemów, poprawić jakość zamówień tworzonych za pierwszym razem i usprawnić proces zatwierdzania. Dlaczego to ważne Pokazuje, dlaczego zatwierdzenie się nie powiodło, co pozwala ukierunkować działania usprawniające, ograniczyć poprawki i skrócić czas zatwierdzania. Skąd pobrać Znalezienie tej informacji może być trudne. Może być zapisana w polach długiego tekstu albo zależeć od niestandardowej konfiguracji workflow. Jej odczyt często wymaga szczegółowej znajomości wdrożenia. Przykłady Nieprawidłowa cenaPrzekroczony budżetZduplikowane zapotrzebowanie | |||
| System źródłowy SourceSystem | System, z którego pobrano dane. | ||
| Opis Ten atrybut wskazuje źródło danych, którym jest zwykle identyfikator instancji SAP ECC, na przykład „ECC_PROD_100”. W środowiskach z wieloma systemami pozwala rozróżniać źródła danych. Informacja o systemie źródłowym jest ważna dla nadzoru nad danymi i śledzenia ich pochodzenia. Pomaga zachować ich integralność oraz diagnozować problemy z ekstrakcją lub jakością, zwłaszcza gdy dane pochodzą z różnych systemów ERP lub modułów. Dlaczego to ważne Wskazuje pochodzenie danych, co ma znaczenie dla nadzoru nad danymi, ich weryfikacji i prowadzenia analiz obejmujących wiele systemów. Skąd pobrać Zwykle jest to stała wartość dodawana podczas ekstrakcji danych, która oznacza system źródłowy zbioru danych. Przykłady SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Waluta Currency | Kod waluty, w której podano wartość zamówienia zakupu. | ||
| Opis Ten atrybut określa walutę, w której wyrażono wartość zamówienia zakupu, na przykład USD, EUR lub GBP. Jest niezbędnym kontekstem dla każdej wartości pieniężnej. W organizacjach działających na wielu rynkach waluta jest niezbędna do prawidłowej analizy finansowej. Umożliwia poprawne sumowanie i porównywanie wartości zamówień. Każdy pieniężny KPI należy interpretować z uwzględnieniem waluty. Dlaczego to ważne Zapewnia niezbędny kontekst dla wartości pieniężnych i pozwala prawidłowo analizować dane finansowe, zwłaszcza w organizacjach międzynarodowych. Skąd pobrać Tabela: EKKO, pole: WAERS Przykłady USDEURJPY | |||
| Wymagany termin dostawy RequestedDeliveryDate | Data, w której firma oczekuje dostawy towarów lub usług od dostawcy. | ||
| Opis To docelowy termin dostawy wskazany w zamówieniu zakupu. Stanowi punkt odniesienia przy ocenie rzeczywistej terminowości dostaw. Ta data jest niezbędna do obliczenia KPI wskaźnika terminowych przyjęć towaru. Porównanie rzeczywistej daty przyjęcia z wymaganym terminem pozwala mierzyć rzetelność dostawców i sprawność wewnętrznego przyjmowania towarów. Wspiera też dashboard „Terminowość dostawców”. Dlaczego to ważne To docelowy termin dostawy, niezbędny do obliczania KPI terminowości i oceny rzetelności dostawców. Skąd pobrać Tabela: EKPO, pole: EINDT Przykłady 2023-06-102023-07-222023-08-01 | |||
| Zakład Plant | Fizyczna lokalizacja lub zakład, do którego mają zostać dostarczone towary. | ||
| Opis Zakład to jednostka organizacyjna reprezentująca zakład produkcyjny, magazyn lub inną lokalizację, w której odbierane są towary lub usługi. Analiza według zakładu pozwala sprawdzić, jak przebieg procesu zakupowego różni się w zależności od lokalizacji. Może ujawnić różnice w terminach dostaw poszczególnych dostawców lub wskazać zakłady, w których odbiór towarów przebiega nieefektywnie. Ułatwia też ocenę terminowości przyjęć. Dlaczego to ważne Określa miejsce dostawy, co ułatwia analizę różnic regionalnych w przebiegu procesu i efektywności logistyki. Skąd pobrać Tabela: EKPO, pole: WERKS Przykłady 100011002000 | |||
| Zapotrzebowanie zakupowe PurchaseRequisition | Identyfikator zapotrzebowania zakupowego, które poprzedziło zamówienie zakupu. | ||
| Opis Ten atrybut łączy zamówienie zakupu z pierwotnym zapotrzebowaniem. Nie każde zamówienie ma poprzedzające je zapotrzebowanie. To powiązanie jest niezbędne do analizy dashboardu „Od zapotrzebowania do zamówienia” i KPI wskaźnika przekształcenia zapotrzebowań w zamówienia. Pozwala mierzyć sprawność wcześniejszego etapu procesu, od zgłoszenia potrzeby do utworzenia formalnego zamówienia, oraz wykrywać zamówienia utworzone bez zapotrzebowania, niezgodnie z zasadami. Dlaczego to ważne Łączy zamówienie zakupu z pierwotnym zapotrzebowaniem, umożliwiając analizę procesu przekształcania zapotrzebowań w zamówienia i wykrywanie zamówień utworzonych bez wcześniejszego zapotrzebowania. Skąd pobrać Tabela: EKPO, pole: BANFN Przykłady 1001589010015891 | |||
Aktywności w procesie Purchase to Pay: zamówienia zakupu
| Działanie | Opis | ||
|---|---|---|---|
| Utworzenie zamówienia zakupu | To zdarzenie oznacza utworzenie formalnego dokumentu zamówienia zakupu, który stanowi wiążącą umowę z dostawcą. Jest rejestrowane, gdy użytkownik tworzy i zapisuje zamówienie, na przykład w transakcji ME21N. W tabelach EKKO i EKPO pojawiają się wtedy odpowiednie wpisy. | ||
| Dlaczego to ważne To oficjalny początek cyklu życia zamówienia zakupu. Stanowi ważny punkt odniesienia przy pomiarze czasu przekształcenia zapotrzebowania zakupowego w zamówienie oraz czasu realizacji całego zamówienia. Skąd pobrać Dane pochodzą z daty utworzenia (EKKO-AEDAT) w tabeli nagłówków zamówień zakupu (EKKO), dla danego numeru zamówienia (EKKO-EBELN). Rejestrowanie Dla każdego nowego zamówienia zakupu użyj znacznika czasu utworzenia z tabeli EKKO. Typ zdarzenia explicit | |||
| Utworzenie zapotrzebowania zakupowego | To zdarzenie oznacza utworzenie formalnego zapotrzebowania na towary lub usługi. Jest rejestrowane, gdy użytkownik zapisuje nowy dokument zapotrzebowania zakupowego, na przykład w transakcji ME51N. W tabeli EBAN powstaje wtedy unikalny rekord. | ||
| Dlaczego to ważne To główny punkt początkowy procesu zakupowego. Analiza czasu od tego zdarzenia do utworzenia zamówienia zakupu pozwala ocenić, jak sprawnie potrzeby wewnętrzne są przekształcane w konkretne zamówienia. Skąd pobrać Zdarzenie jest rejestrowane po utworzeniu wpisu w tabeli nagłówków zapotrzebowań zakupowych (EBAN). Jego znacznik czasu wyznaczają data utworzenia (EBAN-BADAT) i godzina. Rejestrowanie Wyszukaj nowe wpisy w tabeli EBAN na podstawie daty utworzenia. Typ zdarzenia explicit | |||
| Wysłanie zamówienia zakupu do dostawcy | To zdarzenie oznacza oficjalne przekazanie zatwierdzonego zamówienia zakupu dostawcy, na przykład przez EDI, e-mail lub wydruk. Jest rejestrowane w tabelach sterowania komunikatami, gdy komunikat wyjściowy zostanie pomyślnie przetworzony. | ||
| Dlaczego to ważne To ważny etap, od którego liczy się czas realizacji po stronie dostawcy. Analiza czasu od tego zdarzenia do przyjęcia towaru pomaga ocenić terminowość dostaw i wyniki dostawcy. Skąd pobrać Zdarzenie jest rejestrowane w tabeli statusów komunikatów (NAST). Znacznik czasu można pobrać z pól NAST-DATVR i NAST-UHRVR, gdy status przetwarzania (NAST-VSTAT) dla odpowiedniego typu komunikatu wyjściowego zamówienia ma wartość „1” (przetworzono pomyślnie). Rejestrowanie Użyj znacznika czasu przetworzenia komunikatu wyjściowego zamówienia zakupu z tabeli NAST. Typ zdarzenia explicit | |||
| Zakończenie zamówienia zakupu | Oznacza, że pozycja zamówienia zakupu została w pełni dostarczona. Zdarzenie jest wnioskowane, zwykle na podstawie automatycznego lub ręcznego ustawienia wskaźnika „Dostawa zakończona” w pozycji zamówienia. | ||
| Dlaczego to ważne To logiczny punkt końcowy etapu realizacji zamówienia. Jest niezbędny do obliczenia całkowitego czasu cyklu zamówienia zakupu, od utworzenia do zakończenia. Skąd pobrać Zdarzenie jest wnioskowane na podstawie dokumentów zmian (CDHDR/CDPOS), które rejestrują ustawienie wskaźnika „Dostawa zakończona” (EKPO-ELIKZ) na „X” dla pozycji zamówienia. Oznaczenie ostatniej pozycji jako zakończonej może oznaczać zakończenie całego zamówienia. Rejestrowanie Ustal na podstawie dokumentów zmian znacznik czasu ustawienia flagi EKPO-ELIKZ. Typ zdarzenia inferred | |||
| Zaksięgowanie przyjęcia towaru | To zdarzenie oznacza fizyczne przyjęcie towarów od dostawcy w ramach konkretnego zamówienia zakupu. Zaksięgowanie przyjęcia towaru jest jawną czynnością, na przykład wykonaną w transakcji MIGO, która tworzy dokument materiałowy i aktualizuje zapasy. | ||
| Dlaczego to ważne To ważny etap przy śledzeniu terminowości dostaw i początku weryfikacji faktury. Służy do obliczania wskaźnika dostaw na czas oraz terminowości przyjęcia towaru. Skąd pobrać Zdarzenie jest rejestrowane po utworzeniu dokumentu materiałowego. Jego znacznik czasu to data księgowania (MKPF-BUDAT) lub data utworzenia (MKPF-CPUDT) z tabeli nagłówków dokumentów materiałowych (MKPF). Dokument jest powiązany z zamówieniem zakupu przez tabelę pozycji (MSEG). Rejestrowanie Dla dokumentów materiałowych powiązanych z zamówieniem zakupu użyj daty księgowania lub utworzenia z tabeli MKPF. Typ zdarzenia explicit | |||
| Zatwierdzenie zamówienia zakupu | Oznacza ostateczne zatwierdzenie zamówienia zakupu, które pozwala wysłać je do dostawcy. Ten ważny etap jest zwykle wnioskowany na podstawie zmiany statusu zwolnienia zamówienia na „w pełni zwolnione” lub „zatwierdzone”. | ||
| Dlaczego to ważne To zdarzenie jest niezbędne do obliczenia KPI czasu cyklu zatwierdzania zamówienia zakupu i wykrywania wąskich gardeł w workflow zatwierdzania. Warunkuje większość kolejnych działań, takich jak wysłanie zamówienia do dostawcy. Skąd pobrać Zdarzenie jest wnioskowane przez śledzenie dzienników zmian (CDHDR/CDPOS) tabeli nagłówków zamówień zakupu (EKKO). Pozwala to ustalić, kiedy zastosowano ostatni kod zwolnienia lub kiedy ogólny wskaźnik statusu zwolnienia (EKKO-FRGKE) przyjął wartość „zwolnione”. Rejestrowanie Ustal znacznik czasu zmiany ogólnego statusu zwolnienia zamówienia (EKKO-FRGKE) na stan ostatecznego zatwierdzenia. Typ zdarzenia inferred | |||
| Odrzucenie zamówienia zakupu | To zdarzenie występuje, gdy osoba zatwierdzająca odrzuca zamówienie zakupu w trakcie workflow zatwierdzania. Jest wnioskowane na podstawie zmiany statusu w danych strategii zwolnień zamówienia, która wskazuje na odrzucenie. | ||
| Dlaczego to ważne Śledzenie odrzuceń pomaga wykrywać problemy z jakością danych zamówienia, niezgodność z zasadami lub błędy w macierzy zatwierdzeń. Odrzucenie często prowadzi do ponownej pracy i wydłuża cały cykl. Skąd pobrać Zdarzenie jest wnioskowane na podstawie dokumentów zmian (CDHDR/CDPOS) statusu zwolnienia zamówienia zakupu. Odrzucenie jest zwykle rejestrowane, gdy kod zwolnienia zostaje anulowany lub ustawiony zostaje określony status odrzucenia. Rejestrowanie Monitoruj dzienniki zmian pod kątem anulowania kodu zwolnienia lub zmiany statusu wskazującej na odrzucenie. Typ zdarzenia inferred | |||
| Przeprowadzenie kontroli jakości | Oznacza, że przyjęte towary przeszły kontrolę jakości. Zdarzenie jest zwykle wnioskowane, gdy dla partii kontrolnej utworzonej przy przyjęciu towaru zostaje podjęta decyzja o wykorzystaniu w module zarządzania jakością. | ||
| Dlaczego to ważne W branżach, w których jakość ma duże znaczenie, to zdarzenie pomaga analizować czas trwania i wyniki kontroli. Opóźnienia mogą tworzyć wąskie gardła między przyjęciem towaru a jego udostępnieniem do użycia. Skąd pobrać Zdarzenie jest wnioskowane na podstawie danych z modułu zarządzania jakością. Partia kontrolna powstaje przy przyjęciu towaru (tabela QALS), a wykonanie kontroli oznacza utworzenie decyzji o wykorzystaniu (tabela QAVE), która zawiera znacznik czasu. Rejestrowanie Ustal znacznik czasu decyzji o wykorzystaniu w tabeli QAVE dla partii kontrolnej powiązanej z dokumentem materiałowym. Typ zdarzenia inferred | |||
| Usunięcie zamówienia zakupu | Oznacza anulowanie lub logiczne usunięcie pozycji zamówienia zakupu, które uniemożliwia dalsze przetwarzanie, takie jak przyjęcie towaru lub fakturowanie. Zdarzenie jest wnioskowane po ustawieniu wskaźnika usunięcia w pozycji zamówienia. | ||
| Dlaczego to ważne To zdarzenie końcowe oznacza anulowanie zamówienia. Analiza przyczyn i momentu usunięcia zamówień może ujawnić problemy z planowaniem popytu lub wyborem dostawców. Skąd pobrać Zdarzenie jest wnioskowane na podstawie dokumentów zmian (CDHDR/CDPOS), które wskazują ustawienie wskaźnika usunięcia (EKPO-LOEKZ) na „L” dla pozycji zamówienia zakupu. Rejestrowanie Ustal na podstawie dokumentów zmian znacznik czasu ustawienia flagi EKPO-LOEKZ. Typ zdarzenia inferred | |||
| Wprowadzenie potwierdzenia wykonania usług | W przypadku zamówień zakupu dotyczących usług to zdarzenie oznacza potwierdzenie ich wykonania. Jest rejestrowane przy utworzeniu arkusza wprowadzania usług, na przykład w transakcji ML81N. | ||
| Dlaczego to ważne To odpowiednik przyjęcia towaru w przypadku usług. Zdarzenie jest niezbędne do śledzenia realizacji zamówień na usługi i uruchamia proces rozliczenia płatności za usługę. Skąd pobrać Dane pochodzą z daty utworzenia (ESSR-ERDAT) w tabeli nagłówków arkuszy wprowadzania usług (ESSR). Powiązanie z zamówieniem zakupu znajduje się w tabeli ESLL. Rejestrowanie Dla arkuszy wprowadzania usług powiązanych z zamówieniem zakupu użyj znacznika czasu utworzenia z tabeli ESSR. Typ zdarzenia explicit | |||
| Wysłanie zamówienia zakupu do zatwierdzenia | Oznacza, że utworzone lub zmienione zamówienie zakupu zostało przekazane do zatwierdzenia zgodnie ze skonfigurowaną strategią zwolnień. Zdarzenie jest wnioskowane, gdy uruchamia się strategia zwolnień, a zamówienie oczekuje na zatwierdzenie. | ||
| Dlaczego to ważne Rozróżnienie utworzenia zamówienia zakupu od rozpoczęcia jego zatwierdzania pozwala precyzyjnie mierzyć KPI czasu cyklu zatwierdzania. Ujawnia też opóźnienie między utworzeniem zamówienia a rozpoczęciem workflow zatwierdzania. Skąd pobrać Zdarzenie jest wnioskowane na podstawie dokumentów zmian (CDHDR/CDPOS) dla zamówienia zakupu (obiekt EINKBELEG), które wskazują pierwsze ustawienie statusu zwolnienia, albo na podstawie pierwszego ustawienia ogólnego statusu zwolnienia (EKKO-FRGKE) na wartość oznaczającą aktywny proces zatwierdzania. Rejestrowanie Znajdź pierwszy wpis w dokumentach zmian, który uruchamia strategię zwolnień dla zamówienia zakupu. Typ zdarzenia inferred | |||
| Zatwierdzenie zapotrzebowania zakupowego | Oznacza formalne zatwierdzenie zapotrzebowania zakupowego, które pozwala przekształcić je w zamówienie zakupu. Zdarzenie jest wnioskowane na podstawie zmian pól statusu zwolnienia w danych zapotrzebowania, rejestrowanych przez workflow strategii zwolnień SAP. | ||
| Dlaczego to ważne Śledzenie zatwierdzeń pomaga wykrywać wąskie gardła na etapie poprzedzającym złożenie zamówienia oraz sprawdzać zgodność z zasadami zatwierdzania. Opóźnienia na tym etapie bezpośrednio wydłużają cały cykl zakupowy. Skąd pobrać Zdarzenie jest wnioskowane na podstawie dzienników zmian tabeli zapotrzebowań zakupowych (EBAN), w szczególności zmian pól statusu zwolnienia, takich jak EBAN-FRGZU, lub dokumentów zmian w CDHDR/CDPOS dla obiektu EBAN. Rejestrowanie Monitoruj dokumenty zmian pól statusu zwolnienia w EBAN, aby ustalić znacznik czasu ostatecznego zatwierdzenia. Typ zdarzenia inferred | |||
| Zmiana zamówienia zakupu | Oznacza każdą zmianę zamówienia zakupu po jego utworzeniu, na przykład zmianę ilości, ceny lub terminów dostawy. Zmiany te są jawnie rejestrowane w systemie dokumentów zmian SAP. | ||
| Dlaczego to ważne Częste zmiany, zwłaszcza po zatwierdzeniu, wskazują na nieefektywność procesu, niedostateczne planowanie początkowe lub rozszerzanie zakresu. To zdarzenie jest niezbędne w dashboardzie „Poprawki i zmiany zamówień zakupu” oraz powiązanych KPI. Skąd pobrać Zmiany są jawnie rejestrowane w tabelach nagłówków (CDHDR) i pozycji (CDPOS) dokumentów zmian dla obiektu zamówienia zakupu (EINKBELEG). Każda zmiana tworzy nowy wpis ze znacznikiem czasu. Rejestrowanie Pobierz zdarzenia zmian i ich znaczniki czasu z tabel CDHDR i CDPOS powiązanych z numerem zamówienia zakupu. Typ zdarzenia explicit | |||
| Zwrot towaru | Oznacza zwrot wcześniej przyjętych towarów do dostawcy, często z powodu problemów z jakością lub nieprawidłowej dostawy. Zdarzenie jest rejestrowane przy zaksięgowaniu dokumentu materiałowego z typem ruchu właściwym dla zwrotu. | ||
| Dlaczego to ważne To zdarzenie wskazuje na problemy z jakością dostawcy lub zgodnością dostawy z zamówieniem i jest ważnym wskaźnikiem ponownej pracy. Jest niezbędne do obliczenia KPI wskaźnika rozbieżności przyjęć towaru. Skąd pobrać Zdarzenie jest rejestrowane w tabelach dokumentów materiałowych (MKPF/MSEG), gdy używany jest typ ruchu zwrotnego, na przykład „122” (zwrot dostawy do dostawcy). Znacznikiem czasu jest data księgowania (MKPF-BUDAT). Rejestrowanie Znajdź dokumenty materiałowe z typem ruchu zwrotnego, na przykład 122, powiązane z pierwotnym zamówieniem zakupu. Typ zdarzenia explicit | |||
Instrukcje ekstrakcji danych
Kroki
- Utwórz program ABAP: Otwórz edytor ABAP za pomocą kodu transakcji SE38. Wpisz nazwę nowego programu, na przykład Z_PM_PO_EXTRACT, i kliknij „Utwórz”. Podaj tytuł, na przykład „Ekstrakcja danych PO na potrzeby process mining”, i ustaw typ „Program wykonywalny”.
- Zdefiniuj ekran wyboru: Określ parametry ekranu wyboru w programie. Umożliwią one filtrowanie pobieranych danych. Najważniejsze parametry to zakres dat utworzenia zamówienia zakupu, kod spółki (BUKRS) i typ dokumentu zakupowego (BSART).
- Zdefiniuj struktury danych: Zadeklaruj tabelę wewnętrzną zgodną z docelowym formatem dziennika zdarzeń. Powinna zawierać wszystkie wymagane i zalecane atrybuty: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode i DocumentType.
- Zaimplementuj logikę wyboru danych: Napisz główną logikę ABAP, która pobierze dane dla każdej z 14 wymaganych aktywności. Wymaga to odpytywania wielu tabel SAP, takich jak EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS i NAST. Dla każdej aktywności użyj osobnej podprogramowej procedury (PERFORM), aby zachować czytelność kodu.
- Pobierz dane zapotrzebowań: Odpytaj tabelę EBAN w poszukiwaniu zdarzeń „Utworzono zapotrzebowanie zakupu” i powiąż je z zamówieniami zakupu za pośrednictwem tabeli EKPO. Użyj tabel dziennika zmian (CDHDR, CDPOS), aby wykryć zdarzenia „Zatwierdzono zapotrzebowanie zakupu”, śledząc zmiany pól statusu zwolnienia.
- Pobierz podstawowe zdarzenia zamówień zakupu: Odpytaj tabele EKKO i EKPO w poszukiwaniu zdarzenia „Utworzono zamówienie zakupu”. Użyj tabel dziennika zmian (CDHDR, CDPOS) dla obiektu EINKBELEG, aby pobrać zdarzenia „Zmieniono zamówienie zakupu”, „Zatwierdzono zamówienie zakupu”, „Odrzucono zamówienie zakupu”, „Zakończono zamówienie zakupu” i „Usunięto zamówienie zakupu”. Wykrywaj je na podstawie zmian określonych pól, takich jak wskaźniki zwolnienia i flagi usunięcia.
- Pobierz zdarzenia komunikacji dotyczącej PO: Odpytaj tabelę NAST, aby znaleźć rekordy potwierdzające pomyślne wysłanie PO. Zapisz aktywność „Wysłano zamówienie zakupu do dostawcy”.
- Pobierz zdarzenia dotyczące towarów i usług: Odpytaj tabelę EKBE w poszukiwaniu księgowań dokumentów materiałowych, aby wykryć aktywności „Zaksięgowano przyjęcie towaru” i „Zwrócono towary” na podstawie kategorii rodzaju ruchu. Odpytaj tabele ESSR i ESLL w poszukiwaniu arkuszy wprowadzania usług, aby zarejestrować aktywność „Wprowadzono potwierdzenie wykonania usług”.
- Pobierz zdarzenia zarządzania jakością: Jeśli używany jest moduł zarządzania jakością, odpytaj tabele QALS i QAVE, aby ustalić, kiedy podjęto decyzję o wykorzystaniu partii kontrolnej. Zapisz to jako aktywność „Przeprowadzono kontrolę jakości”.
- Połącz i sformatuj dane: Połącz dane ze wszystkich zapytań w jednej docelowej tabeli wewnętrznej. Zadbaj o spójny format pola EventTime, na przykład YYYY-MM-DDTHH:MI:SS.
- Dodaj pobieranie pliku: Dodaj możliwość pobrania końcowej tabeli wewnętrznej do pliku. Zalecany format to plik rozdzielany tabulatorami lub CSV. Można go wygenerować za pomocą modułu funkcji GUI_DOWNLOAD.
- Uruchom i zapisz: Uruchom program za pomocą transakcji SE38 lub SA38. Wprowadź kryteria wyboru i wykonaj raport. Po wyświetleniu monitu zapisz plik wynikowy na komputerze lokalnym z rozszerzeniem .csv. Będzie gotowy do przesłania.
Konfiguracja
- Zakres dat: Należy określić konkretny zakres dat ekstrakcji, zwykle na podstawie daty utworzenia zamówienia zakupu (EKKO-AEDAT). Dobrym punktem wyjścia jest zakres 3–6 miesięcy, który pozwala zachować równowagę między ilością danych a zakresem informacji o procesie.
- Kod spółki (BUKRS): Wybierz jeden lub więcej kodów spółek, aby ograniczyć ekstrakcję do odpowiednich podmiotów prawnych. To ważny parametr wpływający na wydajność i przydatność wyników.
- Typ dokumentu zakupowego (BSART): Wybierz określone typy dokumentów, na przykład „NB” dla standardowego PO, aby skupić analizę na typowych procesach i w razie potrzeby wykluczyć zakupy specjalne.
- Szczegółowość danych: Ekstrakcja obejmuje pozycje zamówień zakupu. Identyfikatorem case jest numer zamówienia zakupu (EBELN). Wszystkie zdarzenia, w tym zdarzenia na poziomie pozycji, takie jak przyjęcia towarów, są powiązane z tym głównym identyfikatorem case.
- Wydajność: W przypadku dużych zbiorów danych zaplanuj uruchomienie programu w tle jako zadania (SM36), aby uniknąć przekroczenia limitu czasu. Upewnij się, że dla pól używanych w klauzulach WHERE istnieją indeksy bazy danych, zwłaszcza w tabelach CDHDR i CDPOS.
- Wymagania wstępne: Osoba uruchamiająca raport musi mieć uprawnienia do korzystania ze środowiska ABAP Workbench (SE38) oraz do tworzenia i wykonywania programu. Potrzebny jest również dostęp do odczytu wszystkich używanych tabel, w tym EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR i tabel QM.
Przykładowe zapytanie 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. Kroki
- Nawiąż połączenie z bazą danych: Uzyskaj dane logowania tylko do odczytu oraz informacje o połączeniu z bazową bazą danych SAP ECC: nazwę hosta, port i nazwę bazy. Zainstaluj potrzebne narzędzia klienckie, takie jak DBeaver, SQL Developer lub SSMS.
- Ustal schemat SAP: Połącz się z bazą danych i ustal główny schemat SAP, w którym znajdują się tabele. Często jest to SAPSR3, SAPHANADB lub inna nazwa właściwa dla danego systemu. Jeśli nie jest to domyślny schemat użytkownika, przed nazwami tabel w zapytaniu trzeba podać jego nazwę.
- Sprawdź zapytanie SQL: Otwórz dostarczony skrypt SQL w narzędziu klienckim. To rozbudowane zapytanie pobiera 14 różnych aktywności z procesu Purchase to Pay, łącząc dane z wielu tabel SAP.
- Dostosuj parametry zapytania: Znajdź na początku skryptu wyrażenie tabelaryczne PO_BASE (CTE). Zmień wartości zastępcze, aby określić zakres ekstrakcji:
- [START_DATE] i [END_DATE]: Ustaw zakres dat analizy, na przykład „20230101” i „20230630”. Zalecane jest filtrowanie według pola AEDAT (data zmiany).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Podaj kody spółek SAP, które mają zostać uwzględnione.
- [DOC_TYPE_1], [DOC_TYPE_2]: Podaj typy dokumentów PO, które mają zostać uwzględnione.
- [Your SAP Schema]: Zastąp ten tekst nazwą właściwego schematu SAP w całym skrypcie.
- Wykonaj zapytanie: Uruchom dostosowany skrypt SQL na bazie SAP. Czas wykonania zależy od zakresu dat, ilości danych i wydajności bazy.
- Sprawdź wyniki: Po zakończeniu zapytania szybko sprawdź dane wyjściowe. Upewnij się, że liczba wierszy jest rozsądna, a kluczowe kolumny, takie jak PurchaseOrder, Activity i EventTime, zawierają oczekiwane wartości.
- Wyeksportuj dane do CSV: Wyeksportuj cały zestaw wyników z klienta SQL do pliku CSV. Użyj kodowania UTF-8, aby uniknąć problemów z wyświetlaniem znaków.
- Przygotuj plik do przesłania: Sprawdź, czy nagłówki kolumn w pliku CSV dokładnie odpowiadają wymaganym nazwom atrybutów: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentType.
- Prześlij dane do narzędzia process mining: Prześlij gotowy plik CSV do aplikacji process mining, aby przeprowadzić analizę i wizualizację.
Konfiguracja
- Wymagania wstępne: Wymagany jest bezpośredni dostęp tylko do odczytu do bazowej bazy danych SAP ECC. Użytkownicy muszą mieć odpowiednie uprawnienia do odpytywania tabel takich jak EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS i NAST.
- Filtrowanie według zakresu dat: Należy zastosować filtr zakresu dat, aby ograniczyć ilość danych. Dobrym punktem wyjścia jest filtrowanie według EKKO.AEDAT (data zmiany PO) za okres 3–6 miesięcy. Szerszy zakres może znacznie wydłużyć wykonywanie zapytania.
- Najważniejsze filtry danych: Aby zawęzić analizę do właściwego zakresu, zawsze filtruj według EKKO.BUKRS (kod spółki) i EKKO.BSART (typ dokumentu). Pozwala to ograniczyć dane do odpowiednich podmiotów prawnych i procesów biznesowych.
- Wydajność: Zapytanie łączy kilka dużych tabel, w tym tabele historii zmian (CDHDR, CDPOS), co może mocno obciążać zasoby. Zaleca się uruchamianie ekstrakcji poza godzinami szczytu lub na replikowanej bazie nieprodukcyjnej, aby nie wpływać na wydajność systemu.
- Rejestrowanie zmian w dokumentach: Dokładność aktywności takich jak „Zatwierdzono”, „Odrzucono”, „Zakończono” i „Zmieniono” zależy od tego, czy w SAP jest włączone rejestrowanie zmian odpowiednich pól. Należy potwierdzić z administratorem SAP, że rejestrowanie jest aktywne (za pomocą transakcji SCDO).
Przykładowe zapytanie 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 Kroki
- Wymagania wstępne i połączenie: Upewnij się, że zewnętrzne narzędzie ETL ma zainstalowane i licencjonowane złącze certyfikowane przez SAP. W konsoli administracyjnej narzędzia skonfiguruj nowe połączenie z systemem SAP ECC. Potrzebne będą: host serwera aplikacji, numer systemu, identyfikator klienta oraz dedykowany użytkownik SAP z odpowiednimi uprawnieniami RFC i do odczytu tabel.
- Wskaż tabele źródłowe: W zadaniu ETL lub przepływie danych określ wymagane tabele SAP jako źródła danych. Główne tabele to EKKO (nagłówek PO), EKPO (pozycja PO), EBAN (zapotrzebowanie zakupu), CDHDR (nagłówek dokumentu zmiany), CDPOS (pozycja dokumentu zmiany), MSEG (segment dokumentu materiałowego), MKPF (nagłówek dokumentu materiałowego), NAST (status komunikatu), ESSR (nagłówek arkusza wprowadzania usług) i QALS (partia kontrolna).
- Pobierz zdarzenie „Utworzono zamówienie zakupu”: Utwórz przepływ danych pobierający dane z tabeli EKKO. Odfiltruj rekordy według wybranego zakresu dat, na przykład pola AEDAT, oraz zakresu organizacyjnego, na przykład BUKRS dla kodu spółki i BSART dla typu dokumentu. Przypisz EKKO.EBELN do PurchaseOrder, „Utworzono zamówienie zakupu” do Activity, a połączone wartości AEDAT i ERZET do EventTime. Przypisz również pozostałe wymagane atrybuty.
- Pobierz zdarzenie „Zaksięgowano przyjęcie towaru”: Utwórz osobny przepływ danych pobierający dane z MSEG i łączący je z MKPF według MBLNR i MJAHR. Odfiltruj odpowiednie rodzaje ruchu, na przykład „101”. Przypisz MSEG.EBELN do PurchaseOrder, „Zaksięgowano przyjęcie towaru” do Activity, a MKPF.CPUDT i MKPF.CPUTM do EventTime.
- Pobierz zdarzenia oparte na zmianach: zatwierdzenia, zmiany i usunięcia: Utwórz przepływ danych pobierający dane z CDHDR i CDPOS, połączonych według CHANGENR. Z tego źródła można wyprowadzić kilka aktywności.
- Odfiltruj OBJECTCLAS = 'EINKBELEG' i TABNAME = 'EKPO'.
- W przypadku „Zatwierdzono zamówienie zakupu” odfiltruj zmiany pola statusu zwolnienia, na przykład FNAME = 'FRGZU', w których nowa wartość (VALUE_NEW) oznacza ostateczne zatwierdzenie.
- W przypadku „Usunięto zamówienie zakupu” odfiltruj zmiany wskaźnika usunięcia (FNAME = 'LOEKZ'), dla których nowa wartość to 'L'.
- W przypadku „Zmieniono zamówienie zakupu” odfiltruj zmiany innych odpowiednich pól, z pominięciem pól statusu używanych do wykrywania pozostałych aktywności.
- Dla wszystkich tych zdarzeń użyj CDHDR.UDATE i CDHDR.UTIME jako EventTime.
- Pobierz zdarzenia dotyczące zapotrzebowań: Utwórz przepływ danych z tabeli EBAN dla zdarzenia „Utworzono zapotrzebowanie zakupu”. Aby powiązać je z case zamówienia zakupu, połącz EBAN z EKPO według numeru zapotrzebowania (BANFN) i pozycji (BNFPO). W przypadku zdarzenia „Zatwierdzono zapotrzebowanie zakupu” użyj CDHDR/CDPOS z OBJECTCLAS = 'BANF'. Należy starannie skonfigurować mapowanie, aby powiązać zdarzenie z docelowym PO.
- Pobierz zdarzenie „Wysłano PO do dostawcy”: Utwórz przepływ danych pobierający dane z tabeli NAST. Zastosuj filtry dla OBJECTKEY, który zawiera numer PO, odpowiedniego typu komunikatu (KSCHL) i pomyślnego statusu przetwarzania (VSTAT = '1'). Użyj ERDAT i UHR jako EventTime.
- Połącz strumienie aktywności: Użyj transformacji „Union” lub „Merge” w narzędziu ETL, aby połączyć wyniki wszystkich przepływów danych utworzonych w poprzednich krokach. Upewnij się, że nazwy kolumn i typy danych są spójne we wszystkich strumieniach (PurchaseOrder, Activity, EventTime itd.).
- Konwersja typów i formatów danych: Ustaw spójny format znacznika czasu w kolumnie EventTime, na przykład YYYY-MM-DD HH:MM:SS. Przekonwertuj OrderAmount na standardowy format dziesiętny.
- Skonfiguruj miejsce docelowe: Wybierz miejsce docelowe, czyli „ujście” połączonego strumienia danych. Zwykle jest to plik płaski, na przykład CSV lub Parquet. Skonfiguruj separator, kwalifikatory tekstu i nagłówki.
- Uruchom i sprawdź: Uruchom całe zadanie ETL. Sprawdź plik wynikowy, aby upewnić się, że zawiera wszystkie 14 aktywności, liczba wierszy jest rozsądna, a najważniejsze atrybuty są prawidłowo wypełnione.
- Zaplanuj i wyeksportuj: Po sprawdzeniu zaplanuj cykliczne uruchamianie zadania ETL, na przykład co noc, aby dane były aktualne. Wygenerowany plik jest gotowy do przesłania do narzędzia process mining.
Konfiguracja
- Wymagania wstępne: Komercyjne narzędzie ETL (np. Informatica PowerCenter, Talend, SAP Data Services) z odpowiednim certyfikowanym przez SAP konektorem do ECC. Użytkownik dialogowy lub systemowy SAP z uprawnieniami S_RFC i S_TABU_DIS do wymaganych tabel.
- Połączenie z SAP: Konektor należy skonfigurować, podając serwer aplikacji SAP, numer systemu, klienta, użytkownika i hasło. Zalecane jest użycie Secure Network Communications (SNC).
- Filtr zakresu dat: Należy zastosować filtr zakresu dat, aby ograniczyć ilość danych. Często filtruje się pole EKKO.AEDAT (data utworzenia zamówienia zakupu) do ostatnich 3–12 miesięcy. Filtr warto zastosować już po stronie źródła, aby uniknąć pobierania nadmiernej ilości danych z SAP.
- Filtry zakresu organizacyjnego: Zawsze należy filtrować według EKKO.BUKRS (kod spółki). Warto też uwzględnić EKPO.WERKS (zakład) lub EKKO.EKORG (organizacja zakupowa), aby ograniczyć analizę do wybranej jednostki biznesowej.
- Filtr rodzaju dokumentu: Za pomocą EKKO.BSART należy uwzględnić tylko odpowiednie rodzaje zamówień zakupu i wykluczyć przesunięcia zapasów oraz inne dokumenty wewnętrzne, które nie należą do standardowego procesu P2P.
- Optymalizacja wydajności: Pobieranie danych z tabel dokumentów zmian (CDHDR, CDPOS) może trwać długo. Należy zastosować filtry dla OBJECTCLAS, OBJECTID i UDATE. Ustawienie „Packet Size” w konektorze SAP można dostosować, aby zoptymalizować szybkość transferu danych. W przypadku bardzo dużych systemów warto rozważyć początkowe załadowanie danych historycznych, a następnie zaplanowane ładowanie przyrostowe.
Przykładowe zapytanie 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]); Gotowi do rozpoczęcia?
Ten szablon zawiera wskazówki, które pomogą usprawnić proces Purchase to Pay: zamówienia zakupu w SAP ECC. Już dziś można wykorzystać dane, aby odkryć zależności i poprawić efektywność.
Usprawnij zamówienia zakupu w P2P: rozpocznij okres próbny
Usuń wąskie gardła i skróć czas realizacji o 30% lub więcej.
Karta kredytowa nie jest potrzebna. Rozpoczęcie zajmuje kilka minut.