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

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

2012年9月28日金曜日

コントロールの余白を設定するとスクロールバーが表示されるのが嫌だ!

XPages はHowToをまとめるのが難しくて、サンプルDBをばらばらと作っているのです。
なので、思いつくまま作っていると、どんなサンプルかを忘れてしまうんですね。

ということで今回は、ちょっとしたことなんだけど、忘れたら困るというものを備忘録のような形で書きます。
内容は薄いよ。だから期待しないでね。

それでも良いよと言う人は、このボタンを押してから、読んでくださいね。
にほんブログ村 IT技術ブログへ


では、本題。
XPage に、コントロールを配置してブラウザ等でプレビューすると、コントロールは左上に配置されます。
下図は、パネルコントロールとその中にラベルコントロール(サンプルアプリケーションというラベル)を配置して、Firefoxでプレビューしたものです。
パネルとラベルコントロールを配置したサンプルアプリケーション

パネルに境界線を設定して、再度Webブラウザでプレビューしてみます。
パネルコントロールに境界線を設定
パネルコントロールに境界線を設定してプレビュー

プレビューをよく見ると、境界線がぴったりとくっついています。余白を設定していないので当然と言えば当然です。
でも、これではちょっとみにくいので余白を設定してみましょう。



上、左、右にそれぞれ5.0ピクセルずつ余白を設定します。

この状態で、Webブラウザでプレビューしてみましょう。
パネルコントロールに余白を設定
パネルコントロールに余白を設定してプレビュー

なぜか、スクロールバーが表示されています。
どうも、余白(上)を設定すると、その分、下にスクロールされてしまうようです。
せっかく余白を設定して、見栄えが良くなったというのに、これはいただけません。

どうにかして、幅きっちりではなく余白を残した上でスクロールバーを表示させないようにしたいものです。
・・・色々と試行錯誤した結果、次の方法で解決(回避?)できました。

  1. パネルの余白、境界線の設定を全部初期化する。
  2. パネルの中に表コントロールを配置する。
  3. 表コントロールに余白と境界線を設定する。
  4. 表コントロールのセルの中にラベルを移動する。

では、詳しく見ていきましょう。

1.パネルの余白、境界線の設定を全部初期化する。
これは、もうそのままですね。上記で設定した内容を元に戻します。

次に、2.パネルの中に表コントロールを配置する。
コントロールビューから表コントロールをドラッグ&ドロップします。
表のサイズは、1行1列、100%幅とします。
表コントロールの挿入

表コントロールの位置は、アウトラインビューを使うと変更しやすいです。

今度は、3.表コントロールに余白と境界線を設定する。
まず、表全体の余白を設定します。この時、設定する余白は余白(内側)です。CSSでいうと、paddingですね。
左右上をそれぞれ5.0ピクセルとします。
表コントロールの余白(内側)を設定

境界線の設定ですが、これは表コントロール自身ではなく、その中に含まれる「表のセル」に対して設定します。
アウトラインビューで表コントロールを展開していくと、「表の行」「表のセル」と表示されてくるので、この「表のセル」を選択します。
この状態で、プロパティビューの「背景」タブを選択します。
「表のセル」のプロパティビュー

ここに、境界線の設定があるので、最初と同じように境界線を設定します。
「表のセル」に境界線を設定

これで、境界線が設定できたので、最後に4.表コントロールのセルの中にラベルを移動する。
これも、アウトラインビューで操作すると簡単にできます。
移動する先は、「表のセル」の中です。移動した後のアウトラインビューは以下のようになります。
完成時のアウトラインビュー

では、保存してWebブラウザでのプレビューを見てみましょう。
完成ページのプレビュー

どうでしょう?スクロールバーが表示されていません。ちゃんと余白を残して、境界線が表示されています。


ということで、少々面倒ではありますが、これで多少なりとも見栄えを良くすることが出来ました。
OneUI とか難しいことを知らなくても出来るんだな。ということが分かってもらえれば嬉しいです。

で、この設定、結構忘れてしまうので、このように記事にしたのでした。
いやぁ、この設定を思い出すのに(というか、再現するのに)2日間もかかるとは・・・

普段から整理しながら仕事をすることが大事だ!と痛感した筆者でした。
お粗末・・・



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

2012年9月26日水曜日

XPagesでノーツアプリケーションのアクセス権をチェックしてみよう!

