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

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

2008年7月31日木曜日

文書IDの不思議


今回は、ノーツの文書ID(文書UNID)について考察してみる。

画像を見てほしい。ご存じだとは思うが、赤枠で囲った部分が文書IDである。
(実際に利用する場合は、行頭のOFとON及び、:は除くが)

@関数で利用する場合、@DocumentUniqueIDだが、このままでは使えないので、@Textでテキスト化する必要がある。

さて、この文書IDは、ノーツDBの中で一意であるとされている。
確かに同じ文書IDのものは存在しないし、存在できない。
DBのレプリカの場合は、それぞれのDBで同一の文書IDを持っていることになる。

この他には、同一の文書IDは存在しないはずと思うが、実はそうではないのである。
見落としがちだが、DBのコピーも、同じ文書IDを持つのである。
DBのコピーの際、レプリカIDは変わるのだが(これで複製かコピーかを見分けているから当然なのだが・・・)、文書IDはそのままコピーされるのである。

なので、文書IDを使ったノーツDBを作成する場合、このことに考慮する必要がある。
ちなみに、ノーツ文書をクリップボード経由でコピーした場合は、文書IDは変わるのである。
同じDBに貼り付けられることを考慮したのであろう。

※ノーツ8からはノーツDBではなく、ノーツアプリケーションと言います。私の環境はまだ7なので、ノーツDBとしてます。

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月30日水曜日

メールのアーカイブ

メールのアーカイブ。ノーツが標準で持っている機能で、よく使われているものだろう。


このアーカイブ。設定を間違えると、正しく動いてくれない。
通常、「すぐにアーカイブ」でアーカイブするであろうが、このとき、アーカイブ選択文書の設定を「ユーザーに選択された文書」にしておくと動かない(動作しても、1件もアーカイブされない)のだ。



アーカイブの設定メニューで、アーカイブの選択を行う。
ここで、「編集」をクリックする。














アーカイブの条件選択の画面になるので、「選択条件」をクリックする。














ここで、「ユーザーに選択された文書」にしてしまうと「すぐにアーカイブ」は実行されない。
ここでは、それ以外のオプションを選択する必要がある。
どうしても、「ユーザーに選択された文書」にしたい場合は、アーカイブ方法を
「アーカイブ」「選択文書をアーカイブ」のメニューで実行する必要がある。


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月29日火曜日

DBの保有ロールを取得する

指定したユーザが、ノーツDB内でどのロールを保有しているのかをチェックするメソッド。
ACLの情報をチェックするので、グループに所属している場合でも認識できる。
@関数で言えば、@UserRolesに相当する。

------------------------------------------------------------------
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim sbj As Variant
Dim ret As String

'自DBとそのACLの取得
Set db = session.CurrentDatabase
sbj = db.QueryAccessRoles( "ユーザ名" )

ret = ""
Forall x In sbj
If ret = "" Then
ret = x + ","
Else
ret = ret + x + ","
End If
End Forall

Messagebox ret, 0, "保有ロールの一覧"
End Sub

Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月28日月曜日

改行を含んだ定数

今回はちょっと手抜きです・・・

Constで定数を定義できるが、このとき"|"で囲うと、改行を含んだ定数を定義できる。
サンプルは、改行を含んだ定数を表示するというもの。

Const aaa = |abc
def|

Sub Click(Source As Button)
    Msgbox aaa
End Sub



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月18日金曜日

LotusDay2008

7/15、16はLotusDayでした。
実は、出展者として来場してました。今までは会社が出展しても、絶対に有休を取って来場してたんですけどね。
ということで、初体験してました。

今年はIBMさん、セッションの開始時間を微妙にずらすという技?を使っていただいたおかげで、まぁお客様の多いこと多いこと。
少しは休ませてくれよぉって感じでした。

ちなみに、出展者側にいたので、全セッション聞いてません。これも初だ・・・
いろんな人のスピーチ、楽しみにしてたんだけどな。


大阪でも7/24にありますね。そこにも出展者として来場します。
どっかの会社のブースでぼーっとしてるでかい奴がいたら私です。
まぁ、わっかんねーだろうなぁ。



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月11日金曜日

あんなもん受かるかぁ!

「IBM Lotus Domino 8 アプリケーション開発アップデート」。6/16をxデーとしていたが、色々な事情により、今日受験してきた。

結果は惨敗・・・

案の定、コンポジットアプリケーションとDB2、Webサービスが問題のほとんどを占めていた。
そんなアプリケーションを作成する仕事はまだ受けてないし、実業務でもNotes8なんて、まだ使ってない(インストールはしてあるけど・・・)。
そりゃぁ、落ちますわな。

