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

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

2008年4月30日水曜日

ビューで選択した文書を取得する

ビューで文書を選択して、その文書に何かアクションを起こすということは、
よくあることだと思う。
その方法を記載しておく。
以下のサンプルの太文字部分が、選択した文書を取得するか所だ。
ポイントは、取得した文書はNotesDocumentCollectionであるところ。
例え、1文書しか選択していなくてもコレクションに収められるので、
直接NotesDocumentにすることはできない。

Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim docs As NotesDocumentCollection
    Dim doc As NotesDocument
    
    'カレントデータベースを設定する
    Set db = session.CurrentDatabase
    
    'ビューから選択された文書を取得する
    Set docs = db.UnprocessedDocuments
    
    '全文書数分の繰り返し
    For i = 1 To docs.Count
        'GetNthDocument( i )は、i番目の文書を取得するという意味
        'このときの文書の並びはデータベースに保存された順
        Set doc = docs.GetNthDocument( i )
        
        'タイトルをsbjという変数に保存しておく。その際、1タイトルごとに改行する
        'Chr$(13)は改行コードを意味する
        sbj = sbj + Cstr( i ) + "." + doc.Subject( 0 ) + Chr$(13)
    Next
    
    'タイトルの表示
    Messagebox sbj, 0, "DB中の全文書のタイトル"
End Sub


2008年4月26日土曜日

データベース名の表示

DBのタイトルの取得方法です。
こんなのTipsのうちにも入らないけど、一応記載しておきましょう。

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    
    Set db = session.CurrentDatabase
    Messagebox db.Title , 64, "スクリプト"
End Sub


ちなみに・・・@関数で実現する時は、下記のような感じになる。
@DBTitle関数は、サーバ名とDBタイトルをリスト形式で返すので、2番目(引数の-1は一番後ろという意味)を
取得するようにするのがコツ。

@Prompt([Ok];"@関数";@Subset(@DbTitle;-1))


2008年4月25日金曜日

エージェント名を表示する

ノーツDBのエージェント情報を取得するLotusScriptです。
名前が分かっている場合は、GetAgent()で取得できるが、そうでない場合に利用するとよいでしょう。

※一つのエージェントだけを取り出すことは出来ないことに注目

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim i As Integer
    Dim sbj As Variant
    
    Set db = session.CurrentDatabase
    
    i = 0
    'db.Agentsはデータベース中の全エージェントを取得する
    Forall agent In db.Agents
        i = i + 1
        'agent.Nameはエージェントの名前を取得する
        sbj = sbj & Cstr( i ) & ". " & agent.Name & Chr$(13)
    End Forall
    Messagebox sbj
End Sub 


2008年4月24日木曜日

ACLの付与(管理者権限)

今日は自分のDBに管理者を追加するLotusScript。
このサンプルは自DBのACLを操作するものなので、大したものではないが、
応用すると便利に使える。

DBに管理者エントリをつけ忘れた!あ、でもLocalDomainServersは管理者権限を持っているぞ!
という時に役立つ。
(開発環境でテストDBを作成して、ACLそのままで本番サーバにDBをコピーしてしまったときとか。
筆者も何度か経験している・・・)

サーバ上のDBに下記の内容でスケジュールエージェントを作成して、サーバIDで署名するだけ。
これで、目当てのDBに管理者エントリを追加できるのである。

もっとも、フルアドミニストレータという機能が付いた6.x以降のバージョンでは
使う必要はないと思うが・・・R5以前のサーバを使っているなら十分に役立つと思う。

Sub Click(Source As Button)
 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim acl As NotesACL
 Dim entry As NotesACLEntry
 Dim namae As NotesName
 
 Dim tmp As String
 Dim errflg As Integer
 
 '自DBのACLを取得する
 Set db = session.CurrentDatabase
 Set acl = db.ACL
 
 'ユーザー/グループ名の入力
 tmp = Inputbox( "ACLを付与したいユーザー名/グループ名を入力して下さい。" + Chr$(10)_
 + "例)Ichirou Nihon/Notes", "ACLの付与", "" )
 If tmp = "" Then
  Messagebox "ユーザー名/グループ名が入力されていません。処理を中断します。", 0, "ACLの付与"
  Exit Sub
 End If
 errflg = 0
 
 '全ACLエントリの取得
 Set entry = acl.GetFirstEntry
 Do While Not entry Is Nothing
  Set namae = New NotesName( entry.Name )
  '入力された名前がすでにACLエントリに存在すれば、エラーとする
  If Strconv( namae.Abbreviated, 1 ) = Strconv( tmp, 1 ) Then
   errflg = 1
   Exit Do
  End If
  Set entry = acl.GetNextEntry( entry )
 Loop
 
 'エラーフラグが1になっていればエラーと見なしてメッセージ表示後処理中断
 If errflg = 1 Then
  Messagebox "その名前はすでにACLが付与されています。", 0, "ACLの付与"
  Exit Sub
 Else
  '管理者レベルでACLを付与する
  Call db.GrantAccess( tmp, 6 )
  Messagebox tmp + "を管理者でACLに追加しました。", 0, "ACLの付与"
 End If
End Sub

2008年4月23日水曜日

別のDBにロールを作成する

指定したNotesDBにロールを作成して、登録してあるACLエントリにそのロールを付与する方法です。

当然のことながら、NotesDBに"管理者"権限があることが必要になります。


Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim acl As NotesACL
    Dim entry As NotesACLEntry
    
    On Error Goto ErrProc
    
    'ACL情報を操作するDBを取得する
    Set db = New NotesDatabase( session.CurrentDatabase.Server, "データベースファイル名" )
    Set acl = db.ACL
    
    'ACLにロールを作成する
    Call acl.AddRole( "ロール名" )
    
    'エントリにロールを付与する
    Set entry = acl.GetEntry( "エントリ名" )
    Call entry.EnableRole( "ロール名" )
    
    'ACL情報を保存する
    Call acl.Save
    Exit Sub
    
ErrProc:
    Msgbox "エラー発生行数:" + Cstr(Erl) + Chr$(10) + "エラーメッセージ:[No." + Cstr(Err) + "] " + Error(Err)
    Exit Sub
End Sub 


2008年4月22日火曜日

データベースのACLを取得する

NotesDBのACLを取得する方法。
ACLエントリを取得するだけなら大したことはない(NotesDatabaseクラスのACLプロパティ)が、
それぞれのエントリのアクセス権を取得するところまでとなると少々面倒。
アクセス権は戻り値が数値なので、分かりやすく日本語名称に変換している。

Sub Click(Source As Button)
 'データベースの変数の定義
 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim acl As NotesACL
 Dim entry As NotesACLEntry
 
 'ACLの名前とレベルの格納用変数の定義
 Dim namae As String
 Dim level As String
 
 '作業用変数の定義
 Dim sbj As String
 Dim i As Integer
 
 '自分のDBとACLをセット
 Set db = session.CurrentDatabase
 Set acl = db.ACL
 
 i =0
 Set entry = acl.GetFirstEntry
 'ACLはDB中にいくつセットされているか分からないので、Do Whileループでentryがなくなるまで繰り返す
 Do While Not (entry Is Nothing )
  i = i + 1
  
  namae = entry.Name
  'ChgEntryLevelは自作関数(entry.Levelは数字で返すのでテキストに変換)
  level = ChgEntryLevel( entry.Level )
  sbj = sbj & Cstr( i ) & "." & namae & " , " & level & Chr$(10)
  
  '次のACLエントリーを取得する
  Set entry = acl.GetNextEntry( entry )
 Loop
 Messagebox sbj, 0, "DBのACL"
End Sub

Function ChgEntryLevel( level As Integer ) As String
 'ACLのレベルは0~6の7段階
 Select Case level
 Case 0:
  ChgEntryLevel = "[なし]"
 Case 1:
  ChgEntryLevel = "[投稿者]"
 Case 2:
  ChgEntryLevel = "[読者]"
 Case 3:
  ChgEntryLevel = "[作成者]"
 Case 4:
  ChgEntryLevel = "[編集者]"
 Case 5:
  ChgEntryLevel = "[設計者]"
 Case 6:
  ChgEntryLevel = "[管理者]"
 End Select
End Function 

2008年4月21日月曜日

DBのロール一覧を表示する

LotusScriptで自分用のサンプルプログラムを作っておくと、ヘルプを見るより分かりやすい。
それをまとめれば、もうそれはTips集になる。
人に聞いてばかりではなく、ぜひ自分でTips集を作れるようになってほしいものだ。

初回の今日は、NotesACLクラス。
あまり操作することはないだけに間違いのないように操作してほしい。


Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim acl As NotesACL
    Dim entry As NotesACLEntry
    
    Dim i As Integer
    Dim sbj As String
    
    '自DBとそのACLの取得
    Set db = session.CurrentDatabase
    Set acl = db.ACL
    
    sbj = ""
    i = 0
    
    'ACLのロールを取り出す
    Forall x In acl.Roles
        i = i + 1
        sbj = sbj & Cstr( i ) & "." & x & Chr$(10)
    End Forall
    
    Messagebox sbj, 0, "DBのロールの一覧"
End Sub 


2008年4月19日土曜日

アップデート試験の受験日を決めたぞ!

IBM/Lotusからノーツ8のバージョンアップ試験のバウチャーチケットをもらったので、そろそろ試験準備に取り組まないといけない。
ということで、やる気を出すために、試験の申し込みをした。
2008年6月6日!これがXデーだ!!

試験会場はいつもと同じ秋葉原。毎回違う場所に行くのは嫌なので。
時間もいつもと同じ。
験を担ぐわけではないが、この方が安心する。

さて、あとは勉強するのみ!

2008年4月16日水曜日

リッチテキストが壊れる

Lotus Notes/Domino 6から追加されたNotesRichtextNavigatorクラスを使うと、リッチテキストフィールドにあるオブジェクトを検索できてポインタをあてられるようになる。
ということは、その場所に別のオブジェクトを追加したり、文字を追記したりできるという便利なクラスなのだが・・・

そんな便利なクラスを利用してプログラム開発をしていたのですが、不具合が発覚しました。
・リッチテキストを取得する
・NotesRichtextNavigatorクラスを取得する
・オブジェクトの場所を検索して、そこに別のオブジェクトを貼り付ける
・元々あったオブジェクトを削除する
とこんな処理を実行すると、時々リッチテキストの内容が破壊されてしまう(文書が開けなくなる)のです。

どうも、一つのリッチテキスト内で、オブジェクトを添付したりはがしたりするという行為に耐えられないらしい。
現在、日本IBMに調査を依頼していて、SPRが上がった。
まだSPRは公開されていないので、一応非公開にしておきますが、随時アップしていきます。

2008年4月2日水曜日

Notesのアップデート試験4

「IBM Lotus Domino 8 アプリケーション開発アップデート」という公認コースがあるらしい。
1日コースなので、50,000円(税抜)なのだ。

一応、アップデート試験に対応した教育コースになっているので、試験対策にはなる。
でも、50,000円かぁ。個人には高いな・・・(試験代は、合格すれば会社が出してくれるけど・・・)

って、スケジュールを確認したら。
月1回のコースのくせして、4月、5月は「開催中止」ってなんじゃぁ!!

・・・集客悪いのか?それとも準備が整わないのか?
試験は始まってるんだから、ちゃんとしてもらわないと・・・
そもそも、試験よりもコースの方が先じゃないの?

(リ○ーテク△システ□ズさんは、月1回ずつやっているみたいですね。)

申し込もうかどうかを、もう少し考えようっと。