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

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

2011年2月22日火曜日

GetItemValue使用時の注意点

花粉が舞う季節になりました。筆者の身体は、徐々に反応してきています。薬で抑えているとはいえ、やはり辛いです。なんとかしないと・・・

と、筆者の花粉症が少しでも良くなるように願いつつ、このボタンをクリックしてください。
にほんブログ村 IT技術ブログへ




さて、今回は、NotesDocumentクラスのGetItemValueメソッドを使用する際の注意点についてです。
何を今更・・・という感じではありますが、再確認してみましょう。

GetItemValueメソッドは、指定した文書のアイテム値を取得するものです。
この時、アイテムは「テキスト」だったり「数値」だったりするため、Variant型で戻されます。
また、アイテムは複数値の場合もあるため、配列として返ってきます。

これを複数値として認識するのではなく、単なる文字列として扱いたい場合は、NotesItemクラスのTextプロパティを使うと良いです。

サンプルは、GetItemValueとTextの違いを比較するためのものです。
textListFというアイテム(フィールド値)には複数の値が格納されているものとします。

Sub Click(Source As Button)
    Dim uiws  As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim udoc  As NotesDocument
    Dim item  As NotesItem
    
    Set uidoc = uiws.CurrentDocument
    Set udoc  = uidoc.Document
    Set item  = udoc.GetFirstItem( "textListF" )
    
    MsgBox _
    "GetItemValue(0)の値" & Chr$(9) & udoc.textListF(0) & Chr$(10) _
    "Text           の値" & Chr$(9) & item.Text, _
    MB_OK + MB_ICONINFORMATION, "各プロパティの違い"
End Sub



下図が実行結果です。GetItemValue(0)は、当然最初の一つしか出力していません。

ということで、GetItemValueを使う場合は、そのアイテムが複数値を持っているかどうかを確認するようにしましょう。



【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2011年2月8日火曜日

文書リンクの削除

今日(2011/02/08)は、夜に雪が降るらしいです。前日は暖かかっただけに、体調を崩しやすくなります。気をつけましょうね。


ということで、今日もボタンをクリックして、体調管理を万全にしましょう!
にほんブログ村 IT技術ブログへ


今回は、NotesRichtextDocLinkクラスの新機能についてです。
RemoveLinkageメソッドですね。
このメソッドですが、デザイナヘルプを読むと、
「8.5の新機能」の文書では、「8.5で追加された新規メソッドです。」と書いてあるのですが、
実際のメソッドの説明文書を読むと、「8.0.2で追加されました。」と書いてあります。
さすがです!
もう、マニュアルについては突っ込みません!!
みなさん、自分で検証しましょう!!


とまぁ、どのバージョンから使えるのかはさておき(8.5では間違いなく動きます)、サンプルを見てみましょう。
ビュー上で動かすようにしてあります。
選択した文書の「Body」フィールドに文書リンクがあれば、問答無用で削除してしまうというものです。
文書リンクが見つからない場合は、その旨のダイアログメッセージを表示しています。

ポイントは、24行目です。ここで、リッチテキスト内に文書リンクがあるかどうかの検索を行っています。
というのも、RemoveLinkageメソッドは引数を持たず、戻り値もないので、文書リンクを見つけられるかどうかにかかっているためです。

サンプルをそのまま実行すると、文書リンクを削除して、文書を上書き保存してしまうので、くれぐれも注意してください。

Sub Initialize
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim docs    As     NotesDocumentCollection
    Dim doc     As     NotesDocument
    Dim ritem   As     NotesRichTextItem
    Dim rnavi   As     NotesRichTextNavigator
    Dim rlink   As     NotesRichTextDocLink
    
    ' カレントDBの取得
    Set db = session.CurrentDatabase
    
    ' 選択文書の取得
    Set docs = db.UnprocessedDocuments
    Set doc  = docs.GetFirstDocument
    
    ' 選択文書内のBodyリッチテキストの取得
    Set ritem = doc.GetFirstItem( "Body" )
    
    ' リッチテキストの内部を操作するためのナビゲータを取得
    Set rnavi = ritem.CreateNavigator
    
    ' リッチテキスト中の「文書リンクオブジェクト」を検索する
    If rnavi.FindFirstElement(RTELEM_TYPE_DOCLINK ) Then
        ' 文書リンクオブジェクトを取得
        Set rlink = rnavi.GetElement
        
        ' 文書リンクオブジェクトを削除
        Call rlink.RemoveLinkage
        
        ' 文書を上書き保存
        Call doc.Save( True,True, True )
    Else
        ' 文書リンクオブジェクトがなかった場合のエラーメッセージ
        MsgBox "文書中に文書リンクが見つかりませんでした。",_
        MB_OK + MB_ICONINFORMATION, "文書リンクの削除"
    End If
End Sub



【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2011年2月4日金曜日

StampAllMultiメソッドについて

今日は8.5のアップデート試験を受験してきました。結果はなんとか合格でした。良かった良かった。

ところで、IBM技術者認定制度のページを見たら、7関連の試験はすべて配信を終了したようですね。1月にはまだ配信されていたはずなので、2月になって終了したと言うことでしょうか。
7.xは2011年の4月末でサポートも切れますし、もはや過去のものですね(でも、7.xユーザは多いですよね・・・)

ということで、今日も下のボタンをクリックして、筆者に貢献してください。
にほんブログ村 IT技術ブログへ
ありがとうございます!!


さてさて、今日は、Lotus Notes/Domino 8.5で追加されたメソッド「StampAllMulti」についてです。
NotesDocumentCollectionクラスとNotesViewEntryCollectionクラスにこのメソッドがありますが、処理対象の文書が違うだけで、動作そのものは同じです。

選択した文書(コレクション)を、指定した文書の内容で置き換えるというものです。
この時、指定した文書にしかないアイテムは追加されます。また、指定した文書にないアイテムはそのまま残ります。
表にまとめると以下のようになります。


では、いつものようにサンプルを提示します。
このサンプルは、自DBのビューで選択した文書(コレクション)を、別のDBにある文書の内容で、置換するというものです。
Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim curdb As NotesDatabase
    Dim docs As NotesDocumentCollection
    Dim copyDB As NotesDatabase
    Dim copyDoc As NotesDocument
    Dim uiws As New NotesUIWorkspace
    
    ' 変更するドキュメントコレクションの取得
    Set curdb = session.CurrentDatabase
    Set docs = curdb.UnprocessedDocuments
    
    ' 変更元の文書を取得
    Set copyDB = session.GetDatabase( curdb.Server, "変更元の文書が格納されているDBファイル名" )
    Set copyDoc = copyDB.GetDocumentByID( "変更元文書のNoteID" )
    
    ' 変更を反映する
    Call docs.StampAllMulti( copyDoc )
    
    ' ビューのリフレッシュ
    Call uiws.ViewRefresh
End Sub



実は、このメソッド、Domino Designerヘルプにはサンプルがないんですね。
難しいメソッドではないので、サンプルがなくても何とか使えそうですが、やはりNotesのヘルプなのだからサンプルは掲載して欲しいところです。




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2011年2月3日木曜日

NameLookup関数について

今日は節分です。
季節の分かれ目ということで、立春、立夏、立秋、立冬の日付であるというのはなんとなく知っていました。でも、知ったのは割と最近の話です。いかんですな。反省・・・

家で邪気払いをする前に、下のボタンをクリックして、筆者のために邪気払いをしてください。
にほんブログ村 IT技術ブログへ


さてさて・・・
ドミノディレクトリ(アドレス帳)のユーザ文書を検索するための関数として、@NameLookup関数がR5から追加されています。
しかし筆者は、@DbLookup関数で間に合わせていたので、この関数を使ったことがありませんでした。
ということで、今回はこの@NameLookup関数について、簡単に検証してみましょう。

もちろん、Lotus Notes/Dominoは8.5を利用します。


早速、サンプルを提示します。
今回は、@DbLookupとの比較を行うと言うことで、2種類載せてあります。

--------------------------------------------------------------
【@DbLookupを使った場合】
dbname := @Subset(@DbName;1):"names.nsf";
vname := "($Users)";
uname := @UserName;
rvalue := "Department";
ret := @DbLookup("Notes":"NoCache";dbname;vname;uname;rvalue);
@Prompt([Ok];"ユーザの部署名";ret)


【@NameLookupを使った場合】
uname := @UserName;
rvalue := "Department";
ret := @NameLookup([NoUpdate];uname;rvalue);
@Prompt([Ok];"ユーザの部署名";ret)


いずれもユーザ文書にある「Department」フィールドの内容を表示する、というものです。

大きな違いは、以下のようになります。
1.@DbLookup関数は指定したビューがなかったり、検索結果がないと、「エントリが索引に見つかりません」というエラーになる。
  @Namelookup関数はエラーにはならずに、""が返ってくる。
2.@DbLookup関数は、指定したノーツDBのみを検索する。
  @Namelookup関数は、個人アドレス帳、ドミノディレクトリ、2次ディレクトリの順で検索する。(*1)
3.@DbLookup関数は、キー項目は1つしか設定できない。
  @NameLookup関数は、キー項目は複数設定できる。

*1 ロケーション文書中の「受信者名の入力補完機能」が"ローカルの次にサーバーを検索"になっていること!

@NameLookup関数は構文が簡単で便利なのですが、個人アドレス帳を先にチェックしてしまうというのが難点でしょう。
特に、8.0からは個人アドレス帳には「最近利用した連絡先」というものがあります。
自動的に、ドミノディレクトリのユーザ文書が追加されてしまうので、検索結果が異なってしまうことがあります。

やはり筆者は、@DbLookup関数を使うことにします。
どなたか、@NameLookup関数の有効的な使い方を教えてください。




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