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

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

2011年12月29日木曜日

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

みなさん、こんにちは。

昨日、Twitterで予告したとおり、今年最後のブログです。
会社は昨日(12/28)で仕事納めでしたが、筆者自身はこのブログが仕事納めという事になります。

年々、ブログへの投稿数が減っていましたが、後半はXPages関連のブログを書くという事になり、そのおかげで、Lotus Notes/Dominoに関する情報発信を続けていく事が出来ました、

さらには、このブログを続けていったおかげで、2011~2012年度のIBM Championにも選出されました。先に選ばれた日本人Championのお三方の事を考えると、本当に筆者なんかで良いのか?とも考えてしまいますが、選ばれた以上は、それだけの事はしていきます。


さて、今年最後の記事を読む前に、最早、「言われなくても押してやるよ・・・」と思われているボタンを押してください。
にほんブログ村 IT技術ブログへ






それでは、前回の終わりで予告したように、今回は「蔵書の返却期限に意味を持たせる」ということを考えてみましょう。
色々と実現方法は考えられますが、今回はオーソドックスに「督促メールを送信する」という
事にします。
そう言う意味では、今回はあまりXPagesには触れないかもしれませんが・・・

では、仕様を確認しながら、実装方法を考えていきます。
督促メールを送るのは、貸し出されている蔵書の返却期限を過ぎているものに対してです。
従って、「蔵書貸出」ビューに表示されている文書のうち、返却期限が昨日以前のものが対象です。

「蔵書貸出」ビューの文書を全部取得して、1文書ずつ返却期限を確認しても良いのですが、貸出文書が増えてくると、時間がかかってしまいます。

そこで、「返却期限」を過ぎた「蔵書貸出」文書だけを表示するビューを作成します。

新規に「返却期限切れ」(別名:TimeExpire)という名前でビューを作成します。
ビューの選択式は、「SELECT Form ="Lending" & ( Status = "貸出中" & LendingTerm < @Today )」とします(下図参照)。
返却期限切れビューの作成

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


次に、督促メールを送るエージェントを作成します。
エージェントの名前は、「ReturnReminder」としてください(下図参照)。
督促メール送信エージェントの作成


コードは以下のように記述してください。
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リンクになっているので、対象となる蔵書貸出文書が直接開かれる事はないですが、今回はサンプルなので、ここまでとしておきます。



その他にもまだまだ問題点はありますが、実装そのものはここで終了とします。

次回は、XPages アプリケーションとしての設定を行います。


あと、1~2回でこの連載は終了となります。
目標としていた年内の完結は無理でしたが、実装自体は完了したので良しとさせてください。

来年は、今までのようにtips記事を増やすようにしていきます。
LotusScript、@関数の他に、XPagesのtipsもお届けできるようにしますので、ご期待ください。


それでは、来年も筆者共々、このブログをよろしくお願いします。


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

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 カスタマイズとセキュリティ強化 - 株式会社エフ

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 カスタマイズとセキュリティ強化 - 株式会社エフ

2011年12月19日月曜日

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

えー・・・なんと二日続けての更新です(執筆開始時の時刻です)。
さすがに、入力チェックのことを書くのに、一週間も空けるのは・・・という次第です。

実は、この部分も昨日中に書いてしまおうかと思ったのですが、入力チェックの方法を
「ど忘れ」してしまい、調べるのに時間がかかったので、持ち越したというのが真相です。
筆者でもこんなことはあります。
題名通り、もうおじさんです・・・


さて、そんなおじさんを応援してから読んでくださいね。
にほんブログ村 IT技術ブログへ



ということで、入力チェックについてです。


XPagesの機能として、提供されている入力チェック方法は(筆者が知りうる限り)2つです。
(他にもご存じの方がいれば、読んだ後にコメントくださいm(_ _)m)

それぞれ、実装しながら、紹介していきます。

では、まずは「蔵書登録/編集」画面に入力チェック機能を実装しましょう。
「BookResource」カスタムコントロールを開きます。

フィールド数が少ないので、全部に入力チェックをかけても良いのですが、今回は「蔵書名」に入力チェックをかけます。
蔵書名のフィールド(BookName)を選択します。
「プロパティ」ビューの「妥当性検査」タブを開きます(下図参照)。
妥当性検査タブ

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