こんにちは、月火はちょっと違うことをしていたので、ブログを書けませんでした。
え?土日があるだろ?そんな鬼のようなことは言わないでくださいね。

ということで、土日はしっかりと休んだ筆者への応援ボタンをクリックしてから本文を読むようにしてください。
にほんブログ村 IT技術ブログへ


今日もXPagesです。
本当はExtension Library関係の事を書きたかったのですが、ちんぷんかんぷんだったので、またの日にします。

今回は、タイトルにもあるように、ノーツDBのアクセス権について触れてみます。

アクセス権は、「作成者」「編集者」「読者」等の他に「文書の作成」「文書の削除」「個人エージェントの作成」等の特殊権限もあります。

このうち、前者のアクセス権については、以下の方法で取得できます。
ちなみに、計算結果フィールドコントロールを設置して、その値に式を記述します。
requestScope.dbPathName = @Subset(@DbName(), -1);
var chkDb:NotesDatabase = session.getDatabase( @Subset(@DbName(), 1), requestScope.dbPathName, false );

switch ( chkDb.getCurrentAccessLevel() ) {
    case NotesACL.LEVEL_MANAGER   : return "管理者";
    case NotesACL.LEVEL_DESIGNER  : return "設計者";
    case NotesACL.LEVEL_EDITOR    : return "編集者";
    case NotesACL.LEVEL_AUTHOR    : return "作成者";
    case NotesACL.LEVEL_READER    : return "読者";
    case NotesACL.LEVEL_DEPOSITOR : return "投稿者";
}
4行目のchkDb.getCurrentAccessLevel()
が、ノーツアプリケーションのアクセス権を取得するところです。
chkDbは、汎用性を持たせるために、データベース名を指定できるようにしていますが、サンプルであれば、
database.getCurrentAccessLevel()
としても良いでしょう。

ちなみに、ブラウザで動作確認をする場合、ACLの設定にある「Web ユーザーによるアクセスの上限」によっては、アクセス権が違うように表示されるので注意してください(上記の設定のデフォルト値は"編集者")。
Webユーザーによるアクセスの上限


さて、もう一つの特殊な権限について確認しましょう。

従来のノーツアプリケーションの場合、@関数の@UseAccessが使えるので簡単にチェックできますが(現在のDBに対するアクセス権を求める を参照)、XPages にはこの関数は存在しません。

では、どうするのか?と言えば、
SSJSのNotesDatabaseクラスのqueryAccessPrivilegesを使います。
LotusScriptのNotesDatabaseクラスにもQueryAccessPrivilegesという同名のメソッドがあるので、使ったことがある方もいるのではないでしょうか?


このメソッドは使い方が特殊で、結果はビット演算で取得する必要があります。
下記は、「文書の作成」の権限をもっているかどうかを確認するための式です。
requestScope.uname = @UserName();
var user    = requestScope.uname;
var chkDb:NotesDatabase = session.getDatabase( @Subset(@DbName(), 1), requestScope.dbPathName, false );
var accPriv = chkDb.queryAccessPrivileges( user );

if ( (accPriv & NotesDatabase.DBACL_CREATE_DOCS) > 0 ) {
    return "あり";
}
6行目のNotesDatabase.DBACL_CREATE_DOCSは、文書の作成を表す定数です。

この他の定数については、ヘルプ(Lotus Domino Designerを起動した状態で、[ヘルプ][ヘルプ目次]メニューを実行)のNotesDatabaseクラスのqueryAccessPrivilegesを参照願います。

下図は、サンプルを実行したときの画面です。
サンプル実行画面

文書の作成、文書の削除、個人エージェントの作成等、各種権限について、一つずつ確認して、画面に表示するようにしたものです。

もっと工夫をすれば、指定したDBの指定したユーザーのアクセス権について、画面に表示させることも出来ますね。
そこは皆さんで、応用してみてください。





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

2012年9月21日金曜日

XPagesで文書のロックをやってみよう!

ふと気がついたのですが、もう9月も後半だったんですね。驚きました。
どうりで最近、朝晩が涼しくなったんですね。このような季節の変わり目は体調を崩しやすいので気をつけましょうね(前にもこんなことを書いたような気が・・・)



さて、今日も本文を見る前にこちらのボタンをポチッとクリックしてやってくださいね。
にほんブログ村 IT技術ブログへ
ホントに押してくれないと、そのうち見せなくしますよ!だからお願いしますね。

