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).