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

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

2011年12月25日日曜日

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

クリスマスです。
みなさんはクリスマスプレゼントはもらったのでしょうか?いや、読者の大半はあげるほうでしょうか?
筆者は・・・内緒です。

さて、そんなクリスマス連休も今日で終わり。ついにあと一週間で今年も終わりです。
すでに、年末年始の休暇に入られた方もいるのではないかと思いますが、もう少しだけ頑張りましょう!

では、今週一週間を乗り切るために、ボタンをクリックしてから読みましょう。
にほんブログ村 IT技術ブログへ



前回は、蔵書の返却について実装しました。
一応はできたものの、以下の3つの不備がある事が判明しましたね。
  1. 貸出中の蔵書文書を開いても、「蔵書貸出」ボタンが表示されてしまう
  2. 「蔵書登録/編集」文書を見ても、誰が借りているのかが不明である
  3. 「蔵書登録/編集」文書から、「蔵書貸出」文書へのリンクがないため、「貸し出し一覧」経由でないと開けない。
ということで、これらを解消しましょう。

まずは、「1.貸出中の蔵書文書を開いても、「蔵書貸出」ボタンが表示されてしまう」から。
これは簡単ですね。「蔵書貸出」ボタンに可視化の設定を施せば良いのです。

「BookResource」カスタムコントロールを開きます。
「蔵書貸出」ボタンを選択して、「プロパティ」ビューを開きます。

「可視」はすでに{計算済み}になっているはずですが、右側にある◆をクリックして、値の計算を選択します。
スクリプトエディタが開くので、条件式を変更します(下図参照)。
変更前: ! ( document1.isNewNote() | document1.isEditable() )
変更後: !(document1.isNewNote()) && !(document1.isEditable()) && document1.getValue( "Status" ) != "貸出中"
「蔵書貸出」ボタンの可視化設定の修正

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


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

現時点では、「BookResource」カスタムコントロールを開いているはずですので、
「貸出者」の名前を表示できるようにしてしまいましょう。

表の中の「状況:」の下のセルをマウスで右クリックして、下に行を挿入します(下図参照)。
行の挿入

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

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

次は、「貸出」アクションと「返却」アクションの修正です。
ですが、色々実装を試した結果、今までに紹介したやり方だとうまくいかない部分が出てきてしまいました。
そこで申し訳ないのですが、「LendData」の[保存]ボタンのアクションの内容を変更させていただきます。
「LendData」カスタムコントロールを開いてください。
[保存]ボタンコントロールのイベントビューを開きます。
一つ目のアクションを次のように編集してください。
LendingDocument.setValue( "Status", "貸出中" );
LendingDocument.setValue( "BookResourceDocID", sessionScope.lendingBookResource );

LendingDocument.save()

var agent = database.getAgent( "ChangeStatus" );
agent.runWithDocumentContext( database.getDocumentByID( LendingDocument.getNoteID()) );
agent.recycle()
「LendData」カスタムコントロールの[保存]ボタンのカスタマイズ

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


次に、「貸出」アクションを修正するので、「ChangeStatus」エージェントを開きます。
エージェントの実行対象文書が変わったので、大幅に変わります。
変更後のエージェントコードを載せるので、丸ごと入れ替えてください。
Sub Initialize
    Dim session As New NotesSession
    Dim doc As NotesDocument
    Dim BookResourceDoc As NotesDocument
    Dim db As NotesDatabase
   
    Set db  = session.Currentdatabase
    Set doc = session.Documentcontext
   
    Print "文書ID = " & doc.BookResourceDocID(0)
   
    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」が空欄になります。


※2012年2月1日 追記
上記2つのエージェント(「ChangeStatus」及び「returnBook」)は、「Webユーザとして実行」するようにしてください。
そうしないと、Webブラウザで動かしたときにエージェントが実行出来ないでエラーになります。



そして、「3.「蔵書登録/編集」文書から、「蔵書貸出」文書へのリンクがないため、「貸し出し一覧」経由でないと開けない。」を解決しましょう。
※実は、こいつを実現するために、「2.」の内容を大幅に変更しました。

これは、「BookResource」カスタムコントロールに、現在貸し出している「蔵書貸出」文書を開くというアクションを追加すれば良いだけです。

「BookResource」カスタムコントロールを開きます。
[キャンセル]ボタンの右側にボタンを追加します。ラベルは"貸出文書を開く"とします。 (下図参照)。
「貸出文書を開く」ボタン

このボタンは、「蔵書」が"貸出中"の時だけ表示すれば良いので、「可視化」の設定を以下のようにします。
document1.getValue( "Status" ) == "貸出中" && !(document1.isEditable())
「貸出文書を開く」の可視化設定


次に「イベント」ビューを開きます。
以下のアクションを追加してください。
アクション: ページを開く
開くページの名前: Lending
ターゲット文書: 文書を開く
文書ID: 右側の◇をクリックして、「値の計算...」を選択した後、
document1.getValue( "LendDocID" )
と入力して、[OK]とします。
全部設定が完了すると下図のようになります。
「貸出文書を開く」アクション


これで一通り出来ました。
次回はいよいよ、「返却期限を過ぎても、何も起きない(つまり、返却期限の設定に意味がない)。 」を実装します。



年内は無理だよなぁ・・・
期待しないで待っててね。





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

0 件のコメント: