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

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

2016年11月24日木曜日

XPagesDayのセッション資料を公開しました

皆さんおはようございます。

本日(2016年11月24日)は、東京はなんと54年ぶりに11月中に雪が降ったとのことです。
各種交通機関にも乱れが発生したようですね。

さて、今週の月火に行われたXPagesDay 2016はいかがでしたか?
今年は、初めて講師をやるという方が4名もいらっしゃって、ちょっと変わったかな?という印象がありました。

私も僭越ながら講師をさせていただきました。
ここ数年、REST APIについての話をしてきましたが、他の方のセッションでも話がちらほら出てくるなど、そろそろREST APIも一般的になってきただろうということで、やめて別の話にしてみました。


今回は、「XPagesで検索をしてみよう」と題して、XPagesアプリで全文検索をするにはどのように設定すればいいのかについて解説してみました。

ノーツクライアントで全文検索を行う場合は、 ノーツクライアントにあらかじめ全文検索を便利に行うための機能([表示]-[検索バー])が備わっていますが、XPagesアプリは基本的にWebブラウザで動作するものなので、そういった便利機能は標準装備されていません。
そのあたりを便利に組み込む方法について解説したつもりですが、少しでもご理解いただけたなら幸いです。

セッション資料はSlideShareに共有させていただきました。
子のブログ記事内に埋め込んでおきますので、聴いていないという方や聴いたけど再確認したいという方は見てみてください。





ちなみに、今回のセッションを行うに当たって、ノーツコンソーシアムの「ザ・ノーツ研究会」の皆様のお知恵を拝借させていただきました。
この場を借りて、厚く御礼申し上げます。本当にありがとうございました。



それでは今日はこの辺で・・・







Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2016年11月20日日曜日

日付/時刻の変換を行う(UTC形式編)

皆さん、日曜日にこんにちは。
明日の2016年11月21日と11月22日はXPagesDayです。
仕事もしつつ、自席でWebセミナーを満喫してくださいね。
サイトはこちら。XPagesDay


さて、そんな日曜ですが、今日はそれとは関係ない単なるXPagesの話題です。
しかも、またまた日付/時刻についてです。

XPagesで日付を扱う場合、色々な形式があります。
NotesDateTimeオブジェクト、java.util.Dateオブジェクト等々・・・
また、日付/時刻を表す文字列というのもその一つでしょう。

Notesクライアントでも、「@Text(@Now)」のように、日時をテキスト化することもありますね。
当然、XPagesでもそういったことは可能です。

Notesクライアントで利用していたような日付/時刻の表し方であれば、当ブログでもさんざん書いてきましたので、さほど難しくはないと思います。
しかし、REST APIを使ってデータのやり取りをする場合、ちょっと変わった形式でのやり取りとなります。

下の画像を見てください。
私がサンプルで作成したXPagesアプリケーションで、文書のデータをJSON形式で表示するようにしたものです。
NotesDBの文書をJSON形式で表示

赤枠の個所を見ると、日付/時刻と思われますが、何やら見慣れない形式になっています。
これは、ISO8601形式というUTCの時刻を表現するものです。

REST APIを使って日時データをやり取りする場合は、通常このデータ形式を使うことになっています。
Notesの文書の日時をWebサービスとして提供する場合や、外部のWebサービスの日時データを取得する場合などがそうですね。

となってくると、この文字列をXPagesアプリケーションで理解できるようにする必要があります。
つまり、java.util.DateやNotesDateTime形式への変換ができるようにするということです。


ここで、
Javaの世界には「SimpleDateFormat」というクラスがあります。
それを使えば、自由に表示形式を定義できるのでいいのですが、折角ならXPagesに備わっている関数を使ってできればそれに越したことはないでしょう。



ということで、探してみました。
あるものですね。
I18nクラスにparseDateXMIやtoStringXMIというメソッドが用意されていました。
それぞれ、ISO8601形式の文字列をjava.util.Date形式に変換したり、java.util.Date形式のデータをISO8601形式の文字列に変換するものです。