では、今日の話題です。
またまた、XPages でxxしてみよう!ということで、 今回は文書のロックに挑戦です。

文書のロック自体は、Lotus Domino 6からの新機能です。ですので、当然XPagesでも出来るだろうとの予測で始めています(ブログの記事なんてこんなもんです)。

文書のロックの仕組み自体の説明はここでは割愛します。
詳しく知りたい場合は、日本IBM殿のサイトにあるLotus Notes/Domino 文書ロックの仕組みFAQを参照願います。

ということで、ある程度の準備が出来ているという前提で進めます。
まず、ノーツアプリケーションのプロパティで「文書のロックを許可」にチェックを付けておきます(下図)。
ノーツアプリケーションのプロパティ

・・・というつもりで進めていくつもりだったのですが、
なんか旨く実装できませんでした(筆者の技術力が低いからなのか、そもそもダメなのかは分かってません)。

なので、 擬似的な形になりますが、「こんな形で実装しました。」という報告にさせてください(嫌だ!と言っても、そうするんですが・・・)。

実装方法としては、次のようにしました。
  1. 文書のロック、ロック解除は、ビュー上で行う。
  2. 文書をロックしているユーザをビュー上に表示する。
  3. 文書の編集は、フォームを表示するためのXPage上で行う。
  4. 別のユーザが文書がロックしている場合、編集モードに移行することが出来ないようにする。
  5. 文書の保存やキャンセル等、XPage 画面を閉じるのは普通に行う。

では、それぞれについて詳しく見ていきましょう。

まずは、 1.文書のロック、ロック解除~です。
(XPages アプリケーションの)ビュー上で行うので、 ビューで文書が選択できるようにします。
ビューコントロールの一番左の列に、一つ列を挿入します。
プロパティビューの「表示」タブで、「列の値を表示」のチェックを外して、さらに「チェックボックス」にチェックを付けます(下図参照)。
チェックボックスの列を追加

今度は、選択した文書をロックするためのプログラムを記述するので、ボタンを配置します。
ボタンのラベルは「選択した文書をロックする」とします。
イベントビューを開いて、スクリプトの実行を追加します。
スクリプトエディタには、以下のように記述します。
var panelName = "viewPanel1";
var ids = getComponent( panelName ).getSelectedIds();

if ( ids.length != 1 ) {
    view.postScript( "alert('文書は一つだけ選択してください。')" );
    return false;
}

try {
    // 選択文書を取得する
    var doc:NotesDocument = database.getDocumentByID(ids[0]);

    // ノーツアプリケーションに文書のロックを許可する
    if (!database.isDocumentLockingEnabled()) {
        database.setDocumentLockingEnabled(true);
    }
   
    // 文書がロックされていなければ、ロックする
    doc.lock( @UserName() );
   
} catch(e) {
    var docOwner = doc.getLockHolders();
    view.postScript( "alert('文書は" + docOwner + "にロックされています。')" );
    return false;
}
SSJS(文書をロックする)

var panelName = "viewPanel1";
で、  ビューコントロールの名称を設定しています。
var ids = getComponent( panelName ).getSelectedIds();
で、選択した文書を取得していますが、分かりやすくするために、選択して良い文書は1つとしています。

doc.lock( @UserName() );
で文書をロックしています。すでにロックされている場合は、例外が発生するので、catchして、現在文書をロックしているユーザ名を 表示して、処理を中断しています。

同様にして、文書のロックを解除するためのボタンを配置します。
ボタンのラベルは、「選択した文書のロックを解除する」とします。
イベントには、次のコードを記述します。
スクリプトエディタには、以下のように記述します。
var panelName = "viewPanel1";
var ids = getComponent( panelName ).getSelectedIds();

if ( ids.length > 1 ) {
    return false;
}

try {
    // 選択文書を取得する
    var doc:NotesDocument = database.getDocumentByID(ids[0]);

    // ノーツアプリケーションに文書のロックを許可する
    if (!database.isDocumentLockingEnabled()) {
        database.setDocumentLockingEnabled(true);
    }
   
    // 文書のロックを解除する
    doc.unlock();
   
} catch(e) {
    var docOwner = doc.getLockHolders();
    view.postScript( "alert('文書は" + docOwner + "にロックされています。')" );
    return false;
}
SSJS(文書のロック解除)

基本的には、文書のロックと同じです。
doc.lock()の代わりに、doc.unlock();となっているところが違います。
こちらも、別のユーザがロックしている場合は、例外が発生するので、catchして、現在文書をロックしているユーザ名を 表示して、処理を中断しています。


今度は、2.文書をロックしているユーザをビュー上に表示する。です。
こちらは、まずビューそのものに列を追加します。
列の値は、「$Writers」とします。
後は、XPage のビューにこの列を表示するようにするだけです。

実装した後、簡単なテストをした結果が下図です。
文書のロックをXPageのビューで表現してみた

赤枠の部分がすでにロックしてある文書の行です。「ロックユーザ」という列にロックしているユーザ名が表示されています。
※画面下の方にある「競合文書」は今回の話では関係ありませんので、無視してください。



次に、3.文書の編集は~と、4.別のユーザが~です。
これは、
文書を編集モードに移行する際、他の人がすでにロックしていたら、その旨を表示して、処理を中断する。
という実装になります。

通常、編集ボタンの内容は、シンプルアクションの「文書モードの変更」を利用するかと思いますが(下図)、その場合、文書がロックされているかどうかの判断ができません。
シンプルアクション(文書モードの変更)

そこで、このボタンのイベントは(SSJS・・・サーバーサイドJavaScript)を使って、以下のように記述します。
// 自文書(バックエンド)を取得する
var doc:NotesDocument = document1.getDocument( true );

if ( doc.getLockHolders().isEmpty() ) {
        context.setDocumentMode( "edit" );
} else {
    var docOwner = doc.getLockHolders();
    view.postScript( "alert('文書は" + docOwner + "にロックされています。')" );
    return false;
}
編集ボタンのSSJSコード

最初に、NotesDocumentオブジェクトを取得しています。
次に、文書をロックしているのが誰なのかを取得して、""(空の文字列)であれば、編集モードに移行します。
""でない場合は、文書がロックされていると言うことなので、誰が文書をロックしているのかをダイアログで表示するようにしています(doc.getLockHolders()は、現在文書をロックしているユーザーを取得します)。
ちなみに、ロックされている文書を編集しようとすると、こんな画面になります。
エラーダイアログ(IEの場合)
エラーダイアログ(Firefoxの場合)

文書を編集モードにするのは、
context.setDocumentMode( "edit" );
で実行しています。


続いて、保存ボタンとキャンセルボタンです。
こちらは、特に何もしません。普通に文書の保存やページを開くのシンプルアクションを設定して終わりです。


ということで、実装自体はこれで終わりです。

他の人に編集させないようにするためには、一度文書をロックしてから、編集するという運用なので、手間はかかりますが、なんとか実現はできています。

問題としては、ロックしないで編集しているときに、他の人がロックしてしまうと、競合文書(保存時の競合)が発生してしまうことでしょうか。
まぁ、サンプルなのでそこはご勘弁を・・・

どなたか、もっと上手いやり方があれば、是非ご教授ください。




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

2012年9月18日火曜日

XPagesで文書のバージョン管理をやってみよう!


この週末は3連休の人が多かったのではないでしょうか。
筆者は、事務所の移転作業があったため、3連休ではなく、2.5連休でした。

しかも、土曜日の夜あたりからちょっとのどの調子がおかしく、連休中はほとんど家でゴロゴロという年寄りか!みたいな生活でした。
風邪には十分気をつけましょう。

ということで、筆者の風邪?が良くなることを祈念しながらボタンをクリックしてやってください。
にほんブログ村 IT技術ブログへ


さて、今日はXPagesのネタです。ちょっと記事を書くのを休んでいたので、約2週間ぶりのXPagesネタということになります。

従来のノーツアプリケーションでは、文書を保存する際に、そのまま保存するか、返答文書として保存するかというバージョン管理の設定がありました。
フォームのプロパティ

さらに、@Command([FileSaveNewVersion])コマンドや、NotesUIDocument クラスの SaveNewVersion メソッドを使うことで、保存アクションで自動的にバージョン管理するのかどうかの切り替えも行えました。

では、XPages ではどのようにやれば良いのでしょうか?
・・・どうも、なさげなんですね。つまり、自作してください、と。

では、自作してみましょう。
今回は、「以前の文書を返答文書に」の動きを実現します。

まずは、バージョン管理がどのような動きをしているのかの確認です。
以前の文書を返答文書にするということなので、次のような感じでしょうか?
  1. バックエンドで現在の文書(変更前)を取得する(UI から取得すると、変更後の状態を取得してしまうため)。
  2. バックエンドで新規に文書を作成する。
  3. 新規で作成した文書に1.で取得した文書の全アイテムをコピーする。
  4. 新規で作成した文書を1.で取得した文書の返答文書にする。
  5. 新規で作成した文書を保存する。
  6. UI の文書を保存する。

せっかく自作するので、通常の保存と、バージョン管理用の保存と分けて作成しましょう。
といっても、通常の保存は今まで散々やってきたのでここでは割愛します。

フォームを表示するための XPage はできあがっているものとします。

最初に、ボタンコントロールを追加します。
ボタンのラベルは「履歴付き保存」としましょう。
可視の設定も行っておきましょう(document1.isEditable()ですね・・・document1はデータソース名)。

次にイベントビューを開いて、アクションを追加します。アクションの種類は「スクリプトの実行」にします。
スクリプトエディタには、以下のように記述します。
// 保存前の文書(バックグラウンド)を取得する
var docId = document1.getNoteID();
var pdoc  = database.getDocumentByID( docId );

// 保存前の文書を返答文書として保存する
var doc  = database.createDocument();
pdoc.copyAllItems( doc, true );
doc.makeResponse( pdoc );
doc.save();

// 現在の文書を保存する
document1.save();

// homeページを開く
context.redirectToHome();
履歴付き保存のコード

コードについての説明は特にありません。上で書いたとおりのロジックです。

最後の行の「context.redirectToHome」は、ノーツアプリケーションの起動時に開くページを開くというものです。
下図が設定画面です。
起動時の画面設定


これで完了です。とても簡単ですね。
筆者は、ノーツアプリケーションの設計書等は、全部この設定を施したノーツアプリケーションに格納しています。
今までは、従来のノーツデータベースで作成していましたが、これからはXPagesアプリケーションに乗り換えようかな?

皆さんも、チャレンジしてみてください。






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

2012年9月7日金曜日

文字列の検索(@Begins関数の場合)

昨日は、私用でお休みを頂きました。その関係で、ブログもお休みしました。
今日はその分、ちゃんと書きますよ。

では、本文に入る前にこちらのボタンをクリックしましょう。って、ホントに押してますか?押してくださいね。
にほんブログ村 IT技術ブログへ



今日は久しぶりに、@関数の話題です。

文字列の検索をする場合、@Leftや@Contains関数を使うことが多いと思いますが、"***"で始まっているかどうか?ということを調べるのであれば、@Begins関数が便利です。
ただ、この関数のヘルプ、おかしいんですよねぇ。翻訳が・・・

ということで、使ってない人が多いのではないでしょうか。

そこで、サンプルを元に解説して使い方を覚えてもらいましょう。

こんなフォームを用意しました。
サンプルフォーム画面

「検索したい文字列」(フィールド名:SearchString)には、「検索対象の文字列」が何で始まっているのかどうかを調べたい文字列を入力します。
「検索対象の文字列」(フィールド名:TargetString)には、検索される文字列を入力します。
つまり、
「検索したい文字列」の長さ<= 「検索対象の文字列」の長さ
ということになります。
ちなみに、それぞれ「複数値も可」にチェックが入れてあります。

[Begin関数による検査]というボタンの式は、以下のように記述しています。
ret := @If(@Begins(TargetString;SearchString);"指定した文字列で始まっています。";"指定した文字列では始まっていません。");

@SetField("SearchResult";ret)
SearchResultは、「結果」と書かれているところのフィールドです。

下図は、実際の実行結果です。
実行結果

このように、日本語でも正しく検査されることが分かります。

ここで、ヘルプを読むと、
1つ目のパラメータは「テキストまたはテキスト文字列。任意の文字列を指定します。」となっており、
2つ目のパラメータは「テキストまたはテキスト文字列。string の最初にあるかどうかを検索する文字列を指定します。」となっています。
テキストとかテキスト文字列って・・・おかしいですね。きっと翻訳誤りで、「文字列または、文字列リスト。」と言いたいのではないでしょうか?

その証拠に、使用法という箇所を見ると、「いずれかのパラメータがリストである場合、この関数は最初のパラメータの各要素に対して 2 番目のパラメータの各要素を検査し、一致している場合に 1 を返します。」 と書いてあります。
つまり、どちらのパラメータも文字列リストを許可しているはずです。

