2016-12-19 9 views
0

в контроле повторения XPage Я пытаюсь вычислить строку на основе значений даты в базовом представлении Notes. Первые два столбца вида - StartDate и EndDate соответственно.Использование методов ODA isBefore и isAfter для сравнения дат

В моем коде (см. Ниже) операторы печати прекрасно работают и печатают прекрасные даты на консоли. Как только он добирается до сопоставления даты, он вызывает некоторые ужасные ошибки.

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) 
... 

Я попытался обертывание getColumnValues ​​в session.CreateDateTime так:

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

но броски ошибки тоже.

Может ли кто-нибудь указать мне правильное направление? Я пробовал все варианты, о которых я могу думать!

P.S. Примеры в базе данных примеров OpenNTF Domino выглядят просто, но они используют только текущую системную дату, никогда не записываются в документы или просмотреть записи.

+0

У вас есть 'org.openntf.domino.xsp = godmode' включен в приложении? Кроме того, стоит вывести '.getClass(). GetName()' на результат 'getColumnValues ​​()'. –

+0

Да, у меня включен godmode. Я добавил несколько операторов печати для вывода '.getClass(). GetName()' и оба столбца возвращают 'lotus.domino.localDateTime' – Rob

+0

Как насчет' row'? Это «NotesViewEntry» или «NotesXspViewEntry»? Возможно, вам понадобится получить backend 'NotesViewEntry', чтобы получить столбец как' org.openntf.domino.DateTime'. Это тот, который мы расширили, а не 'NotesXspViewEntry'. –

ответ

0

Комментарий Павла, где он указывает, что существует разница между NotesViewEntry и NotesXspViewEntry, указал мне в правильном направлении. Мой код находится в режиме повторного управления, и оказывается, что элементы управления repeat возвращают NotesXspViewEntries. Я испортил попытку получить базовый NotesViewEntry, но после прочтения комментария Тимом 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).

Спасибо за помощь. Еще раз вы вытащили меня из бездонной ямы кодирования!

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(), доступные в этом классе.