書式は以下の通り。それぞれサンプルで使っているので、編集ボックスコントロールから取得して計算結果コントロールに埋め込んでいます。
// 日付/時刻データをISO8601型式の文字列に変換
var tmp1 = I18n.toStringXMI( getComponent( "dateTime_InputText1" ).getValue() );
getComponent( "dateTime_ComputedField1" ).setValue( tmp1 );

// ISO8601型式の文字列を日付/時刻データに変換
var tmp2 = I18n.parseDateXMI( getComponent( "dateTime_InputText2" ).getValue() );
getComponent( "dateTime_ComputedField2" ).setValue( tmp2 );



実行結果は下図です。
ISO8601文字列とjava.util.Dateの相互変換

これを覚えれば、REST APIもより使いやすくなるでしょう。
是非、使ってみてください。

それでは今日はこの辺で・・・











Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2016年10月24日月曜日

フォームというアイテム名について

皆さん、こんにちは。

Notes/Domino、使ってますか?
11月はNotes/Dominoに関するイベントが多数開催されます。
ちょっと整理してみてみましょう。

11月9日(水) ノーツコンソーシアム オープンセミナー2016 ノーツでワークスタイル変革を!
11月10日(木) IBM Connect Japan 2016 福岡
11月18日(金) ノーツ・しこく・フェスタ 2016 AI×IoT×クラウドの衝撃!
11月21(月)~22日(火) XPagesDay 2016
11月22日(火) テクてく Lotus 技術者夜会

私が把握しているだけでこれですので、各企業様の個別開催等を考えるとものすごい数ですね!!
是非、都合をつけて参加するようにしましょうね。


さて、今日の話題に進みましょう。
qa9 for ICS Developer
でちょっと気になる質問を見つけたので、調べてみたところ、あまりにも奥が深かったので、ブログの記事にしてみます。

質問はこちらです。
ノーツDBのフォーム名に関しての質問

Notes DBで文書を作成すると、どのフォームで開くのかを決めるためのフォームフィールド(アイテム)が自動で作成されます。
それが"Form"になったり、"form"になったりと固定でないのがなぜなのか?ということですね。
Notesクライアントの中だけの話と考えると、ほぼ影響はないのですが、外部連携やJava、JavaScript等を利用する場合には大文字、小文字の判定が行われてしまい、思った通りの結果が得られないことがあります。
ですので、"Form"だったり"form"だったりと不定では困るということです。


では見ていきましょう。

まず、既存のNotes DBをいくつか確認してみました。
すると、確かに"Form"になっているものと"form"なっているものがあるのを発見しました。
フォームフィールド名が"form"になってる


ということで、質問者が言っていることは確かに起こりうるというのがわかりました。
このNotes DBの文書を確認してわかったことがあります。
  1. フォームは複数ある。
  2. 全文書のフォームフィールド名は"form"になっている。
  3. フォームの設計要素に「form」というフィールドは作成していない。
そこで、他にも確認したNotes DBについても同様の確認をしてみましたが、
やはり同じでした。
つまり少なくとも設計の段階では、"Form"なのか"form"なのか、どちらになるかはわからないということです。

既存のNotes DBに手を加えるのはちょっとためらったので(破損してしまったら困りますから(笑))、新規にテスト用のNotes DBを作成しました。
なるべくシンプルにするために以下のような設計にしました。
  1. フォームは「MainTopic」(文書)と「Response」(返答)の2つを作成 
  2. 各フォームには「Subject」フィールドのみを作成
  3. ビューは「($All)」を作成、列情報はデフォルト設計(1列目に@DocNumber関数があるだけ)

念のため、このDBをコピーして複数(5個くらい)作成しておきました(毎回作るのが面倒なので)。

次に、このNotes DBに対して文書を作成してみました。
文書の作成方法はいくつかあります。
  1. Notes DBを選択して[作成]メニューからフォーム名を選択
  2. @Command([Compose];"フォーム名")関数を実行
  3. LotusScriptのNotesUIWorkspace.ComposeDocumentメソッドを実行
  4. LotusScriptのNotesDocumentクラスを使ってバックエンドで作成

実はこのうち、1~3は同じことをやっています。
すなわち、実質フロントエンドで作成するか、バックエンドで作成するかの二択になります。
フロントエンドの場合、フォームフィールド名は設定のしようがありませんので、設計要素に委ねられます。
バックエンドの場合、以下のようなソースを作成してみました。
Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim doc     As     NotesDocument
    Dim uiws    As New NotesUIWorkspace
    
    Set db  = session.CurrentDatabase
    Set doc = db.CreateDocument
    
    Call doc.ReplaceItemValue( "Form", "MainTopic" )
    Call doc.ReplaceItemValue( "Subject", "テスト:"+Cstr(Now) )
    Call doc.Save( True, True, True )
    
    Call uiws.ViewRefresh
End Sub


ここでは、"Form"という名前にしているので、このソースをコピーして
    Call doc.ReplaceItemValue( "form", "MainTopic" ) 




に変更したものも同時に作成しておきました。


では、実際に文書を作成してみましょう。
まず、フロントエンドで文書を作成してみました。
出来上がった文書のプロパティを見てみると、フォームフィールド名は"Form"になっています。
フォームフィールド名は"Form"になっている

続けて、バックエンドで文書を作成してみます。
"Form"でセットしているもの、"form"でセットしているものの順番で作成しました。
さて、"Form"で作成した方は確かにフォームフィールド名は"Form"になっていました。
問題は"form"で作成した方です。
プロパティを見ると・・・"Form"になっています!
"form"で作成したけど、"Form"になってる

最初に確認した発見の中の法則に当てはまっていますね(全文書のフォームフィールド名は統一される)。
つまり、このNotes DBで今後、文書を作成する場合は、どんなに頑張っても(*1)、フォームフィールド名は"Form"になるということになります。

では、Notes DB作成時にコピーしておいた別のNotes DBを使ってやってみましょう。
今度は最初に作成する文書はバックエンドで"Form"でセットするものにしてみます。
この文書のプロパティを見ると、フォームフィールド名は"Form"になっていました。
バックエンドで文書を作成したら"Form"になった

ということは、この後文書を作成しても"Form"になるだろうと予想して、"form"でセットする法を実行してみましたが、やはり結果は"Form"になりました。


最後にもう一つコピーしておいたNotes DBを使って、最初に"form"の値でバックエンドで作成する法を実行してみました。
この文書のプロパティを見てみると・・・
フォームフィールド名が"form"になっています!
フォームフィールド名が"form"になっている

やりました!故意に"form"というフォームフィールド名の文書を作成することができました。
念のため、フロントエンドで文書を追加してみましたが、やはり"form"になっていました。
これはフロントエンドで文書を作成した

"form"という名前のフィールドが作成される条件のうち、少なくとも1つは発見することができました。
でも、本当にこれで全部でしょうか?
ここで、こぴーしておいた4つ目のNotes DBの設計を修正して、「Form」という名前でフィールドを作成してみましょう。計算結果にして、値はそれぞれのフォーム名である"MainTopic"、"Response"にしておきます。
フォームに"Form"というフィールドを追加


このNotes DBに対して、フロントエンドで文書を作成してみましょう。
文書のプロパティを見ると、"Form"になっています。
文書のプロパティは"Form"になっています

これでこのNotes DBでは、フォームフィールド名は"Form"になることが予想されます。

このことから、5つ目のNotes DBの設計を修正して、"form"フィールドを作成した場合は
文書のフォームフィールド名は"form"になるでしょう(実際、そうでした)。


