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

Тема в разделе "Lotus - Программирование", создана пользователем oshmianski, 6 фев 2014.

  1. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    521
    Симпатии:
    13
    Дано:

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

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

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Странный у вас лотусскрипт. У меня работает.

    Код (LotusScript):
        'Нужно: если 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
    Может, что в полях документа не так?
     
  3. Domino-Designer

    Domino-Designer Lotus team
    Команда форума Lotus team

    Регистрация:
    6 дек 2011
    Сообщения:
    128
    Симпатии:
    6
    2garri:

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    В данном случае поведение LS оправдано, в первой дате нет времени, во второй есть.
    При вычитании он не развернет dtStart в "01.02.2014 00:00:00", он наоборот обрежет dtEnd до "01.02.2014" и результат будет 0.
    А вот если сделать инициализацию Set dtStart = New NotesDateTime("01.02.2014 00:00:00"), то разница уже будет <0
    Так что если есть подозрение, что в дате есть время и оно должно влиять на отбор, то лучше инициализировать со временем.
     
  5. oshmianski

    oshmianski Достойный программист
    Lotus team

    Регистрация:
    25 апр 2012
    Сообщения:
    521
    Симпатии:
    13
    Для меня не было очевидным, что обрежется дата со временем, а не развернется дата без.
    И не смотря на это, doc.getFirstItem("dateStart").Datetimevalue возвращает дату с добавленным временем.
    Т.е. конструкции New NotesDateTime и Datetimevalue работают по-разному, я об этом.
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Да, не очевидно, думаю это связано с TimeZone.
    Когда делаешь объект только из даты или только времени, то TimeZone не устанавливается, следовательно в какое время преобразовывать?
    Может дата хранится в TimeZone = 0, а вычитаем мы TimeZone = 4, как LS поймет к какой зоне приравнивать 0 или 4?
    Даже если локальные настройки брать, может у вас TimeZone = 3 и что тогда?)
    Datetimevalue: насколько я замечал в Item date/time всегда указывается TimeZone, так что время может быть возвращено верно.
     
  7. motogarri

    motogarri Well-Known Member

    Регистрация:
    17 фев 2010
    Сообщения:
    188
    Симпатии:
    4
    Прошу прощения не заметил. То же самое. Результат = 0
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    ну раз так...
    рекомендую поиграться (актуально для 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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Точно нигде не ошибся?)

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

    Вложения:

    • LN9.png
      LN9.png
      Размер файла:
      14,1 КБ
      Просмотров:
      73
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    вот как-то так
    DateTime.png DateTime1.png
    DateTime3.png DateTime2.png
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    в 9-ке - тоже, с оговорками:
    -9-ка под линухами (нативная), хотя, полагаю - в вендятке будет также
    -форма делалась под 7.04 дизигнером
     
Загрузка...

Поделиться этой страницей