Je několik možností jak se dopracovat ke kýženému výsledku a mít jasnou informaci o tom, kolik jakého zboží je možné na eshopu prodat.
Většina eshopů má ve FlexiBee zaveden samostatný sklad. Většinou to bývá hlavní sklad a pokud má firma i kamenné prodejny tak každá z nich má sklad svůj vlastní. Převody zboží na a z prodejen se pak převodkami ze skladu eshopu.
Po každém pohybu (příjem i výdej) se tedy eshop musí dozvědět, že se stav nějakého zboží snížil nebo zvýšil. Nikdo totiž nechce, aby bylo přes eshop možné koupit nějaký produkt, který již není skladem a jeho případné sehnání může být problém.
Stav skladu k datu
První možností jak zjistit stav skladu pro eshop je využití evidence stav skladu k datu. Dle mého názoru je to nejhorší možný způsob. Stav skladu k datu je totiž sice schopen spočítat stav skladu přesně ke konkrétnímu dni, ale to většinou není potřeba. Navíc tento dotaz v porovnání s ostatními není zrovna z nejrychlejších. I když použijeme detail custom jen na to co nás zajímá, tak se reálných výsledků dočkáme zadlouho.
http://localhost:5434/c/muj_eshop/stav-skladu-k-datu.json?sklad=4&detail=custom:cenik,stavMJ&limit=0
Tento první pokus o načtení stavu skladu trval v průměru 2 minuty a 20 vteřin na 30 000 záznamech. Ani zdaleka se tedy nejedná o optimální řešení. Vrátil ale přesně to co pro eshop potřebujeme. Záznamy obsahující ceník a stav skladu. Celková velikost json souboru, který FlexiBee vygenerovalo je 6MB. Ano je možné spustit stránkování, ale tedy moc nepomůže.
Pozor také na to, že jsem měření prováděl začátkem března a tedy v letošním roce ještě není moc pohybů na skladových kartách. S každým dalším měsícem ale bude počet pohybů růst a celkový čas potřebný na získání dat se bude zhoršovat.
Skladové karty
Další možností jak získat aktuální stav skladu jsou skladové karty pro aktuální účetní období. Jedná se tedy o dvojici dotazů. Prvním potřebujeme zjistit ID aktuálního účetního období. Tato informace se ale celé účetní období (celý rok) nemění a není tedy potřeba ji načítat při každém dotazu na stav skladu.
Druhý dotaz pak vypadá takto:
http://localhost:5434/c/muj_eshop/skladova-karta/(ucetObdobi = 6 and sklad = 4).json?detail=custom:cenik,stavMJ&limit=0&no-ext-ids=true
Tady už začíná být všechno zajímavější. Dotaz trvá kolem 35 vteřin a vygeneruje také 6MB velký json. Opět je možné spustit stránkování, ale spíš jen z důvodu zpracovávání menších souborů.
Pozor, pokud se nepoužije parametr no-ext-ids=true bude čas kolem 3 minut!
Skladové karty se zůstatkem
Nač budeme na eshop přenášet skladové karty, které mají nulový nebo záporný zůstatek? Vždyť přeci většina eshopů nemá všechny produkty skladem a velká část sortimentu je na objednávku. Takže nám vlastně stačí jen skladové karty, které mají kladný zůstatek. O všech produktech, které se nevyskytují ve výsledku víme, že nejsou skladem a můžeme tedy stav skladu nastavit na 0.
http://localhost:5434/c/muj_eshop/skladova-karta/(ucetObdobi = 6 and sklad = 4 and stavMJ > 0).json?detail=custom:cenik,stavMJ&limit=0&no-ext-ids=true
Výsledný json velký necelý 1 MB je vygenerován za 5 vteřin.
To je již celkem zásadní rozdíl oproti původním několika minutám 🙂.
Uživatelský dotaz – varianta všechno
Pokud i 5 vteřin je moc dlouho tak existuje ještě poslední možnost. Vytvořit si ve FlexiBee uživatelský dotaz, který umí být ještě rychlejší.
Dotaz bude vypadat takto:
select c.kod, k.stavMj from skarty k
left join ccenik c on c.idcenik = k.idcenik
where k.iducetobdobi = <<iducetniobdobi>>
and k.idskladu = <<idskladu>>
Tento dotaz pak je možné samozřejmě přes REST API spustit a získat výsledky.
http://localhost:5434/c/muj_eshop/uzivatelsky-dotaz/35/call.json?iducetniobdobi=6&idskladu=4&limit=0
Jednoduchým uživatelským dotazem jsme schopni za 5 vteřin získat kompletní stav skladu pro všechny záznamy v ceníku ať je jejich stav jakýkoliv (nulový nebo nenulový). Další výhodou je, že výsledný json je "jen" 1,1 MB velký.
Uživatelský dotaz – varianta jen nenulové
Standardním dotazem na API skladových karet získáme potřebná data za 5 vteřin respektive za 35 podle toho zda nám stačí nenulové nebo chceme mít data komplet.
Pro kompletní data je možné dostat se uživatelským dotazem na 5 vteřin s výrazně menším jsonem.
Co když ale dotaz lehce modifikujeme a necháme si vrátit jen nenulové stavy?
select c.kod, k.stavMj from skarty k
left join ccenik c on c.idcenik = k.idcenik
where k.iducetobdobi = <<iducetniobdobi>>
and k.idskladu = <<idskladu>>
and stavMJ > 0.0
Volání je stejné jako v předchozím případě.
http://localhost:5434/c/muj_eshop/uzivatelsky-dotaz/35/call.json?iducetniobdobi=6&idskladu=4&limit=0
A čas? Kolem 700ms (0,7s 🙂 ). To už by se skoro dalo načítat pro každý požadavek 🙂.
Výsledek obsahuje všechny potřebné informace a vygenerovaný json je jen 145kB velký. Takto veliký soubor se bude celkem snadno a rychle přenášet a zpracovávat. Takže i paměťová náročnost na straně eshopu bude minimální.
Resumé 🙂
Pokud vlastníte licenci povolující Uživatelské dotazy nebojte se je využít v případě, že se Vám časy získání výsledku nelíbí. Také v případě, že potřebujete minimalizovat výsledek je Uživatelský dotaz více než vhodný.
Pokud licenci na Uživatelské dotazy nevlastníte zamyslete se nad tím, zda by Vám toto rozšíření nemohlo pomoci. Pokud se ale rozhodnete, že není potřeba je stále možné se dostat na celkem slušné výsledky (5 vteřin) s využitím standardní API evidence skladových karet.
Všechna měření jsou prováděna na localhostu na stále stejné firmě. Do firmy během testování nepřibyl žádný záznam. Ceník obsahuje 30 000 záznamů. Celkový počet skladových karet pro účetní období, které nás zajímá je 100 000 (celkem jich je 500 000) a zůstatek je na 5000 kartách.
Způsob | Čas (s) | Velikost (MB) |
---|---|---|
Stav skladu k datu | 140 | 6 |
Skladové karty | 35 | 6 |
Skladové karty se zůstatkem | 5 | 1 |
Uživatelský dotaz – varianta všechno | 5 | 1.1 |
Uživatelský dotaz – varianta jen nenulové | 0.7 | 0.145 |