abOut.nsf

新旧かまわず、またお役立ち度にあまりこだわらずに、 拡張子がnsfであるNoSQLなデータベースファイルと、それを扱うコラボレーション製品に絡んでのあれこれを。

2016/05

LotusScriptに関する、こんな雑談です。
処理の最初に 画面上の文書と現在のDBを取得するようなコードについて。
ふつうだと、こんな感じでしょうか。

    <方法1>
    Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim curDb As NotesDatabase
    Dim uiDoc As NotesUIDocument

    Set curDb = session.CurrentDatabase '現在のDB取得
    Set uiDoc = ws.CurrentDocument '画面の文書取得

    :
わたしは、こんな書き方をすることにしています。
    方法2>
    Dim ws As New NotesUIWorkspace
    Dim uiDoc As NotesUIDocument
    Dim curDb As NotesDatabase

    Set uiDoc = ws.CurrentDocument '画面の文書取得
    Set curDb = uiDoc.Document.ParentDatabase '現在のDB取得
    :

NotesSessionを定義しない分、コードが1行節約できるから、でもあるのですが。
もうひとつの理由は、NotesUIDocumentと紐づくNotesDatabaseが確実に取得できるためです。
    詳細をもう覚えていませんが2002年ころいちどだけ、
    NotesUIWorkspace.CurrentDocumentのDBが、session.CurrentDatabaseとは別のDBだった、
    という不可思議な体験があり、この時が
    方法1でした
    そんな次第での用心もあって、文書画面とDBが確実にリンクする方法2を使っています。
おはずかしながら、詳細の記憶がなく原因もわからずじまいでしたし、ほかに方法1でエラーに遭ったという事例を聞いたためしもないので
方法2の方がお勧めだよ、とか、声高に言えるものでもありませんが、一度訊いてみたいなとおもいました。

LotusScriptの経験者で、方法2で書かれてる方、おいででしょうか。

余談ですが、以前は"NotesのWeb化"といえばフォームやビューのままWeb化する技術を指しました。
2008-2009年にXPagesでWeb化する技術が追加されてから、どちらを指すのかまぎらわしくないよう
従来の技術については、
英語圏ではよく"Classical"という表現を使って、後から出てきたXPagesと区別しています。
あまり使われない過去の技術といわれてる気もして、あまりいい気がしないのですが
ほかに流通している表現もないので。。
そんなClassicalな作文の続きです。
 

以前書いたように、従来型(Classical)のNotes Web化では
WebQuery- イベントの代わりに $$Query- 予約フィールドが使えます。
ただ、こんな留意点があります。

条件付きでエージェントを起動させたいとき。

WebQuery- イベントは、@ToolsRunMacroでエージェントを起動しますので、式はこんな感じになるでしょう。
    @If(<条件>;@ToolsRunMacro("<エージェント名>");"");
代わりに$$Query- フィールドを使う場合は、エージェント名を直接戻すので、こうすればいいかな?
    @If(<条件>;("<エージェント名>");"");
ところが、いざやってみると。

    編集モードで画面を開いたときだけエージェントを起動したいと、$$QueryOpenAgentフィールドに
    @If(@IsDocBeingEdited;("<エージェント名>");""); と、
    イメージ 2

    式を入れてから、画面を開こうとしたところ
    イメージ 1

    あれ、404エラー。。
どうやら、$$Query- フィールドを用意する場合、エージェント名が必須になるようです。
無条件で指定のエージェントを実行しようとするつくりのようです。

条件付きで実行しないというのはナシ、必ず何かエージェントがないとエラーになる。

だから、編集モードでないとき、「""」…名なしのエージェント  を実行しようとして、
そんなもの見つからないよ、とエラーを返しているようです。

ではどうするか。

開始しても何もせずに終了するダミーのエージェントを作っておいて、それを実行させる
    @If(@IsDocBeingEdited;("<エージェント名>");"<ダミーのエージェント名>");
たぶんできると思いますが、無意味な設計要素を増やすやり方は、私はなるだけ避けたいので

$$QueryOpenAgentフィールドの式で条件を入れるのをやめ、
    "<エージェント名>" に、戻した上で、エージェント内で条件を入れました。
エージェント内のLotusScriptにて、
DocumentContextで取得した文書がEditModeでなければ後の処理を行わない、という式を書いています。


以上、$$Query- フィールドを使う場合は、実在のエージェントを指定し、それを常に実行することになる 
というお話でした。

$$QueryOpenAgentフィールドでお話を書きましたが、やってみると$$QuerySaveAgentフィールドも同様のようです。

↑このページのトップヘ