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

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

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

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

Передать параметры агенту

  • Автор темы LuMee
  • Дата начала
L

LuMee

Вопросы эти я уже поднимал, вроде все было ясно, но как дошло до практической реализации - заперся.
В общем, есть у меня Поручение, на которое юзер должен составить Отчет. При этом данные отчета должны быть занесены в Поручение, а сам Отчет - убит. Делаю это при помощи агента.
Итак, есть Отчет, у которого на Postsave лежит код:
Код:
Dim agent As NotesAgent
Dim doc As NotesDocument

Set doc = Source.Document	
Set agent = doc.ParentDatabase.GetAgent("SaveReport")
agent.Run doc.NoteID
Source.Close
Затем есть собственно агент:
Код:
Sub Initialize
Dim session As New NotesSession
Dim report As NotesDocument, order As NotesDocument
Dim db As NotesDatabase
Dim agent As NotesAgent
Dim theLog As NotesLog

Set theLog = New NotesLog("MyApp")
theLog.OpenAgentLog

theLog.LogAction "Hello"
theLog.LogAction "Параметровый док: " & agent.ParameterDocID

Set agent = session.CurrentAgent
Set db = session.CurrentDatabase
Set report = db.GetDocumentByID(agent.ParameterDocID)
Set order = db.GetDocumentByUNID(report.ParentDocumentUNID)

theLog.LogAction report.ReportText(0)

order.ReplaceItemValue "ReportText", report.GetItemValue("ReportText")
order.ReplaceItemValue "ReportDetails", report.GetItemValue("ReportDetails")
order.Save True, False
End Sub
На форме самого Поручения есть действие "Ввести отчет", которое просто создает документ по форме Отчет (она - ответ-на-ответ).
Думал, что по выполнении этой манипуляции в Поручение попадут нужные данные, ан нет - ничего не происходит. Более того, создается впечатление, что после строки theLog.LogAction "Hello" агент вообще не выполняется (в логе, во всяк, ничего нет). Что я здесь делаю не так, подскажите...
Отдельное спасибо тем, кто подскажет, как половчее грохнуть Отчет после сохранения и закрытия. Source.Document.Remove True в Postsave не прокатывает: нельзя убивать документы, открытые с помощью NotesUIDocument.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-LuMee+11:12:2006, 16:09 -->
<span class="vbquote">(LuMee @ 11:12:2006, 16:09 )</span><!--QuoteEBegin-->theLog.LogAction "Параметровый док: " & agent.ParameterDocID

Set agent = session.CurrentAgent
[snapback]50431" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ничего странного не видишь? :)
 
M

morpheus

<!--QuoteBegin-LuMee+11:12:2006, 15:09 -->
<span class="vbquote">(LuMee @ 11:12:2006, 15:09 )</span><!--QuoteEBegin-->Отдельное спасибо тем, кто подскажет, как половчее грохнуть Отчет после сохранения и закрытия. Source.Document.Remove True в Postsave не прокатывает: нельзя убивать документы, открытые с помощью NotesUIDocument.
[snapback]50431" rel="nofollow" target="_blank[/snapback]​
[/quote]
а может и не грохать его? у меня форма отбора полей для отчета- это личный профиль... по выходу затираем выбранные поля и все... кажный раз показываем один и тот же документ
 
F

Fossil Code

Прошу простить, но не понимаю: зачем здесь агент, скрипты и все эти сложности? Что Вам мешает по кнопке "Ввести отчет" вызвать @DialogBox("Report";"Ввод отчета")? В результате поле ReportText в поручении получит значение, которое пользователь введет в ReportText в отчете. И никаких мук по поводу взаимодействия УИ и бэкэнда. Или что-то все-таки недосказано?

P.S. Если в документе присутствует поле SaveOptions, равное "0", то документ не будет сохранен в базу, а закроется и сгинет без следа.
 
L

LuMee

Прошу простить, но не понимаю: зачем здесь агент, скрипты и все эти сложности? Что Вам мешает по кнопке "Ввести отчет" вызвать @DialogBox("Report";"Ввод отчета")? В результате поле ReportText в поручении получит значение, которое пользователь введет в ReportText в отчете. И никаких мук по поводу взаимодействия УИ и бэкэнда. Или что-то все-таки недосказано?

P.S. Если в документе присутствует поле SaveOptions, равное "0", то документ не будет сохранен в базу, а закроется и сгинет без следа.
Во-первых, в Отчете присутствет Richtext-поле, которое не дружит с диалогами (или диалоги с ним).
Во-вторых, у юзера нет прав на редактирование Поручения, поэтому данные заносятся агентом на стороне сервера (здесь у меня Run вместо RunOnServer только в качестве отладки)
 
F

Fossil Code

Понятно. А насчет агента -- Вы точно хотите возиться с Агент Логом? Почему не просто "принт" и все в общесистемном логе? В смысле, в целях отладки.

А сам подход, уж извините, представляется не вполне верным по нескольким причинам:

1) Логическое противоречие: если уж нет прав на документ, то по определению не следует в него вносить ничего, что создано тем, у кого нет прав на изменение этого документа.
2) Документарные соображения: к бумажному приказу-распоряжению отчеты, представляющие собой отдельные документы, подшиваются. Т.е. принцип "карте -- место" имеет место быть и облегчать жизнь.
3) Возможности расширения: а если исполнителей много, или поручение многоэтапное, или потом захочется выставлять оценку "Выполнено/Хорошо/...." и т.п.?

Вывод: Пусть отчет остается ответным документом. Тем более, что отчетов и исполнителей может быть много. А заодно и разрабатывать станет много легче. Если, конечно, не поздно переигрывать архитектурные решения.
 
L

LuMee

Вроде разобрался - с ЮНИДами перемудрил. Сейчас работает. Без убийства документа тоже удалось обойтись - спасибо за идею с профилем :)

Понятно. А насчет агента -- Вы точно хотите возиться с Агент Логом? Почему не просто "принт" и все в общесистемном логе? В смысле, в целях отладки.

А сам подход, уж извините, представляется не вполне верным по нескольким причинам:

1) Логическое противоречие: если уж нет прав на документ, то по определению не следует в него вносить ничего, что создано тем, у кого нет прав на изменение этого документа.
2) Документарные соображения: к бумажному приказу-распоряжению отчеты, представляющие собой отдельные документы, подшиваются. Т.е. принцип "карте -- место" имеет место быть и облегчать жизнь.
3) Возможности расширения: а если исполнителей много, или поручение многоэтапное, или потом захочется выставлять оценку "Выполнено/Хорошо/...." и т.п.?
Агент Лог - это так, для себя лично, в промышленной версии будет нормальный лог.

Насчет подхода:
1. Дело в том, что Поручение содержит как доступные юзеру поля (текст отчета), так и недоступные (всякая служебная информация). Дабы он чего не напортил, отчет создается вот таким хитрозадым образом
2. Здесь скажу лишь, что Поручение - не совсем верный термин, скорее - Контрольная Карточка, куда как раз и должен быть вписан отчет. Прошу прощения, если ввел в заблуждение :D
3. На каждое поручение у меня строго один исполнитель, отчет опять же должен быть строго один, а оценку можно опять же можно в карточке ставить.
 
Мы в соцсетях:

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