Občerstvovanie v číselníkoch, cacheovanie (kešovanie) číselníkov

Ako bolo objasnené v kapitole popisujúcej technológiu spracovania dát, systém ABRA Gen ako databázová klient/server aplikácia, má dáta spravované samostatným databázovým serverom. Pri práci s dátami je teda nutné komunikovať s databázovým serverom prostredníctvom tzv. SQL dopytov, príslušné dáta sa potom ukladajú z databázy do pamäte klientskeho počítača a naopak.

Keďže číselníky užívateľ používa na zadávanie, vyberanie hodnôt atď. a to opakovane a často, pričom niektoré z nich môžu byť aj veľmi rozsiahle - napr. Adresár firiem, Zoznam skladových kariet a pod., nebolo by žiaduce, aby pri každom vyvolaní číselníka prebiehal príslušný dopyt do databázy a aby sa na klientsku aplikáciu, tzn. k užívateľovi, zakaždým odovzdávali celé číselníky znovu. Takýto postup by neúnosne spomalil prácu so systémom. Preto sa takmer všetky číselníky nejakým spôsobom držia v pamäti, tzv. "cacheované". (Kešované.)

Číselník sa do pamäte načíta:

  • buď celý - vo väčšine prípadov
  • alebo len jeho časť - iba v prípade číselníkov podporujúcich Skupiny záznamov, ak je nejaká skupina zvolená

    V niektorých vybraných číselníkoch, ako je napr. číselník Skladových kariet, Skladov a Firiem, sa kvôli urýchleniu cacheujú nielen dáta, ale aj vizuálny vzhľad daného číselníka.

Tzn., že pri prvej potrebe daného číselníka prebehne príslušný SQL dopyt na databázový server a záznamy príslušného číselníka alebo jeho časti (zodpovedajúcej skupine záznamov) sa načítajú do pamäte počítača, na ktorom beží klientska aplikácia. Tento číselník (celý alebo jeho časť) sa potom uchováva v pamäti (je cacheovaný) a odtiaľ sa používa pri ďalšom vyvolaní, neprebieha teda nový dopyt do databázy.

Číselník sa do pamäte nemusí nutne načítať len pri prvom vyvolaní z číselníkovej položky. Niektoré číselníky sa naopak načítajú do pamäte automaticky pri prvom spustení agendy , ktorá s nimi pracuje (resp. prvom príkaze do databázy z tejto agendy), ako už bolo spomenuté v kapitole o spúšťaní agend systému.

Klientska aplikácia potom pracuje s dátami, ktoré má načítané v pamäti. Táto technológia má však drobnú nevýhodu:

  • bez ručného zásahu užívateľa (vyvolanie občerstvenia) nie je možné premietnuť zmeny, ku ktorým mohlo medzitým v databáze dôjsť
  • existencia kolízií

Ako bolo uvedené vyššie, číselník sa pri svojom prvom použití načíta z databázy do pamäte počítača (celý alebo podľa zvolenej skupiny záznamov), je obmedzený len prístupovými právami. Pri jeho ďalšom vyvolaní sa ponúka podľa stavu v pamäti. Medzitým ale môže dôjsť k zmene dát v databáze:

  • Pridáme, opravíme alebo zmažeme nejaký zo zobrazených záznamov v číselníku. Táto zmena sa prejaví ihneď jednak v aktuálne otvorenom číselníku, ale aj pri jeho ďalšom vyvolaní v rámci rovnakého okna. Zobrazený číselník teda zodpovedá stavu v pamäti aj aktuálnemu stavu databázy. Nepremietne sa jedine v agende, ktorá už bola v okamihu zmeny otvorená. Objasníme na príklade:

    Príklad 1: Majme v pamäti načítaný číselník zákaziek, nech je v ňom zákazka Z1-zákazka1 a Z2-zákazka2. Otvoríme agendu zákaziek a potom ešte jednu agendu zákaziek (v tom istom okne aplikácie). V jednej z nich uskutočníme napr. opravu Z1 na ZX-zákazkaX. Ak vyvoláme agendu zákaziek aj tretíkrát (napr. z riadkov faktúry), zobrazí sa aktuálny stav, tzn. so zákazkou ZX.

    Pokiaľ prepneme do druhej otvorenej agendy zákaziek, zmenu tam nevidíme, tzn. je tam stále zákazka Z1 a to až do občerstvenia. (V prípade číselníkov stačí vykonať občerstvenie len v jednej z otvorených agend číselníka v rámci jedného okna aplikácie, občerstvenie sa premietne do všetkých).

    Novo pridaný alebo opravený záznam je v číselníku zobrazený tučne a to až do okamihu vykonania občerstvenia, aby bolo zrejmé, že niektoré zo zobrazených záznamov boli opravené alebo novo pridané.

  • Pridanie, zmazanie alebo opravu niektorého z nami zobrazených dokladov vykoná iný užívateľ v sieti, resp. niektorú z akcií vykonáme my, ale z agendy otvorenej v samostatnom okne aplikácie. Zobrazený číselník potom síce zodpovedá stavu v pamäti, ale nezodpovedá aktuálnemu stavu v databáze. Objasníme na príklade:

    Príklad 2: Majme v pamäti načítaný číselník zákaziek, nech je v ňom zákazka Z1-zákazka1 a Z2-zákazka2. Medzitým napr. iný užívateľ v sieti opraví zákazku Z1 na ZY. Nám sa ale táto zmena neprejaví (zobrazujeme stav predtým načítaný do pamäte). Podobne každé ďalšie otvorenie zákaziek bude zobrazovať stále stav v pamäti, tzn. stále sa ponúka zákazka Z1 a môžeme ju použiť.

Na riešenie takýchto situácií slúži funkcia Občerstviť (F11), takže najskôr zoznam občerstvíme a budeme tak mať k dispozícii aktuálny stav presne tak, ako je v databáze SQL servera. Po stlačení funkcie Občerstviť systém vykoná znovu SQL dopyt podľa aktuálneho obmedzenia na databázový server a načítanie do pamäte z databázy.

Za účelom tlače však nie je nutné Občerstvovať číselník pred samotnou tlačou, naopak je rýchlejšie rovno použiť jednu z možností, ktoré ponúka funkcia Tlač.

Pozor, ak došlo napr. k zmazaniu nejakého nami zobrazovaného záznamu z inej stanice a nevykonali sme občerstvenie, tak sa nám takýto záznam v zozname stále zobrazuje, aj keď je invalidný (neplatný). Potom platí:

  • Keď kurzor stojí na takomto neplatnom objekte, nie je dovolené pre tento záznam prepínať záložky. Ak stojíte na inej záložke ako Zoznam, dôjde k prepnutiu na záložku Zoznam (ide o záložky na úrovni záložky Zoznam).
  • Ak kurzor stojí na takomto neplatnom objekte a vyvolá sa funkcia Občerstviť, neprebehne synchronizácia pozície kurzora so stavom pred občerstvením (nie je to možné) a kurzor sa bude nachádzať na začiatku zoznamu.

Pre používanie číselníkov v číselníkových položkách platí nasledujúce:

  • V číselníkových položkách sa nepamätajú konkrétne hodnoty z číselníka, ale iba odkazy na tieto hodnoty prostredníctvom tzv. interných identifikátorov ID (vnútorný kód programu, ktorý je pre užívateľa neprístupný)
  • Keď zobrazujeme alebo opravujeme doklad, na ktorom je nejaká číselníková položka, zobrazí sa jej kód (názov alebo iná hodnota), ktorý je pre daný identifikátor uvedený v číselníku aktuálne načítanom v pamäti. Objasníme na príkladoch:

    Príklad 3: Majme načítaný číselník zákaziek, nech je v ňom zákazka Z1. Medzitým však napr. iný užívateľ v sieti zmenil kód zákazky Z1 na "ZX". Zobrazujeme faktúru vystavenú na zákazku Z1, v riadkoch faktúry je zobrazený kód Z1. Keď číselník zákaziek občerstvíme a zobrazíme faktúru znovu, bude v riadkoch zobrazený už kód ZX.

    Príklad 4: Majme načítaný číselník zákaziek, nech je v ňom zákazka Z1. Medzitým však napr. iný užívateľ v sieti zmenil kód zákazky Z1 na "ZX". Opravujeme faktúru vystavenú na zákazku Z1, v položke zákazka sa stále ponúka kód Z1 (kód ZX ani nie je možné zadať, kým sa číselník neobčerství) a s kódom Z1 sa uloží aj prípadná oprava faktúry. (To však neprekáža, pretože na faktúre sa nepamätá priamo kód zákazky, ale jej interný identifikátor, pre užívateľa neprístupný, a ten sa nezmenil.) Keď číselník zákaziek občerstvíme a opravíme faktúru znovu, bude v riadkoch zobrazený už kód ZX.

    Príklad 5: Majme načítaný číselník zákaziek, nech je v ňom zákazka Z1. Medzitým však iný užívateľ v sieti zmazal zákazku Z1, Z1 zatiaľ nie je použitá, a preto je ju možné úplne zmazať. Nemáme občerstvený číselník a vystavujeme faktúru na Z1. Zákazka sa ponúka a je ju možné vybrať (číselník nebol občerstvený), no pri uložení faktúry program zistí, že zákazka Z1 s príslušným interným identifikátorom už v databáze neexistuje, túto skutočnosť ohlási a uloženie takéhoto dokladu nepovolí.)

    Príklad 6: Majme načítaný číselník zákaziek, nech je v ňom zákazka Z1. Medzitým však iný užívateľ v sieti zmazal zákazku Z1, Z1 je však už použitá na doklade, nie je ju teda možné zmazať úplne, je len skrytá. Opravujeme faktúru vystavenú na zákazku Z1. Občerstvíme si číselník. Na faktúre je uvedená zákazka Z1. Keď na položke zákazka vyvoláme číselník, zákazka Z1 sa v ňom na výber už neponúka, ak položku zákazka neopravujeme, zostane na faktúre po uložení zákazka Z1 (čo je v poriadku, na faktúre je zákazka, ktorá na nej bola zadaná, aj keď teraz už neexistuje).

    Príklad 7: Majme načítaný číselník zákaziek, nech je v ňom zákazka Z1. Medzitým však iný užívateľ v sieti zmazal zákazku Z1, Z1 je však už použitá na doklade, nie je ju teda možné zmazať úplne, je len skrytá. Vystavujeme novú faktúru na zákazku Z1. Ale neobčerstvíme si číselník, takže je možné zákazku Z1 vybrať a uložiť. (Identifikátor zákazky Z1 v databáze existuje, pretože nie je zmazaná, ale len skrytá, takže takúto faktúru je možné uložiť).
    Podobne, ak nemáme občerstvený číselník a iný užívateľ napr. zákazku uzavrie.

Situáciám popísaným v poslednom príklade predídete, keď si budete dáta priebežne občerstvovať!