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

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

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

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

Отображение задачи в календаре

  • Автор темы oleg7
  • Дата начала
T

turumbay

Код:
			Set ProcessDb = New NotesDatabase("", "")
If ProcessDb.IsOpen Then
Dim collection As NotesDocumentCollection
Set doc = collection.GetFirstDocument
какой-то мутный код. красивый, но мутный :)
1. ProcessDb - вообще нигде не используется
2. резалтом вызова конструктора NotesDatabase("" , "" ) - будет "недобаза" - объект, не привязанный ни к какой БД. Св-во isOpen у такой БД ессно будет false - внутрь if не попадем
3. и хорошо, что не попадем, ибо там будет runtime error: collection объявлена, но не инстанцирована. Вызов getFirstDocument бросит ошибку.
 
H

hosm

разобраться в том, как проверять поля из документа и поля из почтовой базы
ничего не понятно, что хотим :( "поля из почтовой базы" - поля (fields) вообще-то на форме :newconfus: ну, можно сказать, что поле (item) есть в каком-то документе в почтовой БД. В чем проблемы - найти нужный документ или сравнить 2 поля с датой?

Зачем делается просмотр ВСЕХ почтовых баз?
Вы решили написать агент синхронизации дат для всех пользователей?

давайте по пунктам, что вообще делаете и что надо, корректнее:

"Я все заполняю в документе (это документ в ProcessDb?), отправляю пользователю (в его почтовую БД), он получает сообщение как задачу, но после делает изменения, например в дате завершения (в том же документе из БД ProcessDb?).
Теперь надо найти задачу пользователя и изменить там срок.

Задача в почтовой БД содержит унид документа, в котором менялась дата?
Вы знаете имена полей со сроком в обоих БД - почтовой и с документом?
 
O

oleg7

давайте по пунктам, что вообще делаете и что надо, корректнее:
в общем мне надо:
1. Есть БД1, в ней создается задача, которая потом направляется (при заполнении определенного поля) пользователю, в его почтовую базу
2. В почтовой базе документ отображается в задачах (в форме Task)
3. При редактировании полей в документе, который находится в БД1, необходимо изменять их в почтовых базах пользователей.

Вообще не могу разобраться. Скажите пожалуйста с какой стороны подойти к агенту...
 
N

nvyush

в общем мне надо:
1. Есть БД1, в ней создается задача, которая потом направляется (при заполнении определенного поля) пользователю, в его почтовую базу
2. В почтовой базе документ отображается в задачах (в форме Task)
3. При редактировании полей в документе, который находится в БД1, необходимо изменять их в почтовых базах пользователей.

Вообще не могу разобраться. Скажите пожалуйста с какой стороны подойти к агенту...

Как я понял, задачи из документа в БД1 могут рассылаться нескольким пользователям. При сохранении данного документа необходимо в к-либо поле сохранять список адресатов. При изменении документа можно либо открывать почтовые базы нужных пользователей и искать там обновляемые задачи, либо посылать данным пользователям уведомления об изменении и обрабатывать их в почтовых базах агентами типа after new mail arrive. (Под уведомлениями понимаются документы по специальной форме, содержащие поля с новыми значениями. Помещаются агентом в корзину сразу после обновления задачи). Чтобы было проще искать требуемые задачи в почтовых базах, в них следует поместить unid документа из БД1. Документ задачи должен содержать все необходимые для корректной обработки почтовой базой поля, но ничто не мешает ему содержать дополнительные "неучтённые" поля — это же Лотус...
 
O

oleg7

nvy, Вы меня правильно поняли.
Но вот только я просто даже и не представляю как написать такой агент.... уже совершенно запутался.
 
N

nvyush

oleg7
На каком варианте Вы остановились? Если собираетесь обновлять по сохранению документа в БД 1, то в PostSave формы пишете что-то вроде

Код:
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim agent As NotesAgent
Set agent = db.GetAgent("Agent007")
agent.RunOnServer Source.Document.NoteId
В коде агента получаете док по NoteId, перебираете адресатов, открываете их базы, ищете нужные документы задач и обновляете их.
Если хотите на уведомлениях, то там же в постсэйве создаёте документы с полями, подлежащими обновлению и указываете форму типа "ChangeTask" или что-то подобное, отсутствующее в почтовой базе, отправляете адресатам. В почтовом шаблоне пишете агента типа after new mail arrive, который по форме идентифицирует уведомление, по имеющимся в нём полям ищет нужную задачу, обновляет её и помещает уведомление в корзину.
Как-то так.
 
O

oleg7

nvy, спасибо Вам большое.
Извеняюсь за то что достаю уже, но очень надо сделать.
Я решил делать так:
В коде агента получаете док по NoteId, перебираете адресатов, открываете их базы, ищете нужные документы задач и обновляете их.
в агенте ищу документы вот таким методом:
Код:
	Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim docA As NotesDocument
Set db = session.CurrentDatabase
Set collection = db.AllDocuments
If collection.Count > 0 Then
Redim unidArray (0 To collection.Count)
Set docA = collection.GetFirstDocument
While Not(docA Is Nothing)
unidArray(i) = docA.universalID
i = i + 1
Set docA = collection.GetNextDocument(docA)
Wend
End If
проверил, есть все документы, правда попали и те документы, что в корзине.
1-й вопрос, как не проверять документы, которые в козине
2-й вопрос , а что Вы иеете ввиду "перебираете адресатов" ?
 
N

nvyush

oleg7
Судя по приведённому коду Вы перебираете документы в БД1 - зачем? Вам известен noteid изменённого документа, получайте его в агенте так:
Код:
Dim s As New NotesSession
Dim agent As NotesAgent
Set agent = s.CurrentAgent
Dim NoteId As String
NoteId = agent.ParameterDocID
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As NotesDocument
Set doc = db.GetDocumentByID(NoteId) 'получили обновлённый документ в БД1
Forall adr In doc.GetItemValue("Recipients") 'перебираем адресатов, кому назначена задача
... 'здесь ищем почтовую базу адресата, в ней ищем документ задачи и обновляем его
Next
 
O

oleg7

nvy
у меня в строке
Set doc = db.GetDocumentByID(NoteId) 'получили обновлённый документ в БД1
выдает ошибку: Invalid note id

извеняюсь, ошибки нет,если сохранять документ. Я решил просто запустить агент и выдало ошибку
 
O

oleg7

'здесь ищем почтовую базу адресата, в ней ищем документ задачи и обновляем его
можно вопрос....
как найти базу пользователя указанного в поле (например "Recipients") и открыть ее для того, чтобы потом там искать и обновлять документы?
 
N

nvyush

можно вопрос....
как найти базу пользователя указанного в поле (например "Recipients") и открыть ее для того, чтобы потом там искать и обновлять документы?
Открываем names.nsf, ищем документ Person соответствующего пользователя, берём оттуда имя почтовой базы, открываем базу. На форуме кажется и код мелькал.
 
R

RAJ

Открываем names.nsf, ищем документ Person соответствующего пользователя, берём оттуда имя почтовой базы, открываем базу. На форуме кажется и код мелькал.

к примеру получим имя почтового файла из персон документа:
Код:
mailfile := @NameLookup([Exhaustive];имя_юзера;"MailFile")
 
O

oleg7

к примеру получим имя почтового файла из персон документа:
mailfile := @NameLookup([Exhaustive];имя_юзера;"MailFile")
но ведь я не могу заранее знать у какого пользователя проверять почту. Или "имя_юзера" - это doc.GetItemValue("Recipients")?!
 
N

nvyush

но ведь я не могу заранее знать у какого пользователя проверять почту. Или "имя_юзера" - это doc.GetItemValue("Recipients")?!
Forall adr In doc.GetItemValue("Recipients") 'перебираем адресатов, кому назначена задача
mailfile = Evaluate({@NameLookup([Exhaustive];} + adr + {;"MailFile")})
 
O

oleg7

что-то вообще не получается. Пытаюсь в дебагере просмотреть выполнение агента.
На постсайве формы написал, как и говорил

Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim agent As NotesAgent
Set agent = db.GetAgent("ИмяАгента")
If agent.RunOnServer(Source.Document.NoteId) = 0 Then
Messagebox "Agent ran",, "Success"
Else
Messagebox "Agent did not run",, "Failure"
End If
При сохраниении пишет Agent ran, но потом выполнение самого агента в дебагере нет. Почему?!
 
O

oleg7

Полезно читать справку, там всё есть:
Спасибо за совет.
Вот сидел читал, пытался разобраться как осуществить в почтовой базе пользователя поиск задач по известному NoteId
понимаю, что бред, но может направите в верное русло:
Код:
Forall adr In doc.GetItemValue("EnterOwner") 'перебираем адресатов, кому назначена задача
'... 'здесь ищем почтовую базу адресата, в ней ищем документ задачи и обновляем его
mailfile = Evaluate({@NameLookup([Exhaustive];} + adr + {;"MailFile")}) 	
Call mailfile.OpenMail()
Set maildoc = mailfile.CreateDocument
Dim collection As NotesDocumentCollection
Dim noteIDs()
Set collection = mailfile.AllDocuments
Redim noteIDs(1 To collection.Count)
Set docTask = collection.GetFirstDocument()
If collection.Count > 0 Then
For i = 1 To collection.Count
noteIDs(i) = docTask.noteID
Set docTask = collection.GetNextDocument(docTask)
Next
Forall NoteId In noteIDs
Set docTask = db.GetDocumentByID(noteID)
End Forall
 
H

hosm

Вам тут советовали - сделано?
Чтобы было проще искать требуемые задачи в почтовых базах, в них следует поместить unid документа из БД1.


Добавлено: Если сделали, то пусть DocUNID - поле с унидом документа, тогда для получения коллекции всех задач, связанных с этим документом можно сделать так:
Код:
Dim collection As NotesDocumentCollection
Set collection = mailfile.Search({(DocUNID="} & doc.UniversalId & {")}, Nothing, 0)
(можно задать еще при поиске отсечение по дате)
 
N

nvyush

... понимаю, что бред, но может направите в верное русло:
Код:
Forall adr In doc.GetItemValue("EnterOwner") 'перебираем адресатов, кому назначена задача
'... 'здесь ищем почтовую базу адресата, в ней ищем документ задачи и обновляем его
mailfile = Evaluate({@NameLookup([Exhaustive];} + adr + {;"MailFile")}) 	
Call mailfile.OpenMail()
Ессно бред. В данном случае в mailfile получаем ИМЯ почтовой базы.
Надо что-то вроде:
mailfile = Evaluate({@NameLookup([Exhaustive];} + adr + {;"MailFile")})
Set mailDB = s.GetDatabase(db.Server, mailfile)
 
T

turumbay

вот это еще ничего:
Код:
	mailfile = Evaluate({@NameLookup([Exhaustive];} + adr + {;"MailFile")})
а вот здесь уже начинается:
Код:
	Call mailfile.OpenMail()
Set maildoc = mailfile.CreateDocument
Открываем хелп и смотрим последовательно:
что возвращает @NameLookup: returns a list of single text values for each specified user name
что возвращает Evaluate: If the macro being executed returns a value, Evaluate returns a Variant containing that value
Если лень читать хелп - открываем дебагер и смотри что лежит в mailfile сразу после evaluate. Видим какой-то массив в котором лежит какой-то String. Осознаем свою ошибку...

Вы очень много задач сразу пытаетесь решить. При отсутствии навыка на платформе - получается косяк на косяке.
Для начала - напишите и отладьте функцию, которая по заданному имени пользователя возвращает его почтовую базу:
public function getMailDbForUser( i_user As String ) As NotesDatabase
В "грязном" варианте (без обработки ошибок и доп. проверок) она должна выглядеть примерно так:
1. Получить путь к почтовой БД пользователя( это почти умеете )
2. Зная путь к БД - создать объект NotesDatabase и вернуть его в вызывающую процедуру. ( и это почти умеете )
Потом будете разбираться с остальными проблемами...
 
Мы в соцсетях:

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