Definície zostáv - Pamäťové tabuľky

Jedným z prvkov, ktoré si môžete v rámci tlačových zostáv zaviesť a v definícii zostáv potom využívať sú pamäťové tabuľky. Pamäťovú tabuľku s výhodou použijete napr. typicky v nasledovných prípadoch:

  • tlače účtovného denníka so sumárom na konci zostavy, kde sumár vzniká priebežným súčtovaním spracovaných a tlačených viet
  • tlače účtovného denníka súvzťažne, so sumárom za každú tlačenú súvzťažnú skupinu
  • tlač prehľadového sumára napr. na konci dokladu o skladových položkách použitých v riadkoch daného dokladu
  • a všetky podobné tlače charakteru rôznych napočítaných sumárov zo záznamov tlačených v danej tlačovej zostave

Riešenie týchto prípadov prostredníctvom SQL dopytov by vo väčšine prípadov bolo príliš komplikované alebo až nereálne.

Pamäťovú tabuľku si môžeme predstaviť, ako typickú tabuľku s riadkami a stĺpcami. Pamäťovú tabuľku si nadefinujete pomocou funkčného tlačidla na definíciu pamäťových tabuliek v editore tlačových zostáv. Po jeho stlačení sa ponúkne dialógové okno na definíciu tabuľky:

Príklad modálneho dialógu pre definíciu pamäťovej tabuľky v zostave Účtovný denník.

V ľavej časti definičného okna je k dispozícii zoznam pamäťových tabuliek nadefinovaných pre danú tlačovú zostavu, pričom pomocou funkčných tlačidiel Nová a Zmazať si môžete nadefinovať ďalšie, prípadne súčasné zmazať.

Názov Popis
Názov tabuľky Názov, cez ktorý sa potom na danú tabuľku odkazuje definícia tlač. zostavy.
Popiska pre zobrazenie Názov, pod ktorým sa daná tabuľka ponúka v zozname dostupných dátových položiek objektu.

V pravej časti potom definujete dátové stĺpce aktuálnej tabuľky z ľavej časti.

Názov Popis
Názov stĺpca Názov, cez ktorý sa potom na danú položku odkazuje definícia tlač. zostavy.
Popiska pre zobrazenie Názov, pod ktorým sa daná položka ponúka v zozname dostupných dátových položiek objektu.
Typ Zo skrytého zoznamu vyberiete, akého je položka typu.
Triedenie Môžete nadefinovať, či má byť tabuľka triedená a ako. Triedená bude podľa položky (stĺpca), na ktorej v okamihu nastavenia triedenia stojí kurzor, položka bude potom zvýraznená tučne.
Pomocou týchto tlačidiel je možné meniť poradie stĺpcov.

Pokiaľ je tabuľka nadefinovaná, je k dispozícii rovnakým spôsobom ako všetky ostatné tabuľky, resp. jej položky sú k dispozícii rovnakým spôsobom ako sú dátové položky zdrojov dát nadefinovaných v DynSQL. Objasníme na príklade:

Príklad: Máme tlačovú zostavu na tlač účtovného denníka, v ktorej chceme v závere uviesť tlač prehľadového sumára obratov na jednotlivých účtoch, teda tabuľku účtov a ku každému obrat MD a obrat D, napočítaný z tlačených záznamov z denníka nad tým. Teda nadefinujeme si pamäťovú tabuľku napr. s názvom MT_SUM a popiskou Sumy a so stĺpcom Account, podľa ktorého budeme radiť, a ďalej stĺpcami Credit a Debet. Potom v definícii zostavy sa tieto položky budú ponúkať štandardne ako dátové položky objektu:

Nadefinované položky pamäťovej tabuľky sa ponúkajú ako dátové položky, ktoré sú v danej tlačovej zostave k dispozícii

Ďalej si napr. prostredníctvom scriptu nadefinovanom na pruhu Detailu definujeme, ako sa budú hodnoty tabuľky v priebehu tlače plniť:

NXVALUECREATE('X'); {vytvoření proměnné X}
NXMTFIND('MT_SUM','MT_SUM.Account=MAIN.CREDITACCOUNT_ID.CODE'); {dohledání, zda tabulka už daný účet obsahuje, zastaví se na prvním vyhovujícím záznamu}
IF(NXMTEOF('MT_SUM'),NXVALUESET('X',1),NXVALUESET('X',0)); {nastavení hodnoty proměnné X, podle toho, zda je aktuální záznam tabulky poslední}
IF(NXVALUEGET('X')=1,NXMTAPPEND('MT_SUM'),0); {podmíněné přidání záznamu do tabulky v závislosti na hodnotě X}
IF(NXVALUEGET('X')=1,NXMTSET('MT_SUM','Account',MAIN.CREDITACCOUNT_ID.CODE),0); {zapsání kódu účtu D do položky Account v závislosti na hodnotě X}
NXMTSET('MT_SUM','Credit',MAIN.Amount + NXMTGET('MT_SUM','Credit')); {povýšení částky D aktuálního záznamu v tabulce}
NXMTFIND('MT_SUM','MT_SUM.Account=MAIN.DEBITACCOUNT_ID.CODE');{povýšení částky MD aktuálního záznamu v tabulce}
IF(NXMTEOF('MT_SUM'),NXVALUESET('X',1),NXVALUESET('X',0));{jako výše pro účet D}
IF(NXVALUEGET('X')=1,NXMTAPPEND('MT_SUM'),0); {jako výše pro účet D}
IF(NXVALUEGET('X')=1,NXMTSET('MT_SUM','Account',MAIN.DEBITACCOUNT_ID.CODE),0); {jako výše pro účet D}
NXMTSET('MT_SUM','Debit',MAIN.Amount + NXMTGET('MT_SUM','Debit')); {jako výše pro účet D}
NXVALUEDESTROY('X'); {jako výše pro účet D}

A na záver zostáva si pamäťovú tabuľku už len vytlačiť, tzn. na pripojený pruh pod pruh Detail s tlačou účtovných záznamov, prípadne ešte pod iný Pripojený pruh s nadpismi, si môžeme napr. definovať MT_SUM.Account, NxMTGet('MT_SUM','Debit'), NxMTGet('MT_SUM','Credit') a ich rozdiel. Výsledná tlač potom môže vyzerať nasledovne:

Príklad tlače s využitím pamäťovej tabuľky

Potom môžeme položky nadefinovanej tabuľky následne využívať v definícii tlačovej zostavy prostredníctvom funkcií, ktoré sú k dispozícii pre prácu s tabuľkami, viď Editor výrazov, časť Funkcie.

Na vlastné umiestenie tabuľky v zostave je potrebné si uvedomiť ešte nasledujúce: v zostave je vždy len jeden pruh (band) hlavný - Detail, cez ktorý sa tlačia vety z "hlavnej" tabuľky. Preto je potrebné pamäťovú tabuľku umiestniť na pripojený pruh.

Pokiaľ chcete použiť tabuľku v jednej zostave opakovane (napr. po tlači každej skupiny účtovných viet z denníka vytlačiť súhrnné sumáre za danú skupinu), je potrebné použiť opakovací pruh a stanoviť mu počet opakovaní, a to tak, aby sa odvodilo od počtu spracovaných blokov.

V týchto prípadoch použitia nesmiete zabudnúť po každej tlači pamäťovú tabuľku vynulovať (aby sa údaje za ďalšiu skupinu sumovali znovu od nuly).