XPages アプリケーションで作成する図書管理

アプリケーションの説明と全体の流れ

テクてくロータス技術者夜会で、XPages に関するブログを書くことになり、その題材として、筆者がノーツアプリケーションとして保有していた「図書管理」を XPages で作成するにはどうするのか?ということで記述しました。実際にアプリケーションを作成しながらの連載なので、アプリケーションをどのように作成していけば効率的になるのか?という参考にして頂ければ幸いです。

御代 政彦, マネージャー, 株式会社エフ

御代 政彦
とにかく Lotus Notes/Domino が大好きで 3.0J からずっと Lotus Notes/Domino 一筋。8.0 になってからは、Eclipse による Java プログラミング、Composite アプリケーション開発、8.5 になってからは、ノーツアプリケーションの XPages 化。さらには、Android ネイティブの Lotus Domino アプリケーションの開発も手がけていたりします。Lotus Notes/Domino 好きが高じて、2012年度の IBM Champion に選ばれました。



2012年 3月 08日

概要

はじめに

Lotus Notes/Domino 8.5 から、XPages という新しいレイアウトを使用して、ノーツアプリケーションが作成できるようになりました。メンテナンスリリースを重ねる毎に、Dojo や oneui 等が Lotus Domino Designer に実装されてきましたが、初期のバージョンでは利用する事が出来ないものもあります。ということで、今回は、Lotus Domino Designer に元々搭載されていた機能を使用して、XPages のサンプルアプリケーションを作成していきます。

アプリケーションの説明

アプリケーションは「図書管理」です。筆者が以前、個人的にノーツクライアントで利用するために、「図書管理」というものを作成しました。これを XPages で作り直したらどうなるかという事を前提に進めていきます。ただし、既存のアプリケーションを改造するとなると、既存のアプリケーションについて説明する必要があるという事、内容が煩雑になるということで、新規に作成するという事にします。

アプリケーションの説明は以下の通りです。

アプリケーション名図書管理 for XPages
機能蔵書の登録
蔵書の一覧
蔵書の借用
蔵書の返却
督促機能
貸し出し状況の一覧

全体の流れ

全体で 12回にも及ぶものとなっていますので、その回ごとの nsf ファイルを用意します。分からなくなってしまったときの参考としてください。

第1回

アプリケーションとフォーム、各種コントロールの作成

第2回

共通画面 (container コントロール) の作成 1

第3回

共通画面 (container コントロール) の作成 2

第4回

蔵書一覧ページ、貸し出し一覧ページの作成 (XPages でビューを表現)

第5回

蔵書登録編集ページの作成 (XPages でフォームを表現)

第6回

蔵書貸出ページの作成と、貸し出し一覧ページとの連携

第7回

機能の追加 1 (蔵書登録ページと蔵書貸出ページの連携)

第8回

機能の追加 2 (入力チェックの追加と、蔵書の返却)

第9回

機能の追加 3 (蔵書貸出の多重起動の防止、貸し出し者の判別、督促機能)

第10回

機能の追加 4 (蔵書貸出機能の強化)

第11回

機能の追加 5 (デザインの改善)

第12回

XPages アプリケーションの起動方法について

なお、本記事で扱うノーツアプリケーションは、ローカルで作成してあり、またプレビューもノーツクライアント (Standard版) での動作としています。


第1回:アプリケーションとフォーム、各種コントロールの作成

アプリケーションの作成

まずは、アプリケーションを作成します。

サーバーLocal
データベース名図書管理 for XPages
ファイル名bkmgrxpg.nsf

本 DB のアクセス権は、以下のようにしておきます。

ユーザー/グループ名アクセス権備考
-Default-作成者「文書の作成」にチェック
管理者ユーザー (グループ)管理者 
LocalDomainServers管理者 
OtherDomainServersなし 

※ローカルでの作成としますが、デフォルトで LocalDomainServers と OtherDomeinServers は設定されるので、そのままとしています。

ノーツデータベースが作成できたら、これを Lotus Domino Designer で開きます。

フォームの作成

次にフォームを作成します。フォームは「蔵書」と「貸し出し」の 2つを作成します。

1. 「蔵書フォーム」

フォーム名 / 別名 「蔵書 / BookResources」
フィールド

フィールド名フィールドの種類備考
PublishedByテキスト編集可能出版社
Writerテキスト編集可能著者名
BookNameテキスト編集可能蔵書名
PurchaseTime日付/時刻編集可能購入日

として、保存してください。

2. 「貸し出しフォーム」

フォーム名 / 別名 「貸し出し / Lending」
フィールド

フィールド名フィールドの種類備考
LendByテキスト編集可能ユーザー名
BookNameテキスト編集可能蔵書名
LendingDay日付/時刻編集可能貸出日
LendingTerm日付/時刻編集可能貸出期限
Statusテキスト計算結果状況
ReturnDay日付/時刻計算結果返却日

として、保存してください。

※計算結果フィールドの「値」は自身のフィールド名を設定してください。

XPages では、フォーム自身の装飾は使わないので、ひたすらフィールドの定義をするだけです。

画面の遷移について

XPages の設計要素を作成します。図書管理の画面遷移は以下のようなものとしています。オレンジ色が一覧画面 (従来のノーツアプリケーションのビューに該当するもの) で、青色が文書画面 (従来のノーツアプリケーションのフォームに該当するもの) です。

これらのうち、「蔵書参照画面」と「蔵書登録 / 編集画面」は同一のものとしますので、実質、4つの画面が必要になります。ということで、まずは、この 4つの画面を作成します。

説明設計要素 (XPage) 名
1メイン画面 (蔵書一覧)home
2貸し出し一覧Issueguides
3蔵書参照 / 登録 / 編集画面BookResources
4貸し出し/返却画面Lending

XPage の作成

Lotus Domino Designer 画面の左側のツリーから [XPage] の箇所をダブルクリックします。[新規 XPage] のボタンをクリックします。「新規 XPage」の作成ダイアログが表示されるので、必要事項を入力します。

名前home
コメント空白のまま
データソースをページに追加チェックボックスは外したまま

[OK] をクリックします。少しすると、真っ白な XPages の画面が表示されます。

同様に、残り 3つの XPage を作成します。

カスタムコントロールの作成

今度は、これらの XPages で共通する部分を作成します。それには「カスタムコントロール」というものを利用します。 Lotus Domino Designer 画面の左側のツリーから [カスタムコントロール] の箇所をダブルクリックします。
[新規カスタムコントロール] のボタンをクリックします。「新規カスタムコントロール」の作成ダイアログが表示されるので、必要事項を入力します。

名前Container
コメント空白のまま
アプリケーション「図書管理 for XPages : bkmgrxpg.nsf」とします

[OK] をクリックします。すると、真っ白なカスタムコントロールの画面が表示されます。

ここで、さきほど作成した 4つの XPage に共通するものとして、アプリケーションのタイトルを常に表示されるようにしてみましょう。

[コントロールビュー] から「ラベル」を選択して (*1)、 container コントロール画面にドラッグ&ドロップします。
ラベルの値は、「図書管理 for XPages」に変更します。

一度、container コントロールを保存したら、「home」 XPage の編集画面に切り替えます。

コントロールビューの下の方にある「カスタムコントロール」の中に、今し方作成した、container コントロールが表示されています。
それをドラッグ&ドロップします。

これで、container コントロールが「home」 XPage 設計要素に追加されました。home は保存しておきます。

次回は、container コントロールの内容を編集して、共通レイアウトの部分を作成します。


第2回:共通画面 (container コントロール) の作成 1

container コントロールの編集

今回は、container コントロールを編集して、共通レイアウトの部分を作成します。Lotus Domino Designer で「図書管理 for XPages」を開いたら、左側のツリーから「カスタムコントロール」を選択してダブルクリックします。作成した container コントロールが表示されるので、それをダブルクリックして開きます。

まずは、パネルを組み込みます。これは HTML タグでいうと、<div> タグに相当します。[コントロール] ビューから、「パネル」 (*1) を選択して、container コントロール画面にドラッグ&ドロップします。(*1 コンテナコントロールというカテゴリの中にあります。) このパネルの名前は「frame」とします。

さらに、パネルを追加します。このとき、ドラッグ&ドロップする際、今追加した frame パネルの中にドロップするようにしてください。このパネルの名前は「header」とします。

さらに、パネルを 4つ追加します。それぞれ名前を「main」「tab」「content」「footer」とします。追加するとき、間違った場所になっても慌てないでください。そんなときは、[アウトライン] ビューに表示されているコントロールをマウスで選択して、好きな場所にドラッグ&ドロップします。これで順番を入れ替える事が出来ます。

ここでは、下図のような順番に並べ替えます。

また、前回作成したラベルを「header」コントロールの中に移動しておきます。

今度は、container コントロールのスタイルを設定していきます。最初に header パネルの設定を行うので、パネルのプロパティを見ます。

大きさは、「高さ」を 47ピクセルにします (この数値は筆者の PC での値です。自分の PC 環境にあった数値に変更してください)。背景は、単色はつまらないのでグラデーションにしてみましょう・・・ってできません!ノーツの表ならグラデーションが描けるのに・・・仕方がないので、グラフィックで代用します。

グラフィックの作成には、何でも良いのですが、折角なので、Lotus Symphony の Presentation を使って見ましょう。ご存じの通り、Lotus Notes クライアント (Standard 版) を導入する場合、オプションとして Lotus Symphony のインストールを選択できますので。[作成] [図形描画オブジェクト] メニューを実行すると、図形描画オブジェクトのツールバーが表示されるので、そこから四角形を選択して、適当な大きさにドラッグ&ドロップします。

この図形を選択したまま、右側のメニューから [その他の形状プロパティ] を選択すると、プロパティ画面が表示されます。

[領域] タブで色を選択して、[透明度] タブでグラデーションを選択します。[線] タブで非表示にすれば、グラデーションの図形ができあがりました。後は、ペイント等を使って大きさを調整します。gif もしくは jpeg で保存しておいてください。ちなみに、筆者はこんなグラフィックを作成しました。

わかりやすいように、幅はちょっと太めにしてあります。

さて、グラフィックが作成できたら Lotus Domino Designer に戻ります。Header パネルのプロパティビューの背景タブを選択して、[イメージの URL] の横にあるフォルダのアイコンをクリックします。

画像の選択画面が表示されるので、[追加] ボタンをクリックして、さきほど作成したグラフィックを追加します。右側に画像が表示されたら、[OK] をクリックします。

次は、ラベルの設定を行いますので、label1 を選択してプロパティビューを開きます。

同様に tab パネルにもグラフィックを設定します。ここでは筆者はこんなグラフィックを作成しました。

ここまでで container コントロールはこんな画面になりました。

次回はこの続きで、container コントロールの編集を完了します。


第3回:共通画面 (container コントロール) の作成 2

footer パネルの編集

前回は、container コントロールの header パネルと main パネルに背景色をつけました。残る footer パネルにも設定をしましょう。右側のコントロールビューから「ラベル」を選択して、footer パネルの中にドラッグ&ドロップします。ラベルの内容は「作成:2012年2月14日 Version:1.0」とします。ここは自由につけていただいて結構です。

作成したラベルはフレーム内の一番右側に配置するようにしてみましょう。画面左側のアウトラインビューで footer パネルを選択します。[フォント] タブを開いて、「文字揃え」の中の [右揃え] ボタンをクリックします。

これで、作成したラベルがパネル内で右側に寄せられました。

frame パネルの編集

今度は frame パネルの設定をもう少し変更するので、frame パネルを選択し、[余白] タブをクリックします。余白を設定しておかないと、XPages の画面を開いたときに幅がいっぱいに表示されてしまうので、あまり格好良くありません。ということで、frame パネルの余白を設定します。

ここでは設定方法を学ぶという事で、上下左右 すべて同じ設定にしてみます。単位は、「ピクセル」を選択します。すると、左側のボックスに数値が入力できるようになりますので、「10.0」と入力します。

タブ付きパネルの編集

次に tab パネルの中に「タブ付きパネル」を設定します。これは、画面をタブで切り替える事が出来るようになるコントロールです。コントロールビューの「コンテナコントロール」から [タブ付きパネル] を選択して、tab パネルの中にドラッグ&ドロップします。

タブが 2つの状態で追加されました。ただし、タブの名前が初期値の、"新規タブ"、"新規タブ 2" になっているので、それぞれ変更します。アウトラインビューで、タブ付きパネルを見ると、左側に △ ボタンがあるので、そこをクリックすると、「タブパネル」というコントロールが 2つ表示されます。そのうち、上の「タブパネル」をクリックします。

プロパティビューに「タブパネル」の情報が表示されました。ここで名前トラベルをそれぞれ次のように設定します。

上のタブ 名前:homeTab、ラベル:蔵書一覧
下のタブ 名前:IssueguidesTab、ラベル:貸出一覧

次に、それぞれのタブをクリックしたときの動作を設定しておきます。「蔵書一覧」のタブを選択したら、「イベントビュー」を開きます。[アクションの追加] というボタンがあるのでクリックします。「アクション」は "ページを開く"、「開くページの名前」は "home" にして [OK] をクリックします。

同様に、「貸し出し一覧」のタブにもアクションを追加します。「アクション」は "ページを開く"、「開くページの名前」は "Issueguides" にして [OK] をクリックします。これで、タブをクリックすると、設定したページが開くようになります。ですが・・・ Issueguides のページには、何も設定してありませんので、Issueguides ページを開いて、container コントロールを追加しておいてください。

ここで、作成した XPages を実際に開いてみると分かるのですが、タブをクリックすると画面は切り替わるのですが、タブはいつまでも「蔵書一覧」のままになっています。これでは、タブの意味があまりないので、現在選択されているタブがなんなのかを分かるようにしましょう。

まずは、container コントロールのプロパティビューを開きます。その中の [プロパティ定義] というタブを開きます。そうしたら、[新規プロパティ] ボタンをクリックして、新規にプロパティを作成します。名前は任意ですが、「tabID」としておきます。種類は「string」としておきます。

これは container コントロール全体で管理できる変数です。ここに、タブが切り替えられた際に、どのタブが選択されたのかを格納します。

次に、この値によるタブの切り替え方法を設定します。「タブ付きパネル」を選択して、プロパティビューを開きます。[タブ付きパネル] タブにある「オプション」の「デフォルトで開くタブ」にある ◇ をクリックして、[値の計算...] をクリックします。画面の左側にグローバルオブジェクトの一覧が表示されるので、その中から「compositeData」を探します。見つかったら、△ ボタンをクリックして展開します。

すると、そこにさきほど作成したプロパティの「tabID」が出来ているので、それをダブルクリックします。右側の画面に表示されたら、[OK] をクリックします。

すると、デフォルトで開くタブのところが、青文字で "{計算済み}" に変わった事が分かると思います。これで、プロパティの値によって、開くタブが変わります。しかし、まだプロパティに値が格納されていませんので、何も変わりません。では、どのようにプロパティを格納すればよいのかを見ていきます。

container コントロールはここで保存しておきます。

あらかじめ作成してあった「home」XPage を開きます。その中に表示されている container コントロールを選択します。そこで [すべてのプロパティ] タブを開きます。その中に [カスタム] [tabID] があるので、「値」欄に「蔵書一覧」のタブパネルの名前である "homeTab" を入力します。これで、「home」XPage が開かれた場合は、「蔵書一覧」タブが選択された状態になります。

同様に、「Issueguides」XPage を開いて、[カスタム] [tabID] の値に "IssueguidesTab" を入力します。これで、タブ付きパネルの設定は完了です。

今度は、それぞれのタブを開いたときの画面を編集したいのですが、今、編集しているのは、共通画面である container コントロールです。このまま編集してしまうと、共通ではなくなってしまいます。これを回避するために、「編集可能領域」というコントロールを利用します。

コントロールビューのコアコントロールの中から、「編集可能領域」を選択して、content パネルにドラッグ&ドロップします。任意ですが、後々わかりやすくするために、プロパティビューで、これの名前を変更します。名前とファセット名の両方を「contentData」としておきます。

次回からは、編集可能領域に設定するコントロールの内容を編集していきます。


第4回:蔵書一覧ページ、貸し出し一覧ページの作成 (XPages でビューを表現)

蔵書一覧ビューの作成

今回は、各 XPage に表示するコントロールの中身を作ります。まずは、登録した蔵書の一覧を表示するビューに該当するコントロールを作成します。ビューを XPage で表現するには、いくつかの方法がありますが、もっとも簡単なのは、Lotus Domino Designer でビューを作って、それを流用するというものです。まずは、蔵書一覧のビューを作ります (新規に作成せずに、(無題) のビューを修正してください)。

ビュー名 / 別名 「蔵書一覧 / BooksCollectionView」
ビューの選択式 SELECT Form ="BookResources"

列の値タイトル備考
1列目BookName蔵書名ソート (昇順)
2列目PublishedBy出版社
3列目Writer著者名
4列目PurchaseTime購入日日付のみの表示

ビューの列幅やフォントはご自分の環境に合わせてください。

カスタムコントロールへの蔵書一覧ビューの取り込み

では、今作成したビューを XPages に取り込みます。カスタムコントロールを作成します。名称はビューと同じで BooksCollectionView とします。作成したら Designer のコントロールビューから「ビュー」を選択して、ドラッグ&ドロップします。すると、「ビューのデータソースの選択」というダイアログボックス (下図参照) が表示されるので、次のように設定します。

アプリケーションは「現在」(デフォルト値) を選択します。ビューは、さきほど作成した「蔵書一覧」を選択します。すると、下に「表示する Lotus Domino ビュー列を選択」という箇所にビューの列が表示されるので、すべてチェックをつけたまま (デフォルト値) にしておきます。

設定したら、[OK] をクリックします。

ご覧の通り、ビューのようなものが表示されました。ビューの上部には、ページャが付いています。つまり、文書数が多くなったときに、次のページを表示するためのアクションが自動で作成されているわけです。なお、1つのページに表示する文書数は変更する事が出来ます。ビューパネルのプロパティ「表示」の中に「ページごとの最大行数」で変更できます (デフォルト値は 30)

ただ、これではビューの幅が画面に比べて狭すぎますので、調整します。アウトラインビューで、ビュー (名称は viewPanel1 になっているはず) を選択して、プロパティビューを開きます。そうしたら、「単位」を「パーセント」にして、幅を「100」にします。これで、ビューの幅が画面いっぱいに広がりました。

今度は、文書が選択されたときに、フォームが表示されるように設定します。BookName 列のプロパティビューを開きます。「表示」タブにある「列の値をリンクとして表示する」にチェックを入れます。するとその下にある「文書のオープンモード」が選択できるようになるので、「読み込み専用」にチェックをつけます。

次に PurchaseTime 列のプロパティビューを開きます。「データ」タブの表示タイプが「文字列」になっていますが、日付データなので「日付/時刻」を選択します。

ここまで出来たら、「BooksCollectionView」を一度保存します。

この「BooksCollectionView」を XPage に取り込むので、「home」XPage を開きます。すると、前回作成した編集可能領域が設定されていますが、緑色の ○ が表示されているのが分かります。これは、まだ編集可能領域に何もコントロールが設定されていない状態を表しています。

コントロールビューの「カスタムコントロール」の欄を見ると、今し方作成した「BooksCollectionView」が追加されているので、選択して、この緑色の ○ の箇所にドラッグ&ドロップします。

すると、BooksCollectionView コントロールの内容が XPage に追加されました。では、home を保存して、ここまでの状態を実際に見てみましょう。XPage をノーツクライアントでプリビューするボタンをクリックします。

まだ文書が登録されていないので、寂しいですがなんとなくアプリケーションっぽくなってきたのではないでしょうか?

貸出一覧ビューの作成

では続いて、「貸出一覧」のビューを作ります。こちらは、カテゴリ別のビューにしてみます。

ビュー名 / 別名 「貸し出し一覧 / LendByStatus」
ビューの選択式 SELECT Form ="Lending"

列の値タイトル備考
1列目Statusソート (昇順、カテゴリ別)
2列目BookName蔵書名ソート (昇順)
3列目LendBy利用者
4列目LendingTerm返却期限

ビューの列幅やフォントはご自分の環境に合わせてください。このビューを XPage に取り込みます。

「LendingView」という名前でカスタムコントロールを作成します。前回と同じように、コントロールビューから「ビュー」を選択して、ドラッグ&ドロップします。すると、「ビューのデータソースの選択」というダイアログボックス (下図参照) が表示されるので、次のように設定します。

その他の設定についても、前回同様に設定しましょう。

  • ビューの幅を 100% にします。
  • 蔵書名の列をリンクにして、読み込み専用で文書を開くようにします。
  • 返却期限の列は、日付/時刻型の表示にします。

前回と違う点は次の通り。

「Status」の列を選択して、幅を決めます。ここはカテゴリ列なので、少なくて良いですから、50ピクセルにしましょう。さらにフォントも目立たせる意味で、太文字にします。列ヘッダーではなく、列を選択して行ってください。フォントタブを選択して、「B」と書いてある箇所をクリックすると、太文字になります。ついでに色も変えてみましょう。筆者は紺色が好きなので、紺色にしています (下図参照)。

カスタムコントロールへの貸出一覧ビューの取り込み

これで、「LendingView」コントロールを保存します。今度は、これを XPage に設定します。

XPage の「Issueguides」を開きます。そこに、今、作成した「LendingView」コントロールをドラッグ&ドロップします。一見すると、単純にビューが設定されただけのように見えますが、きちんとカテゴリ別のビューになっています。これで、「Issueguides」を保存します。この状態で、XPage をプリビューすると、「蔵書一覧」と「貸し出し一覧」のタブをクリックしたときの動きがトレースできるようになっています。

次回は、いよいよフォームを XPage で作っていきます。


第5回:蔵書登録編集ページの作成 (XPages でフォームを表現)

BookResource カスタムコントロールの作成

フォームの核となる部分を作成するので、「BookResource」という名前でカスタムコントロールを作成します。ここで気をつける必要があるのは、カスタムコントロールの名前と XPage の名前は同じにしてはいけないという事です。ですので、XPage に使った「BookResources」ではなく、「BookResource」とします (最後の "s" をなくします)。

この作成したコントロールに、フォームの情報を埋め込みます。ビュー情報を埋め込む場合は、コントロールビューから、「ビュー」をドラッグ&ドロップしました。フォームというコントロールはないので、次の手順で操作します。

  1. [ウィンドウ] [Eclipse ビューの表示] [データ] メニューから「データ」ビューを開きます。
  2. データソースの横にあるボックスをクリックして、「データソースの定義」を選択します。
  3. 「データソースの定義」ダイアログボックスが表示されるので、「データソース」から「Domino 文書」を選択して [OK] をクリックします。
  4. データソースの詳細を定義する画面に移行するので、必要な情報を入力して、[OK] をクリックします。

    アプリケーションは自分自身がデフォルトで設定されているので、ここでは、フォーム名に「蔵書 - BookResources」 を選択します。データリソース名は、デフォルトの「document1」のままで構いません。

  5. 「データ」ビューにフォームのフィールド情報が追加されました。

    ただし、このままでは使えないので、左上にあるアイコンをクリックして、「×」マークを外してください。

  6. 表示されている 4つのフィールドを選択します (Ctrl キーを押しながら、クリックすると複数選択できます)。
  7. 選択したら、「BookResource」カスタムコントロール上にドラッグ&ドロップします。
  8. 「データバインドコントロールの選択」ダイアログが表示されるので、ラベルを次のように変更します。
    ラベル変更後のラベルコントロール
    Published by:出版社:編集ボックス
    Writer:著者名:編集ボックス
    Book name:蔵書名:編集ボックス
    Purchase time:購入日:日時ピッカー

    変更が出来たら、[OK] をクリックします。

  9. カスタムコントロール上にフォーム情報が追加されたのを確認できたら、その表をマウスで右クリックします。
  10. コンテキストメニューが表示されるので、「行の追加」を選択します。
  11. 「行の追加」ダイアログが表示されるので、「2」と入力して [OK] をクリックします。
  12. 表に行が追加されるので、ボタンを 3つ追加します。

    ボタンは、「コントロール」ビューの「コアコントロール」からドラッグ&ドロップします。ボタンのラベルは、それぞれ「保存」「編集」「キャンセル」とします。

  13. 各ボタンのイベントを設定します。

    まずは、「保存」ボタンを選択した状態で、「イベント」ビューを開きます。[アクションの追加...] ボタンをクリックします。

  14. 「シンプルアクションの追加」ダイアログが表示されるので、アクションで「文書の保存」を選択して、[OK] をクリックします。
  15. 再度、[アクションの追加...] ボタンをクリックして、今度は「ページを開く」アクションを選択して、[OK] をクリックします。
  16. 次に、「編集」ボタンをクリックして、アクションを追加します。

    アクションは「文書モードの変更」、文書モードは「編集モード」にします。

  17. 今度は、「キャンセル」ボタンをクリックして、アクションを追加します。

    キャンセルなので、「home」ページに戻るようにします。アクションは、「ページを開く」で、開くページの名前を「home」にします。

    このままでも良いのですが、これではボタンが常に表示されたままになってしまいます。表示 / 非表示の設定を行いましょう。
    「保存」ボタンは、編集モードの時だけ表示します。「編集」ボタンは、読み込みモードの時だけ表示します。「キャンセル」ボタンは、常に表示します。

  18. 「保存」ボタンを選択して、「プロパティ」ビューを開きます。

    「可視」という項目 (バージョンによっては、「表示」になっていることもあります) があるので、右にある ◇ をクリックすると、選択肢が表示されるので「値の計算...」を選択します。

  19. スクリプトエディタが起動するので、表示条件を記述します。

    文書が編集モードの時だけ表示したいので、document1 クラスの isEditable() を選択して、ダブルクリックします。

    ※この際、左側のペインは「参照」タブをクリックしておきます。
    ※document1 は、4.でデータソースを定義した際の名前です。

    右側のペインに、「document1.isEditable()」と表示されたら、[OK] をクリックします。すると、「可視」のボタンの右側に「{計算済み}」と表示されるようになります。

  20. 同じく、「編集」ボタンを選択して、「可視」の右の ◇ をクリックして、「値の計算...」を選択します。

    スクリプトエディタで、「! document1.isEditable()」と記述します。「!」は否定を表しますので、編集でない時 (つまりは読み込みモード時) に表示されます。記述できたら [OK] をクリックします。

    ここまで出来たら、「BookResource」カスタムコントロールを保存します。

XPage への組込

次に、このコントロールを XPage に組み込みます。「BookResources」Xpage を開きます。何も記述されていない状態のはずなので、「コントロールビュー」の「カスタムコントロール」から「container」を選択してドラッグ&ドロップします。

「container」カスタムコントロールが画面上に表示されたら、編集可能領域である「contentData」の箇所に緑色の ● が表示されているのが分かりますね。今度は、そこに向けて、同じく「コントロールビュー」の「カスタムコントロール」から「BookResource」を選択して、ドラッグ&ドロップします。

ここで、「BookResources」XPage を保存して閉じます。

「container」カスタムコントロールには、「蔵書一覧」と「貸し出し一覧」のタブがあるので、そこをクリックする事で、それぞれのビューへと移動する事が出来ます。しかし、画面遷移で示してあるような、「蔵書一覧」からこの「蔵書登録 / 編集画面」へのリンクがありません。ということで、「蔵書一覧」の画面から蔵書登録が出来るようにします。「BooksCollectionView」カスタムコントロールを開きます。蔵書一覧ビューが表示されているので、先頭で Enter キーを押して改行します。

※先頭に改行が挿入できないという方へ 画面を開いた直後に、Enter キーを押すとうまくいきます

改行で空いた箇所に、「ボタン」コントロールを選択してドラッグ&ドロップします。

ボタンのラベルを「蔵書登録」に変更します。次に「イベント」ビューを開きます。シンプルアクションで「アクションの追加...」をクリックします。「シンプルアクションの追加」ダイアログが表示されるので、内容を入力します (下図参照)。

これだけで良いのですが、せっかくなのでボタンのデザインを変更してみましょう。まずは、ボタンのフォントを変更します。

次にボタンの背景を変更します。

