• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Нужен Агент

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

dimat

Well-known member
31.07.2008
508
0
Нужен Агент, который пробегает по всем документам в указанном представлении и считывает или устанавливает значение у поля
 
Код:
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
 
Немножко изменил агента. вот код:


Код:
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
 
При выполнении выдает вот такую оошибку "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 ...
 
А есть ли в документах эти поля? Проверку можно на doc.HasItem("FieldName") делать.
 
тьфу , блин заменить
doc1 на doc просто

откуда взялсо док1 вообще не понятно, вот что значить не польозваться декларе оптионс
 
Код:
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

Возможно ли его как то оптимизировать или выполнить это же задачу иным образом?
 
Оптимизировать можно взяв документы из представления "Физические лица" в коллекцию(NotesDocumentCollection или NotesViewEntryCollection) и при каждом проходе удалять из неё обработанные документы.
Set view2 = db.GetView("Физические лица") - это вынести из цикла.
Поставить view.AutoUpdate = False и view2.AutoUpdate = False.

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

Создал агента, который запускается каждые 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

Сохраняю….. сервак не ругается, типа формула верна, но ….. не работает!!!
ЧЁ делать…. ???
 
Ну, во-первых, странная у тебя структура.
Почему нельзя делать эту проверку и отсылать письмо в postsave?

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

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

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

Что касается формы отображения адресата в поле, из которого его следует брать, - так и отображается "ADM Assistant/company".
как сделать так чтоб он брал поле из нужного документа???
 
Код:
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)
а остальное лишнее
 
А как правильно формулу написать с использованием этих функций?
Я не совсем программист, просто пришлось разобраться с этой задачкой!
Заранее спасибо.

Как-то так:

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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab