sql >> Databáze >  >> RDS >> Access

MS-Access Class Module a VBA

Úvod.

Posledních pár týdnů jsme se naučili, jak používat User-Defined Type (UDT) vytvořením komplexní datové struktury, a víme, jak silnou či slabou stránku UDT má, víceméně již nyní. Pokud jste tyto články neprošli, můžete je navštívit. Použijte následující odkazy:

  • Uživatelem definovaný typ dat-2
  • Uživatelem definovaný typ dat 3

V aplikaci Microsoft Access existují dva typy modulů VBA.

  1. Standardní moduly
  2. Třídové moduly

Pracovali jsme s moduly třídy na Formulářích a Přehledy aplikace Microsoft Access. Programy modulu Form/Report Class Module jsou většinou malé rutiny řízené událostmi (klepnutí na tlačítko, před aktualizací, formulář/report aktuální události atd.).

Serióznější zpracování dat Programy budou napsány ve standardních modulech. V jednom standardním modulu lze napsat několik programů, které nemusí nutně souviset.

Moduly tříd jsou různé. Používají se pro vytváření vlastních objektů a jeden modul třídy se používá pouze pro jeden objekt.

Základy samostatného modulu třídy.

Pojďme vytvořit jednoduchý modul třídy od začátku a naučit se základy.

  1. Spusťte Microsoft Access a otevřete databázi nebo vytvořte novou. Pokud se jedná o novou databázi, uložte ji do stávajícího důvěryhodného umístění (složky) nebo přidejte nové umístění do seznamu důvěryhodných umístění. Klikněte na Tlačítko Office –> Možnosti přístupu—> Centrum důvěryhodnosti –> Nastavení centra důvěryhodnosti. Přidejte složku databáze do seznamu a klikněte na OK.
  2. Otevřete okno pro úpravy VBA (Alt+F11).
  3. Klikněte na Vložit Menu a vyberte Modul třídy ze seznamu. Je vložen nový modul třídy.

  • V levém panelu je Název ovládací prvek s názvem Třída1.
  • Změňte název Třída 1 do ClsArea . Toto je název našeho vlastního objektu.

  • Poznámka: Název třídy:ClsArea stát se názvem objektu. To znamená, že kdekoli použijeme tento objekt, bude to jako normální deklarace proměnné:Dim xyz As ClsArea . Napsali jsme podobné prohlášení pro deklarace datových typů definovaných uživatelem.

    Dále přidáme tři vlastnosti (proměnné) objektu (pro Popis, Délka, a Šířka ) v horní části modulu pod Možností Porovnat databázi a Explicitní možnost linky. Zadejte následující řádky do modulu Class.

    Option Compare DatabaseOption ExplicitPublic p_Desc jako StringPublic p_Length jako DoublePublic p_Width jako Double

    Tyto proměnné jsou identifikovány jako vlastnosti objektu vlastní třídy VBA. Uložte modul třídy.

    Poznámka: Náš objekt modulu třídy a řádky kódu nebudou tak jednoduché. Projde změnami s několika řádky kódu. Raději buďte připraveni je sledovat krok za krokem, aniž byste ztratili přehled o každé fázi změn. Toto je jednoduchá třída pro výpočet plochy (plocha =délka * šířka ), tak jednoduché. Postupně projde změnami, takže budete vědět, proč jsou tyto změny nezbytné.

    Napíšeme malý program ve standardním modulu, abychom otestovali náš nový modul třídy. Vložte standardní modul z nabídky Vložit. Můžete zadat nebo zkopírovat a vložit následující kód do standardního modulu, čímž přepíšete existující řádek v modulu:

    Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.Set oArea =NothingEnd Function

    Ztlumit příkaz deklaruje proměnnou jako my pro normální proměnnou, jako je Dim Desc jako String. Ale toto není běžná proměnná, nastavujeme odkaz na náš objekt modulu třídy ClsArea . Protože se jedná o objekt, jednoduchý příkaz Dimension sám o sobě nestačí, protože nepřiděluje žádný paměťový prostor pro ukládání hodnot do našeho lokálně definovaného objektu oArea Vlastnosti.

    Sada prohlášení na dalším řádku s Novým klíčové klíčové slovo k vytvoření instance objektu z ClsArea v paměti s názvem instance objektu oArea . V případě potřeby můžeme tímto způsobem otevřít několik instancí stejného objektu třídy v paměti (dozvíme se o nich v následujících týdnech), abychom mohli uložit hodnoty do jeho vlastností (p_Desc, p_Length, p_Width). p_ prefix k proměnným je indikátor, že rozsah proměnných je soukromý, tj. proměnné nejsou viditelné mimo modul třídy, pokud je proměnná deklarována s klíčovým slovem Private, ale nyní je deklarována jako veřejná. Název proměnné může být jakýkoli platný název.

    Poznámka: Zatím jsme to neprohlásili jako soukromé. Jsme na cestě k této změně.

    Bezprostředně za klíčové slovo Nastavit místní název objektu (můžete si vybrat vhodný název, který preferujete, ale měl by odpovídat běžným pravidlům pro názvy proměnných) následovaný rovnítkem a klíčovým slovem New a Název modulu třídy (ClsArea) k vytvoření instance objektu clsArea v paměti se všemi jeho vlastnostmi (proměnnými).

    Pro tento dvouřádkový kód existuje zkratka. Akce obou těchto řádků kódu lze provést jedním příkazem, jak je ukázáno níže:

    Dim oArea As ClsAreaSet oArea =New ClsArea'zkratka k výše uvedeným dvěma příkazůmDim oArea As New ClsArea

    Když napíšete další řádek, oArea následovaná tečkou (. ) oddělovač zobrazí se následující obrazovka se seznamem dostupných vlastností uživatelských objektů, ze kterých lze vybírat.

    Pokud se nezobrazí, přejděte do dialogového okna Možnosti z pole nabídky Nástroje a zaškrtněte položku Automaticky seznam členů na kartě Editor.

    Před ukončením funkce by měl být posledním příkazem Set oArea =Nothing . Tento příkaz výslovně uvolňuje paměť obsazenou instancí uživatelského objektu, takže je k dispozici více paměti pro jiné programy. Toto je zodpovědná operace čištění pomocí našeho programu.

    Cokoli uděláme s vytvořeným vlastním objektem, by mělo být zakódováno mezi první a poslední sadou prohlášení.

    Program pro testování objektů třídy ClsArea.

    Dokončený kód programu pro testování tříd je uveden níže:

    Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.p_Desc ="Koberec"oArea.p_Length =25oArea.p_Width ="PrintWidth"Debug",Print "Length"Debug"Debug" oArea.p_Desc, oArea.p_Length, oArea.p_WidthSet oArea =NothingEnd Function

    Klikněte někam doprostřed kódu a stiskněte F5 ke spuštění programu. Spuštění programu je uvedeno níže pro referenci.

    Popis Délka ŠířkaCarpet 25 15 

    Veřejný|Soukromý rozsah vlastností objektu.

    Náš jednoduchý Class Module Object má několik nedostatků a my je napravíme.

    První je, že jsme všechny proměnné (nebo vlastnosti) deklarovali jako Veřejné Rozsah. Díky tomu jsou viditelné pro ostatní programy VBA a jejich hodnota se může přímo změnit. Druhým problémem je, že bude akceptovat jakékoli neplatné hodnoty, jako jsou záporné nebo nulové hodnoty, což není vhodné pro náš objekt třídy. Před přijetím hodnot do proměnných musíme začlenit některé ověřovací kontroly.

    První problém můžeme snadno vyřešit změnou deklarací proměnných z Public na Private . Když to uděláme, měli bychom mít nějakou nepřímou metodu pro ukládání a načítání hodnot ze soukromých proměnných. To je účelem Získat a Nech Procedury vlastností pro každou vlastnost objektu. Proveďte tyto změny v modulu Class.

    Otevřete modul třídy ClsArea. Změňte slovo Public na Private pro všechny tři proměnné.

    Vytváření procedur vlastnictví

    Vyberte Postup z Vložit V nabídce zadejte strDesc v Název textový ovládací prvek, vyberte Vlastnost v části Typ Skupina možností a Veřejné v Rozsahu skupina možností. Klepnutím na tlačítko OK vložte procedury vlastností pro Private p_Desc Proměnná (Vlastnost).

    Option Compare DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePrivate p_Width As DoublePublic Property Získat strDesc() jako String strDesc =p_Desc 'vrátí hodnotu z p_DescEnd PropertyPublic Property do hodnoty strDesc(ByVe) StrDesC(ByVestore) p_DescEnd Property

    Obě možnosti Získat Postup a Nech Postup je deklarován jako Veřejný . Oba názvy procedur jsou stejnéstrDesc. Ve výchozím nastavení vráceno datový typ je Varianta v Získat Procedura a datový typ Parametr je také vložen jako Varianta do Let Postup. Ty můžeme podle potřeby změnit na konkrétní typy, což jsme udělali a změnili na String typ. První tři písmena str v strDesc dává uživateli nápovědu, že vlastnost očekává hodnotu datového typu String. Změňte Let Vlastnost Postup Parametr Název proměnné vNewValue na strNewValue

    Když vložíme proceduru vlastností, vždy se vloží pomocí Získat a Nech Páry procedur pro proměnnou.

    Nyní se blíže podívejte na výraz, který jsme napsali v rámci Získat Postup. Levá strana = Podepište název postupu získání strDesc funguje jako proměnná, která vrací hodnotu zkopírovanou ze soukromé proměnné p_Desc do volajícího programu.

    Tlačítko Let Postup strDesc přijímá hodnotu řetězce v parametru Proměnná strNewValue . Vstupní hodnota se přenese do naší soukromé proměnné p_Desc.

    Zde je třeba poznamenat, že neexistuje přímý přístup k naší soukromé proměnné p_Desc do vnějšího světa. Přenos hodnot Od/Do proměnná (vlastnost) p_Desc je vždy směrován přes Get/Let Pouze procedury vlastnictví a podléhají ověření platnosti (dosud neimplementováno), později zavedeme kontroly ověření na vstupu hodnot (Let Procedure) do vlastnosti.

    Získat/nechat Procedury se provádějí automaticky v závislosti na tom, co děláme s vlastností Object ve výrazu v programech VBA.

    Možnost Získat procedura se provede, když použijeme Název vlastnosti ve výrazu následujícím způsobem:

    ‘ Načte hodnotu z p_Desc do PrintDebug.Print oArea.strDescOR‘ Načte hodnotu z p_Desc a přiřadí ji proměnné XX =oArea.strDesc

    Tlačítko Let Property Procedure se spustí, když se pokusíme přiřadit hodnotu do Property Name. Zkontrolujte ukázkový výraz v našem testovacím programu níže:

    oArea.strDesc =“Koberec”

    V dřívějších knihách BASIC Language můžete vidět použití klíčového slova LET.

    LET X =25 ‘ LET je volitelný

    Protože to bylo nepovinné, příkaz funguje i bez něj a přestal se používat vůbec.

    Zde, pokud pouze čtete nějakou hodnotu z proměnné a neukládat do ní nic přímo, pak můžete vynechat proceduru Let a použít pouze Získat Postup.

    Toto pravidlo platí také pro proceduru Let. Můžete použít pouze Let Postup, pokud přiřazujete nějakou hodnotu do soukromé proměnné, ale nečtete nic zpět ze stejné proměnné, pak vynechejte proceduru Get.

    Možnost Získat a Nech Procedury poběží jedna po druhé, pokud je náš výraz něco jako následující:

    oArea.strDesc =oArea.strDesc &„ – King Size.“

    Ve výše uvedeném výrazu získáme existující hodnotu ze soukromé proměnné p_Desc a upravte popis a uložte jej zpět do stejné proměnné. Zkrátka v výrazu pokud použijete název vlastnosti napravo od rovnítka (= ) Získat Procedura se nazývá a Let Procedura se spustí, když se název procedury vlastnosti objektu objeví vlevo od rovna (= ) podepsat.

    Vložte dvě sady procedur vlastností pro proměnné p_Length a p_Width. Když zadáte názvy procedur do Název ovládacího prvku zadejte název dblLength a dblWidth dát uživateli nápovědu, že tyto vlastnosti očekávají jako vstup čísla s dvojitou přesností.

    Objekt třídy ClsArea s jeho procedurami vlastností.

    Dosud dokončený kód s procedurami vlastností dblLength a dblWidth je uveden níže pro referenci a pro aktualizaci vašeho kódu.

    Option Compare DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePrivate p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'zkopírujte hodnotu z p_DescEnd PropertyPublic Property Nechat strDesc(ByV) Str. ) Jako dvojitá dblLength =p_LengthEnd PropertyPublic Property Nechat dblLength(ByVal dblNewValue As Double) p_Length =dblNewValueEnd PropertyPublic Property Získejte dblWidth() As Double As dblWidth =p_WidthEnd Double>DoubleVuid PropertyTestovací program se změnami.  

    Pokud jste dokončili výše uvedený kód, nechte nás provést změny v našem testovacím programu, aby odrážely změny, které jsme zde provedli. Upravený ukázkový kód je uveden níže.

    Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsArea'Property Let procedury nazvané hereoArea.strDesc ="Carpet"oArea.dblLength =25oArea.dblWidth =25oArea.dblWidth "Description". "Width"'Property Get Procedury jsou zde volány k printDebug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidthSet oArea =NothingEnd Function

    Když zadáte tečku (.) bezprostředně za název objektu oArea (oArea.), VBA IntelliSense zobrazí seznam názvů procedur vlastností a můžete si vybrat požadovaný ze seznamu, aniž byste jej museli ručně zadávat.

    Účelem tohoto objektu třídy je vypočítat plochu něčeho, jako je plocha místnosti, koberec, dlaždice nebo jakýkoli jiný materiál, který má hodnoty délky a šířky. To znamená, že potřebujeme veřejnou funkci, abychom vypočítali plochu jakékoli délky, šířky a popisných hodnot zadaných do objektu třídy.

    Metoda objektu ClsArea:Area()

    Zde je kód pro veřejnou funkci:

    Public Function Area() As Double Area =Me.dblLength * Me.dblWidthEnd Function

    Tuto funkci můžete vložit z Vložit Menu zadáním Oblasti v Jméno Ovládejte výběrem Funkce z Typ skupina možností a Veřejné jako Rozsah do modulu třídy ClsArea. Dokončete funkci zadáním řádku uprostřed.

    Můžeme přímo adresovat proměnné p_Length a p_Width (protože funkce Area() je součástí Třídového modulu) ve výrazu pro výpočet Oblasti. Využíváme však správnou cestu a pro výpočet voláme Get Procedures dblLength a dblWidth. Možná jste si všimli odkazu Já. používá se ke kvalifikaci procedur dblLength, dblWidth Get, jako jsme používali při psaní v modulech třídy Form/Report, abychom odkazovali na aktuální objekt v paměti a jeho vlastnosti. Jak jsem uvedl dříve, náš objekt vlastní třídy může mít několik instancí objektu otevřených v paměti současně a klíčové slovo odkazuje na aktuální instanci, do které Function Area() patří.

    Testovací funkce s úpravami.

    Upravte naši testovací funkci ClassTest1() tak, aby zahrnovala výstup funkce Area(), jak je uvedeno níže:

    Option Compare DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.strDesc ="Koberec"oArea.dblLength =25oArea.dblWidth ="WidthAth", "Debug", "Debug", "Debug". "Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth, oArea.AreaSet oArea =NothingEnd Function

    Změna je pouze v příkazech Debug.Print. Spusťte kód a zkontrolujte výsledek v okně ladění.

    V modulech vlastní třídy jsou vyžadovány dvě procedury událostí:Class_Initialize() a Class_Terminate() .

    Metody automatického spouštění.

    Funkce Class_Initialize() program se spustí automaticky, když vytvoříme instanci objektu pomocí Nového Klíčové slovo. Tento program lze použít k nastavení výchozích hodnot do proměnných nebo k vytvoření instance jiných objektů v paměti. Jeden objekt třídy může používat jiné třídy jako podřízené objekty a musí být vytvořena instance. Tento aspekt prozkoumáme dále a naučíme se, jak to udělat později.

    Funkce Class_Terminate() program se spustí, když se pokusíme vymazat objekt z paměti, když Nic klíčové slovo je spuštěno v příkazu Set oArea =Nothing . Když skončí program, který používá objekt třídy, instance objektu v paměti se ve výchozím nastavení odstraní. Ale je dobrým programovacím postupem, který používáme Set oArea =Nothing příkaz jako poslední spustitelný příkaz v našich programech k vymazání objektu z paměti.

    Výše uvedené programy přidáme do našeho modulu třídy. Na konec modulu třídy přidejte následující kód:

    Private Sub Class_Initialize() p_Length =0 p_Width =0 'MsgBox "Inicializovat.", vbInformation, "Class_Initialize()"End SubPrivate Sub Class_Terminate() 'MsgBox "Ukončit.", vbInformation, "Class_EndTermina" 

    Pokud byste chtěli otestovat tyto dva podprogramy, odstraňte symbol Komentář a aktivujte MsgBox. Spusťte svůj testovací program ještě jednou. Najdete Inicializovat na začátku se zobrazí zpráva (pokračujte kliknutím na OK) a Ukončit na konci testovacího programu se objeví zpráva.

    Vím, co si teď myslíte, jako „tolik kódu pro násobení dvou proměnných dohromady“. Z tohoto hlediska je to pravda, ale je velmi pravděpodobné, že jsme kód pro podobné problémy při řešení problémů psali opakovaně pokaždé, když jsme duplikovali kód pro kontroly ověření a pro další zabezpečení proti logickým chybám.

    Zde nepíšeme běžný program, ale vyvíjíme vlastní objekt, který lze použít mnohokrát nebo může být součástí jiných objektů, kdekoli to potřebujeme, aniž bychom se museli starat o to, jak to z uživatelského hlediska funguje. Microsoft Access má mnoho vestavěných objektů/funkcí, které používáme neustále, aniž bychom se museli starat o to, jak to funguje, nastavením jejich vlastností nebo parametrů a tím, že práci dokončíme.

    Musíme se postarat ještě o jeden problém, validace kontroluje hodnoty zadávané do dblNewValue Parametr v Let Vlastnosti procedury dblLength() a dblWidth(), abyste zajistili, že platné hodnoty jsou přiřazeny vlastnostem objektu p_Length a p_Width .

    Zadané záporné nebo nulové hodnoty jsou považovány za neplatné a musíme učinit opatření, abychom zajistili, že uživatel zadá správnou hodnotu.

    Provádění kontrol ověření.

    Upravené Let Segmenty kódu procedury vlastnictví jsou uvedeny níže. Proveďte příslušné změny v kódu.

    Veřejný majetek Nechat dblLength(ByVal dblNewValue As Double) udělat Zatímco dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values ​​Invalid:", "dblLength()", 0) Smyčka p_Length =Vebl dbldPubBy Property dblNewValue As Double) Do While dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values ​​Invalid:", "dblwidth()", 0) Loop p_Width =dblNewValueEnd Property

    The Do While. . . Smyčka běží opakovaně, dokud není do dblNewValue zadána platná hodnota (větší než 0) uživatelem

    Ověřovací kontroly ve veřejné metodě:Area()

    Potřebujeme ještě jednu kontrolu ověření v Area() Funkce. Pokud uživatel zavolá funkci Area(), aniž by nejprve zadal platné hodnoty pro délku a šířku, musí být o tom uživatel informován. Před spuštěním výrazu pro výpočet plochy zkontrolujeme, zda proměnné p_Length a p_Width mají platné hodnoty. Zde je kód:

    Public Function Area() As Double If (Me.dblLength> 0) And (Me.dblWidth> 0) Then Area =Me.dblLength * Me.dblWidth Else Area =0 MsgBox "Chyba:Hodnota(y) délky/šířky ) Neplatné., Program přerušen." End IfEnd Function

    Úplný kód objektu ClsArea.

    Úplně vyplněný kód našeho modulu třídy ClsArea je uveden níže:

    Option Compare DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePrivate p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'zkopírujte hodnotu z p_DescEnd PropertyPublic Property Nechat strDesc(ByV) Str. ) As Double dblLength =p_LengthEnd PropertyPublic Property Nechat dblLength(ByVal dblNewValue As Double) Udělej, zatímco dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values ​​Invalieng:", "dbl0) NewValue palud Property()",End dblWidth() As Double dblWidth =p_WidthEnd PropertyPublic Property Nechat dblWidth(ByVal dblNewValue As Double) udělat, zatímco dblNewValue <=0 dblNewValue =InputBox("Negative/0 Values ​​Invalid_Wid", "dbl0 Property InvalidWid", "dbl0 Property Invalid"; Funkce Area() As Double If (Me.dblLength> 0) And (Me.dblWidth> 0) Then Area =Me.dblLength * Me.dblWidth Else Area =0 MsgBox "Chyba:Hodnota(y) délky/šířky je neplatná., Program přerušen." End IfEnd FunctionPrivate Sub Class_Initialize() p_Length =0 p_Width =0 'MsgBox "Inicializovat.", vbInformation, "Class_Initialize()"End SubPrivate Sub Class_Terminate() 'MsgBox "Ukončit.", vbInformation, "Enter 

    Procedury a metody testování vlastností.

    Náš objekt vlastní třídy můžete otestovat zadáním záporných nebo 0 hodnot jako vstupu do vlastností dblLength, dblWidth.

    V testovacím programu zakomentujte řádky (oArea.dblLength=25 a oArea.dblWidth=15), abyste otestovali funkci Area(). Mělo by se zobrazit chybová zpráva, kterou jsme napsali ve funkci.

    Náš modul třídy výpočtu plochy je nyní považován za dokončený a testovali jsme a zjistili jsme, že funguje správně. Můžete jej dále otestovat na případné logické chyby, které jsem přehlédl. Pokud narazíte na něco, co jsem nečekal, podělte se o to se mnou.

    Budoucí plán testování.

    Objekt třídy jsme testovali pouze pro jednu položku. Potřebujeme vypočítat plochu několika položek (řekněme plochu 5 ložnic nebo 10 různě velkých koberců a tak dále. Bylo nám řečeno, že jakmile je objekt vyvinut, můžeme jej několikrát instanciovat v paměti a přiřadit jinou sadu hodnot do každé instance objektu a může s nimi pracovat.

    Kromě toho lze tento objekt použít jako součást jiných objektů, které vyvíjíme s menším kódem, protože část našeho nového objektu třídy je již vyvinuta v modulu třídy ClsArea.

    Příští týden se naučíme, jak vytvořit Array of Custom Objects pro výpočet plochy několika položek.

    1. MS-Access Class Module a VBA
    2. Pole objektů třídy VBA MS Access
    3. Základní třída MS-Access a odvozené objekty
    4. Základní třída VBA a odvozené objekty-2
    5. Základní třída a varianty odvozených objektů
    6. Sada záznamů a modul třídy Ms-Access
    7. Přístup k modulu třídy a třídám Wrapper
    8. Transformace funkčnosti třídy Wrapper
    9. Základy přístupu a shromažďovacích objektů
    10. Modul třídy Ms-Access a objekt kolekce
    11. Záznamy tabulek v objektu a formuláři kolekce
    12. Základy objektů slovníku
    13. Základy objektů slovníku-2
    14. Řazení klíčů a položek objektů slovníku
    15. Zobrazení záznamů ze slovníku do formuláře
    16. Přidat objekty třídy jako položky slovníku
    17. Aktualizovat položku slovníku objektů třídy ve formuláři


    1. Jak funguje DB_NAME() na serveru SQL Server

    2. Vraťte aktuální název pracovní stanice, která je připojena k serveru SQL (T-SQL)

    3. 5 Výhody proaktivního monitorování výkonu databáze

    4. SQL 'AND' nebo 'OR' je na prvním místě?