出直し!! ヘルプ

連載中

連載 終了

2026/03/24

それ、バグじゃなくて“索引”です

先日、ユーザさんからの調査依頼がありました。「ビューに表示されている値と、文書を開いたときの値が違う」というのです。若手担当者にはバグに見えたのでしょう。懸命に調査していました。

しばらくたって、相談を受けたのですが、私のような ”古参 Notes オタ” ならピンときます。なんだかわかりますか?

そうです。「ビューの索引が壊れた」ってやつですね!

そういえば最近の Notes/Domino ではあまり発生しなくなったような気がします。ずいぶん性能が上がって、安定したんでしょうね。私がノーツを始めた 30 年前はよくありました。だからこそ、察しがつくんです。


本当に壊れてる?確認してみよう

私がよく使うビュー索引のチェック方法を紹介します。

対象のビューを Domino Designer で開き、F9 を押し、ビューの中身を表示させます。Designer 上に表示された中身と Notes クライアント上のビューを比較します。差がある場合には索引が壊れている可能性が高いです。


索引の再構築(Shift + F9)

ビュー索引の再構築は Notes クライアントから簡単に行えます。対象のビューを開き、Shift + 'F9' キーを押すだけです。ステータスバーに『索引を再構築します...』とメッセージが表示され、終了すると再構築したビューが表示されます。文書数が多い DB では時間がかかることもあるので注意しましょう。

昔の Notes では、メールでこの操作を行うことがありました。ノーツ利用歴が長い人ほどこの操作になじみがあるのはこのためですね。

ちなみに、Shift をおさない F9 はビューの更新だけなので、索引は再構築されません。


他にもある再構築方法

ビュー索引の再構築は他にもいろいろな手段があります。例えば、

  1. ビューの設計を変更する
  2. サーバコマンド updall -R を使う
  3. Administrator クライアントの[ファイル]タブで、[データベース]-[ビューの管理...]がらビューの索引を消す

 などです。

1 と 3 の操作では索引が消えたままとなるので、次にユーザが開いたタイミングで索引が構築されます。DB が大きい場合、最初のユーザが割を食うことになります。もはや、管理者による無差別テロです。...なので、ちゃんと索引は作っておいてあげましょう。


2026/03/20

Notes/Domino 2026 (v14.5.1) がリリースされました!

2026/3/19 の夕方(日本時間)、Notes/Domino の最新バージョンがリリースされました。ところどころで ”2026” と表記されていますが、バージョン番号でいうと 14.5.1 となります。早速インストールしてみました。

今回は Notes クライアントのファーストインプレッションを紹介します。

Notes クライアントを起動すると、いつも通りパスワード入力画面が表示されます。マージンを広くとった今風の画面に変更されていますね。入力したパスワードに応じてアイコンが切り替わる伝統的な機能はそのままなので、オールドタイプなユーザにもなじめるように配慮されているのがありがたいです(笑)。

最初に表示される画面に Notes 2026(v14.5.1)の新機能がまとめて紹介されていますね。


プロパティボックスの変更

私が一番インパクトのあると感じたのは、プロパティボックスの変更です。これまでの Notes クライアントでは小さなポップアップ画面に表示されていましたが、14.5.1 ではサイドバーに統合されています。

文書を選択して Alt + Enter でプロパティボックスを開こうとすると、サイドバーが開きそこにプロパティが表示されます。旧文書プロパティ画面の上部にあったタブは、アコーディオン形式のインターフェースに変更されています。サイドバーアプリらしい仕様変更ですね。

サイドバーのプロパティアプリ(呼び方が正しいかは不明)の最上部にはオブジェクトを切り替えるコンボボックスがあり、『データベース』のプロパティに切り替えることができます。基本的な機能は旧来のプロパティボックスを踏襲しているので、操作に迷うことはなさそうです。

旧来のフロート型では Windows で 150% などに拡大した場合や 2 画面以上のディスプレイを使用すると、プロパティボックスが行方不明になることがあったので、この仕様だと安心ですね。

サイドバープロパティはマージンを十分にとった今風の画面に仕上がっています。マウスの移動距離が少し長いこと、見た目が Excel ぽいのが少し気になりますが、正しく進化しているということなのでしょうね。

