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

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

2011年12月11日日曜日

おじさんSEが学ぶXPages(10)

週末にならないと、続きが読めないというXPagesの連載もとうとう10回目です。
本当に、そろそろ切り上げないと行けないと思っている筆者ですが・・・
なぜなら、前回どこまで書いたのかを思い出すのに一苦労してしまうからです。
それに、8.5.3も出ているので、そちらについても書かないと、クレームが来そうですから(苦笑)。

ということで、今日も張り切っていきましょう。

では、恒例のボタンクリックからです。
にほんブログ村 IT技術ブログへ



えーっと・・・
そうでした。前回で、画面全般は終わりましたので、今回からは、機能をつけていくという事ですね。

現状の問題点は、以下の6つ。
  1. 蔵書登録/編集画面から貸出が出来ない。
  2. そのため、蔵書を貸し出しするのに、蔵書名を選択する必要がある。
  3. 蔵書登録と蔵書貸出が連動していないので、蔵書が貸出可能状態にあるのかどうか不明。
  4. 貸し出した蔵書の返却が出来ない。
  5. 返却期限を過ぎても、何も起きない(つまり、返却期限の設定に意味がない)。 
  6. 蔵書登録/編集画面、蔵書貸出画面ともに入力チェックが行われていない。

ずいぶんと多いですね。一度に解決するのは無理なので、少しずつやっていきましょう。

まずは、「1.蔵書登録/編集画面から貸出が出来ない」です。
これは、「蔵書登録/編集画面」に[蔵書貸出]のボタンを配置する事で出来そうです。
では、実際にやってみましょう。

Lotus Domino Designerで「カスタムコントロール」の「BookResource」を開きます。

[編集]と[キャンセル]ボタンの間にスペースを空けて、ボタンコントロールを配置します。
ラベルは、「蔵書貸出」とします。
蔵書貸出ボタンを配置

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

! ( document1.isNewNote() | document1.isEditable() )
と入力してください。
これは、新規文書(document1.isNewNote())ではない、もしくは、文書が編集モード(document1.isEditable())ではない
ときに表示するという設定です。
間にある「|」はor条件を表します。
まぁ、読み込み時のみ表示と考えれば、
! document1.isEditable()
だけでも良いのですが、せっかくなので新しい事を覚えましょう。
可視化の設定


次にイベントを設定します。
イベントビューを開いて、[アクションの追加]ボタンをクリックします。アクションは2つ追加します。
1つ目のアクションは、
「アクション」は"スクリプトの実行"、
「言語」は"JavaScript(サーバサイド)"
として、エディタ部分に
sessionScope.lendingBookName = document1.getItemValueString("BookName");
sessionScope.lendingBookResource = document1.getNoteID();
と入力して、[OK]をクリックします(下図参照)。
上の行は、蔵書名を格納します。これは、蔵書貸出画面に表示するのに利用します。
下の行は、蔵書文書の文書IDを格納します。これは、蔵書貸出が完了したときに、この蔵書文書のステータスを変更するのに利用します。
セッションスコープ変数のセット

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

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

次に「LendData」カスタムコントロールを開きます。
「イベント」ビューを開きます。
「データ」「LendingDocument」「PostNewDocument」イベントを開きます。
「シンプルアクション」が選択されているはずなので、「スクリプトエディタ」に変更します。
すると、エディタ画面が表示されるので、
var lbName = sessionScope.lendingBookName;
if ( null != lbName && lbName != "" ) {
    LendingDocument.setValue( "BookName", lbName )
}
と入力します(下図参照)。
これは、セッションスコープ変数の値をBookName(蔵書名)に格納するという意味のものです。
PostNewDocumentイベント

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

ついでに、誰が借りたのかを自動で設定できるようにしましょう。
今のコードの下に
var uname = session.createName( session.getUserName() );
LendingDocument.setValue( "LendBy", uname.getAbbreviated() )
を追加してください。
※LendByの幅も変えておくと良いでしょう。
現在のユーザ名をLendByにセット

今度は、「蔵書貸出」の[保存]ボタンを修正します。
ボタンを選択して、「イベント」ビューを開きます。

このボタンにアクションを2つ追加します。
1つ目は、「スクリプトの実行」で、コードは以下のようにしてください。
LendingDocument.setValue( "Status", "貸出中" );

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

保存アクション(ステータスの変更)

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

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

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

次に、「蔵書登録/編集」文書のステータスを変更するエージェントを作成します。
「ChangeStatus」という名前で、LotusScriptのエージェントを作成します。
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

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

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


というところで、今日は終わりです。

実はもう少しだけ、行う事があるのですが、それは何なのかを考えてみてください。
答えは、次回。


ではでは。


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

0 件のコメント: