Поиск по дате в другой БД

Тема в разделе "Lotus - Программирование", создана пользователем San40S, 30 апр 2009.

  1. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Доброго времени суток!
    Есть две БД: БД1 и БД2. Часть документов храниться в первой, а часть во второй БД.
    В БД2 нажимаем на кнопку, вводим дату и поиск должен найти в БД1 документы, которые там есть. Результат поиска должен отобразиться обратно в БД2.

    Проблема у меня возникла с написанием запроса. Ранее не пользовался db.Search и ща не совсем могу понять структуру построения запроса.
    Если можно написать кусок кода и, по возможности немного рассказать о методе Search
    Спасибо!
     
  2. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Запрос такой же как в формуле отбора в представлении. Плюс в хелпе примеры есть.
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    Dim Dc As NotesDocumentCollection
    Set Dc = OtherDb.Search({DateFld > @Date(} + YParam + {; } + MParam + {; } + DParam + {)}, Nothing, 0)
    , где YParam, MParam, DParam параметры из даты, которую ты спрашивал перед сёрчем.
     
  4. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    не совсем понял этот момент. :)

    Искомую дату либо берем из поля в которое перед запросом заполняем, либо (это было бы даже лучше, в плане интерфейса) Inputbox$
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну проси у юзера inpubox (в определённом формате) и распарси.
    По моему, лучше dialogbox с одним полем даты, меньше гемора.
     
  6. HumblePie

    HumblePie Гость

    Короче db.search - 1ый параметр формула на собаках такая же как и в формуле отбора представления только в search ключевое слово select не нужно писать.

    Но на самом деле тебе этот search не нужен. В БД1 создать нужно представление с 1ой колонкой отсортированной в которой будешь выводить дату документа.
    Обращаешься к БД1, достаешь объект NotesView созданого до этого представления и дергаешь notesView.GetAllDocumentsByKey( keyArray ) , а keyArray - объект класса NotesDateTime или NotesDateRange.
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    ммм... простите, а можно обойтись отсортированой view?
    Во view сделать три колонки.... Год, месяц и день
    а потом пользовать метод GetAllDocumentsByKey

    HumblePie
    я опоздал :)
     
  8. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Спасибо за объяснение, хоть немного "въехал" в этот Search :)
    А на счет Вашего варианта... мне нужно найти документы, в которых дата запроса будет лежать в диапазоне двух дат, которые в документе. Тоесть в документе есть дата начала и дата окончания, но дата окончания может быть пустой!!! Результатом запроса должны быть документы, дата начала которых меньше даты-запроса и в то же время дата окончания - больше(или пустая) в сравнении даты-запроса.
    Можно ли это организовать Вашим способом. Потому что, насколько я знаю GetAllDocumentsByKey работает быстрее чем Search.
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не, при такой постановке задачи лучше заюзать именно db.Search.
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    вот а сразу нельзя было описать вопрос подробней?
    Думаю проще сделать через Search
     
  11. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Сори, что сразу не упомянул о двух полях для сравнения.
    А можно, хотя бы, какой-то набросок кода для наглядного примера таковой ситуации. Буду очень признателен!
     
  12. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Дак это
    Набросок в третьем посте.
     
  13. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Код (Text):
    Dim Dc As NotesDocumentCollection
    Set Dc = OtherDb.Search({DateFld > @Date(} + YParam + {; } + MParam + {; } + DParam + {)}, Nothing, 0)
    здесь сравнивается одно поле, но это такое, второе думаю допишу, но... как учесть, что дата окончания может быть вообще пустой.
    попробовал построить SELECT во вьюхе, и если поле "Дата_окончания" - пустое, то документы уже не выбираются :)
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Код (Text):
    searchFormula$ = {Form = "название твоей формы" & StartDate < "твое значение" & ( EndDate > "твое значение" | EndDate > "" ) }
    что-то врое этого
     
  15. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    Query = {Form = "Тра-ля-ля" & @if(DateFld1 = ""; @False; @Сравнение_даты1) & @if(DateFld2 = ""; @False; @Сравнение_даты2)}
    Dim Dc As NotesDocumentCollection
    Set Dc = Db.Search(Query, Nothing, 0)
     
  16. K-Fire

    K-Fire Гость

    Ну ладно, допустим коллекцию получили, а отображать как потом собираетесь?
     
  17. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    вот это все можно пользовать для SelectionFormula у view

    по идее должно сработать

    хотя наверное вряд ли
     
  18. San40S

    San40S Well-Known Member

    Регистрация:
    15 апр 2009
    Сообщения:
    69
    Симпатии:
    0
    Вот что получилось у меня:

    Код (Text):
    Sub Click(Source As Button)
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim sview As NotesView
    Dim doc As NotesDocument
    Dim col As NotesDocumentCollection
    Dim newcol As NotesDocumentCollection
    Dim confview As NotesView
    Dim confdoc As NotesDocument
    Set db = s.CurrentDatabase
    Set confview = db.GetView("Config")
    Set confdoc = confview.GetFirstDocument
    server$ = confdoc.ColumnValues(4)
    dbfile$ = confdoc.ColumnValues(5)
    Dim mdb As New NotesDatabase (server$, dbfile$)
    Set sview = mdb.GetView("Workers")
    If mdb Is Nothing Then Exit Sub
    Set col = mdb.Search({Form = "WorkerCard" & StartWork > [15.04.2009] & (EndWork < [29.04.2009] | EndWork <> "")}, Nothing, 0)
    End Sub
    Дебагер показывает, что "col" = 0 - тоесть ниодного документа. В чем проблема, что я неправильно написал???
     
  19. abbatik

    abbatik Lotus team
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Значит формула ничего не отбирает :)
    Ты попробуй сначало в поиске эти данные вбить :) Хотя вот эта (EndWork < [29.04.2009] | EndWork <> "" ) часть формулы кажется сомнительной... если тебе нужна не пустое поле, то зачем вообще на дату его проверять? :)
     
  20. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я же написал с проверкой на пустоту. :)
    Мне и вот эта часть
    Код (Text):
    StartWork > [15.04.2009]
    кажется сомнительной.
    Или там железно задаётся в формате dd.mm.yyyy в независимости ни от чего?
     
Загрузка...

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