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

Тема в разделе "Lotus - Программирование", создана пользователем Eugen, 17 апр 2012.

  1. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Добрый день.
    Обращаюсь к знающим людям за советом...
    Нужно сделать отдельную форму для поиска, а штатный отключить. В поисковой форме будет 3 пункта: фамилия, серия и номер паспорта. Ниже будет кнопка "Поиск", а еще ниже embedded view, в который хотелось бы вывести результаты поиска.
    Собственно это почти все сделано, осталась проблема с формулой отбора. Как правильно ее написать? Необходимо, чтобы поиск осущесвлялся по одному из вышеуказанных пунктов, ну или по всем заполненным, то есть при каждом нажатии кнопки поиск значения зеполненных полей должны прописываться в формулу отбора. Возможно ли такое сделать? Или может есть более рациональный способ?
     
  2. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Я делал отдельным фреймсетом.
    В одном фрейме форма с полями, в соседнем папка.
    Заполняешь поля, нажимаешь экшн, пробегаются все поля и непустые добавляются в строку отбора.
    Затем по этой строке select и результат в папку, которая выводится в сослнем фрейме (с очисткой и докинуть - опционально)
     
  3. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Проблема в том и заключается - я не знаю как сделать так, чтобы включить параметры поиска в строку отбора и не знаю как правильно написать этот select.
     
  4. FixeR

    FixeR Гость

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

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

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

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

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    FixeR
    то есть лучше сделать как предложил Anatoly?
     
  6. FixeR

    FixeR Гость

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

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

    Dragon108 Well-Known Member

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

    Eugen Well-Known Member

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

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0

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

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

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Допустим сделаю через папку, или отдельным фреймсетов, как советовали раньше... Сейчас вопрос в формуле поиска для отбора в NotesDocumentCollection, как заставить ее работать?

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

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    dim coll as NotesDocumentCollection
    set coll = db.Search({Form = "CreditClaim" & <поле в документе1> = "} & <значение в этом поле1> & {" & <поле в документе2> = "} & <значение в этом поле2> & {"} , Nothing, 0)

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

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

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Ну это (формирование коллекции через Search) опять же все терпимо работает до тех пор пока в базе не очень большое количество документов ...

    Лучше использовать не db.Search, а View.GetAllDocumentsByKey или db.FTSearch
     
  13. Anatoly

    Anatoly Well-Known Member

    Регистрация:
    30 мар 2007
    Сообщения:
    204
    Симпатии:
    0
    Действительно, забыл упомянуть... Папка - SPOFU.
    Один минус, при решении изменить дизайн, личные папки надо вычищать, соответственно потеряются результаты последней выборки.
     
  14. Eugen

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Dragon108
    Пытаюсь сделать через GetAllDocumentsByKey. Фрагмент кода поискового агента:
    Код (LotusScript):
        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, надо вводить вектор, но как это правильно сделать я не знаю. Кто-нибудь может подсказать?
     
  15. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0

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

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Dragon108
    На всех колонках, по которым будет поиск стоит сортировка по возрастанию и они не категоризированны.
     
  17. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Попробуйте заполнять массив не с 1 элемента, а с 0 го. Ну или если заполнять все таки с первого, то поставьте Option Base 1

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

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Dragon108
    Если ставить заполнение с 0 - результат тот же. А где ставится Option Base 1? По частичным совпадениям тоже ищет только по первому параметру...
     
  19. Anatoly

    Anatoly Well-Known Member

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

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

    Eugen Well-Known Member

    Регистрация:
    22 мар 2012
    Сообщения:
    172
    Симпатии:
    0
    Все, поиск заработал. Не могу теперь разобраться с отображением результатов. Как правильно через folder показать содержимое NotesDocumentCollection?
     
Загрузка...

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