Odkaz jako na webu
23.07.2007
Lotus Notes
V rámci zlepšování ergonomie aplikací v Lotus Notes ukážu fíčurku, která je sice primitivní, avšak uživatelům zpříjemní život.
Nejprve si ukážeme, o co jde. Mějme aplikaci, kde chceme různé dokumenty bezpečně a ergonomicky linkovat mezi sebou. Linkovat se dá naprosto jednoduše. V pohledu označíte dokument, pravým tlačítkem myši vyvoláte kontextové menu, vyberete položku "Copy as link", přesunete se do dokumentu, odkud chcete linkovat, umístíte kurzor do richtext pole a dáte Ctrl+V. Link je na světě. Ale ouha. Opravdu je to, co chceme?
- Link je prezentován žlutou ikonou, znázorňující list papíru. Žádná konkrétní vazba na text, lze jen vytvořit popup nápovědu.
- Je potřeba richtext pole.
- Ale hlavně! Link se váže na Universal ID cílového dokumentu. Což je špatně.
1. Žlutá ikona je známa dlouhodobým uživatelům Lotus Notes. Newbies ji neznají. Za to znají modré odkazy na internetu. Proč tedy neudělat odkaz tak, jak si ho většina lidí podvědomě představuje?
2. Nepotřebujeme richtext pole, abychom mohli linkovat dokumenty mezi sebou. Stačí nám obyčejné textové pole.
3. Universal ID je jednoznačný identifikátor dokumentu v rámci Lotus Notes. Obsahuje 32 znaků, náhodně vygenerovaných při vytvoření dokumentu. Každý dokument má své Universal ID. Říkáte si, v čem je tedy problém?
Problém je v tom, že Universal ID není pevná položka. Označte si v pohledu dokument a vyvolejte jeho vlastnosti (levý alt+enter). Otevřete pátou záložku (Meta) a v poli Identifier najdete URL dokumentu. Poslední část URL je Universal ID. To si zkopírujte a vložte třeba do prázdného texťáku pro pozdější kontrolu. Teď ten označený dokument z databáze vyjměte pomocí Ctrl+X a zase ho vložte zpět pomocí Ctrl+V. Zopakujte postup pro získání Universal ID a oba identifikátory v texťáku porovnejte. Jsou jiné, že. Kak éto vozmuóžno?
Vysvětlení je triviální. Aby bylo docíleno skutečné jednoznačnosti identifikátoru, systém ho při každém vložení dokumentu změní. Neptá se, zda se již v databázi nachází. Nic nezkoumá, neřeší, prostě ho změní. A je to tak správně. Jen díky tomu, že ho pokaždé generuje znovu, je docíleno jednoznačnosti.
Takže, jak na to. Potřebujeme, aby každý dokument v naší aplikaci měl pole DocID typu Computed When Composed, do kterého napočítáme vlastní identifikátor. Můžete použít iniciační UNID, nebo si vygenerovat nějaký jiný. Já používám způsob, který jsem převzal od Martina Sedláčka, mého bývalého kolegy:
@RightBack(@Unique; "-") + @LeftBack(@Unique; "-") + @RightBack(@Unique; "-")
Říkáte si proč tři @Unique za sebou? Proč nestačí jeden? Při ručním vytváření dokumentů by to bylo dostačující, avšak pokud budete generovat tisíce dokumentů skriptem, pravděpodobně dojde k duplicitám. Proto tři.
Dále potřebujeme pole DocTitle. DocTitle je univerzální pole pro zobrazení názvu, předmětu, či jména. Tedy jakási univerzální vizulální položka. Máte v aplikaci třeba dokument typu Osoba, kde vyplňujete FirstName a LastName. Pak tam máte dokument typy Medium, kde vyplňujete Title. A nakonec tam máte třeba dokument typu Message, kde vyplňujete Subject. Určitě se vám nechce řešit nějakou podmínkou @If(Form="Medium"; "Title"; Form="Person"; LastName + ", " + FirstName; ..., který typ dokumentu zobrazujete. Není nic jednoduššího, než si v poli DocTitle typu Computed vypočítat název dokumentu, na který budeme při linkování odkazovat.
Dále potřebujeme dva pohledy. Dejme tomu, že linkujeme z dokumentu typu Project na dokument typu Budget. Tedy pohledy budou $PickBudget a $LookBudget. První bude pro zobrazení picklistu, poslední (dejme tomu pátý) sloupec bude skrytý a bude obsahovat tento vzorec: DocId + "#" + DocTitle. Druhý pohled bude mít jen dva sloupce. V prvním, setříděném bude DocID a v druhém @Text(@DocumentUniqueID).
Dále potřebujeme ve formuláři dokumentu, ze kterého budeme odkazovat, vytvořit pro každý link dvě pole. Jedno skryté – TargetDocID a jedno viditelné – TargetDocTitle. TargetDocTitle bude ComputedWhenComposed s prázdnou iniciační hodnotou. K tomu si vytvoříme tlačítko, kterým prolinkujeme náš dokument s cílovým dokumentem. V tlačítku bude následující vzorec:
Choice := @PickList([Custom]:[Single]; ""; "$PickBudget"; "Budget"; "Vyberte prosím budget k tomuto projektu"; 5);
@SetField("TargetDocID"; @Left(Choice; "#"));
@SetField("TargetDocTitle"; @Right(Choice; "#"));
@Command([ViewRefreshFields])
Pole TargetDocTitle bude zobrazeno modře a podtrženě. A tady přichází to hlavní. V návrhovém módu označte pole TargetDocTitle a vyberte z menu Create/Hotspot/Action hotspot. Tím vytvoříte hotspot přes celé pole. Pro formu ještě ve vlastnostech hotspotu odškrtněte položku "Show border around hotspot". A pak vložte následující vzorec:
Server := @Name([CN]; @Subset(@DbName; 1));
RepID := @ReplaceSubstring(@ReplicaID; ":"; "");
UNID := @DbLookup("":"NoCache"; ""; "($LookBudget)"; TargetDocID; 2);
@If(@IsError(UNID); @Return(@Prompt([Ok]; "Chyba"; "Cílový dokument nebyl nalezen!")); "");
@URLOpen("Notes://" + Server + "/" + RepID + "/0/" + UNID)
A je to. Cílem je při nalinkování načíst do obou polí ID a název cílového dokumentu a při kliknutí na hotspot načíst aktuální UNID cílového dokumentu a otevřít notes URL.

Tip navíc. Pokud máte v dokumentu Person kontaktní informace, jako E-mail, nebo Web, použijte stejné hotspot pole.
Pro E-mail napište: @If(@Like(InternetAddress; "%@%.%"); @URLOpen("mailto:" + InternetAddress)
a pro Web @URLOpen(InternetSite). Samozřejmě za předpokladu, že pole s e-mailem se jmenuje Internet Address a pole s URL InternetSite.
