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

  • Автор темы masyna
  • Дата начала
M

masyna

Гость
#1
Проблемма такая!!!
Существует форма в которой есть поле 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
Да и еще один вопрос. Как распечатать ВЬЮ по своей форме Отчета?????
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 429
351
homepage.mac.com
#2
не надо так делать!
ужо скока говорено - там много граблей
Чем не устроит пущать скрипт и получать выборку, либо (ежели задача позволяет) - встроенную вьюшку делать (с категорией отбора)
 
M

masyna

Гость
#3
не надо так делать!
ужо скока говорено - там много граблей
Чем не устроит пущать скрипт и получать выборку, либо (ежели задача позволяет) - встроенную вьюшку делать (с категорией отбора)


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

TIA

:-)
Lotus team
15.05.2009
790
1
#4
SELECT ((Form = "ФОРМА")
& (@Text(datapostanovki)>= @Text(@Date(@Yesterday)) & @Text(@Hour(vremiyprinrehen))>="20")
& (@Text(datapostanovki)<= @Text(@Date(@Now)) & @Text(@Hour(vremiyprinrehen))<="20")

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

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

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

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

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

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#5
Правда, надо ещё обеспечить, чтоб только один пользователь раз в сутки инициировал операцию перестроения индекса при открытии данной вьюшки
Call ws.ViewRebuild()
А альтернатива - ежедневный серверный агент, выполняющий updall для нужной вьюшки, здесь не покатит?
 

TIA

:-)
Lotus team
15.05.2009
790
1
#6
OKEN
А в принципе, почему бы и нет!? После такой существенной модификации, как SelectionFormula, и обычный Refresh должен бы приводить к ребилду индекса. На практике не доводилось использовать, но проверю на досуге. Если подтвердится, то и Updall'а будет достаточно или UI-обращения к автоматическому виду.
(Кстати, может кто-то точно знает?)
 
M

masyna

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

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

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

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#8
TIA
Указанный случай изменения формулы отбора не использовался, поэтому заинтересовало.
Было подобное решение с помощью @Environment.
Но вот насчет настроенных свойств обновления этих представлений сейчас не подскажу.

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

masyna

Гость
#9
Ну, стоило прислушаться к совету не использовать @Now.
Что мешает через | добавить в представление аналогичное условие по второму нужному полю, правильно расставив скобки?
Или я не поняла задачи и надо совместить их по &, т.е. отбирать только если оба поля содержат значения в рамках тек. суток?

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

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

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#10
Сорри, изначально невнимательно прочла условие - думала, что отбор по 2м независимым датам, а не дата + время.
1. Немного извращенческий отбор в представление по дате и времени с @now в предположении, что дата datapostanovki содержит только дату -проверяется только равенство дат (может, я и не права, но я не думаю, что 20:00 должно учитываться двое суток подряд, поэтому рассматриваю вариант, что сутки заканчиваются до 20:00, а дальше начинаются новые) - чего-то хорошо упростить тут не получилось ;)
Код:
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 и обновляющий представление в момент перехода дат.
Формула отбора в представление в этом случае чуть попроще:
Код:
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). Нужно запустить агент изначально для получения отбора по вьюшке.
В момент запуска он проверяет время сервера (то перестраховка - если агент запустится не в нужное время, чтоб не менял дату на текущую до начала суток).
Код:
 	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
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
34
Kiev, Ukraine
#12
Про папки еще никто не упомянул?
это твоя привилегия )))

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

TIA

:-)
Lotus team
15.05.2009
790
1
#14
TIA, чесгря я не понял, чего ты такое насоветовал...
не использовать @Today, но использовать @TextToTime ("Today")... ведь эти функции возвратят один результат, только в разном типе, если уточнять...
Ну какже, разве вы ещё не в курсе?
Вон, OKEN использует @TextToTime("Today"), правда тут же следом @Now :)

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

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

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

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
34
Kiev, Ukraine
#15
TIA, спасибо за статью, почитаю... когда-то давно я читал похожую, но на английском, и в виду плохого владения языка она мне плохо запомнилась... но я сделал один хороший вывод - не использовать в формулах отбора представлений никаких функций-времени/даты :)

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

TIA

:-)
Lotus team
15.05.2009
790
1
#16
все-равно, я бы рекомендовал не торчать на подобном, а использовать возможности поиска по дате, а не по ее текстовому представлению,
Подожди, я и не призывал использовать текстовое представление даты. @TextToTime даёт DATETIME. Ессно, все операции сравнения дат должны быть в типе "datetime".
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#18
Ну какже, разве вы ещё не в курсе?
Вон, OKEN использует @TextToTime("Today"), правда тут же следом @Now
Я знала о преимуществе @TextToTime("Today") и ему говорила, даже по ходу проверила, не путаю ли я чего.
Только я не знаю лотус так глубоко, чтобы знать про $FormulaTV, поэтому огромное спасибо за инфу :)
в 1м примере я сначала предупредила, что вариант с @Now - человек изначально хотел отбор во вьюшку и примеров побольше. И дальше уже смотрю оптимальные варианты насоветовали, я тогда зациклилась на постановке автора.
я в следующем примере исправилась - обошлась без @Now :)
 
M

masyna

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



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