他にも、ボタンの幅や高さを変更したり、背景に色ではなく画像を選択したりする事も出来ます。このように CSS を使わなくても、ある程度は Lotus DominoDesigner だけでもデザインを変更する事が出来ます。もちろん、CSS でスタイルを設定する方が変更の自由度も高いので機会があればチャレンジしてください。

ここまで出来たら、「BooksCollectionView」カスタムコントロールを保存します。


第6回:蔵書貸出ページの作成と、貸し出し一覧ページとの連携

LendData カスタムコントロールの作成

今度は、「貸し出し画面」の作成を行いますが、方法は、「蔵書」フォームを XPage に取り込むのと同じです。ということで、まずは「貸し出し画面」をカスタムコントロールとして作成します。「LendData」という名前でカスタムコントロールを作成しましょう。

次にデータソースの定義を行いますが、前回と同じでは芸がありませんので、違うやり方を紹介します。

プロパティビューを開きます。その中に「データ」タブがありますので、そこを開きます。データタブのプロパティ画面が表示されたら、[追加] ボタンをクリックして、「Domino 文書」を選択します。(下図参照)

すると、データソースの右側に「データソース」を定義する画面が表示されるので、「貸し出し」フォームを登録します (下図参照)。この赤丸で囲った画面。前回はダイアログとして表示されていたものですが、このようにプロパティビューで操作すれば、同一画面内で操作ができるのです。なお、データソース名は、区別するために“LendingDocument”としておきます。

さて、これでこのカスタムコントロールで使用するデータソースの定義が出来ましたので、カスタムコントロール内の画面に反映させます。「データ」ビューを開いて、表示されているフィールドすべてを選択して、カスタムコントロール内にドラッグ&ドロップします。

「データバインドコントロールの選択」ダイアログが表示されるので、ラベルとコントロールをそれぞれ以下のように変更します。

ラベル変更後のラベルコントロール変更後のコントロール
Lend By:貸出者:編集ボックス編集ボックス
Book Name:蔵書名:編集ボックス編集ボックス
Lending day:貸出日:日時ピッカー日時ピッカー
Lending term:貸出期限:日時ピッカー日時ピッカー
Status:状況:編集ボックス計算結果フィールド
Return day:返却日:日時ピッカー計算結果フィールド

また、「コントロールオプションの追加」にある“生成されたコードに送信ボタンを追加する”にチェックを入れておきます。

すると、下図のような画面になるはずです。

ここで前回説明しなかった事があります。前のダイアログで「生成されたコードに送信ボタンを追加する」にチェックが入っていると、[Submit] というボタンが追加されます。Lotus Notes/Domino で Web アプリを作った事がある方は分かるかと思いますが、これはいわゆる保存ボタンの代わりになります。ラベルを [保存] に変更して、「可視」の設定を変更すれば、同じ役割になります。

「可視」の設定は、

LendingDocument.isEditable()

とします。

※データソース名を LendingDocument に変更してあるので、注意しましょう。

その他、[キャンセル] ボタンを追加しておきます。こちらのボタンの種類も [保存] に併せて変更しておきます。「プロパティ」ビューの「ボタン」タブの中の右側の方に「オプション」というところにボタンの種類があるので、「キャンセル」に変更します。ただし、イベントは追加しておいてください。その際、開くページは「前のページ」としておいてください。

また、「貸出者」と「蔵書名」の編集ボックスのサイズを 300ピクセルに変更しておきます。これは、幅が狭いと、入力時に全体が見えなくなってしまうのを防ぐためです。前回作成した「BookResource」カスタムコントロールの各編集ボックスも同様に変更しておいてください。

次に、「貸出日」と「返却期限」にデフォルトの値をセットするので、「貸出日」を選択して、「プロパティ」ビューの「データ」タブを開きます。「デフォルト値」の右にある ◇ をクリックして、「値の計算」を選択します。

「スクリプトエディタ」ダイアログが表示されるので、値を書き込みます。「貸出日」は、今日を設定するので、@Today 関数をセットします。XPages で使える関数は、通常のノーツとは違う部分があるので、どれが使えるか分からない場合は、左側の部分で「参照」タブを開き、「@Functions」を選択します。

設定が出来たら、「返却期限」のデフォルト値を設定します。今回は、返却期限は一般的に用いられる「二週間後」に設定します。スクリプトエディタを開いたら、

@Adjust(@Today(),0,0,14,0,0,0)

と入力します。

今日から、14日後を設定するという意味の関数です。状況と返却日は、ここでは設定しませんので、デフォルトのままとしておきます。ここまで出来たら、カスタムコントロールを保存します。

Lending XPages への組込

そして、「Lending」XPage を開きます。この画面はまだ何もさわっていないので、空白になっているはずです。最初に、「container」コントロールをドラッグ&ドロップします。次に、今作成した「LendData」コントロールを「container」コントロールの編集領域にドラッグ&ドロップします。

これで「Lending」を保存します。

貸出ボタンの登録

ついでに、貸出ボタンを登録しておきましょう。カスタムコントロールの「LendingView」を開いて、先頭部分にボタンを配置します。ボタンのラベルは「蔵書貸出」として、イベントは「Lending」ページを新規文書として開くとしてください。また、ボタンの形や色は、「BooksCollectionView」カスタムコントロールの [蔵書登録] ボタンと同じようにしておきます。

出来たら、「LendingView」カスタムコントロールを保存します。

次回からは、アプリケーションとしての機能を実装していきます。


第7回:機能の追加 1 (蔵書登録ページと蔵書貸出ページの連携)

[蔵書貸出] ボタンの配置

蔵書登録画面と蔵書貸出画面ができたので、直接、蔵書登録画面から蔵書貸出が出来るようにします。Lotus Domino Designer で「カスタムコントロール」の「BookResource」を開きます。[編集] と [キャンセル] ボタンの間にスペースを空けて、ボタンコントロールを配置します。ラベルは、「蔵書貸出」とします。

次に「可視」と書かれた箇所の右側にある ◇ をクリックして、「値の計算...」を選択します。スクリプトエディタが表示されるので、画面の右側に、

! ( document1.isNewNote() | document1.isEditable() )

と入力してください。

これは、新規文書 (document1.isNewNote()) ではない、もしくは、文書が編集モード (document1.isEditable()) ではない。という時に表示するという設定です。間にある「|」は or 条件を表します。

今度は、ボタンがクリックされた時のイベントを設定します。イベントビューを開いて、[アクションの追加] ボタンをクリックします。アクションは 2つ追加します。

1つ目のアクションは、「アクション」は "スクリプトの実行"「言語」は "JavaScript(サーバサイド)" として、エディタ部分に

sessionScope.lendingBookName = document1.getItemValueString("BookName");
sessionScope.lendingBookResource = document1.getNoteID();

と入力して、[OK] をクリックします (下図参照)。上の行は、蔵書名を格納します。これは、蔵書貸出画面に表示するのに利用します。下の行は、蔵書文書の文書 ID を格納します。これは、蔵書貸出が完了したときに、この蔵書文書のステータスを変更するのに利用します。

2つ目のアクションは、「アクション」は、"ページを開く" 「開くページの名前」は、"Lending" 「ターゲット文書」は、"新規文書" とします (下図参照)。

これで、BookResource カスタムコントロールを保存します。

Lending ページにおける蔵書名の自動表示

次に「LendData」カスタムコントロールを開きます。「イベント」ビューを開きます。「データ」「LendingDocument」「PostNewDocument」イベントを開きます。「シンプルアクション」が選択されているはずなので、「スクリプトエディタ」に変更します。すると、エディタ画面が表示されるので、

var lbName = sessionScope.lendingBookName;
if ( null != lbName && lbName != "" ) {
    LendingDocument.setValue( "BookName", lbName )
}
var uname = session.createName( session.getUserName() );
LendingDocument.setValue( "LendBy", uname.getAbbreviated() )

と入力します (下図参照)。これは、セッションスコープ変数の値を BookName (蔵書名) に格納するという意味のものです。また、下の 2行で誰が借りたのかを自動でセットしています。

これで、「蔵書登録/編集」画面で選択した蔵書名が「蔵書貸出」画面に反映されます。

蔵書貸出文書のステータスを変更できるようにする

今度は、「蔵書貸出」の [保存] ボタンを修正して、ステータスが変更されるようにします。ボタンを選択して、「イベント」ビューを開きます。このボタンにアクションを 2つ追加します。1つ目は、「スクリプトの実行」で、コードは以下のようにしてください。

LendingDocument.setValue( "Status", "貸出中" );

var agent = database.getAgent( "ChangeStatus" );
agent.runWithDocumentContext( database.getDocumentByID(
sessionScope.lendingBookResourceID ));
agent.recycle()

これは、「蔵書貸出」と「蔵書登録/編集」の 2文書のステータスを変更するものです。「蔵書登録/編集」文書は、バックエンドで保存する必要があるので、エージェントを実行して保存するようにしています。

もう一つは、「Issueguides」ページを開くというアクションです。

この状態で、「LendData」カスタムコントロールを保存します。

蔵書登録/編集文書のステータスを変更できるようにする

先ほど「蔵書貸出」の [保存] ボタンにエージェントを実行するようにしたので、そのエージェントを作成します。「ChangeStatus」という名前で、LotusScript のエージェントを作成します。

コードは以下のように記述してください。

Sub Initialize
    Dim session As New NotesSession
    Dim doc As NotesDocument

    Set doc = session.Documentcontext

    Call doc.Replaceitemvalue( "Status", "貸出中" )
    Call doc.Save( True, True, True )
End Sub

