3. Podpora ”inteligentních” výstupních sestav

3.1 Skrývání položek a oblastí výstupní sestavy

Při tvorbě jedné z aplikací jsme se setkali s dosti komplikovaným požadavkem. Do výstupní sestavy byly zařazeny jednotlivé kusy majetku, přitom ale k některým kusům majetku (tzv. investiční majetek) mohou být připojeny informace o jeho technickém zhodnocení. Těchto připojených záznamů přitom může být i více, v tom případě bychom chtěli přidat také součet jejich ceny pro jeden kus majetku. Dále chceme ušetřit co nejvíce místa na sestavě, protože majetku je velké množství.

Vlastní řešení výstupní sestavy je uvedeno na obr. 15.

Obr. 15. Výstupní sestava se seznamem majetku

Vidíme, že oblast Detail obsahuje informace o jednom kusu majetku, na které přímo navazuje informace o připojeném technickém zhodnocení. Tím se snažíme šetřit co nejvíce místa. Výsledek by však nebyl nejlepší. Pokud je k jednomu kusu majetku připojeno více kusů technického zhodnocení, budou se informace o majetku v levé části sestavy opakovat, což bude velmi nepřehledné. Víme, že je možné u těchto položek nastavit vlastnost Hide Duplicate na True. To však v tomto případě není vhodné. Např. názvy různých kusů majetku mohou být stejné, nastavením zákazu opakování stejných textů by u druhého kusu název chyběl. Proto je přijato jiné řešení. K obsluze události On Format oblasti Detail je připojena procedura, která si pamatuje hodnotu položky primárního klíče z minulého záznamu. Pokud má následující záznam stejnou hodnotu primárního klíče, jedná se zjevně o stejný kus majetku a zobrazení opakujících se položek je zakázáno.

Sub Detail1_Format (Cancel As Integer, FormatCount As Integer)
Static MEID As Variant
If MEID = Me.ID Then
    Me.[IVC].Visible = False
    Me.[Nazev].Visible = False
    Me.[Firma].Visible = False
    Me.[Faktura].Visible = False
    Me.[Cena].Visible = False
    Me.[PrijatoDne].Visible = False
    Me.[Misto].Visible = False
    Me.[Osoba].Visible = False
Else
    Me.[IVC].Visible = True
    Me.[Nazev].Visible = True
    Me.[Firma].Visible = True
    Me.[Faktura].Visible = True
    Me.[Cena].Visible = True
    Me.[PrijatoDne].Visible = True
    Me.[Misto].Visible = True
    Me.[Osoba].Visible = True
End If
MEID = Me.ID
End Sub

Dalším požadavkem je zobrazení součtu ceny připojeného technického zhodnocení. Součet je realizován v úpatí skupiny tvořené záznamy stejné hodnoty primárního klíče (ID), tedy úpatí oblasti záznamů jednoho kusu majetku. Pokud ale majetek nemá žádné technické zhodnocení, je zobrazení celé oblasti zakázáno, opět procedurou připojenou k události On Format této oblasti.

Sub GroupFooter0_Format (Cancel As Integer, FormatCount As Integer)
If IsNull(Me!TZCena) Then
    Me.MoveLayout = False
    Me.PrintSection = False
End If
End Sub

Na závěr je vhodné upozornit na nutnost kontrolovat před otevřením sestavy, zda bude obsahovat alespoň jeden záznam. Pokud totiž sestava žádný záznam neobsahuje, dojde k vyhlášení chyby v proceduře Detail1_Format.

3.2 Zajištění požadovaného počtu řádků

Zejména při přechodu z klasické (ryze papírové) agendy na její elektronické zpracování, se objevují požadavky na tisk výstupních sestav plně odpovídajících původním formulářům. To vcelku není nesplnitelný požadavek. Otázkou je, zda je to požadavek smysluplný, ale to je otázka pro zadavatele úkolu. Velmi často se přitom požaduje, aby sestava obsahovala přesný počet řádků bez ohledu na to, zda jsou vyplněny nebo ne.

Zde se objevuje několik problémů. Jeden řádek sestavy je tvořen sekcí Detail a víme, že se bude opakovat tolikrát, kolik záznamů sestava obsahuje (s možností jejich členění do jednotlivých skupin).

Prvním problémem je tedy doplnění volných řádků do požadovaného počtu. Na obr. 16 je zobrazena tvorba se stavy a naznačena struktura programových rutin připojených k události On Print jednotlivých oblastí.

Obr. 16. Výstupní sestava s pevným počtem řádků

Z obr. 16 je zřejmá celá realizace doplnění chybějících prázdných řádků. Obsah prázdného řádku (rámečky jednotlivých políček apod.) je uložen v sekci Typ Footer pod sekcí Detail. Je zřejmé, že záznamy jsou seskupovány podle hodnoty položky Typ. Proto existuje sekce Typ Header (zcela nahoře) a Typ Footer (zcela dole) pro údaje sumarizované za celou skupinu. Existuje tedy dvojí seskupování záznamů podle hodnoty položky Typ. První skutečně seskupuje záznamy, druhé slouží pouze pro možnost tvorby prázdných řádků.

Tím je však vyřešena jen polovina našeho problému, tedy doplnění chybějících řádků v sestavě. Druhým problémem je případ, kdy je řádků více než je povoleno. Systém samozřejmě automaticky přejde na další stránku a pokračuje dalšími řádky. U nich však bude chybět záhlaví, stejně jako na první straně úpatí skupiny záznamů.

K řešení tohoto problému je potřeba tvořit taková seskupení záznamů, aby jejich počet nebyl vyšší než stanovený počet řádků. K tomu je potřeba mít k dispozici položku obsahující souvislou číselnou řadu 1, 2 , ..., n. Obvykle ji ale nemůže suplovat použití primárního klíče typu počítadlo (Counter), neboť při zrušení záznamu dojde k porušení plynulosti číselné řady.