Napojením vlastního e-shopu na účetnictví ABRA Flexi jsme se již zabývali v samostatném článku. Tentokrát si upřesníme, jak z ABRA Flexi přenášet do e-shopu aktuální stav skladu. Pokud totiž příjemky a výdejky evidujete pouze v účetnictví a e-shop je neřeší, je to nejlepší způsob, jak získat jasnou informaci o tom, kolik, jakého zboží lze v e-shopu prodat. Jak tedy stav skladu správně načíst?
Možností je hned několik. Většina e-shopů má v ABRA Flexi zaveden samostatný sklad. Většinou to bývá sklad hlavní. Pokud má firma i kamenné prodejny, každá z nich má svůj vlastní sklad. Převody zboží na prodejny a z nich se pak řeší převodkami ze skladu e-shopu. Po každém pohybu (příjem i výdej) se tedy e-shop musí dozvědět, že se stav určitého zboží snížil nebo zvýšil.
Stav skladu k datu
První možností je využití evidence stavu skladu k datu. Jedná se sice o přesný, nicméně málo efektivní způsob. Je sice schopen spočítat stav skladu přesně ke konkrétnímu dni, ale to většinou není potřeba. Bohužel je v porovnání s ostatními způsoby pomalý. I když použijete detail custom jen na to, co vás zajímá, získání reálných výsledků trvá velmi dlouho.
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 však přesně to, co pro e-shop potřebujete – záznamy obsahující ceník a stav skladu. Celková velikost json souboru, který Flexi vygenerovalo, je 6 MB. Je sice možné spustit stránkování, ale tedy moc nepomůže.
Pozor také na to, že s každým dalším měsícem v roce 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řebujete 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
Dotaz trvá kolem 35 vteřin a vygeneruje také 6 MB 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“ zvýší se čas až na tři minuty!
Skladové karty se zůstatkem
Počet načítaných skladových karet lze ještě omezit. Není totiž nutné načítat karty s nulovým nebo záporným zůstatkem. Většina e-shopů nemá veškeré produkty skladem a velká část sortimentu je dostupná na objednávku. Takže stačí načíst 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 je i pět vteřin příliš dlouhá doba, existuje ještě poslední možnost. Vytvořit si ve Flexi 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 = <> and k.idskladu = <>
Tento dotaz je následně 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 má velikost 1,1 MB.
Uživatelský dotaz – varianta „jen nenulové“
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 = <> and k.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,7 s).
Výsledek obsahuje všechny potřebné informace a vygenerovaný json má velikost 145 kB. Takto malý soubor se celkem snadno a rychle přenáší a zpracovává. Takže i paměťová náročnost na straně e-shopu je minimální.
Resumé
Pokud vlastníte licenci povolující Uživatelské dotazy, nebojte se je využívat. Dokážete tak maximálně zrychlit odezvy hledání i minimalizovat výsledky. Pokud ji nevlastníte, je stále možné dostat se na celkem slušné výsledky s využitím standardní API evidence skladových karet. Zamyslete se však nad tím, zda by Vám uživatelské dotazy nemohly zpříjemnit a zefektivnit práci.
Poznámka:
Všechna měření byla prováděna na localhostu na stále stejné firmě. Do firmy během testování nepřibyl žádný záznam. Ceník obsahoval 30 000 záznamů. Celkový počet skladových karet pro účetní období, které nás zajímalo byl 100 000 (celkem jich bylo 500 000) a zůstatek byl na 5000 kartách.