ちなみに、その右側にある「長さバリデータ」の箇所に、数値を入力しておくと、フィールドに入力された文字数が範囲外の時はエラーとして扱う事が出来ます。
※蔵書名は、長さ制限を設ける必要がないため、ここは何も設定しません。

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

[キャンセル]ボタンを選択した状態で、「イベント」ビューを開きます。
「サーバーオプション」の中にある「データの検証または更新を行わない」にチェックをつけます(下図参照)。
データの検証または更新を行わない

これで保存します。

※ 2011/12/21 追加
[キャンセル]ボタンですが、次の方法でも、「データの検証または更新を行わない」にチェックをつけることが可能です(情報提供者は、S山さんです。ありがとうございます)。
ボタンコントロールを選択して、「プロパティ」ビューを開きます。
「ボタン」タブにある「ボタンの種類」を"ボタン"から"キャンセル"に変更します(下図参照)。
ボタンを「キャンセル」ボタンに変更する

この状態で、ボタンコントロールの「イベント」ビューを見ると、あら不思議。
確かに「データの検証または更新を行わない」にチェックが付いています。
ということで、こちらの方がボタンの用途もはっきりとしてわかりやすいですね。
是非、覚えておきましょう。
ちなみに、「データの検証または更新を行わない」にチェックをつけたボタンは、自動で「ボタンの種類」が"キャンセル"になります。併せて覚えておきましょう。




次に、タブを選択されたときの動作から入力チェックを外します。
「container」カスタムコントロールを開きます。

その中にあるタブパネルの「蔵書一覧」を選択して「イベント」ビューを開きます。
先ほどと同じく「データの検証または更新を行わない」にチェックをつけます(下図参照)。
データの検証または更新を行わない2

設定できたら、「貸し出し一覧」のタブのイベントも同様に設定してください。
これで「container」カスタムコントロールを保存します。


ここで、実際にエラーはどのように表示されるのかをプリビューしてみました(下図)。
入力チェックによるエラーダイアログの表示

ノーツアプリケーションでよく見るような画面ですね。
プリビューはノーツクライアントで行いましたが、ブラウザでもほぼ同じ画面になります。このあたりは、さすがXPagesと言ったところでしょうか(従来のノーツWebアプリケーションではこうはいきません)。
ちなみに、[キャンセル]や「蔵書一覧」「貸し出し一覧」のタブをクリックしても、入力チェックは働きません。

ただ、この場合、一度に一つのフィールドしかチェックできません。このサンプルのように入力チェックのフィールドが少なければそれでも良いのでしょうが、10個くらいの入力チェックのフィールドがあったら、その都度エラーを表示されるのは、面倒です。
そんなときは、次の方法を使うと良いでしょう。

ということで、エラーメッセージをダイアログではなく、入力ページ上に表示させてみます。
再度、「BookResource」カスタムコントロールを開きます。

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

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

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

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


こちらについても、プリビューテストを行ってみました(下図)。
エラー表示コントロールによるエラーメッセージ

エラーメッセージが入力ページ内に表示されますね。「エラー表示」コントロールをうまく配置すれば、どのフィールドでエラーが発生しているのかもわかりやすくなります。

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

このとき、「貸出日」「返却期限」はそれぞれ最小値、最大値の設定も行います。
「貸出日」の最小値は、@Today(下図参照)、
「返却期限」の最大値は、@Adjust(@Today(),0,0,14,0,0,0)
とします。
貸出日の妥当性検査

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

下図は、このプリビューです。
複数のエラーメッセージの同時表示

確かに同時に複数のエラーメッセージが表示されています。



これで、「蔵書登録/編集」画面、「蔵書貸出」画面の入力チェックが完了しました。

次回は、いよいよ「蔵書の返却」について、取り扱います。
お楽しみに!




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

2011年12月18日日曜日

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

すっかり、週末更新ブログとして定着してしまった感がありますが、そんな事はありません!
週末(及び祝祭日)以外にも更新するようにしますよ。
間違っても、筆者の事を「週末ブロガー」とか呼ばないようにしてくださいね。

実際、今年は一週間に一本も書いてないんですよね。これではブロガーとは呼べませんものね。
ということで、もっと更新回数を増やすようにしますので応援よろしくお願いします!!

では、応援ボタンをポチッと押してから先へどうぞ。
にほんブログ村 IT技術ブログへ




さて、前回は・・・
そうですね。

「1.蔵書登録/編集画面から貸出が出来ない。」を実現させました。
ですが、最後にクイズ?にしたように、もう少しだけやることがあります。
このブログの読者の皆様は分かったでしょうか?

そうです。「蔵書登録/編集」画面のStatusを"貸出中"に変更したけど、
そもそもそんなフィールドは用意していないし、「蔵書登録/編集」のXPageや「蔵書一覧ビュー」XPageに表示するようにしていないのです。


では、それらを実際に設定してみましょう。
解決するべき問題点で言えば、「3.蔵書登録と蔵書貸出が連動していないので、蔵書が貸出可能状態にあるのかどうか不明。」になります。

まず、Statusフィールドです。通常、ノーツ文書に登録するフィールドは、フォーム上で定義しておく必要がありますが、これは必須ではありません。
前回作成したような、エージェントによるバックエンドでの更新であれば、フォームにフィールドを作成しておく必要はないのです。
ですので、今回は、フォームにはStatusフィールドは作成しない状態で進めます。

しかし、XPageにはこのフィールドを追加する必要があるので、「蔵書登録/編集」画面が定義してある「BookResource」カスタムコントロールを開きます。


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

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

「ラベル」のラベルは、"状況:"に変更します。
「計算結果フィールド」は、「プロパティ」ビューの「値」タブを開いて、次のように変更します。
・「使用するバインドデータ」は、"JavaScript"に変更します。
・「JavaScript(サーバサイド)」のエディタ部分には、
document1.getValue( "Status" )
と記述します(下図参照)。
計算結果フィールドの値


上記の式の内容ですが、
document1というのは、「蔵書登録/編集」文書をXPagesに連結させたデータなので、文書中にあるStatusの値を取得するというものです。

これで、「蔵書登録/編集」のXPageを開いたときに、その蔵書が貸出中ならば、"貸出中"と表示されます。

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


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

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

ビューの列に「状況」を追加

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


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



順番が前後しましたが、「2.そのため、蔵書を貸し出しするのに、蔵書名を選択する必要がある。」についても、何か良い案がないか考えてみましょう。

まず、どんな問題なのかの再認識から。おじさんSEが学ぶXPages(9)で「蔵書貸出」のボタンを作成しました。
これは、単純に「蔵書貸出」画面を表示するだけなので、蔵書名が選択されない状態なので、正しい蔵書名を入力する必要があるのです。

解決方法はいくつか考えられますが、今回はXPagesの機能の一つである「タイプアヘッド」を使ってみましょう。


タイプアヘッドは、編集ボックスに何か入力されたら、それに関連する候補の一覧を表示するというものですので、貸出可能な蔵書の候補が表示される必要があります。
貸出可能な蔵書名の一覧は、現時点では、どこにもありませんので、専用のビューを作成しましょう。
ビューは、「蔵書一覧」をコピーして作成します。
変更点は、次の通り。
名前は、「在庫一覧」
別名は、「NonLendingBooksCollection」
選択式は、「SELECT Form ="BookResources" & Status =""」
これで、完了です。

次に、「LendData」カスタムコントロールを開きます。
蔵書名にタイプアヘッドを仕掛けることになります。
そこで、「BookName」の編集ボックスを選択した状態で、「プロパティ」ビューを開きます。
すると、その中に「タイプアヘッド」タブがあるので、選択します。
そうしたら、「タイプアヘッドを有効化」にチェックをつけます(下図参照)。
「タイプアヘッド」タブ

今度は、以下の変更を行います。
「モード」は"部分"に変更します。
「大文字と小文字を区別する」のチェックは外します。
そして、「候補」ボックスの右にある◇をクリックして、「値の計算...」を選択します。

候補は、さきほど作成したビューの1列目なので、
@DbColumn(@DbName(), "NonLendingBooksCollection", 1)
とします。
候補を表示する関数

記述できたら、[OK]をクリックします。
すると、「候補」の箇所が「{計算済み}」に変わります。

これで、タイプアヘッドの機能が完成です。
簡単ですね。
ちなみに、蔵書名が日本語(漢字含む)であっても、しっかりと反応してくれます。


今回は短いですが、ここまで。

次回は、返却関連ではなく、「6.蔵書登録/編集画面、蔵書貸出画面ともに入力チェックが行われていない。」について、作業を行います。







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


2011年12月11日日曜日

Lotus夜Day2011に参加しましたよ

