Definice sestav - Paměťové tabulky
Jedním z prvků, které si můžete v rámci tiskových sestav zavést a v definici sestav pak využívat jsou paměťové tabulky. Paměťovou tabulku s výhodou použijete např. typicky v následujících případech:
- tisky účetního deníku se sumářem na konci sestavy, kde sumář vzniká průběžným součtováním zpracovaných a tisknutých vět
- tisky účetního deníku souvztažně, se sumářem za každou tištěnou souvztažnou skupinou
- tisk přehledového sumáře např. na konci dokladu o skladových položkách použitých v řádcích daného dokladu
- a všechny podobné tisky charakteru různých napočítaných sumářů ze záznamů tisknutých v dané tiskové sestavě
Řešení těchto případů prostřednictvím SQL dotazů by ve většině případů bylo příliš komplikované nebo až nereálné.
Paměťovou tabulku si můžeme představit, jako typickou tabulku s řádky a sloupci. Paměťovou tabulku si nadefinujete pomocí funkčního tlačítka pro definici paměťových tabulek v editoru tiskových sestav. Po jeho stisku se nabídne dialogové okno pro definici tabulky:
Příklad modálního dialogu pro definici paměťové tabulky v sestavě Účetní deník.
V levé části definičního okna je k dispozici seznam paměťových tabulek nadefinovaných pro danou tiskovou sestavu, přičemž pomocí funkčních tlačítek Nová a Smazat si můžete nadefinovat další, případně stávající smazat.
Název | Popis |
---|---|
Název tabulky | Název, přes který se pak na danou tabulku odkazuje definice tisk.sestavy. |
Popiska pro zobrazení | Název, pod kterým se daná tabulka nabízí v seznamu dostupných datových položek objektu. |
V pravé části pak definujete datové sloupce aktuální tabulky z levé části.
Název | Popis |
---|---|
Název sloupce | Název, přes který se pak na danou položku odkazuje definice tisk.sestavy. |
Popiska pro zobrazení | Název, pod kterým se daná položka nabízí v seznamu dostupných datových položek objektu. |
Typ | Ze skrytého seznamu vyberete, jakého je položka typu. |
Třídění | Můžete nadefinovat, zda má být tabulka tříděna a jak. Tříděna bude podle položky (sloupce), na níž v okamžiku nastavení třídění stojí kurzor, položka bude poté zvýrazněna tučně. |
Pomocí těchto tlačítek lze měnit pořadí sloupců. |
Pokud je tabulka nadefinována, je k dispozici stejným způsobem jako všechny ostatní tabulky, resp. její položky jsou k dispozici stejným způsobem jako jsou datové položky zdrojů dat nadefinovaných v DynSQL. Objasníme na příkladu:
Příklad: Mějme tiskovou sestavu pro tisk účetního deníku, v níž chceme v závěru uvést tisk přehledového sumáře obratů na jednotlivých účtech, tedy tabulku účtů a ke každému obrat MD a obrat D, napočtený z tištěných záznamů z deníku nad tím. Tedy nadefinujeme si paměťovou tabulku např. s názvem MT_SUM a popiskou Sumy a se sloupci Account, podle něhož budeme řadit, a dále sloupci Credit a Debet. Pak v definici sestavy se tyto položky budou nabízet standardně jako datové položky objektu:
Nadefinované položky paměťové tabulky se nabízejí jako datové položky, které jsou v dané tiskové sestavě k dispozici
Dále si např. prostřednictvím scriptu nadefinovaném na pruhu Detailu definujeme, jak se budou hodnoty tabulky v průběhu tisku plnit:
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ávěr zbývá si paměťovou tabulku už jen vytisknout, tj. na připojený pruh pod pruh Detail s tiskem účetních záznamů, případně ještě pod jiný Připojený pruh s nadpisy, si můžeme např. definovat MT_SUM.Account, NxMTGet('MT_SUM','Debit'), NxMTGet('MT_SUM','Credit') a jejich rozdíl. Výsledný tisk pak může vypadat následovně:
Příklad tisku s využitím paměťové tabulky
Pak můžeme položky nadefinované tabulky následně využívat v definici tiskové sestavy prostřednictvím funkcí, které jsou k dispozici pro práci s tabulkami, viz Editor výrazů, část Funkce.
Pro vlastní umístění tabulky v sestavě je třeba si uvědomit ještě následující: v sestavě je vždy jen jeden pruh (band) hlavní - Detail, přes který se tisknou věty z "hlavní" tabulky. Proto paměťovou tabulku je třeba umístit na připojený pruh.
Pokud chcete použít tabulku v jedné sestavě opakovaně (např. po tisku každé skupiny účetních vět z deníku vytisknout souhrnné sumáře za danou skupinu), pak je třeba použít opakovací pruh a stanovit mu počet opakování, a to tak, aby se odvodilo od počtu zpracovaných bloků.
V těchto případech použití nesmíte zapomenout po každém tisku paměťovou tabulku vynulovat (aby se údaje za další skupinu sumovaly od znovu od nuly).