• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Форма Поиска.

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

Eugen

Green Team
22.03.2012
210
1
Добрый день.
Обращаюсь к знающим людям за советом...
Нужно сделать отдельную форму для поиска, а штатный отключить. В поисковой форме будет 3 пункта: фамилия, серия и номер паспорта. Ниже будет кнопка "Поиск", а еще ниже embedded view, в который хотелось бы вывести результаты поиска.
Собственно это почти все сделано, осталась проблема с формулой отбора. Как правильно ее написать? Необходимо, чтобы поиск осущесвлялся по одному из вышеуказанных пунктов, ну или по всем заполненным, то есть при каждом нажатии кнопки поиск значения зеполненных полей должны прописываться в формулу отбора. Возможно ли такое сделать? Или может есть более рациональный способ?
 
Я делал отдельным фреймсетом.
В одном фрейме форма с полями, в соседнем папка.
Заполняешь поля, нажимаешь экшн, пробегаются все поля и непустые добавляются в строку отбора.
Затем по этой строке select и результат в папку, которая выводится в сослнем фрейме (с очисткой и докинуть - опционально)
 
Проблема в том и заключается - я не знаю как сделать так, чтобы включить параметры поиска в строку отбора и не знаю как правильно написать этот select.
 
Eugen
Менять select вьюшки - не самая удачная идея.

Синтаксис довольно простой:

SELECT SecondName = "sname" & PassportSerial = "serial" & PassportNumber = "num"

Вот такой запрос отберёт документы у которых в поле SecondName содержится значение "sname", в поле PassportSerial - значение "serial" и в поле PassportNumber значение "num".
 
FixeR
то есть лучше сделать как предложил Anatoly?
 
Eugen,
Да, для отображения результатов лучше использовать папку (folder).
В остальном - как удобнее, можно и в одном фреймсете сделать, а можно форму поиска оформить в виде окна (UIWorkSpace.DialogBox).

Формируете строчку поиска, подставляете в db.Search (или db.FTSearch), результаты скидываете в папку.
 
Eugen,
Да, для отображения результатов лучше использовать папку (folder).
В остальном - как удобнее, можно и в одном фреймсете сделать, а можно форму поиска оформить в виде окна (UIWorkSpace.DialogBox).

Формируете строчку поиска, подставляете в db.Search (или db.FTSearch), результаты скидываете в папку.

Причем имхо лучше делать папку для каждого отдельного пользователя, пользующегося поиском в данный момент. Потом эту папку удалять. Ибо если одновременно много пользователей будут юзать одну и ту же папку или вьюшку, то результаты поиска могут "сходить сума". Да и индексация будет постоянной
 
Синтаксис довольно простой:

SELECT SecondName = "sname" & PassportSerial = "serial" & PassportNumber = "num"

Вот такой запрос отберёт документы у которых в поле SecondName содержится значение "sname", в поле PassportSerial - значение "serial" и в поле PassportNumber значение "num".

Что то не получилось у меня по этому варианту. Начинает работать, только если в условии отбора вьюхи задать значение, что-то вроде: SELECT form="CreditClaim" & SecondName="Петров". Если ссылаться на поле, которое будет заполнять пользователь, то по ходу в селекте должна быть переменная, что-то вроде: SELECT form="CreditClaim" & SecondName=sname, где sname значение поля с основной формы поиска.
 
Что то не получилось у меня по этому варианту. Начинает работать, только если в условии отбора вьюхи задать значение, что-то вроде: SELECT form="CreditClaim" & SecondName="Петров". Если ссылаться на поле, которое будет заполнять пользователь, то по ходу в селекте должна быть переменная, что-то вроде: SELECT form="CreditClaim" & SecondName=sname, где sname значение поля с основной формы поиска.


Сделайте лучше через папку - работать будет в разы быстрее. Сформированную коллекцию, удволетворяющую параметрам поиска, можно методом NotesDocumentCollection.PutAllInFolder одним махом положить в папку, нежели чем через вью, которая будет еще отбирать документы и строить индекс ...

Если же хотите же через вью, то лучше через встроенную с параметром ShowSingleCategory - в котором будет лежать поле с параметром поиска... (Соостветственно вью должна быть категоризированна по этому параметру)
 
Сделайте лучше через папку - работать будет в разы быстрее. Сформированную коллекцию, удволетворяющую параметрам поиска, можно методом NotesDocumentCollection.PutAllInFolder одним махом положить в папку, нежели чем через вью, которая будет еще отбирать документы и строить индекс
Допустим сделаю через папку, или отдельным фреймсетов, как советовали раньше... Сейчас вопрос в формуле поиска для отбора в NotesDocumentCollection, как заставить ее работать?

Код:
Formula={Form="CreditClaim" & F=@GetField("F_S")}
Set Result=db.Search(Formula, Nothing, 0)
 
Допустим сделаю через папку, или отдельным фреймсетов, как советовали раньше... Сейчас вопрос в формуле поиска для отбора в NotesDocumentCollection, как заставить ее работать?

Код:
Formula={Form="CreditClaim" & F=@GetField("F_S")}
Set Result=db.Search(Formula, Nothing, 0)

dim coll as NotesDocumentCollection
set coll = db.Search({Form = "CreditClaim" & <поле в документе1> = "} & <значение в этом поле1> & {" & <поле в документе2> = "} & <значение в этом поле2> & {"} , Nothing, 0)

Соответственно <значение в этом поле1> и <значение в этом поле2> - либо переменная, либо константа, в котором хранится необходимый вам параметр поиска.

