Šablona dat pro proces od objednávky k inkasu při zpracování prodejních objednávek
Šablona dat pro proces od objednávky k inkasu při zpracování prodejních objednávek
- Doporučené atributy ke sběru
- Aktivity, které je vhodné sledovat
- Pokyny k extrakci dat ze SAP ECC
Atributy procesu od objednávky k inkasu při zpracování prodejních objednávek
| Název | Popis | ||
|---|---|---|---|
| Zákaznická objednávka SalesOrder | Jedinečný identifikátor dokladu zákaznické objednávky, který slouží jako hlavní případ pro sledování celého procesu od objednávky po platbu. | ||
| Popis Zákaznická objednávka je ústředním dokladem prodejního procesu a představuje požadavek zákazníka na zboží nebo služby. Obsahuje všechny informace potřebné k vyřízení požadavku od začátku do konce. V process mining se tento atribut používá jako ID případu. Každé jedinečné číslo zákaznické objednávky představuje jednu instanci procesu od začátku do konce. Analýza podle zákaznické objednávky umožňuje sledovat celý její životní cyklus, měřit dobu cyklu a odhalovat rozdíly mezi jednotlivými objednávkami. Proč je to důležité Jde o základní identifikátor, který propojuje všechny související aktivity a události a umožňuje analyzovat celý průběh každé zákaznické objednávky. Kde data získat Najdete ho v tabulce dat hlavičky zákaznického dokladu (VBAK) v poli VBELN. Příklady 900001234590000123469000012347 | |||
| Aktivita Activity | Název konkrétního obchodního kroku nebo události, ke které došlo v procesu zákaznické objednávky. | ||
| Popis Tento atribut popisuje jednotlivé kroky procesu od objednávky po platbu, například „Vytvoření zákaznické objednávky“, „Vytvoření dodávky“ nebo „Přijetí platby“. Z těchto aktivit se skládá průběh procesu pro každou zákaznickou objednávku. Analýza pořadí a načasování aktivit je základem process mining. Pomáhá zobrazit mapu procesu, odhalit úzká místa a varianty procesu a ověřit shodu se standardním modelem. Aktivity se obvykle odvozují z kombinace událostí vytvoření dokladu, změn stavu nebo konkrétních transakčních kódů zaznamenaných v systému. Proč je to důležité Aktivity tvoří základ mapy procesu a umožňují zobrazit a analyzovat jeho průběh, odchylky i úzká místa. Kde data získat Jde o odvozený atribut, který se obvykle vytváří při extrakci dat. Transakční kódy SAP (T-Codes), změny stavu dokladů (například v tabulkách VBUK a VBUP) nebo protokoly změn (tabulky CDHDR a CDPOS) se přiřazují k názvům aktivit srozumitelným uživatelům. Příklady Zákaznická objednávka vytvořenaDodávka vytvořenaZboží vyskladněnoVytvoření fakturyPřijetí platby | |||
| Čas zahájení StartTime | Časové razítko označující, kdy aktivita nebo událost začala. | ||
| Popis Čas zahájení, označovaný také jako časové razítko události, zaznamenává přesné datum a čas konkrétní aktivity. Může například uvádět, kdy byla vytvořena zákaznická objednávka, kdy byl vydán výdej zboží nebo kdy byla zaúčtována faktura. Tento údaj je základem veškeré časové analýzy v process mining. Používá se k výpočtu dob cyklu mezi aktivitami, celkové doby případu a k odhalování zpoždění či úzkých míst. Přesná časová razítka jsou nezbytná pro dashboardy zaměřené na výkonnost, například pro sledování včasných dodávek nebo doby vyřízení objednávky. Proč je to důležité Tento atribut je nezbytný pro výpočet všech ukazatelů výkonnosti, například dob cyklu a trvání, které pomáhají odhalovat úzká místa. Kde data získat Jde o složený atribut, který se obvykle odvozuje spojením pole s datem (například ERDAT) a pole s časem (například ERZET) z různých tabulek SAP, jako jsou VBAK (zákaznická objednávka), LIKP (dodávka) a VBRK (faktura). Příklady 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
| Poslední aktualizace dat LastDataUpdate | Časové razítko označující, kdy byla data tohoto záznamu naposledy aktualizována ze zdrojového systému. | ||
| Popis Tento atribut zaznamenává datum a čas poslední extrakce nebo aktualizace dat pro danou událost či případ. Umožňuje ověřit, jak aktuální jsou analyzovaná data. V dashboardech a sestavách tato informace pomáhá uživatelům posoudit aktuálnost získaných poznatků. Ukazuje, zda analýza vychází z nejnovějšího stavu provozu, nebo ze starších dat, a pomáhá nastavit očekávání ohledně jejich stáří. Proč je to důležité Uživatelé díky tomu vědí, jak aktuální jsou data. To je důležité pro včasná a informovaná rozhodnutí na základě analýzy process mining. Kde data získat Jde o atribut metadat, který při načtení dat doplňuje nástroj nebo proces extrakce. V původních tabulkách SAP se neukládá. Příklady 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
| Zdrojový systém SourceSystem | Určuje zdrojový systém, ze kterého byla data extrahována. | ||
| Popis Tento atribut uvádí zdrojový systém, například název konkrétní instance SAP ECC nebo číslo klienta. Poskytuje kontext k datům, zejména v prostředích s více produkčními systémy nebo s daty ze starších systémů. V analýze slouží k filtrování nebo rozdělení dat podle jejich původu. Hodí se zejména při porovnávání procesů napříč systémy nebo při migraci systému, kdy pomáhá ověřit integritu a konzistenci dat. Proč je to důležité Poskytuje potřebný kontext zejména v prostředí s více systémy. Umožňuje porovnávat procesy a sledovat původ dat. Kde data získat Tato hodnota se obvykle doplňuje při extrakci dat a často jde o statickou hodnotu představující ID systému SAP (SAPSID) nebo klienta (MANDT). Příklady ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
| Blokace dodávky DeliveryBlock | Kód označující, zda je zákaznická objednávka blokována pro dodání, a bránící vytvoření dodacího dokladu. | ||
| Popis Blokace dodávky je stav nastavený u zákaznické objednávky na úrovni hlavičky nebo položky, který dočasně zastaví proces před dodáním. Blokaci může nastavit uživatel ručně nebo systém automaticky, například při překročení úvěrového limitu nebo při neúplných datech. Tento atribut je důležitý pro dashboard „Analýza blokací a přepracování zákaznických objednávek“. Analýza četnosti, délky a důvodů blokací dodávek pomáhá odhalit hlavní úzká místa při vyřizování objednávek. Omezení těchto blokací přispívá ke zlepšení včasnosti dodávek i celkové doby cyklu. Proč je to důležité Přímo odhaluje úzká místa při vyřizování objednávek. Analýza důvodů a četnosti blokací je důležitá pro zlepšení plynulosti procesu. Kde data získat Najdete ho v tabulce dat hlavičky zákaznického dokladu (VBAK) v poli LIFSK. Příklady 0102Z1 | |||
| Číslo materiálu MaterialNumber | Jedinečný identifikátor prodávaného produktu nebo služby. | ||
| Popis Číslo materiálu označuje konkrétní položku na řádku zákaznické objednávky. Protože jedna objednávka může obsahovat více materiálů, tento atribut se obvykle analyzuje na úrovni položky. Analýza procesu podle čísla materiálu pomáhá odhalit problémy spojené s konkrétními produkty. Může ukázat, zda se některé produkty pojí s delší dobou vyřízení, častějšími blokacemi dodávek nebo větším počtem nesrovnalostí ve fakturách. To je důležité pro řízení dodavatelského řetězce a produktů i pro optimalizaci procesů napříč produktovými řadami. Proč je to důležité Umožňuje analyzovat proces podle produktu a odhalit, které produkty se pojí s neefektivitou, například se zpožděním, blokacemi nebo přepracováním. Kde data získat Najdete ho v tabulce dat položek zákaznického dokladu (VBAP) v poli MATNR. Příklady FG-1001-ARAW-205BSERV-INSTALL | |||
| Číslo zákazníka CustomerNumber | Jedinečný identifikátor zákazníka, který zadal zákaznickou objednávku. | ||
| Popis Tento atribut označuje odběratele, tedy hlavní zákaznický účet přiřazený k zákaznické objednávce. Propojuje transakci s konkrétním zákazníkem v kmenových datech. Analýza podle čísla zákazníka umožňuje rozdělit proces podle zákazníků a porozumět jejich chování i výkonnosti. Pomáhá například zjistit, kteří zákazníci mají nejdelší dobu cyklu, nejvyšší míru přepracování nebo nejčastěji mění objednávky. To je důležité pro zlepšování vztahů se zákazníky a úrovně služeb. Proč je to důležité Umožňuje analýzu z pohledu zákazníka, pomáhá odhalit problémy v procesech, které se týkají konkrétních zákazníků, a měřit výkonnost pro jednotlivé zákazníky. Kde data získat Najdete ho v tabulce dat hlavičky zákaznického dokladu (VBAK) v poli KUNNR. Příklady 100234100567200112 | |||
| Čistá částka NetAmount | Celková hodnota zákaznické objednávky bez daní a slev na úrovni hlavičky. | ||
| Popis Čistá částka vyjadřuje peněžní hodnotu zákaznické objednávky. Jde o důležitý finanční ukazatel přiřazený ke každé instanci procesu. Tento atribut je nezbytný pro hodnotovou analýzu v process mining. Pomáhá určit priority zlepšování procesů se zaměřením na objednávky s vysokou hodnotou. Analytici mohou spojit problémy v procesu, například zpoždění nebo přepracování, s jejich finančním dopadem a lépe tak zdůvodnit změny. Lze například porovnat, zda se objednávky s vysokou hodnotou zpracovávají efektivněji, nebo méně efektivně než objednávky s nízkou hodnotou. Proč je to důležité Umožňuje analýzu podle hodnoty a pomáhá zaměřit zlepšování na objednávky s největším finančním dopadem na společnost. Kde data získat Najdete ji v tabulce dat hlavičky zákaznického dokladu (VBAK) v poli NETWR. Příklady 1500.0012550.75850.50 | |||
| Důvod zamítnutí RejectionReason | Kód označující důvod zamítnutí nebo zrušení položky zákaznické objednávky. | ||
| Popis Důvod zamítnutí vysvětluje, proč nebyla vyřízena zákaznická objednávka nebo její konkrétní položka. Příčinou může být zrušení ze strany zákazníka, nedostupnost produktu nebo jiný obchodní důvod. Tento atribut je důležitý pro dashboard „Trendy ve zrušených zákaznických objednávkách“. Analýza nejčastějších důvodů zamítnutí pomáhá odhalit příčiny ztracených prodejů. Na základě těchto poznatků lze zlepšit řízení zásob, cenovou strategii nebo komunikaci se zákazníky a snížit míru zrušených objednávek. Proč je to důležité Vysvětluje, proč se objednávky ruší, a umožňuje hledat příčiny ztracených prodejů i zlepšit přesnost prognóz. Kde data získat Najdete ho v tabulce dat položek zákaznického dokladu (VBAP) v poli ABGRU. Příklady 0215Z5 | |||
| Prodejní organizace SalesOrganization | Organizační jednotka odpovědná za prodej produktů nebo služeb. | ||
| Popis Prodejní organizace je v SAP organizační jednotka, která strukturuje společnost podle jejích prodejních potřeb. Odpovídá za sjednávání prodejních podmínek a distribuci zboží a služeb. V process mining jde o důležitý rozměr analýzy. Umožňuje porovnávat výkonnost, efektivitu a shodu mezi různými prodejními jednotkami, regiony nebo divizemi. Díky tomu lze určit postupy, které se osvědčily ve výkonnějších jednotkách, a oblasti, kde je prostor pro zlepšení. Proč je to důležité Umožňuje porovnávat efektivitu procesů a shodu mezi různými organizačními jednotkami nebo regiony. Kde data získat Najdete ji v tabulce dat hlavičky zákaznického dokladu (VBAK) v poli VKORG. Příklady 100025003100 | |||
| Uživatel User | ID uživatele, který vytvořil nebo naposledy změnil doklad či provedl danou aktivitu. | ||
| Popis Tento atribut zachycuje ID uživatele SAP odpovědného za konkrétní událost v procesu. Uvádí například obchodníka, který vytvořil objednávku, nebo pracovníka skladu, který zaúčtoval výdej zboží. Analýza podle uživatele pomáhá porozumět rozložení pracovní zátěže, určit potřeby školení a odhalit rozdíly v tom, jak jednotliví uživatelé provádějí stejný úkol. Je důležitá pro dashboardy zaměřené na výkonnost zdrojů, shodu a identifikaci ručních zásahů. Proč je to důležité Zpřehledňuje výkonnost a pracovní zátěž zdrojů, pomáhá odhalit odchylky v procesech podle uživatelů a je důležitý pro analýzu shody a automatizace. Kde data získat V mnoha tabulkách hlaviček SAP ho najdete v poli „Vytvořil“ (ERNAM) nebo „Změnil“ (AENAM), například v tabulkách VBAK, LIKP a VBRK. Příklady CBURKEJSMITHRWILLIAMS | |||
| Dodací podmínky ShippingConditions | Určují obecný způsob dopravy zboží zákazníkovi. | ||
| Popis Dodací podmínky určují způsob přepravy objednávky, například standardní, expresní nebo osobní odběr. Dohodnou se se zákazníkem a ovlivňují plánování logistiky. Tento atribut se používá při analýze efektivity a nákladů způsobů dopravy. Rozdělení procesu podle dodacích podmínek umožňuje zjistit, zda se některé způsoby častěji pojí se zpožděním nebo delší dobou cyklu. Tyto údaje pomáhají optimalizovat logistiku a nastavit očekávání zákazníků ohledně termínu dodání. Proč je to důležité Umožňuje analyzovat výkonnost logistiky a zjistit, zda se některé způsoby dopravy pojí se zpožděním nebo vyšší efektivitou. Kde data získat Najdete je v tabulce dat hlavičky zákaznického dokladu (VBAK) v poli VSBED. Příklady 011020 | |||
| Dodáno včas IsOnTimeDelivery | Logická hodnota označující, zda bylo zboží odesláno v den potvrzeného dodání nebo dříve. | ||
| Popis Tento vypočítaný atribut porovnává skutečné datum výdeje zboží s atributem „ConfirmedDeliveryDate“ u zákaznické objednávky. Pokud k výdeji zboží došlo v den potvrzeného dodání nebo dříve, hodnota je true, jinak false. Atribut zjednodušuje tvorbu dashboardu „Výkonnost včasných dodávek“ i výpočet KPI Podíl včasných dodávek. Umožňuje snadno agregovat a zobrazovat výkonnost, aniž by bylo nutné při každé analýze nebo v každém grafu znovu porovnávat data. Poskytuje tak přehledný ukazatel spolehlivosti dodávek. Proč je to důležité Poskytuje přehledný ukazatel výkonnosti dodávek a usnadňuje výpočet celkového KPI Podíl včasných dodávek. Kde data získat Jde o vypočítaný atribut. Logika porovnává časové razítko aktivity „Výdej zboží“ s hodnotou atributu „ConfirmedDeliveryDate“. Příklady truefalse | |||
| Došlo k přepracování IsRework | Logická hodnota označující, zda byla zákaznická objednávka po vytvoření významně změněna nebo přepracována. | ||
| Popis Tento vypočítaný atribut označuje instance procesu, u kterých došlo k přepracování, například k jedné nebo více aktivitám „Změna zákaznické objednávky“. Konkrétní pravidla pro určení přepracování, například změna ceny, množství nebo data dodání, se stanoví při nastavení projektu. Tento atribut je důležitý pro dashboard „Přepracování a četnost změn zákaznických objednávek“ a KPI Míra přepracování zákaznických objednávek. Zjednodušuje analýzu, protože umožňuje přímo filtrovat a porovnávat objednávky, které prošly procesem bez zásahu, s těmi, u kterých byly nutné ruční změny. Pomáhá tak vyčíslit dopad přepracování na dobu cyklu a náklady. Proč je to důležité Přímo vyčísluje četnost přepracování a umožňuje analyzovat jeho příčiny i dopad na celkovou efektivitu procesu a dobu cyklu. Kde data získat Jde o vypočítaný atribut odvozený ze záznamu událostí. Logika ověřuje, zda došlo k aktivitám „Změna zákaznické objednávky“ nebo ke konkrétním událostem změn v tabulkách CDHDR/CDPOS. Příklady truefalse | |||
| Potvrzené datum dodání ConfirmedDeliveryDate | Datum, kdy bylo zákazníkovi potvrzeno dodání zboží nebo služeb. | ||
| Popis Jde o závazný termín dodání sdělený zákazníkovi na základě dostupnosti materiálu a plánování. Slouží jako výchozí bod pro měření výkonnosti dodávek. Tento atribut je základem dashboardu „Výkonnost včasných dodávek“ a KPI Podíl včasných dodávek. Porovnáním potvrzeného data dodání se skutečným datem „Výdeje zboží“ lze určit, zda byla objednávka dodána včas, předčasně, nebo se zpožděním. Jde o hlavní ukazatel spolehlivosti dodavatelského řetězce a spokojenosti zákazníků. Proč je to důležité Slouží jako měřítko včasnosti dodávek, což je důležitý KPI pro spokojenost zákazníků a efektivitu dodavatelského řetězce. Kde data získat Najdete ho v tabulce řádků plánu zákaznického dokladu (VBEP) v poli EDATU. Příklady 2023-05-102023-06-202023-07-01 | |||
| Stav kontroly úvěruschopnosti CreditCheckStatus | Označuje stav kontroly úvěruschopnosti zákaznického dokladu. | ||
| Popis Tento atribut uvádí výsledek automatické nebo ruční kontroly úvěruschopnosti zákaznické objednávky. Mezi běžné stavy patří „Schváleno“, „Zamítnuto“ a „Blokováno“. Jde o důležitý atribut pro dashboard „Analýza doby zpracování kontroly úvěruschopnosti“. Zpoždění nebo blokace při kontrole mohou výrazně prodloužit celkovou dobu vyřízení objednávky. Analýza tohoto stavu pomáhá posoudit efektivitu řízení úvěrových rizik a jeho vliv na rychlost prodeje. Proč je to důležité Přímo ovlivňuje rychlost zpracování objednávky. Analýza tohoto stavu pomáhá odhalit úzká místa v řízení úvěrových rizik, která zdržují vyřízení objednávky. Kde data získat Najdete ho v tabulce stavů hlavičky zákaznického dokladu (VBUK) nebo přímo v tabulce VBAK jako pole stavu úvěru, například CMGST. Příklady ABD | |||
Aktivity procesu od objednávky k inkasu při zpracování prodejních objednávek
| Aktivita | Popis | ||
|---|---|---|---|
| Objednávka potvrzena | Tato aktivita znamená, že zákaznická objednávka prošla všemi úvodními kontrolami a je potvrzena k vyřízení. Obvykle se odvozuje z toho, že objednávka již není blokována a její řádky rozvrhu obsahují potvrzená množství. | ||
| Proč je to důležité Jde o důležitý milník, který odděluje zadání objednávky od jejího vyřízení. Je výchozím bodem pro měření dodacích lhůt a včasnosti dodávek. Kde data získat Lze ji odvodit, když mají řádky rozvrhu v tabulce VBEP potvrzené množství (BMENG > 0) a objednávka není blokována pro dodání, například když je pole VBUK-LIFSK prázdné. Zachycení Odvozuje se z potvrzení řádku rozvrhu (VBEP-BMENG > 0) a odstranění blokací na úrovni hlavičky. Typ události inferred | |||
| Přijetí platby | Tato událost označuje přijetí zákaznické platby a její přiřazení k faktuře, čímž se vyrovná otevřená pohledávka. Jde o účetní událost odvozenou od vyrovnání finančního dokladu. | ||
| Proč je to důležité Jde o poslední krok, kterým se z prodeje získají peníze. Je koncovým bodem pro měření doby cyklu od fakturace po platbu i celkové doby cyklu vyřízení zákaznické objednávky. Kde data získat Odvozuje se z údajů o vyrovnání v tabulce BSEG pro zákaznickou položku. Pokud jsou vyplněna pole BSEG-AUGBL (doklad o vyrovnání) a BSEG-AUGDT (datum vyrovnání), platba byla přijata. Zachycení Odvozuje se od vyplněného data vyrovnání (AUGDT) v tabulce BSEG pro položku pohledávky. Typ události inferred | |||
| Uzavření položky objednávky | Tato aktivita označuje konečné uzavření položky zákaznické objednávky. Znamená, že položka byla kompletně dodána a vyfakturována a považuje se za dokončenou. Událost se odvozuje od celkového stavu položky. | ||
| Proč je to důležité Označuje úspěšné ukončení procesu. Analýza okamžiku uzavření položek pomáhá zjistit celkovou dobu procesu a odhalit objednávky, které zůstávají zbytečně otevřené. Kde data získat Odvozuje se od celkového stavu položky v tabulce VBUP (zákaznický doklad: stav položky). Pokud má pole VBUP-GBSTA hodnotu „C“ (zcela zpracováno), položka je uzavřena. Zachycení Odvozuje se od změny stavu položky (VBUP-GBSTA) na „C“ (zcela zpracováno). Typ události inferred | |||
| Vytvoření faktury | Označuje vytvoření zákaznické faktury neboli fakturačního dokladu. Jde o explicitní událost, při které v systému vznikne nový doklad a zahájí se platební část procesu. | ||
| Proč je to důležité Tento důležitý milník spouští měření doby cyklu od fakturace po platbu. Zpoždění při fakturaci přímo ovlivňují cash flow. Kde data získat Zaznamenává se v tabulce VBRK (fakturační doklad: data hlavičky) podle data vytvoření (ERDAT). Vazba na zákaznickou objednávku nebo dodávku je v tabulce VBFA. Zachycení Událost odvozená z časového razítka vytvoření (ERDAT) v tabulce VBRK. Typ události explicit | |||
| Zákaznická objednávka vytvořena | Označuje vytvoření nového prodejního dokladu. Jde o explicitní událost zaznamenanou při uložení nové objednávky uživatelem, obvykle prostřednictvím transakce VA01 v SAP. | ||
| Proč je to důležité Jde o hlavní počáteční událost procesu Order to Cash. Analýza jejího načasování je zásadní pro měření celkové doby zpracování a počtu přijatých objednávek. Kde data získat Zaznamenává se v tabulce VBAK (data hlavičky prodejního dokladu) pomocí data vytvoření (ERDAT) a času (ERZET). Kód transakce je uložen v poli VBAK-TCODE. Zachycení Událost vychází z časového razítka vytvoření (ERDAT, ERZET) v tabulce VBAK. Typ události explicit | |||
| Zboží vyskladněno | Jde o důležitou událost, při které přechází vlastnictví zboží a zboží oficiálně opouští sklad. Jedná se o explicitní finanční zaúčtování, které vytvoří materiálový doklad a aktualizuje zásoby. | ||
| Proč je to důležité Tato událost označuje expedici a je důležitým milníkem pro měření včasnosti dodávek a dodacích lhůt. Spouští finanční aktualizace a ve fyzickém vyřízení objednávky představuje bod, po kterém už nelze proces vrátit zpět. Kde data získat Vytvoření materiálového dokladu (MKPF/MSEG) s druhem pohybu výdeje zboží, například 601, který je propojen s dodacím dokladem. Zachycení Vytvoření materiálového dokladu (MKPF/MSEG) s druhem pohybu výdeje zboží, propojeného s dodávkou. Typ události explicit | |||
| Blokace dodání nastavena | Označuje nastavení blokace dodání u zákaznické objednávky, které brání vytvoření dodacího dokladu. Lze ji zaznamenat přímo z protokolů změn nebo odvodit z tabulek stavů. | ||
| Proč je to důležité Tato aktivita přímo souvisí s KPI míry blokací zákaznických objednávek. Zjištění, proč a jak často se blokace nastavují, pomáhá odhalit příčiny zpoždění při vyřizování objednávek. Kde data získat Lze ji najít v protokolech změn (CDHDR/CDPOS) pro pole VBAK-LIFSK. Alternativně ji lze odvodit z okamžiku, kdy se pole VBAK-LIFSK vyplní. Zachycení Událost z dokumentů změn pro pole VBAK-LIFSK nebo VBAP-LIFSP. Typ události explicit | |||
| Dodávka vytvořena | Tato událost označuje vytvoření výstupního dodacího dokladu, který dává skladu pokyn zahájit vychystávání a expedici. Jde o explicitní událost zaznamenanou v toku dokladů. | ||
| Proč je to důležité Jde o první krok fyzického vyřízení objednávky. Doba mezi potvrzením objednávky a vytvořením dodávky ukazuje, jak rychle se zahájí logistický proces. Kde data získat Vytvoření záznamu v tabulce LIKP (data hlavičky dodacího dokladu SD). Vazba na zákaznickou objednávku je uložena v tabulce toku dokladů VBFA. Zachycení Událost vychází z časového razítka vytvoření v tabulce LIKP a je propojena prostřednictvím tabulky VBFA. Typ události explicit | |||
| Kontrola úvěruschopnosti provedena | Označuje dokončení automatické nebo ruční kontroly úvěruschopnosti zákazníka u zákaznické objednávky. Obvykle se odvozuje ze změny celkového úvěrového stavu dokladu. | ||
| Proč je to důležité Kontrola úvěruschopnosti bývá významným úzkým místem. Měření její délky je nezbytné pro analýzu doby zpracování kontroly úvěruschopnosti a urychlení zpracování objednávek. Kde data získat Odvozuje se z polí úvěrového stavu v tabulce VBUK (stav hlavičky prodejního dokladu). Změna pole VBUK-CMGST z blokováno na uvolněno označuje tuto aktivitu. Zachycení Odvozuje se ze změn pole celkového úvěrového stavu (VBUK-CMGST). Typ události inferred | |||
| Potvrzení převzetí zboží | Tato aktivita označuje potvrzení, že zákazník zboží převzal. Zaznamená se při uložení potvrzení o dodání do systému, často se přitom aktualizuje stav dodacího dokladu. | ||
| Proč je to důležité Tato událost uvádí skutečné datum dodání, které je nezbytné pro přesné měření KPI „Podíl včasných dodávek“ ve srovnání se slíbeným termínem. Kde data získat Odvozuje se od nastavení stavu potvrzení o dodání (VBUK-PODAT) na hodnotu „C“ (potvrzeno). Datum potvrzení se ukládá do pole VLPOD-PODAT. Tento způsob se nepoužívá ve všech implementacích. Zachycení Odvozuje se od aktualizace stavu POD u dodávky (VBUK-PODAT) nebo od záznamu v tabulce VLPOD. Typ události inferred | |||
| Storno faktury | Označuje zrušení dříve vytvořeného fakturačního dokladu. Jde o explicitní transakci, která vytvoří nový storno doklad a vyrovná jím původní doklad. | ||
| Proč je to důležité Sledování stornovaných faktur pomáhá odhalit problémy s cenami, nesrovnalosti v dodávkách nebo chyby v datech. Podporuje KPI „Míra nesrovnalostí ve fakturách“. Kde data získat Explicitní událost zaznamenaná vytvořením storno fakturačního dokladu (VBRK-VBTYP = 'N' nebo 'O'). Původní faktura je uvedena v poli VBRK-SFAKN. Zachycení Vytvoření storno dokladu v tabulce VBRK s odkazem na původní fakturu. Typ události explicit | |||
| Vychystávání dokončeno | Označuje, že všechny položky dodávky byly fyzicky vychystány ze skladu. Pokud se používá Warehouse Management (WM), lze tuto událost odvodit ze stavu skladové objednávky. | ||
| Proč je to důležité Analýza doby vychystávání pomáhá zlepšit provoz skladu. Zpoždění v této fázi přímo ovlivňují celkovou dobu expedice a vyřízení objednávky. Kde data získat Odvozuje se ze změny stavu vychystání položky dodávky v tabulce LIPS-KOSTA na hodnotu 'C' (plně vychystáno). Pokud je aktivní WM, lze ji odvodit z potvrzení skladové objednávky (tabulky LTAK/LTAP). Zachycení Odvozuje se ze změny stavu vychystání (LIPS-KOSTA) nebo z potvrzení skladové objednávky WM. Typ události inferred | |||
| Zákaznická objednávka změněna | Označuje změnu existující zákaznické objednávky po jejím prvotním vytvoření. Změny se zaznamenávají ve vyhrazených tabulkách protokolu změn (CDHDR, CDPOS), když se upraví například množství, cena nebo data. | ||
| Proč je to důležité Sledování změn pomáhá odhalit opakované zpracování, nestabilitu procesu a problémy s kvalitou dat. Časté změny mohou ukazovat na potíže při prvotním zadání objednávky, které vedou ke zpoždění. Kde data získat Údaje se získávají z tabulek dokumentů změn CDHDR (hlavička) a CDPOS (položka) pro OBJECTCLAS = 'VERKBELEG'. Lze určit časové razítko i změněné pole. Zachycení Událost z tabulek dokumentů změn (CDHDR, CDPOS) pro objekty prodejních dokladů. Typ události explicit | |||
| Zrušení objednávky | Označuje zrušení zákaznické objednávky před jejím vyřízením. Obvykle se zaznamená přiřazením důvodu zamítnutí ke všem příslušným položkám objednávky. | ||
| Proč je to důležité Jde o koncový bod neúspěšného procesu, který přímo podporuje KPI „Míra zrušených objednávek“. Informace o tom, kdy a proč se objednávky ruší, pomáhají odhalit problémy v prodejním procesu. Kde data získat Odvozuje se od vyplněného pole VBAP-ABGRU (důvod zamítnutí) u všech aktivních položek zákaznické objednávky. Datum změny lze zjistit v tabulkách CDHDR/CDPOS. Zachycení Odvozuje se od vyplnění pole „Důvod zamítnutí“ (VBAP-ABGRU) u všech položek. Typ události inferred | |||
Návody k extrakci dat
Kroky
- Vývoj programu: Pomocí transakce SE38 nebo SE80 vytvořte nový spustitelný program ABAP. Program bude obsahovat veškerou logiku extrakce.
- Nastavení výběrové obrazovky: V programu vytvořte výběrovou obrazovku pro filtrování dat. Zahrňte parametry pro datum vytvoření prodejního dokladu (VBAK-ERDAT), prodejní organizaci (VBAK-VKORG) a typ prodejního dokladu (VBAK-AUART). Díky tomu lze extrakci opakovaně používat a snadno spravovat.
- Deklarace dat: Definujte interní tabulky a struktury potřebné k uložení dat z různých tabulek SAP, například VBAK, VBAP, VBFA, CDHDR, CDPOS, VBRK a BSAD. Definujte také výslednou strukturu záznamu událostí podle požadovaných atributů.
- Výběr základních prodejních objednávek: Napište úvodní příkaz SELECT, který podle vstupů z výběrové obrazovky načte hlavičky prodejních objednávek (VBAK) a jejich položky (VBAP). Tím získáte základní soubor případů k analýze.
- Extrakce události vytvoření: Projděte vybrané záznamy VBAK. U každého záznamu vyplňte strukturu záznamu událostí aktivitou „Sales Order Created“ a jako StartTime použijte VBAK-ERDAT a VBAK-ERZET.
- Extrakce událostí z protokolu změn: Pro vybrané prodejní objednávky načtěte záznamy z CDHDR a CDPOS, kde OBJECTCLAS = 'VERKBELEG'. Projděte výsledky a určete konkrétní změny polí. Změna VBAK-LIFSK například označuje „Delivery Block Set“ a změna VBUK-CMGST „Credit Check Performed“. Každou další relevantní změnu lze zaznamenat jako „Sales Order Changed“.
- Extrakce toku dokladů: Pro vybrané prodejní objednávky načtěte tabulku toku dokladů VBFA. Tato tabulka propojuje prodejní objednávky s následnými doklady, například dodávkami, pohyby zboží a fakturami. Načtěte všechny související doklady pro další zpracování.
- Extrakce událostí dodání a plnění: Pomocí čísel dodacích dokladů z VBFA načtěte z LIKP a LIPS události „Delivery Created“. Z tabulek MKPF a MSEG načtěte doklady výdeje zboží s typem pohybu '601' a zachyťte událost „Goods Issued“. Pokud je aktivní Warehouse Management, načtěte z LTAK a LTAP čas potvrzení poslední položky převodního příkazu a určete „Picking Completed“. Ve stavu hlavičky dodávky VBUK-PODAT ověřte událost „Proof of Delivery Confirmed“.
- Extrakce fakturačních a platebních událostí: Pomocí čísel fakturačních dokladů z VBFA načtěte z VBRK a VBRP události „Invoice Created“ a „Invoice Cancelled“ (kde VBRK-FKSTO = 'X'). Chcete-li zjistit „Payment Received“, propojte fakturu z VBRK s účetním dokladem v BKPF a poté v BSAD vyhledejte vyrovnávací doklad a datum vyrovnání.
- Extrakce událostí podle stavu: K odvození obchodních událostí použijte tabulky stavů VBUP (stav položky) a VBUK (stav hlavičky). Položka se například považuje za „Order Item Closed“, pokud VBUP-GBSTA = 'C'. Objednávka je „Order Cancelled“, pokud je u všech příslušných položek nastaven „Reason for Rejection“ (VBAP-ABGRU).
- Sloučení a formátování: Spojte všechny zachycené události do jedné výsledné interní tabulky. U každého záznamu události správně vyplňte všechny atributy (SalesOrder, Activity, StartTime, User atd.). Přidejte SourceSystem a časová razítka LastDataUpdate.
- Vytvoření výstupního souboru: Pomocí funkčního modulu GUI_DOWNLOAD nebo metody cl_gui_frontend_services=>gui_download exportujte výslednou interní tabulku do souboru CSV na místním počítači uživatele. Uložte soubor v kódování UTF-8.
Konfigurace
- Předpoklady: Oprávnění vývojáře ABAP, například přístup k transakci SE38, a oprávnění ke čtení všech potřebných tabulek SAP, včetně VBAK, VBAP, CDHDR, CDPOS, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG a BSAD.
- Parametry výběru: Program musí obsahovat výběrovou obrazovku s parametry pro filtrování. Důležité jsou:
- Rozsah dat: Povinné období pro datum vytvoření prodejní objednávky (VBAK-ERDAT). Začněte nedávným obdobím 3 až 6 měsíců, aby objem dat zůstal zvládnutelný.
- Prodejní organizace: Filtrujte podle VBAK-VKORG a zaměřte analýzu na konkrétní obchodní jednotky.
- Typ prodejního dokladu: Filtrujte podle VBAK-AUART. Zahrňte pouze relevantní typy objednávek, například standardní objednávky, a ostatní, například nabídky a vratky, vynechte.
- Požadavky na výkon: Extrakce z tabulek protokolu změn (CDHDR, CDPOS) a toku dokladů (VBFA) může být u velkých objemů dat velmi pomalá. Optimalizujte program tak, aby v podmínkách WHERE používal indexovaná pole. U velmi rozsáhlých extrakcí naplánujte spuštění programu jako úlohy na pozadí mimo špičku pomocí transakce SM36.
- Aktivace protokolu změn: Tato metoda využívá funkci SAP pro dokumentaci změn. Ověřte, že je protokolování změn zapnuté pro důležité datové prvky, například LIFSK, CMGST a ABGRU. Nastavení lze zkontrolovat v transakci SCDO pro objekt VERKBELEG.
Ukázkový dotaz abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
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~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM. Kroky
- Předpoklady: Zajistěte si přímý přístup k databázi SAP ECC pouze pro čtení. K připojení a spouštění dotazů budete potřebovat databázového klienta, například DBeaver, SQL Server Management Studio nebo Oracle SQL Developer.
- Získejte SQL skript: Zkopírujte celý SQL dotaz z části „query“ tohoto dokumentu.
- Připojte se k databázi: Otevřete databázového klienta a připojte se k instanci databáze SAP ECC. Budete potřebovat adresu serveru, port, název databáze a příslušné přihlašovací údaje.
- Upravte dotaz: Vložte SQL skript do nového okna editoru dotazů. V hlavním společném tabulkovém výrazu (CTE) s názvem SalesOrders najděte část s konfigurací. Nahraďte zástupné hodnoty pro počáteční datum ('{StartDate}'), koncové datum ('{EndDate}'), prodejní organizace ('{SalesOrgs}') a typy dokladů ('{DocTypes}') skutečnými hodnotami pro analýzu.
- Spusťte dotaz: Spusťte nakonfigurovaný SQL skript. V závislosti na rozsahu dat a velikosti databáze SAP může jeho dokončení trvat několik minut.
- Zkontrolujte výsledky: Po dokončení dotazu se zobrazí sada výsledků. Rychle ověřte, že obsahuje očekávané sloupce (SalesOrder, Activity, StartTime atd.) a že jsou vráceny řádky pro různé aktivity.
- Exportujte data: Pomocí funkce exportu v databázovém klientovi uložte výsledky do souboru CSV. Zvolte výstižný název, například SAP_O2C_Event_Log.csv.
- Připravte data pro ProcessMind: Otevřete soubor CSV v tabulkovém editoru. Ověřte, že názvy sloupců přesně odpovídají požadovaným atributům (například SalesOrder, Activity, StartTime). Zkontrolujte, že formát data a času ve sloupcích StartTime a LastDataUpdate je jednotný a ProcessMind ho podporuje, například YYYY-MM-DD HH:MI:SS.
- Nahrajte data do ProcessMind: Nahrajte finální upravený soubor CSV do projektu ProcessMind k analýze.
Konfigurace
- Rozsah dat: Dotaz používá zástupné hodnoty ('{StartDate}' a '{EndDate}') k filtrování prodejních objednávek podle data vytvoření (VBAK.ERDAT). Obvyklé období analýzy je 3 až 6 měsíců. Získáte tak reprezentativní vzorek a zároveň zbytečně nezatížíte databázi.
- Filtr prodejní organizace: Pomocí zástupné hodnoty '{SalesOrgs}' omezte extrakci na konkrétní prodejní organizace, například '1000' nebo '2000'. Analýza se tak zaměří na potřebnou oblast a dotaz poběží rychleji.
- Filtr typu dokladu: Pomocí zástupné hodnoty '{DocTypes}' vyberte konkrétní typy prodejních objednávek, například 'OR' pro standardní objednávku. Z hlavního průběhu procesu tak vyloučíte nerelevantní doklady, například bezplatné dodávky nebo vratky.
- Identifikátor zdrojového systému: Zástupná hodnota '{SourceSystemName}' je pevně uvedena ve skriptu a označuje systém původu každého záznamu. Nahraďte ji výstižným názvem své instance SAP ECC, například SAP_ECC_PRD.
- Kompatibilita s databází: Funkce pro spojení polí data a času, [Your DB-specific timestamp function], je pouze zástupný text. Nahraďte ji správnou funkcí pro svou databázi, například TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS') pro SAP HANA nebo CAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME) pro SQL Server.
- Předpoklady: Tato metoda vyžaduje přímé přihlašovací údaje k databázi s oprávněním pouze pro čtení. Databázový uživatel musí mít oprávnění k přístupu ke všem tabulkám uvedeným v dotazu, včetně VBAK, VBAP, VBFA, CDHDR, CDPOS, LIKP, VBRK a BSAD.
Ukázkový dotaz sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''; Chcete začít?
Využijte tuto šablonu dat a získejte lepší přehled o procesu od objednávky k inkasu při zpracování prodejních objednávek. Začněte zvyšovat efektivitu a urychlovat peněžní tok.
Optimalizujte zpracování prodejních objednávek od objednávky k inkasu
Odstraňte úzká místa, zkraťte dobu průchodu o 30 % a rychle zlepšete peněžní tok.
Platební kartu nepotřebujete. Nastavení zabere jen několik minut.