14.09.2023 10:31

Chyba aplikace Notes: Soubor neexistuje. (profile)
10.05.2023 07:53

Co se děje ? Jak se pracuje v jazyce vzorců ? (2)
21.04.2023 14:15

Co se starou dokumentací k R3, R4, ...?
05.04.2023 14:41

Událost, při neexistenci přílohy. (2)
05.04.2023 11:51

Jak zjistit vložení přílohy. (4)
21.03.2023 11:14

Rámec nebo okno ? (10)
22.02.2023 10:14

Vylepseni designera 9.01 (3)
02.02.2023 20:27

Vítám všechny příznivce Lotus Scriptu a OOP u třetího dílu seriálu. Jak jsem již předem avizoval budeme vytvářet databázi organizační struktury. Programování této databáze je dobrým příkladem objektového přístupu k programování.
Organizační struktura je vlastně vylepšený adresář. Má většinu črtů LDAP serveru, ale má složitější systém řazení jednotlivých organizačních jednotek. Základní vlastnost je však stejná. Důraz je kladen na rychlost čtení, která má přednost před rychlostí zápisu. Organizační struktury mají několik základních jednotek. Ne u všech jsou však stejné. Já jsem se rozhodl pro jednotky, které by měly vyhovovat všem systémům a normám včetně ISO.
Základním objektem bude databáze organizační struktury. Tu budou v Lotus Scriptu prezentovat dvě třídy. UITřída se bude nazývat UIOrganization a backendová třída se bude nazývat Organization. Dále to bude organizační útvar - UIorgUnit a orgUnit, funkční místo - UIorgPosition a orgPosition a jako poslední to bude organizační skupina UIorgGroup a orgGroup. Tohle jsou základní třídy, ke kterým později přibudou "kolekce" pro backend. Tím se zatím zabývat nebudeme.
Kromě těchto základních tříd bude databáze obsahovat mnoho jiných tříd jako UIView a jiné. Ty budeme vytvářet tak řečeno za pochodu. Určitě jste si všimli, že nebudeme vytvářet třídu osoby. Je to z toho důvodu, že v organizační struktuře je to jenom ''jméno'' pod nějakým funkčním místem. Je to proměnná, kvůli které se nám nevyplatí vytvářet třídu. Za důležité považuji vysvětlit, proč má každá organizační jednotka dvě třídy. Když jsem začínal s OOP v Lotus Scriptu, pokoušel jsem se vytvářet univerzální třídy pro backend i frontend. Na to jsem dost zle doplatil. Psaní tříd pro backend má svoje specifika. Tady se třídy používají hlavně pro zrychlení, ušetření psaní a přehlednost prováděného kódu. V UItřídě nemá smysl vytvářet proměnné jako hodnoty polí a podobně. Důvod je jednoduchý. Uživatel vám je pod ''zadkem'' změní a tím se objekt stává ''neaktuálním''. Databáze organizační struktury bude v našem případě představovat strukturu firmy. Pokud bude někdo mít více firem (ojedinělý, ale možný případ), vytvoří si pro každou firmu databázi organizační struktury. Takže na začátek si vytvoříme UItřídu organizační struktury.
---------------------------------------------------------
Class UIorgUnit
Private uidb As NotesDatabase
Sub New( p_uidb As NotesDatabase )
Set Me.uidb = p_uidb
End Sub
End Class
---------------------------------------------------------
Možná se někomu zdá divné, že začínám právě u této třídy a že je tak jednoduchá. Odpověď je prostá. Jakmile vytvoříme UItřídu pro jednotku, budeme muset ošetřit odstraňování podřízených jednotek, a to budeme dělat právě tady. Opačně to neplatí. Když už máme strukturu, můžeme postoupit k organizační jednotce. Organizační jednotky mohou obsahovat jiné organizační jednotky a funkční místa. Protože uživatel bude potřebovat nějak rozumně zobrazit strukturu organizace v pohledu, budeme pro zobrazení používat řetězce s opačným lomítkem. Formulář jednotky i místa bude sloužit jenom k uchování dat a jejich zobrazení. Pro nás je tedy nezajímavý. Třídu UIorgUnit budeme používat v průvodci (wizardu) vytvořením a editováním organizační jednotky. Je to z toho důvodu, že už pro programátory je aplikace tohoto rázu pěkným oříškem a to nemluvíme o uživatelích :-). Náš průvodce bude tedy obsahovat tato políčka:
- název útvaru ( $UnitName )
- kód útvaru ( $UnitCode )
- název nadřízeného útvaru ( $SuperiorUnitName )
- kód nadřízeného útvaru ( $SuperiorUnitCode )
- popis ( $Description )
a skrytá políčka
- unid nadřízeného útvaru ( $SuperiorUnitUnid )
- jedinečný kód útvaru ( $UnitUnique )
- hierarchický název útvaru ( $HierarchicalUnitName )
- unidy podřízených útvarů ( $SubordinateUnits )
- unidy podřízených funkčních míst ( $SubordinateFunctionPositions )
Formulář průvodce nazveme OrgUnitWizard.
Formulář pro zobrazení nazveme OrganizationUnit.
To by zatím stačilo, třídu si vytvoříme v příštím díle. Na závěr tohoto dílu si ukážeme jednu důležitou "fintu", kterou budeme často v našem kódu používat. V Lotus Scriptu nelze upravovat třídy které jsou součástí API - tzv. produkční třídy, jako například NotesDocument anebo NotesUIDocument. U UIobjektů (pozor, ne tříd, ale objektů - objekt je inicializovaná třída) však můžeme přepisovat události - events, vlastními procedurami. Tato "finta" nám umožní 90% kódu který vytvoříme, soustředit do skriptových knihoven. To nám umožní vyvíjet kód v classbuilderu, ve kterém se mnohem lépe orientuje.
Snažte se prosím kód vytvářet v classbuilderu a nešetřete komentáři!!! Vyplatí se to... :).
Jako příklad si vytvoříme třídu sample, která bude obsahovat metodu samplequerysave. Tato metoda se provede před událostí QuerySave formuláře uidokumentu, na který ji navážeme. Pokud si zadáte do formuláře funkci msgbox a dokument uložíte, zobrazí se vám nejdřív dialog vyvolaný naši třídou a poté formulářem.
---------------------------------------------------------
Public Class Sample
Private uidoc As NotesUIDocument
Sub New( p_uidoc As NotesUIDocument )
Set uidoc = p_uidoc
On Event QuerySave From uidoc Call
SampleQuerySave
End Sub
Sub SampleQuerySave( Source As NotesUIDocument, Continue
As Variant )
Msgbox "Byla vyvolaná metoda SampleQuerySave třídy
Sample", 0 + 64,"Upozornění"
End Sub
End Class
---------------------------------------------------------
A teď jsme už jenom krůček od toho aby se událost formuláře neprováděla. K tomu nám pomůže opět funkce On Event s tím rozdílem, že místo naši metody zavoláme funkci Remove. Tady je příklad:
---------------------------------------------------------
Public Class Sample
Private uidoc As NotesUIDocument
Sub New( p_uidoc As NotesUIDocument )
Set uidoc = p_uidoc
On Event QuerySave From uidoc Remove
On Event QuerySave From uidoc Call SampleQuerySave
End Sub
Sub SampleQuerySave( Source As NotesUIDocument, Continue
As Variant )
Msgbox "Byla vyvolaná metoda SampleQuerySave třídy
Sample", 0 + 64,"Upozornění"
End Sub
End Class
---------------------------------------------------------
No a na závěr můžeme zabránit uložení tím, že do metody SampleQuerySave přidáme řádek, ve kterém nastavíme proměnnou Continue na hodnotu False.
---------------------------------------------------------
Public Class Sample
Private uidoc As NotesUIDocument
Sub New( p_uidoc As NotesUIDocument )
Set uidoc = p_uidoc
On Event QuerySave From uidoc Remove
On Event QuerySave From uidoc Call SampleQuerySave
End Sub
Sub SampleQuerySave( Source As NotesUIDocument, Continue
As Variant )
Msgbox "Byla vyvolaná metoda SampleQuerySave třídy
Sample", 0 + 64,"Upozornění"
Continue = False
Msgbox "Dokument nelze uložit.", 0 + 64,"Upozornění"
End Sub
End Class
---------------------------------------------------------
Věřím, že jste se v tomto dílu dověděli užitečné a zajímavé věci. Nashledanou u příštího dílu.
Autor: David Bulejčík
Datum: 14.01.2004
Sdílet článek Seznam komentářů
Související články: