kb:artikli:optimizacija_po_vazecem_periodu_main

This is an old revision of the document!


Algoritam "važećeg perioda" (optmizacija)

Autor: Milan Oparnica (14.07.2009)

Algoritam iza zadatak da ukloni sledeća uska grla kod određivanja prodajne i cene koštanja:

  1. Utvrđivanje važećih cena prilikom izrade konkretnog dokumenta (na dan)
  2. Određivanje početne vrednosti za potrebe ažuriranje cena
  3. Utvrđivanje otpremnica i računa sa netačnim srednjim cenama i njihova ispravka

Standardni algoritam je uvek polazio od početnog stanja i obrađivao sve promene do kraja. Postojale su dve verzije, svi artikli, ili artikli po nekom dokumentu, pri čemu ova poslednja verzija nije pokretana u slučaju da dokument obuhvata više od 300 promena. Dakle program bi uvek povukao sve promene od početka godine što u slučaju velikih baza podataka nije bilo izvodljivo.

Algoritam se oslanja na upotrebu LagerNaDanX metoda za dobijanje “početnog stanja” cena i količina prilikom obrade konkretnog dokumenta ili svih artikala i skladišta. Na taj način, nema potrebe da se obrađuju hiljade slogova već samo slogovi od datuma dokumenta do kraja perioda. U slučaju da se vrši obrada svih artikala i skladišta obrada se vrši od nekih “check-point” tačaka do kraja perioda.

Oslanja se na upit CS_OtpremniceUlazi koji pokušava da spoji otpremnice i ulaze sa validnim cenama za period u kom je otpremnica izdata.
Upitu je potrebno preko 20 min da vrati rezultat na srednjim (>300MB) i večnost na velikim bazama (>1GB).

Uočio sam da je glavni problem u nedostatku efikasne strukture kroz koju bi lako određivao periode u kojim određena srednja ili prodajna cena važe za određeni artikal i određeno skladište.
Tabela SasUlaz se pokazala najzgodnijom za uvođenje ove strukture, koju sam nazvao “Struktura važećeg perioda cena”, ili kraće struktura “važećeg perioda”.

Realizacija strukture "važećeg perioda"

Strukturu čine tri polja u tabeli SasUlaz

PoljeTipSvrha
VazOdINTEGERCelobrojno polje koje predstavlja datum početka perioda za koji srednja i prodajna cena u slogu SasUlaz važi.
VazDoINTEGERCelobrojno polje koje predstavlja datum kraja perioda (ne uključujući dan unet u VazDo) od kog srednja i prodajna cena u slogu SasUlaz više ne važi.
VazDTSDOUBLEDuplikat DTStamp polja iz Ulaz tabele kako bi se izbegao nepotreban JOIN u upitima koji će vraćati rezulate strukture.

Primeri su dati nad sledećim vrednostima (#m/dd/yyyy#):
39875 - brojčana vrednost datuma #3/3/09#
39885 - brojčana vrednost datuma #3/13/09#
401769 - brojčana vrednost datuma #1/1/3000#

Sledeće kombinacije vrednosti ovih polja za isti ElID i SklID sloga SasUlaz su ispravne:


VazOd

VazDo

Opis situacije

39875

401769

Ovo je normalno kod prvog i jedinog ulaza artikla koji tada važi od datuma ulaza do kraja (1/1/3000)
  • kb/artikli/optimizacija_po_vazecem_periodu_main.1557684907.txt.gz
  • Last modified: 2019/05/12 18:15
  • by milano