最後に、すでに文書が作成してあるNotes DBに対して、フォームに"Form"というフィールドを作ったらどうなるのか?を見てみましょう。
文書のフォームフィールド名が"form"になっている3つ目のNotes DBの設計を修正して、フォームに「Form」というフィールドを追加します。値はそれぞれ"MainTopic"、"Response"にします。
この状態で文書を作成してみると・・・
フォームフィールド名は"form"のままでした。
フォームフィールド名は"form"のまま

すでに文書があり、そのフォームフィールド名が"form"なので、そちらに準じるようです。

なお、文書をすべて削除してから、設計に「Form」フィールドを追加して、再度文書を作成しても、フォームフィールド名は"form"でした。
どうやら、Notes DB内のどこかにフォームフィールドを記憶しているようです。


ということで、
Notes DBに最初に文書を作った時のフォームフィールド名の値がそのまま引き継がれる
というのが今のところの回答です。

他にも、新規DBで「forM」というフィールド名でフォームを作成してから文書をみたところ、フォームフィールド名は"forM"になりました。

つまり、フォームフィールド名は大文字小文字を問わず、「form」となっていればなんでもよい。
ということなんでしょう。





*1 実際には、次の方法でクリアすることができますが、事実上不可能と言っていいでしょう。
  Notes DB内の全文書を削除して、compactを「-c」もしくは「-r」オプションで実行する。
  または、このNotes DBを設計要素のみで新しくコピーする。



上記でテストした以外にもXPagesを使った場合やC APIを使った場合など、色々な状況が想像されます。
よって、
大文字小文字の判別をしないといけないような作りにするのではなく、フォームフィールド名は一度大文字なり小文字なりに変換してから取得するといったような工夫をすることが必要といえるでしょう。



では、今日はこの辺で・・・




Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2016年9月26日月曜日

XPagesでカテゴリフィールドに設定する

皆さん、こんにちは。今週で9月も終わりです。9月といえば、一つの区切りという感じがします。
企業の期だったり、テレビでいえば番組改編期だったり。

10月になると何か変わるのかな?って調べてみたら、「厚生年金保険・健康保険の加入対象が広がる」そうです。
私には直接は関係ないのですが、こういうことも知っておかないといけないですね。


閑話休題。


さて、今日もXPagesの話題です。

クラシックアプリでよくやっていた?のが、ダイアログフィールドを作成して、既存のフィールドから選択したり新規に値を設定したりするという、分類わけするためのフィールド設定だと思います。
カテゴリフィールドを選択したときの画面

ちなみにこのフィールドの設定内容は次の通りです。
カテゴリフィールドの設定内容1
カテゴリフィールドの設定内容2

実際にこのフィールドを使って文書を作ってみました。
そしてカテゴリ別ビューという形で表示したのが下図です。
カテゴリ別ビュー

これをXPagesで実現する方法って・・・書いてなかったんですよね。

ただし、実際には「タグ」を使いましょうということで記事を書いています。
タグクラウドを使ってみよう
Dojo リストテキストボックスを使ってタグっぽく表現してみよう

これはこれで便利なんですけど、すでにどんなタグが作成されているのかを確認するのが難しいんですよね。

なので、クラシックアプリと同じような形で入力できるようにしましょう。

まず、フォームを表示するためのXPageを作成しておきます。

次に、カテゴリフィールドに対応するコントロールを配置します。
カテゴリは複数選択できるようにしたいので、リストボックスコントロールを配置します。
データソースのバインドは当然、カテゴリフィールドです。
そして、「値」の項目には、フィールドの設定内容と同じように、カテゴリを取得するための式を入力します(今回は「byCategory」ビューの1列目から取得するようにします)。
また、複数設定できるようにするため 、その設定も含めます。
コントロールの部分をソース表示すると以下のような形になります。

 
  
   <![CDATA[#{javascript:@DbColumn( "", "byCategory", 1 )}]]>
  
 


これで、既存のカテゴリを選択することができるようになります。
今度は新規でカテゴリを入力させるためのコントロールを配置します。
こちらは編集ボックスコントロールを配置します。
このコントロールに入力した内容は、先ほどのカテゴリ用のフィールドにマージさせるので、
このコントロールはデータソースのバインドをする必要はありません。

データソースにバインドさせないと、文書が読込モードでも入力領域として表示されてしまうので、
可視式を設定して編集時のみ表示させるようにします。
したがってコントロールのソースは下のようになります。
ちなみに何のためのフィールドかをわかりやすくするためにplaceholderの設定もしています。
※placeholderについては、XPagesでplaceholderを実現してみるを参照のこと

 
  
  
 




これで新規入力もできるようになりました。
ただ、これでは保存してもカテゴリフィールドに反映されません。
ということで最後に[保存]ボタンにその内容を記述します。
var cat1 = getComponent( "categories1" ).getValue();
var cat2 = getComponent( "categories2" ).getValue();
var cat  = @Trim( @List( cat1, cat2 ) );
document1.replaceItemValue( "Categories", cat );
document1.save();


@List関数でcategories1コントロールとcategories2の値をマージして、@Trim関数で""を取り除いています。
その内容をCategoriesフィールドにセットして文書を保存しています。



実行結果は下図になります。
カテゴリフィールドをXPagesで実現してみた

タグクラウドを使って今風にしてもいいですし、今回のようにクラシックアプリのような形にするのもよいでしょう。
使い勝手が良いのが一番ですので、みなさんの使いやすい方を選んでくださいね。

では今日はこの辺で・・・







Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2016年9月21日水曜日

XSPUserAgentのテストをしてみた

皆さん、XPages開発は順調ですか?

XPages開発をするということは、Notesクライアントで使っていたNotes DBをWeb化するというのが基本路線でしょう(XPinCといったNotesクライアントでXPagesアプリケーションを動作させる方法もありますが。

Web化する場合、使用するブラウザによっては想定していたのと違う動きをすることがあります。
そのような場合、ユーザーエージェントによってHTTPリソースを取得して、その値でブラウザ情報を判断して動きを変えるようにしたりします。

従来のNotes Webアプリでもユーザーエージェントは取得できましたが、XPagesの場合はどうすれば良いのでしょうか?

実は、XPagesでは、そのための関数が一通り用意されています。
JavaScriptのXSPUserAgentクラスを利用します。
取得方法は簡単で、SSJSで以下の記述をするだけです。

var uagt = context.getUserAgent();


これでユーザーエージェントがuagtという変数に格納されました。
後は、このクラスに設定してある関数を実行すれば結果を得ることができます。
ブラウザ名やバージョン等が取得できます。
実際に簡単な画面を作って実行したものが下図になります。

Chromeで実行したときの画面

どうでしょう。
そんなに難しくはないですよね。

たとえば、ブラウザ情報を取得したい場合は
context.getUserAgent().getBrowser()
と記述します。


ただ、一つ難点があります。
下図を見てください。同じXPagesアプリケーションをIE11で実行したときのものです。
IE11で実行したときの画面

赤枠の部分をみると、
ブラウザ情報が取得できていない。当然ブラウザのバージョン番号も取得できていない。そもそもIEであると判断されていない
ということがわかります。

このままではユーザーエージェントを使ってブラウザ情報を取得できない!ということになってしまいます。
うーん。どうしたものか・・・と悩みつつ、回避策はないものかと調べていたら、
ありましたよ。すでに。まぁ当たり前ですよね。

こちらです。
XSPUserAgent Methods Do Not Detect IE 11


さらに、すでにXSnippetsというサイトにも出ているじゃありませんか。


便利ですね。
何はともあれ、IE11でもユーザーエージェントを駆使すれば情報を取得することがわかりました。


ちなみに、このXSnippetsというサイト、日本語版があるのはご存知ですか?
XSnippets 日本語版
です。
今回のIE11の判定方法のように、みなさんが独自で作成したコードなんかを共有しましょうというサイトです。
苦労して書いたコードを他の人に簡単に提供するのは嫌かもしれませんが、自分が提供することで他のお客様の問題も同時に解決できるという風に考えればいいことだと思います。
もしかしたら、この中に自分が困っていることを解決してくれるコードもあるかもしれませんし。

ちなみにIBM Championになるためのアピールポイントとしても利用可能です(笑)

また、QAサイト等で質問して、正解が得られた場合も、そのコードを登録してくださると、他の人が利用しやすくなると思いますので、是非ご協力ください。


それでは今日はこの辺で・・・






Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

2016年9月19日月曜日

特定のアイテムだけコピーしてみよう

皆さんこんにちは。

三連休ですが、天気が悪いのであまり外出する気分になれません。
仕方がないので?ブログ記事を書くことにしました。

XPages関連に行きたいところですが、諸事情により、今日もLotusScriptのサンプルです。
今日はNotesDocumentクラスのCopyItemについてです。
なんかこんなメソッドのサンプルなんて書いているだろうと思っていたのですが、書いてませんでした(笑)

どうやら、私自身はあまり使ってこなかったようです。
ですが、書いてあった方が色々と役に立つこともあるでしょうから作成しておきましょう。


ちなみに、このサンプルは、自文書内の「Body」というリッチテキストフィールドの内容を新規文書にコピーするというものです。
リッチテキスト内の文字はもちろん、画像や添付ファイルまでコピーしてくれます。
決まったフォーマットのものを文書に格納しておいてそれを別の文書に格納するときなんかに使えるかな(どんなシチュエーションだ・・・)


Sub Click(Source As Button)
    On Error Goto ErrProc
    
    Dim uiws    As New NotesUIWorkspace
    Dim uidoc   As     NotesUIDocument
    Dim udoc    As     NotesDocument
    Dim ritem   As     NotesRichTextItem
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim newdoc  As     NotesDocument
    
    Set uidoc  = uiws.CurrentDocument
    Set udoc   = uidoc.Document
    Set ritem  = udoc.GetFirstItem( "Body" )
    
    Set db     = session.CurrentDatabase
    Set newdoc = db.CreateDocument
    Call newdoc.ReplaceItemValue( "Form", "MainTopic" )
    Call newdoc.ReplaceItemValue( "Subject", "Bodyをコピーするために新規作成" )
    Call newdoc.ReplaceItemValue( "Categories", "テスト" )
    Call newdoc.ReplaceItemValue( "Sections", "小分類" )
    Call newdoc.CopyItem( ritem, "Body" )
    Call newdoc.Save( True, True, True )
    
    Exit Sub
    
ErrProc:
    Msgbox _
    "エラー行数:" & Cstr(Erl) & Chr$(10) & _
    "エラー番号:" & Cstr(Err) & Chr$(10) & _
    "エラー内容:" & Error, _
    0 + 16, "特定のアイテムだけコピーしてみる"
    
    Exit Sub
End Sub



サンプルはリッチテキストアイテムとしていますが、通常のアイテム(テキストフィールド、数値フィールド等)でも問題なくコピーすることができます。
色々試してみてください。




さて、サンプルを作ることの利点は、
・自分自身でコーディングすることで、どのように記述すればいいのかを覚えることができる。
・サンプルに書いたメソッド/プロパティがどのような動きをするのかが実際に分かる。
・後で備忘録のような形で利用できる。
といったところでしょうか。

このブログ記事は、私自身の備忘録として書き始めたものですが、皆さんにも同じような形で使っていただけたら幸いです。



では、今日はこの辺で・・・



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ


2016年9月14日水曜日

未読文書数を数えてみよう

皆さんこんにちは。
世間ではNotes/Domino 9.0.1のサポート期間が2021年9月までだとか8.5.xのサポート期間が2018年9月までだとか言ってますが、気にしません。
※9.0.1は「少なくとも」2021年9月まではサポートするよということでそこで終了とは限らないそうです。 Windows XPだってサポート終了してますが使ってる人いますよね?
IEだってOSによっては11しかサポートしてくれませんが、IE8を使ってる人いますよね?
そんなもんです。
きちんと動作してくれればそれでいいんです。
でも、せめてバージョンはあげてほしかったですね(9.0.2でも、10.0.0でもなんでもいいけど、9.0.1で延長しますというのはちょっと寂しかった)。

詳しいことはネット上にあふれているのでそちらを探して読んでみてください。


こちらのブログは通常運転です。

ということで、今日はヘルプの誤記についてのお話です。

Notes DBの未読/既読ってよくできてますよね。
ワークスペースアイコンにも未読文書数を表示することができます。
DBの未読文書数が表示されている

メールDBでは、フォルダごとに未読文書数が表示されたりします(ビューでは表示されない)。
メールDBのアウトライン(フォルダ名の横に未読文書数が表示される)

さらに、文書が未読なのか既読なのかをプログラムで判断することもできます。
文書の未読既読状態をチェックするを参照。


ここまで来たら、Notes DBの未読文書数もプログラムで数えてみたい!
ということでそんなメソッドがあるのかな?と調べてみました。
まぁ、ありますよね。えぇありましたよ。
NotesDatabaseクラスにGetAllReadDocumentsメソッド、GetAllUnreadDocumentsメソッドなるものがありました。
前者が既読文書数のコレクションで、後者が未読文書数のコレクションです。
デザイナーヘルプによると、構文は次の通り。
Set notesNoteCollection = notesDatabase .GetAllReadDocuments( [username] )


ヘルプはGetAllReadDocuments (NotesDatabase - LotusScript®)を参照
直される前に証拠の画像(笑)

へぇ。コレクションと言ったらNotesDocumentCollectionかな?と思ったら設計の一覧(NotesNoteCollection)になるんだぁ。となんとなく嫌な予感はしつつも、そういうものだろうと強引に納得しました。

ということで、プログラムを書いてみました。
Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim note    As     NotesNoteCollection
    Dim uname   As     NotesName
    
    Set uname = New NotesName( session.UserName )
    Set db   = session.CurrentDatabase
    Set note = db.GetAllUnreadDocuments( uname.Canonical )
    
    Msgbox _
    uname.Common & "の未読文書数は、" & Cstr( note.Count ) & "です。", _
    0 + 64, "未読文書数の表示"
End Sub

そしたら保存できないじゃないですか!?
データ型が一致しません。と怒られて保存できない・・・

・・・もしかして、NotesDocumentCollectionなんじゃないか?
LotusScriptライブラリでプログラムを記述するとEclipseの機能により、メソッドのコードアシスタントが働き、戻り値の型などが表示されるので試しに記述してみよう!
ということで、LotusScriptライブラリで同じようにコードを記述してみて、GetAllUnreadDocumentsのコードアシスタントを確認してみました。
GetAllUnreadDocumentsのコードアシスタント


・・・えーっと。NotesDocumentCollectionって書いてありますね。
またかよ。ヘルプに間違いを書くなよっていうか、直せよ!(8.0で追加されたメソッドですが、その時からこのままだった様子)


気を取り直してプログラムを修正しました。


Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim docs    As     NotesDocumentCollection
    Dim uname   As     NotesName
    
    Set uname = New NotesName( session.UserName )
    Set db   = session.CurrentDatabase
    Set docs = db.GetAllUnreadDocuments( uname.Canonical )
    
    Msgbox _
    uname.Common & "の未読文書数は、" & Cstr( docs.Count ) & "です。", _
    0 + 64, "未読文書数の表示"
End Sub


さきほどのNotes DBに仕込んで実行した結果がこちらです。
未読文書数が正しく表示されてます

ヘルプを読みましょう!と推進しているのですが、こうやって誤りがあるとなかなか推進しづらいのですが、正しい使い方を覚えるよい機会にもなるので、やっぱり読みましょう。
使ったことがないメソッドなんかは適当に書くのではなくて必ずヘルプを見てから書くようにしましょう。
そうすれば、何が悪いのかが分かるようになります。


では今日はこの辺で。





Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