Takenoff Labs

Lotus Notes/Domino に関する Tips や、クラシックの名曲などを紹介します

[Notes/Domino] 設計解析講座: ノートクラスと $Flags

前回はノートを取得する処理を解説しました。今回は、取得したノートがどの設計要素かどうかを判別する方法を解説します。

ノートクラス

ノートは、まずノートクラスによって区別されています。ノートクラスは2バイトので管理されており、立っているビットによって、どのクラスかを判別できます。ノートクラスはアイテムではなく、ノートヘッダの一部です。

たとえば、NOTE_CLASS_DOCUMENT(&H0001)は文書、NOTE_CLASS_ICON(&H0010)はアイコンのことです。

ただし、必ずしも設計要素名と1対1ではなく、フォーム、ビュー、フィルタクラスの場合は、対応する設計要素が複数あります。たとえばフォームの場合、フォームのほかに、サブフォーム、フレームセット、ページ、イメージなどなど、多くの設計要素がフォームクラスに属しています。

ノートクラスの値は、ツールキットの stdnames.h の「NOTE_CLASS_~」で始まる定数で定義されています(後述のコードに LotusScript 化したものを掲載しています)。「NOTE_CLASS_FILTER」は何のことかよくわからないかもしれませんが、これは昔の名残りらしいです。フィルタはエージェントのことだと思ってください。

$Flags

フォーム、ビュー、フィルタクラスのノートを、さらに調べるには、$Flags アイテムを見ます($FlagsExt を調べないといけない場合もあります)。$Flags は単純なテキストアイテムですから、読むのも書き込むのも簡単です。

設計のプロパティ($Flags)

$Flags は半角英数記号の文字で表現されます(大文字小文字を区別します)。たとえば上図のように「fL3」という値の場合、「f」はエージェントであることを、「L」はコードが LotusScript であることを、「3」はR3クライアントのメニューに表示しないことを意味します。

$Flags には、設計要素を区別するためのフラグのほかに、プロパティの一部が含まれます。プロパティの場合は書き換えるのも簡単です。

たとえば、「更新時に再設計/設計の置換を禁止する」が無効の場合、有効にする、というコードは、以下のように書けます。(※アイコンやポリシー文書などの場合は違うコード(「R」無い場合が有効)になりますので注意してください。)

If InStr(1, doc.~$Flags(0), "P", 0) = 0 Then
    doc.~$Flags = doc.~$Flags(0) & "P"
End If

(設計用の)$Flags の値は、ツールキットの stdnames.h の「DESIGN_FLAG_~」で始まる定数で定義されています(後述のコードに LotusScript 化したものを掲載しています)。途中から記号を使い出しているのが面白いトコロ。きっと途中で英数だけじゃ足りなくなっちゃったんでしょうね(^^;

設計要素を判断するコード

設計要素とノートクラス、$Flagsの対応表を書こうかと思いましたが、面倒くさくなってきたので(^^;;、判別コードだけ載せておきます。これを見ていただければ、どうやって判断するかは、おわかりになると思います。

※ 汎用性を持たせるために、ノートハンドルを渡す形式にしました。NotesDocument を渡すようにすれば、関数内のコードはもう少し簡単になります。

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 NOTE_CLASS_DOCUMENT       = &H0001
Public Const NOTE_CLASS_DATA           = NOTE_CLASS_DOCUMENT
Public Const NOTE_CLASS_INFO           = &H0002
Public Const NOTE_CLASS_FORM           = &H0004
Public Const NOTE_CLASS_VIEW           = &H0008
Public Const NOTE_CLASS_ICON           = &H0010
Public Const NOTE_CLASS_DESIGN         = &H0020
Public Const NOTE_CLASS_ACL            = &H0040
Public Const NOTE_CLASS_HELP_INDEX     = &H0080
Public Const NOTE_CLASS_HELP           = &H0100
Public Const NOTE_CLASS_FILTER         = &H0200
Public Const NOTE_CLASS_FIELD          = &H0400
Public Const NOTE_CLASS_REPLFORMULA    = &H0800
Public Const NOTE_CLASS_PRIVATE        = &H1000
Public Const NOTE_CLASS_DEFAULT        = &H8000
Public Const NOTE_CLASS_NOTIFYDELETION = NOTE_CLASS_DEFAULT
Public Const NOTE_CLASS_ALL            = &H7fff
Public Const NOTE_CLASS_ALLNONDATA     = &H7ffe
Public Const NOTE_CLASS_NONE           = &H0000

Public Const DESIGN_FLAG_ADD                    = "A"
Public Const DESIGN_FLAG_ANTIFOLDER             = "a"
Public Const DESIGN_FLAG_BACKGROUND_FILTER      = "B"
Public Const DESIGN_FLAG_INITBYDESIGNONLY       = "b"
Public Const DESIGN_FLAG_NO_COMPOSE             = "C"
Public Const DESIGN_FLAG_CALENDAR_VIEW          = "c"
Public Const DESIGN_FLAG_NO_QUERY               = "D"
Public Const DESIGN_FLAG_DEFAULT_DESIGN         = "d"
Public Const DESIGN_FLAG_MAIL_FILTER            = "E"
Public Const DESIGN_FLAG_PUBLICANTIFOLDER       = "e"
Public Const DESIGN_FLAG_FOLDER_VIEW            = "F"
Public Const DESIGN_FLAG_V4AGENT                = "f"
Public Const DESIGN_FLAG_VIEWMAP                = "G"
Public Const DESIGN_FLAG_FILE                   = "g"
Public Const DESIGN_FLAG_OTHER_DLG              = "H"
Public Const DESIGN_FLAG_JAVASCRIPT_LIBRARY     = "h"
Public Const DESIGN_FLAG_V4PASTE_AGENT          = "I"
Public Const DESIGN_FLAG_IMAGE_RESOURCE         = "i"
Public Const DESIGN_FLAG_JAVA_AGENT             = "J"
Public Const DESIGN_FLAG_JAVA_AGENT_WITH_SOURCE = "j"
Public Const DESIGN_FLAG_MOBILE_DIGEST          = "K"
Public Const DESIGN_FLAG_XSPPAGE                = "K"
Public Const DESIGN_FLAG_CONNECTION_RESOURCE    = "k"
Public Const DESIGN_FLAG_LOTUSSCRIPT_AGENT      = "L"
Public Const DESIGN_FLAG_DELETED_DOCS           = "l"
Public Const DESIGN_FLAG_QUERY_MACRO_FILTER     = "M"
Public Const DESIGN_FLAG_SITEMAP                = "m"
Public Const DESIGN_FLAG_NEW                    = "N"
Public Const DESIGN_FLAG_HIDE_FROM_NOTES        = "n"
Public Const DESIGN_FLAG_QUERY_V4_OBJECT        = "O"
Public Const DESIGN_FLAG_PRIVATE_STOREDESK      = "o"
Public Const DESIGN_FLAG_PRESERVE               = "P"
Public Const DESIGN_FLAG_PRIVATE_1STUSE         = "p"
Public Const DESIGN_FLAG_QUERY_FILTER           = "Q"
Public Const DESIGN_FLAG_AGENT_SHOWINSEARCH     = "q"
Public Const DESIGN_FLAG_REPLACE_SPECIAL        = "R"
Public Const DESIGN_FLAG_PROPAGATE_NOCHANGE     = "r"
Public Const DESIGN_FLAG_V4BACKGROUND_MACRO     = "S"
Public Const DESIGN_FLAG_SCRIPTLIB              = "s"
Public Const DESIGN_FLAG_VIEW_CATEGORIZED       = "T"
Public Const DESIGN_FLAG_DATABASESCRIPT         = "t"
Public Const DESIGN_FLAG_SUBFORM                = "U"
Public Const DESIGN_FLAG_AGENT_RUNASWEBUSER     = "u"
Public Const DESIGN_FLAG_AGENT_RUNASINVOKER     = "u"
Public Const DESIGN_FLAG_PRIVATE_IN_DB          = "V"
Public Const DESIGN_FLAG_IMAGE_WELL             = "v"
Public Const DESIGN_FLAG_WEBPAGE                = "W"
Public Const DESIGN_FLAG_HIDE_FROM_WEB          = "w"
Public Const DESIGN_FLAG_V4AGENT_DATA           = "X"
Public Const DESIGN_FLAG_SUBFORM_NORENDER       = "x"
Public Const DESIGN_FLAG_NO_MENU                = "Y"
Public Const DESIGN_FLAG_SACTIONS               = "y"
Public Const DESIGN_FLAG_MULTILINGUAL_PRESERVE_HIDDEN = "Z"
Public Const DESIGN_FLAG_SERVLET                = "z"
Public Const DESIGN_FLAG_ACCESSVIEW             = "z"
Public Const DESIGN_FLAG_FRAMESET               = "#"
Public Const DESIGN_FLAG_MULTILINGUAL_ELEMENT   = "!"
Public Const DESIGN_FLAG_JAVA_RESOURCE          = "@"
Public Const DESIGN_FLAG_STYLESHEET_RESOURCE    = "="
Public Const DESIGN_FLAG_WEBSERVICE             = "{"
Public Const DESIGN_FLAG_SHARED_COL             = "^"
Public Const DESIGN_FLAG_HIDE_FROM_MOBILE       = "1"
Public Const DESIGN_FLAG_HIDE_FROM_PORTAL       = "2"
Public Const DESIGN_FLAG_PROPFILE               = "2"
Public Const DESIGN_FLAG_HIDE_FROM_V3           = "3"
Public Const DESIGN_FLAG_HIDE_FROM_V4           = "4"
Public Const DESIGN_FLAG_HIDE_FROM_V5           = "5"
Public Const DESIGN_FLAG_HIDE_FROM_V6           = "6"
Public Const DESIGN_FLAG_HIDE_FROM_V7           = "7"
Public Const DESIGN_FLAG_HIDE_FROM_V8           = "8"
Public Const DESIGN_FLAG_HIDE_FROM_V9           = "9"
Public Const DESIGN_FLAG_MUTILINGUAL_HIDE       = "0"
Public Const DESIGN_FLAG_WEBHYBRIDDB            = "%"
Public Const DESIGN_FLAG_READONLY               = "&"
Public Const DESIGN_FLAG_NEEDSREFRESH           = "$"
Public Const DESIGN_FLAG_HTMLFILE               = ">"
Public Const DESIGN_FLAG_JSP                    = "<"
Public Const DESIGN_FLAG_DIRECTORY              = "/"
Public Const DESIGN_FLAG_PRINTFORM              = "?"
Public Const DESIGN_FLAG_HIDEFROMDESIGNLIST     = "~"
Public Const DESIGN_FLAG_HIDEONLYFROMDESIGNLIST = "}"
Public Const DESIGN_FLAG_COMPOSITE_APP          = "|"
Public Const DESIGN_FLAG_COMPOSITE_DEF          = ":"
Public Const DESIGN_FLAG_XSP_CC                 = ";"
Public Const DESIGN_FLAG_JS_SERVER              = "."
Public Const DESIGN_FLAG_STYLEKIT               = "`"
Public Const DESIGN_FLAG_WIDGET                 = "_"
Public Const DESIGN_FLAGS_SUBCLASS              = "UW#yi@GFXstmzk=K;g%[]{^"
Public Const DESIGN_FLAGS_DISTINGUISH           = "nw123456789"

Const NOTESDLL = "nnotes.dll"

Declare Sub NSFNoteGetInfo Lib NOTESDLL (ByVal hNote As Long, _
ByVal wNoteMember As Integer, pValue As Any)

Declare Function NSFItemGetText Lib NOTESDLL (ByVal hNote As Long, _
ByVal ItemName As String, ByVal retItemText As String, TextLen As Long) As Integer

Public Function APIGetDesignType(hNote As Long) As String
    Dim strFlg  As String
    Dim strExt  As String
    Dim strType As String
    Dim lngCls  As Long
    
    Call NSFNoteGetInfo(hNote, NOTEINFO_NOTE_CLASS, lngCls)
    
    strFlg = Space(128)
    Call NSFItemGetText(hNote, "$Flags", strFlg, 127)
    strFlg = StrLeft(strFlg & Chr(0), Chr(0))
    
    If (lngCls And NOTE_CLASS_FORM) = NOTE_CLASS_FORM Then
        If InStr(1, strFlg, DESIGN_FLAG_SUBFORM, 0) <> 0 Then
            strType = "サブフォーム"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_FRAMESET, 0) <> 0 Then
            strType = "フレームセット"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_WEBPAGE, 0) <> 0 Then
            strType = "ページ"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_IMAGE_RESOURCE, 0) <> 0 Then
            strType = "イメージ"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_JAVA_RESOURCE, 0) <> 0 Then
            strType = "アプレット"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_STYLESHEET_RESOURCE, 0) <> 0 Then
            strType = "スタイルシート"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_XSP_CC, 0) <> 0 Then
            strType = "カスタムコントロール"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_XSPPAGE, 0) <> 0 Then
            strType = "XPage"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_STYLEKIT, 0) <> 0 Then
            strType = "テーマ"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_WIDGET, 0) <> 0 Then
            strType = "コンポーネント"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_FILE, 0) <> 0 Then
            strType = "ファイル"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_JSP, 0) <> 0 Then
            strType = "JSP"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_SACTIONS, 0) <> 0 Then
            strType = "共有アクション"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_ACCESSVIEW, 0) <> 0 Then
            strType = "DB2 Acess ビュー"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_COMPOSITE_APP, 0) <> 0 Then
            strType = "複合アプリケーション"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_COMPOSITE_DEF, 0) <> 0 Then
            strType = "ワイヤリングプロパティ"
        Else
            strType = "フォーム"
        End If
    ElseIf (lngCls And NOTE_CLASS_INFO) = NOTE_CLASS_INFO Then
        strType = "データベースについて"
    ElseIf (lngCls And NOTE_CLASS_VIEW) = NOTE_CLASS_VIEW Then
        If InStr(1, strFlg, DESIGN_FLAG_SHARED_COL, 0) <> 0 Then
            strType = "共有列"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_FOLDER_VIEW, 0) <> 0 Then
            strType = "フォルダ"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_VIEWMAP, 0) <> 0 Then
            strType = "ナビゲータ"
        Else
            strType = "ビュー"
        End If
    ElseIf (lngCls And NOTE_CLASS_ICON) = NOTE_CLASS_ICON Then
        strType = "アイコン"
    ElseIf (lngCls And NOTE_CLASS_DESIGN) = NOTE_CLASS_DESIGN Then
        strType = "設計リスト"
    ElseIf (lngCls And NOTE_CLASS_ACL) = NOTE_CLASS_ACL Then
        strType = "ACL"
    ElseIf (lngCls And NOTE_CLASS_HELP_INDEX) = NOTE_CLASS_HELP_INDEX Then
        strType = "ヘルプインデックス"
    ElseIf (lngCls And NOTE_CLASS_HELP) = NOTE_CLASS_HELP Then
        strType = "データベースの使い方"
    ElseIf (lngCls And NOTE_CLASS_FILTER) = NOTE_CLASS_FILTER Then
        If InStr(1, strFlg, DESIGN_FLAG_SITEMAP, 0) <> 0 Then
            strType = "アウトライン"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_V4AGENT, 0) <> 0 Then
            strType = "エージェント"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_DATABASESCRIPT, 0) <> 0 Then
            strType = "データベーススクリプト"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_SCRIPTLIB, 0) <> 0 Then
            strExt = Space(128)
            Call NSFItemGetText(hNote, "$FlagsExt", strExt, 127)
            strExt = StrLeft(strExt & Chr(0), Chr(0))
            If InStr(1, strExt, "W", 0) <> 0 Then
                strType = "Web サービスコンシューマ"
            ElseIf InStr(1, strFlg, DESIGN_FLAG_JAVA_AGENT_WITH_SOURCE, 0) <> 0 Then
                strType = "Java ライブラリ"
            Else
                strType = "LotusScript ライブラリ"
            End If
        ElseIf InStr(1, strFlg, DESIGN_FLAG_CONNECTION_RESOURCE, 0) <> 0 Then
            strType = "データコネクション"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_JS_SERVER, 0) <> 0 Then
            strType = "サーバー JavaScript ライブラリ"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_JAVASCRIPT_LIBRARY, 0) <> 0 Then
            strType = "JavaScript ライブラリ"
        ElseIf InStr(1, strFlg, DESIGN_FLAG_WEBSERVICE, 0) <> 0 Then
            strType = "Web サービスプロバイダ"
        Else
            strType = "フィルタ"
        End If
    ElseIf (lngCls And NOTE_CLASS_FIELD) = NOTE_CLASS_FIELD Then
        strType = "共有フィールド"
    ElseIf (lngCls And NOTE_CLASS_REPLFORMULA) = NOTE_CLASS_REPLFORMULA Then
        strType = "複製式"
    End If
    
    APIGetDesignType = strType
End Function

ずいぶんと面倒くさいですね……(x_x)。たぶん、最初にノーツを作った人も、こんなに設計要素が増えると思っていなかったんでしょうね。

ちなみに、DESIGN_FLAGS_SUBCLASS というのが何のためにあるかというと、「フォーム」や「ビュー」を一発で判断するためです。「フォーム」や「ビュー」は、「サブクラスのフラグがどれも含まれない場合」という条件で判断するものなので、サブクラスのフラグがすべて含まれている DESIGN_FLAGS_SUBCLASS を Like で判断してやれば、すぐに判別ができる、というわけです。

If doc.~$Flags(0) Like "*[" & DESIGN_FLAGS_SUBCLASS & "]*" Then
    '「フォーム」や「ビュー」でない
Else
    '「フォーム」や「ビュー」である
End If
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5.00 out of 5)
読み込み中...

Navigation

トラックバック

トラックバックはありません

コメント

コメントはありません

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 7947 to the field below:

^
×