一番下の階層の文書を取得する

2009年02月24日 00:16

 昔ビュー上でどうしてもこういうことを処理する必要があったので書いたのですが、せっかくなのでコードをブログ用に加工してみました。
ビューをキー検索して、その検索結果を親文書とする文書のうち、一番下の階層にある文書を返します。 とりあえずそのあとの処理は何でもいいので、Subjectフィールドの値を表示しています。

なので、パラメータを書き換えれば何とかボタンスクリプトで動くようにしているのですが、当然ながら検索するビューは検索に使用する列がソートされている必要があります。複数個の文書がヒットする場合には最初にヒットした文書から階層を探します。
以下のような構造の場合、「子文書3」を取ってきます。

○ 親文書
 ■ 子文書1
    □ 子文書1-1
 ■ 子文書2
    □ 子文書 2-1
    □ 子文書 2-2
       ■ 子文書3

複雑そうに見えますが、GetNextSibling メソッドを使って、「子文書の中で一番下の文書」を繰り返し探しているだけです。

どのくらい需要があるかは分からないのですが、自分がもう一回使うときにも便利だと思うのでブログに置いておきます。
 このくらいの処理はもっとエレガントなコードを書かれている方もいるのではないかと思うのですが、是非改善案などを教えて頂けると非常に私も勉強になるのでコメントください。


Sub Click(Source As Button)
Dim ses As New NotesSession
Dim db As NotesDatabase
Dim SearchView As NotesView
Dim doc As NotesDocument

' Parameter
ServerName$= "ServerName/org"
DBPath$ ="xxxx.nsf"
viewname$= "ByID"
SearchKey$= "XX12345"

Set db=ses.GetDatabase(ServerName$,DBPath$)
Set SearchView = db.GetView(viewname$)

Set doc=GetDeepestDocFromThread(SearchView,SearchKey$)
If doc Is Nothing Then
' 関数内でエラーを返しているのでこのまま終了します。
Exit Sub
End If
Msgbox doc.subject(0)

End Sub

Function GetDeepestDocFromThread(SearchView As NotesView, SearchKey As String) As NotesDocument
' この関数は指定したビューのキーにヒットした文書を親文書とする文書から一番下の階層にある文書を返します。
' 指定したビューをキーで検索してヒットした文書が無い場合にはNothing を返します。
' 子文書が無い場合は親文書を返します。

Set GetDeepestDocFromThread = Nothing

Set ent = SearchView.GetEntryByKey(SearchKey,True)

If (ent Is Nothing) Then
Msgbox "文書は見つかりませんでした。処理を終了します"
Exit Function
End If

' 一番下の子文書を探す
Set nav = SearchView.CreateViewNavFromDescendants(ent)
While (ent.ChildCount > 0 )
Set navent = nav.GetChild(ent)
' 同じ階層内で一番下の文書を探す
For i = 1 To ent.ChildCount - 1
Set navent = nav.GetNextSibling(navent)
Next
Set ent = navent
Wend

Set GetDeepestDocFromThread=ent.document
End Function



コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/95-17c2ff3c
    この記事へのトラックバック


    最新記事