Obsah zde může platit pro Northwind 2.0 Developer Edition a Starter Edition.
Jazyk VBA (Visual Basic for Applications) je programovací jazyk používaný ve všech produktech Office. Učení jazyka VBA umožňuje pracovat se všemi produkty Office (nejen s Accessem).
Při hledání "návodů" nezapomeňte hledat konkrétní příklady Accessu a do hledání zahrnout Microsoft Access. Řešení pro ostatní produkty Office budou často fungovat, ale neexistuje žádná záruka. Microsoft Access je produkt pro dospělé. to znamená, že existuje mnoho příkladů; což je pro vás skvělé!To také znamená, že starší knihy o programování v Accessu jsou stále k dispozici pro vás. Mnoho starších knih je stále k dispozici na použitých stránkách knih za zlomek jejich původních nákladů. Podívejte se na web Microsoftu, abyste zjistili, jaké verze Accessu se stále podporují, a s těmito verzemi se můžete pustit.
Ukončení podpory pro Office – Nasazení Office | Microsoft Learn
Níže najdete některé odkazy na dokumentaci k Accessu u Microsoftu.
Soubory Microsoft Accessu jsou soubory Office. Soubory Office musí být v důvěryhodném umístění nebo musí mít povolený obsah. Tyto položky jsou považovány za "bezpečné", protože jste je vytvořili, nebo pocházejí z důvěryhodného zdroje. Kontrola důvěryhodných umístění probíhá při každém otevření libovolného souboru office. Odsud to budeme označovat jako důvěryhodné nebo povolené. POZNÁMKA: Pokud je nová verze aplikace vydána a otevřena z nedůvěryhodného umístění, proces povolení obsahu se bude opakovat.
Další informace o důvěryhodných umístěních:
Makra, funkce a subs představují způsob, jak implementovat obchodní logiku do databáze Accessu. Než začnete, je důležité, abyste porozuměli rozsahu a viditelnosti .
Události (například kliknutí na ovládací prvek) u ovládacích prvků ve formuláři (např. tlačítka, textová pole, popisky atd.) aktivují další procesy, například přidávání, odstraňování záznamů nebo otevírání formulářů. Tyto procesy je možné implementovat pomocí maker nebo jazyka VBA. Northwind Starter Edition používá většinou makra a některá jazyk VBA, kde makra nejsou schopná provádět potřebné funkce. Northwind Developer Edition používá především jazyk VBA.
Některé typy ovládacích prvků mají integrované průvodce pro automatické vytvoření makra. Například při přidání příkazového tlačítka do formuláře se otevře průvodce, který nabízí několik možností funkcí tlačítka. Při přidání pole se seznamem se otevře průvodce, který je možné nakonfigurovat tak, aby ve formuláři našel konkrétní záznam.
Navigační podokno představuje hlavní způsob zobrazení a přístupu ke všem databázovým objektům a ve výchozím nastavení se zobrazuje na levé straně okna Accessu.
Navigační podokno Northwind bylo přizpůsobeno. Vytvořili jsme vlastní kategorii s názvem Northwind Starter 2.0. To nám umožňuje uspořádat objekty podle funkční oblasti.Je důležité se seznámit s oborem a viditelností v Accessu nebo Office. Můžete začít tady:
Někdy potřebujete, aby proměnná existovala poté, co objekt, který ho vytvořil, překročí rozsah. Viz Rozsah a viditelnost výše. Existují tři primární způsoby: veřejné proměnné, tempvary a ukládání hodnot v místní tabulce. Mnoho vývojářů používá jejich kombinaci. Každý má své klady a zápory. Další informace o každé z nich najdete tady:
Veřejná proměnná modulu VBA:
TempVars:
Ukládání hodnot v místní tabulce
-
Veřejné proměnné a dočasné proměnné existují pro aktuální relaci a při zavření aplikace přejdou z oboru. Co když ale chcete zachovat proměnné specifické pro uživatele napříč relacemi? Tyto typy hodnot můžete uložit do místní tabulky. V Northwind 2.0 je jedna taková proměnná uložena v tabulce s názvem SystemSettings. Hodnota v tabulce je ShowWelcome. Tato hodnota říká Accessu, jestli chcete při každém přihlášení zobrazit úvodní obrazovku.
Vývojáři často potřebují předávat parametry z jednoho formuláře do druhého nebo z formuláře do sestavy. Tyto parametry sdělují důležité informace, které pak volaná funkce použije ke konfiguraci. Existuje několik způsobů, jak druhý formulář nebo sestava získat informace z prvního formuláře. Tady je několik z těchto způsobů:
-
Druhý formulář se může "vrátit" k prvnímu formuláři a vyzvednout některé hodnoty, pravděpodobně ve viditelném nebo neviditelném ovládacím prvku. Příklad: lngCustomerID = Forms!FirstForm!cboCustomerID
-
První formulář může ukládat hodnoty do globálních proměnných nebo tempvars. Příklad: g_lngUserID = Me.cboUserID TempVars.Add "UserID", Me.cboUserID
Metoda, která se často používá v Northwind Developer Edition stejně jako v našem profesionálním životě, používá argument OpenArgs doCmd.OpenForm nebo OpenReport. Příklad: DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)
Kombinujeme zde dvě techniky: (1) použití OpenArgs k předání VendorID a VendorType a (2) použití funkce StringFormat() k vytvoření například tohoto řetězce:
CompanyID=5&CompanyTypeID=2
Tento řetězec se velmi podobá řetězci dotazu, který se používá v prohlížeči. Obsahuje jeden nebo více dvojic "název/hodnota" oddělené znakem ampersand:
name1=value1&name2=value2
Výhodou takového řetězce je, že každá hodnota má název. Porovnejte to s jednodušším přístupem, kdy byste nastavili OpenArgs jenom na hodnotu 5,2. V takovém případě by bylo potřeba zjistit, co jednotlivé hodnoty značí. Pojmenování každé hodnoty způsobí, že řetězec dotazu je "sebepopisující", což je dobrý programovací postup.
Na přijímající straně doCmd.OpenForm se obvykle nacházíme v události Form_Open nebo Form_Load a chceme analyzovat řetězec OpenArgs do jeho součástí.
V Northwind to můžete udělat pomocí funkce StringToDictionary . Vezme funkci určitou jako řetězec dotazu a parsuje ji do svých součástí. Tyto komponenty jsou pak uloženy v objektu Scripting.Dictionary . Všimněte si, že k tomu je potřeba použít Nástroje > Reference a nastavit odkaz na modul Microsoft Scripting Runtime (scrrun.dll).
Mezi funkce a výhody objektu Dictionary patří:
-
Pořadí prvků není důležité.
-
Jednoduché funkce pro přidání a odebrání prvků kolekce
-
Funkce, které mají procházet kolekci, abyste věděli, co v ní je
-
Funkce Exists , abyste mohli otestovat, jestli je k dispozici určitý prvek
Použití objektu slovníku se zobrazí v celém systému Northwind. Například Form_Load událost v frmGenericDialog.
Makra vytvořená pomocí Průvodců ovládacími prvky v Accessu zřídka obsahují zpracování chyb vůbec. Jazyk VBA vytvořený pomocí průvodců ovládacími prvky může být omezen na obecný popis msgBox Err.Description.
V Northwind 2.0 vám ukážeme, jak to udělat lépe při použití kódu VBA. Implementovali jsme to, čemu se říká globální obslužná rutina chyb. Chyby, ke kterým dochází v jakékoli proceduře, volají funkci na globální úrovni, aby chybu zobrazila. Velkou výhodou je, že zpracování chyb je konzistentní. A pokud se zpráva musí změnit (např. aby se navíc zobrazilo číslo chyby nebo se chyba protokoluje do souboru), je potřeba to udělat jenom na jednom místě.
clsErrorHandler je modul třídy, který implementuje kód zpracování chyb. Modul třídy udržuje všechny své hlavní a pomocné funkce pohromadě v jedné jednotce, čímž zapouzdří kód.
Makro AutoExec volá funkci Startup v modStartup. V Starter Edition funkce vytvoří instanci clsErrorHandler a uloží ji jako globální proměnnou, která je k dispozici pro použití v celé aplikaci. V edici Dev se používá statická třída – viz komentáře v horní části modulu třídy.
Kód zpracování chyb v procedurách je ve skutečnosti tak konzistentní, že jsme ho dokázali vytvořit za méně než pět minut pomocí konkrétního kódu VBA, který každou proceduru vybavil správnou obslužnou rutinou chyb. (Kód není součástí šablony). Edice Šablony Northwind 2.0 Starter i Developer byly původně vybaveny tímto přístupem ke zpracování chyb.
'VYLEPŠENÉ ZPRACOVÁNÍ CHYB
Počínaje verzí 2.2 aplikace Northwind Developer Edition byla obslužná rutina chyb vylepšena díky zpětné vazbě od komunity accessu. Edice Starter se nezměnila.
V podstatě je obslužná rutina chyb v předchozí verzi (2.0 – vydaná v dubnu 2023):
Public Sub HandleError(…) MsgBox Err.DescriptionEnd Sub
Ve verzi 2.2 se upgraduje na:
Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False) If Not IsEventProcedure Then Err.Raise lngError, strErrSource End If MsgBox Err.DescriptionEnd Sub
Abychom pochopili, proč se tato změna provedla, pojďme nejprve porozumět tomu, co způsobuje spuštění kódu:
-
Makro AutoExec volá proceduru Po spuštění, která před otevřením prvního formuláře provede některé inicializace.
-
Uživatel pracuje s aplikací, například otevření formuláře nebo kliknutí na tlačítko, což způsobí, že se aktivují postupy událostí, jako jsou Form_Load a cmdPrintInvoice_Click.
'
Kromě procedur událostí mají aplikace podprogramy a funkce – většinou v modulech – a tento kód se volá z procedur událostí. Tyto postupy se nazývají "standardní" procedury.
Ve verzi 2.0 northwind by standardní procedury zpracovávaly své vlastní chyby se zprávami, ale nějak by neoznámily proceduru volající události, že došlo k chybě. To může být špatné, pokud procedura události obsahuje následující kód, který by se měl spustit bez ohledu na předchozí chybu, kterou volaná procedura zpracovává. Jistě, mohli bychom podprogram nahradit funkcí, která vrací úspěch nebo selhání, a odpovídajícím způsobem naprogramovat proceduru události, ale to není vždy možné.
V Northwind verze 2.2 standardní procedury nezpracují chybové zprávy, ale místo toho je pomocí funkce Err.Raise hlásí zpět do volající procedury událostí. Procedura volající události pak zobrazí vyvolanou chybu a pokračuje v Exit_Handler. To je lepší, protože to umožňuje, aby volající procedura skončila elegantně.
Pokud chcete použít kód Northwind verze 2.2, musí obslužné procedury předat třetí argument označující, že volající je procedura události. Společnost Northwind Dev Edition byla aktualizována tak, aby tak učinila.
Ještě výkonnější modul obslužné rutiny chyb by měl podporu pro procedury "push and popping" na "stack" (pole). První prvek by vždy byl procedura události, takže argument navíc není potřeba. Tato implementace přesahuje cíle Northwind Dev Edition.
MRU neboli Naposledy použité je seznam naposledy použitých objednávek a nákupních objednávek. K těmto možnostem se můžete často vracet, abyste je mohli umístit do dalšího stavu. Seznamy MRU se v produktech Office často zobrazují jako seznam naposledy použitých souborů, které můžete chtít znovu otevřít.
Pokud chcete v edici Northwind Dev implementovat funkci MRU (která v edici Starter neexistuje), musíte nejprve vytvořit následující položky:
-
Tabulka pro ukládání informací o mru.
-
Kód pro aktualizaci tabulky při otevření objednávky nebo nákupní objednávky
-
Kód pro aktualizaci rozevíracího seznamu MRU na pásu karet
-
Kód pro načtení položky při výběru položky MRU na pásu karet
Pojďme se na každou z nich podívat podrobněji.
1. Tabulka pro ukládání informací o MRU.
Návrh tabulky MRU stojí za to zkontrolovat, zejména její indexy. Všimněte si, že existuje duplicitní index SortIdx , který pomáhá s rychlým řazením položek MRU v rozevíracím seznamu pásu karet, a také jedinečný index pro vynucování obchodního pravidla, že pro každého uživatele může být položka pouze jednou. Pokud například dvakrát otevřete stejnou objednávku, nevytvoří se v tabulce MRU dva záznamy.
Tabulka využívá skutečnost, že všechna pole PK (primární klíč) související s mru v databázi jsou automatické číslo, takže datový typ Dlouhé celé číslo lze použít pro PKValue.
2. Kód pro aktualizaci tabulky při otevření objednávky nebo P.O.
V NW2 jsme se rozhodli přidat do seznamu MRU pouze při vytvoření nového záznamu, ne při opětovné aktualizaci existujícího záznamu. Určitě bychom mohli přesunout volání AddToMRU z Form_AfterInsert na Form_AfterUpdate , abychom to podpořili.
Procedury AddToMRU a DeleteFromMRU jsou implementovány v modGlobal, což je standardní modul, jehož veřejné postupy jsou viditelné z libovolného formuláře.
AddToMRU (jak název napovídá) přidá novou položku do tabulky MRU a pak ji volitelně oříznou zpět a odstraní nejstarší záznam, pokud překročil maximální velikost (MAX_MRU_COUNT). Poslední krok je pravděpodobně nejméně známý pro vývojáře v Accessu: rozevírací seznam pásu karet musí být aktualizován a to se provádí voláním InvalidateControl. Jedná se o signál pásu karet, aby znovu spustil proces inicializace.
3. Kód pro aktualizaci rozevíracího seznamu MRU na pásu karet.
Při spuštění a po zavolání InvalidateControl se spustí složitá sada funkcí, které naplní pás karet. Tyto postupy jsou volány pomocí pásu karet XML v tabulce uSysRibbons , která částečně říká:
<group id="gCurrentStatus" label="MRU">
<box id="bxMRU" boxStyle="vertical">
<dropDown id="ddMRU"
getItemCount="ddMRU_GetItemCount"
getItemLabel="ddMRU_GetItemLabel"
getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
getItemID="ddMRU_GetItemID"
onAction="ddMRU_OnAction"
screentip="Most Recently Used Objects">
</dropDown>
</box>
</group>
Tyto čtyři funkce zpětného volání vyplní rozevírací seznam. Všimněte si, že se jedná o velmi stejnou myšlenku, jakou zde popisujeme u standardních polí se seznamem.
Pokud zrušíte komentář řádků Debug.Print v modRibbonCallback a restartujete aplikaci, okamžité okno zobrazí následující posloupnost:
ddMRU_GetItemCount ddMRU 6
ddMRU_GetItemLabel ddMRU 0 Order 60, Proseware, Inc.
ddMRU_GetItemID ddMRU 0 2
ddMRU_GetItemLabel ddMRU 1 Order 62, Best For You Organics Company
ddMRU_GetItemID ddMRU 1 4
ddMRU_GetItemLabel ddMRU 2 Order 63, Wide World Importers
ddMRU_GetItemID ddMRU 2 5
ddMRU_GetItemLabel ddMRU 3 Order 66, Proseware, Inc.
ddMRU_GetItemID ddMRU 3 8
ddMRU_GetItemLabel ddMRU 4 Order 67, Best For You Organics Company
ddMRU_GetItemID ddMRU 4 9
ddMRU_GetItemLabel ddMRU 5 Order 68, Adatum Corporation
ddMRU_GetItemID ddMRU 5 10
ddMRU_GetSelectedItemIndex ddMRU 0
Tady vidíme, že Access nejprve volá proceduru, která vrací počet položek, které se mají načíst v argumentu ByRef ddMRU_GetItemCount. To je také čas, kdy otevřeme dotaz v tabulce MRU a uložíme ho do mezipaměti, protože se bude několikrát používat.
Pás karet pak opakovaně volá dvě procedury pro získání hodnot ID a Label pro rozevírací seznam se dvěma sloupci.
Nakonec zavolá proceduru pro určení položky, která má být vybrána. (V našem případě je to první.)
4. Kód pro načtení položky, když je položka MRU vybraná z pásu karet.
Stejně jako u jakékoli jiné položky pásu karet určuje vlastnost OnAction v souboru XML pásu karet funkci zpětného volání, která se má použít k provedení akce:
onAction="ddMRU_OnAction"
Tento postup je implementován v modRibbonCallback. Znovu použije již otevřenou sadu záznamů k vyhledání záznamu s vybranou položkou a potom v závislosti na požadované tabulce TableName otevře odpovídající formulář a předá hodnotu PK, která se má načíst.
-
Northwind 2.0 Developer Edition: Template-Tutorial
-
Northwind 2.0 Developer Edition: Všechna témata