また、「プロパティビュー」を開いて、エージェントの設定を変更します。実行時の「対象」を "なし" に変更します (下図参照)。

さらに、「セキュリティ」タブを開いて、「Web ユーザーとして実行」にチェックを入れてください。ここにチェックが入っていないと、Web ブラウザで本アプリケーションを実行しようとした時に、正常に動作しません。

これで、蔵書の貸出を行って保存した際に、「蔵書登録/編集」文書のステータスも変更されます。

蔵書登録ページにステータスが表示されるようにする

「ChangeStatus」エージェントで、「蔵書登録/編集」文書のステータスを変更するようにしましたが、Status というフィールドは、「蔵書」フォームには作成していません。ノーツデータベースの場合、フォームにフィールドを作らなくても、文書にアイテムとして作成する事は可能なので、問題はないのですが、このままでは、BookResource ページに表示する事が出来ません。そこで、「蔵書登録/編集」画面が定義してある「BookResource」カスタムコントロールに追加します。

Lotus Domino Designer で「BookResource」カスタムコントロールを開きます。「蔵書登録/編集」画面の表があるので、その中に「Status」フィールドの内容を表示させるようにします。「購入日」と [保存] ボタンの間の行に、マウスカーソルを合わせて、右クリックします。メニューが表示されるので、「行を下に挿入」を選択します (下図参照)。

すると、表に行が挿入されるので、左側のセルに「ラベル」、右側のセルに「計算結果フィールド」をそれぞれドラッグ&ドロップします。

「ラベル」のラベルは、"状況:" に変更します。「計算結果フィールド」は、「プロパティ」ビューの「値」タブを開いて、次のように変更します。

  • 「使用するバインドデータ」は、"JavaScript" に変更します。
  • 「JavaScript (サーバサイド)」のエディタ部分には、
document1.getValue( "Status" )

と記述します (下図参照)。

上記の式の内容ですが、document1 というのは、「蔵書登録/編集」文書を XPages に連結させたデータなので、文書中にある Status の値を取得するというものです。これで、「蔵書登録/編集」の XPage を開いたときに、その蔵書が貸出中ならば、"貸出中" と表示されます。

蔵書一覧ページにステータスが表示されるようにする

蔵書登録/編集文書ページに表示させるようになったので、蔵書一覧ページ (「BooksCollectionView」カスタムコントロール) でも表示させるようにします。この場合、先にノーツのビューを修正しておくと簡単です。

ということで、「蔵書一覧(BooksCollectionView)」ビューを開いて、最後尾に「Status」 を表示する列を追加します(列のタイトルは、"状況" としてください)。このビューが保存できたら、「BooksCollectionView」カスタムコントロールを開きます。

ビューのデータが表示された表があるので、一番右側の列 (購入日) にマウスカーソルを合わせて、右クリックします。ポップアップメニューが表示されるので、「列の追加」を選択します (下図)。

列が追加されるので、「プロパティ」ビューの「データ」タブを開きます。「列の値」にある「ビューの列」の右側のボックスをクリックすると、ビューに設定された列の一覧が表示されます。先ほど追加した、「状況」列が確認できるでしょうか (下図参照)。

確認できたら、それを選択します。すると、表の列のタイトル部分のセルが「状況:」に変わり、値部分のセルが「Status」に変わります。このままでも良いのですが、貸出中かどうかが目立たないので、フォントスタイルを変更してみましょう。同じく「プロパティ」ビューの「フォント」タブを選択します。カラーを赤に、スタイルは太文字にします (下図参照)。

この状態で、「BooksCollectionView」カスタムコントロールを保存します。これで、各文書のステータスが変更されるようになり、XPage の画面にも表示されるようになりました。

次回は、各画面の入力チェックを実装します。


第8回:機能の追加 2 (入力チェックの追加と、蔵書の返却)

「蔵書登録文書」への入力チェックの実装

「蔵書登録/編集」画面に入力チェック機能を実装するので、「BookResource」カスタムコントロールを開きます。フィールド数が少ないので、全部に入力チェックをかけても良いのですが、今回は「蔵書名」に入力チェックを仕掛けます。蔵書名のフィールド (BookName) を選択して、「プロパティ」ビューの「妥当性検査」タブを開きます (下図参照)。

この中の「必須フィールド」のチェックをつけて、「必須フィールドのエラーメッセージ」に入力チェック時のエラーメッセージを入力します。今回は、「蔵書名が入力されていません。」とします。

次に、「コントロール」ビューの「コアコントロール」にある「エラー表示」を「BookName」フィールドの横にドラッグ&ドロップします (下図参照)。

ドラッグ&ドロップできたら、「プロパティ」ビューを開きます。「エラー表示」タブの「次のエラーメッセージを表示」のところのリストボックスから「bookName1」を選択します (下図参照)。

さらに、この「エラー表示」コントロールが有効になるようにします。蔵書名 (BookName) コントロールを選択して、「プロパティ」ビューの「すべてのプロパティ」タブを開きます。「データ」「disableClientSideValidation」の値を"true"に変更します (下図参照)。

これで良いのですが、このままだと画面が切り替わるたびに、この項目の入力チェックが行われます。[キャンセル] ボタンをクリックされたときや、別のタブ (蔵書一覧、貸し出し一覧) を選択されたときは、入力チェックが行われては困ります。そこで、これらのアクションが行われるときは、入力チェックが行われないようにします。

[キャンセル] ボタンの「ボタンの種類」を「ボタン」から「キャンセル」に変更します。すると、「イベント」ビューの「データの検証または更新を行わない」にチェックがつけられて、入力チェックが無効になります。

次に、タブを選択されたときの動作から入力チェックを外します。「container」カスタムコントロールを開きます。その中にあるタブパネルの「蔵書一覧」を選択して「イベント」ビューを開きます。先ほどと同じく「データの検証または更新を行わない」にチェックをつけます (下図参照)。

これで「BookResource」カスタムコントロールを保存します。下図は、プリビューの結果です。エラーメッセージがどのように表示されているのかが分かるでしょう。

「蔵書貸出文書」への入力チェックの実装

「蔵書貸出」画面でも、この形で入力チェックを施します。こちらは「蔵書名」「貸出日」「返却期限」に入力チェックを設定してください。このとき、「貸出日」「返却期限」はそれぞれ最小値、最大値の設定も行います。

「貸出日」の最小値は、@Today (下図参照)、
「返却期限」の最大値は、@Adjust(@Today(),0,0,14,0,0,0)

とします。

その他の設定は以下の通りです。

コントロール入力必須エラーメッセージ日時の検証のエラーメッセージ
蔵書名蔵書名が入力されていません。
貸出日貸出日が入力されていません。貸出日に過去の日付は設定できません。
貸出期限貸出期限が入力されていません。貸出期限は、貸出日から最大で 2週間です。

エラー表示コントロールを使うので、各編集ボックスコントロールの「disableClientSideValidation」を true にするのを忘れないようにしてください。また、[キャンセル] ボタンの「データの検証または更新を行わない」のチェックをつけるのも忘れないように!すべて出来たら、「LendData」カスタムコントロールを保存します。

下図は、このプリビューです。確かに同時に複数のエラーメッセージが表示されています。

「蔵書の返却」機能の実装

[返却] アクションの内容は次の通りです。

  • 「蔵書貸出」文書の状況が "返却済" に、文書の返却日が今日の日付になる。
  • 「蔵書登録/編集」文書の状況が "" になる。

これにより、

  1. 図書の返却督促処理の対象外になる。
  2. 蔵書が貸出可能になる。

となります。

上記を踏まえて実装していきます。「蔵書の返却」は、「蔵書貸出」画面に機能を追加するので、「LendData」カスタムコントロールを開きます。[保存] ボタンと [キャンセル] ボタンの間に、新しいボタンを追加します。「コントロール」ビューから、ボタンコントロールをドラッグ&ドロップします (下図参照)。

ボタンのラベルは、「返却」とします。蔵書が返却されている場合は、このボタンは表示する必要がないので、「可視化」の右にある ◇ をクリックして、「値の計算...」を選択します。スクリプトエディタが表示されるので、

@If(LendingDocument.getValue("Status")=="貸出中", @True(), @False())

と記述します。

これは、「蔵書貸出」文書の Status フィールドの値によって、ボタンを表示するかしないかを決めるというものです(下図参照)。

次に「イベント」ビューを開きます。アクションを 3つほど追加します。

1つ目のアクションはこちら。

「アクション」は、"スクリプトの実行"、「言語」は、"JavaScript(サーバサイド)"、「内容」は、

LendingDocument.setValue( "Status", "返却済");
LendingDocument.setValue( "ReturnDay", @Today() );
LendingDocument.save()

とします。

これで、「蔵書貸出」文書の内容が返却済みの状態になりました。

2つ目のアクションはこちら。

「アクション」は、"スクリプトの実行"、「言語」は、"JavaScript(サーバサイド)"、「内容」は、

var agent = database.getAgent( "ReturnBook" );
agent.runWithDocumentContext( database.getDocumentByID(
LendingDocument.getValue("BookResourceDocID") ));
agent.recycle()

とします (下図参照)。

次に「ReturnBook」エージェントを作成します。コードは以下の通り。

Sub Initialize
Dim session As New NotesSession
Dim doc As NotesDocument
Set doc = session.Documentcontext

Call doc.Replaceitemvalue( "Status", "" )
Call doc.Save( True, True, True )
End Sub

このエージェントの設定は、前回作成した「ChangeStatus」と同じにします。

