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

San40S

Well-Known Member
15.04.2009
69
0
#1
Доброго времени суток!
Есть две БД: БД1 и БД2. Часть документов храниться в первой, а часть во второй БД.
В БД2 нажимаем на кнопку, вводим дату и поиск должен найти в БД1 документы, которые там есть. Результат поиска должен отобразиться обратно в БД2.

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#2
Запрос такой же как в формуле отбора в представлении. Плюс в хелпе примеры есть.
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#3
Код:
Dim Dc As NotesDocumentCollection
Set Dc = OtherDb.Search({DateFld > @Date(} + YParam + {; } + MParam + {; } + DParam + {)}, Nothing, 0)
, где YParam, MParam, DParam параметры из даты, которую ты спрашивал перед сёрчем.
 

San40S

Well-Known Member
15.04.2009
69
0
#4
где YParam, MParam, DParam параметры из даты, которую ты спрашивал перед сёрчем.
не совсем понял этот момент. :)

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

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#5
Ну проси у юзера inpubox (в определённом формате) и распарси.
По моему, лучше dialogbox с одним полем даты, меньше гемора.
 
H

HumblePie

Гость
#6
Доброго времени суток!
Есть две БД: БД1 и БД2. Часть документов храниться в первой, а часть во второй БД.
В БД2 нажимаем на кнопку, вводим дату и поиск должен найти в БД1 документы, которые там есть. Результат поиска должен отобразиться обратно в БД2.

Проблема у меня возникла с написанием запроса. Ранее не пользовался db.Search и ща не совсем могу понять структуру построения запроса.
Если можно написать кусок кода и, по возможности немного рассказать о методе Search
Спасибо!
Короче db.search - 1ый параметр формула на собаках такая же как и в формуле отбора представления только в search ключевое слово select не нужно писать.

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

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#7
ммм... простите, а можно обойтись отсортированой view?
Во view сделать три колонки.... Год, месяц и день
а потом пользовать метод GetAllDocumentsByKey

HumblePie
я опоздал :)
 

San40S

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

Но на самом деле тебе этот search не нужен. В БД1 создать нужно представление с 1ой колонкой отсортированной в которой будешь выводить дату документа.
Обращаешься к БД1, достаешь объект NotesView созданого до этого представления и дергаешь notesView.GetAllDocumentsByKey( keyArray ) , а keyArray - объект класса NotesDateTime или NotesDateRange.
Спасибо за объяснение, хоть немного "въехал" в этот Search :)
А на счет Вашего варианта... мне нужно найти документы, в которых дата запроса будет лежать в диапазоне двух дат, которые в документе. Тоесть в документе есть дата начала и дата окончания, но дата окончания может быть пустой!!! Результатом запроса должны быть документы, дата начала которых меньше даты-запроса и в то же время дата окончания - больше(или пустая) в сравнении даты-запроса.
Можно ли это организовать Вашим способом. Потому что, насколько я знаю GetAllDocumentsByKey работает быстрее чем Search.
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#9
Не, при такой постановке задачи лучше заюзать именно db.Search.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#10
вот а сразу нельзя было описать вопрос подробней?
Думаю проще сделать через Search
 

San40S

Well-Known Member
15.04.2009
69
0
#11
вот а сразу нельзя было описать вопрос подробней?
Думаю проще сделать через Search
Сори, что сразу не упомянул о двух полях для сравнения.
А можно, хотя бы, какой-то набросок кода для наглядного примера таковой ситуации. Буду очень признателен!
 

San40S

Well-Known Member
15.04.2009
69
0
#13
Дак это
Набросок в третьем посте.
Код:
Dim Dc As NotesDocumentCollection
Set Dc = OtherDb.Search({DateFld > @Date(} + YParam + {; } + MParam + {; } + DParam + {)}, Nothing, 0)
здесь сравнивается одно поле, но это такое, второе думаю допишу, но... как учесть, что дата окончания может быть вообще пустой.
попробовал построить SELECT во вьюхе, и если поле "Дата_окончания" - пустое, то документы уже не выбираются :)
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#14
Код:
searchFormula$ = {Form = "название твоей формы" & StartDate < "твое значение" & ( EndDate > "твое значение" | EndDate > "" ) }
что-то врое этого
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#15
Код:
Query = {Form = "Тра-ля-ля" & @if(DateFld1 = ""; @False; @Сравнение_даты1) & @if(DateFld2 = ""; @False; @Сравнение_даты2)}
Dim Dc As NotesDocumentCollection
Set Dc = Db.Search(Query, Nothing, 0)
 
K

K-Fire

Гость
#16
Ну ладно, допустим коллекцию получили, а отображать как потом собираетесь?
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 790
42
#17
вот это все можно пользовать для SelectionFormula у view

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

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

San40S

Well-Known Member
15.04.2009
69
0
#18
Вот что получилось у меня:

Код:
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 - тоесть ниодного документа. В чем проблема, что я неправильно написал???
 

abbatik

Well-Known Member
Lotus team
20.10.2008
277
0
#19
Вот что получилось у меня:

Код:
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 - тоесть ниодного документа. В чем проблема, что я неправильно написал???
Значит формула ничего не отбирает :)
Ты попробуй сначало в поиске эти данные вбить :) Хотя вот эта (EndWork < [29.04.2009] | EndWork <> "" ) часть формулы кажется сомнительной... если тебе нужна не пустое поле, то зачем вообще на дату его проверять? :)
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#20
Я же написал с проверкой на пустоту. :)
Мне и вот эта часть
Код:
StartWork > [15.04.2009]
кажется сомнительной.
Или там железно задаётся в формате dd.mm.yyyy в независимости ни от чего?