ということで、文字列リストについても試してみましょう。
下図は、検索対象を複数にしてみました。
実行結果2

この場合も、やはり結果は「xxxで始まっている」という事になりました。
指定した文字列が、検索対象の文字列のうち、どこか一つでも当てはまれば良いと言うことが言えます。


今度は、検索する文字列を複数にしてみました。
検索対象が1つなので、下手な鉄砲も数打ちゃ当たるといった感じでしょうか。
実行結果3

ということで、こちらも、やはり結果は「xxxで始まっている」という事になりました。
下手な鉄砲が当たったのですね。


では、それぞれを複数にしたらどうなるでしょう?
実行結果4

全部のパターンが当てはまらないといけないのかと思いきや、どこかの組み合わせで、「xxx」で始まっているのが見つかれば、「xxxで始まっている」ことになるんですね。

ちなみに、「検索したい文字列」を複数にした場合、どの検索したい文字列が合致したのかまでは面倒見てくれません。
そこまでチェックしたい場合は、「検索したい文字列」は複数を許可しない方が良いでしょう。
もしくは、[i]を使用して、リストの中を1つずつ検索するという風に式を改造する必要があります。

ということで、@Begins関数の使い方は分かっていただけたでしょうか。





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

2012年9月5日水曜日

XPagesで読者名フィールドを使ってみよう!

9月になったので、少しは涼しくなったのかな?と思ったのですが、甘かったです・・・
やっぱり昼間は暑い!暑すぎます!


はやく「涼しい」季節になって欲しいと願う筆者です。

さて、そんな残暑が厳しい9月ですが、そこをなんとか乗り切るためにこのボタンをクリックしましょう!
にほんブログ村 IT技術ブログへ



ということで、またまたXPagesのお話しです。
今日は、XPages で読者名フィールドを設定してみましょう。

やり方はいくつかあります。
まず一番簡単な方法は、次の通りです。
1.フォームを作成する。
2.フィールドを「読者」「計算結果」として追加する(仮にフィールド名は、readersとします)。
3.上記のフィールドの計算式は、自分自身のフィールド名を記述する(下図参照)。
読者名フィールドの設定
4.フォームを保存する。
5.フォームを表示するためのXPageを作成する。
6.readersフィールドにバインドした編集ボックスコントロールを追加する。
7.フォームのデータソースの「フォーム検証の実行」を"文書保存時"もしくは"両方"のいずれかに設定する(下図参照)。
フォーム検証の実行
8.XPage を保存する。

これで、文書を保存すると、readersフィールドに入力した内容が、読者名フィールドに設定されます。
下図は、XPages アプリケーション上で、文書を作成した後、ノーツクライアントでその文書のプロパティを確認した様子です。
文書プロパティ(読者名フィールド)

こちらのやり方は、非常に簡単で良いのですが、フォーム上の計算式がすべて実行されてしまうので、複雑なフォームだと制御が難しくなります。


もう一つの方法は、XPages 上の イベントで読者名フィールドを設定するというものです。
手順は、先ほどの1.~6.までは同じです。
7.が違います。
文書を保存するためのボタン(でも、リンクでも良いのですが・・・)のイベントを少し修正します。

実は、
「作成者/名前/読者」フィールドの実現方法に書いてあるので、二番煎じになってしまうのですが、ここでも書いてしまいます。いいですよねぇ?

保存ボタンを作成したら、イベントビューを開きます。
次に、アクションを追加して、スクリプトの実行を選択します。
スクリプトエディタ内の式には、以下のように記述します。
var doc = document1.getDocument( true );

var item = doc.getFirstItem( "readers" );
item.setReaders( true );

document1.save();
文書保存時のアクション


1行目のdocument1.getDocument(true)で、画面上の文書データをNotesDocumentオブジェクトとして取得しています。この時、引数にtrueを設定しないと、新規文書の保存時にエラーになってしまいます。これポイントです(筆者は悩みました・・・)。
3行目のdoc.getFirstItem()では、"readers"フィールドをNotesItemオブジェクトとして取得しています。
そして、4行目のitem.setReaders()でreadersフィールドを読者名フィールドとして設定しています。
Lotus Scriptの場合、IsReaders プロパティをtrueにすれば良いのですが、JavaScriptでのNotesDocumentクラスの場合、書き方が違うので注意が必要ですね。

