ノーツのエージェントって実行方法によってサーバー上で動作したり、クライアント上で実行されたりと、それぞれ制限事項があるんですよね。
NotesOutlineEntry クラスを通じて、対象のデータベースオブジェクトを取得するエージェントを作ったとき、こんなコトに遭遇したことがあります。
■GetDBObjエージェント
-------------------------------
1: Sub Initialize
2: On Error Goto errstep
3:
4: Dim session As New NotesSession
5: Dim db As NotesDatabase
6:
7: Dim OutlineName As String
8:
9: Dim ol As NotesOutline
10: Dim oe As NotesOutlineEntry
11: Dim oeDB As NotesDatabase
12:
13: Dim message$
14:
15: '取得するアウトライン名を入力( GetOutline で取得するアウトライン名 )
16: OutlineName = "Outline"
17:
18: Set db = session.CurrentDatabase
19: Set ol = db.GetOutline(OutlineName)
20: Set oe = ol.GetFirst() '1番目のアウトラインエントリを取得
21:
22: '実行結果がログに書き出される
23: message = "アウトラインのラベル:" & oe.Label & Chr(13)
24: message = message & "Type:" & oe.Type & Chr(13)'2186 が表示される
25: message = message & "EntryClass:" & oe.EntryClass & Chr(13)'2194 が表示
26: Print message
27:
28: Set oeDB = oe.Database
29:
30: message = "エントリのデータベースタイトル:" & oeDB.title 'エラーで、34行目へ
31: Print message
32: Exit Sub
33:
34: errstep:
35: message = "エラー発生: " & Cstr(Err) & Error & " line: " & Cstr(Erl)
36: Print message
37: Exit Sub
38: End Sub
-------------------------------
上記の「GetDBObj」エージェントをクライアントで実行すると、30行目で「オブジェクト変数が設定されていません」となってしまいます。
スケジュールエージェントに設定すると、エージェントはサーバー上で実行されるのですがこの場合、正常にデータベースオブジェクトが取得できるのです。
調べていくと、NotesOutlineEntry クラスの Database メソッドに関して、公開情報がありました。
内容は、NotesOutlineEntry クラスの Database プロパティを取得する処理はサーバー上で行なわれるべきであるというものです。
クライアントから実行する LotusScript のアクション/エージェントって、通常クライアント側で処理が実行されるんですよ。
そこで、RunOnServer メソッドを使用し、サーバー上で「GetDBObj」エージェントを実行するようにしてみましょう。
具体的にはビュー内のアクションとして下記のコードを記述して実行します。
-------------------------------
1: Sub Initialize
2: Dim s As New NotesSession
3: Dim db As NotesDatabase
4: Dim agent As NotesAgent
5:
6: Dim AgentName As String
7:
8: '呼び出すエージェント名を入力
9: AgentName = "GetDBObj"
10:
11: Set db=s.CurrentDatabase
12:
13: Set agent=db.GetAgent(AgentName)
14: Call agent.RunOnServer 'サーバー上でエージェントを実行する
15: End Sub
-------------------------------
RunOnServer メソッドを使えば、クライアントからのアクションをトリガーとして起動するエージェントでも、サーバー上でエージェントを実行できるので、色々な使い方が出来るのではないでしょうか?
例えば、クライアント上のアクションからメールを送信する場合、Fromフィールドが実行したユーザーになるので、Fromフィールドを代表アドレス等にしたい場合は、こんな方法で実現できるのではないでしょうか。(この方法はノーツ6から可能)
・エージェントのプロパティから「代理で実行」に代表アドレスを登録する。
・ACLに代表アドレスのエントリを追加し、エージェントが実行できる権限を付与する。
・RunOnServerメソッドを使ってアクションを作る。
注意が必要なのは、エージェントが実行できる権限ですね。これは、『Lotus Domino Designer 6 ヘルプ』のサーバーと 「Web にあるエージェントのセキュリティ」を参考に設定すれば良いでしょう。