どうやってリベンジしよう。
Notes8なんて書籍もないし、過去問もない。
誰か、仕事発注してくんないかなぁ。そしたら、覚えながら作るから(^^;

2008年7月9日水曜日

「文書の添付ファイルが無効です」というエラーが出力される

ノーツDBに対して、Fixupを実行すると、

文書 NT000071B2 (データベース d:\Lotus\Domino\Data\***\******.nsf)が破損しました。 文書の添付ファイルが無効です
文書 (UNID OFxxxxxxxx:xxxxxxxx-ONxxxxxxxx:xxxxxxxx) (データベース d:\Lotus\Domino\Data\***\******.nsf) が削除されました

というエラーがサーバコンソールに表示されることがある。

実はこれ、Lotus Dominoの不具合なのである。
問題報告番号 MGAN5L9T2Yとしてすでに報告されているもので、該当DBで文書内にOLEを使っていたり、別サーバと複製をしていたりすると発生するのである。

厄介なのが、有効な回避策が「ほとんど」ないのと、6.5.x、7.0.x、8.0.xでも発生すると言うことである。

詳細は、次のURLを読んでほしい。
http://www-1.ibm.com/support/docview.wss?uid=swg21108774


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月8日火曜日

別のデータベースに文書を作成する

@Command([Compose])コマンドは、新規文書を作成するときに使用する関数である。

通常、ビューのアクションボタンの式として記述することが多い。
その場合は、
@Command([Compose];"MainTopic")
と言う形で、そのデータベースにあるフォームを使って文書を作成することになる。

しかし、別のデータベースを呼び出して、呼び出したデータベースに文書を作成することも可能である。
サンプルは、新規メールを作成することが出来るコマンドである。

---------------------------------------------
@Command([Compose];@MailDbName;"Memo")


Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月3日木曜日

データベースの検索3(文書IDによる検索)

データベースの検索第三弾。
文書UNIDによる検索です。

特別な設定が不要で簡単に検索できるし、結果は「ある」か「ない」のどちらかで非常にわかりやすい。
ここで気をつけたいのが、「ない」場合。
通常、オブジェクト(ここでは、NotesDocument)がNothingかどうかで、文書のあり/なしを判断するのだが、GetDocumentByUNIDメソッドではこれが通じない。
検索して該当する文書が存在しない場合は、このメソッドが4091のエラーを返すのである。

こんな感じ。
If Err = 4091 Then
    '文書がなかった場合の処理
End If

サンプルでは、このエラー処理は組み込んでいない。

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim uiws    As New NotesUIWorkspace
    Dim uidoc   As     NotesUIDocument
    Dim doc     As     NotesDocument
    Dim uid     As     String
    Dim db      As     NotesDatabase
    Dim doc2    As     NotesDocument
    
    '現在の文書の文書IDを取得する
    Set uidoc = uiws.CurrentDocument
    Set doc   = uidoc.Document
    uid = doc.UniversalID
    
    '自DBで、文書IDを元に文書を検索する
    Set db   = session.CurrentDatabase
    Set doc2 = db.GetDocumentByUNID( uid )
    
    Messagebox "文書のタイトルは、『" + doc2.Subject(0) + "』です。", 0, "データベースの検索"
End Sub



Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月2日水曜日

データベースの検索2(Serachメソッド)

予告通り、データベースの検索の2回目。
全文索引がついていない場合の検索。
NotesDatabaseクラスのSearchメソッドは検索条件に、Select文を利用できる。@関数も記述できると言うことだ。
また、第二パラメータに日付を指定することで、その日付よりも古い文書は検索対象外にすることもできる。

Sub Click(Source As Button)
    '検索用データベースの変数定義
    Dim session As New NotesSession
    Dim db      As NotesDatabase
    Dim docs    As NotesDocumentCollection
    Dim doc     As NotesDocument
    
    Set db = session.CurrentDatabase
    
    '検索キー変数の定義
    Dim skey As String
    
    'その他の変数
    Dim i As Integer
    Dim stitle As String
    Dim dateTime As New NotesDateTime( "1900/01/01" )
    
    '検索式の入力
    skey = Inputbox( "検索したいノーツ式(@関数も可)を入力してください。", "データベースの検索" )
    
    'データベースの検索
    'skeyが検索文字列、dateTimeより後の日付の文書を検索する
    '0は検索に一致した文書をすべて取得するというオプション
    Set docs = db.Search( skey, dateTime, 0 )
    
    stitle = ""
    For i = 1 To docs.Count
        Set doc = docs.GetNthDocument( i )
        'タイトルをsbjという変数に保存しておく。その際、1タイトルごとに改行する
        'Chr$(13)は改行コードを意味する
        stitle = stitle + Cstr( i ) + "." + doc.Subject( 0 ) + Chr$(13)
    Next
    
    '検索結果の表示
    If docs.Count = 0 Then
        Messagebox "検索文字列に該当する文書はありませんでした。"
    Else
        Messagebox stitle, 0, "検索結果の文書のタイトル一覧"
    End If
End Sub




Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2008年7月1日火曜日

データベースの検索1(全文検索)

DB内の文書を検索する方法を何度かに渡って紹介する。
今回は、全文検索。
検索スピードは速いが、ノーツDBに全文索引を作成しておかないと意味がない(検索自体は可能)。

サンプルは、自DBの中を全文検索するというものである。


Sub Click(Source As Button)
    '検索用データベースの変数定義
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim docs As NotesDocumentCollection
    Dim doc As NotesDocument
    
    Set db = session.CurrentDatabase
    
    '検索キー変数の定義
    Dim skey As String
    
    'その他の変数
    Dim i As Integer
    Dim stitle As String
    
    '検索文字列の入力
    skey = Inputbox( "検索したい文字列を入力してください。", "データベースの検索" )
    
    'データベースの全文検索
    'skeyが検索文字列、0は検索に一致した文書をすべて取得するというオプション
    Set docs = db.FTSearch( skey, 0 )
    
    stitle = ""
    For i = 1 To docs.Count
        Set doc = docs.GetNthDocument( i )
        'タイトルをsbjという変数に保存しておく。その際、1タイトルごとに改行する
        'Chr$(13)は改行コードを意味する
        stitle = stitle + Cstr( i ) + "." + doc.Subject( 0 ) + Chr$(13) 
    Next
    
    '検索結果の表示
    If docs.Count = 0 Then
        Messagebox "検索文字列に該当する文書はありませんでした。"
    Else
        Messagebox stitle, 0, "検索結果の文書のタイトル一覧"
    End If
End Sub