tarのブログるっ

メガネ男子のtarが書くブログです。

エージェントの動作場所も色々

ノーツのエージェントって実行方法によってサーバー上で動作したり、クライアント上で実行されたりと、それぞれ制限事項があるんですよね。

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 にあるエージェントのセキュリティ」を参考に設定すれば良いでしょう。

  • このエントリーをはてなブックマークに追加