2016-12-19 3 views
0

を使用しています。元のNotesビューの日付値に基づいて文字列を計算しようとしています。ビューの最初の2つの列はそれぞれStartDateとEndDateです。日付比較のためのODAのisBeforeメソッドとisAfterメソッドの使用XPageリピートコントロールで

私のコード(下記参照)では、printステートメントはうまく動作し、素敵な日付けをコンソールに表示します。それが日付比較になるとすぐに、それはいくつかの恐ろしい誤りを投げます。コンソールへ

var vReturn = "unknown"; 
try { 
    var vNow = new java.util.Date(); 
    var vDateToday:org.openntf.domino.DateTime = session.createDateTime(vNow); 
    print("Today=" + vDateToday); 
    var vStartDate:org.openntf.domino.DateTime = row.getColumnValues()[0]; 
    print("vStartDate=" + vStartDate); 
    var vEndDate:org.openntf.domino.DateTime = row.getColumnValues()[1]; 
    print("vEndDate=" + vEndDate); 

    if (vDateToday.isBefore(vStartDate)) { 
     vReturn = "Forthcoming"; 
    } 
    if (vDateToday.isAfter(vStartDate) && vDateToday.isBefore(vEndDate)) { 
     vReturn = "Current"; 
    } 
    if (vDateToday.isAfter(vEndDate)) { 
     vReturn = "Completed"; 
    } 

}catch(e){ 
    print("Travellog: " + e.toString()); 
} 
return vReturn; 

最初のダースかそこらのライン出力は次のようになります。

19/12/2016 11:25:45 HTTP JVM: Today=19/12/2016 11:25:45 GMT 
19/12/2016 11:25:45 HTTP JVM: vStartDate=19/12/2016 00:00:00 GMT 
19/12/2016 11:25:45 HTTP JVM: vEndDate=27/12/2016 00:00:00 GMT 
19/12/2016 11:25:45 HTTP JVM: java.lang.NullPointerException 
19/12/2016 11:25:45 HTTP JVM:  at org.openntf.domino.xsp.script.WrapperOpenDomino$OpenFunction.call(WrapperOpenDomino.java:400) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.types.BuiltinFunction.call(BuiltinFunction.java:75) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.types.FBSObject.call(FBSObject.java:161) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.ASTTree.ASTCall.interpret(ASTCall.java:197) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.ASTTree.ASTIf.interpret(ASTIf.java:79) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.ASTTree.ASTBlock.interpret(ASTBlock.java:100) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.ASTTree.ASTTry.interpret(ASTTry.java:109) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.ASTTree.ASTProgram.interpret(ASTProgram.java:119) 
19/12/2016 11:25:45 HTTP JVM:  at com.ibm.jscript.ASTTree.ASTProgram.interpretEx(ASTProgram.java:139) 
... 

私はそうのようなsession.CreateDateTimeでgetColumnValuesをラップ試してみました:

var vStartDate:org.openntf.domino.DateTime = session.createDateTime(row.getColumnValues()[0]) 

それはスローエラーもあります。

誰でも正しい方向に向けることができますか?私は考えることのできるあらゆるバリエーションを試しました!

P.S. OpenNTF Dominoのサンプルデータベースの例はシンプルに見えますが、現在のシステム日付のみを使用し、ドキュメントや表示項目の日付は使用しません。

+0

アプリケーションで 'org.openntf.domino.xsp = godmode'を有効にしましたか?また、 'getColumnValues()'の結果に '.getClass()。getName()'を出力する価値があります。 –

+0

はい、私はgodmodeを有効にしました。 '.getClass()。getName()'を出力するprint文をいくつか追加し、両方のカラムに 'lotus.domino.localDateTime'を返します。 – Rob

+0

' row'はどうですか?それは 'NotesViewEntry'か' NotesXspViewEntry'ですか?列を 'org.openntf.domino.DateTime'として取得するには、バックエンド' NotesViewEntry'を取得する必要があります。これは私たちが拡張したものであり、 'NotesXspViewEntry'ではありません。 –

答えて

0

