DISKUSE
HCL Domino na NAS QNAP (1)
20.02.2024 10:34

Vložení přílohy do dokumentu MS Word (3)
14.02.2024 20:54

Problěmy s diakritikou. (4)
06.02.2024 17:34

AI pomocnici 
15.01.2024 10:16

Export do pdf souboru (1)
12.01.2024 23:11

Agent přestává fungovat (1)
18.11.2023 06:42

RTF - Computed (2)
19.10.2023 13:00

Čtení polí v neuloženém dokumentu 
08.10.2023 17:15


ŠKOLENÍ


REKLAMA


KOMENTÁŘE

OOP v Lotus Scriptu 3

Vytisknout článek

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


Určitě bychom našli i jiné více či méně vhodné příklady. Faktem ale je, že organizační strukturu potřebuji pro své aplikace a proto vám mohu nabídnout pohled na to, jak je možné postupovat při vytváření aplikací, ve kterých má smysl použít objekty. Důvodů použití je několik, ale tím hlavním je výkonné API, které bude programátor využívat v aplikacích, které budou komunikovat s touto databází.

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ářů
 
Od
Téma
 Datum
Jiří Plachý
Finta FŇ
15.01.2004 09:24
Vít Zachodil
Pár praktických prostřehů a otázka ...
10.02.2004 10:09
bubux
ee...
10.02.2004 21:16
Vít Zachodil
Příklad ad1
11.02.2004 09:23
bubux
eee...
13.02.2004 18:39
Pavel Drápal
Díky...
29.04.2004 12:37

Související články:
» 

OOP v Lotus Scriptu 2

 (Programování, 13.10.2003)

» 

OOP v Lotus Scriptu 1

 (Programování, 24.09.2003)