LotusScript® 言語を Domino で使用する方法を紹介する 3 つのレッスンの 2 番目です。先にレッスン 1 を終了しておいてください。
レッスン 2 では、Learning LotusScript データベースの [By Category] ビューのカテゴリに含まれる文書を数えるスクリプトを作成します。このスクリプトはエージェントから実行されます。
テストデータベースにエージェントの実行対象となる文書を 3 つ追加します。
スクリプトはエージェントが起動すると実行されるため、最初に Domino Designer でエージェントを作成します。
次の手順では何も作成しません。Domino クラスに精通することを目的とします。
これまでの手順でスクリプトを入力する準備が整いました。次の例を参考にしてサブルーチンを編集します。「Category 1」のところは、必要に応じて自分の入力したカテゴリ名に替えて使用してください。
Sub Initialize
Dim db As NotesDatabase
Dim view As NotesView
Dim nav As NotesViewNavigator
Dim entry As NotesViewEntry
Dim count As Integer
Set db = New NotesDatabase( "", "Learning LotusScript.nsf" )
Set view = db.GetView( "By Category" )
view.AutoUpdate = False
Set nav = view.CreateViewNavFromCategory( "Category 1" )
Set entry = nav.GetFirstDocument
count = 0
' begin counting documents
' stop when there are no more documents
Do Until entry Is Nothing
count = count + 1
Set entry = nav.GetNextDocument( entry )
Loop
Messagebox "Number of documents = " & count,, "Category 1"
End Sub
文書数が 0 または予想した通りの数でない場合は、スクリプト内の CreateNavFromCategory に正しいカテゴリ名が指定されているか確認してください。修正したら再コンパイルして保存します。また指定したカテゴリにテスト用の文書がいくつか作成されていることを確認してください。
よくあるエラーはビューの名前を正しく指定しない場合です。この場合「view」は何も設定されていないため、実際の NotesView オブジェクトと関連付けられません。「view」をオブジェクト名として使用するときは「オブジェクト変数が設定されていません。」というエラーが表示されます。スクリプトでオブジェクト変数を設定しているステートメントを確認してください。修正したら再コンパイルして、再度テストし直してください。
スクリプトを保存した後で編集する必要はありませんが、必要となった場合のために手順を示します。
入力したスクリプトの意味は次のように表現できます。
Sub Initialize は、サブルーチンの始点を定義します。この行は自動的に作成されます。
Dim db As NotesDatabase はオブジェクト「db」を宣言します。これは NotesDatabase クラスのインスタンスです。
Dim view As NotesView はオブジェクト「view」を宣言します。これは NotesView クラスのインスタンスです。
Dim nav As NotesViewNavigator はオブジェクト「nav」を宣言します。これは NotesViewNavigator クラスのインスタンスです。
Dim entry As NotesViewEntry はオブジェクト「entry」を宣言します。これは NotesViewEntry クラスのインスタンスです。
Dim count as Integer は変数「count」を宣言します。この変数は整数です。
Set db = New NotesDatabase( "", "Learning LotusScript.nsf") は、ローカルに保存されている Learning LotusScript.nsf データベースを参照する「db」の値を設定します。
Set view = db.GetView( "By Category" ) は、GetView が返す値を「view」に設定します。GetView は NotesView オブジェクトを返す NotesDatabase クラスで定義されたメソッドです。パラメータ「By Category」は使用するビューを示しています。GetView を呼び出すのに「db」を使用するため、GetView は Learning LotusScript.nsf のビューを示すオブジェクトを返します。
View.AutoUpdate = False は、ビューで変更が発生した場合にビューのオブジェクトを自動更新しません。こうすると、パフォーマンスが向上し、ビューナビゲータが予期しないエントリに遭遇することがありません。
Set nav = view.CreateViewNavFromCategory( "Category 1" ) は、CreateViewNavFromCategory が返す値を「nav」に設定します。CreateViewNavFromCategory は NotesViewNavigator オブジェクトを返す NotesView クラスで定義されたメソッドです。パラメータはデータベースのカテゴリ名である必要があります。「nav」は、パラメータ名のカテゴリの下に入っているすべてのエントリで構成されていることになります。
Set entry = nav.GetFirstDocument は、GetFirstDocument が返す値を「entry」に設定します。GetFirstDocument は NotesViewEntry オブジェクトを返す NotesViewNavigator クラスで定義されたメソッドです。カテゴリではなく文書を表す最初のビューエントリを返します。
count = 0 は「count」に 0 を設定します。オブジェクトの値を設定するには Set を使用しますが、整数の値や通常のデータ型の値を設定するのに Set を使用しないで ください。
レッスン 1 ではプロパティについて学習しました。プロパティはオブジェクトの属性を表します。このレッスンではオブジェクトのメソッドを学びます。メソッドはオブジェクトの動作を表します。メソッドをスクリプトで使用するには、次の 4 つの要素が必要です。
プロパティと同様に、メソッドは属しているオブジェクトが分かっている場合にだけ使用できます。したがって、メソッドを使用するにはオブジェクトを指定します。例えば、GetView メソッドは属しているデータベースが分かっている場合だけ使用できます。したがって、「db」オブジェクトを指定してこのメソッドにアクセスします。同様に、GetFirstDocument メソッドも属しているビューが分かっている場合にだけ使用できます。したがって、「view」オブジェクトを指定してこのメソッドにアクセスします。
メソッドの中には関数のように値を返すものもあります。またサブルーチンのようにメソッドの中には値を返さないものもあります。
' begin counting documents
' stop when there are no more documents
この 2 行はスクリプトの動作を説明するコメントです。LotusScript ではアポストロフィ (') またはキーワード REM で始まる行は無視されます。
Do Until エントリ Is Nothing はループの始点を定義し、ループが終了する条件を指定します。「entry」オブジェクトが Nothing になるまで、ループが実行されます。
Loop はループの終点を定義します。Do Until entry Is Nothing と Loop の間の行はループの本体です。
Nothing は LotusScript のキーワードであり、Null オブジェクト (空のオブジェクト) を意味します。例えば、「entry」オブジェクトは最初に宣言されたときは Nothing であり、値を代入するまで Nothing のままです。GetNextDocument メソッドはビューにある最後の文書をパラメータとして受け取ると、その次の文書がないので Nothing を返します。このスクリプトでは、Nothing はカウントの終了を意味します。
[By Category] ビューに文書がないと、ループ本体はまったく実行されません。ビューに文書が 1 つあると、ループ本体は 1 回実行されます。2 つあると 2 回、3 つあると 3 回実行されます (以下同様)。
Messagebox "Number of documents = " & count,, "Category 1" は「count」の値を画面上のダイアログボックスに表示します。
End Sub はサブルーチンの終点を定義します。
学習した内容を使用して、Learning LotusScript データベースの [By Category] ビューのカテゴリを数える別のスクリプトを作成してください。スクリプトでは、ビューのすべてのエントリを表すビューナビゲータを作る必要があります。まず最初のエントリを数えます。このエントリはカテゴリ分けされたビューのカテゴリエントリを表します。順に次のカテゴリエントリを数えていき、数えるエントリがなくなると終了します。[リファレンス] タブを使用して必要なメソッドやプロパティを検索しましょう。
ここで必要なメソッドは NotesView クラスの CreateViewNav と、NotesViewNavigator クラスの GetFirst と GetNextCategory です。パラメータのない CreateViewNav は、ビュー全体を表す NotesViewNavigator オブジェクトを作成します。次に解答例を示します。
Sub Initialize
Dim db As NotesDatabase
Dim view As NotesView
Dim nav As NotesViewNavigator
Dim entry As NotesViewEntry
Dim count As Integer
Set db = New NotesDatabase( "", "Learning LotusScript.nsf" )
Set view = db.GetView( "By Category" )
view.AutoUpdate = False
Set nav = view.CreateViewNav( )
Set entry = nav.GetFirst
count = 0
' begin counting categories
' stop when there are no more categories
Do Until entry Is Nothing
count = count + 1
Set entry = nav.GetNextCategory( entry )
Loop
Messagebox "Number of categories = " & count,, "By Category"
End Sub