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

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

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

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

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

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

San40S

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

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

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Запрос такой же как в формуле отбора в представлении. Плюс в хелпе примеры есть.
 
O

Omh

Код:
Dim Dc As NotesDocumentCollection
Set Dc = OtherDb.Search({DateFld > @Date(} + YParam + {; } + MParam + {; } + DParam + {)}, Nothing, 0)
, где YParam, MParam, DParam параметры из даты, которую ты спрашивал перед сёрчем.
 
S

San40S

где YParam, MParam, DParam параметры из даты, которую ты спрашивал перед сёрчем.

не совсем понял этот момент. :)

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

Omh

Ну проси у юзера inpubox (в определённом формате) и распарси.
По моему, лучше dialogbox с одним полем даты, меньше гемора.
 
H

HumblePie

Доброго времени суток!
Есть две БД: БД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 851
27
BIT
0
ммм... простите, а можно обойтись отсортированой view?
Во view сделать три колонки.... Год, месяц и день
а потом пользовать метод GetAllDocumentsByKey

HumblePie
я опоздал :)
 
S

San40S

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

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

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

Omh

Не, при такой постановке задачи лучше заюзать именно db.Search.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
вот а сразу нельзя было описать вопрос подробней?
Думаю проще сделать через Search
 
S

San40S

вот а сразу нельзя было описать вопрос подробней?
Думаю проще сделать через Search

Сори, что сразу не упомянул о двух полях для сравнения.
А можно, хотя бы, какой-то набросок кода для наглядного примера таковой ситуации. Буду очень признателен!
 
S

San40S

Дак это
Набросок в третьем посте.

Код:
Dim Dc As NotesDocumentCollection
Set Dc = OtherDb.Search({DateFld > @Date(} + YParam + {; } + MParam + {; } + DParam + {)}, Nothing, 0)

здесь сравнивается одно поле, но это такое, второе думаю допишу, но... как учесть, что дата окончания может быть вообще пустой.
попробовал построить SELECT во вьюхе, и если поле "Дата_окончания" - пустое, то документы уже не выбираются :)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Код:
searchFormula$ = {Form = "название твоей формы" & StartDate < "твое значение" & ( EndDate > "твое значение" | EndDate > "" ) }

что-то врое этого
 
O

Omh

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

K-Fire

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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
вот это все можно пользовать для SelectionFormula у view

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

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

San40S

Вот что получилось у меня:

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

abbatik

Вот что получилось у меня:

Код:
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 <> "" ) часть формулы кажется сомнительной... если тебе нужна не пустое поле, то зачем вообще на дату его проверять? :)
 
O

Omh

Я же написал с проверкой на пустоту. :)
Мне и вот эта часть
Код:
StartWork > [15.04.2009]
кажется сомнительной.
Или там железно задаётся в формате dd.mm.yyyy в независимости ни от чего?
 
Мы в соцсетях:

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