2010年3月10日水曜日

ビューでチェックを付けた順に番号を付けたい(2)

昨日のサンプルは中途半端でした。反省...
ビューのイベント Onselect を使ったサンプルの差し替え版です。

下の Lotus Script では、ビューの選択マージンに1文書ずつチェックマークを付けた場合はチェックマークを付けた順に番号を付けますが、選択マージンをマウスでなぞったり、Ctrl + A 等で一度にチェックマークを付けた場合は作成日順に番号が付きます。

チェックマークを消した場合は番号が付きません。チェックマークを消した後また同じ文書に付けると、最後にチェックマークを付けた時の番号になります。

文書のチェックマークが解除されたことを調べるのに NotesDocumentCollection クラスの Contains を使っていますが、これも 8 から利用できるメソッドです。文書コレクションをループしなくても探せるところがステキです。

ヘルプによると Contains の引数には NotesDocument, NotesDocumentCollection のオブジェクトの他、 String値の NoteID が使えるとのこと。ただし NoteID を配列として指定できないようです。
'ビューの(Globals) (Declarations)
Dim ws As NotesUIWorkspace
Dim ss As NotesSession
Dim idlist List As Long

'ビューのイベント Initialize
Sub Initialize
 Set ws = New NotesUIWorkspace
 Set ss = New NotesSession
End Sub

'ビューのイベント Onselect
Sub Onselect(Source As Notesuiview)
    Dim doc As NotesDocument
    Dim dc As NotesDocumentCollection

    Set dc = Source.Documents
    Set doc = dc.GetFirstDocument
    While Not ( doc Is Nothing )
        If Not Iselement( idlist( doc.NoteID ) ) Then
            idlist( doc.NoteID ) = "1"
        End If
        Set doc = dc.GetNextDocument( doc )
    Wend

    Forall o In idlist
        If Not dc.Contains( Listtag( o ) ) Then
            Erase idlist( Listtag( o ) )
        End If
    End Forall
End Sub

'ビューのアクション「番号を付ける」 
Sub Click(Source As Button)
    Dim doc As NotesDocument
    Dim db As NotesDatabase
    Dim lngNum%

    Set db = ws.CurrentDatabase.Database
    lngNum = 0
    Forall o In idlist
        Set doc = db.GetDocumentByID( Listtag( o ) )
        lngNum = lngNum + 1
        doc.num = lngNum
        Call doc.Save( True, False )
    End Forall

    Erase idlist
    Call ws.ViewRefresh
    Call ws.CurrentView.DeselectAll
End Sub

0 件のコメント:

コメントを投稿