• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

Eugen

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

Anatoly

Я делал отдельным фреймсетом.
В одном фрейме форма с полями, в соседнем папка.
Заполняешь поля, нажимаешь экшн, пробегаются все поля и непустые добавляются в строку отбора.
Затем по этой строке select и результат в папку, которая выводится в сослнем фрейме (с очисткой и докинуть - опционально)
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Проблема в том и заключается - я не знаю как сделать так, чтобы включить параметры поиска в строку отбора и не знаю как правильно написать этот select.
 
F

FixeR

Eugen
Менять select вьюшки - не самая удачная идея.

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

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

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

Eugen

Green Team
22.03.2012
210
1
BIT
1
FixeR
то есть лучше сделать как предложил Anatoly?
 
F

FixeR

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

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

Dragon108

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

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

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

Eugen

Green Team
22.03.2012
210
1
BIT
1
Синтаксис довольно простой:

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

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

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

Dragon108

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


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

Если же хотите же через вью, то лучше через встроенную с параметром ShowSingleCategory - в котором будет лежать поле с параметром поиска... (Соостветственно вью должна быть категоризированна по этому параметру)
 

Eugen

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

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

Dragon108

Допустим сделаю через папку, или отдельным фреймсетов, как советовали раньше... Сейчас вопрос в формуле поиска для отбора в 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) должен быть точно такой же как в отборе во вьюшке.
 
D

Dragon108

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
 
A

Anatoly

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

Eugen

Green Team
22.03.2012
210
1
BIT
1
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, надо вводить вектор, но как это правильно сделать я не знаю. Кто-нибудь может подсказать?
 
D

Dragon108

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) .Скорее всего у вас неотсортированные вторая и третьи колонки в поисковой вьюхе ...
Вектор представляет из себя массив параметров, тут у вас все правильно
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Dragon108
На всех колонках, по которым будет поиск стоит сортировка по возрастанию и они не категоризированны.
 
D

Dragon108

Dragon108
На всех колонках, по которым будет поиск стоит сортировка по возрастанию и они не категоризированны.

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

Попробуйте так же убрать второй параметр в GetAllDocumentsByKey - Exatch Match. Посмотрите что отображается в колонках и по каким параметрам вы ищете
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Dragon108
Если ставить заполнение с 0 - результат тот же. А где ставится Option Base 1? По частичным совпадениям тоже ищет только по первому параметру...
 
A

Anatoly

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

И я не совсем понял по поводу частичного совпадения. Это может быть только с фамилией или паспорт тоже может вводиться частично?
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Все, поиск заработал. Не могу теперь разобраться с отображением результатов. Как правильно через folder показать содержимое NotesDocumentCollection?
 
Мы в соцсетях:

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