投稿

4月, 2008の投稿を表示しています

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

ビューで文書を選択して、その文書に何かアクションを起こすということは、
よくあることだと思う。
その方法を記載しておく。
以下のサンプルの太文字部分が、選択した文書を取得するか所だ。
ポイントは、取得した文書は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

データベース名の表示

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))

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

ノーツ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

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 D…

別の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

データベースの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 …

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

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

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

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

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

リッチテキストが壊れる

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

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

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

Notesのアップデート試験4

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

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

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

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

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

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