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

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

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

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

Нужен Агент

dimat

Well-known member
31.07.2008
508
0
BIT
0
Нужен Агент, который пробегает по всем документам в указанном представлении и считывает или устанавливает значение у поля
 
A

allex

Код:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set view = db.GetView("By Category")
Set doc = view.GetFirstDocument
While Not(doc Is Nothing)


a = doc.GetItemValue( "val" )
Call doc.ReplaceItemValue( "new_val", a )
Call doc.Save( False, True )


Set doc = view.GetNextDocument(doc)
Wend
End Sub
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Немножко изменил агента. вот код:


Код:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim view2 As NotesView
Dim st As String
Dim doc As NotesDocument
Dim doc2 As NotesDocument

Set db = session.CurrentDatabase
Set view = db.GetView("Текущие клиенты")
Set view2 = db2.GetView("Физические лица")
Set doc = view.GetFirstDocument
st="клиент"

While Not(doc Is Nothing)
Set doc2 = view2.GetFirstDocument
While Not(doc2 Is Nothing)
If doc2.GetItemValue("PersonalWorkPlace")	= doc1.GetItemValue("AgentShortName") Then 
Call doc2.ReplaceItemValue("klient_type",st)
Call doc2.Save(False, True)
End If
Set doc2 = view2.GetNextDocument(doc2)
Wend
Set doc = view.GetNextDocument(doc)
Wend
End Sub
При выполнении выдает вот такую оошибку "Variant does not contain an object".
на этой строчке
Код:
If doc2.GetItemValue("PersonalWorkPlace")	= doc1.GetItemValue("AgentShortName") Then
 
M

morpheus

При выполнении выдает вот такую оошибку "Variant does not contain an object".
на этой строчке
If doc2.GetItemValue("PersonalWorkPlace") = doc1.GetItemValue("AgentShortName") Then
советую так

if InStr( doc2.GetItemValue("PersonalWorkPlace")(0), doc1.GetItemValue("AgentShortName")(0) ) > 0 then ...
 
A

Alexander (Criz)

А есть ли в документах эти поля? Проверку можно на doc.HasItem("FieldName") делать.
 
M

morpheus

тьфу , блин заменить
doc1 на doc просто

откуда взялсо док1 вообще не понятно, вот что значить не польозваться декларе оптионс
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Код:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim view2 As NotesView
Dim st As String
Dim pn As String
Dim sn As String
Dim doc As NotesDocument
Dim doc2 As NotesDocument

Set db = session.CurrentDatabase
Set view = db.GetView("Текущие клиенты")
Set view2 = db.GetView("Физические лица")
Set doc = view.GetFirstDocument
st="клиент"

While Not(doc Is Nothing)
Set view2 = db.GetView("Физические лица")
Set doc2 = view2.GetFirstDocument
While Not(doc2 Is Nothing)
If Instr( doc2.GetItemValue("PersonalWorkPlace")(0), doc.GetItemValue("AgentShortName")(0) ) > 0 Then
Call doc2.ReplaceItemValue("klient_type",st)

Call doc2.Save(False, True)
End If
Set doc2 = view2.GetNextDocument(doc2)
Wend
Set doc = view.GetNextDocument(doc)
Wend
End Sub

Возможно ли его как то оптимизировать или выполнить это же задачу иным образом?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Оптимизировать можно взяв документы из представления "Физические лица" в коллекцию(NotesDocumentCollection или NotesViewEntryCollection) и при каждом проходе удалять из неё обработанные документы.
Set view2 = db.GetView("Физические лица") - это вынести из цикла.
Поставить view.AutoUpdate = False и view2.AutoUpdate = False.

А можно сделать массив значений "AgentShortName". Обход массива будет побыстрее обхода представления.
 
S

shoma2005

Всем привет!
Помогите разобраться с проблемкой….
Агент не шлет уведомление когда в значении «кому» указан не адресат, а имя поля, откуда нада его брать.

Создал агента, который запускается каждые 5 минут и
1. Проверяет базу на наличие новых подписанных заявок (по значению полей statusrec –подписан ли документ и checkdocstat – не проработал ли агент этот документ ранее)
2. Если оба условия соблюдены, то агент отправляет указанному адресату уведомление и ссылку на эту заявку и меняет статус поля checkdocstat на ”1” – то есть просмотрен.

Вот формула:

@If(statusrec="1" & checkdocstat="0"; @MailSend("ADM Assistant/company"; ""; ""; "Подписи к данной заявке собраны"; "Запрос на создание счета к новой заявке."; "economist"; [IncludeDoclink]) & FIELD checkdocstat:="1"; "");
SELECT @All

В таком виде работает, но хочется чтобы агент брал адресата из поля!
В базе есть документ настроек, в нем поле формата «Names» - вот хочу чтобы агент брал адресата из этого поля!

Вписываю вместо адресата имя поля:

@If(statusrec="1" & checkdocstat="0"; @MailSend(economist; ""; ""; "Подписи к данной заявке собраны"; "Запрос на создание счета к новой заявке."; "economist"; [IncludeDoclink]) & FIELD checkdocstat:="1"; "");
SELECT @All

Сохраняю….. сервак не ругается, типа формула верна, но ….. не работает!!!
ЧЁ делать…. ???
 
A

abbatik

Ну, во-первых, странная у тебя структура.
Почему нельзя делать эту проверку и отсылать письмо в postsave?

Ну, а если хочешь так, то попробуй @Text ( economist ), хотя было бы не плохо посмотреть какое значение в нем лежит.
 
N

nshoma

Ну, во-первых, странная у тебя структура.
Почему нельзя делать эту проверку и отсылать письмо в postsave?

Ну, а если хочешь так, то попробуй @Text ( economist ), хотя было бы не плохо посмотреть какое значение в нем лежит.

Внес изменения по вашему совету - тишина, не срабатывает! (хотя формула верна, не ругается)
Когда вставляю эту формулу в postsave или queryclose, то говорит "No 'SendTo' field in document. Use 'Forward' on the actions menu instead."
По всей видимости он ищет указанное поле именно в документе заявки а не по всей базе.

Что касается формы отображения адресата в поле, из которого его следует брать, - так и отображается "ADM Assistant/company".
как сделать так чтоб он брал поле из нужного документа???
 
K

Kee_Keekkenen

Код:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set view = db.GetView("By Category")
Set doc = view.GetFirstDocument
While Not(doc Is Nothing)


a = doc.GetItemValue( "val" )
Call doc.ReplaceItemValue( "new_val", a )
Call doc.Save( False, True )


Set doc = view.GetNextDocument(doc)
Wend
End Sub
как вариант оптимизации таких ситуаций
после
Код:
Set view = db.GetView("By Category")
использовать
Код:
If view.EntryCount > 0 Then Call view.AllEntries.StampAll("itemName",value)
а остальное лишнее
 
A

abbatik

А как правильно формулу написать с использованием этих функций?
Я не совсем программист, просто пришлось разобраться с этой задачкой!
Заранее спасибо.

Как-то так:

@If(statusrec="1" & checkdocstat="0"; @MailSend( @GetDocField( <Сюда надо вставить UNID профайл-документа> ; economist ); ""; ""; "Подписи к данной заявке собраны"; "Запрос на создание счета к новой заявке."; "economist"; [IncludeDoclink]) & @SetField( "fcheckdocstat";"1" ); "");
SELECT @All

Хотя, лично я не люблю использовать собаки для таких вещей.
Собаки хороши для небольших операций в кнопках, которые не надо отлаживать...
 
Мы в соцсетях:

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