なお、右クリックメニューの一番上から[プロパティ]が消えていて、プロパティとしては詳細プロパティが採用されいます。プロパティボックスを開く操作で右クリックメニューを利用していた方は注意が必要ですね。なお、初めにも書きましたが、Alt + Enter の操作でプロパティを開く操作は引き続き有効です。


文字のプロパティは便利

サイドバーに入ったプロパティで大きく変わったのは『文字』の設定です。特に色の設定は他のアプリでも一般的にありそうなインターフェースになっています。マウス操作でフルカラーから選択できますし、16進数で色コードを入力することもできます。

秀逸だと感じたのはスポイト機能です。これを使えば色番号がわからなくても同じ色に設定することが可能になります。

このスポイト機能は、Notes クライアントの外側、Windows の他のアプリからも色を拝借できるのでとても便利そうです。

ポップアップ表示される”点眼器”って日本語訳はいただけないですが...。


がんばれ Designer!

さて、今回はインストールほやほやの Notes 2026(v14.5.1)を紹介しました。いろいろ書きたかったのですが、結果的にプロパティボックスの話だけになってしまいました。その他の機能については、おいおい紹介したいと思います。

ところで、このサイドバーのプロパティボックスは、残念ながら Notes クライアントのみで有効です。残念なことに Designer では利用できず従来通りのフロート型のボックスで表示されます。プロパティの複雑度がはるかに高いことや UI の構造が違うのが原因でしょうが、統一してほしいですね。

しかも、Designer をインストールしたマシンの Notes クライアントでも使用できないんです。ということは私にとっては縁のない機能ってことになります。スポイト機能は開発者こそ必要な機能だと思うんですけどね。

早急な対応を希望します。がんばれ!HCL の”中の人” !!

 

2026/03/11

LotusScript のオンサイトサポート

先日、ノーツコンソーシアムの研究会 Domino Lounge で一緒に活動しているユーザ企業の方から LotusScript に関する問い合わせがありました。ちょうど良いタイミングでオフ会があったので、前乗りしてオンサイトサポート活動を行いました。LotusScript におけるハマりポイントがいくつかあったので、許可をもらって記事にさせていただくことにしました。

なお、材料となるのは Domino IQ のサンプルアプリですが、Domino IQ の機能に特化した話ではありません。予めご了承ください。


お問い合わせ内容

ディスカッションテンプレートをもとに Domino IQ のサンプルアプリを作っており、次の2つの処理をまとめて実行させたいとのことでした。

  1. 文書内の本文を IQ に要約させて Summary フィールドにセット
  2. その要約からさらにカテゴリを生成させ、Categories フィールドにセット

お問い合わせがあった時点でのコードは次の通りでした(記事化に当たり一部調整済み)。

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim llmreq As NotesLLMRequest
   Dim llmres As NotesLLMResponse
   Dim sText As String

   Set ndb = ns.CurrentDatabase
   Set nuid = nuiw.CurrentDocument

   '要約の問い合わせ
   sText = nuid.FieldGetText("Body")
   Set llmreq = ns.CreateLLMRequest()
   Set llmres = llmreq.Completion(ndb.Server, "DiscussSummerry", sText)

   If (llmres.FinishReason = LLM_FINISH_REASON_STOP) Then
      Call nuid.FieldAppendText("Summery",llmres.Content)
      Call nuid.Save()
      Call nuid.Reload()
   End If

   'カテゴリの問い合わせ
   Dim sText1 As String

   sText1 = nuid.FieldGetText("Summery")
   Set llmreq = ns.CreateLLMRequest()
   Set llmres = llmreq.Completion(ndb.Server, "DiscussCategory", sText)

   If (llmres.FinishReason = LLM_FINISH_REASON_STOP) Then
      Call nuid.FieldAppendText("Categories",llmres.Content)
      Call nuid.Save()
   End If
End Sub

このスクリプトを実行すると『文書は保存されていません。』とエラーが出るので、何が悪いのか教えてほしいというお問い合わせでした。

コードを見る限り、処理 1 と 2 をそれぞれ作成し、スクリプトをつなげたように見えます。そして、つなげる前のスクリプトは単体では正常に動作したとのご報告がありました。


エージェントの対象と NotesUIDocument

調査にあたり、まず、現象を確認します。

新規で文書を作成し、エージェントを実行すると確かに『文書は保存されていません。』エラーが発生します。

どこでエラーが発生しているのか確認するために、デバッグモードにして実行してみます。すると、デバッガが起動することなくエラーが発生します。この結果より LotusScript のエラーではないと判定できます。

Use したスクリプトライブラリ内の Initialize 内でエラーが発生した場合、LotusScript が原因でもデバッガは起動しません。今回はそのようなパターンではないので LotusScript のエラーではないと判定しています。

このような場合、エージェントのプロパティの確認が必要です。今回のエージェントでは次のようになっていました。さて、問題点がわかりますか?


エラーの原因は[実行時]-[対象]の設定が『すべての選択文書』となっているからです。

LotusScript のエージェントの場合、この対象の設定は NotesDatabase クラスの UnprocessedDocuments プロパティの利用を前提にした機能だと理解しておくとよいでしょう。ビューで選択した文書や新着メールなどを効率よく取得することができます。

そうした仕様からなのか UI の文書が新規文書でまだ保存されていない状態だと『文書は保存されていません。』エラーが発生することになります。UI の文書がバックエンドの nsf 内に存在しないからだと思います。

今回のスクリプトでは、処理対象の文書は NotesUIDocument 経由で取得しているので、対象による文書の特定は不要です。このような場合では、対象を『なし』としておく必要があります。

その結果、問題のエラーが回避でき、デバッガが起動するようになります。これでやっと LotusScript の土俵に乗った状態といえます。

今回は LotusScript のエージェントのエラーではあったのですが、原因はスクリプト外にあったという点がポイントですね。


保存は何度も行わない

お問い合わせのコードを見ていて気が付いた点です。nuid.Save() を 2 カ所で実行している点です。先の『文書は保存されていません。』エラーに対応するため試行錯誤で入れたコードだと思われますが、よい対応とは言えません。

本件に限らずエンドユーザ作成のコードを見ていると、一連の処理で何度も保存しているコードを見ることがあります。正常に動けばそれでいいじゃないか、細かいこと言うなと思うかもしれませんが、私は気になりました。

例えば、将来の改造で作成者や読者の操作する機能を追加したことを考えてください。一度目の保存で文書に対する権限がなくなったとすると、二度目の保存ではエラーが発生することになります。複数回の保存が、将来の改造において足かせになりかねません。後任者(将来の自分を含む)に対するトラップになりうるので、保存は一回にとどめるようにしましょう。

また、保存するなら目立つ場所で行うのも重要です。コードの最後や関数のできるだけ外側がよいと思います。文書の取得や作成と同レベル(同じ関数内)にしておくと気づきやすいですね。


サポート終了後のスクリプト

今回のお問い合わせに対しては、最終的に以下のコードを回答としました。

'これは編集モード前提のエージェントです。
Option Declare

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase

   Dim nuiw As New NotesUIWorkspace
   Dim nuid As NotesUIDocument
   Dim llmreq As NotesLLMRequest
   Dim llmres As NotesLLMResponse
   Dim sBody As String
   Dim sSum As String

   '変数初期化
   Set ndb = ns.CurrentDatabase
   Set nuid = nuiw.CurrentDocument

   '本文をテキストで取得
   sBody = nuid.FieldGetText("Body")

   '要約問い合わせ
   Set llmreq = ns.CreateLLMRequest()
   Set llmres = llmreq.Completion(ndb.Server, "DiscussSummerry", sBody)

   If (llmres.FinishReason = LLM_FINISH_REASON_STOP) Then
      '要約取得
      sSum = llmres.Content

      '要約セット
      Call nuid.FieldAppendText("Summery", sSum)
   End If

   'カテゴリ問い合わせ
   If sSum <> "" Then
      'カテゴリ問い合わせ
      Set llmres = llmreq.Completion(ndb.Server, "DiscussCategory", sSum)

      If (llmres.FinishReason = LLM_FINISH_REASON_STOP) Then
         'カテゴリ取得とセット
         Call nuid.FieldAppendText("Categories",llmres.Content)
      End If
   End If
End Sub

修正にあたり意識した点は次の通りです。私が担当した LotusScript 講座の受講経験をお持ちだったので、(復習を兼ねて)少々細かな点についても補足させていただきました。

  • 編集モード(入力中の実行)を前提に、保存をなくし、IQ の結果をフィールドにセットするだけにした(保存は UI の操作に任せ、スクリプトに頼りすぎない)
  • IQ が作成した要約を文字列変数に保管し、カテゴリ作成に利用(UI と スクリプト間の往復を減らす)
  • NotesLLMRequest の初期化は 1 回でよい
  • Option Declare を宣言し、暗黙の変数宣言を禁止