Т.е. в итоге "текст" запроса поиска (первый параметр Search) должен быть точно такой же как в отборе во вьюшке.
 
dim coll as NotesDocumentCollection
set coll = db.Search({Form = "CreditClaim" & <поле в документе1> = "} & <значение в этом поле1> & {" & <поле в документе2> = "} & <значение в этом поле2> & {"} , Nothing, 0)

Соответственно <значение в этом поле1> и <значение в этом поле2> - либо переменная, либо константа, в котором хранится необходимый вам параметр поиска.

Т.е. в итоге "текст" запроса поиска (первый параметр Search) должен быть точно такой же как в отборе во вьюшке.

Ну это (формирование коллекции через Search) опять же все терпимо работает до тех пор пока в базе не очень большое количество документов ...

Лучше использовать не db.Search, а View.GetAllDocumentsByKey или db.FTSearch
 
Причем имхо лучше делать папку для каждого отдельного пользователя, пользующегося поиском в данный момент. Потом эту папку удалять. Ибо если одновременно много пользователей будут юзать одну и ту же папку или вьюшку, то результаты поиска могут "сходить сума". Да и индексация будет постоянной
Действительно, забыл упомянуть... Папка - SPOFU.
Один минус, при решении изменить дизайн, личные папки надо вычищать, соответственно потеряются результаты последней выборки.
 
Dragon108
Пытаюсь сделать через GetAllDocumentsByKey. Фрагмент кода поискового агента:
Код:
	Dim params (1 To 2) As String
Set db=s.CurrentDatabase
Set view=db.Getview("SearchResult")
Set uidoc=w.Currentdocument
Set searchdoc=uidoc.Document
Set F_S=searchdoc.Getfirstitem("F_S")
F_S_t=F_S.Text
Set Serial_S=searchdoc.Getfirstitem("Serial_S")
Serial_S_t=Serial_S.Text
params(1)=F_S_t
params(2)=Serial_S_t

Set Result=view.Getalldocumentsbykey(params, True)
MessageBox(Result.Count)

В итоге если поисковой форме указать только один параметр поиска(F_S), то все отрабатывает корректно, а когда указываю второй параметр, то уже ничего не находит. В хелпе видел, что когда используется GetAllDocumentByKey, надо вводить вектор, но как это правильно сделать я не знаю. Кто-нибудь может подсказать?
 
Dragon108
Пытаюсь сделать через GetAllDocumentsByKey. Фрагмент кода поискового агента:
Код:
	Dim params (1 To 2) As String
Set db=s.CurrentDatabase
Set view=db.Getview("SearchResult")
Set uidoc=w.Currentdocument
Set searchdoc=uidoc.Document
Set F_S=searchdoc.Getfirstitem("F_S")
F_S_t=F_S.Text
Set Serial_S=searchdoc.Getfirstitem("Serial_S")
Serial_S_t=Serial_S.Text
params(1)=F_S_t
params(2)=Serial_S_t

Set Result=view.Getalldocumentsbykey(params, True)
MessageBox(Result.Count)

В итоге если поисковой форме указать только один параметр поиска(F_S), то все отрабатывает корректно, а когда указываю второй параметр, то уже ничего не находит. В хелпе видел, что когда используется GetAllDocumentByKey, надо вводить вектор, но как это правильно сделать я не знаю. Кто-нибудь может подсказать?


GetAllDocumentByKey ищет по сортированным колонкам - соответственно первый параметер ищет по первой сортированной колонке, воторой - по второй , третий - по третьей и т.д. (из хелпа: For the GetAllDocumentsByKey method to work, you must have at least one sorted column for each key ... This method returns all the documents whose column values match the keys you indicate) .Скорее всего у вас неотсортированные вторая и третьи колонки в поисковой вьюхе ...
Вектор представляет из себя массив параметров, тут у вас все правильно
 
Dragon108
На всех колонках, по которым будет поиск стоит сортировка по возрастанию и они не категоризированны.
 
Dragon108
На всех колонках, по которым будет поиск стоит сортировка по возрастанию и они не категоризированны.

Попробуйте заполнять массив не с 1 элемента, а с 0 го. Ну или если заполнять все таки с первого, то поставьте Option Base 1

Попробуйте так же убрать второй параметр в GetAllDocumentsByKey - Exatch Match. Посмотрите что отображается в колонках и по каким параметрам вы ищете
 
Dragon108
Если ставить заполнение с 0 - результат тот же. А где ставится Option Base 1? По частичным совпадениям тоже ищет только по первому параметру...
 
Насколько я понимаю, поиск может быть: либо по фамилии, либо по серии и номеру паспорта.
И там, и там поиск в 1 категоризированной колонке: фамилия или серия+номер, вполне себе и без массива.
Вводить для поиска все три параметра - избыточно. А значит, если вам придется заводить два ключевых представления (одно по фамилии, другое по паспорту) и по ходу ввода решать какое из них юзать. Хотя можно обойтись и 1 представлением с 1 колонкой :( И, если только задача в том, что-бы найти документ по конкреному 1 человеку, в экшн можно обойтись и формулами. @PickList выведет для выбора конкреного человека всех с людей с введеной фамилией, @DBLookup по введенным паспортным данным сразу вернет 1 нужного. Хотя, может человеку надо что-то другое? :)

И я не совсем понял по поводу частичного совпадения. Это может быть только с фамилией или паспорт тоже может вводиться частично?
 
Все, поиск заработал. Не могу теперь разобраться с отображением результатов. Как правильно через folder показать содержимое NotesDocumentCollection?
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab