当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2009年9月10日木曜日

プロフィール文書が存在しているか否か

ノーツDBの設定情報を格納するものとして、プロフィール文書を使っている方は多いのではないだろうか?

プロフィール文書は、特殊な文書で普通の文書と同じように扱うことはできない。
@コマンドで呼び出す場合、@Command([EditProfile])を使う必要があるし、
LotusScriptの場合、NotesDocumentクラスのGetProfileDocumentメソッドを使う必要がある。

@コマンドの場合、プロフィール文書用のフォームがノーツDBに存在している必要があるが、
LotusScriptの場合、そのフォームがなくても動作してしまうところがすごい。
(NotesDocumentクラスがバックエンドなので、仮想のフォームを設定できるため)


さて、ではプロフィール文書がすでに作成されているかどうかをLotusScriptで調べることは可能であるのか?
通常の文書であれば、NotesDocumentクラスのIsNewNoteプロパティであったり、NotesUIDocumentクラスのIsNewDocプロパティで調べることもできるし、
もしくはNoteIDが0になっている場合、ということでも判断できる(UNIDは、仮で割り当てられるので、判断できない)。

実は、プロフィール文書では、上記のいずれも利用できないのだ。
GetProfileDocumentメソッドはNotesDocumentクラスのものなので、NotesUIDocumentクラスのIsNewDocプロパティはそもそも利用できないし、NotesDocumentクラスのIsNewNotesプロパティもFalseを返すのだ。
さらには、NoteIDも0以外の値を返す始末。

うーん・・・プロフィール文書、恐るべし。

ここで諦めてはもったいない。なんとか判断する方法はないだろうか?


ということで、ちょっと強引だが、次の方法を考えてみた。
CreatedプロパティとLastModifiedプロパティ、LastAccessedプロパティ、この3つがいずれも同じ日付、時間を指していたら?
それは、作成されてから、一度も更新されておらず、なおかつ、誰も編集モードで開いていない。
ということは、新規作成の状態。つまりは今までは存在しなかったのではないか?
となる。

サンプルを書くと、こんな感じ?


(前略)
set prodoc = db.GetProfileDocument( "ProfileForm" )
if ( prodoc.Created = prodoc.LastModified ) and ( prodoc.LastModified = prodoc.LastAccessed ) then
 Msgbox "プロフィール文書を新規に作成します"
End If
(後略)

どうだろう?


他に、良い方法がある方は教えて欲しい。


【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

4 件のコメント:

長島 広隆 さんのコメント...

長島です。ちょくちょく読ませて頂いています。
isProfile プロパティ使って判断してはだめなんでしょうか?

およよ さんのコメント...

長島様

コメントありがとうございます。
IsProfileプロパティには気がつきませんでした。

ですが・・・
このプロパティは、プロフィール文書なのかどうなのかを判断するには使えるのですが、新規作成なのか、既存なのかを判断するのには使えませんでした。

実際に、初めてNotesDatabase.GetProfileDocumentを使ったときでもIsProfileはTrueになっていました。

haru さんのコメント...

何かしらアイテムの値をセットするとしたら、

NotesDocument.HasItem でアイテムがない

あるいは

NotesDocument.GetItemValue で値がない

といった方法はつかえませんかね??

およよ さんのコメント...

haru様

コメントありがとうございます。

仰るとおり、NotesDocument.HasItemは使えそうですね。うっかりしてました。
試してみます。
結果は別途ブログ上にて・・・