Autor: Bartłomiej Gudowski
Wszelkie prawa zastrzeżone. Publikacja niniejszego dokumentu lub jego fragmentów bez zgody autora zarówno w formie papierowej jak i elektronicznej jest zabroniona.
1
Wstęp
Na wykładzie przedstawione zostały podstawy składni języka programowania LotusScript. LotusScript jest tak naprawdę obiektową wersją języka BASIC
z dostępnym standardowym zestawem klas, których atrybuty i metody pozwalają na swobodną komunikację z klientem Lotus Notes i serwerem Domino.
W niniejszym tutorialu zawarte są proste przykłady najczęściej wykonywanych operacji. Przykłady mają zapoznać studenta z filozofią programowania w języku LotusScript w środowisku Lotus Notes/Domino. W niniejszym tutorialu czytelnik nie znajdzie szczegółowych opisów poszczególnych klas predefiniowanych.
Ten, wraz z licznymi przykładami, znajduje się w pomocy podręcznej Designera w sekcji LotusScript/COM/OLE Classes → LotusScript Classes A-Z.
2
Najczęściej używane klasy
W sekcji tej omówione zostaną najczęściej wykorzystywane w praktyce klasy języka LotusScript.
NotesUIWorkspace dostarcza interfejs programisty do manipulacji workspace’em. Wśród atrybutów tej klasy znajduję się między innymi referencja do obiektu aktualnie otwartego przez użytkownika dokumentu. Zaś wśród metod odpowiedniki większości opcji z menu użytkownika w kliencie Lotus Notes oraz odpowiedniki funkcji @Prompt i @PickList z języka formuł.
NotesUIDocument reprezentuje GUI dokumentu. Klasa ta pozwala sterować formularzem wyświetlającym dokument, można również za jej pomocą odczytywać i modyfikować pola dokumentu. Wśród atrybutów tej klasy znajduje się referencja do obiektu reprezentującego sam dokument.
NotesDocument reprezentuje dokument. Dostarcza wygodny, bardziej bezpośredni niż poprzednia klasa, interfejs programistyczny pozwalający na modyfikację dokumentu. Pola dokumentu automatycznie stają się atrybu-tami tej klasy a więc programista może odwoływać się do pól dokumentu traktując np. jak składowe struktur w języku C.
NotesDocumentCollection klasa kontenerowa reprezentująca zbiór (kolekcję) dokumentów. Podstawowa klasa wykorzystywana wszędzie tam, gdzie skrypt musi operować na zbiorach dokumentów (np. przetwarzanie wyników wyszukiwania).
1
NotesUIView reprezentuje GUI widoków i dostarcza metod pozwalających na manipulację widokiem. Wśród atrybutów tej klasy znajduje się kolekcja zaznaczonych we widoku dokumentów. Tylko za pomocą tej klasy można uzyskać wykaz zaznaczonych przez użytkownika dokumentów.
NotesView reprezentuje widoki. Przez modyfikację odpowiedniego atrybutu tej klasu można programistycznie zmieniać formułę wyboru widoku.
NotesDatabase reprezentuje bazę danych. Za pomocą tej klasy można tworzyć programistycznie nowe bazy danych lub otwierać istniejące.
NotesSession reprezentuje środowisko skryptu, w którym jest wykorzystywane. Umożliwia dostęp do zmiennych środowiskowych, książek adresowych, informacji (takie jak prawa dostępu, przydzielone role) o użytkowniku.
3
Praktyczne wykorzystanie klas LotusScript
W tej sekcji przedstawione są praktyczne przykłady wykorzystania klas LotusScript wraz z komentarzami.
3.1
Jak uzyskać dostęp do bieżącego dokumentu?
Jeśli potrzebny jest nam dostęp zarówno do GUI dokumentu jak i do samego dokumentu możemy posłużyć się następującym kawałkiem kodu:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Jeśli
powyższy
skrypt
zostanie
uruchomiony
jako
akcja
przypisa-
na do formularza nie musimy się troszczyć o sprawdzanie zawartości workspace.CurrentDocument – zawsze będzie tam referencja do obiektu klasy NotesUIDocument. W każdym innym przypadku, kiedy skrypt jest uruchamia-ny spoza formularza, trzeba sprawdzić czy atrybut ten nie jest równy Nothing.
3.2
Jak wymusić odświeżenie zawartości formularza?
Odświeżanie formularzy jest często wykonywaną czynnością ze względu na to, że podczas odświeżania przeliczana jest zawartość pól obliczanych (oczywiście za wyjątkiem pól obliczanych tylko przy tworzeniu dokumentu). W celu odświeżenia formularza trzeba wywołać metodę Refresh z klasy NotesUIDocument na obiekcie reprezentującym GUI dokumentu, który chcemy odświeżyć:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Call uidoc.Refresh
2
Podobnie jak to ma miejsce w języku formuł, jeśli metoda/funkcja nie przyj-muje żadnych argumentów nie musimy, tak jak w języku C, podawać pustych nawiasów. Natomiast ważne jest to, że każdą metodę, która nie zwraca wyniku musimy wywoływać poprzez instrukcję Call.
Odświeżanie dokumentu najczęściej wykonuje się kiedy kursor opuszcza jakieś pole. Aby odświeżyć dokument kiedy kursor opuszcza wskazane pole należy w Designerze wybrać to pole lewym przyciskiem myszy a następnie na drzewie atrybutów odnaleźć atrybut o nazwie Exiting. Wartość tego atrybutu powinna wyglądać następująco:
Sub Exiting(Source As Field)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Call uidoc.Refresh
End Sub
3.3
Jak zapisać i zamknąć dokument?
Oczywiście jeśli skrypt ma tylko zapisać i zamknąć dokument nie ma sensu go pisać w LotusScript. Przy użyciu języka formuł można to zapisać krócej. Ale czę-
sto i gęsto zapis i zamknięci dokumentu kończy całą sekwencję operacji. W tym celu musimy się posłużyć metodami Save i Close z klasy NotesUIDocument: Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Call uidoc.Save
Call uidoc.Close
Uwaga: dokument musi znajdować się w trybie edycji żeby dało się go zapisać.
3.4
Jak zablokować przejście do trybu edycji?
Programista może zablokować programowo możliwość przejścia z trybu odczytu dokumentu do trybu edycji dokumentu. Aby to zrobić trzeba w Designerze rozwinąć na drzewku obiektów formularza obiekt reprezentujący sam formularz (tam gdzie ustawiamy tytuł formularza), a następnie wybrać atrybut QueryModeChange. Atrybut ten może być skryptem napisanym w języku formuł bądź w LotusScript. Jeśli wybierzemy LotusScript to wynik zwracamy poprzez zmienną wariantową Continue przekazaną jako argument (sic!) do procedury.
Sub Querymodechange(Source As NotesUIDocument, Continue As Variant) Dim doc As NotesDocument
Dim formula As String
Dim wynik As Variant
Set doc = Source.Document
If Source.EditMode = 0 Then
3
formula$ = "@IsMember(""[Boss]""; @UserRoles)"
wynik = Evaluate(formula$, doc)
Continue = wynik(0)
Else
Contiune = True
End If
End Sub
W powyższym przykładzie wykorzystujemy wynik działania formuły wywo-
łanej, w kontekście dokumentu, z poziomu LotusScripta, która sprawdza czy użytkownik posiada rolę [Boss] (po prostu z poziomu formuł znacznie łatwiej sprawdzić przypisane role i w ogóle łatwiej operuje się na listach). Zanim ją jednak wywołamy, musimy sprawdzić czy dokument przechodzi z trybu do odczytu do trybu edycji. Jeśli tak, wywołujemy formułę i sprawdzamy czy użytkownik jest bossem. Jeśli nie jest, blokujemy możliwość przejścia do edycji dokumentu (zmienna wariantowa Continue dostaje wartość False).
3.5
Jak odczytać zawartość pola?
Pola dokumentów z poziomu LotusScript możemy odczytywać na dwa sposoby:
• z poziomu klasy NotesUIDocument,
• z poziomu klasy NotesDocument w sposób wygodniejszy i bardziej bezpośredni.
Z
poziomu
klasy
NotesUIDocument
musimy
posłużyć
się
metodą
FieldGetText (proszę zwrócić uwagę, że metoda ta zawsze zwraca odczytaną wartość jako ciąg znakowy!). Poniższy przykład wyświetla połączoną zawartość pól Imie i Nazwisko (oczywiście zakładamy, że dokument, w którego kontekście uruchamiamy przykład posiada te pola):
’ prosze przeczytać uwagi dotyczące instrukcji %Include
%Include "lsconst.lss"
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Messagebox uidoc.FieldGetText("Imie") & " " _
& uidoc.FieldGetText("Nazwisko"), _
MB_OK, "Komunikat"
W powyższym przykładzie korzystamy z instrukcji %Include, której wpro-wadzenie w kodzie procedury może się skończyć zasygnalizowaniem błędu skła-dniowego. Komendę tę należy wprowadzić w sekcji (Declarations). Nie wszyst-kie obiekty w panelu programistycznym posiadają ten atrybut. Np. jedynym atrybutem przycisku akcji jest procedura Click. W takim przypadku należy od-szukać sekcję deklaracji obiektu głównego. Np. dla widoku o nazwie „Spis osób”
obiekt deklaratywny będzie oznaczony jako Spis osób (Globals) i to on będzie zawierał sekcję deklaracji gdzie będzie można wpisać instrukcję %Include.
W pierwszym wierszu powyższego przykładu ładujemy predefiniowane stałe, a wśród nich stałą MB OK używaną do określenie typu okienka dialogowego z 4
komunikatem wyświetlanego przez instrukcję Messagebox (nie trzeba używać metody Prompt z klasy NotesUIWorkspace).
A teraz wyświetlimy to samo ale odczytując bezpośrednio zadane pola z obiektu reprezentującego dokument. Możemy przy tym skorzystać z tak zwa-nej składni rozszerzonej pozwalającej traktować pola dokumenty jak atrybuty obiektu klasy NotesDocument. Trzeba tylko zwrócić uwagę na zwracane wartości, a te są identyczne jak dla metody GetItemValue. Dla przykładu pola tekstowe są traktowane jako tablica ciągów znakowych nawet jeśli są to pola jednowartościowe.
’ prosze przeczytać uwagi dotyczące instrukcji %Include
%Include "lsconst.lss"
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Messagebox doc.Imie(0) & " " & doc.Nazwisko(0), MB_OK, "Komunikat"
W analogiczny sposób odwołujemy się do pól dokumentu jeśli chcemy zmodyfikować pole. Możemy też skorzystać z metody ReplaceItemValue. W każdej chwili możemy za pomocą metody HasItem sprawdzić czy dokument posiada pole o zadanej nazwie.
3.6
Jak odczytać, które dokumenty zostały zaznaczone we
widoku?
Użytkownik może zaznaczyć jeden lub kilka dokumentów we widoku sta-wiając na lewym marginesie widoku „ptaszka” przy zaznaczanym dokumencie. Osobną sprawą jest ustalenie, który dokument jest aktualnie wskazywany przez kursor widoku (czarna ramka otaczająca pojedynczy wiersz we widoku).
W obydwu przypadkach dostęp do potrzebnych programiście informacji daje klasa NotesUIView.
W
przykładzie
poniżej
pokazano
jak
uzyskać
refencję
do
obiektu
NotesDocument reprezentującego dokument wskazywany przez kursor widoku. Proszę zwrócić uwagę na następujące rzeczy:
• Atrybut CaretNoteID nie przechowuje unikalnego ID dokumentu (UNID) tylko zwykłe ID dokumentu. Zwykłe ID jest kombinacją ośmiu cyfr i liter i identyfikuje jednoznacznie dokument w bazie danych, z którą pracujemy. Tymczasem UNID jednoznacznie identyfikuje dokument po-
śród wszystkich replik bazy danych. Metoda GetDocumentByID wy-szukuje dokument po jego zwykłym ID (w przeciwieństwie do metody GetDocumentByUNID, która z kolei operuje na unikalnym ID).
• Należy zawsze sprawdzać wynik zwrócony przez GetDocumentByID. W
przypadku gdy we widoku znajdują się kolumny grupujące dokumenty w kategorie kursor może się znaleźć nad wierszem nie reprezentującym żadnego dokumentu a tylko kategorię. W takim przpadku CaretNoteID
przechowuje ID o specjalnej wartości, które po przekazaniu jako argument do metody GetDocumentByID skutkuje zwróceniem wartości Nothing.
5
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim uiview As NotesUIView
Dim db As NotesDatabase
Dim doc As NotesDocument
Set uiview = ws.CurrentView
Set db = session.CurrentDatabase
Set doc = db.GetDocumentByID(uiview.CaretNoteID)
If Not (doc Is Nothing) Then
’ tu można coś zrobić z dokumentem
End If
Natomiast, ażeby uzyskać zbiór dokumentów zaznaczonych przez użytkownika we widoku musimy się posłużyć atrybutem Documents z klasy NotesUIView:
Dim workspace As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim dc As NotesDocumentCollection
Set uiview = workspace.CurrentView
Set dc = CurrentView.Documents
W powyższym przykładzie otrzymujemy kolekcję (zbiór) zaznaczonych we widoku dokumentów (może być pusta jeśli żaden dokument nie został zaznaczony). Więcej o kolekcjach dokumentów czytelnik znajdzie w sekcji 3.7. W przykładzie poniżej obliczamy sumę pensji wybranych pracowników i wyświetlamy wynik w okienku dialogowym. W każdej iteracji sprawdzamy czy dokument posiada pole Pensja.
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim suma As Double
Set uiview = workspace.CurrentView
Set dc = uiview.Documents
Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
If doc.HasItem("Pensja") Then
suma = suma + Cdbl(doc.GetItemValue("Pensja")(0))
End If
Set doc = dc.GetNextDocument(doc)
Wend
Messagebox suma,, "Suma pensji"
End Sub
Uwaga: w przykładzie wykorzystano alternatywny sposób odczytu pól dokumentu. Poniższe dwie linijki kodu są sobie równoważne:
6
t = lastDoc.GetItemValue( "Topic" )
t = lastDoc.Topic
3.7
Kolekcje dokumentów
Kolekcje dokumentów pojawiają się przy przeszukiwaniu baz czy też przy przetwarzaniu listy zaznaczonych przez użytkownika dokumentów. Dokumenty czyli obiekty klasy NotesDocument mogą być grupowane w obiektach-kontenerach klasy NotesDocumentCollection. Dany dokument może należeć do dowolnej liczby kolekcji. Kolekcje dokumentów można iterować na różne sposoby:
• albo
z
wykorzystaniem
metod
iteracyjnych
samej
klasy
NotesDocumentCollection,
• albo przy użyciu instrukcji ForAll.
Przykład
wykorzystania
metod
iteracyjnych
klasy
NotesDocumentCollection w klasycznej pętli while:
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
...
Set doc = dc.GetFirstDocument’ doc zawiera referencje do
’ pierwszego dokumentu w kolekcji
’ lub wartość specjalną Nothing
While Not (doc Is Nothing)
’ iterujemy dopóki doc nie jest Nothing
’ tu możemy wykonywać operacje na dokumencie
’ którego referencję mamy w zmiennej doc
...
’ teraz pobieramy referencję do następnego dokumentu
’ jeżeli nie ma następnego dokumentu dostaniemy Nothing
Set doc = dc.GetNextDocument(doc)
Wend
Za pomocą metod GetFirstDocument i GetNextDocument możemy iterować kolekcję „do przodu”. Natomiast przy użyciu metod GetLastDocument i GetPrevDocument możemy iterować kolekcję „do tyłu”. Jak widać kolejność dokumentów w kolekcji jest istotna i wynika z kolejności w jakiej dokumenty były dodawane do kolekcji (programista może tworzyć własne kolekcje). Referencję do n-tego dokumentu w kolekcji zwróci nam GetNthDocument (można stosować jeśli potrzebujemy wydobyć z kolekcji jeden dokument, nie powinno się stosować tej metody do iteracji kolekcji!).
A teraz przykład wykorzystania instrukcji ForAll:
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
...
ForAll doc In dc
’ tu możemy wykonywać operacje na dokumencie
’ którego referencję mamy w zmiennej doc
...
End ForAll
7
Instrukcję ForAll możemy stosować do iteracji kolekcji w przypadkach gdy kolejność przetwarzania elementów kolekcji nie jest istotna.
3.8
Przeszukiwanie bazy
W języku LotusScript operacje przeszukiwania bazy wykonujemy z wykorzystaniem metod klasy NotesDatabase:
FTDomainSearch przeprowadza przeszukiwanie pełnotekstowe bazy. Baza musi być dodana w katalogu domeny oraz musi być włączona opcja indeksowania wielobazowego (indeksowanie łączone).
FTSearch przeprowadza zwykłe przeszukiwanie pełnotekstowe bazy. Metoda nie wymaga aby baza miała włączoną opcję indeksowania do wyszukiwania pełnotekstowego jednakże włączenie tej opcji (przy zakładaniu lub póź-
niej, ręcznie tworząc indeks poprzez właściwości bazy) znacznie przyspie-sza wyszukiwanie. Przeszukiwanie pełnotekstowe polega na wyszukiwaniu dokumentów, w których polach (dowolnych) występuje szukana fraza.
Uwaga: również klasa NotesView posiada metodę FTSearch, której dzia-
łanie jest identyczne z jednym wyjątkiem — przeszukiwana jest nie cała baza a jedynie zbiór dokumentów wyświetlanych w podanym widoku.
FTSearchRange jest odrobinę zmodyfikowaną wersją metody FTSearch. Pozwala podać, od którego dokumentu pasującego do wzorca ma się zaczynać wynik. Np.: jeśli do podanego wzorca pasuje 100 dokumentów możemy sobie zażyczyć żeby jako wynik zostały zwrócone dokumenty od 50-go do końca.
Search pozwala przeszukiwać bazę wybierając dokumenty za pomocą formuły wyboru podobnej do formuły filtrującej jakiej używają widoki. Metoda wymaga podania jako jeden z argumentów daty określającej jak „stare”
dokumenty mają być brane pod uwagę przy przeszukiwaniu.
Każda z wymienionych powyżej metod zwraca kolekcję dokumentów speł-
niających zdane kryteria wyszukiwania. W przypadku gdy nie ma takich dokumentów bazie metody nadal zwracają referencję do kolekcji dokumentów, z tym że po prostu jest ona pusta.
W poniższym przykładzie używamy metody Search celem znalezienia w bie-
żącej bazie danych wszystkich dokumentów, w których istnieje pole Nazwisko i zawarte w tym polu nazwisko zaczyna się na literę „K”.
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim dt As New NotesDateTime("01/01/2000")
’ dzięki sufiksowi nie musimy deklarować typu zmiennej
’ proszę zwrócić uwagę na ograniczniki ciągu znakowego
searchFormula$ = { Form="Osoba" & @IsAvailable(Nazwisko) } _
& { & @UpperCase(@Left(Nazwisko;1))="K" }
8
Set db = session.CurrentDatabase
Set dc = db.Search(searchFormula$, dt, 0)
ForAll doc In dc
’ tu możemy wykonywać operacje na dokumencie
’ którego referencję mamy w zmiennej doc
...
End ForAll
3.9
Programowe tworzenie nowych dokumentów
Dowolny dokument może być stworzony nie tylko przy użyciu formularza, ale również przez stworzenie nowego obiektu klasy NotesDocument i dodanie dowolnego zestawu pól. Musimy jednak pamiętać, że jeśli dokument ma być oglądany/modyfikowany przez użytkowników trzeba go powiązać z jakimś formularzem przez ustawienie nazwy formularza w polu tekstowym Form.
W poniższym przykładzie pokazano jak dodać programowo nowy dokument do bazy danych osobowych, którą rozwijaliśmy na wykładzie:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set doc = db.CreateDocument
’ utworzenie nowego dokumentu
doc.Form = "Osoba"
’ ustawienie nazwy formularza
doc.Imie = "Jan"
’ dodanie pola Imie i nadanie mu wartości
doc.Nazwisko = "Kowalski"
Call doc.Save(True, True)
’ dokument _trzeba_ zapisać w bazie
Każdy nowoutworzony bądź zmodyfikowany istniejący dokument trzeba zapisać w bazie przy użyciu metody Save. Jeśli wykonujemy operację zapisu na obiekcie klasy NotesDocument nie ma znaczenia czy ten dokument jest otwarty w kliencie. Jeśli tylko użytkownik, z którego prawami działa skrypt, ma odpowiedni poziom uprawnień do bazy, skrypt będzie mógł zapisać dokument. Jeśli użytkownik będzie miał zbyt niski poziom dostępu (np. poziom czytelnika) wtedy zapis nie powiedzie się.
4
Profile
Często w danej aplikacji zachodzi konieczność gromadzenia danych specy-ficznych dla bazy (np. konfiguracja parametrów) lub dla danego użytkownika (koszyk zakupów, ustawienia osobiste, etc.). Akwizycję tego typu danych umoż-
liwiają tzw. profile czyli specjalne dokumenty. Do wyświetlania profili służą formularze profili. Tak naprawdę profile od zwykłych dokumentów odróżnia tylko jedna rzecz: jednemu kluczowi może odpowiadać tylko jeden profil. Jeśli kluczem będzie nazwisko to dla nazwiska „Kowalski” może istnieć tylko jeden profil w bazie niezależnie od tego ilu będzie w niej Kowalskich. A zatem klucz przypisany profilowi powinien być unikalny. Jeśli do profilu nie został przypisany klucz ro-lę klucza spełnia nazwa profilu czyli de facto nazwa formularza profilu, który został bądź przypisany programistycznie lub został użyty do utworzenia profilu.
9
Jak tworzyć profile?
Profile można tworzyć na dwa sposoby:
• przy użyciu formularza profilu,
• programistycznie z poziomu języka formuł bądź LotusScript.
Uwaga: dokumenty profili można kasować tylko i wyłącznie programistycznie z poziomu LotusScript!
4.2
Jak stworzyć formularz profilu?
1. Utwórz formularz z polami, które mają przechowywać wartości, które chcesz zapisać w profilu.
2. Z menu kontekstowego wybierz właściwości formularza i dezaktywuj opcję Include in Menu żeby nie można było tworzyć nowych dokumentów przy użyciu tego formularza przez menu Create.
3. Zapisz formularz pod wybraną nazwą.
4. Zadbaj aby dokumenty utworzone przy użyciu tego formularza nie mogły się pojawić w żadnym widoku.
5. Dodaj
w
wybranym
przez
siebie
miejscu
przycisk
bądź
ak-
cję
i
w
stosownym
skrypcie
skorzystaj
z
poziomu
Lotus-
Script
z
metody
NotesDatabase.GetProfileDocument
bądź
NotesUIWorkspace.EditProfile,
albo
z
poziomu
języka
formuł
z
funkcji
@SetProfileField,
@GetProfileField
bądź
z
komendy
@Command([EditProfileDocument].
4.3
Jak stworzyć profil programistycznie?
Z poziomu języka formuł wystarczy wywołać funkcję @SetProfileField. Jeśli spróbujemy zapisać pole nieistniejącego profilu wtedy zostanie on utworzony. Je-
żeli profil o podanej nazwie już istnieje zostanie zmodyfikowane pole istniejącego profilu. Proszę pamiętać, że jeśli nie stosujemy kluczy (które są opcjonalnymi argumentami funkcji @SetProfileField i @GetProfileField) wtedy w całej bazie może istnieć tylko jeden profil mający daną nazwę.
Z kolei z poziomu LotusScript korzystamy z metody GetProfileDocument z
klasy
NotesDatabase.
Metoda
zwraca
referencję
do
obiektu
klasy
NotesDocument reprezentującego profil. Jeśli profil o podanej nazwie nie istnieje (bądź nie istnieje profil o podanej nazwie i przypisanym kluczu) metoda domyślnie utworzy nowy profil. Należy pamiętać o zapisaniu dokumentu w bazie.
W poniższym przykładzie pokazano jak można by utworzyć/odwoływać się do profilu pełniącego funkcję koszyka użytkownika. W roli unikalnego klucza wystąpi nazwa użytkownika w postaci kanonicznej.
Dim session As New NotesSession
Dim db As NotesDatabase
Dim profil As NotesDocument
10
Set db = session.CurrentDatabase
Set doc = db.GetProfileDocument("Koszyk", session.UserName) 11