「めそ凹 すね丸」さんがブログで書いていましたが、Lotus夜Day2011に参加してきました
筆者も参加してきました。

めそ凹 すね丸さんと一緒に受付していたおっさんが筆者です。
今回は、サプライズもあったり、初のプレゼンもあったりしたので、参加者の皆様は筆者の顔を覚えていただけたのではないかと思います。
本当は、もっとたくさんの方と名刺交換をさせていただきたかったのですが、
受付があらかた終わった頃には、もうそれぞれの座席で盛り上がっていたので、
引っ込み思案な筆者は、積極的に話しかけられませんでした・・・orz
次回は、もう少し積極的になるので、名刺交換を是非是非よろしくお願いします。
会の方は、なんと開始が1時間遅れの20:00からという大ハプニング。
まぁ、単純に参加メンバーが多すぎて、なかなか集まらなかったので、個々に始めていたという感じですが。

乾杯の音頭は、米国IBMのMr. ted.
なんと、R4.6のSMTPのコードを書いていたらしいです。その場では言いませんでしたが、当時、筆者はこれにはやられまくってました。
お客様先までで張って、真夜中まで復旧作業を行った記憶がよみがえりました。


ちなみに、通訳には、@munesoraさんと、@morimo_tさん。
@morimo_tさんは、雰囲気で訳す!と豪語していましたが、あの度胸はさすがです。

十分伝わったかと思います。

なんどか、米国からゲストがいらっしゃっていますが、皆さん感想は同じ。
「クレイジー、クラウディ」だそうです。
米国でも、これくらいの方々はいるような気はするのですが・・・


プレゼンは、
@hira2kさんから。
今回も目から鱗が落ちるようなノーツの使い方を教えてくださいました。
あの発想力はすごいですね。どんな頭の構造してんだろう??と思う筆者でした。

つづいて、
@dotnsfさん。
ノーツでTET●○◇を動かすって、発想もやっぱりすごい。
その発想を実現させてしまう技術力も半端ないっす。

そして、筆者です。
いやぁ、他にもいるのかなぁ?と思って、やりまーすなんて言ったら、
なんでしょう、上の二人に続くのっておかしくないか!?

しかも、筆者の予想を裏切って、若い技術者さんは来るし!
あ、来ていただいて良いんですよ、むしろその方が嬉しいし。

次回、プレゼンを行う機会がありましたら、勉強しておきますm(_ _)m


筆者の後を継いでいただいたのが、@morimo_tさん。
マンホールはないだろう、じゃぁガ○ダムか?とか思い巡らせていたら、
マンホールでした・・・
ま、まさかの2年連続です。

でも、楽しければ良いんです。
ただ、今回はホント難しかったです。もうちょっとレベル下げてください。お願いします。


と、そんなこんなで、閉会の時間が迫ってきたところで・・・

下は、恒例のLotus夜Dayケーキです。今年は、ろうそくの火がケーキに燃え移るまで放置したというトラブルもありました。
ちなみに、毎年ちょっとはつまんでいた筆者ですが、他に食べたそうな方がいらっしゃったので、今年は遠慮しちゃいました。

恒例のLotus夜Dayケーキ

そして、これも恒例のお土産奪取大会!
今回は、日本IBM様と、チームスタジオジャパン様がお土産を提供してくださいました。
ルールは至って簡単。じゃんけんに勝てばよいのです。

日本IBM様との戦い?では、筆者は、Lotus SoftwareのPCバッグを手に入れました。うれしー!

Lotusグッズ
チームスタジオジャパン様との戦いでは残念ながら負けてしまいましたが、
運良くTシャツをゲットしました!これもうれしー!
チームスタジオジャパングッズ

その他、参加者全員サービスでは、Lotus softwareロゴ入りブックカバー等がもらえました。
これまたうれしー!ですね。


筆者は、一次会で帰宅の途につきましたが、10名ほどが2次会に参加されたようです。
そこでは、一次会に参加できなかった@DOMINOMARUさんもいらっしゃったようで、
なんだ、無理してでも二次会に参加すれば良かった!とちょびっと後悔した筆者でした。



それにしても、毎回毎回、色々な企画を考えていただいているchabozuさんには感謝感謝です。
今回は、具合が悪い中、賢明にMCをやっていただきました。
本当にお疲れ様でした。



今年は、熱海のあたりでLotus夜Day合宿があるとかないとか。
楽しみですね。
もちろん、筆者は参加します!