また、エージェントを実行する際に渡す文書 ID ですが、「BookResourceDocID」フィールドの値を渡すようにしています。このフィールドは、実はまだ作成していません。

ということで、作成するようにします。同じく「LendData」カスタムコントロール内にある [保存] ボタンを選択して、「イベント」ビューを開きます。アクションの中の 1つ目である「スクリプトの実行」をダブルクリックして開きます (下図参照)。

LendingDocument.setValue( "Status", "貸出中" );

という行の下に、

LendingDocument.setValue( "BookResourceDocID", sessionScope.lendingBookResource );

というコードを 1行追加します (下図参照)。

これで、「蔵書登録/編集」文書の文書 ID が「蔵書貸出」文書に格納されるようになります。と同時に、[返却] ボタンをクリックしたときに、「蔵書登録/編集」文書を特定する事が出来ます。

さて、[返却] ボタンの 3つ目のアクションです。「蔵書貸出」文書を編集して保存しているので、画面を切り替える必要があります。「貸し出し一覧」ページに移動するので、「アクション」は "ページを開く"、「開くページの名前」は "Issueguides" とします。

これで「LendData」カスタムコントロールを保存します。

ということで、「返却」機能が実装されました。今回はここまでとします。


第9回:機能の追加 3 (蔵書貸出の多重起動の防止、貸し出し者の判別、督促機能)

蔵書貸出の多重起動の防止の実装

現在のままでは、蔵書が貸し出されているにもかかわらず、「BookResources」ページに [蔵書貸出] ボタンが表示されてしまいます。これでは、1冊の蔵書を何人もの人が借りているということになってしまいます。そこで、蔵書が「貸出中」の場合は、[蔵書貸出] ボタンが表示されないようにします。

「BookResource」カスタムコントロールを開きます。「蔵書貸出」ボタンを選択して、「プロパティ」ビューを開きます。「可視」はすでに {計算済み} になっているはずですが、右側にある ◆ をクリックして、値の計算を選択します。スクリプトエディタが開くので、条件式を変更します (下図参照)。

変更前:
! ( document1.isNewNote() | document1.isEditable() )
変更後:
!(document1.isNewNote()) && !(document1.isEditable()) && document1.getValue( "Status" ) != "貸出中"

以前は、読み込みモードの時だけ表示するという設定だったので、そこに Status フィールドが "貸出中" でないときという条件を追加しています。Status=="" ではダメです。これは Status フィールドを明示的に作成していないので、Status フィールドが存在しない文書もあるためです。

蔵書貸し出し者の判別機能の実装

次に、誰が蔵書を借りているのかを分かるようにします。現時点では、日付と「貸出中」かどうかの Status のみを管理しています。これに、貸し出しているユーザー名も管理するようにします。

これは、蔵書を貸し出したときに、「蔵書登録/編集」文書に貸出者の名前を登録するのと、「蔵書登録/編集」の XPage にその名前を表示する領域を作る事の 2つが必要です。さらに言えば、「返却」されたときに、その貸出者の名前をクリアする事も必要です。順を追って作業していきます。

「BookResource」カスタムコントロールにある表の中の「状況:」の下のセルをマウスで右クリックして、下に行を挿入します (下図参照)。

挿入された行の左側のセルにラベルコントロール (「ラベル」は "利用者" とする)、右側のセルには、計算結果コントロールを追加します。「プロパティ」ビューの「値」タブは、JavaScript として、計算式は

document1.getValue( "Borrower")

とします (下図参照)。

これで「BookResource」カスタムコントロールを保存します。

「貸出」、「返却」アクションの修正

次に、「貸出」アクションと「返却」アクションを修正します。「LendData」カスタムコントロールの [保存] ボタンのアクションの内容を以下のように修正してください。1つ目のアクションを次のように編集してください。

LendingDocument.setValue( "Status", "貸出中" );
LendingDocument.setValue( "BookResourceDocID", sessionScope.lendingBookResource );

LendingDocument.save()

var agent = database.getAgent( "ChangeStatus" );
agent.runWithDocumentContext( database.getDocumentByID( LendingDocument.getNoteID()) );
agent.recycle()

エージェントの実行対象文書を「蔵書登録/編集」文書から「蔵書貸出」文書に変更しています。これで「LendData」カスタムコントロールを保存してください。

次に、「貸出」アクションを修正するため、「ChangeStatus」エージェントを以下のコードで書き換えてください。

Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim BookResourceDoc As NotesDocument
   
    Set db  = session.Currentdatabase
	Set doc = session.Documentcontext
   
    Set BookResourceDoc = db.Getdocumentbyid( doc.BookResourceDocID(0) )
   
    Call BookResourceDoc.Replaceitemvalue( "Status", "貸出中" )
    Call BookResourceDoc.Replaceitemvalue( "Borrower", doc.LendBy(0) )
    Call BookResourceDoc.Replaceitemvalue( "LendDocID",  doc.Noteid )
    Call BookResourceDoc.Save( True, True, True )
End Sub

「蔵書貸出」文書にセットしてある「蔵書登録/編集」文書の文書 ID を元に「蔵書登録/編集」文書を呼び出し、そこに「状況」「利用者」「蔵書貸出文書の文書 ID」をセットして保存しています。

続いて、「returnBook」エージェントを以下のように修正してください。

Call doc.Replaceitemvalue( "Status", "" )

の下の行に

Call doc.Replaceitemvalue( "Borrower", "" )
Call doc.Replaceitemvalue( "LendDocID", "")

を追加します (下図参照)。

これで、蔵書が返却されたときに、「利用者」と「貸出文書 ID」が空欄になります。

「BookResources」ページから「Lending」ページを開く

次に、「蔵書登録文書」ページから、貸出中の「蔵書貸出文書」を開けるようにします。この機能があると、蔵書がいつ返却される予定なのかを確認することを早くすることができます。

「BookResource」カスタムコントロールに、現在貸し出している「蔵書貸出」文書を開くというアクションを追加します。「BookResource」カスタムコントロールを開いて、[キャンセル] ボタンの右側にボタンを追加します。ラベルは "貸出文書を開く" とします。 (下図参照)。

このボタンは、「蔵書」が "貸出中" の時だけ表示すれば良いので、「可視化」の設定を以下のようにします。

document1.getValue( "Status" ) == "貸出中" && !(document1.isEditable())

次に「イベント」ビューを開きます。以下のアクションを追加してください。

アクション: ページを開く
開くページの名前: Lending
ターゲット文書: 文書を開く
文書 ID: 右側の ◇ をクリックして、「値の計算...」を選択した後、

document1.getValue( "LendDocID" )

と入力して、[OK] とします。全部設定が完了すると下図のようになります。

「督促」機能の実装

「貸出期限」を過ぎても、「貸出中」になっている文書の貸し出し者に対して、蔵書の返却を求めるメールを送信するというプログラムを作成します。まずは、「貸出期限」を過ぎた「蔵書貸出」文書だけを表示するビューを作成します。新規に「貸出期限切れ」(別名:TimeExpire) という名前でビューを作成します。

ビューの選択式は、

SELECT Form ="Lending" & ( Status = "貸出中" & LendingTerm < @Today )

とします (下図参照)。

このビューの内容はこれ以上、編集する必要がないので、このまま [OK] をクリックします。

次に、督促メールを送るエージェントを作成します。

名前:ReturnReminder
タイプ:LotusScript

とします (下図参照)。

コードは以下のように記述してください。

Sub Initialize
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim view    As     NotesView            '返却期限切れビュー
    Dim doc     As     NotesDocument        '返却期限切れの蔵書貸出文書
    Dim mdoc    As     NotesDocument        '督促メール文書
    Dim mritem  As     NotesRichTextItem    '督促メール文書の本文 (リッチテキスト)
   
    Set db   = session.Currentdatabase
    Set view = db.GetView( "TimeExpire" )
    view.Autoupdate = False
   
    Set doc = view.Getfirstdocument()
    Do While Not ( doc Is Nothing )
        'ここで督促メールを作成、送信
        Set mdoc = db.Createdocument()
        mdoc.Form    = "Memo"
        mdoc.SendTo  = doc.Getitemvalue( "LendBy" )(0)
        mdoc.Subject = "【督促メール from 図書管理 for XPages】"
        Set mritem = New NotesRichTextItem( mdoc, "Body" )
        Call mritem.AppendText( "次の図書の返却期限が切れています。早く返却するようにしてください。 " & doc.BookName(0) )
        Call mritem.AddNewline( 2, True )
        Call mritem.AppendDocLink( db, "リンクをクリックしてください", db.Title )
       
        '督促メールの送信
        Call mdoc.Send( False )
       
        '次の文書を取得
        Set doc = view.Getnextdocument( doc )
    Loop
   
    view.Autoupdate = True
End Sub

このエージェントはスケジュールエージェントとして設定しておきます (下図参照)。

これで、返却期限を過ぎても、蔵書が返却されない場合は、利用者に督促のメールが、一日ごとに送信されるようになります。

リンクが DB リンクになっているので、対象となる蔵書貸出文書が直接開かれる事はないですが、今回はサンプルなので、ここまでとしておきます。


第10回:機能の追加 4 (蔵書貸出機能の強化)

蔵書コードの追加

現在、「蔵書貸出」を行う際、「蔵書名」は手動での入力になっています。これでは、入力ミスがあったり、同一名称の蔵書が存在したりする場合に対処できません。そこで、蔵書文書を識別できるようにします。まず、「蔵書」フォームに次のフィールドを追加します。

フィールド名フィールドの種類デフォルト値備考
BookCode数値編集可能蔵書コード
docEditor作成者作成時の計算結果“*”文書編集者