5行目のdocument1.save()は、XPages 上で文書を保存するためのJavaScript構文です。

これで文書を保存すると、readersフィールドが読者名フィールドとして設定されます。


読者名フィールドにロール名なんかを設定しておくと、ロールを付与されたユーザーだけが文書を参照できるようになるので、とても便利ですね。


是非、試してみてください。
そして、当ブログにフィードバックしてやってください!






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

2012年9月4日火曜日

返答文書の作成方法とビューの表示方法

9月になりました(え?とっくになってる?)・・・
8月末で、どこぞの掲示板が一旦終了になりました(何度目の終了だろうか・・・復活するたびに、以前のデータがなくなっていくのが切ない。もったいないよなぁ)。
しかし!当ブログは、まだまだ閉鎖しません!


ということで?9月になったので、気持ちも新たに、ボタンをクリックしましょう!
にほんブログ村 IT技術ブログへ


さて、今回もXPagesです。
今回も、やっているようでやっていなかったシリーズです。

それはXPagesで返答文書を作成する方法です。
サンプルを見ていると、URLパラメータに文書UNIDを引き渡して・・・とか面倒くさいことをしていますが、
もっと簡単にできるんです。

知っている人は知っていると思うので、今日のは読まなくても良いですよ。

まず、準備として以下の4つをやっておいてください(もう、これらの説明は省きますので、過去の記事を参照願います)。
  1. 「文書」のフォームを作成します。
  2. 「文書」フォームを表示するためのXPageを作成します。
  3. 「返答」のフォームを作成します。
  4. 「返答」フォームを表示するためのXPageを作成します。

返答文書を作成するには、「文書」フォームを表示するためのXPageに仕掛けを施すので、そのXPageを開きます。
ボタンコントロールをドラッグ&ドロップします。
ボタンのラベルは、「返答の作成」とします。
また、可視の式を「!(document1.isEditable())」としておきます。
ここで、document1とは、フォームのデータソース名を表しています。
返答の作成ボタンのプロパティ

次に、このボタンのイベントビューを開きます。
[アクションの追加]ボタンをクリックして、アクションを追加します。

アクションは、「返答文書の作成」を選択します。
また、開くページの名前は、あらかじめ準備しておいた「返答」フォームを表示するためのXPageを選択します。
ここでは、「Response」という名前にしてあります。
返答文書の作成アクション

さらに、親文書IDを引き継ぐために、計算する必要があります。
「親文書ID」の右側にある◇をクリックして、「値の計算...」を選択します。
スクリプトエディタの画面になるので、
document1.getDocument().getUniversalID()
と入力します。
親文書IDを算出

これで、XPage を保存すればOK!です。

しかし、これではビュー上にどのように表示されるか分かりません。
ということで、ついでにビューでの表示方法を実装してみましょう。

といっても、すでに方法が紹介されています。
XPages Tips : ビューコントロールで返答文書をインデント表示する


これだと、少し説明が少ないので、補足(蛇足?)のつもりで、書きます。

XPagesなので、ビューは普通に作成します。
ポイントは、次の3つ。
  1. ビューの選択式は、文書と返答文書が 両方とも表示されるようにすること
  2. 1つの列に文書と返答文書のフィールドが表示されるようにすること
  3. ビュープロパティの「返答文書を階層表示にする」にチェックを付けること(下図参照)
ビューのプロパティ

次に、このビューを表示するためのXPageを作成します。
普通にビューコントロールをドラッグ&ドロップした場合、階層表示されません(下図参照)。
せっかく、ビュープロパティを設定したのに意味がありません。
ビューコントロールを追加しただけの状態

そこで、先ほどご紹介したサイトに書いてある設定を施します。

まず、階層表示させたい列を選択します。
その状態でプロパティビューの「表示」タブを開きます。
「応答のインデント」というチェックがあるので、そこにチェックを付けます。
※この部分ですが、Lotus Domino Designerのバージョンにより、若干設定が異なっています。それっぽい箇所にチェックを付けてください。
応答のインデント

これで、XPage を保存します。
Webブラウザで表示すると、下図のようになり、階層表示されているのが分かります。
階層表示のビュー


ここまで出来れば、ディスカッションDBを作成するのも簡単ですね。
是非、作成してみましょう!




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