在XPage重复控件中我尝试根据基础Notes视图中的日期值计算字符串。视图的前两列分别是StartDate和EndDate。
在我的代码中(见下文),打印语句工作正常,并在控制台上打印可爱的日期。一旦达到日期比较,它就会引发一些可怕的错误。
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 :(得分: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()
。然后确保输出Java日期(java.util.Date
)而不是NotesDateTime
。这也消除了回收的需要。 isBefore()
和isAfter()
方法只需将NotesDateTime
转换为java.util.Date
,并使用该类中可用的内置isBefore()
和isAfter()
方法反正。
答案 1 :(得分:0)
保罗的评论指出,NotesViewEntry
和NotesXspViewEntry
之间存在差异,指向正确的方向。我的代码处于重复控制中,结果是重复控件返回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;
我可能需要让它更健壮 - 例如如果其中一个日期字段不包含值(因为没有值的日期字段返回一个空字符串,导致.getItemValueDateTimeArray
抛出错误)。
谢谢你的帮助保罗。再一次,你把我拉出编码无底坑!