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