2. Řešené problémy

Tato část textu obsahuje popis různých problémů, které byly řešeny při tvorbě aplikací v prostředí MS-Access. Byly vybrány především takové problémy, které se vyskytují častěji nebo které jsou velmi zákeřné, takže by autoři při hledání jejich původu ztratili hodně času.

2.1. Zkušenosti s českou verzí systému

S určitým odstupem se po anglické verzi programu objevila také česká verze systému MS-Access. V této kapitole bude popsáno několik zajímavých projevů chování, zejména spojených s převodem aplikací z jednoho jazykového prostředí do druhého.

Obr. 13. Databáze s nepřístupným objektem

Po přenesení úloha pracovala bez závad až do okamžiku, než se objevilo hlášení, že nelze otevřít objekt "QVýběr vázaných prostředků". Hned první pohled do seznamu objektů však jmenovaný objekt ukázal. Naše zděšení došlo vrcholu, když jsme se pokoušeli objekt opravit. Opět se objevilo hlášení, že tento objekt neexistuje. Značně stresovou situaci s neschopností otevřít objekt, který se v databázi zjevně nalézá, ukončila až oprava databáze (Repair). Po jejím provedení obtíže zmizely a objekt je opět přístupný. Co problém způsobilo, se nepodařilo zjistit.

Obr. 14. Sestava ignorující položku [Název]

Od té doby jsme byli ostražití. Nic dalšího se nedělo a to nás nakonec ukolébalo. Po instalaci další úlohy jsme opravu provedli zcela automaticky. Všechny objekty sice byly přístupné, ale jeden z nich odmítal správně fungovat. Vyrobili jsme sestavy pro tisk adresních štítků jednotlivých škol, leč databáze vytrvale místo jejich názvů psala text "Rškoly adresy". Zjistilo se, že systém upřednostňuje před názvem položky název vlastnosti sestavy. V tomto případě vlastnost "Název" (Name), tedy skutečně text "Rškoly adresy". Nezbylo, než položku přejmenovat a utěšit se vědomím, že až bude třeba se odkazovat na některou vlastnost sestavy, budeme vědět jak.

Zatím poslední problém jsme řešili dosti dlouho. V úloze bylo požadováno, aby po zadání rodného čísla proběhl výpočet data narození (s osobami nad 100 let se zjevně nepočítá). Požadavek byl vyřešen ve zdrojovém dotazu pro formulář s osobami. Pomocí uživatelské funkce bylo datum narození snadno vypočteno.

Prvním náznakem, že vše není v pořádku, byla skutečnost, že po přechodu na existující záznam, byl tento označen jako editovaný (obrázek tužky v tlačítku pro výběr záznamu). To by se snad dalo přejít, leč poté, co byl proveden přechod na jiný záznam, než následující, došlo ke změně rodného čísla otevřeného záznamu. Podařilo se zjistit, že dostane rodné číslo osoby předcházející té, na kterou byl přesun proveden. Důvod počínání systému není zcela jasný, ale řešení nalezneme, když si uvědomíme, jak systém předává parametry do procedury. Parametry jsou předávány odkazem, takže změna obsahu proměnné S v proceduře (vyznačeno tučně) se nutně musí projevit také na jejím zdroji a tady nutně musí dojít k zahájení editace aktuálního záznamu. Proč však docházelo k přepisování rodných čísel cizími nevíme. Parametr S je potřeba předávat správně hodnotou (ByVal S As Variant), čímž jsou všechny potíže odstraněny.

Popisované problémy jsme vybrali pro ilustraci složitosti systému, v němž je provázanost jednotlivých činností již často tak komplikovaná, že její nedokonalá znalost může způsobit tvůrci systému řadu potíží. Je však třeba si uvědomit, že uživatele tím systém nijak nezatěžuje, neboť tyto problémy by uživatel za normálních okolností řešit neměl.

Obr. 15. Výpočet data narození z rodného čísla

Function Datum_narozeni (S As Variant, Hlas As Variant) As Variant
' ************************************************************
' V řetězci S vstupuje rodné číslo. Funkce z něj vezme a vrací datum narození. 
' Parametr Hlas určuje, zda se budou hlásit nalezené chyby.
' ************************************************************
If  Not IsNull(S) And Len(Trim(S)) > 7 Then
    ' Zpracovává se jen neprázdný řetězec dlouhý 8 a více znaků
    ' Rodné číslo má tvar yy-mm-dd/????
    S = Trim(S)
atd.