XPagesでフィールドに”年月日のみ”、”時刻のみ”の値を設定する方法
XPagesでの日付の保存では常に年月日、時刻の両方が保存される
“年月日のみ”もしくは、“時刻のみ”と設定されているフィールドを持つ文書をNotesクライアントで保存をした場合と、XPagesで保存をした場合で保持されるデータの持ち方が変わってくるということが今回のブログのトピックになります。
例を上げると、以下のようなフィールド、日付の表示(年月日のみ)
もしくは、時刻の表示(時分)
といったケースです。
これを試しにNotesクライアント(Ver 9.0.1 FP3)で保存してたところ、以下が通常のNotesクライアントでのデータの保存結果になります。
Dateフィールドでは「2015/03/02」、Timeフィールドでは「14:35:00」というようにそれぞれ年月日、時刻のみが格納されます。
では、このフォームを元にXPagesから文書作成をした場合どうなるか、簡単なXPagesを作成して試してみました。
DateフィールドとTimeフィールドのXPagesソースコードは以下のとおりです。
Dateフィールド
<xp:inputText value="#{document1.Date}" id="date1"> <xp:dateTimeHelper id="dateTimeHelper1"></xp:dateTimeHelper> <xp:this.converter> <xp:convertDateTime type="date" dateStyle="short"> </xp:convertDateTime> </xp:this.converter> </xp:inputText>
Timeフィールド
<xp:inputText id="time1" value="#{document1.Time}"> <xp:dateTimeHelper id="dateTimeHelper2"></xp:dateTimeHelper> <xp:this.converter> <xp:convertDateTime type="time" timeStyle="short" timeZone="Japan"> </xp:convertDateTime> </xp:this.converter> </xp:inputText>
それぞれ、フィールドのTypeをdate, timeと指定しています。
このXPagesで保存した後、フィールドに格納されたデータを見てみると、
両方が「yyyy/MM/dd hh:mm:dd ZZ」のフォーマットで保存されていることが確認できます。
なぜ”年月日のみ”、”時刻のみ”が必要か?
上記の比較からどちらのデータの持ち方が正しいということが今回の主旨ではありません。
実際には、Notesクライアントで使ってきたNSFをXPagesを使ってWEB化したい、というケースが多いと思います。そしてNotesクライアントとXPagesの両方でNSFを使い続けるといった場合、やはりXPagesがNotesクライアントの仕様に合わせる必要が出てきます。
前置きが長くなりましたが、今回はXPagesでも”年月日のみ”、”時刻のみ”のフィールドを設定する簡単な方法をご紹介します。
NotesDateTimeを使って整形しよう
やり方は幾つかあるとおもいますが、
SSJSのNotesDateTimeクラスを使って整形してやることが出来ます。
<xp:this.data> <xp:dominoDocument var="document1" formName="Form" computeWithForm="both"> <xp:this.postSaveDocument><![CDATA[#{javascript: var dt:NotesDateTime = document1.getItemValueDateTime("Date"); dt.setAnyTime(); var tm:NotesDateTime = document1.getItemValueDateTime("Time"); tm.setAnyDate(); var notesDoc:NotesDocument = document1.getDocument(); notesDoc.replaceItemValue("Date", dt); notesDoc.replaceItemValue("Time", tm); notesDoc.save(); dt.recycle(); tm.recycle(); notesDoc.recycle(); }]]></xp:this.postSaveDocument> </xp:dominoDocument> </xp:this.data>
このコードではXPagesで一旦文書保存した後のPostSaveDocumentイベント内でNotesDateTimeクラスのsetAnyTime()、setAnyDate() を使うことで、思った通りのフォーマットに整形しています。
いかがでしたでしょうか?
今回は既存NSFをWEB化する際に躓きがちなDateTimeフィールドの情報でした。
ktatsuki
ケートリック株式会社 CEO & CTOをしています。
Notes/Dominoの開発を得意としますが、 C++ / Java / PHP / Javascript などの言語を使ってWEBアプリ、iPhone / Android アプリ開発などをしたりします。
XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。
I am owner of KTrick Co., Ltd. and Notes/Domino developer. HCL Ambassador (IBM Champion for 2015 - current). I am interested in web application development and preferred languages are Notes/Domino, C++ / Java / PHP / Javascript.
Related Posts
4 Comments
Add comment コメントをキャンセル
このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
Thanks. This is exactly what I needed.
お世話になります。年月日のみを文書格納したくこちらへたどり着きましたが、setAnyTime()を使用しても、どうしても日付のみとならず時刻が付与された形式にて作成されてしまいます。なにか見落としがありますでしょうか。
xp:this.beforeRenderResponseにて、
var tempRenewalYear = (document1.getItemValueString(“RenewalYear”));
var tempRenewalMonth=( document1.getItemValueString(“RenewalMonth”));
var tempRenewalDay = (document1.getItemValueString(“RenewalDay”));
var tempRenewal = tempRenewalYear + “/” + tempRenewalMonth + “/” + tempRenewalDay;
var ndt:NotesDateTime = session.createDateTime(tempRenewal + ” 00:00:00″);
ndt.setAnyTime();
document1.replaceItemValue(“Renewal”, ndt);
document1つまり、NotesXspDocumentオブジェクトに対してreplaceItemValue() をしているようです。
ブログ内のサンプルにあるように
var notesDoc:NotesDocument = document1.getDocument();
としてNotesDocumentオブジェクトに対してreplaceItemValue()するようにしてみてはどうでしょうか?
(ソースだけを見て返事しているので検討ちがいかもしれません、その時はまたここに書き込んでください)
早速のアドバイスをありがとうございます。
結果、期待する動作を確認できました(_ _)謝々
頂戴したアドバイスと下記を組み合わせることで
document1の“Renewal”へ年月日のみ(時刻なし)を
格納することができました。
おかげさまで抱える課題の一つが解決できました。
今後ともよろしくお願いいたします。
※サンプルコードより
13行目> var notesDoc:NotesDocument = document1.getDocument(true);
16行目> //notesDoc.save(); ←後続でdocument1.save()を実行