Особенность Работы Ls

oshmianski

Достойный программист
Lotus team
25.04.2012
547
13
#1
Дано:

1. Документ doc.
2. Поле dateStart, тип Time/Date, значение 01.01.2014.
3. Поле dateEnd, тип Time/Date, значение 01.01.2014 12:00:00.

Нужно: если dateStart < dateEnd, то выполнить функцию processSomething().

Реализация:

Dim dtStart as NotesDateTime
Dim dtEnd as NotesDateTime

Set dtStart = New NotesDateTime(doc.getItemvalue("dateStart")(0))
Set dtEnd = New NotesDateTime(doc.getItemvalue("dateEnd")(0))

if(dtStart.Timedifference(dtEnd) < 0) Then
Call processSomething()
End If

В данном случае функция processSomething вызвана не будет, т.е. считается, что dtStart НЕ МЕНЬШЕ dtEnd.

Правильная реализация:
...
Set dtStart = doc.getFirstItem("dateStart").Datetimevalue
Set dtEnd = doc.getFirstItem("dateEnd").Datetimevalue
...

Будьте внимательны!!!
 

motogarri

Well-Known Member
17.02.2010
200
4
#2
Странный у вас лотусскрипт. У меня работает.

Код:
	'Нужно: если dateStart < dateEnd, то выполнить функцию processSomething().

Dim dtStart As NotesDateTime
Dim dtEnd As NotesDateTime
Dim i As Double

Set dtStart = New NotesDateTime("01.02.2014")
Set dtEnd = New NotesDateTime("05.02.2014")

i = dtStart.Timedifference(dtEnd)
If i < 0 Then
MsgBox "Все норм! Лотусскрипт рулит! Разница в днях " + CStr(Abs(i) / 86400 ) '<- Сюда попадает
Else
MsgBox "Не сработало! Лотусскрипт - ацтой!"
End If
Может, что в полях документа не так?
 

Domino-Designer

Well-Known Member
Lotus team
06.12.2011
418
110
#3
2garri:

Код:
	Set dtStart = New NotesDateTime("01.02.2014")
Set dtEnd = New NotesDateTime("01.02.2014 12:00:00")
Топикстартер про такой вариант рассказывает.
LS ведет себя правильно. Так и должно быть.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#4
В данном случае поведение LS оправдано, в первой дате нет времени, во второй есть.
При вычитании он не развернет dtStart в "01.02.2014 00:00:00", он наоборот обрежет dtEnd до "01.02.2014" и результат будет 0.
А вот если сделать инициализацию Set dtStart = New NotesDateTime("01.02.2014 00:00:00"), то разница уже будет <0
Так что если есть подозрение, что в дате есть время и оно должно влиять на отбор, то лучше инициализировать со временем.
 

oshmianski

Достойный программист
Lotus team
25.04.2012
547
13
#5
В данном случае поведение LS оправдано, в первой дате нет времени, во второй есть.
При вычитании он не развернет dtStart в "01.02.2014 00:00:00", он наоборот обрежет dtEnd до "01.02.2014" и результат будет 0.
А вот если сделать инициализацию Set dtStart = New NotesDateTime("01.02.2014 00:00:00"), то разница уже будет <0
Так что если есть подозрение, что в дате есть время и оно должно влиять на отбор, то лучше инициализировать со временем.
Для меня не было очевидным, что обрежется дата со временем, а не развернется дата без.
И не смотря на это, doc.getFirstItem("dateStart").Datetimevalue возвращает дату с добавленным временем.
Т.е. конструкции New NotesDateTime и Datetimevalue работают по-разному, я об этом.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#6
Да, не очевидно, думаю это связано с TimeZone.
Когда делаешь объект только из даты или только времени, то TimeZone не устанавливается, следовательно в какое время преобразовывать?
Может дата хранится в TimeZone = 0, а вычитаем мы TimeZone = 4, как LS поймет к какой зоне приравнивать 0 или 4?
Даже если локальные настройки брать, может у вас TimeZone = 3 и что тогда?)
Datetimevalue: насколько я замечал в Item date/time всегда указывается TimeZone, так что время может быть возвращено верно.
 

motogarri

Well-Known Member
17.02.2010
200
4
#7
2garri:
Set dtStart = New NotesDateTime("01.02.2014")
Set dtEnd = New NotesDateTime("01.02.2014 12:00:00")

Топикстартер про такой вариант рассказывает.
LS ведет себя правильно. Так и должно быть.
Прошу прощения не заметил. То же самое. Результат = 0
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#8
ну раз так...
рекомендую поиграться (актуально для 7.0.4, выше не смотрел)
берем поля типа дата, задаем его отображение в виде Calendar/Time control
поля dateOnly с формулой трансляции @Date(@ThisValue) и отображением без времени
поле timeOnle с формулой трасляции @Time(@ThisValue) и отображением без даты
создаем Computed поле, формулой
v:=@Text(dateOnly) + " " + @Text(timeOnly);
@Adjust(@ToTime(dateOnly);0;0;0;23;120;60);
@Adjust(@TextToTime(v);0;0;0;23;120;60)

сначала, потом коментим нижнюю строку :crash:

Добавлено: и да... минуты м.б. любые, но не более 24*60, как и секунды не 24*3600 в первом Adjust

Добавлено: попутно интересно узнать - как получать дату с временем интерактивно, кроме как через текст ;), в формулах
 

savl

Well-Known Member
Lotus team
28.10.2011
2 126
163
#9
ну раз так...
рекомендую поиграться (актуально для 7.0.4, выше не смотрел)
берем поля типа дата, задаем его отображение в виде Calendar/Time control
поля dateOnly с формулой трансляции @Date(@ThisValue) и отображением без времени
поле timeOnle с формулой трасляции @Time(@ThisValue) и отображением без даты
создаем Computed поле, формулой
v:=@Text(dateOnly) + " " + @Text(timeOnly);
@Adjust(@ToTime(dateOnly);0;0;0;23;120;60);
@Adjust(@TextToTime(v);0;0;0;23;120;60)
Точно нигде не ошибся?)

Вывел через @Prompt, слева от * @Adjust(@ToTime(dateOnly);0;0;0;23;120;60), справа @Adjust(@TextToTime(v);0;0;0;23;120;60)
LN 9.0
 

Вложения

  • 14.1 КБ Просмотры: 73

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 492
367
#11
в 9-ке - тоже, с оговорками:
-9-ка под линухами (нативная), хотя, полагаю - в вендятке будет также
-форма делалась под 7.04 дизигнером