蔵書の貸出を行う際、「蔵書文書」を編集して、ステータスを変更しているので、「蔵書文書」に編集権限が必要です。そのため、docEditor という作成者フィールドを追加して、全ユーザが編集できるようにしています。

「蔵書貸出文書」にも同様に、以下のフィールドを追加します。

フィールド名フィールドの種類デフォルト値備考
BookCode数値編集可能 蔵書コード

BookCode 順ビューの追加

「蔵書コード」ごとに並べて表示するビューを作成します。

ビュー名 / 別名 「BookCode 順 / ByBookCodeView」
ビューの選択式 SELECT Form ="BookResources"

列の値タイトル備考
1列目BookCode蔵書コードソート (昇順)
2列目BookName蔵書名

「蔵書登録文書」に BookCode を追加する

蔵書コード (BookCode) を作成したので、「蔵書登録文書」を保存したときに、自動的に BookCode を追加するようにします。

カスタムコントロールの「BookResource」を開きます。[保存] ボタンコントロールを選択して、イベントビューを開きます。「文書の保存」の前に 1つアクションを追加したいので、「アクショングループ」を選択した状態で、[アクションの追加…] をクリックします (下図参照)。

「シンプルアクションの追加」ダイアログが表示されるので、「アクション」は「スクリプトの実行」を選択して、エディタ部分に以下のコードを記述します。

// 追加コード (BookCode の埋め込み)
if ( document1.isNewNote()) {
	var tmpView = database.getView( "ByBookCodeView" );
	var tmpBookResourceDoc:NotesDocument = tmpView.getLastDocument();
	if ( tmpBookResourceDoc == null ) {
		document1.replaceItemValue( "BookCode", 1 );
	} else {
		document1.replaceItemValue( "BookCode", 
		tmpBookResourceDoc.getItemValueInteger( "BookCode" ) + 1 );
	}
}

※これは、「蔵書登録文書」を保存するときに、既存の「蔵書登録文書」のうち、蔵書コードが一番大きいものに +1 した値をこの文書の蔵書コードとして格納するというものです。

記述したら、[OK] をクリックします。すると、アクションは、「ページを開く」の下に追加されるので、右側にある↑のボタンをクリックして、「文書の保存」アクションの上まで、移動します。

「蔵書貸出文書」の蔵書名に BookCode を付加して表示する

「蔵書登録文書」に蔵書コードが追加された事により、蔵書コードと蔵書名を組み合わせる事で、蔵書名をノーツアプリケーション上でユニークにする事が出来ます。そこで、「蔵書貸出文書」の蔵書名は手動入力を止めて、蔵書コード+蔵書名の一覧から選択できるようにします。このとき、すでに貸出中の「蔵書登録文書」は一覧に含む必要はないので、貸出中になっていない「蔵書登録文書」の一覧を取得できるようにします。簡単に行うために、専用のビューを作成します。

ビュー名 / 別名 「在庫一覧 / NonLendingBooksCollection」
ビューの選択式 SELECT Form ="BookResources" & Status =""

列の値タイトル備考
1列目 REM {追加コード BookCode 埋め込み}; @Right( "0000" + @Text(BookCode); 4 ) + " " + BookName 蔵書名ソート (昇順)

次に、カスタムコントロールの「LendData」を開きます。表中の「蔵書名:」の箇所をマウスで右クリックして、「行を上に挿入」メニューをクリックします。

行が挿入されるので、左側のセルに「ラベル」コントロール、右側のセルに「コンボボックス」コントロールを貼り付けます。「ラベル」コントロールの「ラベル」は、「蔵書名:」にします。「コンボボックス」コントロールの「名前」は「tmpBookName」に、幅は「300.0」ピクセルにします。また、プロパティビューの「値」タブを選択して、[式項目の追加…] ボタンをクリックします。スクリプトエディタのダイアログが表示されるので、以下の式を入力します。

@DbColumn(@DbName(), "NonLendingBooksCollection", 1)

入力したら、[OK] をクリックします。

これで、「蔵書貸出」を実行したとき、「貸出中」になっていない (つまり貸出可能な)「蔵書登録文書」が蔵書コードと一緒の一覧として表示されるようになります。

蔵書登録文書から蔵書貸出を行った場合の蔵書名の自動設定

しかし、「蔵書登録文書」から [蔵書貸出] ボタンをクリックした場合、わざわざ蔵書名を選択する必要はありません。表示していた「蔵書登録文書」の蔵書名をセットすればそれで済みます。

ということで、「蔵書登録文書」から [蔵書貸出] をクリックした場合は、蔵書名を自動設定するようにします。と言っても、すでにそこまでは出来ています。問題は、そのフィールド (編集ボックス) が編集可能になっている事です。これでは、せっかく設定したものを変更されてしまう可能性があります。また、先ほど追加したコンボボックスも二重の表示となり、邪魔です。

「BookName」の編集ボックスコントロールを選択します。プロパティビューの「編集ボックス」タブにある「読み取り専用」にチェックをつけます。

読み取り専用にしたので、入力チェックの対象から外します。「妥当性検査」のタブを表示して、「必須フィールド」のチェックを外します。また、右側に設置してある「エラー表示」コントロールを削除します (選択して、Delete キーをクリックします)。

次に、二つに増えた「蔵書名」のフィールドの表示/非表示の制御を行います。

上の行の「蔵書名:」が配置してある表のセルを選択します (選択の仕方が分からない場合は、アウトラインビューから選択すると良いでしょう)。プロパティビューの「表のセル」タブにある「可視」の右にある ◇ をクリックして、「値の計算…」をクリックします。スクリプトエディタが表示されるので、

sessionScope.actionFlag == true

と入力します。

右側のセルの「可視」も同じ式を入力します。

下の行の「蔵書名:」のセルの可視には、

sessionScope.actionFlag != true

と入力します。

ここでは、セッションスコープ変数を使って制御しています。しかし、まだセッションスコープ変数をセットしていません。そこで、「貸出一覧」ビューにある [蔵書貸出] アクションをクリックしたときに、true をセットするようにします。これで、表示/非表示の制御が行えます。

カスタムコントロールの「LendingView」を開きます。「蔵書貸出」ボタンを選択して、イベントビューを開きます。「ページを開く」アクションの上に、アクションを追加します。「アクション」は、スクリプトの実行で、式は以下のコードを記述します。

sessionScope.actionFlag = true

ついでに、「貸出中」でない蔵書が一つもないときは、この「蔵書貸出」ボタンが表示されないようにしましょう。

「蔵書貸出」を選択して、プロパティビューを開きます。可視の設定を行うので、以下のコードを記述します。

var tmpView:NotesView = database.getView( "NonLendingBooksCollection" );
var docCount = tmpView.getAllEntries();
docCount.getCount() > 0

貸出実行時のアクションの修正

蔵書コードを追加した事により、「蔵書貸出」時の保存アクションも修正する必要があります。

[保存] ボタンを選択して、イベントビューを開きます。「スクリプトの実行」の上に、アクションを追加します。アクションは「スクリプトの実行」で内容は以下のコードを記述します。

var lbName = sessionScope.lendingBookName;
if ( null != lbName && lbName != "" ) {
//	LendingDocument.setValue( "BookName", lbName );
} else {
	// 追加コード [蔵書貸出] からのアクション
	var tmpBookName1 = getComponent("tmpBookName").value;
	LendingDocument.setValue( "BookCode", parseInt( tmpBookName1.substr(0, 4) ) );
	LendingDocument.setValue( "BookName", 
	tmpBookName1.substr( 5, tmpBookName1.length - 5 ) );
	
	// 蔵書文書の文書 ID を取得
	var bookCodeView:NotesView = database.getView( "NonLendingBooksCollection" );
	var ResourceDocument:NotesDocument = 
	bookCodeView.getDocumentByKey( tmpBookName1 );
	var tmpID = ResourceDocument.getItemValueString( "BookName" );
	LendingDocument.setValue( "BookResourceDocID", ResourceDocument.getNoteID() );
}

さらに元々あった「スクリプトの実行」アクションを次のように編集します。

LendingDocument.setValue( "Status", "貸出中" );
// 追加コード セッションスコープ変数が値を保持している場合だけ、文書 ID にセット
if ( sessionScope.lendingBookResource != null ) {
	LendingDocument.setValue( "BookResourceDocID", sessionScope.lendingBookResource );
}

LendingDocument.save();

var agent = database.getAgent( "ChangeStatus" );
var lendDoc:NotesDocument = LendingDocument.getDocument();
var lendID = lendDoc.getNoteID();
if ( lendDoc != null ) {
	agent.runWithDocumentContext( lendDoc );
	agent.recycle();
}

// 追加コード: 各セッションスコープ変数のクリア
sessionScope.actionFlag = null;
sessionScope.lendingBookName = null;
sessionScope.lendingBookResource = null;

これで「蔵書貸出」がかなり使いやすくなりました。


第11回:機能の追加 5 (デザインの改善)

「蔵書登録文書」の削除機能の追加

「蔵書登録文書」を削除する機能がないので、追加します。

カスタムコントロールの「BookResource」を開きます。[編集] ボタンと [蔵書貸出] ボタンの間に、ボタンコントロールをドラッグ&ドロップします。

ボタンのラベルは「削除」にします。

「可視」の右にある ◇ をクリックして、「値の計算…」を選択します。

表示条件は、「既存の文書」でなおかつ、「貸出中」になっていないものなので、スクリプトエディタの条件欄に、

