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

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

2011年12月21日水曜日

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

こんばんは。年末が近づいてくると、仕事納めの事を考えてしまいがちですが、まだまだ早いです。
筆者のXPagesブログ、【新規にDBを作ろう編】が終わってません。
なんとか年内に終わらせたい筆者は、頑張って執筆(?)しますよ!


では、今日も秘密のボタンをポチッと押してから次へ。
にほんブログ村 IT技術ブログへ



さて、始める前にちょこっと告知を。
前回のおじさんSEが学ぶXPages(12)の中で、[キャンセル]ボタンをクリックした際に、入力チェックが働かないようにする方法を紹介しました。
こちらですが、もう少し簡単な方法がある事が分かりましたので、記事中に追加してあります。
一度読んだ方も、再度読み直していただければ幸いです。
この情報提供者は、筆者も尊敬しているS山さんです。この場を借りて、御礼申し上げます。


それでは、今日の本題です。前回の終わりに予告したように、今回から「蔵書の返却」について取り扱っていきます。

[返却]アクションの内容は次の通りです。
・「蔵書貸出」文書の状況が"返却済"に、文書の返却日が今日の日付になる。
・「蔵書登録/編集」文書の状況が""になる。

これにより、どうなるかというと、
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()

とします(下図参照)。
[返却]ボタンの2つ目のアクション


「ReturnBook」は、「蔵書登録/編集」文書の内容を編集するためのエージェントです。
おじさんSEが学ぶXPages(10)で紹介した「ChangeStatus」エージェントとほぼ同じです。
コードは以下の通り。
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


違いは、Statusを""にするということだけです。

ReturnBookエージェント

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

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

LendingDocument.setValue( "Status", "貸出中" );
という行の下に、
LendingDocument.setValue( "BookResourceDocID", sessionScope.lendingBookResource );
というコードを1行追加します(下図参照)。
[保存]ボタンにコードを追加

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


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


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

ということで、「返却」機能が実装されました。
後戻りが発生したため、ちょっと難しかったかもしれませんが、落ち着いてやってみてください。


今回はここまでとします。が・・・
お気づきの方もいるかと思いますが、新たな問題が発覚しました。
  1. 貸出中の蔵書文書を開いても、「蔵書貸出」ボタンが表示されてしまう
  2. 「蔵書登録/編集」文書を見ても、誰が借りているのかが不明である
  3. 「蔵書登録/編集」文書から、「蔵書貸出」文書へのリンクがないため、「貸し出し一覧」経由でないと開けない。

特に、1.は実装されていないと、何重にも蔵書が貸し出されてしまう事になります。
次回は、督促処理を行う前に、これらの問題を解決しましょう。


では、また次回。


Lotus Notes/Dominoの事なら、何でも!!もちろん、XPagesについても承ります!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: