2024/11/12

編集権限を持つ文書の編集を止める方法

先日、既存ノーツ DB のメンテナンスをしていてバグを発見しました。LotusScript を覚えたての方がよくやるミスだったので、ご紹介します。

問題の DB は『漢字アドレス帳』です。懐かしいですね(笑)

Notes 4.6 時代に Lotus 社が提供した First Step Kit 内に同梱されていた製品(?)の一部です。ノーツユーザを漢字表記するための DB です(Notes R5 以降は DJX が同等の機能を担当)。非常に短命だったのですが、当時ノーツを新規導入した企業が多かったことから爆発的に利用されました。もしかしたらお使いのサーバ内にも残骸があるかもしれませんね。


問題の機能

今回漢字アドレス帳の文書を修正しようと管理者権限のユーザで文書を編集しようとしました。すると、『この文書は編集できません』とエラーが表示されました。

漢字アドレス帳への登録は『申請データベース』経由で行う仕様だから、当然です。そこで、フォームの設計を確認すると次のようになっていました。

QueryModeChange のイベントは、文書のモードが変化(読込⇔編集)する前に発生します。上記コードでは EditMode が True でないとき(= 読込モード)エラーを表示しています。そして、引数の Continue に False を設定することで、モードの変更をキャンセルさせています。

なるほど、これで編集を抑制(= 編集権限があっても文書を編集させなく)しているんですね。今回『この文書は編集できません』とエラーが表示されたので、うまく機能しています。


バグとは?

さて、この機能、何が問題か気がつきましたか?


バグは QueryModeChange イベントではありません。QueryOpen イベントにコードがないことが問題なんです。例えば、ビューで文書を選択し、Ctrl + E を押して編集モードで文書を開くと、難なく編集できてしまいます。

これでは、編集を抑制したい機能は満足できていませんね。


対策

QueryOpen は文書を開く前に発生するイベントです。イベントの引数は 4 つです。


Source 開く文書
Mode 編集モードで開く場合 1
読込モードで開く場合 0
IsNewDoc 開く文書が新規文書の場合 True
Continue 文書を開かせない場合 False をセット


この引数を利用して、いきなり編集モードで開く操作に制限を掛けます。

Sub QueryOpen(Source As Notesuidocument, Mode As Integer, IsNewDoc As Variant, Continue As Variant)
   If IsNewDoc = False Then
      If Mode = 1 Then
         Msgbox "この文書は編集できません",16,"漢字メール"
         Continue = False
      End If
   End If
End Sub

Mode = 1 の場合、エラーメッセージを表示して、開く動作をキャンセルしています。

また、このフォームで文書を新規作成する機能があるかは知りませんが、万が一、新規作成をした場合に備えて、開くようにしています。


まとめ

今回はフォームの編集を抑制する機能について紹介しました。

編集を止めるのは QueryModeChange イベントだけでなく QueryOpen イベントにも配慮が必要というお話でした。LotusScript に不慣れであったり、急いで作るとついつい忘れがちです。

約 30 年前とはいえ、ノーツのメーカが提供した DB で発見しました。プロでもやっちゃうありがちなバグということですね。注意しましょう。


0 件のコメント:

コメントを投稿