Выборка по дате и времени во ВЬЮ

Тема в разделе "Lotus - Программирование", создана пользователем masyna, 9 июн 2009.

  1. masyna

    masyna Гость

    Проблемма такая!!!
    Существует форма в которой есть поле datapostanovki (тип Data) и vremiyprinrehen (тип Time).
    Нужно сделать Вью в которой нужно сделать выборку данных за сутки по этим поля.
    Сутки начинаются с 20:00.

    Я только начал познавать озы Lotus Notes, и поэтому что то пока у меня ничего не получается.
    Вот как я делаю эту выборку сам:


    [codebox]SELECT ((Form = "ФОРМА")
    & (@Text(datapostanovki)>= @Text(@Date(@Yesterday)) & @Text(@Hour(vremiyprinrehen))>="20")
    & (@Text(datapostanovki)<= @Text(@Date(@Now)) & @Text(@Hour(vremiyprinrehen))<="20")[/codebox]


    Заранее всем благодарен, кто откликниться на эту проблему.

    P/S
    Да и еще один вопрос. Как распечатать ВЬЮ по своей форме Отчета?????
     
  2. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    не надо так делать!
    ужо скока говорено - там много граблей
    Чем не устроит пущать скрипт и получать выборку, либо (ежели задача позволяет) - встроенную вьюшку делать (с категорией отбора)
     
  3. masyna

    masyna Гость



    Желательно примерчик Скрипта ;)
     
  4. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0

    НИКОГДА во вьюшках не используйте @Now, @Today, @Yesterday!!!! Т.е. параметров, зависящих от времени. Это приводит к тому, что индекс видов никогда не актуален и индексёр его всегда перестраивает полностью. При большой БД, сервер только на вашу вьюшку будет работать.

    Используйте
    @TextToTime ("Сегодня") или @TextToTime ("Today")
    в зависимости от локали

    или скриптом с клиента меняйте формулу отбора раз в сутки через NotesView.SelectionFormula, устанавливая дату константой, типа

    myView.SelectionFormula = {SELECT (datapostanovki <= [} & CStr(Now) & {])}

    Правда, надо ещё обеспечить, чтоб только один пользователь раз в сутки инициировал операцию перестроения индекса при открытии данной вьюшки
    Call ws.ViewRebuild()
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    А альтернатива - ежедневный серверный агент, выполняющий updall для нужной вьюшки, здесь не покатит?
     
  6. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    OKEN
    А в принципе, почему бы и нет!? После такой существенной модификации, как SelectionFormula, и обычный Refresh должен бы приводить к ребилду индекса. На практике не доводилось использовать, но проверю на досуге. Если подтвердится, то и Updall'а будет достаточно или UI-обращения к автоматическому виду.
    (Кстати, может кто-то точно знает?)
     
  7. masyna

    masyna Гость

    Фильтрация просто по полю datapostanovki за сутки у меня работает!

    Код (Text):
    SELECT ((Form = "Неисправности")
    & (@Text(datapostanovki)>= @Text(@Date(@Yesterday)))
    & (@Text(datapostanovki)<= @Text(@Date(@Now)) )
    Но у меня еще есть поле vremiyprinrehen (время принятия решения), по которому тоже необходимо сделать фильтрацию.

    ВЬЮ Должна выводить данные, имеенно по этим полям, за сутки, причем сутки начинаются с 20:00, т.е. vremiyprinrehen должно быть >= 20:00 вчерашнего дня и <= 20:00 сегоднешнего дня!
     
  8. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    TIA
    Указанный случай изменения формулы отбора не использовался, поэтому заинтересовало.
    Было подобное решение с помощью @Environment.
    Но вот насчет настроенных свойств обновления этих представлений сейчас не подскажу.

    masyna
    Ну, стоило прислушаться к совету не использовать @Now.
    Что мешает через | добавить в представление аналогичное условие по второму нужному полю, правильно расставив скобки?
    Если 2-я дата в документе не указана, можно использовать проверку @IsTime.
    Возможно, конечно, я не поняла задачи и надо совместить их по &, т.е. отбирать только если оба поля содержат значения в рамках тек. суток?
    ps:
    Yesterday можно заменить на @Adjust(@Date(today); 0; 0; -1; 0; 0; 0);
    Даты стоит сравнивать как даты все-таки, а не как текст.
     
  9. masyna

    masyna Гость


    Именно так, нужно отбирать по & ;)

    И желательно побольше примеров, так как я начинающий ( да Ламер Я ;) )
     
  10. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Сорри, изначально невнимательно прочла условие - думала, что отбор по 2м независимым датам, а не дата + время.
    1. Немного извращенческий отбор в представление по дате и времени с @now в предположении, что дата datapostanovki содержит только дату -проверяется только равенство дат (может, я и не права, но я не думаю, что 20:00 должно учитываться двое суток подряд, поэтому рассматриваю вариант, что сутки заканчиваются до 20:00, а дальше начинаются новые) - чего-то хорошо упростить тут не получилось ;)
    Код (Text):
    Today := @TextToTime("Today");
    StartTime:=20;
    hs20 := @Hour(vremiyprinrehen) < StartTime;
    hsNow := @Hour(@Now) >= StartTime;
    SELECT Form = "Неисправности" & @If(hsNow; @If(hs20; @Adjust(datapostanovki; 0; 0; -1; 0; 0;0) = Today; Today=datapostanovki);
    @If(hs20; Today=datapostanovki; @Adjust(datapostanovki; 0; 0; 1; 0; 0;0) = Today))
    2. Еще один вариант, который как-то опробовали - обойтись без @now c серверным агентом, устанавливающим дату в серверную переменную Startday notes.ini и обновляющий представление в момент перехода дат.
    Формула отбора в представление в этом случае чуть попроще:
    Код (Text):
    Today20 := @TextToTime(@Environment("Startday"));
    StartTime:=20;
    hs20 := @Hour(vremiyprinrehen) < StartTime;
    SELECT Form = "Неисправности" & @If(hs20; @Adjust(datapostanovki; 0; 0; -1; 0; 0;0) = Today20; Today20 =datapostanovki)
    Агент должен запускаться ежедневно в 20:00 (уровень безопасности 2 -allow restricted). Нужно запустить агент изначально для получения отбора по вьюшке.
    В момент запуска он проверяет время сервера (то перестраховка - если агент запустится не в нужное время, чтоб не менял дату на текущую до начала суток).
    Код (Text):
        Const StartTime = 20 ' время начала суток
    Const viewName = "TestSel2" ' имя вьюшки
    Dim s As New NotesSession
    Dim Db As NotesDatabase
    Dim prevDate As String
    Dim сDate As String
    Set db = s.CurrentDatabase
    prevDate = s.GetEnvironmentString("Startday")
    If Hour(Now) >= StartTime Then
    cDate = Format(Today, "Short Date")
    Else
    cDate = Format(Today-1, "Short Date") ' yesterday
    End If
    If prevDate <> cDate Then
    Call s.SetEnvironmentVar("Startday", сDate)
    Msgbox "обновляем индекс с датой " & сDate
    Call s.SendConsoleCommand("", "load updall " & {"} & db.FilePath & {"} & " -t " & viewName & " -r") ' Update this view only
    End If
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Про папки еще никто не упомянул? ;)
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    это твоя привилегия )))

    TIA, чесгря я не понял, чего ты такое насоветовал...
    не использовать @Today, но использовать @TextToTime ("Today")... ведь эти функции возвратят один результат, только в разном типе, если уточнять... чесгря, меня это сбило с толку ;)
    к стати, еженочный агент, вызывающий updall на нужный вид с использованием @Environment работает, проверено, и не только на этой задаче...

    я поддерживаю вариант lmike, либо Medevic, но папки мне не по душе, т.с...

    я бы, наверное, добавил в документ поле, содержащее дату из одного поля и время из другого, чтобы было удобнее использовать.
    тогда для скриптового варианта могу порекомендовать метод notesView.GetAllDocumentsByKey( keyArray [, exactMatch% ] ), где
    keyArray будет в виде объекта NotesDateRange. и вьюху по одному общему полю отсортировать.
    либо notesView.FTSearch( query$, maxDocs% ), с запросом приблизительно такого вида
    ([newDateItemName] >= starttime) and ([newDateItemName] <= endtime)
    где starttime - дата пред.дня от текущего со временем 20-00 и соотв. endtime свое значение нужное содержит, передевать в строку запроса в виде строкового значения даты (например, 09.05.2009 20:00)...
     
  13. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.291
    Симпатии:
    0
    Сравнение дат, как текстов (причем на больше/меньше) - уже та ещё засада. Только для профессиональных граблеходцев
     
  14. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Ну какже, разве вы ещё не в курсе?
    Вон, OKEN использует @TextToTime("Today"), правда тут же следом @Now :)

    Почитайте.
    http://www.notesnet.ru/library/docid/829BC8

    masyna, Вам особенно рекомендую.

    Могу только добавить, что у зависящих от времени видов есть поле $FormulaTV. По нему можно аудит дизайна делать на предмет использования зависящих от времени представлений. Так вот, @TextToTime ("Today") не приводит к появлению $FormulaTV.
     
  15. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    TIA, спасибо за статью, почитаю... когда-то давно я читал похожую, но на английском, и в виду плохого владения языка она мне плохо запомнилась... но я сделал один хороший вывод - не использовать в формулах отбора представлений никаких функций-времени/даты :)

    все-равно, я бы рекомендовал не торчать на подобном, а использовать возможности поиска по дате, а не по ее текстовому представлению, которое, к тому же зависит от поясов и т.п., например, 20:00 (в поясе +2) отличное время от 20:00 (+4). а время на сервере в виде будет преобразовываться по поясу сервера, а не того, кто делает запрос. соотв, результат запроса может быть несоответсвующим... (формулы отбора в вид это, конечно, не касается, это относится к отбору по текствовому представлению данных)
     
  16. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Подожди, я и не призывал использовать текстовое представление даты. @TextToTime даёт DATETIME. Ессно, все операции сравнения дат должны быть в типе "datetime".
     
  17. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    оу... прошу прощения, меня проглючило после поста автора темы
     
  18. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Я знала о преимуществе @TextToTime("Today") и ему говорила, даже по ходу проверила, не путаю ли я чего.
    Только я не знаю лотус так глубоко, чтобы знать про $FormulaTV, поэтому огромное спасибо за инфу :)
    в 1м примере я сначала предупредила, что вариант с @Now - человек изначально хотел отбор во вьюшку и примеров побольше. И дальше уже смотрю оптимальные варианты насоветовали, я тогда зациклилась на постановке автора.
    я в следующем примере исправилась - обошлась без @Now :)
     
  19. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    вот взяла и сдала )))
     
  20. masyna

    masyna Гость

    Всем огромное спасибо за участие в моей теме!
    По поводу исползования даты взятую с сервера, то это я думаю не подойдет, эта база будет использоваться на 6 серверах. А сбор данных будет на головном, где будут проводить сверку действительности этих данных.
    Но все же попробую. Как и остальные примеры, так как я еще раз повторюсь, что новичек в этом деле!!!



    Да я еще просил дать ответ на вопрос - Как распечатать Вью по своей форме отчета!!!!
     
Загрузка...

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