Szablon danych do zarządzania łańcuchem dostaw
Szablon danych do zarządzania łańcuchem dostaw
- Zalecane atrybuty do zebrania
- Najważniejsze działania do śledzenia
- Wskazówki dotyczące ekstrakcji
Atrybuty zarządzania łańcuchem dostaw
| Nazwa | Opis | ||
|---|---|---|---|
| Czas zdarzenia EventTime | Znacznik czasu wskazujący datę i godzinę wykonania czynności. | ||
| Opis Ten atrybut określa dokładną datę i godzinę każdej czynności w procesie. Stanowi chronologiczną podstawę dziennika zdarzeń i porządkuje kroki procesu zgodnie z rzeczywistą kolejnością. Czas zdarzenia jest niezbędny do analiz opartych na czasie. Służy do obliczania czasu cyklu między czynnościami, mierzenia całkowitego czasu realizacji procesu, śledzenia zmian wyników w czasie i ustalania, kiedy najczęściej pojawiają się wąskie gardła. Dlaczego to ważne Ten znacznik czasu jest niezbędny do obliczania czasów trwania i wskaźników efektywności. Umożliwia analizę wąskich gardeł i czasu realizacji procesu. Skąd pobrać Dane pochodzą z pól znaczników czasu powiązanych z utworzeniem dokumentu lub zmianą statusu w podstawowych tabelach SAP, takich jak CDHDR/CDPOS dla dokumentów zmian, albo z konkretnych pól daty i godziny, np. ERDAT/ERZET w tabelach nagłówkowych. Przykłady 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Nazwa czynności ActivityName | Nazwa czynności biznesowej lub zdarzenia, które miało miejsce na danym etapie procesu w łańcuchu dostaw. | ||
| Opis Ten atrybut opisuje konkretny krok lub etap cyklu życia zlecenia logistycznego, na przykład „Wystawiono zamówienie zakupu” lub „Zaksięgowano wydanie towaru”. Czynności te tworzą sekwencję zdarzeń składających się na proces. Analiza sekwencji czynności stanowi podstawę process mining. Umożliwia odkrycie rzeczywistego przebiegu procesu, porównanie go ze standardowymi procedurami operacyjnymi oraz wskazanie kroków powodujących opóźnienia lub wymagających ponownej pracy. Dlaczego to ważne Określa kroki procesu. To podstawa odkrywania map procesów, analizy wariantów i pomiaru czasu cyklu między czynnościami. Skąd pobrać Wartość powstaje podczas transformacji danych przez przypisanie kodów transakcji lub zmian statusu z różnych tabel SAP (np. EKKO, LIKP, VBUK) do czytelnych nazw czynności. Przykłady Wystawiono zamówienie zakupuZaksięgowano przyjęcie towarów do zamówienia zakupuUtworzono dostawę wychodzącąPotwierdzono dostawę | |||
| Zlecenie logistyczne LogisticsOrder | Unikalny identyfikator pojedynczego procesu łańcucha dostaw, od początkowego zapotrzebowania do końcowego potwierdzenia dostawy. | ||
| Opis Zlecenie logistyczne jest głównym identyfikatorem sprawy. Łączy wszystkie czynności związane z konkretnym zapotrzebowaniem lub zleceniem realizacji w łańcuchu dostaw. Dzięki temu można śledzić cały cykl życia produktu, od planowania i zakupów po produkcję i dystrybucję, oraz uzyskać pełny obraz procesu. W process mining analiza według zlecenia logistycznego pokazuje całą ścieżkę realizacji zapotrzebowania. Ułatwia identyfikację typowych wariantów, wąskich gardeł i odchyleń w całym łańcuchu dostaw, zamiast analizować osobno wyizolowane procesy, takie jak zakupy czy sprzedaż. Dlaczego to ważne To niezbędny identyfikator, który pozwala połączyć wszystkie powiązane zdarzenia w jedną instancję procesu i analizować łańcuch dostaw od początku do końca. Skąd pobrać To identyfikator pojęciowy, który może wymagać utworzenia przez połączenie numerów różnych dokumentów, na przykład numeru zamówienia sprzedaży z późniejszymi numerami zamówienia zakupu i dostawy. Warto skonsultować się z dokumentacją SAP S/4HANA Supply Chain lub ekspertem w tej dziedzinie. Przykłady LO-4500078192LO-4500078193LO-4500078194 | |||
| Ostatnia aktualizacja danych LastDataUpdate | Znacznik czasu ostatniego odświeżenia danych lub ich ekstrakcji z systemu źródłowego. | ||
| Opis Ten atrybut wskazuje, kiedy ostatnio zaktualizowano dane w dzienniku zdarzeń. Informuje o aktualności analizowanych danych, dzięki czemu użytkownicy wiedzą, na ile są one bieżące. Przy podejmowaniu decyzji ważne jest, by wiedzieć, jak aktualne są dane. Ten znacznik czasu pomaga ocenić ich wiarygodność i określić okres objęty dashboardami i KPI. Dlaczego to ważne Informuje o aktualności danych, dzięki czemu użytkownicy wiedzą, jak bieżąca jest analiza procesu. Skąd pobrać To pole metadanych, które zwykle wypełnia narzędzie do ekstrakcji danych lub ETL po pomyślnym odświeżeniu danych. Przykłady 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| System źródłowy SourceSystem | System, z którego pochodzą dane. | ||
| Opis Wskazuje konkretną instancję systemu źródłowego, w której wygenerowano dane zdarzenia. W złożonym środowisku firma może korzystać z kilku instancji SAP S/4HANA dla różnych regionów lub jednostek biznesowych. Ten atrybut ma znaczenie dla zarządzania danymi i podziału analizy na segmenty. Pozwala porównywać przebieg procesu w różnych systemach lub ograniczyć analizę do jednego, wiarygodnego źródła. Dlaczego to ważne Dostarcza ważnych informacji o pochodzeniu danych, przydatnych przy ich weryfikacji i porównywaniu procesów w różnych środowiskach systemowych. Skąd pobrać Zazwyczaj jest to stała wartość dodawana podczas ekstrakcji danych w celu wskazania ich źródła, na przykład identyfikator systemu SAP (SAPSID). Przykłady S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Nazwa dostawcy SupplierName | Nazwa dostawcy towarów lub usług związanych z czynnościami zakupowymi. | ||
| Opis Ten atrybut wskazuje dostawcę, od którego kupowane są towary lub usługi. Zwykle jest powiązany z czynnościami takimi jak „Utworzono zapotrzebowanie zakupu” i „Wystawiono zamówienie zakupu”. Nazwa dostawcy jest potrzebna w dashboardzie wyników dostaw dostawców. Umożliwia filtrowanie i segmentowanie danych, aby porównywać terminowość dostaw, czas realizacji i jakość u różnych dostawców. Informacje te wspierają strategiczne decyzje zakupowe i zarządzanie relacjami z dostawcami. Dlaczego to ważne Umożliwia analizę wyników poszczególnych dostawców, co pomaga usprawniać proces zakupowy i oceniać ich rzetelność. Skąd pobrać Numer dostawcy (LIFNR) jest zapisany w dokumentach zakupowych (np. w tabelach EKKN, EBAN). Nazwę pobiera się z centralnej tabeli danych podstawowych dostawców LFA1. Przykłady Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Nazwa klienta CustomerName | Nazwa klienta, dla którego realizowane jest zamówienie. | ||
| Opis Ten atrybut wskazuje klienta końcowego powiązanego z zamówieniem sprzedaży i późniejszymi czynnościami związanymi z jego realizacją. Dostarcza informacji o stronie popytowej procesu w łańcuchu dostaw. W process mining analiza według klienta pomaga wykrywać różnice w sposobie realizacji zamówień i poziomie obsługi kluczowych klientów. Przydaje się w dashboardach takich jak analiza opóźnień w potwierdzeniu dostawy, aby sprawdzić, czy niektórzy klienci regularnie opóźniają potwierdzenia. Dlaczego to ważne Pozwala podzielić analizę według klientów i wykryć ich specyficzne zachowania, wąskie gardła lub wyniki w zakresie uzgodnionego poziomu usług. Skąd pobrać Numer klienta (KUNNR) jest zapisany w dokumentach sprzedaży (np. w tabeli VBAK). Nazwę pobiera się z centralnej tabeli danych podstawowych klientów KNA1. Przykłady Retail CorpInnovate SolutionsManufacturing Partners | |||
| Numer materiału MaterialNumber | Unikalny identyfikator przetwarzanego produktu lub materiału. | ||
| Opis Numer materiału, często nazywany SKU, to unikalny kod produktu w systemie SAP. Łączy czynności procesu z towarami fizycznymi lub cyfrowymi, które są produkowane, kupowane lub wysyłane. Ten atrybut jest niezbędny w analizie według produktu. Pomaga ustalić, czy określone produkty częściej powodują problemy z jakością, opóźnienia produkcji lub braki zapasów. Dashboardy można filtrować według materiału, aby sprawdzić wyniki dla konkretnych linii produktowych. Dlaczego to ważne Umożliwia analizę na poziomie produktu i pomaga ustalić, czy problemy procesu, takie jak opóźnienia lub niezgodności jakościowe, dotyczą konkretnych materiałów. Skąd pobrać Dane znajdują się w tabelach pozycji większości dokumentów, na przykład VBAP dla zamówień sprzedaży, EKPO dla zamówień zakupu i LIPS dla dostaw. Pole zwykle nosi nazwę MATNR. Przykłady FG-100-ARM-2034-BSA-5500 | |||
| Użytkownik wykonujący czynność ExecutingUser | Identyfikator użytkownika, który wykonał daną czynność. | ||
| Opis Ten atrybut zawiera nazwę lub identyfikator użytkownika SAP, który wykonał daną czynność, na przykład utworzył zamówienie zakupu lub zaksięgował przyjęcie towaru. Łączy kroki procesu z zaangażowanymi pracownikami. Analiza według użytkownika pomaga zrozumieć rozkład obciążenia, określić potrzeby szkoleniowe i zauważyć różnice w wynikach poszczególnych osób lub zespołów. Przydaje się także w analizie zgodności, ponieważ pozwala sprawdzić, kto wykonał istotne kroki procesu. Dlaczego to ważne Przypisuje czynności konkretnym użytkownikom, umożliwiając analizę obciążenia i porównanie wyników oraz ułatwiając badanie działań niezgodnych z procedurami. Skąd pobrać Dane znajdują się w polach „Utworzył” lub „Zmienił” w wielu tabelach SAP, na przykład ERNAM w EKKO (nagłówek zamówienia zakupu), LIKP (nagłówek dostawy) i VBRK (nagłówek faktury). Przykłady CBROWNJSMITHASINGH | |||
| Wymagana data dostawy RequestedDeliveryDate | Data, na którą poproszono dostawcę o dostarczenie towarów. | ||
| Opis To data dostawy wskazana w zamówieniu zakupu, która wyznacza termin oczekiwany od dostawcy. Stanowi punkt odniesienia przy ocenie rzeczywistej terminowości dostaw. Data ta jest niezbędna do obliczenia KPI terminowości dostaw dostawców. Porównanie rzeczywistej daty przyjęcia towaru z wymaganą datą dostawy pozwala obiektywnie ocenić, czy dostawcy wywiązują się ze zobowiązań. Dlaczego to ważne To data bazowa używana do obliczania KPI „Terminowość dostaw dostawców”, dlatego ma istotne znaczenie w zarządzaniu wynikami dostawców. Skąd pobrać Dane znajdują się w tabeli pozycji zamówień zakupu EKPO, w polu EINDT (data dostawy). Przykłady 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Wynik kontroli jakości QualityInspectionResult | Wynik kontroli jakości, na przykład „Zaliczono” lub „Nie zaliczono”. | ||
| Opis Ten atrybut zapisuje wynik kontroli jakości wyprodukowanych lub przyjętych towarów. Od wyniku zależy, czy towary mogą przejść do kolejnego etapu, czy wymagają poprawy, zwrotu lub złomowania. Atrybut ten jest istotny dla dashboardu i KPI dotyczących odsetka odrzuceń w kontroli jakości. Analiza częstotliwości i przyczyn niezgodności pomaga wykryć powtarzające się problemy jakościowe związane z konkretnymi produktami, dostawcami lub liniami produkcyjnymi. Dlaczego to ważne Bezpośrednio wspiera obliczanie KPI związanych z jakością i pomaga wskazać źródła problemów jakościowych w łańcuchu dostaw. Skąd pobrać Informacje te są zwykle przechowywane w module Quality Management (QM). Dane mogą pochodzić z tabel partii kontrolnych, takich jak QALS, oraz kodów decyzji o sposobie wykorzystania w QAVE. Przykłady ZaliczonoNie zaliczonoWymagana poprawaZaliczono z odstępstwem | |||
| Zakład Plant | Zakład produkcyjny lub centrum dystrybucji, w którym wykonano daną czynność. | ||
| Opis Zakład to jednostka organizacyjna SAP oznaczająca lokalizację, w której produkuje się, przechowuje lub dystrybuuje towary. Określa geograficzny lub funkcjonalny kontekst czynności procesu. Analiza wyników procesu według zakładu jest często potrzebna. Umożliwia porównywanie efektywności, przepustowości i zgodności w różnych lokalizacjach operacyjnych, co pomaga wskazać dobre praktyki i miejsca wymagające poprawy. Dlaczego to ważne Dodaje do analizy wymiar geograficzny lub organizacyjny, umożliwiając porównanie wyników różnych zakładów. Skąd pobrać Dane znajdują się w wielu tabelach pozycji dokumentów, takich jak VBAP (sprzedaż), EKPO (zakupy) i LIPS (dostawy). Pole zwykle nosi nazwę WERKS. Przykłady 100021003500 | |||
| Czas zakończenia EndTime | Znacznik czasu zakończenia czynności, używany do obliczania czasu jej przetwarzania. | ||
| Opis Czas zakończenia wskazuje, kiedy zakończono daną czynność. Czas rozpoczęcia (EventTime) określa, kiedy czynność się zaczęła, a czas zakończenia pozwala ustalić, ile trwało jej wykonanie, zwłaszcza gdy nie jest natychmiastowa. Dane o rozpoczęciu i zakończeniu umożliwiają dokładny pomiar czasu przetwarzania i oczekiwania. Pozwalają odróżnić czas aktywnej pracy nad zadaniem od oczekiwania na kolejny krok, co pomaga wskazać możliwości poprawy efektywności. Dlaczego to ważne Umożliwia dokładne obliczanie czasu przetwarzania czynności i odróżnienie pracy przynoszącej wartość od czasu oczekiwania. Skąd pobrać Można go wyznaczyć na podstawie zmian statusu w SAP. Na przykład rozpoczęcie może oznaczać zmiana statusu na „W toku”, a zakończenie zmiana na „Zakończono” w tabelach takich jak JEST/JCDS. W przypadku zdarzeń natychmiastowych EndTime może być równy StartTime. Przykłady 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Czy dostawa była opóźniona IsLateDelivery | Wartość logiczna wskazująca, czy dostawa od dostawcy nastąpiła po wymaganej dacie dostawy. | ||
| Opis To pole obliczeniowe wskazuje, czy dostawa była terminowa. Jego wartość wynika z porównania znacznika czasu czynności „Zaksięgowano przyjęcie towaru dla zamówienia zakupu” z atrybutem „Wymagana data dostawy”. Atrybut ten ułatwia tworzenie dashboardów i KPI dotyczących wyników dostawców. Pozwala szybko filtrować i agregować dane, aby obliczyć KPI terminowości dostaw oraz wskazać dostawców, materiały lub regiony, w których opóźnienia występują najczęściej. Dlaczego to ważne Ułatwia analizę wyników dostawców, podając jednoznaczny wynik dla każdej dostawy. Jest to niezbędne do obliczania KPI terminowości dostaw. Skąd pobrać To pole obliczeniowe. Logika: IF ('Goods Receipt For PO Posted'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Przykłady truefalse | |||
| Czy wymagana była poprawa IsRework | Wartość wskazująca, czy czynność lub sekwencja czynności oznacza ponowne wykonanie pracy. | ||
| Opis Ten atrybut logiczny oznacza czynności będące powtórzeniem wcześniejszych kroków procesu, co wskazuje na poprawę lub korektę. Na przykład jeśli po „Kontroli jakości” następuje „Utworzono zlecenie produkcyjne”, a potem kolejna „Kontrola jakości”, drugą kontrolę można oznaczyć jako ponowne wykonanie. Wykrywanie ponownej pracy pomaga zrozumieć nieefektywność procesu i ukryte koszty. To pole pozwala określić częstotliwość i wpływ powtarzających się czynności, wspiera obliczanie KPI odsetka błędów w przetwarzaniu zamówień i wskazuje obszary wymagające poprawy. Dlaczego to ważne Pomaga mierzyć nieefektywność procesu przez wskazywanie i zliczanie czynności należących do pętli ponownej pracy. Skąd pobrać Zwykle oblicza się go w narzędziu process mining przez wykrywanie powtarzających się sekwencji czynności w ramach tej samej sprawy. Przykłady truefalse | |||
| Ilość w zamówieniu OrderQuantity | Ilość materiału w pozycji zamówienia. | ||
| Opis Ten atrybut określa liczbę jednostek materiału zamówionych w pozycji zamówienia sprzedaży lub zakupu. Pozwala zmierzyć wielkość każdej transakcji. Analiza według ilości pomaga skupić się na zamówieniach o dużym wolumenie, które mogą mieć większy wpływ na działalność. Można też użyć jej do normalizacji innych wskaźników, na przykład obliczenia kosztu jednostkowego, lub sprawdzić, jak wielkość zamówienia wpływa na czas przetwarzania. Dlaczego to ważne Dostarcza informacji o wolumenie transakcji, umożliwiając ocenę ich wpływu i podział spraw według wielkości. Skąd pobrać Dane znajdują się w tabelach pozycji, na przykład w polu MENGE w EKPO (zamówienie zakupu) lub KWMENG w VBAP (zamówienie sprzedaży). Przykłady 100500025 | |||
| Nazwa przewoźnika CarrierName | Nazwa firmy transportowej lub spedytora obsługującego wysyłkę. | ||
| Opis Nazwa przewoźnika wskazuje dostawcę usług logistycznych odpowiedzialnego za transport towarów między lokalizacjami, na przykład z magazynu do klienta. Ten atrybut jest potrzebny w dashboardzie analizy czasu cyklu transportu. Umożliwia porównanie czasu przewozu, kosztów i rzetelności różnych przewoźników, co ułatwia planowanie logistyki i wybór przewoźnika. Dlaczego to ważne Umożliwia analizę wyników poszczególnych przewoźników, co pomaga optymalizować koszty logistyki i czas dostawy. Skąd pobrać Identyfikator przewoźnika (agenta spedycyjnego) jest zapisany w dokumentach wysyłki, na przykład w tabeli VTTK (nagłówek wysyłki). Nazwę pobiera się z tabel danych podstawowych, takich jak LFA1. Przykłady DHLFedExMaersk Logistics | |||
| Numer zamówienia sprzedaży SalesOrderNumber | Unikalny identyfikator dokumentu zamówienia sprzedaży (SO). | ||
| Opis Numer zamówienia sprzedaży to oficjalny numer dokumentu potwierdzającego sprzedaż klientowi. Jest ważnym identyfikatorem w części łańcucha dostaw obejmującej realizację zamówienia i płatność. Ten atrybut pozwala śledzić realizację konkretnego zamówienia klienta. Łączy początkowe zapytanie klienta z późniejszymi czynnościami, takimi jak dostawa i fakturowanie, wspierając analizę czasu realizacji zamówienia. Dlaczego to ważne Służy jako identyfikator podprocesu realizacji zamówienia i łączy popyt klienta z logistyką oraz rozliczeniem finansowym. Skąd pobrać Dane znajdują się w tabeli nagłówków zamówień sprzedaży VBAK i tabeli pozycji VBAP. Pole nosi nazwę VBELN. Przykłady 100023451000234610002347 | |||
| Numer zamówienia zakupu PurchaseOrderNumber | Unikalny identyfikator dokumentu zamówienia zakupu (PO). | ||
| Opis Numer zamówienia zakupu to oficjalny numer dokumentu używanego do zamawiania materiałów u dostawcy. Jest ważnym identyfikatorem w zakupowej części łańcucha dostaw. Atrybut ten pozwala szczegółowo analizować proces zakupowy. Jest używany w dashboardzie czasu cyklu zakupów od początku do końca oraz przy obliczaniu KPI terminowości dostaw dostawców. Łączy zapotrzebowania, zamówienia, przyjęcia i płatności. Dlaczego to ważne Służy jako identyfikator, który pozwala szczegółowo analizować podproces zakupowy i łączyć powiązane zdarzenia zakupowe. Skąd pobrać Dane znajdują się w tabeli nagłówków zamówień zakupu EKKO i tabeli pozycji EKPO. Pole nosi nazwę EBELN. Przykłady 450007819245000781934500078194 | |||
Działania w zarządzaniu łańcuchem dostaw
| Działanie | Opis | ||
|---|---|---|---|
| Potwierdzono dostawę | Oznacza formalne potwierdzenie klienta lub przewoźnika, że towary zostały odebrane zgodnie z ustaleniami. Informację tę często zapisuje się, aktualizując dostawę wychodzącą o dane POD. | ||
| Dlaczego to ważne Ta czynność oznacza ostateczny koniec procesu realizacji zamówienia. Ma istotne znaczenie dla prawidłowego fakturowania, rozstrzygania sporów i pomiaru końcowego etapu dostawy. Skąd pobrać To jawne zdarzenie. Data potwierdzenia dostawy jest zapisywana w tabeli nagłówka dostawy (LIKP, pole PODAT) lub powiązanych tabelach POD (VLPOD). Rejestrowanie Użyj daty potwierdzenia dostawy (LIKP-PODAT) z dokumentu dostawy. Typ zdarzenia explicit | |||
| Utworzono zamówienie sprzedaży | To zdarzenie oznacza utworzenie nowego zamówienia sprzedaży, które formalnie rejestruje zapotrzebowanie klienta na towary. Jest zapisywane w systemie, gdy użytkownik zapisuje nowy dokument zamówienia sprzedaży. | ||
| Dlaczego to ważne To główny punkt początkowy procesu od zamówienia do płatności. Analiza czasu od tego zdarzenia do kolejnych zdarzeń pokazuje całkowity czas realizacji zamówienia i pomaga wykryć opóźnienia na początkowym etapie obsługi. Skąd pobrać Zdarzenie jest rejestrowane bezpośrednio. Można je znaleźć w dokumentach zmian tabel zamówień sprzedaży (CDHDR/CDPOS) lub odczytać znacznik czasu utworzenia z nagłówka zamówienia sprzedaży (tabela VBAK, pole ERDAT). Rejestrowanie Użyj daty utworzenia (VBAK-ERDAT) i godziny (VBAK-ERZET) dokumentu zamówienia sprzedaży. Typ zdarzenia explicit | |||
| Wyprodukowano towary | To zdarzenie oznacza potwierdzenie zakończenia produkcji towarów. Zwykle jest rejestrowane jako przyjęcie towarów ze zlecenia produkcyjnego, które zwiększa zapasy produktów gotowych. | ||
| Dlaczego to ważne To zdarzenie oznacza koniec cyklu produkcyjnego. Czas od utworzenia zlecenia produkcyjnego do tego zdarzenia odpowiada czasowi realizacji produkcji i jest ważnym wskaźnikiem jej wydajności. Skąd pobrać Zdarzenie można zarejestrować bezpośrednio podczas księgowania dokumentu materiałowego przyjęcia towarów ze zlecenia produkcyjnego. Można je też wywnioskować z końcowego potwierdzenia zlecenia produkcyjnego (tabela AFRU) lub zmiany statusu na „Dostarczono”. Rejestrowanie Wywnioskuj zdarzenie z daty księgowania końcowego dokumentu materiałowego przyjęcia towarów ze zlecenia produkcyjnego lub ze zmiany statusu. Typ zdarzenia inferred | |||
| Wystawiono zamówienie zakupu | Oznacza formalne utworzenie i wystawienie zamówienia zakupu u zewnętrznego dostawcy na potrzebne materiały. W ten sposób zapotrzebowanie zakupu zostaje przekształcone w wiążące zobowiązanie wobec dostawcy. | ||
| Dlaczego to ważne To ważny etap, który pozwala mierzyć czas dostawy dostawcy i długość cyklu zaopatrzenia. Stanowi punkt odniesienia przy ocenie terminowości dostaw. Skąd pobrać To zdarzenie jest rejestrowane bezpośrednio po utworzeniu zamówienia zakupu. Znacznik czasu utworzenia jest przechowywany w tabeli nagłówka zamówienia zakupu (EKKO, pole AEDAT). Rejestrowanie Użyj daty utworzenia dokumentu (EKKO-AEDAT) zamówienia zakupu. Typ zdarzenia explicit | |||
| Zaksięgowano przyjęcie towarów do zamówienia zakupu | Oznacza fizyczne przyjęcie od dostawcy surowców lub towarów objętych zamówieniem zakupu. Zdarzenie jest rejestrowane, gdy towary docierają do magazynu lub zakładu. | ||
| Dlaczego to ważne To działanie kończy etap dostawy od dostawcy w cyklu zaopatrzenia. Jest niezbędne do obliczenia odsetka terminowych dostaw i oceny wyników logistyki przychodzącej. Skąd pobrać To zdarzenie jest rejestrowane bezpośrednio podczas księgowania dokumentu materiałowego. Znacznik czasu znajduje się w tabeli nagłówka dokumentu materiałowego (MKPF, pole BUDAT). Powiązanie z zamówieniem zakupu znajduje się w tabeli pozycji (MSEG). Rejestrowanie Użyj daty księgowania (MKPF-BUDAT) dokumentu materiałowego powiązanego z zamówieniem zakupu. Typ zdarzenia explicit | |||
| Zaksięgowano wydanie towaru | Ta czynność oznacza prawne i fizyczne wydanie towarów z magazynu. Zmniejsza stan zapasów i księguje koszt własny sprzedaży, potwierdzając oficjalną wysyłkę zamówienia. | ||
| Dlaczego to ważne To ważny etap, który rozpoczyna okres transportu. Oznacza moment, w którym towary opuszczają firmę i rozpoczyna się ich dostawa. Skąd pobrać To jawne zdarzenie, które powoduje utworzenie dokumentu materiałowego. Znacznik czasu jest zapisywany w nagłówku dokumentu materiałowego (MKPF, pole BUDAT) i aktualizuje status ruchu towarów w dokumencie dostawy (LIKP, pole WBSTK). Rejestrowanie Użyj daty księgowania (MKPF-BUDAT) z dokumentu materiałowego wydania towaru powiązanego z dostawą wychodzącą. Typ zdarzenia explicit | |||
| Przeprowadzono kontrolę jakości | Oznacza zakończenie kontroli jakości wyprodukowanych towarów. Wynik kontroli, pozytywny lub negatywny, jest zapisywany w decyzji o wykorzystaniu. | ||
| Dlaczego to ważne To działanie ma zasadnicze znaczenie dla monitorowania jakości produktów i wykrywania problemów produkcyjnych. Wysoki odsetek odrzuceń lub długi czas kontroli mogą tworzyć poważne wąskie gardła. Skąd pobrać To zdarzenie jest rejestrowane bezpośrednio w chwili podjęcia decyzji o wykorzystaniu dla partii kontroli jakości. Data decyzji znajduje się w tabeli QALS (pole PASTRTERM) lub QAVE. Rejestrowanie Użyj znacznika czasu zapisania decyzji o wykorzystaniu dla partii kontroli jakości (tabele QALS/QAVE). Typ zdarzenia explicit | |||
| Rozładowano towary w miejscu docelowym | Ta czynność oznacza fizyczny rozładunek towarów w lokalizacji klienta. SAP może nie rejestrować tego zdarzenia bezpośrednio, dlatego często trzeba je wywnioskować z danych przewoźnika lub późniejszych zdarzeń. | ||
| Dlaczego to ważne To koniec odcinka transportowego. Czas od wydania towaru do tego momentu to czas transportu, istotny przy optymalizacji logistyki. Skąd pobrać W podstawowym systemie ERP rzadko jest to jawne zdarzenie. Można je wywnioskować z komunikatów EDI przewoźnika, danych z modułu Transportation Management (TM) lub znacznika czasu dokumentu potwierdzenia dostawy, jeśli jest dostępny. Rejestrowanie Wywnioskuj zdarzenie z aktualizacji statusu od przewoźnika (np. EDI 214) lub użyj znacznika czasu potwierdzenia dostawy jako przybliżenia. Typ zdarzenia inferred | |||
| Sprawdzono dostępność zapasów | Oznacza sprawdzenie przez system lub użytkownika, czy zamówione towary są dostępne w magazynie. Zwykle odbywa się automatycznie podczas tworzenia zamówienia sprzedaży, ale może nie być rejestrowane jako osobne zdarzenie. | ||
| Dlaczego to ważne Analiza czasu między złożeniem zamówienia a sprawdzeniem dostępności oraz wyniku tego sprawdzenia pomaga ocenić wpływ poziomu zapasów na czas realizacji. Opóźnienia na tym etapie często prowadzą do uruchomienia zaopatrzenia lub produkcji. Skąd pobrać Zwykle nie jest to osobne zdarzenie. Można je wywnioskować z utworzenia pierwszej potwierdzonej pozycji harmonogramu w tabeli pozycji zamówienia sprzedaży (VBEP) lub ze zmian statusu pozycji zamówienia. Rejestrowanie Wywnioskuj zdarzenie ze zmiany statusu potwierdzenia pozycji harmonogramu zamówienia sprzedaży (tabela VBEP). Typ zdarzenia inferred | |||
| Utworzono dokument wysyłki | Oznacza utworzenie dokumentu wysyłki, który grupuje jedną lub więcej dostaw na potrzeby planowania transportu. Dokument zawiera informacje o przewoźniku, trasie i rodzaju transportu. | ||
| Dlaczego to ważne Ta czynność rozpoczyna formalne planowanie transportu. Analiza czasu od wydania towaru do zakończenia wysyłki pozwala ocenić sprawność procesu transportowego. Skąd pobrać To jawne zdarzenie zapisywane w tabeli nagłówka wysyłki (VTTK, pole ERDAT). Jest związane z modułem LE-TRA, z którego nie korzystają wszystkie organizacje. Rejestrowanie Użyj daty utworzenia (VTTK-ERDAT) z nagłówka dokumentu wysyłki. Typ zdarzenia explicit | |||
| Utworzono dostawę wychodzącą | Oznacza utworzenie dokumentu dostawy, który uprawnia do kompletacji i wysyłki towarów do klienta. Na tym etapie proces przechodzi od obsługi zamówienia do realizacji logistycznej. | ||
| Dlaczego to ważne To ważny etap rozpoczynający fizyczną realizację zamówienia. Opóźnienie między utworzeniem zamówienia a utworzeniem dostawy może wskazywać na problemy z planowaniem lub dostępnością towarów. Skąd pobrać To zdarzenie jest rejestrowane bezpośrednio. Znacznik czasu utworzenia znajduje się w tabeli nagłówka dostawy (LIKP, pole ERDAT). Rejestrowanie Użyj daty utworzenia (LIKP-ERDAT) i godziny (LIKP-ERZET) z nagłówka dokumentu dostawy. Typ zdarzenia explicit | |||
| Utworzono fakturę dla klienta | Ta czynność oznacza utworzenie dokumentu rozliczeniowego dla klienta na podstawie dostarczonych towarów lub usług. Rozpoczyna końcowy etap rozliczenia finansowego procesu. | ||
| Dlaczego to ważne Ta czynność jest przydatna przy analizie czasu cyklu fakturowania. Opóźnienia między potwierdzeniem dostawy a wystawieniem faktury mogą negatywnie wpływać na przepływy pieniężne. Skąd pobrać To jawne zdarzenie. Znacznik czasu utworzenia jest zapisywany w tabeli nagłówka dokumentu rozliczeniowego (VBRK, pole ERDAT). Rejestrowanie Użyj daty utworzenia (VBRK-ERDAT) z nagłówka dokumentu rozliczeniowego. Typ zdarzenia explicit | |||
| Utworzono zapotrzebowanie zakupu | To zdarzenie oznacza utworzenie wewnętrznego zapotrzebowania na zakup potrzebnych towarów lub surowców. Często następuje, gdy zapasy nie wystarczają do realizacji zamówienia sprzedaży lub spadają poniżej poziomu ponownego zamówienia. | ||
| Dlaczego to ważne To pierwszy etap cyklu zaopatrzenia. Śledzenie momentu utworzenia zapotrzebowania pomaga wykryć opóźnienia w rozpoczęciu zakupów i analizować cały proces zaopatrzenia. Skąd pobrać To zdarzenie jest rejestrowane bezpośrednio. Znacznik czasu utworzenia znajduje się w tabeli nagłówka zapotrzebowania zakupu (EBAN, pole BADAT). Rejestrowanie Użyj daty utworzenia (EBAN-BADAT) dokumentu zapotrzebowania zakupu. Typ zdarzenia explicit | |||
| Utworzono zlecenie produkcyjne | Oznacza utworzenie zlecenia produkcyjnego na wytworzenie produktów gotowych potrzebnych do realizacji zamówienia sprzedaży. To formalny początek produkcji wewnętrznej. | ||
| Dlaczego to ważne Utworzenie zlecenia produkcyjnego rozpoczyna czas realizacji produkcji. Analiza tego zdarzenia pomaga wykryć opóźnienia między sygnałem popytu a rozpoczęciem produkcji. Skąd pobrać To zdarzenie jest rejestrowane bezpośrednio. Data utworzenia znajduje się w tabeli nagłówka zlecenia produkcyjnego (AUFK, pole ERDAT). Rejestrowanie Użyj daty utworzenia (AUFK-ERDAT) z tabeli nagłówka zlecenia. Typ zdarzenia explicit | |||
| Zakończono kompletację | To działanie oznacza zakończenie fizycznego pobierania towarów z magazynu do dostawy wychodzącej. W wielu systemach potwierdza je aktualizacja statusu kompletacji dokumentu dostawy. | ||
| Dlaczego to ważne Sprawna kompletacja ma zasadnicze znaczenie dla przepustowości magazynu. Śledzenie tego działania pomaga wykrywać wąskie gardła w operacjach magazynowych i mierzyć wydajność kompletacji. Skąd pobrać Często nie jest to pojedyncze, odrębne zdarzenie, lecz informację o nim można wywnioskować ze zmian statusu. Zdarzenie odnotowuje się, gdy status kompletacji w tabeli pozycji dostawy (LIPS, pole KOSTA) zmienia się na „C” (przetworzono w całości). Rejestrowanie Wywnioskuj zdarzenie z dokumentów zmian, gdy status kompletacji (LIPS-KOSTA) zostanie zaktualizowany na „skompletowano w całości”. Typ zdarzenia inferred | |||
Instrukcje ekstrakcji
Kroki
- Wymagania wstępne: Należy mieć użytkownika z odpowiednimi uprawnieniami do wymaganych widoków SAP S/4HANA Core Data Services (CDS). Zwykle zespół ds. bezpieczeństwa SAP przypisuje w tym celu określoną rolę. Potrzebny będzie również klient SQL, na przykład DBeaver lub SAP HANA Studio, który może połączyć się z bazą SAP HANA.
- Nawiązanie połączenia z bazą danych: Skonfiguruj klienta SQL, aby połączyć go z bazą SAP S/4HANA. Potrzebne będą: host serwera bazy danych, port (np. 3xx15, gdzie xx oznacza numer instancji), nazwa użytkownika bazy danych i hasło.
- Przygotowanie zapytania SQL: Skopiuj całe zapytanie SQL z sekcji zapytań tego dokumentu do edytora klienta SQL. Zapytanie pobiera wskazane działania z różnych modułów logistycznych i sprzedażowych.
- Ustawienie parametrów ekstrakcji: Przed uruchomieniem zapytania znajdź warunki zastępcze w klauzulach
WHEREkażdego podzapytania. Zastąp'YourCompanyCode'kodem analizowanej firmy, a wartości dat, takie jak'YYYY-MM-DD', ustaw tak, aby określić wymagany okres ekstrakcji. - Uruchomienie zapytania: Uruchom cały skrypt SQL. Czas wykonania zależy od wybranego zakresu dat i ilości danych w systemie. Aby ograniczyć obciążenie systemu, warto uruchomić zapytanie poza godzinami szczytu.
- Wstępna kontrola wyników: Po zakończeniu zapytania pobieżnie sprawdź wyniki w kliencie SQL. Upewnij się, że liczba wierszy jest wiarygodna, kolumny takie jak LogisticsOrder, ActivityName i EventTime zawierają dane, a w wynikach występują różne nazwy działań.
- Eksport danych do CSV: Wyeksportuj cały zestaw wyników z klienta SQL do pliku CSV. Wybierz kodowanie UTF-8, aby uniknąć problemów ze znakami specjalnymi.
- Przygotowanie pliku do przesłania: Sprawdź, czy nagłówki kolumn w pliku CSV dokładnie odpowiadają nazwom atrybutów wymaganym przy wczytywaniu danych, np.
LogisticsOrder,ActivityName,EventTime. Jeśli użyto podanego zapytania SQL, dalsze przekształcanie danych nie powinno być potrzebne.
Konfiguracja
- Wymagania wstępne: Wymagany jest dostęp do bazowej bazy SAP HANA. Użytkownik bazy musi mieć uprawnienia
SELECTdo wszystkich widoków CDS użytych w zapytaniu, w tym między innymi I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment i I_BillingDocumentItem. - Filtrowanie zakresu dat: Zapytanie zawiera miejsce na filtr zakresu dat, zwykle oparty na polu daty utworzenia (
CreationDatelubDocumentDate). Do wstępnej analizy zaleca się okres od 3 do 6 miesięcy. Pozwoli to uzyskać reprezentatywny zestaw danych bez nadmiernego obciążania systemu. - Najważniejsze filtry biznesowe: Aby dane były przydatne, należy filtrować je według konkretnych jednostek organizacyjnych. W zapytaniu znajduje się miejsce na
CompanyCode. W zależności od zakresu analizy można też dodać filtrySalesOrganization,DistributionChannellubPlant. - Wydajność: Zapytanie łączy wiele dużych widoków CDS, dlatego jego wykonanie może zużywać znaczne zasoby systemowe. Ekstrakcję warto zaplanować poza godzinami pracy. W przypadku bardzo dużych zbiorów można podzielić ją na mniejsze, kolejne partie obejmujące poszczególne miesiące.
Przykładowe zapytanie sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; Kroki
- Sprawdź, czy dostępny jest bezpośredni dostęp do odczytu schematu SAP HANA zawierającego odpowiednie dane logistyczne, sprzedażowe, zakupowe, magazynowe, produkcyjne, jakościowe, dostawcze, transportowe, potwierdzenia dostawy i fakturowania. Uzyskaj nazwę schematu, dane połączenia i uprawnienia od zespołu SAP Basis lub zespołu platformy danych. Nie zapisuj danych w systemie źródłowym.
- Sprawdź dokładny model danych S/4HANA w systemie docelowym. EKKO i EKPO służą do obsługi zamówień zakupu, a LIKP i LIPS do dostaw wychodzących. Pozostałe obiekty trzeba skonfigurować dla zamówień sprzedaży, zapotrzebowań zakupowych, dokumentów materiałowych, zleceń produkcyjnych, wyników kontroli jakości, przesyłek, potwierdzeń dostawy i fakturowania. Zastąp każdy ujęty w nawiasy kwadratowe symbol zastępczy tabeli lub kolumny obiektem zweryfikowanym w słowniku danych systemu.
- Zdefiniuj regułę korelacji LogisticsOrder. Preferowana jest zweryfikowana relacja przepływu dokumentów od zamówienia sprzedaży do powiązanych dostaw, dokumentów materiałowych, dokumentów produkcyjnych lub zakupowych oraz faktur. Jeśli bezpośrednia relacja nie jest dostępna, skonfiguruj udokumentowaną tabelę korelacji lub mapowanie właściwe dla firmy. Nie łącz spraw wyłącznie na podstawie numeru materiału lub daty.
- Ustaw okres ekstrakcji za pomocą parametrów [Start date parameter] i [End date parameter]. Zastosuj go spójnie do znaczników czasu zdarzeń, zachowując jednocześnie dokumenty utworzone przed tym okresem, jeśli są potrzebne do wyjaśnienia zdarzeń, które w nim wystąpiły.
- W oznaczonej sekcji filtrów skonfiguruj kod firmy, organizację sprzedaży, zakład, organizację zakupową, typ dokumentu i pozostałe filtry biznesowe. Używaj ich dopiero po sprawdzeniu wartości w systemie docelowym.
- Zastąp ujęte w nawiasy kwadratowe odwołania do tabel i kolumn w każdej gałęzi działań zweryfikowanymi nazwami. Wszystkie gałęzie muszą zwracać te same kolumny i zgodne typy danych. Zapytanie jawnie tworzy osobny wiersz dla każdego z 15 wymaganych działań, ponieważ ProcessMind nie uzupełnia brakujących zdarzeń automatycznie.
- Uruchom zapytanie w SAP HANA Database Explorer, konsoli SQL w SAP HANA cockpit lub zatwierdzonym kliencie SQL. Przed uruchomieniem całego zapytania UNION ALL przetestuj każdą gałąź działań osobno. Sprawdź plany wykonania i ogranicz początkowy test do krótkiego zakresu dat.
- Zweryfikuj relacje między dokumentami, znaczniki czasu, identyfikatory użytkowników, dane dostawców i klientów, materiały, zakłady oraz wyniki kontroli jakości. Sprawdź, czy złączenia na poziomie pozycji nie powodują duplikatów, i zastosuj ustaloną regułę szczegółowości zdarzeń, na przykład jedno zdarzenie na dokument lub na pozycję dokumentu.
- Wyeksportuj wyniki do pliku CSV w kodowaniu UTF-8 lub innym obsługiwanym przez ProcessMind formacie tabelarycznym. Zachowaj dokładne nazwy kolumn: LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate i QualityInspectionResult. Upewnij się, że EventTime ma typ znacznika czasu, a LastDataUpdate jest wypełniane w spójny sposób.
- Prześlij plik do ProcessMind i przypisz LogisticsOrder jako identyfikator sprawy, ActivityName jako działanie, a EventTime jako znacznik czasu zdarzenia. Sprawdź, czy wszystkie 15 etykiet działań jest traktowanych jako jawne zdarzenia, a po weryfikacji działania ekstrakcji przyrostowej zaplanuj kontrolowane odświeżanie.
Konfiguracja
- Zakres dat: Zacznij od danych z okresu od 3 do 6 miesięcy. Do wstępnych testów wybierz krótszy okres i wydłuż go dopiero po sprawdzeniu wydajności oraz relacji między dokumentami.
- Schemat źródłowy: Ustaw [SAP HANA schema name] na schemat zawierający zweryfikowane tabele lub widoki S/4HANA. Nie zakładaj, że klasyczna tabela ERP jest dostępna pod tą samą nazwą w każdym wdrożeniu S/4HANA.
- Zakres dokumentów: Skonfiguruj [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] i [Document Type filter] zgodnie z zakresem procesu.
- Korelacja: Skonfiguruj [Your document flow or correlation object], aby każde zdarzenie było przypisane do jednego LogisticsOrder. Brakującą lub niejednoznaczną korelację należy zgłosić, a nie przypisywać po cichu.
- Szczegółowość zdarzeń: Wybierz jedno zdarzenie na dokument, pozycję dokumentu lub istotną biznesowo zmianę statusu. Stosuj tę samą regułę we wszystkich gałęziach i usuwaj wyłącznie duplikaty techniczne.
- Priorytet znaczników czasu: Dla każdego działania użyj zweryfikowanego znacznika czasu księgowania, utworzenia, potwierdzenia, zmiany statusu, kontroli, dostawy, rozładunku, POD lub fakturowania. Nie zastępuj czasu zdarzenia biznesowego czasem ekstrakcji.
- Etykieta źródła: Ustaw [Source system label] na stałą wartość, na przykład zatwierdzony identyfikator systemu SAP S/4HANA.
- Znacznik czasu odświeżenia: Ustaw [Last data update expression] na zatwierdzony znacznik czasu ekstrakcji lub odświeżenia danych źródłowych.
- Wydajność: Ogranicz zakres dat i jednostki organizacyjne na wczesnym etapie, wybieraj tylko wymagane kolumny, unikaj nieograniczonych złączeń na poziomie pozycji i sprawdzaj plan wykonania. Przy regularnym ładowaniu danych warto rozważyć utrwalony widok ekstrakcji lub tabelę pośrednią.
- Uprawnienia: Wymagany jest dostęp do odczytu odpowiednich obiektów schematu SAP HANA oraz uprawnienie do wykonywania zapytań SQL. Weryfikacja biznesowa wymaga dostępu do danych dotyczących sprzedaży, zakupów, zapasów, produkcji, jakości, realizacji logistyki, transportu i fakturowania.
- Zakres funkcjonalny: Sprawdź, czy wdrożony system obejmuje procesy biznesowe odpowiadające wymaganym działaniom. Dane dotyczące przesyłek, rozładunku, POD, jakości, produkcji i fakturowania mogą być przechowywane w osobnych aplikacjach lub rozszerzeniach.
- Bezpieczeństwo: Stosuj firmowe zasady dotyczące danych klientów, dostawców, materiałów, finansów i użytkowników. W razie potrzeby maskuj pola wrażliwe lub ograniczaj do nich dostęp.
Przykładowe zapytanie sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; Kroki
- Wymagania wstępne: Należy mieć klucz programisty i odpowiednie uprawnienia w systemie SAP S/4HANA, aby tworzyć i uruchamiać programy ABAP (dostęp do transakcji SE38) oraz odczytywać tabele łańcucha dostaw, takie jak VBAK, LIKP, EKKO i MKPF.
- Utworzenie programu: Otwórz edytor ABAP za pomocą transakcji
SE38. Wpisz nazwę nowego programu, na przykładZ_PM_SCM_EXTRACTION, i kliknij „Utwórz”. Podaj opisowy tytuł i ustaw typ programu na „Program wykonywalny”. - Wstawienie kodu: Skopiuj cały kod ABAP z sekcji „zapytanie” poniżej i wklej go do edytora ABAP nowego programu.
- Zdefiniowanie elementów tekstowych: Przejdź do Go To > Text Elements > Selection Texts. Aktywuj wszystkie proponowane etykiety ekranu wyboru, aby interfejs był czytelny i łatwy w obsłudze.
- Aktywacja programu: Zapisz i aktywuj program, naciskając CTRL+S, a następnie CTRL+F3, lub klikając ikonę aktywacji na pasku narzędzi. Popraw ewentualne błędy składni wynikające z konfiguracji systemu.
- Uruchomienie programu: Naciśnij F8 lub kliknij przycisk „Bezpośrednie przetwarzanie”. Pojawi się ekran wyboru, na którym można ustawić filtry danych do ekstrakcji.
- Ustawienie parametrów ekstrakcji: Na ekranie wyboru określ zakres dat pola Sales Order Creation Date. Zaleca się również filtrowanie według konkretnych kodów firm lub organizacji sprzedaży, aby kontrolować ilość danych. Wpisz pełną ścieżkę pliku wynikowego na serwerze aplikacji SAP.
- Uruchomienie w tle: W przypadku dużych zbiorów obejmujących kilka miesięcy należy uruchomić program w tle, aby uniknąć przekroczenia limitu czasu transakcji. Z menu wybierz Program > Execute in Background i zaplanuj zadanie.
- Pobranie pliku danych: Po zakończeniu programu użyj transakcji
AL11, aby przejść do wskazanego katalogu na serwerze aplikacji. Znajdź wygenerowany plik i pobierz go na komputer za pomocą transakcjiCG3Y. - Przygotowanie do przesłania: Sprawdź, czy pobrany plik jest zwykłym plikiem tekstowym, na przykład CSV z separatorem przecinka lub średnika, i używa kodowania UTF-8. Plik jest gotowy do przesłania do narzędzia process mining.
Konfiguracja
- Zakres dat wyboru (S_ERDAT): To najważniejszy filtr. Określa przedział czasu, z którego w pierwszej kolejności wybierane są zamówienia sprzedaży na podstawie daty ich utworzenia (
VBAK-ERDAT). Zacznij od ograniczonego okresu, na przykład ostatnich 3 do 6 miesięcy, aby ilość danych była możliwa do obsłużenia. - Organizacja sprzedaży (S_VKORG): Opcjonalny filtr ograniczający ekstrakcję do wybranych organizacji sprzedaży. Przydaje się, gdy analiza ma dotyczyć konkretnej jednostki biznesowej lub regionu.
- Kod firmy (S_BUKRS): Opcjonalny filtr ograniczający dane do wybranych kodów firm. Zdecydowanie warto go użyć, aby zawęzić zakres danych i poprawić wydajność.
- Ścieżka pliku wynikowego (P_FILE): Pełna ścieżka na serwerze aplikacji SAP, w której zostanie zapisany końcowy plik dziennika zdarzeń. Użytkownik uruchamiający program musi mieć prawo zapisu w tym katalogu. Przykład:
/usr/sap/trans/tmp/scm_event_log.csv. - Tryb wykonania: Program można uruchomić na pierwszym planie, jeśli ekstrakcja obejmuje niewielki zestaw testowy. Przy większej ilości danych wymagane jest przetwarzanie w tle, aby uniknąć przekroczenia limitu czasu i ograniczyć obciążenie systemu w godzinach szczytu.
- Uprawnienia systemowe: Użytkownik uruchamiający raport musi mieć dostęp do odczytu wszystkich tabel źródłowych, w tym między innymi VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 i LFA1.
Przykładowe zapytanie abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF. Gotowi do rozpoczęcia?
Skorzystaj z tego szablonu, aby przygotować dane i już dziś zacząć poprawiać wyniki łańcucha dostaw. Można liczyć na nasze wsparcie na każdym etapie.
Usprawnij zarządzanie łańcuchem dostaw
Uzyskaj pełny obraz procesu i popraw dokładność prognoz do 90% w ciągu kilku dni.
Bezpłatny okres próbny trwa 14 dni. Karta płatnicza nie jest wymagana.