[Notes/Domino] 設計解析講座: ノートヘッダ
今回でやっとノートのところに入ります。毎度更新が遅くてスミマセン(_ _;;
ノートの構造
ノートの構造は、ノートヘッダとアイテムに大別されます。アイテムはさらにヘッダ情報と値で構成されています。(アイテムについては後日詳述します。)
以下のページに図がありますので、これを見るとイメージしやすいと思います。
The Parts of a Domino Database
ノートヘッダの値の取得
ノートヘッダから値を取得するには、NSFNoteGetInfo 関数を使います。実はこの関数は、この連載中ですでに登場していて、「ノートクラスと $Flags」の回でノートクラスを取得しているところで使っています。
NSFNoteGetInfo が便利なのは、上述のノートクラスを除くと、追加日(下図参照)が取得できるのと、DBハンドルを取得できることでしょうか。LotusScript から呼ぶ場合は、これ以外はあまり使わないと思います。

それぞれサンプルを示します。
<追加日の取得>
Public Const NOTEINFO_NOTE_DB = 0
Public Const NOTEINFO_NOTE_ID = 1
Public Const NOTEINFO_NOTE_OID = 2
Public Const NOTEINFO_NOTE_CLASS = 3
Public Const NOTEINFO_NOTE_MODIFIED = 4
Public Const NOTEINFO_NOTE_PRIVILEGES = 5
Public Const NOTEINFO_NOTE_FLAGS = 7
Public Const NOTEINFO_NOTE_ACCESSED = 8
Public Const NOTEINFO_NOTE_PARENT_NOTEID = 10
Public Const NOTEINFO_NOTE_RESPONSE_COUNT = 11
Public Const NOTEINFO_NOTE_RESPONSES = 12
Public Const NOTEINFO_NOTE_ADDED_TO_FILE = 13
Public Const NOTEINFO_NOTE_OBJSTORE_DB = 14
Public Const NOTESDLL = "nnotes.dll"
Type TIMEDATE
Innards(1) As Long
End Type
Declare Sub NSFNoteGetInfo Lib NOTESDLL (Byval hNote As Long, _
Byval wNoteMember As Integer, pValue As Any)
Declare Function ConvertTIMEDATEToText Lib NOTESDLL (Byval IntlFormat As Integer, _
Byval TimeFormat As Integer, InputTime As TIMEDATE, Byval retTextBuffer As String, _
Byval TextBufferLength As Integer, retTextLength As Integer) As Integer
Sub Initialize
Dim ss As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim td As TIMEDATE
Set db = ss.CurrentDatabase
Set doc = db.GetDocumentByID("{適当なノートIDを入力してください}")
Call NSFNoteGetInfo(doc.handle, NOTEINFO_NOTE_ADDED_TO_FILE, td)
Msgbox APITIMEDATE2String(td)
End Sub
Function APITIMEDATE2String(td As TIMEDATE) As String
Dim s As String * 81
Dim i As Integer
Call ConvertTIMEDATEToText(0, 0, td, s, 80, i)
APITIMEDATE2String = Strleft(s & Chr(0), Chr(0))
End Function
<DBハンドルの取得>
(※上記例とほぼ同じなので、超省略(^^; )
Dim hDb As Long Call NSFNoteGetInfo(doc.handle, NOTEINFO_NOTE_DB, hDb)
(参考)IDの仕組み
ノートヘッダには OID (Originator ID)が入っていますので、ついでにIDの仕組みについて記載しておきます。
まあ、私が説明するまでもなく、IBMのほうで詳しい資料が公開されていますので、まずはこちらをどうぞ。
まとめると以下のような感じです。忘れてしまったら、これを見ればすぐ思い出せると思います。

| # | 略 | 説明 |
|---|---|---|
| 1 | OF | ランダムな値(TIMEDATE) |
| 2 | ON | ノートの作成日時(TIMEDATE) |
| 3 | SD | ノートの更新日時(TIMEDATE) |
| 4 | SN | 保存された回数(バージョン) |
| 5 | DB | DBのレプリカID(TIMEDATE) |
| 6 | NT | ノートID(DB内での連番。レプリカごとに値は異なる) |
- OID (Originator ID) = OF + ON + SD + SN
- UNID (Universal ID) = OF + ON
- GNID (Global Note ID) = DB + NT
- NID (Note ID) = NT
- IID (Instance ID) = SD + NT
- GIID (Global Instance ID) = SD + DB + NT
- ※ TIMEDATE 構造体については、以前のエントリを参照してください。

コメント
すばらしい、このような知識はどこで勉強できますか?
Posted at 2011/05/15 5:31 PM by 雷
雷さん、コメントありがとうございます! 😀
わたしがよく参照しているのは、IBMのAPIドキュメントです(ベタですが)。
https://www.ibm.com/developerworks/lotus/documentation/capi/
わからないところは、フォーラムで検索すればたいがい見つかります。
http://www.ibm.com/developerworks/lotus/community/
あとは、Toolkit のヘッダファイルですかね。
https://www.ibm.com/developerworks/lotus/documentation/capi/
基本的なところをおさえておけば、あとは独学でなんとかなると思います。
この連載が、少しでもお役に立てれば幸いです。
Posted at 2011/05/15 10:13 PM by takenoff
※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。