( ! document1.isNewNote() && ! document1.hasItem( "Status") ) || 
( ! document1.isNewNote() && document1.getItemValue( "Status" ) == "" )

と入力します。

次に、イベントビューを開きます。[アクションの追加…] をクリックします。「シンプルアクションの追加」ダイアログが表示されるので、各項目に下表の通り入力して、[OK] をクリックします。

アクション文書の削除
次に開くページの名前Home
確認テキストこの蔵書を削除しても良いですか?
データソース名document1

これで、「蔵書登録文書」を削除する事が出来るようになりました。

「蔵書貸出文書」の編集可能ユーザーを設定する

「蔵書」フォームには作成者フィールドを設けていますが、「貸し出し」フォームには作成者フィールドはもうけていません。そのため、ACL が「作成者」権限の場合、蔵書の貸出は出来ても、返却が行えません (「蔵書貸出文書」の編集が行えない)。そこで、「蔵書貸出文書」にも作成者フィールドを設けるようにします。

「貸し出し」フォームを開きます。「LendBy」フィールドを「テキスト (編集可能)」から、「作成者 (作成時の計算結果)」に変更してください。値は、

@If(LendBy="";@Name([Abbreviate];@UserName);@Name([Abbreviate];LendBy))

に変更してください。

できたら、「貸し出し」フォームを保存します。

次にカスタムコントロールの「LendData」を開きます。編集ボックスの「lendBy1」を削除します。その場所に、「計算結果フィールド」をドラッグ&ドロップします。

「プロパティビュー」の「値」タブを開きます。「使用するバインドデータ」は、「データソース」を LendingDocument に、「バインド先」を LendBy にします。

できたら、「LendData」を保存します。

「蔵書貸出文書」にコメント入力欄を設ける

「蔵書」の貸し出し時に、コメントが入力できるようにします。

「貸し出し」フォームを開きます。次のフィールドを追加して保存します。

フィールド名フィールドの種類備考
Remarkリッチテキスト編集可能コメント

次にカスタムコントロールの「LendData」を開きます。「貸出期限:」のラベルがあるセルを選択して、マウスで右クリックします。ポップアップメニューが表示されるので、「行を下に挿入」を選択します。

挿入された行の左側のセルに「ラベル」コントロールを、右側のセルに「リッチテキスト」コントロールをドラッグ&ドロップします。

「ラベル」コントロールの「ラベル」は「コメント:」に変更します。「リッチテキスト」コントロールの幅は、600ピクセルに変更します。また、「データバインディング」は「LendingDocument」の「Remark」とします。

ログインユーザー名を表示する

XPages アプリケーションはノーツクライアントからだけでなく、Web ブラウザからも利用できます。このとき、ログインユーザー名が表示されていれば、親切でしょう。ということで、ヘッダー部分にログインユーザー名を表示します。

カスタムコントロールの container を開きます。「表」コントロールを“図書管理 for XPages”としたラベルの横にドラッグ&ドロップします。表のサイズは 2行 1列とし、表の幅は「幅に合わせる (100%幅)」とします。

“図書管理 for XPages”としたラベルは、表の上の行に移動します。アウトラインビュー上で操作すると簡単に行えます。

表の下の行を選択します。プロパティビューの「フォント」タブを開きます。右寄せボタンをクリックして、セル内のオブジェクトが右側に寄るようにします。

このセルに「計算結果フィールド」をドラッグ&ドロップします。データバインディングは、「使用するバインドデータ」を「JavaScript」にします。JavaScript の内容は、

@Name("[CN]",@UserName())

とします。

目立たせたいので、「フォント」は、青色、太字、斜体とします。

「BookResource」と「LendData」に見出しラベルを付加する

カスタムコントロールの「BookResource」と「LendData」にはフォームの情報を連携しているだけで、見出しがないため、見た目が少し寂しいです。そこで、それぞれの画面に見出しラベルを付加してみます。

カスタムコントロールの「BookRsource」を開きます。「出版社:」の行のセルを選択して、マウスを右クリックします。「行を上に挿入」を選択して、行を挿入します。挿入した行のセルを二つ選択して、マウスを右クリックします。ポップアップメニューが表示されるので、「セルのマージ」を選択します。

プロパティビューのフォントタブを開いて、背景色は薄い黄色にします。また、文字揃えは「中央揃え」ボタンをクリックします。

そのセルに、「ラベル」コントロールをドラッグ&ドロップします。プロパティビューの「ラベル」タブにある「ラベル」項目の右側にある ◇ をクリックして、「値の計算…」を選択します。

スクリプトエディタが表示されるので、以下の式を入力して、[OK] をクリックします。

if ( document1.isNewNote() ) {
	"蔵書の登録"
} else if ( document1.isEditable() ) {
	"蔵書の編集"
} else {
	"蔵書の詳細情報"
}

ラベルのフォントは「12」で、「太字」にします。ここまで出来たら、「BookResource」カスタムコントロールを保存します。

次に「LenData」カスタムコントロールも同様に設定します。セルの背景色は、薄緑としておきます。

ラベルの式は、

if ( LendingDocument.isEditable() ) {
	"蔵書の貸出"
} else if ( LendingDocument.getItemValueString("Status") == "貸出中" ) {
	"蔵書の返却"
} else {
	"返却された蔵書"
}

としてください。

これで、「LendData」カスタムコントロールを保存します。


第12回:XPages アプリケーションの起動方法について

DB アイコンの作成

せっかくアプリケーションを作成したのに、アイコンが標準のままでは寂しいです。そこで、アプリケーション用の DB アイコンを作成します。

ノーツアプリケーションを Lotus Domino Designer で開きます。アプリケーションビューから、「リソース」「アイコン」を開きます。アイコンのプロパティ画面が表示されるので、[アイコンエディタを開く] ボタンをクリックします。

下図を参考にして、DB アイコンを作成してください。

DB アイコンリソースをノーツアプリケーションに登録する

XPages アプリケーションをノーツクライアントから利用している場合は気にする必要はありませんが、Web ブラウザから利用する場合、このままでは、DB アイコンが表示されません。そこで、各ページを開いたときに、DB アイコンがブラウザに表示されるようにします。先ほど作成した DB アイコンを元に、「favicon.ico」というアイコンファイルを作成します (フリーウェア等で作成が可能ですが、サンプルをダウンロードできるようにしておきました)。

作成した「favicon.ico」をノーツアプリケーションに登録します。アプリケーションビューから「リソース」「ファイル」を開いてください。[ファイルリソースのインポート] をクリックします。

作成した「favicon.ico」を選択して、[開く] をクリックします。これで「favicon.ico」がノーツアプリケーションに登録されました。

DB アイコンを Web ページに表示させる

XPage の「home」を開きます。プロパティビューの「XPage」タブを開きます。「ページのアイコン」に、「favicon.ico」と入力します。

さらに、その上を見ると「ページのタイトル」という箇所があります。何も設定されていないと、Web ブラウザの場合、URL が設定されてしまいます。ここもついでに設定してしまいましょう。

右の ◇ をクリックして、「値の計算…」を選択します。スクリプトエディタが表示されるので、

@DbTitle()

と入力して、[OK] をクリックします。ここまで出来たら、「home」を保存します。同様に残りの XPage の「BookResources」「Issueguides」「Lending」も設定します。

XPages アプリケーションの起動方法を設定する

画面左側にある「アプリケーション」ビューの中の一番下にある「アプリケーションのプロパティ」をダブルクリックします (下図参照)。

すると、「基本プロパティ」という画面が表示されるはずです (下図参照)。

ここで「起動」というタブを開きます (わかりにくい位置にありますが、上図で言うと、赤枠の左下部分にあります)。

ここで、XPages アプリケーションが利用できるように設定します。Lotus Notes Client の起動の「起動」オプションをクリックして、「指定した XPage を開く (Standard 版クライアント)」を選択します。 (下図参照)。

開く XPage は「home」とします。この画面を保存すれば ([ファイル] [保存] メニューを実行します)、ノーツクライアント及び Web ブラウザから XPages アプリケーションが起動できるようになります。下図は、ノーツクライアントから本アプリケーションを起動したときの画面です。

実際の動きは、ご自身の目で確かめてください。

これで、「図書管理 for XPages」アプリケーションは完成です。エラー時の処理など実装してない箇所はまだありますが、とりあえずは実際に利用できるアプリケーションになったかと思います。これから XPages アプリケーションを作成される方や、初心者を脱却したいという方に読んでいただき、参考になれば幸いです。

ありがとうございました。


ダウンロード

内容ファイル名サイズ
第1章 サンプルファイルbkmgrxpg_1.zip25KB
第2章 サンプルファイルbkmgrxpg_2.zip27KB
第3章 サンプルファイルbkmgrxpg_3.zip30KB
第4章 サンプルファイルbkmgrxpg_4.zip37KB
第5章 サンプルファイルbkmgrxpg_5.zip42KB
第6章 サンプルファイルbkmgrxpg_6.zip50KB
第7章 サンプルファイルbkmgrxpg_7.zip53KB
第8章 サンプルファイルbkmgrxpg_8.zip53KB
第9章 サンプルファイルbkmgrxpg_9.zip57KB
第10章 サンプルファイルbkmgrxpg_10.zip65KB
第11章 サンプルファイルbkmgrxpg_11.zip69KB
第12章 サンプルファイル 1/2bkmgrxpg_12.zip71KB
第12章 サンプルファイル 2/2favicon.zip1KB

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=799249
ArticleTitle=XPages アプリケーションで作成する図書管理
publish-date=03082012