ポールのコメントNotesViewEntryNotesXspViewEntryの違いが正しいと私が指摘しているところです。私のコードは繰り返し制御されており、繰り返し制御がNotesXspViewEntriesを返すことが分かります。基本的なNotesViewEntryを手に入れようとしたが、Tim Tripconeyのコメント(How do I get the parent NotesViewEntry from the NotesXSPViewEntry?を参照)を読んだ後に、基盤となるドキュメントに進むことにしました。ここに私のコードはあります:

var vReturn = "unknown"; 
try { 
    var vNow = new java.util.Date(); 
    var vDateToday:org.openntf.domino.DateTime = session.createDateTime(vNow); 
    var vDoc:NotesDocument = row.getDocument(); 
    var vStartDate:org.openntf.domino.DateTime = vDoc.getItemValueDateTimeArray("DateStart").get(0); 
    var vEndDate:org.openntf.domino.DateTime = vDoc.getItemValueDateTimeArray("DateEnd").get(0); 

    if (vDateToday.isBeforeIgnoreTime(vStartDate)) { 
     vReturn = "Forthcoming"; 
    } 
    if ((vDateToday.equalsIgnoreTime(vStartDate) || vDateToday.isAfterIgnoreTime(vStartDate)) 
     && (vDateToday.equalsIgnoreTime(vEndDate) || vDateToday.isBefore(vEndDate))) { 
     vReturn = "Currently Away"; 
    } 
    if (vDateToday.isAfterIgnoreTime(vEndDate)) { 
     vReturn = "Completed"; 
    } 

}catch(e){ 
    print("Travellog: error in itinerary status link on home page: " + e.toString()); 
} 
return vReturn; 

私はおそらくそれをもう少しロバストにする必要があります。日付フィールドの1つに値が含まれていない場合(値のない日付フィールドには空文字列が返されるため、.getItemValueDateTimeArrayにエラーがスローされます)。

ご協力ありがとうございます。もう一度あなたはコーディングの底の穴から私を引き出しました!

1

列に日付が表示されていないようです。そのデモ・データベースに次のボタンのコードは私のために成功裏に動作します:

<xp:button value="Run SSJS Tests" id="button4" 
        xp:key="SSJSButton"> 
        <xp:eventHandler event="onclick" submit="true" 
         refreshMode="partial" refreshId="SSJSDiv"> 
         <xp:this.action><![CDATA[#{javascript:try { 
var now = new java.util.Date(); 
var vw:NotesView = database.getView("AllContacts"); 
var ec:NotesViewEntryCollection = vw.getAllEntries(); 
var ent1 = ec.getFirstEntry(); 
var ent2 = ec.getNextEntry(); 
print(ent1.getColumnValues()); 
print(ent1.getColumnValues().get(6).getClass().getName()); 
var date1:org.openntf.domino.DateTime = ent1.getColumnValues().get(6); 
var date2:org.openntf.domino.DateTime = ent2.getColumnValues().get(6); 
date1.adjustDay(1); 
retVal = "Running SSJS date1.isAfter(date2)<br/>"; 
if (date1.isAfter(date2)) { 
    retVal += @Text(date1) + " is after " + @Text(date2) + "<br/>"; 
} else { 
    retVal += @Text(date1) + " is NOT after " + @Text(date2) + "<br/>"; 
} 
retVal += "<br/><br/>Running SSJS date2.isAfter(date1)<br/>"; 
if (date2.isAfter(date1)) { 
    retVal += @Text(date2) + " is after " + @Text(date1) + "<br/>"; 
} else { 
    retVal += @Text(date2) + " is NOT after " + @Text(date1) + "<br/>"; 
} 
viewScope.put("SSJSTest",retVal); 
} catch (e) { 
    @ErrorMessage(e.toString()); 
}}]]></xp:this.action> 
         </xp:eventHandler> 
        </xp:button> 

おそらくより良いオプションはrow.setPreferJavaDates()を使用することです。これにより、NotesDateTimeの代わりにJava Date(java.util.Date)が出力されます。それはまた、リサイクルの必要性を取り除く。 isBefore()isAfter()メソッドは、NotesDateTimejava.util.Dateに変換し、そのクラスで使用可能な内蔵のisBefore()isAfter()のメソッドを使用します。

関連する問題