• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Проблема С Поиском Документов По Полю Со Значением Дата/время

  • Автор темы juk-777
  • Дата начала
J

juk-777

Доброго времени суток! Помогите понять - почему не могу в базе найти стандартным поиском документы, содержащие информацию в поле с типом Дата. У меня получается так, что в результате запроса отображаются только документы, в которых указанная дата есть в текстовых полях, но никак не хотят отображаться доки, где стоит указанная дата в конкретном Date/Time поле.
Конструкции типа FIELD date1=04.04.2013 проходят на ура, но если просто написать 04.04.2013 - то результат вернется нулевой
Индекс по базе есть (пробовал его удалять и заново создавать); Во вьюхе столбец с этим полем присутствует, по нему также осуществляется сортировка.
Просто странно .. ведь черным по белому в документации написано - В индекс полнотекстового поиска включаются слова, числа и даты из доступных полей всех документов в базе ... и т.д.
Коллеги по лотусу говорят, что в их базах (каких-то других не конкретно моей ) все ищется нормально - почему же у меня такая кака понять не могу ... может где-то какая-то галочка потерялась)) помогите разобраться плиз.

Буду благодарен всем Вашим ответам!
 

garrick

Lotus Team
26.10.2009
1 349
151
BIT
164
Непонятно вы ищите формулой или через Full Text (меню "Поиск")
 

vited

Green Team
17.11.2010
51
1
BIT
0
Классические грабли.
У вас создался индекс по полю с датой в формате текст т.к. индексер нашел первый документ именно с таким типом данных. И в итоге у вас сейчас поиск работает по текстовому значению.
Скорее всего у вас или на форме есть поле с датой с не обязательным заполнением, что в итоге приводит к созданию документа с полем = "" или где-то не аккуратно работаете с типом данных.
Сейчас вам надо найти все поля с датами где тип данных текст, пустые удалить, не пустые конвертировать в Date/Time.
Создайте представление с формулой отбора:
SELECT @IsAvailable(ПолеДата) & !@IsTime(ПолеДата)
избавтесь от текстовых значений в поле
Затем удалите FT индес
И потом выполните на сервере compact -c База
После это создайте FT индес
 
J

juk-777

Классические грабли.
У вас создался индекс по полю с датой в формате текст т.к. индексер нашел первый документ именно с таким типом данных. И в итоге у вас сейчас поиск работает по текстовому значению.
Скорее всего у вас или на форме есть поле с датой с не обязательным заполнением, что в итоге приводит к созданию документа с полем = "" или где-то не аккуратно работаете с типом данных.

Да, всё верно вы говорите, я проверил по полям в документе, в 2-х из 3-х моих полей с типом дата записываются значение в виде текста. Если не затруднит помочь разобраться с правильной работой с такими полями, то буду очень признателен.
Смотрите - логика работы с этими полями в моем приложении такова: в поле Дата1 вбивается какая-то дата, потом из этого поля необходимо его вытащить в другое поле Дата2 и затем поле Дата1 "обнулить" так сказать, ну чтобы там снова стало пусто.
Делалось это по-дурацки вот таким образом:

curdoc.Date2=curdoc.Date1(0)
curdoc.Date1=""

Хочу эту порнографию исправить корректно, подскажите пожалста как. А уже с созданными документами, думаю разберусь)

Добавлено:
Непонятно вы ищите формулой или через Full Text (меню "Поиск")
Я ищу стандартным поиском.
 

vited

Green Team
17.11.2010
51
1
BIT
0
Да, всё верно вы говорите, я проверил по полям в документе, в 2-х из 3-х моих полей с типом дата записываются значение в виде текста. Если не затруднит помочь разобраться с правильной работой с такими полями, то буду очень признателен.
Смотрите - логика работы с этими полями в моем приложении такова: в поле Дата1 вбивается какая-то дата, потом из этого поля необходимо его вытащить в другое поле Дата2 и затем поле Дата1 "обнулить" так сказать, ну чтобы там снова стало пусто.
Делалось это по-дурацки вот таким образом:

curdoc.Date2=curdoc.Date1(0)
curdoc.Date1=""

Хочу эту порнографию исправить корректно, подскажите пожалста как. А уже с созданными документами, думаю разберусь)

Добавлено:
Я ищу стандартным поиском.
старайте не использовать упрощенное написание
Код:
curdoc.ReplaceItemValue "Date2", curdoc.GetItemValue("Date1")
curdoc.RemoveItem "Date1"
только так. т.к. если попробуете записать в Date1, null или пустой объект NotesDateTime, то всё равно получите пустую строку.
если вам какое время не нужно поле Date1, то зачем его хранить? Это же не табличные данные. Поэтому если поле не нужно, то удаляйте. т.к. всегда можно проверить его наличие:
Код:
if curdoc.HasItem("Date1") then
 
J

juk-777

Классические грабли.
У вас создался индекс по полю с датой в формате текст т.к. индексер нашел первый документ именно с таким типом данных. И в итоге у вас сейчас поиск работает по текстовому значению.
Скорее всего у вас или на форме есть поле с датой с не обязательным заполнением, что в итоге приводит к созданию документа с полем = "" или где-то не аккуратно работаете с типом данных.

Хочу поблагодарить за ответы и спросить еще кое что по теме (все по той же проблеме), если позволите...

Имеется у меня другая простенькая база, в которой есть одно поле, назовем его для примера, Дата1 типа Дата/Время, которое во-первых не обязательное для заполнения и, во-вторых, заполняется ручками пользователем (то бишь не программно), и есть Текстовое поле, назовем его ДатаСоздания, которое вычисляется при создании документа с формулой @Created.
Пока что в этой базе только 5 документов, то бишь я ее только только тестирую и хочу запустить в оборот). Проверил по полям этих документов - то там все отлично - каждое заполненное поле имеет свой правильный тип. Вопрос - почему после построение индекса по этой базе я также не могу найти документы по полю Дата1, тобишь я ввожу в поле стандартного поиска дату, которая есть у меня в этом поле, а лотус мне не находит этот документ.
Создал я вьюхую с выборкой, указанной Вами SELECT @IsAvailable(Дата1) & !@IsTime(Дата1), в представлении 0 документов, то бишь подтверждается то, что в моих полях Дата/Время верное значение с правильным типом. Вот и сижу ломаю голову - ПОЧЕМУ так происходит, ПОЧЕМУ индекс не строится нормально?
И еще один вопросик - критично ли то, что поле с типом Дата/Время не обязательное для заполнения? (Опытным путем вычислил, что если поле не заполнить, то после сохранения документа тип поля Дата меняется на Текст с пустым значением, =)) Я так понял его лучше удалить, наверно, если оно не заполнилось пользователем).
Или может вообще избавиться от полей типа Дата/Время и делать поля текстовыми, а потом при построении отчетов и т.п. просто переделывать текст в дату, как я делал это до сих пор?))
СПАСИБО!

p.s. Сделал все по Вашему совету: Проверил все документы в тестируемой базе с 5-ю документами на правильность заполненной инфы, Удалил индекс, Сделал compact -c базы, Создал индекс заново, НО искать по полям типа Дата все равно не могу .. не ищет зараза =((
 
J

juk-777

Что именно вы вводите? Как выглядит ваша строка для поиска?

Просто дату пишу - например - 04.04.2013
Я-то могу написать конструкцию типа FIELD date1=[04.04.2013] и найти че-то, но этот вариант не подойдет для обычных юзеров (ющут доки они, а не я), и подобные конструкции для них не приемлемы!
Необходимо, чтобы лотус искал сам документы по введенной дате и все! без лишний уточнений в виде полей.
 

garrick

Lotus Team
26.10.2009
1 349
151
BIT
164
Просто дату пишу - например - 04.04.2013
Ну это же текст, а не дата. Даже если вы сможете искать по дате таким образом, такой поиск будет некорректен, т.к. в документе могут быть служебные поля с датой, например $Revisions. Как вы объясните пользователям "Почему этот документ нашелся?".

Создайте представление с категорией по вашему полю с датой - пусть там смотрят.
 

vited

Green Team
17.11.2010
51
1
BIT
0
Честно говоря странная для меня конструкция: FIELD date1=[04.04.2013]
у меня клиент грит "не понимаю запрос", правильно [date1]=04.04.2013
Но garrick прав. Если просто написать в строке поиска 04.04.2013, то лотус будет искать текстовое значение 04.04.2013 в текстовых полях.
Но тогда нельзя будет найти, например, все документы с датой создания больше 04.04.2013 (кстати для этого существует запрос по системному полю [_CreationDate]>=04.04.2013)
Для пользователей, что не будут осваивать написание запросв, есть в строке поиска кнопка "Дополнительно" правее кнопки "искать". Там можно указать поле из списка и значение. F1 рулит.
 
J

juk-777

Честно говоря странная для меня конструкция: FIELD date1=[04.04.2013]
у меня клиент грит "не понимаю запрос", правильно [date1]=04.04.2013
Но garrick прав. Если просто написать в строке поиска 04.04.2013, то лотус будет искать текстовое значение 04.04.2013 в текстовых полях.
Но тогда нельзя будет найти, например, все документы с датой создания больше 04.04.2013 (кстати для этого существует запрос по системному полю [_CreationDate]>=04.04.2013)
Для пользователей, что не будут осваивать написание запросв, есть в строке поиска кнопка "Дополнительно" правее кнопки "искать". Там можно указать поле из списка и значение. F1 рулит.
Найти документ по дате создания или дате изменения не составляет труда - это все делается как вы и говорите через кнопку Дополнительно (ну чтобы не писать юзерам запросы вроде [_CreationDate]>=04.04.2013, так как они ни за что в жизни не будут писать подобное =) Просто поточу что это неудобно и долго))
НО, задача моя не состоит в том, чтобы искать доки по системным полям (дата создания и изменения), а по моим созданным полям типа Дата. И я так понимаю, что чтобы что-то найти по этим полям - то надо точно знать название поля, чтобы написать конструкцию типа [date1]=04.04.2013 (это ж надо всем двустам людям сказать что поле называется Дата12345 ,и чтобы вы могли найти че-то то пишите вот так вот [Дата12345]=04.04.2013. На мой взгляд это бредово и странно что сама система лотус работает так, что ей надо явно указывать че да как.
В общем, если я правильно понимаю - то лучше либо искать из того же пункта дополнительно "По форме" или "По полю" (что ваще не удобно ибо полей куча и юзеры ваще не сориентируются), либо создавать свою кнопку для поиска, чтобы по ней открывалась какая-то своя форма для занесения туда необходимых данных для поиска ...
 

Мыш

Lotus Team
12.02.2008
1 213
29
BIT
43
либо создавать свою кнопку для поиска, чтобы по ней открывалась какая-то своя форма для занесения туда необходимых данных для поиска ...
Да, лучше свою форму. Опять же, при этом можно сделать "справочник полей", чтобы пользователь выбирал в форме "человеческое" название поля (скажем, "Фамилия", "Должность", "Дата создания", "Дата согласования"), а в сам запрос попадали бы уже реальные имена полей (те, которые есть в документах). Можно вместо значений реальных полей формулы использовать - в общем, это достаточно известный механизм для составления несложных отчетов. :)

Или, как правильно писали выше, делайте виды с категоризацией/сортировкой по подобным полям.
 
J

juk-777

Да, лучше свою форму. Опять же, при этом можно сделать "справочник полей", чтобы пользователь выбирал в форме "человеческое" название поля (скажем, "Фамилия", "Должность", "Дата создания", "Дата согласования"), а в сам запрос попадали бы уже реальные имена полей (те, которые есть в документах). Можно вместо значений реальных полей формулы использовать - в общем, это достаточно известный механизм для составления несложных отчетов. :)

Или, как правильно писали выше, делайте виды с категоризацией/сортировкой по подобным полям.

Понял Вас !
СПАСИБО Всем за ответы !!
 
30.05.2006
1 345
12
BIT
0
.. пишите вот так вот [Дата12345]=04.04.2013. На мой взгляд это бредово и странно что сама система лотус работает так, что ей надо явно указывать че да как.
Лотусе для поиска требуется ТИП искомых данных, поскольку смысл операторов сравнения (">" "<" ..) существенным образом зависит от этого. ЕСЛИ в запросе есть имя поля, то тип аргумента поиска определяется по типу этого поля. ЕСЛИ имён полей нет, то запрос полагается чистА ТЕКСТОВЫМ
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!