2026/03/05

NotesDbDirectory の使い方

Domino サーバの管理アプリを作成しているとサーバ内のアプリケーションの一覧を取得したくなることがあります。このようなときに利用するのが NotesDbDirectory クラスです。

先日久しぶりにこのクラスを利用しようとしたとき、思い出せずヘルプのお世話になりました。いい機会なので使い方などをまとめておきたいと思います。


オブジェクトの取得方法

NotesDbDirectory クラスは NotesSession クラスと同様に New でオブジェクトを新規作成することができます。

    Dim ndbdir As NotesDbDirectory
    Set ndbdir = New NotesDbDirectory( serverName$ )

引数には一覧を取得したいサーバ名を設定します。Null を指定するとサーバではなく、ローカルに接続します。


一覧の取得

接続したサーバの一覧を取得するには GetFirstDatabase というメソッドを使用します。

    Set ndb = ndbdir.GetFirstDatabase(DATABASE)

引数には、データベースの種類を指定します。次の定義済みの定数が利用できます。

定数 説明
1247 DATABASE Notes データベース (NSF ファイル)
1248 TEMPLATE Notes データベースのテンプレート (NTF ファイル)
1245 REPLICA_CANDIDATE 複製不可ではない Notes のデータベースまたはテンプレート
1246 TEMPLATE_CANDIDATE Notes データベースまたはテンプレート

GetFirstDatabase 実行すると一覧の最初のデータベースが返されます。その次のデータベースは GetNextDatabase メソッドを使用ます。

例えば、次のスクリプトでは、ローカルのすべてのデータベースのファイルパスを順にメッセージボックスで表示します。

    Dim ndbdir As NotesDbDirectory
    Dim ndb As NotesDatabase
    
    Set ndbdir = New NotesDbDirectory("")    'ローカルに接続
    Set ndb = ndbdir.GetFirstDatabase(DATABASE)    '最初のDB

    While Not (ndb Is Nothing)
        MsgBox ndb.FilePath
        Set ndb = ndbdir.GetNextDatabase()    '次のDB
    Wend

最後のデータベースの次は Nothing となる点がポイントですね。


一覧はソートされていない

NotesDbDirectory クラスが作成する一覧がどのような順序なのかは不明です。例えば、上記スクリプトをあるサーバに対して実行したところ次のような結果でした。少なくともファイルパス順ではないようです。

    homepage.nsf
    AgentRunner.nsf
    PwdResetSample.nsf
    help\decsdoc.nsf
    help\lccon.nsf
    help\lsxlc.nsf
    help\help14_admin.nsf
    help\help14_client.nsf
    help\jconfr11.nsf
    help\help14_designer.nsf
    help\help145_admin.nsf
    help\help145_client.nsf
    help\help145_designer.nsf
    panagenda\PMCInstaller.nsf
    panagenda\pmc_config.nsf
    panagenda\pmc_analyze.nsf
    iNotes\Forms9.nsf
    ontime\installer.nsf
    ontime\ontimegc.nsf
            ・・・

作成する処理によってはソートする必要があります。LotusScript でソートするには以下の記事を参考にしてください。


DB は Open されていない

NotesDbDirectory クラスを利用した特徴をもう一点。取得した NotesDatabase は「Open されていない」点に注意が必要です。

例えば、上記スクリプトを変更して文書数を取得するように変更します。

        MsgBox ndb.AllDocuments.Count


すると、次のようなエラーが発生します。

このエラーを回避するためには NotesDatabase クラスの Open メソッドで DB を開く必要があります。

NotesDbDirectory クラスは、DB をリストアップすることが目的のクラスです。この時点では、ファイルパスや DB 名のように公開されている情報のみにアクセスできます。これが Open されていない状態ということになります。

DB 内の文書(数)にアクセスするためには適切な ACL が必要です。Open することで ACL が評価され、文書にアクセスできるということになります。

アプリケーションを開くダイアログでは、アクセス権のない DB もリストアップされます。DB を選択して開こうとすると ACL が評価されます。このタイミングと Open が同じだと理解すればわかりやすいですね。

ちなみに、LotusScript のヘルプでは、Open が必要な機能は明示されています。