レッスン 2: ビューカテゴリの文書を数える

LotusScript® 言語を Domino で使用する方法を紹介する 3 つのレッスンの 2 番目です。先にレッスン 1 を終了しておいてください。

レッスン 2 では、Learning LotusScript データベースの [By Category] ビューのカテゴリに含まれる文書を数えるスクリプトを作成します。このスクリプトはエージェントから実行されます。

手順 A: テストデータベースへ文書を追加する

テストデータベースにエージェントの実行対象となる文書を 3 つ追加します。

  1. Notes クライアントでレッスン 1 で作成した Learning LotusScript データベースを開きます (あるいは Domino Designer でデータベースのビューをプリビューします)。
  2. 新しい「メイントピック」文書を 3 つ以上作成し保存します。文書タイトルとカテゴリを必ず入力してください。「Subject 1」や「Category 1」などの名前で結構です。複数の文書に同じカテゴリを使用します。

手順 B: エージェントを作成する

スクリプトはエージェントが起動すると実行されるため、最初に Domino Designer でエージェントを作成します。

  1. 設計ペインで [エージェント] を選択し [新規エージェント] をクリックします。[エージェント] インフォボックスが表示されます。プログラムペインが隣に表示されます。
  2. エージェントに「文書のカウント」という名前を付けます。
  3. [共有] オプションを選択します。
  4. [実行] セクションで [イベント] トリガーをクリックし、ドロップダウンボックスから [アクションメニューから手動で] を選択します。
  5. ターゲットには [データベースのすべての文書] を選択します。
  6. プログラムペインの [実行] メニューから [LotusScript] を選択します。
  7. [オブジェクト] タブでプログラム可能なイベントから [Initialize] を選択します。

手順 C: [リファレンス] タブにアクセスする

次の手順では何も作成しません。Domino クラスに精通することを目的とします。

  1. インフォリストで、[リファレンス] タブを選択します。
  2. [Domino: Classes] を選択して NotesDatabase を展開します。
  3. [NotesDatabase] の [Methods] を展開します。前のレッスンでメソッドの内容はすでに確認しているので、今度は実際に使用してみます。
  4. GetView メソッドが見つかるまでスクロールします。メソッドが返す値はメソッドの最後の「As」の後に表示されています。GetView メソッドは NotesView オブジェクトを返します。
  5. [Domino: Classes] の下に表示される NotesView を展開します。このクラスはデータベースのビューを表します。
  6. [NotesView] の下に表示される [Methods] を展開し、CreateViewNav で始まるメソッドが見つかるまでスクロールします。これらのメソッドは NotesViewNavigator オブジェクトを返します。
  7. [NotesViewNavigator] の下に表示される [Methods] を展開し、GetFirstDocument メソッドが見つかるまでスクロールします。このメソッドは NotesViewEntry オブジェクトを返します。
  8. GetNextDocument オブジェクトが見つかるまでスクロールします。このメソッドも NotesViewEntry オブジェクトを返します。

手順 D: スクリプトを入力する

これまでの手順でスクリプトを入力する準備が整いました。次の例を参考にしてサブルーチンを編集します。「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

手順 E: スクリプトのコンパイルとテストを行う

  1. [ファイル] - [保存] を選択します。
  2. 「スクリプトエラーによりデータを保存しませんでした。」というメッセージが表示された場合は、プログラムペインの最下部に表示されるエラーを確認します。入力した内容をダブルチェックして、手順 D のスクリプトと同じかどうかを確認します。
  3. [ファイル] - [閉じる] を選択します。
  4. エージェントが選択されていることを確認して [アクション] - [実行] を選択します。「Category 1」(または指定したカテゴリ) にある文書数を示すダイアログボックスが表示されます。

    文書数が 0 または予想した通りの数でない場合は、スクリプト内の CreateNavFromCategory に正しいカテゴリ名が指定されているか確認してください。修正したら再コンパイルして保存します。また指定したカテゴリにテスト用の文書がいくつか作成されていることを確認してください。

    よくあるエラーはビューの名前を正しく指定しない場合です。この場合「view」は何も設定されていないため、実際の NotesView オブジェクトと関連付けられません。「view」をオブジェクト名として使用するときは「オブジェクト変数が設定されていません。」というエラーが表示されます。スクリプトでオブジェクト変数を設定しているステートメントを確認してください。修正したら再コンパイルして、再度テストし直してください。

手順 F: スクリプトを編集する

スクリプトを保存した後で編集する必要はありませんが、必要となった場合のために手順を示します。

  1. Learning LotusScript データベースが設計ペインに表示されていない場合は、それを開きます。
  2. 設計ペインで [エージェント] をクリックします。
  3. [文書のカウント] エージェントを開きます。
  4. [オブジェクト] タブから [Initialize] を選択します。

レビュー: スクリプトの動作

入力したスクリプトの意味は次のように表現できます。

行 1: サブルーチンを開始する

Sub Initialize は、サブルーチンの始点を定義します。この行は自動的に作成されます。

行 2 から 6: 変数を宣言する

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」を宣言します。この変数は整数です。

行 7 から 11: 変数の値を設定する

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」オブジェクトを指定してこのメソッドにアクセスします。

メソッドの中には関数のように値を返すものもあります。またサブルーチンのようにメソッドの中には値を返さないものもあります。

行 12 から 13: コメントを挿入する

' begin counting documents
' stop when there are no more documents

この 2 行はスクリプトの動作を説明するコメントです。LotusScript ではアポストロフィ (') またはキーワード REM で始まる行は無視されます。

行 14 から 17: ビューの文書を数える

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 回実行されます (以下同様)。

行 18: 結果をダイアログボックスに表示する

Messagebox "Number of documents = " & count,, "Category 1" は「count」の値を画面上のダイアログボックスに表示します。

行 19: サブルーチンを終了する

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